Sun, 20 Jul 2025 22:04:39 +0200
update toolkit, adjust UI code
| 76 | 1 | /* |
| 2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. | |
| 3 | * | |
| 4 | * Copyright 2024 Olaf Wintermann. All rights reserved. | |
| 5 | * | |
| 6 | * Redistribution and use in source and binary forms, with or without | |
| 7 | * modification, are permitted provided that the following conditions are met: | |
| 8 | * | |
| 9 | * 1. Redistributions of source code must retain the above copyright | |
| 10 | * notice, this list of conditions and the following disclaimer. | |
| 11 | * | |
| 12 | * 2. Redistributions in binary form must reproduce the above copyright | |
| 13 | * notice, this list of conditions and the following disclaimer in the | |
| 14 | * documentation and/or other materials provided with the distribution. | |
| 15 | * | |
| 16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
| 17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
| 18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
| 19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | |
| 20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
| 21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
| 22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
| 23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |
| 24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
| 25 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
| 26 | * POSSIBILITY OF SUCH DAMAGE. | |
| 27 | */ | |
| 28 | ||
| 29 | #include "pch.h" | |
| 30 | ||
| 31 | #include "image.h" | |
| 32 | ||
| 33 | #include "toolkit.h" | |
| 34 | #include "container.h" | |
| 35 | #include "../common/object.h" | |
| 36 | #include "../common/context.h" | |
| 37 | #include "util.h" | |
| 38 | ||
| 39 | using namespace winrt; | |
| 40 | using namespace Microsoft::UI::Xaml; | |
| 41 | using namespace Microsoft::UI::Xaml::Controls; | |
| 42 | using namespace Windows::UI::Xaml::Interop; | |
| 43 | using namespace winrt::Windows::Foundation; | |
| 44 | using namespace winrt::Microsoft::UI::Xaml::Controls::Primitives; | |
| 45 | using namespace winrt::Microsoft::UI::Xaml::Media::Imaging; | |
| 46 | using namespace winrt::Microsoft::UI::Xaml::Media; | |
| 47 | ||
| 48 | UiImageSource::UiImageSource(winrt::Microsoft::UI::Xaml::Media::ImageSource& src) : imgsrc(src) {} | |
| 49 | ||
|
108
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
76
diff
changeset
|
50 | void UiImageSource::ref() { |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
76
diff
changeset
|
51 | refcount++; |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
76
diff
changeset
|
52 | } |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
76
diff
changeset
|
53 | |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
76
diff
changeset
|
54 | void UiImageSource::unref() { |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
76
diff
changeset
|
55 | if (--refcount == 0) { |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
76
diff
changeset
|
56 | delete this; |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
76
diff
changeset
|
57 | } |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
76
diff
changeset
|
58 | } |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
76
diff
changeset
|
59 | |
| 76 | 60 | UIEXPORT UIWIDGET ui_imageviewer_create(UiObject *obj, UiImageViewerArgs args) { |
| 61 | UiObject* current = uic_current_obj(obj); | |
| 62 | ||
| 63 | Image image = Image(); | |
| 64 | FrameworkElement elm = image; | |
| 65 | if (args.scrollarea) { | |
| 66 | ScrollViewer scroll = ScrollViewer(); | |
| 67 | scroll.Content(image); | |
| 68 | elm = scroll; | |
| 69 | } | |
| 70 | ||
| 71 | // create toolkit wrapper object and register destructor | |
| 72 | UIElement uielm = image; | |
| 73 | UiWidget* widget = new UiWidget(uielm); | |
| 74 | ui_context_add_widget_destructor(current->ctx, widget); | |
| 75 | ||
| 76 | // bind variable | |
| 77 | UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_GENERIC); | |
| 78 | if (var) { | |
| 79 | UiGeneric *value = (UiGeneric*)var->value; | |
| 80 | value->obj = widget; | |
| 81 | value->get = ui_image_get; | |
| 82 | value->set = ui_image_set; | |
| 83 | } | |
| 84 | ||
| 85 | // add button to current container | |
| 86 | UI_APPLY_LAYOUT1(current, args); | |
| 87 | ||
| 88 | current->container->Add(elm, true); | |
| 89 | ||
| 90 | return widget; | |
| 91 | } | |
| 92 | ||
| 93 | extern "C" void* ui_image_get(UiGeneric *g) { | |
| 94 | ||
| 95 | ||
| 96 | return NULL; | |
| 97 | } | |
| 98 | ||
| 99 | extern "C" int ui_image_set(UiGeneric *g, void *data, const char *type) { | |
| 100 | if(!type || strcmp(type, UI_IMAGE_OBJECT_TYPE)) { | |
| 101 | return 1; | |
| 102 | } | |
| 103 | ||
| 104 | UiImageSource *imgdata = (UiImageSource*)data; | |
| 105 | if (g->value) { | |
| 106 | UiImageSource *prevData = (UiImageSource*)g->value; | |
|
108
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
76
diff
changeset
|
107 | //prevData->unref(); |
| 76 | 108 | } |
| 109 | g->value = imgdata; | |
|
108
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
76
diff
changeset
|
110 | //imgdata->ref(); |
| 76 | 111 | |
| 112 | UiWidget* widget = (UiWidget*)g->obj; | |
| 113 | Image image = widget->uielement.as<Image>(); | |
| 114 | image.Source(imgdata->imgsrc); | |
| 115 | ||
| 116 | return 0; | |
| 117 | } | |
| 118 | ||
| 119 | UIEXPORT int ui_image_load_file(UiGeneric *obj, const char *path) { | |
| 120 | wchar_t* wpath = str2wstr(path, nullptr); | |
| 121 | std::wstring wPath = wpath; | |
| 122 | std::wstring uriPath = L"file:///" + wPath; | |
| 123 | Uri uri{ uriPath }; | |
| 124 | ||
| 125 | BitmapImage bitmapImage = BitmapImage(); | |
| 126 | bitmapImage.UriSource(uri); | |
| 127 | ImageSource src = bitmapImage; | |
| 128 | ||
| 129 | UiImageSource *imgdata = new UiImageSource(src); | |
| 130 | obj->set(obj, imgdata, UI_IMAGE_OBJECT_TYPE); | |
|
108
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
76
diff
changeset
|
131 | imgdata->unref(); |
| 76 | 132 | |
| 133 | free(wpath); | |
| 134 | ||
| 135 | return 0; | |
| 136 | } | |
|
108
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
76
diff
changeset
|
137 | |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
76
diff
changeset
|
138 | void ui_image_ref(UIIMAGE img) { |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
76
diff
changeset
|
139 | UiImageSource* imgdata = (UiImageSource*)img; |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
76
diff
changeset
|
140 | imgdata->ref(); |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
76
diff
changeset
|
141 | } |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
76
diff
changeset
|
142 | |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
76
diff
changeset
|
143 | void ui_image_unref(UIIMAGE img) { |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
76
diff
changeset
|
144 | UiImageSource* imgdata = (UiImageSource*)img; |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
76
diff
changeset
|
145 | imgdata->unref(); |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
76
diff
changeset
|
146 | } |