Thu, 12 Dec 2024 20:01:43 +0100
update toolkit
0
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
1 | /* |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
3 | * |
100 | 4 | * Copyright 2024 Olaf Wintermann. All rights reserved. |
0
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
5 | * |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
6 | * Redistribution and use in source and binary forms, with or without |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
7 | * modification, are permitted provided that the following conditions are met: |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
8 | * |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
9 | * 1. Redistributions of source code must retain the above copyright |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
10 | * notice, this list of conditions and the following disclaimer. |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
11 | * |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
12 | * 2. Redistributions in binary form must reproduce the above copyright |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
13 | * notice, this list of conditions and the following disclaimer in the |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
14 | * documentation and/or other materials provided with the distribution. |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
15 | * |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
25 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
26 | * POSSIBILITY OF SUCH DAMAGE. |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
27 | */ |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
28 | |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
29 | #include <stdio.h> |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
30 | #include <stdlib.h> |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
31 | #include <inttypes.h> |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
32 | |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
33 | #include "container.h" |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
34 | #include "../common/context.h" |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
35 | #include "../common/object.h" |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
36 | |
100 | 37 | #include "Grid.h" |
0
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
38 | |
100 | 39 | /* ---------------------------- Box Container ---------------------------- */ |
0
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
40 | |
100 | 41 | static UIWIDGET box_create(UiObject *obj, UiContainerArgs args, UiBoxOrientation orientation) { |
42 | UiContainerPrivate *ctn = ui_obj_container(obj); | |
43 | UI_APPLY_LAYOUT(ctn->layout, args); | |
0
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
44 | |
100 | 45 | Arg xargs[16]; |
46 | int n = 0; | |
0
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
47 | |
100 | 48 | if(orientation == UI_BOX_VERTICAL) { |
49 | //XtSetArg(xargs[n], gridRowSpacing, args.spacing); n++; | |
0
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
50 | } else { |
100 | 51 | //XtSetArg(xargs[n], gridColumnSpacing, args.spacing); n++; |
0
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
52 | } |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
53 | |
100 | 54 | Widget parent = ctn->prepare(ctn, xargs, &n); |
55 | Widget grid = XtCreateManagedWidget(args.name ? args.name : "boxcontainer", gridClass, parent, xargs, n); | |
56 | ctn->add(ctn, grid); | |
0
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
57 | |
100 | 58 | UiContainerX *container = ui_box_container(obj, grid, orientation); |
59 | uic_object_push_container(obj, container); | |
0
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
60 | |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
61 | return grid; |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
62 | } |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
63 | |
100 | 64 | // public |
65 | UIWIDGET ui_vbox_create(UiObject *obj, UiContainerArgs args) { | |
66 | return box_create(obj, args, UI_BOX_VERTICAL); | |
67 | } | |
68 | ||
69 | // public | |
70 | UIWIDGET ui_hbox_create(UiObject *obj, UiContainerArgs args) { | |
71 | return box_create(obj, args, UI_BOX_HORIZONTAL); | |
0
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
72 | } |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
73 | |
100 | 74 | UiContainerX* ui_box_container(UiObject *obj, Widget grid, UiBoxOrientation orientation) { |
75 | UiBoxContainer *ctn = ui_malloc(obj->ctx, sizeof(UiBoxContainer)); | |
76 | memset(ctn, 0, sizeof(UiBoxContainer)); | |
77 | ctn->container.prepare = orientation == UI_BOX_VERTICAL ? ui_vbox_prepare : ui_hbox_prepare; | |
78 | ctn->container.add = ui_box_container_add; | |
79 | ctn->container.widget = grid; | |
80 | ctn->n = 0; | |
81 | return (UiContainerX*)ctn; | |
0
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
82 | } |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
83 | |
100 | 84 | static Widget ui_box_container_prepare(UiBoxContainer *box, Arg *args, int *n) { |
85 | int a = *n; | |
86 | box->n++; | |
87 | return box->container.widget; | |
0
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
88 | } |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
89 | |
100 | 90 | Widget ui_vbox_prepare(UiContainerPrivate *ctn, Arg *args, int *n) { |
91 | UiBoxContainer *box = (UiBoxContainer*)ctn; | |
92 | int a = *n; | |
93 | XtSetArg(args[a], gridRow, box->n); a++; | |
94 | if(box->container.layout.fill == UI_ON) { | |
95 | XtSetArg(args[a], gridVExpand, TRUE); a++; | |
96 | XtSetArg(args[a], gridVFill, TRUE); a++; | |
0
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
97 | } |
100 | 98 | XtSetArg(args[a], gridHExpand, TRUE); a++; |
99 | XtSetArg(args[a], gridHFill, TRUE); a++; | |
100 | *n = a; | |
101 | return ui_box_container_prepare(box, args, n); | |
0
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
102 | } |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
103 | |
100 | 104 | Widget ui_hbox_prepare(UiContainerPrivate *ctn, Arg *args, int *n) { |
105 | UiBoxContainer *box = (UiBoxContainer*)ctn; | |
106 | int a = *n; | |
107 | XtSetArg(args[a], gridColumn, box->n); a++; | |
108 | if(box->container.layout.fill == UI_ON) { | |
109 | XtSetArg(args[a], gridHExpand, TRUE); a++; | |
110 | XtSetArg(args[a], gridHFill, TRUE); a++; | |
0
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
111 | } |
100 | 112 | XtSetArg(args[a], gridVExpand, TRUE); a++; |
113 | XtSetArg(args[a], gridVFill, TRUE); a++; | |
114 | *n = a; | |
115 | return ui_box_container_prepare(box, args, n); | |
0
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
116 | } |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
117 | |
100 | 118 | void ui_box_container_add(UiContainerPrivate *ctn, Widget widget) { |
119 | ui_reset_layout(ctn->layout); | |
0
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
120 | |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
121 | } |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
122 | |
100 | 123 | |
124 | /* ---------------------------- Grid Container ---------------------------- */ | |
125 | ||
126 | // public | |
127 | UIWIDGET ui_grid_create(UiObject *obj, UiContainerArgs args) { | |
128 | Arg xargs[16]; | |
0
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
129 | int n = 0; |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
130 | |
100 | 131 | XtSetArg(xargs[n], XmNbackground, 0); n++; |
0
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
132 | |
100 | 133 | UiContainerPrivate *ctn = ui_obj_container(obj); |
134 | UI_APPLY_LAYOUT(ctn->layout, args); | |
0
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
135 | |
100 | 136 | Widget parent = ctn->prepare(ctn, xargs, &n); |
137 | Widget grid = XtCreateManagedWidget(args.name ? args.name : "gridcontainer", gridClass, parent, xargs, n); | |
138 | ctn->add(ctn, grid); | |
0
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
139 | |
100 | 140 | UiContainerX *container = ui_grid_container(obj, grid); |
141 | uic_object_push_container(obj, container); | |
0
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
142 | |
100 | 143 | return grid; |
0
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
144 | } |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
145 | |
100 | 146 | UiContainerX* ui_grid_container(UiObject *obj, Widget grid) { |
147 | UiGridContainer *ctn = ui_malloc(obj->ctx, sizeof(UiGridContainer)); | |
148 | memset(ctn, 0, sizeof(UiBoxContainer)); | |
149 | ctn->container.prepare = ui_grid_container_prepare; | |
150 | ctn->container.add = ui_grid_container_add; | |
151 | ctn->container.widget = grid; | |
152 | ctn->x = 0; | |
153 | ctn->y = 0; | |
154 | return (UiContainerX*)ctn; | |
155 | } | |
156 | ||
157 | Widget ui_grid_container_prepare(UiContainerPrivate *ctn, Arg *args, int *n) { | |
158 | UiGridContainer *grid = (UiGridContainer*)ctn; | |
159 | if(ctn->layout.newline) { | |
160 | grid->y++; | |
161 | grid->x = 0; | |
0
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
162 | } |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
163 | |
100 | 164 | int a = *n; |
165 | XtSetArg(args[a], gridColumn, grid->x); a++; | |
166 | XtSetArg(args[a], gridRow, grid->y); a++; | |
167 | if(ctn->layout.colspan > 0) { | |
168 | XtSetArg(args[a], gridColspan, ctn->layout.colspan); a++; | |
169 | } | |
170 | if(ctn->layout.rowspan > 0) { | |
171 | XtSetArg(args[a], gridRowspan, ctn->layout.rowspan); a++; | |
172 | } | |
0
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
173 | |
100 | 174 | if(grid->container.layout.fill == UI_ON) { |
175 | grid->container.layout.hfill = TRUE; | |
176 | grid->container.layout.vfill = TRUE; | |
177 | grid->container.layout.hexpand = TRUE; | |
178 | grid->container.layout.vexpand = TRUE; | |
0
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
179 | } |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
180 | |
100 | 181 | if(grid->container.layout.hfill) { |
182 | XtSetArg(args[a], gridHFill, TRUE); a++; | |
183 | } | |
184 | if(grid->container.layout.vfill) { | |
185 | XtSetArg(args[a], gridVFill, TRUE); a++; | |
186 | } | |
187 | if(grid->container.layout.hexpand) { | |
188 | XtSetArg(args[a], gridHExpand, TRUE); a++; | |
189 | } | |
190 | if(grid->container.layout.vexpand) { | |
191 | XtSetArg(args[a], gridVExpand, TRUE); a++; | |
192 | } | |
0
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
193 | |
100 | 194 | *n = a; |
195 | return ctn->widget; | |
0
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
196 | } |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
197 | |
100 | 198 | void ui_grid_container_add(UiContainerPrivate *ctn, Widget widget) { |
199 | UiGridContainer *grid = (UiGridContainer*)ctn; | |
200 | grid->x++; | |
201 | ui_reset_layout(ctn->layout); | |
0
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
202 | } |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
203 | |
100 | 204 | |
205 | /* -------------------- Container Helper Functions -------------------- */ | |
206 | ||
207 | void ui_container_begin_close(UiObject *obj) { | |
208 | UiContainerPrivate *ct = ui_obj_container(obj); | |
209 | ct->container.close = 1; | |
0
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
210 | } |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
211 | |
100 | 212 | int ui_container_finish(UiObject *obj) { |
213 | UiContainerPrivate *ct = ui_obj_container(obj); | |
214 | if(ct->container.close) { | |
215 | ui_end_new(obj); | |
216 | return 0; | |
217 | } | |
218 | return 1; | |
219 | } | |
0
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
220 | |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
221 | |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
222 | /* |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
223 | * -------------------- Layout Functions -------------------- |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
224 | * |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
225 | * functions for setting layout attributes for the current container |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
226 | * |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
227 | */ |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
228 | |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
229 | void ui_newline(UiObject *obj) { |
100 | 230 | UiContainerPrivate *ct = ui_obj_container(obj); |
0
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
231 | ct->layout.newline = TRUE; |
2483f517c562
add existing toolkit code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
232 | } |