refactore widget args passing and add image ref/unref functions (winui3)

Tue, 10 Jun 2025 12:28:30 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Tue, 10 Jun 2025 12:28:30 +0200
changeset 613
dac25dd922a2
parent 612
8570430391b3
child 614
a6e70dead6bd

refactore widget args passing and add image ref/unref functions (winui3)

make/vs/toolkit.sln file | annotate | diff | comparison | revisions
ui/winui/container.cpp file | annotate | diff | comparison | revisions
ui/winui/image.cpp file | annotate | diff | comparison | revisions
ui/winui/image.h file | annotate | diff | comparison | revisions
ui/winui/text.cpp file | annotate | diff | comparison | revisions
--- a/make/vs/toolkit.sln	Mon Jun 09 08:47:57 2025 +0200
+++ b/make/vs/toolkit.sln	Tue Jun 10 12:28:30 2025 +0200
@@ -9,6 +9,8 @@
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "winui", "..\..\ui\winui\winui.vcxproj", "{59F97886-BF49-4B3F-9EF6-FA7A84F3AB56}"
 EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "toolkit", "toolkit\toolkit.vcxproj", "{DF3F075F-1D6A-4B76-8479-94558ACEEA4C}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|ARM64 = Debug|ARM64
@@ -61,6 +63,18 @@
 		{59F97886-BF49-4B3F-9EF6-FA7A84F3AB56}.Release|x86.ActiveCfg = Release|Win32
 		{59F97886-BF49-4B3F-9EF6-FA7A84F3AB56}.Release|x86.Build.0 = Release|Win32
 		{59F97886-BF49-4B3F-9EF6-FA7A84F3AB56}.Release|x86.Deploy.0 = Release|Win32
+		{DF3F075F-1D6A-4B76-8479-94558ACEEA4C}.Debug|ARM64.ActiveCfg = Debug|x64
+		{DF3F075F-1D6A-4B76-8479-94558ACEEA4C}.Debug|ARM64.Build.0 = Debug|x64
+		{DF3F075F-1D6A-4B76-8479-94558ACEEA4C}.Debug|x64.ActiveCfg = Debug|x64
+		{DF3F075F-1D6A-4B76-8479-94558ACEEA4C}.Debug|x64.Build.0 = Debug|x64
+		{DF3F075F-1D6A-4B76-8479-94558ACEEA4C}.Debug|x86.ActiveCfg = Debug|Win32
+		{DF3F075F-1D6A-4B76-8479-94558ACEEA4C}.Debug|x86.Build.0 = Debug|Win32
+		{DF3F075F-1D6A-4B76-8479-94558ACEEA4C}.Release|ARM64.ActiveCfg = Release|x64
+		{DF3F075F-1D6A-4B76-8479-94558ACEEA4C}.Release|ARM64.Build.0 = Release|x64
+		{DF3F075F-1D6A-4B76-8479-94558ACEEA4C}.Release|x64.ActiveCfg = Release|x64
+		{DF3F075F-1D6A-4B76-8479-94558ACEEA4C}.Release|x64.Build.0 = Release|x64
+		{DF3F075F-1D6A-4B76-8479-94558ACEEA4C}.Release|x86.ActiveCfg = Release|Win32
+		{DF3F075F-1D6A-4B76-8479-94558ACEEA4C}.Release|x86.Build.0 = Release|Win32
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
--- a/ui/winui/container.cpp	Mon Jun 09 08:47:57 2025 +0200
+++ b/ui/winui/container.cpp	Tue Jun 10 12:28:30 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);
 }
 
@@ -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);
 }
 
 
--- a/ui/winui/image.cpp	Mon Jun 09 08:47:57 2025 +0200
+++ b/ui/winui/image.cpp	Tue Jun 10 12:28:30 2025 +0200
@@ -47,6 +47,16 @@
 
 UiImageSource::UiImageSource(winrt::Microsoft::UI::Xaml::Media::ImageSource& src) : imgsrc(src) {}
 
+void UiImageSource::ref() {
+	refcount++;
+}
+
+void UiImageSource::unref() {
+	if (--refcount == 0) {
+		delete this;
+	}
+}
+
 UIEXPORT UIWIDGET ui_imageviewer_create(UiObject *obj, UiImageViewerArgs args) {
     UiObject* current = uic_current_obj(obj);
     
@@ -94,9 +104,10 @@
     UiImageSource *imgdata = (UiImageSource*)data;
     if (g->value) {
         UiImageSource *prevData = (UiImageSource*)g->value;
-        delete prevData;
+        //prevData->unref();
     }
     g->value = imgdata;
+    //imgdata->ref();
 
     UiWidget* widget = (UiWidget*)g->obj;
     Image image = widget->uielement.as<Image>();
@@ -111,14 +122,25 @@
     std::wstring uriPath = L"file:///" + wPath;
     Uri uri{ uriPath };
     
-    BitmapImage bitmapImage = BitmapImage();
+    BitmapImage bitmapImage = BitmapImage();UiImageSource
     bitmapImage.UriSource(uri);
     ImageSource src = bitmapImage;
 
     UiImageSource *imgdata = new UiImageSource(src);
     obj->set(obj, imgdata, UI_IMAGE_OBJECT_TYPE);
+    imgdata->unref();
 
     free(wpath);
 
     return 0;
 }
+
+void ui_image_ref(UIIMAGE img) {
+    UiImageSource* imgdata = (UiImageSource*)img;
+    imgdata->ref();
+}
+
+void ui_image_unref(UIIMAGE img) {
+    UiImageSource* imgdata = (UiImageSource*)img;
+    imgdata->unref();
+}
--- a/ui/winui/image.h	Mon Jun 09 08:47:57 2025 +0200
+++ b/ui/winui/image.h	Tue Jun 10 12:28:30 2025 +0200
@@ -32,10 +32,16 @@
 #include "../ui/image.h"
 
 class UiImageSource {
+    unsigned int refcount = 1;
+
 public:
     winrt::Microsoft::UI::Xaml::Media::ImageSource imgsrc { nullptr };
 
     UiImageSource(winrt::Microsoft::UI::Xaml::Media::ImageSource& src);
+
+    void ref();
+
+    void unref();
 };
 
 
--- a/ui/winui/text.cpp	Mon Jun 09 08:47:57 2025 +0200
+++ b/ui/winui/text.cpp	Tue Jun 10 12:28:30 2025 +0200
@@ -68,7 +68,6 @@
     if (var) {
         UiText* value = (UiText*)var->value;
         value->obj = widget;
-        value->undomgr = NULL;
         value->set = ui_textarea_set;
         value->get = ui_textarea_get;
         value->getsubstr = ui_textarea_getsubstr;

mercurial