diff -r fbbae6738252 -r 4daddc326877 ui/winui/button.cpp --- a/ui/winui/button.cpp Sun Oct 01 14:40:43 2023 +0200 +++ b/ui/winui/button.cpp Sun Oct 01 16:39:03 2023 +0200 @@ -92,11 +92,44 @@ return widget; } + +static void togglebutton_register_checked_observers(ToggleButton button, UiObject* obj, UiVar* var) { + button.Checked([button, obj, var](IInspectable const& sender, RoutedEventArgs) { + UiInteger* i = (UiInteger*)var->value; + UiEvent evt = ui_create_int_event(obj, i->get(i)); + ui_notify_evt(i->observers, &evt); + }); +} + +static void togglebutton_register_unchecked_observers(ToggleButton button, UiObject* obj, UiVar* var) { + button.Unchecked([button, obj, var](IInspectable const& sender, RoutedEventArgs) { + UiInteger* i = (UiInteger*)var->value; + UiEvent evt = ui_create_int_event(obj, i->get(i)); + ui_notify_evt(i->observers, &evt); + }); +} + +static void togglebutton_register_callback(ToggleButton button, UiObject *obj, UiToggleArgs& args) { + ui_callback callback = args.onchange; + void* cbdata = args.onchangedata; + if (callback) { + button.Checked([button, obj, callback, cbdata](IInspectable const& sender, RoutedEventArgs) { + UiEvent evt = ui_create_int_event(obj, true); + callback(&evt, cbdata); + }); + button.Unchecked([button, obj, callback, cbdata](IInspectable const& sender, RoutedEventArgs) { + UiEvent evt = ui_create_int_event(obj, false); + callback(&evt, cbdata); + }); + } +} + 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); + togglebutton_register_callback(button, obj, args); // create toolkit wrapper object and register destructor UIElement elm = button; @@ -116,6 +149,10 @@ value->obj = widget; value->get = ui_toggle_button_get; value->set = ui_toggle_button_set; + + // listener for notifying observers + togglebutton_register_checked_observers(button, obj, var); + togglebutton_register_unchecked_observers(button, obj, var); } // add button to current container @@ -143,6 +180,7 @@ // set label set_button_label(button, args.label, args.stockid); + togglebutton_register_callback(button, obj, args); // create toolkit wrapper object and register destructor UIElement elm = button; @@ -181,6 +219,9 @@ value->obj = radioButtons; value->get = ui_radio_button_get; value->set = ui_radio_button_set; + + // listener for notifying observers (only checked, not unchecked) + togglebutton_register_checked_observers(button, obj, var); } // add button to current container