ui/gtk/button.c

branch
newapi
changeset 359
c51e58359db8
parent 350
70305d427f25
--- a/ui/gtk/button.c	Sun Oct 27 10:33:24 2024 +0100
+++ b/ui/gtk/button.c	Sun Oct 27 11:34:25 2024 +0100
@@ -151,6 +151,14 @@
     event->callback(&e, event->userdata);    
 }
 
+static void ui_togglebutton_enable_state_callback(GtkToggleButton *widget, UiEventData *event) {
+    if(gtk_toggle_button_get_active(widget)) {
+        ui_set_group(event->obj->ctx, event->value);
+    } else {
+        ui_unset_group(event->obj->ctx, event->value);
+    }
+}
+
 void ui_setup_togglebutton(
         UiObject *obj,
         GtkWidget *togglebutton,
@@ -159,7 +167,8 @@
         const char *varname,
         UiInteger *value,
         ui_callback onchange,
-        void *onchangedata)
+        void *onchangedata,
+        int enable_state)
 {
     if(label) {
         gtk_button_set_label(GTK_BUTTON(togglebutton), label);
@@ -175,7 +184,10 @@
             value,
             (ui_toggled_func)ui_toggled_callback,
             onchange,
-            onchangedata);
+            onchangedata,
+            (ui_toggled_func)ui_togglebutton_enable_state_callback,
+            enable_state
+            );
 }
 
 void ui_bind_togglebutton(
@@ -187,7 +199,9 @@
         UiInteger *value,
         void (*toggled_callback)(void*, void*),
         ui_callback onchange,
-        void *onchangedata)
+        void *onchangedata,
+        void (*enable_state_func)(void*, void*),
+        int enable_state)
 {
     UiObject* current = uic_current_obj(obj);
     UiVar* var = uic_widget_var(obj->ctx, current->ctx, value, varname, UI_VAR_INTEGER);
@@ -235,12 +249,41 @@
                 G_CALLBACK(ui_destroy_userdata),
                 event);
     }
+    
+    if(enable_state > 0) {
+        UiEventData *event = malloc(sizeof(UiEventData));
+        event->obj = obj;
+        event->userdata = NULL;
+        event->callback = NULL;
+        event->value = enable_state;
+        event->customdata = NULL;
+        
+        g_signal_connect(
+                widget,
+                "toggled",
+                G_CALLBACK(enable_state_func),
+                event);
+        g_signal_connect(
+                widget,
+                "destroy",
+                G_CALLBACK(ui_destroy_userdata),
+                event);
+    }
 }
 
 static UIWIDGET togglebutton_create(UiObject *obj, GtkWidget *widget, UiToggleArgs args) {
     UiObject* current = uic_current_obj(obj);
     
-    ui_setup_togglebutton(current, widget, args.label, args.icon, args.varname, args.value, args.onchange, args.onchangedata);
+    ui_setup_togglebutton(
+            current,
+            widget,
+            args.label,
+            args.icon,
+            args.varname,
+            args.value,
+            args.onchange,
+            args.onchangedata,
+            args.enable_group);
     ui_set_name_and_style(widget, args.name, args.style_class);
     ui_set_widget_groups(obj->ctx, widget, args.groups);
     
@@ -278,6 +321,14 @@
     event->callback(&e, event->userdata);    
 }
 
+static void ui_checkbox_enable_state(GtkCheckButton *widget, UiEventData *event) {
+    if(gtk_check_button_get_active(widget)) {
+        ui_set_group(event->obj->ctx, event->value);
+    } else {
+        ui_unset_group(event->obj->ctx, event->value);
+    }
+}
+
 UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs args) {
     UiObject* current = uic_current_obj(obj);
     
@@ -291,7 +342,9 @@
             args.value,
             (ui_toggled_func)ui_checkbox_callback,
             args.onchange,
-            args.onchangedata);
+            args.onchangedata,
+            (ui_toggled_func)ui_checkbox_enable_state,
+            args.enable_group);
     
     ui_set_name_and_style(widget, args.name, args.style_class);
     ui_set_widget_groups(obj->ctx, widget, args.groups);

mercurial