ui/winui/button.cpp

branch
newapi
changeset 188
fbbae6738252
parent 187
24ce2c326d85
child 189
4daddc326877
--- a/ui/winui/button.cpp	Sun Oct 01 12:08:09 2023 +0200
+++ b/ui/winui/button.cpp	Sun Oct 01 14:40:43 2023 +0200
@@ -136,8 +136,59 @@
 	return create_togglebutton(obj, button, args);
 }
 
-UIWIDGET ui_radiobutton_create(UiObject* obj, UiToggleArgs) {
-	return nullptr;
+UIWIDGET ui_radiobutton_create(UiObject* obj, UiToggleArgs args) {
+	RadioButton button = RadioButton();
+
+	UiObject* current = uic_current_obj(obj);
+
+	// set label
+	set_button_label(button, args.label, args.stockid);
+
+	// create toolkit wrapper object and register destructor
+	UIElement elm = button;
+	UiWidget* widget = new UiWidget(elm);
+	ui_context_add_widget_destructor(current->ctx, widget);
+
+	UiVar* var = nullptr;
+	if (args.value) {
+		var = uic_create_value_var(current->ctx, args.value);
+	}
+	else if (args.varname) {
+		var = uic_create_var(obj->ctx, args.varname, UI_VAR_INTEGER);
+	}
+
+	// bind radio button to the value
+	if (var) {
+		UiInteger* value = (UiInteger*)var->value;
+
+		// store a list of radio buttons in the value
+		CxList* radioButtons = (CxList*) (value->obj ? value->obj : cxLinkedListCreate(current->ctx->allocator, NULL, CX_STORE_POINTERS));
+		// get or create the group name
+		static int groupCount = 0;
+		winrt::hstring groupName;
+		if (radioButtons->size == 0) {
+			groupName = winrt::to_hstring(groupCount++);
+		} else {
+			UiWidget* firstButtonWidget = (UiWidget*)cxListAt(radioButtons, 0);
+			RadioButton firstRadioButton = firstButtonWidget->uielement.as<RadioButton>();
+			groupName = firstRadioButton.GroupName();
+		}
+
+		// set the group name for the new radiobutton
+		cxListAdd(radioButtons, widget);
+		button.GroupName(groupName);
+
+		value->obj = radioButtons;
+		value->get = ui_radio_button_get;
+		value->set = ui_radio_button_set;
+	}
+
+	// add button to current container
+	UI_APPLY_LAYOUT1(current, args);
+
+	current->container->Add(button, false);
+
+	return widget;
 }
 
 
@@ -155,3 +206,28 @@
 	toggleButton.IsChecked((bool)value);
 	integer->value = value;
 }
+
+extern "C" int64_t ui_radio_button_get(UiInteger * integer) {
+	CxList* list = (CxList*)integer->obj;
+	CxIterator i = cxListIterator(list);
+	int selection = -1;
+	cx_foreach(UiWidget*, widget, i) {
+		ToggleButton button = widget->uielement.as<ToggleButton>();
+		if (button.IsChecked().GetBoolean()) {
+			selection = i.index;
+			break;
+		}
+	}
+	integer->value = selection;
+	return selection;
+}
+
+extern "C" void ui_radio_button_set(UiInteger * integer, int64_t value) {
+	CxList* list = (CxList*)integer->obj;
+	UiWidget* widget = (UiWidget*)cxListAt(list, value);
+	if (widget) {
+		ToggleButton button = widget->uielement.as<ToggleButton>();
+		button.IsChecked(true);
+		integer->value = value;
+	}
+}

mercurial