ui/winui/button.cpp

branch
newapi
changeset 189
4daddc326877
parent 188
fbbae6738252
child 191
6113ed66d258
equal deleted inserted replaced
188:fbbae6738252 189:4daddc326877
90 current->container->Add(button, false); 90 current->container->Add(button, false);
91 91
92 return widget; 92 return widget;
93 } 93 }
94 94
95
96 static void togglebutton_register_checked_observers(ToggleButton button, UiObject* obj, UiVar* var) {
97 button.Checked([button, obj, var](IInspectable const& sender, RoutedEventArgs) {
98 UiInteger* i = (UiInteger*)var->value;
99 UiEvent evt = ui_create_int_event(obj, i->get(i));
100 ui_notify_evt(i->observers, &evt);
101 });
102 }
103
104 static void togglebutton_register_unchecked_observers(ToggleButton button, UiObject* obj, UiVar* var) {
105 button.Unchecked([button, obj, var](IInspectable const& sender, RoutedEventArgs) {
106 UiInteger* i = (UiInteger*)var->value;
107 UiEvent evt = ui_create_int_event(obj, i->get(i));
108 ui_notify_evt(i->observers, &evt);
109 });
110 }
111
112 static void togglebutton_register_callback(ToggleButton button, UiObject *obj, UiToggleArgs& args) {
113 ui_callback callback = args.onchange;
114 void* cbdata = args.onchangedata;
115 if (callback) {
116 button.Checked([button, obj, callback, cbdata](IInspectable const& sender, RoutedEventArgs) {
117 UiEvent evt = ui_create_int_event(obj, true);
118 callback(&evt, cbdata);
119 });
120 button.Unchecked([button, obj, callback, cbdata](IInspectable const& sender, RoutedEventArgs) {
121 UiEvent evt = ui_create_int_event(obj, false);
122 callback(&evt, cbdata);
123 });
124 }
125 }
126
95 static UIWIDGET create_togglebutton(UiObject *obj, ToggleButton button, UiToggleArgs args) { 127 static UIWIDGET create_togglebutton(UiObject *obj, ToggleButton button, UiToggleArgs args) {
96 UiObject* current = uic_current_obj(obj); 128 UiObject* current = uic_current_obj(obj);
97 129
98 // set label 130 // set label
99 set_button_label(button, args.label, args.stockid); 131 set_button_label(button, args.label, args.stockid);
132 togglebutton_register_callback(button, obj, args);
100 133
101 // create toolkit wrapper object and register destructor 134 // create toolkit wrapper object and register destructor
102 UIElement elm = button; 135 UIElement elm = button;
103 UiWidget* widget = new UiWidget(elm); 136 UiWidget* widget = new UiWidget(elm);
104 ui_context_add_widget_destructor(current->ctx, widget); 137 ui_context_add_widget_destructor(current->ctx, widget);
114 if (var) { 147 if (var) {
115 UiInteger* value = (UiInteger*)var->value; 148 UiInteger* value = (UiInteger*)var->value;
116 value->obj = widget; 149 value->obj = widget;
117 value->get = ui_toggle_button_get; 150 value->get = ui_toggle_button_get;
118 value->set = ui_toggle_button_set; 151 value->set = ui_toggle_button_set;
152
153 // listener for notifying observers
154 togglebutton_register_checked_observers(button, obj, var);
155 togglebutton_register_unchecked_observers(button, obj, var);
119 } 156 }
120 157
121 // add button to current container 158 // add button to current container
122 UI_APPLY_LAYOUT1(current, args); 159 UI_APPLY_LAYOUT1(current, args);
123 160
141 178
142 UiObject* current = uic_current_obj(obj); 179 UiObject* current = uic_current_obj(obj);
143 180
144 // set label 181 // set label
145 set_button_label(button, args.label, args.stockid); 182 set_button_label(button, args.label, args.stockid);
183 togglebutton_register_callback(button, obj, args);
146 184
147 // create toolkit wrapper object and register destructor 185 // create toolkit wrapper object and register destructor
148 UIElement elm = button; 186 UIElement elm = button;
149 UiWidget* widget = new UiWidget(elm); 187 UiWidget* widget = new UiWidget(elm);
150 ui_context_add_widget_destructor(current->ctx, widget); 188 ui_context_add_widget_destructor(current->ctx, widget);
179 button.GroupName(groupName); 217 button.GroupName(groupName);
180 218
181 value->obj = radioButtons; 219 value->obj = radioButtons;
182 value->get = ui_radio_button_get; 220 value->get = ui_radio_button_get;
183 value->set = ui_radio_button_set; 221 value->set = ui_radio_button_set;
222
223 // listener for notifying observers (only checked, not unchecked)
224 togglebutton_register_checked_observers(button, obj, var);
184 } 225 }
185 226
186 // add button to current container 227 // add button to current container
187 UI_APPLY_LAYOUT1(current, args); 228 UI_APPLY_LAYOUT1(current, args);
188 229

mercurial