ui/winui/button.cpp

branch
newapi
changeset 187
24ce2c326d85
parent 186
5db4979bf482
child 188
fbbae6738252
--- a/ui/winui/button.cpp	Sun Oct 01 09:23:47 2023 +0200
+++ b/ui/winui/button.cpp	Sun Oct 01 12:08:09 2023 +0200
@@ -40,17 +40,26 @@
 using namespace Microsoft::UI::Xaml::Controls;
 using namespace Windows::UI::Xaml::Interop;
 using namespace winrt::Windows::Foundation;
+using namespace winrt::Microsoft::UI::Xaml::Controls::Primitives;
+
+
+
+static void set_button_label(ButtonBase button, const char* label, const char* stockid) {
+	if (label) {
+		wchar_t* wlabel = str2wstr(label, nullptr);
+		button.Content(box_value(wlabel));
+		free(wlabel);
+	}
+	// TODO: stockid
+}
+
 
 UIWIDGET ui_button_create(UiObject* obj, UiButtonArgs args) {
 	UiObject* current = uic_current_obj(obj);
 
 	// create button with label
 	Button button = Button();
-	if (args.label) {
-		wchar_t* wlabel = str2wstr(args.label, nullptr);
-		button.Content(box_value(wlabel));
-		free(wlabel);
-	}
+	set_button_label(button, args.label, args.stockid);
 
 	// create toolkit wrapper object and register destructor
 	UIElement elm = button;
@@ -77,15 +86,72 @@
 
 	// add button to current container
 	UI_APPLY_LAYOUT1(current, args);
+
 	current->container->Add(button, false);
 
 	return widget;
 }
 
+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);
+
+	// create toolkit wrapper object and register destructor
+	UIElement elm = button;
+	UiWidget* widget = new UiWidget(elm);
+	ui_context_add_widget_destructor(current->ctx, widget);
+
+	// bind variable
+	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);
+	}
+	if (var) {
+		UiInteger* value = (UiInteger*)var->value;
+		value->obj = widget;
+		value->get = ui_toggle_button_get;
+		value->set = ui_toggle_button_set;
+	}
+
+	// add button to current container
+	UI_APPLY_LAYOUT1(current, args);
+
+	current->container->Add(button, false);
+
+	return widget;
+}
+
+UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs args) {
+	ToggleButton button = ToggleButton();
+	return create_togglebutton(obj, button, args);
+}
+
 UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs args) {
-	return nullptr;
+	CheckBox button = CheckBox();
+	return create_togglebutton(obj, button, args);
 }
 
 UIWIDGET ui_radiobutton_create(UiObject* obj, UiToggleArgs) {
 	return nullptr;
 }
+
+
+int64_t ui_toggle_button_get(UiInteger* integer) {
+	UiWidget* widget = (UiWidget*)integer->obj;
+	ToggleButton toggleButton = widget->uielement.as<ToggleButton>();
+	int val = toggleButton.IsChecked().GetBoolean();
+	integer->value = val;
+	return val;
+}
+
+void ui_toggle_button_set(UiInteger* integer, int64_t value) {
+	UiWidget* widget = (UiWidget*)integer->obj;
+	ToggleButton toggleButton = widget->uielement.as<ToggleButton>();
+	toggleButton.IsChecked((bool)value);
+	integer->value = value;
+}

mercurial