implement switch (GTK)

Thu, 18 Sep 2025 21:04:49 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Thu, 18 Sep 2025 21:04:49 +0200
changeset 771
155f8722b927
parent 770
521ecd0a0e7b
child 772
fa8afa19b8b6

implement switch (GTK)

application/main.c file | annotate | diff | comparison | revisions
ui/gtk/button.c file | annotate | diff | comparison | revisions
ui/gtk/button.h file | annotate | diff | comparison | revisions
--- a/application/main.c	Wed Sep 17 18:22:47 2025 +0200
+++ b/application/main.c	Thu Sep 18 21:04:49 2025 +0200
@@ -609,6 +609,9 @@
 
                 ui_spinbox(obj, .step = 5);
                 ui_newline(obj);
+                
+                ui_switch(obj, .varname = "switch");
+                ui_newline(obj);
 
                 ui_progressbar(obj, .colspan = 2, .varname = "progress");
                 ui_set(doc->progress, 0.75);
--- a/ui/gtk/button.c	Wed Sep 17 18:22:47 2025 +0200
+++ b/ui/gtk/button.c	Thu Sep 18 21:04:49 2025 +0200
@@ -382,13 +382,98 @@
 }
 #endif
 
+
+#if GTK_MAJOR_VERSION >= 3
+
+static void switch_changed(
+        GObject *gobject,
+        GParamSpec *pspec,
+        UiVarEventData *event)
+{
+    GtkSwitch *sw = GTK_SWITCH (gobject);
+    gboolean active = gtk_switch_get_active (sw);
+    
+    UiEvent e;
+    e.obj = event->obj;
+    e.document = e.obj->ctx->document;
+    e.window = e.obj->window;
+    e.eventdata = NULL;
+    e.eventdatatype = 0;
+    e.set = ui_get_setop();
+    
+    if(event->callback) {
+        event->callback(&e, event->userdata);
+    }
+    if(event->var) {
+        UiInteger *i = event->var->value;
+        ui_notify_evt(i->observers, &e);
+    }
+}
+
 UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs *args) {
-#ifdef UI_GTK3
-    return NULL; // TODO
+    UiObject* current = uic_current_obj(obj);
+    GtkWidget *widget = gtk_switch_new();
+    ui_set_name_and_style(widget, args->name, args->style_class);
+    ui_set_widget_groups(obj->ctx, widget, args->groups);
+    
+    UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_INTEGER);
+    if(var) {
+        UiInteger *value = var->value;
+        value->obj = widget;
+        value->get = ui_switch_get;
+        value->set = ui_switch_set;
+        
+        if(value->value) {
+            gtk_switch_set_active(GTK_SWITCH(widget), TRUE);
+        }
+        
+        
+    }
+    
+    UiVarEventData *event = malloc(sizeof(UiVarEventData));
+    event->obj = obj;
+    event->callback = args->onchange;
+    event->userdata = args->onchangedata;
+    event->var = var;
+    event->observers = NULL;
+    
+    g_signal_connect(
+            widget,
+            "notify::active",
+            G_CALLBACK(switch_changed),
+            event);
+    
+    g_signal_connect(
+            widget,
+            "destroy",
+            G_CALLBACK(ui_destroy_vardata),
+            event);
+    
+    UI_APPLY_LAYOUT2(current, args);
+    current->container->add(current->container, widget);
+    
+    return widget;
+}
+
+int64_t ui_switch_get(UiInteger *value) {
+    GtkSwitch *sw = GTK_SWITCH((GtkWidget*)value->obj);
+    value->value = gtk_switch_get_active(sw);
+    return value->value;
+}
+
+void ui_switch_set(UiInteger *value, int64_t i) {
+    GtkSwitch *sw = GTK_SWITCH((GtkWidget*)value->obj);
+    value->value = i;
+    gtk_switch_set_active(sw, i);
+}
+    
 #else
+
+UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs *args) {
     return ui_checkbox_create(obj, args);
+}
+
 #endif
-}
 
 #if GTK_MAJOR_VERSION >= 4
 #define RADIOBUTTON_NEW(group, label) gtk_check_button_new_with_label(label)
--- a/ui/gtk/button.h	Wed Sep 17 18:22:47 2025 +0200
+++ b/ui/gtk/button.h	Thu Sep 18 21:04:49 2025 +0200
@@ -96,6 +96,9 @@
 
 void ui_radio_obs(GtkToggleButton *widget, UiVarEventData *event);
 
+int64_t ui_switch_get(UiInteger *value);
+void ui_switch_set(UiInteger *value, int64_t i);
+
 int64_t ui_radiobutton_get(UiInteger *value);
 void ui_radiobutton_set(UiInteger *value, int64_t i);
 

mercurial