ui/winui/container.cpp

changeset 108
77254bd6dccb
parent 103
6606616eca9f
--- a/ui/winui/container.cpp	Sat Apr 05 17:57:04 2025 +0200
+++ b/ui/winui/container.cpp	Sun Jul 20 22:04:39 2025 +0200
@@ -34,6 +34,7 @@
 #include "../common/object.h"
 
 #include "util.h"
+#include "../ui/widget.h"
 
 
 void ui_container_begin_close(UiObject* obj) {
@@ -51,13 +52,13 @@
 }
 
 
-UIEXPORT UIWIDGET ui_customwidget_create(UiObject *obj, ui_createwidget_func create_widget, void *userdata, UiWidgetArgs args) {
+UIWIDGET ui_customwidget_create(UiObject *obj, ui_createwidget_func create_widget, void *userdata, UiWidgetArgs *args) {
 	UiObject* current = uic_current_obj(obj);
 
 	UIWIDGET widget = create_widget(obj, args, userdata);
 	FrameworkElement w = widget->uielement.as<FrameworkElement>();
 
-	UI_APPLY_LAYOUT1(current, args);
+	UI_APPLY_LAYOUT2(current, args);
 
 	current->container->Add(w, false);
 
@@ -66,9 +67,9 @@
 
 // --------------------- UiBoxContainer ---------------------
 
-static UIWIDGET ui_box(UiObject* obj, UiContainerArgs args, UiBoxContainerType type) {
+static UIWIDGET ui_box(UiObject* obj, UiContainerArgs *args, UiBoxContainerType type) {
 	UiObject* current = uic_current_obj(obj);
-	UI_APPLY_LAYOUT1(current, args);
+	UI_APPLY_LAYOUT2(current, args);
 
 	Grid grid = Grid();
 	current->container->Add(grid, true);
@@ -78,18 +79,18 @@
 	ui_context_add_widget_destructor(current->ctx, widget);
 
 	UiObject* newobj = uic_object_new(obj, widget);
-	newobj->container = new UiBoxContainer(grid, type, args.margin, args.spacing);
+	newobj->container = new UiBoxContainer(grid, type, args->margin, args->spacing);
 	ui_context_add_container_destructor(current->ctx, newobj->container);
 	uic_obj_add(obj, newobj);
 
 	return widget;
 }
 
-UIWIDGET ui_vbox_create(UiObject* obj, UiContainerArgs args) {
+UIWIDGET ui_vbox_create(UiObject* obj, UiContainerArgs *args) {
 	return ui_box(obj, args, UI_BOX_CONTAINER_VBOX);
 }
 
-UIWIDGET ui_hbox_create(UiObject* obj, UiContainerArgs args) {
+UIWIDGET ui_hbox_create(UiObject* obj, UiContainerArgs *args) {
 	return ui_box(obj, args, UI_BOX_CONTAINER_HBOX);
 }
 
@@ -161,9 +162,9 @@
 
 // --------------------- UiGridContainer ---------------------
 
-UIWIDGET ui_grid_create(UiObject* obj, UiContainerArgs args) {
+UIWIDGET ui_grid_create(UiObject* obj, UiContainerArgs *args) {
 	UiObject* current = uic_current_obj(obj);
-	UI_APPLY_LAYOUT1(current, args);
+	UI_APPLY_LAYOUT2(current, args);
 
 	Grid grid = Grid();
 	current->container->Add(grid, true);
@@ -173,7 +174,7 @@
 	ui_context_add_widget_destructor(current->ctx, widget);
 
 	UiObject* newobj = uic_object_new(obj, widget);
-	newobj->container = new UiGridContainer(grid, args.margin, args.columnspacing, args.rowspacing);
+	newobj->container = new UiGridContainer(grid, args->margin, args->columnspacing, args->rowspacing);
 	ui_context_add_container_destructor(current->ctx, newobj->container);
 	uic_obj_add(obj, newobj);
 
@@ -303,7 +304,7 @@
 
 // --------------------- UI Frame ---------------------
 
-UIWIDGET ui_frame_create(UiObject* obj, UiFrameArgs args) {
+UIWIDGET ui_frame_create(UiObject* obj, UiFrameArgs *args) {
 	// create a grid for the frame, that contains the label and a sub-frame
 	Grid frame = Grid();
 
@@ -320,7 +321,7 @@
 
 	// label
 	int row = 0;
-	if (args.label) {
+	if (args->label) {
 		RowDefinition rowdefLabel = RowDefinition();
 		gl.GridUnitType = GridUnitType::Auto;
 		gl.Value = 0;
@@ -328,7 +329,7 @@
 		frame.RowDefinitions().Append(rowdefLabel);
 
 		TextBlock label = TextBlock();
-		wchar_t* wlabel = str2wstr(args.label, nullptr);
+		wchar_t* wlabel = str2wstr(args->label, nullptr);
 		winrt::hstring hstr(wlabel);
 		label.Text(hstr);
 		free(wlabel);
@@ -359,7 +360,7 @@
 
 	// add frame to the parent container
 	UiObject* current = uic_current_obj(obj);
-	UI_APPLY_LAYOUT1(current, args);
+	UI_APPLY_LAYOUT2(current, args);
 	current->container->Add(frame, true);
 
 	UIElement elm = frame;
@@ -368,18 +369,18 @@
 
 	// sub container
 	UiContainer* ctn = nullptr;
-	switch (args.subcontainer) {
+	switch (args->subcontainer) {
 		default:
 		case UI_CONTAINER_VBOX: {
-			ctn = new UiBoxContainer(workarea, UI_BOX_CONTAINER_VBOX, args.margin, args.spacing);
+			ctn = new UiBoxContainer(workarea, UI_BOX_CONTAINER_VBOX, args->margin, args->spacing);
 			break;
 		}
 		case UI_CONTAINER_HBOX: {
-			ctn = new UiBoxContainer(workarea, UI_BOX_CONTAINER_HBOX, args.margin, args.spacing);
+			ctn = new UiBoxContainer(workarea, UI_BOX_CONTAINER_HBOX, args->margin, args->spacing);
 			break;
 		}
 		case UI_CONTAINER_GRID: {
-			ctn = new UiGridContainer(workarea, args.margin, args.columnspacing, args.rowspacing);
+			ctn = new UiGridContainer(workarea, args->margin, args->columnspacing, args->rowspacing);
 			break;
 		}
 	}
@@ -394,18 +395,18 @@
 
 // --------------------- UI Expander ---------------------
 
-UIWIDGET ui_expander_create(UiObject* obj, UiFrameArgs args) {
+UIWIDGET ui_expander_create(UiObject* obj, UiFrameArgs *args) {
 	Expander expander = Expander();
-	if (args.label) {
-		wchar_t* wlabel = str2wstr(args.label, nullptr);
+	if (args->label) {
+		wchar_t* wlabel = str2wstr(args->label, nullptr);
 		expander.Header(box_value(wlabel));
 		free(wlabel);
 	}
-	expander.IsExpanded(args.isexpanded);
+	expander.IsExpanded(args->isexpanded);
 
 	// add frame to the parent container
 	UiObject* current = uic_current_obj(obj);
-	UI_APPLY_LAYOUT1(current, args);
+	UI_APPLY_LAYOUT2(current, args);
 	current->container->Add(expander, true);
 
 	UIElement elm = expander;
@@ -416,18 +417,18 @@
 	expander.Content(content);
 
 	UiContainer* ctn = nullptr;
-	switch (args.subcontainer) {
+	switch (args->subcontainer) {
 		default: 
 		case UI_CONTAINER_VBOX: {
-			ctn = new UiBoxContainer(content, UI_BOX_CONTAINER_VBOX, args.margin, args.spacing);
+			ctn = new UiBoxContainer(content, UI_BOX_CONTAINER_VBOX, args->margin, args->spacing);
 			break;
 		}
 		case UI_CONTAINER_HBOX: {
-			ctn = new UiBoxContainer(content, UI_BOX_CONTAINER_HBOX, args.margin, args.spacing);
+			ctn = new UiBoxContainer(content, UI_BOX_CONTAINER_HBOX, args->margin, args->spacing);
 			break;
 		}
 		case UI_CONTAINER_GRID: {
-			ctn = new UiGridContainer(content, args.margin, args.columnspacing, args.rowspacing);
+			ctn = new UiGridContainer(content, args->margin, args->columnspacing, args->rowspacing);
 			break;
 		}
 	}
@@ -442,12 +443,12 @@
 
 // --------------------- UI ScrolledWindow ---------------------
 
-UIWIDGET ui_scrolledwindow_create(UiObject* obj, UiFrameArgs args) {
+UIWIDGET ui_scrolledwindow_create(UiObject* obj, UiFrameArgs *args) {
 	ScrollViewer scrollW = ScrollViewer();
 
 	// add frame to the parent container
 	UiObject* current = uic_current_obj(obj);
-	UI_APPLY_LAYOUT1(current, args);
+	UI_APPLY_LAYOUT2(current, args);
 	current->container->Add(scrollW, true);
 
 	UIElement elm = scrollW;
@@ -459,18 +460,18 @@
 	scrollW.Content(content);
 
 	UiContainer* ctn = nullptr;
-	switch (args.subcontainer) {
+	switch (args->subcontainer) {
 		default:
 		case UI_CONTAINER_VBOX: {
-			ctn = new UiBoxContainer(content, UI_BOX_CONTAINER_VBOX, args.margin, args.spacing);
+			ctn = new UiBoxContainer(content, UI_BOX_CONTAINER_VBOX, args->margin, args->spacing);
 			break;
 		}
 		case UI_CONTAINER_HBOX: {
-			ctn = new UiBoxContainer(content, UI_BOX_CONTAINER_HBOX, args.margin, args.spacing);
+			ctn = new UiBoxContainer(content, UI_BOX_CONTAINER_HBOX, args->margin, args->spacing);
 			break;
 		}
 		case UI_CONTAINER_GRID: {
-			ctn = new UiGridContainer(content, args.margin, args.columnspacing, args.rowspacing);
+			ctn = new UiGridContainer(content, args->margin, args->columnspacing, args->rowspacing);
 			break;
 		}
 	}
@@ -520,21 +521,21 @@
 	return newobj;
 }
 
-static UiTabView* tabview_pivot_create(UiObject* obj, UiTabViewArgs args) {
+static UiTabView* tabview_pivot_create(UiObject* obj, UiTabViewArgs *args) {
 	Pivot pivot = Pivot();
 	UiPivotTabView* tabview = new UiPivotTabView(obj, pivot, args);
 
 	return tabview;
 }
 
-UiPivotTabView::UiPivotTabView(UiObject* obj, Pivot pivot, UiTabViewArgs args) {
+UiPivotTabView::UiPivotTabView(UiObject* obj, Pivot pivot, UiTabViewArgs *args) {
 	this->current = obj;
 	this->pivot = pivot;
-	this->subcontainer = args.subcontainer;
-	this->margin = args.margin;
-	this->spacing = args.spacing;
-	this->columnspacing = args.columnspacing;
-	this->rowspacing = args.rowspacing;
+	this->subcontainer = args->subcontainer;
+	this->margin = args->margin;
+	this->spacing = args->spacing;
+	this->columnspacing = args->columnspacing;
+	this->rowspacing = args->rowspacing;
 }
 
 UiObject* UiPivotTabView::AddTab(const char* label, int index) {
@@ -568,7 +569,7 @@
 }
 
 
-static UiTabView* tabview_invisible_create(UiObject *obj, UiTabViewArgs args) {
+static UiTabView* tabview_invisible_create(UiObject *obj, UiTabViewArgs *args) {
 	Grid container = Grid();
 	container.HorizontalAlignment(HorizontalAlignment::Stretch);
 	container.VerticalAlignment(VerticalAlignment::Stretch);
@@ -576,14 +577,14 @@
 	return tabview;
 }
 
-UiInvisibleTabView::UiInvisibleTabView(UiObject* obj, Grid container, UiTabViewArgs args) {
+UiInvisibleTabView::UiInvisibleTabView(UiObject* obj, Grid container, UiTabViewArgs *args) {
 	this->current = obj;
 	this->container = container;
-	this->subcontainer = args.subcontainer;
-	this->margin = args.margin;
-	this->spacing = args.spacing;
-	this->columnspacing = args.columnspacing;
-	this->rowspacing = args.rowspacing;
+	this->subcontainer = args->subcontainer;
+	this->margin = args->margin;
+	this->spacing = args->spacing;
+	this->columnspacing = args->columnspacing;
+	this->rowspacing = args->rowspacing;
 	this->currentIndex = -1;
 
 	GridLength gl;
@@ -638,7 +639,7 @@
 }
 
 
-static UiTabView* tabview_main_create(UiObject* obj, UiTabViewArgs args) {
+static UiTabView* tabview_main_create(UiObject* obj, UiTabViewArgs *args) {
 	TabView tabview = TabView();
 	tabview.IsAddTabButtonVisible(false);
 	//tabview.CanDragTabs(false);
@@ -648,14 +649,14 @@
 	return uitabview;
 }
 
-UiMainTabView::UiMainTabView(UiObject* obj, TabView tabview, UiTabViewArgs args) {
+UiMainTabView::UiMainTabView(UiObject* obj, TabView tabview, UiTabViewArgs *args) {
 	this->current = obj;
 	this->tabview = tabview;
-	this->subcontainer = args.subcontainer;
-	this->margin = args.margin;
-	this->spacing = args.spacing;
-	this->columnspacing = args.columnspacing;
-	this->rowspacing = args.rowspacing;
+	this->subcontainer = args->subcontainer;
+	this->margin = args->margin;
+	this->spacing = args->spacing;
+	this->columnspacing = args->columnspacing;
+	this->rowspacing = args->rowspacing;
 }
 
 UiObject* UiMainTabView::AddTab(const char* label, int index) {
@@ -691,7 +692,7 @@
 }
 
 
-static UiTabView* tabview_navigationview_create(UiObject* obj, UiTabViewArgs args, UiTabViewType type) {
+static UiTabView* tabview_navigationview_create(UiObject* obj, UiTabViewArgs *args, UiTabViewType type) {
 	NavigationView navigationview = NavigationView();
 	UiNavigationTabView* tabview = new UiNavigationTabView(obj, navigationview, args, type);
 	navigationview.IsBackButtonVisible(NavigationViewBackButtonVisible::Collapsed);
@@ -700,14 +701,14 @@
 	return tabview;
 }
 
-UiNavigationTabView::UiNavigationTabView(UiObject* obj, NavigationView navigationview, UiTabViewArgs args, UiTabViewType type) {
+UiNavigationTabView::UiNavigationTabView(UiObject* obj, NavigationView navigationview, UiTabViewArgs *args, UiTabViewType type) {
 	this->current = obj;
 	this->navigationview = navigationview;
 	this->type = type;
-	this->margin = args.margin;
-	this->spacing = args.spacing;
-	this->columnspacing = args.columnspacing;
-	this->rowspacing = args.rowspacing;
+	this->margin = args->margin;
+	this->spacing = args->spacing;
+	this->columnspacing = args->columnspacing;
+	this->rowspacing = args->rowspacing;
 
 	if (type == UI_TABVIEW_NAVIGATION_TOP) {
 		navigationview.PaneDisplayMode(NavigationViewPaneDisplayMode::Top);
@@ -773,8 +774,8 @@
 	tabview->Select(value);
 }
 
-UIWIDGET ui_tabview_create(UiObject* obj, UiTabViewArgs args) {
-	UiTabViewType type = args.tabview == UI_TABVIEW_DEFAULT ? UI_TABVIEW_NAVIGATION_TOP2 : args.tabview;
+UIWIDGET ui_tabview_create(UiObject* obj, UiTabViewArgs *args) {
+	UiTabViewType type = args->tabview == UI_TABVIEW_DEFAULT ? UI_TABVIEW_NAVIGATION_TOP2 : args->tabview;
 	UiTabView* tabview = nullptr;
 	switch (type) {
 		default: {
@@ -806,7 +807,7 @@
 
 	// add frame to the parent container
 	UiObject* current = uic_current_obj(obj);
-	UI_APPLY_LAYOUT1(current, args);
+	UI_APPLY_LAYOUT2(current, args);
 	current->container->Add(tabview->GetFrameworkElement(), true);
 
 	UIElement elm = tabview->GetFrameworkElement();
@@ -817,7 +818,7 @@
 	// TODO: add tabview destructor
 
 	// bind variable
-	UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_INTEGER);
+	UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_INTEGER);
 	if (var) {
 		UiInteger *i = (UiInteger*)var->value;
 		i->obj = tabview;
@@ -861,28 +862,28 @@
 
 // TODO: replace placeholder implementation
 
-UIEXPORT UIWIDGET ui_headerbar_create(UiObject *obj, UiHeaderbarArgs args) {
+UIEXPORT UIWIDGET ui_headerbar_create(UiObject *obj, UiHeaderbarArgs *args) {
 	UiContainerArgs boxargs = { };
 	boxargs.fill = UI_OFF;
-	return ui_hbox_create(obj, boxargs);
+	return ui_hbox_create(obj, &boxargs);
 }
 
 UIEXPORT void ui_headerbar_start_create(UiObject *obj) {
 	UiContainerArgs boxargs = { };
 	boxargs.fill = UI_OFF;
-	ui_hbox_create(obj, boxargs);
+	ui_hbox_create(obj, &boxargs);
 }
 
 UIEXPORT void ui_headerbar_center_create(UiObject *obj) {
 	UiContainerArgs boxargs = { };
 	boxargs.fill = UI_OFF;
-	ui_hbox_create(obj, boxargs);
+	ui_hbox_create(obj, &boxargs);
 }
 
 UIEXPORT void ui_headerbar_end_create(UiObject *obj) {
 	UiContainerArgs boxargs = { };
 	boxargs.fill = UI_OFF;
-	ui_hbox_create(obj, boxargs);
+	ui_hbox_create(obj, &boxargs);
 }
 
 

mercurial