ui/winui/button.cpp

branch
newapi
changeset 188
fbbae6738252
parent 187
24ce2c326d85
child 189
4daddc326877
equal deleted inserted replaced
187:24ce2c326d85 188:fbbae6738252
134 UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs args) { 134 UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs args) {
135 CheckBox button = CheckBox(); 135 CheckBox button = CheckBox();
136 return create_togglebutton(obj, button, args); 136 return create_togglebutton(obj, button, args);
137 } 137 }
138 138
139 UIWIDGET ui_radiobutton_create(UiObject* obj, UiToggleArgs) { 139 UIWIDGET ui_radiobutton_create(UiObject* obj, UiToggleArgs args) {
140 return nullptr; 140 RadioButton button = RadioButton();
141
142 UiObject* current = uic_current_obj(obj);
143
144 // set label
145 set_button_label(button, args.label, args.stockid);
146
147 // create toolkit wrapper object and register destructor
148 UIElement elm = button;
149 UiWidget* widget = new UiWidget(elm);
150 ui_context_add_widget_destructor(current->ctx, widget);
151
152 UiVar* var = nullptr;
153 if (args.value) {
154 var = uic_create_value_var(current->ctx, args.value);
155 }
156 else if (args.varname) {
157 var = uic_create_var(obj->ctx, args.varname, UI_VAR_INTEGER);
158 }
159
160 // bind radio button to the value
161 if (var) {
162 UiInteger* value = (UiInteger*)var->value;
163
164 // store a list of radio buttons in the value
165 CxList* radioButtons = (CxList*) (value->obj ? value->obj : cxLinkedListCreate(current->ctx->allocator, NULL, CX_STORE_POINTERS));
166 // get or create the group name
167 static int groupCount = 0;
168 winrt::hstring groupName;
169 if (radioButtons->size == 0) {
170 groupName = winrt::to_hstring(groupCount++);
171 } else {
172 UiWidget* firstButtonWidget = (UiWidget*)cxListAt(radioButtons, 0);
173 RadioButton firstRadioButton = firstButtonWidget->uielement.as<RadioButton>();
174 groupName = firstRadioButton.GroupName();
175 }
176
177 // set the group name for the new radiobutton
178 cxListAdd(radioButtons, widget);
179 button.GroupName(groupName);
180
181 value->obj = radioButtons;
182 value->get = ui_radio_button_get;
183 value->set = ui_radio_button_set;
184 }
185
186 // add button to current container
187 UI_APPLY_LAYOUT1(current, args);
188
189 current->container->Add(button, false);
190
191 return widget;
141 } 192 }
142 193
143 194
144 int64_t ui_toggle_button_get(UiInteger* integer) { 195 int64_t ui_toggle_button_get(UiInteger* integer) {
145 UiWidget* widget = (UiWidget*)integer->obj; 196 UiWidget* widget = (UiWidget*)integer->obj;
153 UiWidget* widget = (UiWidget*)integer->obj; 204 UiWidget* widget = (UiWidget*)integer->obj;
154 ToggleButton toggleButton = widget->uielement.as<ToggleButton>(); 205 ToggleButton toggleButton = widget->uielement.as<ToggleButton>();
155 toggleButton.IsChecked((bool)value); 206 toggleButton.IsChecked((bool)value);
156 integer->value = value; 207 integer->value = value;
157 } 208 }
209
210 extern "C" int64_t ui_radio_button_get(UiInteger * integer) {
211 CxList* list = (CxList*)integer->obj;
212 CxIterator i = cxListIterator(list);
213 int selection = -1;
214 cx_foreach(UiWidget*, widget, i) {
215 ToggleButton button = widget->uielement.as<ToggleButton>();
216 if (button.IsChecked().GetBoolean()) {
217 selection = i.index;
218 break;
219 }
220 }
221 integer->value = selection;
222 return selection;
223 }
224
225 extern "C" void ui_radio_button_set(UiInteger * integer, int64_t value) {
226 CxList* list = (CxList*)integer->obj;
227 UiWidget* widget = (UiWidget*)cxListAt(list, value);
228 if (widget) {
229 ToggleButton button = widget->uielement.as<ToggleButton>();
230 button.IsChecked(true);
231 integer->value = value;
232 }
233 }

mercurial