--- a/ui/winui/commandbar.cpp Tue Oct 10 10:58:14 2023 +0200 +++ b/ui/winui/commandbar.cpp Wed Oct 11 10:54:24 2023 +0200 @@ -31,6 +31,10 @@ #include "commandbar.h" #include "util.h" +#include "../common/object.h" +#include "../common/context.h" + +#include "button.h" using namespace winrt; using namespace Microsoft::UI::Xaml; @@ -39,40 +43,42 @@ using namespace Microsoft::UI::Xaml::Markup; using namespace Windows::UI::Xaml::Interop; -static void create_item(CommandBar cb, UiToolbarItemI* i); -static void create_cmditem(CommandBar cb, UiToolbarItem* item); -static void create_toggleitem(CommandBar cb, UiToolbarToggleItem* item); +static void create_item(UiObject* obj, CommandBar cb, UiToolbarItemI* i); +static void create_cmditem(UiObject* obj, CommandBar cb, UiToolbarItem* item); +static void create_toggleitem(UiObject* obj, CommandBar cb, UiToolbarToggleItem* item); -CommandBar ui_create_toolbar() { +CommandBar ui_create_toolbar(UiObject *obj) { + + CommandBar cb = CommandBar(); + cb.DefaultLabelPosition(CommandBarDefaultLabelPosition::Right); + + // add pre-configured items CxList* defaults = uic_get_toolbar_defaults(); - CommandBar cb = CommandBar(); CxIterator i = cxListIterator(defaults); cx_foreach(char*, def, i) { UiToolbarItemI* item = uic_toolbar_get_item(def); if (!item) { - exit(-1); // TODO: maybe a error dialog? + exit(-1); // TODO: maybe an error dialog? } - - create_item(cb, item); + create_item(obj, cb, item); } - return cb; } -static void create_item(CommandBar cb, UiToolbarItemI* i) { +static void create_item(UiObject* obj, CommandBar cb, UiToolbarItemI* i) { switch (i->type) { case UI_TOOLBAR_ITEM: { - create_cmditem(cb, (UiToolbarItem*)i); + create_cmditem(obj, cb, (UiToolbarItem*)i); break; } case UI_TOOLBAR_TOGGLEITEM: { - create_toggleitem(cb, (UiToolbarToggleItem*)i); + create_toggleitem(obj, cb, (UiToolbarToggleItem*)i); break; } } } -static void create_cmditem(CommandBar cb, UiToolbarItem* item) { +static void create_cmditem(UiObject* obj, CommandBar cb, UiToolbarItem* item) { AppBarButton button = AppBarButton(); if (item->args.label) { wchar_t* wlabel = str2wstr(item->args.label, nullptr); @@ -80,9 +86,59 @@ free(wlabel); } + // register callback + if (item->args.onclick) { + ui_callback cbfunc = item->args.onclick; + void* cbdata = item->args.onclickdata; + button.Click([cbfunc, cbdata, obj](Windows::Foundation::IInspectable const& sender, RoutedEventArgs) { + UiEvent evt; + evt.obj = obj; + evt.window = obj->window; + evt.document = obj->ctx->document; + evt.eventdata = nullptr; + evt.intval = 0; + cbfunc(&evt, cbdata); + }); + } + cb.PrimaryCommands().Append(button); } -static void create_toggleitem(CommandBar cb, UiToolbarToggleItem* item) { + + +static void create_toggleitem(UiObject *obj, CommandBar cb, UiToolbarToggleItem* item) { + AppBarToggleButton button = AppBarToggleButton(); + if (item->args.label) { + wchar_t* wlabel = str2wstr(item->args.label, nullptr); + button.Content(box_value(wlabel)); + free(wlabel); + } + + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, nullptr, item->args.varname, UI_VAR_INTEGER); + if (var) { + UIElement elm = button; + UiWidget* widget = new UiWidget(elm); + ui_context_add_widget_destructor(obj->ctx, widget); + UiInteger* value = (UiInteger*)var->value; + int64_t i = value->value; + value->get = ui_toggle_button_get; + value->set = ui_toggle_button_set; + value->obj = widget; + ui_toggle_button_set(value, i); // init togglebutton state + + // listener for notifying observers + togglebutton_register_checked_observers(button, obj, var); + togglebutton_register_unchecked_observers(button, obj, var); + } + + UiToggleArgs args = {}; + args.onchange = item->args.onchange; + args.onchangedata = item->args.onchangedata; + togglebutton_register_callback(button, obj, args); + + + cb.PrimaryCommands().Append(button); } + +