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 } |