--- a/ui/winui/button.cpp Sun Oct 01 09:23:47 2023 +0200 +++ b/ui/winui/button.cpp Sun Oct 01 12:08:09 2023 +0200 @@ -40,17 +40,26 @@ using namespace Microsoft::UI::Xaml::Controls; using namespace Windows::UI::Xaml::Interop; using namespace winrt::Windows::Foundation; +using namespace winrt::Microsoft::UI::Xaml::Controls::Primitives; + + + +static void set_button_label(ButtonBase button, const char* label, const char* stockid) { + if (label) { + wchar_t* wlabel = str2wstr(label, nullptr); + button.Content(box_value(wlabel)); + free(wlabel); + } + // TODO: stockid +} + UIWIDGET ui_button_create(UiObject* obj, UiButtonArgs args) { UiObject* current = uic_current_obj(obj); // create button with label Button button = Button(); - if (args.label) { - wchar_t* wlabel = str2wstr(args.label, nullptr); - button.Content(box_value(wlabel)); - free(wlabel); - } + set_button_label(button, args.label, args.stockid); // create toolkit wrapper object and register destructor UIElement elm = button; @@ -77,15 +86,72 @@ // add button to current container UI_APPLY_LAYOUT1(current, args); + current->container->Add(button, false); return widget; } +static UIWIDGET create_togglebutton(UiObject *obj, ToggleButton button, UiToggleArgs args) { + UiObject* current = uic_current_obj(obj); + + // set label + set_button_label(button, args.label, args.stockid); + + // create toolkit wrapper object and register destructor + UIElement elm = button; + UiWidget* widget = new UiWidget(elm); + ui_context_add_widget_destructor(current->ctx, widget); + + // bind variable + UiVar* var = nullptr; + if (args.value) { + var = uic_create_value_var(current->ctx, args.value); + } + else if (args.varname) { + var = uic_create_var(obj->ctx, args.varname, UI_VAR_INTEGER); + } + if (var) { + UiInteger* value = (UiInteger*)var->value; + value->obj = widget; + value->get = ui_toggle_button_get; + value->set = ui_toggle_button_set; + } + + // add button to current container + UI_APPLY_LAYOUT1(current, args); + + current->container->Add(button, false); + + return widget; +} + +UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs args) { + ToggleButton button = ToggleButton(); + return create_togglebutton(obj, button, args); +} + UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs args) { - return nullptr; + CheckBox button = CheckBox(); + return create_togglebutton(obj, button, args); } UIWIDGET ui_radiobutton_create(UiObject* obj, UiToggleArgs) { return nullptr; } + + +int64_t ui_toggle_button_get(UiInteger* integer) { + UiWidget* widget = (UiWidget*)integer->obj; + ToggleButton toggleButton = widget->uielement.as<ToggleButton>(); + int val = toggleButton.IsChecked().GetBoolean(); + integer->value = val; + return val; +} + +void ui_toggle_button_set(UiInteger* integer, int64_t value) { + UiWidget* widget = (UiWidget*)integer->obj; + ToggleButton toggleButton = widget->uielement.as<ToggleButton>(); + toggleButton.IsChecked((bool)value); + integer->value = value; +}