| 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
| 26 * POSSIBILITY OF SUCH DAMAGE. |
26 * POSSIBILITY OF SUCH DAMAGE. |
| 27 */ |
27 */ |
| 28 |
28 |
| 29 #include "container.h" |
29 #include "container.h" |
| |
30 #include "grid.h" |
| |
31 |
| |
32 #include "../common/context.h" |
| |
33 #include "../common/container.h" |
| |
34 #include "../motif/container.h" |
| |
35 |
| |
36 |
| |
37 static W32WidgetClass grid_layout_widget_class = { |
| |
38 .eventproc = NULL, |
| |
39 .enable = NULL, |
| |
40 .show = w32_widget_default_show, |
| |
41 .get_preferred_size = ui_grid_layout_get_preferred_size, |
| |
42 .destroy = w32_widget_default_destroy |
| |
43 }; |
| |
44 |
| |
45 UiContainerPrivate* ui_obj_container(UiObject *obj) { |
| |
46 return (UiContainerPrivate*)obj->container_end; |
| |
47 } |
| |
48 |
| |
49 HWND ui_container_get_parent(UiContainerPrivate *ctn) { |
| |
50 return ctn->parent ? ctn->parent(ctn) : ctn->hwnd; |
| |
51 } |
| |
52 |
| |
53 void ui_container_add(UiContainerPrivate *ctn, W32Widget *widget, UiLayout *layout) { |
| |
54 UiLayout layout2 = *layout; |
| |
55 if (layout2.margin > 0) { |
| |
56 layout2.margin_left = layout2.margin; |
| |
57 layout2.margin_right = layout2.margin; |
| |
58 layout2.margin_top = layout2.margin; |
| |
59 layout2.margin_bottom = layout2.margin; |
| |
60 } |
| |
61 ctn->add(ctn, widget, &layout2); |
| |
62 ctn->container.newline = FALSE; |
| |
63 } |
| |
64 |
| |
65 W32Size ui_grid_layout_get_preferred_size(W32Widget *widget) { |
| |
66 UiGridLayout *grid = widget->layoutmanager; |
| |
67 W32Size size; |
| |
68 size.width = grid->preferred_width; |
| |
69 size.height = grid->preferred_height; |
| |
70 return size; |
| |
71 } |
| 30 |
72 |
| 31 |
73 |
| 32 /* ---------------------------- Box Container ---------------------------- */ |
74 /* ---------------------------- Box Container ---------------------------- */ |
| 33 |
75 |
| 34 static UIWIDGET box_create(UiObject *obj, UiContainerArgs *args, UiBoxOrientation orientation) { |
76 static UIWIDGET box_create(UiObject *obj, UiContainerArgs *args, UiBoxOrientation orientation) { |
| 43 // public |
85 // public |
| 44 UIWIDGET ui_hbox_create(UiObject *obj, UiContainerArgs *args) { |
86 UIWIDGET ui_hbox_create(UiObject *obj, UiContainerArgs *args) { |
| 45 return box_create(obj, args, UI_BOX_HORIZONTAL); |
87 return box_create(obj, args, UI_BOX_HORIZONTAL); |
| 46 } |
88 } |
| 47 |
89 |
| 48 |
90 UiContainerX* ui_box_container_create(UiObject *obj, HWND hwnd, UiBoxOrientation orientation, short spacing, GridEdgeInsets padding) { |
| |
91 UiBoxContainer *container = cxZalloc(obj->ctx->allocator, sizeof(UiBoxContainer)); |
| |
92 container->container.hwnd = hwnd; |
| |
93 container->container.add = ui_box_container_add; |
| |
94 container->layout = ui_grid_layout_create(obj->ctx->allocator, spacing, spacing); |
| |
95 container->layout->padding = padding; |
| |
96 container->orientation = orientation; |
| |
97 return (UiContainerX*)container; |
| |
98 } |
| |
99 |
| |
100 void ui_box_container_add(UiContainerPrivate *ctn, W32Widget *widget, UiLayout *layout) { |
| |
101 UiBoxContainer *box = (UiBoxContainer*)ctn; |
| |
102 GridLayoutInfo gridLayout = (GridLayoutInfo) { |
| |
103 .margin = (GridEdgeInsets) { layout->margin_top, layout->margin_bottom, layout->margin_left, layout->margin_right }, |
| |
104 }; |
| |
105 if (box->orientation == UI_BOX_HORIZONTAL) { |
| |
106 gridLayout.vexpand = TRUE; |
| |
107 gridLayout.vfill = TRUE; |
| |
108 gridLayout.hexpand = layout->fill; |
| |
109 gridLayout.hfill = layout->fill; |
| |
110 } else { |
| |
111 gridLayout.hexpand = TRUE; |
| |
112 gridLayout.hfill = TRUE; |
| |
113 gridLayout.vexpand = layout->fill; |
| |
114 gridLayout.vfill = layout->fill; |
| |
115 } |
| |
116 ui_grid_add_widget(box->layout, box->x, box->y, widget, &gridLayout); |
| |
117 if (box->orientation == UI_BOX_HORIZONTAL) { |
| |
118 box->x++; |
| |
119 } else { |
| |
120 box->y++; |
| |
121 } |
| |
122 } |
| |
123 |
| |
124 /* ---------------------------- Grid Container ---------------------------- */ |
| |
125 |
| |
126 UIWIDGET ui_grid_create(UiObject *obj, UiContainerArgs *args) { |
| |
127 HINSTANCE hInstance = GetModuleHandle(NULL); |
| |
128 UiContainerPrivate *container = ui_obj_container(obj); |
| |
129 HWND parent = ui_container_get_parent(container); |
| |
130 UiLayout layout = UI_ARGS2LAYOUT(args); |
| |
131 |
| |
132 HWND hwnd = CreateWindowEx( |
| |
133 0, |
| |
134 TEXT("STATIC"), |
| |
135 NULL, |
| |
136 WS_CHILD | WS_VISIBLE, |
| |
137 0, 0, 100, 100, |
| |
138 parent, |
| |
139 NULL, |
| |
140 hInstance, |
| |
141 NULL); |
| |
142 |
| |
143 W32Widget *widget = w32_widget_new(&grid_layout_widget_class, hwnd); |
| |
144 ui_container_add(container, widget, &layout); |
| |
145 |
| |
146 UiContainerX *gridContainer = ui_grid_container_create(obj, hwnd, args->columnspacing, args->rowspacing, INSETS_ZERO); |
| |
147 uic_object_push_container(obj, gridContainer); |
| |
148 |
| |
149 UiGridLayoutContainer *grid = (UiGridLayoutContainer*)gridContainer; |
| |
150 widget->layout = (W32LayoutFunc)ui_grid_layout; |
| |
151 widget->layoutmanager = grid->layout; |
| |
152 grid->layout->preferred_width = 200; |
| |
153 grid->layout->preferred_height = 200; |
| |
154 |
| |
155 return widget; |
| |
156 } |
| |
157 |
| |
158 UiContainerX* ui_grid_container_create(UiObject *obj, HWND hwnd, short columnspacing, short rowspacing, GridEdgeInsets padding) { |
| |
159 UiGridLayoutContainer *container = cxZalloc(obj->ctx->allocator, sizeof(UiGridLayoutContainer)); |
| |
160 container->container.hwnd = hwnd; |
| |
161 container->container.add = ui_grid_container_add; |
| |
162 container->layout = ui_grid_layout_create(obj->ctx->allocator, columnspacing, rowspacing); |
| |
163 container->layout->padding = padding; |
| |
164 return (UiContainerX*)container; |
| |
165 } |
| |
166 |
| |
167 void ui_grid_container_add(UiContainerPrivate *ctn, W32Widget *widget, UiLayout *layout) { |
| |
168 UiGridLayoutContainer *grid = (UiGridLayoutContainer*)ctn; |
| |
169 if (ctn->container.newline) { |
| |
170 grid->y++; |
| |
171 grid->x = 0; |
| |
172 } |
| |
173 |
| |
174 uic_layout_setup_expand_fill(layout, grid->def_hexpand, grid->def_vexpand, grid->def_hfill, grid->def_vfill); |
| |
175 GridLayoutInfo gridLayout = (GridLayoutInfo) { |
| |
176 .margin = (GridEdgeInsets) { layout->margin_top, layout->margin_bottom, layout->margin_left, layout->margin_right }, |
| |
177 .colspan = layout->colspan, |
| |
178 .rowspan = layout->rowspan, |
| |
179 .hexpand = layout->hexpand, |
| |
180 .vexpand = layout->vexpand, |
| |
181 .hfill = layout->hfill, |
| |
182 .vfill = layout->vfill, |
| |
183 }; |
| |
184 ui_grid_add_widget(grid->layout, grid->x, grid->y, widget, &gridLayout); |
| |
185 |
| |
186 grid->x++; |
| |
187 } |
| |
188 |
| |
189 |
| |
190 /* ---------------------------- Container Helper ---------------------------- */ |
| |
191 |
| |
192 void ui_container_begin_close(UiObject *obj) { |
| |
193 UiContainerX *ct = obj->container_end; |
| |
194 ct->close = 1; |
| |
195 } |
| |
196 |
| |
197 int ui_container_finish(UiObject *obj) { |
| |
198 UiContainerX *ct = obj->container_end; |
| |
199 if(ct->close) { |
| |
200 ui_end_new(obj); |
| |
201 return 0; |
| |
202 } |
| |
203 return 1; |
| |
204 } |