| 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 |
| |
35 UiContainerPrivate* ui_obj_container(UiObject *obj) { |
| |
36 return (UiContainerPrivate*)obj->container_end; |
| |
37 } |
| |
38 |
| |
39 HWND ui_container_get_parent(UiContainerPrivate *ctn) { |
| |
40 return ctn->parent ? ctn->parent(ctn) : ctn->hwnd; |
| |
41 } |
| |
42 |
| |
43 void ui_container_add(UiContainerPrivate *ctn, W32Widget *widget, UiLayout *layout) { |
| |
44 UiLayout layout2 = *layout; |
| |
45 if (layout2.margin > 0) { |
| |
46 layout2.margin_left = layout2.margin; |
| |
47 layout2.margin_right = layout2.margin; |
| |
48 layout2.margin_top = layout2.margin; |
| |
49 layout2.margin_bottom = layout2.margin; |
| |
50 } |
| |
51 ctn->add(ctn, widget, &layout2); |
| |
52 ctn->container.newline = FALSE; |
| |
53 } |
| 30 |
54 |
| 31 |
55 |
| 32 /* ---------------------------- Box Container ---------------------------- */ |
56 /* ---------------------------- Box Container ---------------------------- */ |
| 33 |
57 |
| 34 static UIWIDGET box_create(UiObject *obj, UiContainerArgs *args, UiBoxOrientation orientation) { |
58 static UIWIDGET box_create(UiObject *obj, UiContainerArgs *args, UiBoxOrientation orientation) { |
| 43 // public |
67 // public |
| 44 UIWIDGET ui_hbox_create(UiObject *obj, UiContainerArgs *args) { |
68 UIWIDGET ui_hbox_create(UiObject *obj, UiContainerArgs *args) { |
| 45 return box_create(obj, args, UI_BOX_HORIZONTAL); |
69 return box_create(obj, args, UI_BOX_HORIZONTAL); |
| 46 } |
70 } |
| 47 |
71 |
| |
72 UiContainerX* ui_box_container_create(UiObject *obj, HWND hwnd, UiBoxOrientation orientation, short spacing, GridEdgeInsets padding) { |
| |
73 UiBoxContainer *container = cxZalloc(obj->ctx->allocator, sizeof(UiBoxContainer)); |
| |
74 container->container.hwnd = hwnd; |
| |
75 container->container.add = ui_box_container_add; |
| |
76 container->layout = ui_grid_layout_create(obj->ctx->allocator, spacing, spacing); |
| |
77 container->layout->padding = padding; |
| |
78 container->orientation = orientation; |
| |
79 return (UiContainerX*)container; |
| |
80 } |
| 48 |
81 |
| |
82 void ui_box_container_add(UiContainerPrivate *ctn, W32Widget *widget, UiLayout *layout) { |
| |
83 UiBoxContainer *box = (UiBoxContainer*)ctn; |
| |
84 GridLayoutInfo gridLayout = (GridLayoutInfo) { |
| |
85 .margin = (GridEdgeInsets) { layout->margin_top, layout->margin_bottom, layout->margin_left, layout->margin_right }, |
| |
86 }; |
| |
87 if (box->orientation == UI_BOX_HORIZONTAL) { |
| |
88 gridLayout.vexpand = TRUE; |
| |
89 gridLayout.vfill = TRUE; |
| |
90 gridLayout.hexpand = layout->fill; |
| |
91 gridLayout.hfill = layout->fill; |
| |
92 } else { |
| |
93 gridLayout.hexpand = TRUE; |
| |
94 gridLayout.hfill = TRUE; |
| |
95 gridLayout.vexpand = layout->fill; |
| |
96 gridLayout.vfill = layout->fill; |
| |
97 } |
| |
98 ui_grid_add_widget(box->layout, box->x, box->y, widget, &gridLayout); |
| |
99 if (box->orientation == UI_BOX_HORIZONTAL) { |
| |
100 box->x++; |
| |
101 } else { |
| |
102 box->y++; |
| |
103 } |
| |
104 } |
| |
105 |
| |
106 /* ---------------------------- Grid Container ---------------------------- */ |
| |
107 |
| |
108 UIWIDGET ui_grid_create(UiObject *obj, UiContainerArgs *args) { |
| |
109 return NULL; |
| |
110 } |
| |
111 |
| |
112 UiContainerX* ui_grid_container_create(UiObject *obj, HWND hwnd, short columnspacing, short rowspacing, GridEdgeInsets padding) { |
| |
113 UiGridLayoutContainer *container = cxZalloc(obj->ctx->allocator, sizeof(UiGridLayoutContainer)); |
| |
114 container->container.hwnd = hwnd; |
| |
115 container->container.add = ui_grid_container_add; |
| |
116 container->layout = ui_grid_layout_create(obj->ctx->allocator, columnspacing, rowspacing); |
| |
117 container->layout->padding = padding; |
| |
118 return (UiContainerX*)container; |
| |
119 } |
| |
120 |
| |
121 void ui_grid_container_add(UiContainerPrivate *ctn, W32Widget *widget, UiLayout *layout) { |
| |
122 UiGridLayoutContainer *grid = (UiGridLayoutContainer*)ctn; |
| |
123 if (ctn->container.newline) { |
| |
124 grid->y++; |
| |
125 grid->x = 0; |
| |
126 } |
| |
127 |
| |
128 uic_layout_setup_expand_fill(layout, grid->def_hexpand, grid->def_vexpand, grid->def_hfill, grid->def_vfill); |
| |
129 GridLayoutInfo gridLayout = (GridLayoutInfo) { |
| |
130 .margin = (GridEdgeInsets) { layout->margin_top, layout->margin_bottom, layout->margin_left, layout->margin_right }, |
| |
131 .colspan = layout->colspan, |
| |
132 .rowspan = layout->rowspan, |
| |
133 .hexpand = layout->hexpand, |
| |
134 .vexpand = layout->vexpand, |
| |
135 .hfill = layout->hfill, |
| |
136 .vfill = layout->vfill, |
| |
137 }; |
| |
138 ui_grid_add_widget(grid->layout, grid->x, grid->y, widget, &gridLayout); |
| |
139 |
| |
140 grid->x++; |
| |
141 } |