diff -r 8c9b4b28aaa9 -r 4a8b1a748f09 ui/winui/container.cpp --- a/ui/winui/container.cpp Sat Sep 23 15:41:23 2023 +0200 +++ b/ui/winui/container.cpp Sun Sep 24 12:03:57 2023 +0200 @@ -28,23 +28,55 @@ #include "container.h" +#include "../common/context.h" +#include "../common/object.h" + + +void ui_container_begin_close(UiObject* obj) { + UiContainer* ct = uic_get_current_container(obj); + ct->close = 1; +} + +int ui_container_finish(UiObject* obj) { + UiContainer* ct = uic_get_current_container(obj); + if (ct->close) { + ui_end(obj); + return 0; + } + return 1; +} + + +// --------------------- UiBoxContainer --------------------- UiBoxContainer::UiBoxContainer(Grid grid, enum UiBoxContainerType type) { this->grid = grid; this->type = type; + GridLength gl; + gl.Value = 1; + gl.GridUnitType = GridUnitType::Star; + // hbox needs one row def, vbox needs one col def // all other col/row defs are created when elements are added if (type == UI_CONTAINER_HBOX) { - RowDefinition rowdef = RowDefinition(); - grid.RowDefinitions().Append(rowdef); + boxRowDef = RowDefinition(); + boxRowDef.Height(gl); + grid.RowDefinitions().Append(boxRowDef); } else { - ColumnDefinition coldef = ColumnDefinition(); - grid.ColumnDefinitions().Append(coldef); + boxColDef = ColumnDefinition(); + boxColDef.Width(gl); + grid.ColumnDefinitions().Append(boxColDef); } + + ui_reset_layout(layout); } -void UiBoxContainer::Add(Control control, UiBool fill) { +void UiBoxContainer::Add(FrameworkElement control, UiBool fill) { + if (this->layout.fill != UI_LAYOUT_UNDEFINED) { + fill = ui_lb2bool(this->layout.fill); + } + GridLength gl; if (fill) { gl.Value = 1; @@ -55,18 +87,155 @@ gl.GridUnitType = GridUnitType::Auto; } + control.HorizontalAlignment(HorizontalAlignment::Stretch); + control.VerticalAlignment(VerticalAlignment::Stretch); + if (type == UI_CONTAINER_HBOX) { ColumnDefinition coldef = ColumnDefinition(); coldef.Width(gl); grid.ColumnDefinitions().Append(coldef); grid.SetColumn(control, grid.Children().Size()); + grid.SetRow(control, 0); } else { RowDefinition rowdef = RowDefinition(); rowdef.Height(gl); grid.RowDefinitions().Append(rowdef); grid.SetRow(control, grid.Children().Size()); + grid.SetColumn(control, 0); } grid.Children().Append(control); + + ui_reset_layout(layout); +} + +// --------------------- UiBoxContainer --------------------- + +UIWIDGET ui_grid(UiObject* obj) { + return ui_grid_sp(obj, 0, 0, 0); +} + +UIWIDGET ui_grid_sp(UiObject* obj, int margin, int columnspacing, int rowspacing) { + UiContainer* ct = uic_get_current_container(obj); + + Grid grid = Grid(); + ct->Add(grid, true); + + UIElement elm = grid; + UiWidget* widget = new UiWidget(elm); + + UiObject* newobj = uic_object_new(obj, widget); + newobj->container = new UiGridContainer(grid, margin, columnspacing, rowspacing); + uic_obj_add(obj, newobj); + + return widget; +} + +UiGridContainer::UiGridContainer(Grid grid, int margin, int columnspacing, int rowspacing) { + this->grid = grid; + Thickness t = { (double)margin, (double)margin, (double)margin, (double)margin }; + grid.Margin(t); + grid.ColumnSpacing((double)columnspacing); + grid.RowSpacing((double)rowspacing); + ui_reset_layout(layout); } +void UiGridContainer::Add(FrameworkElement control, UiBool fill) { + GridLength gl; + + int hexpand = FALSE; + int vexpand = FALSE; + if (layout.hexpand != UI_LAYOUT_UNDEFINED) { + hexpand = layout.hexpand; + } + if (layout.vexpand != UI_LAYOUT_UNDEFINED) { + vexpand = layout.vexpand; + } + + // create new RowDefinition for the new line + if (layout.newline || y == -1) { + x = 0; + y++; + RowDefinition rowdef = RowDefinition(); + if (vexpand) { + gl.GridUnitType = GridUnitType::Star; + gl.Value = 1; + } + else { + gl.GridUnitType = GridUnitType::Auto; + gl.Value = 0; + } + rowdef.Height(gl); + grid.RowDefinitions().Append(rowdef); + } + + // create new columndefinition, if a new column is added + if (x == cols) { + if (hexpand) { + gl.GridUnitType = GridUnitType::Star; + gl.Value = 1; + } + else { + gl.GridUnitType = GridUnitType::Auto; + gl.Value = 0; + } + ColumnDefinition coldef = ColumnDefinition(); + coldef.Width(gl); + grid.ColumnDefinitions().Append(coldef); + cols++; + } + + // add control + control.HorizontalAlignment(HorizontalAlignment::Stretch); + control.VerticalAlignment(VerticalAlignment::Stretch); + + if (layout.gridwidth > 0) { + grid.SetColumnSpan(control, layout.gridwidth); + } + + grid.SetRow(control, y); + grid.SetColumn(control, x); + grid.Children().Append(control); + + x++; + + ui_reset_layout(layout); +} + +/* + * -------------------- Layout Functions -------------------- + * + * functions for setting layout attributes for the current container + * + */ + +void ui_layout_fill(UiObject* obj, UiBool fill) { + UiContainer* ct = uic_get_current_container(obj); + ct->layout.fill = ui_bool2lb(fill); +} + +void ui_layout_hexpand(UiObject* obj, UiBool expand) { + UiContainer* ct = uic_get_current_container(obj); + ct->layout.hexpand = expand; +} + +void ui_layout_vexpand(UiObject* obj, UiBool expand) { + UiContainer* ct = uic_get_current_container(obj); + ct->layout.vexpand = expand; +} + +void ui_layout_width(UiObject* obj, int width) { + UiContainer* ct = uic_get_current_container(obj); + ct->layout.width = width; +} + +void ui_layout_gridwidth(UiObject* obj, int width) { + UiContainer* ct = uic_get_current_container(obj); + ct->layout.gridwidth = width; +} + +void ui_newline(UiObject* obj) { + UiContainer* ct = uic_get_current_container(obj); + ct->layout.newline = TRUE; +} +