Tue, 10 Jun 2025 12:28:30 +0200
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;