ui/winui/container.cpp

branch
newapi
changeset 185
4a8b1a748f09
parent 182
6cf690e042bd
child 186
5db4979bf482
--- 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;
+}
+

mercurial