ui/gtk/button.c

changeset 110
c00e968d018b
parent 109
c3dfcb8f0be7
child 112
c3f2f16fa4b8
--- a/ui/gtk/button.c	Sun Aug 24 15:24:16 2025 +0200
+++ b/ui/gtk/button.c	Sat Oct 04 14:52:59 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)
@@ -760,6 +845,12 @@
                 data);
     }
     gtk_button_set_label(GTK_BUTTON(button), args->label);
+#if GTK_CHECK_VERSION(4, 0, 0)
+    gtk_button_set_can_shrink(GTK_BUTTON(button), TRUE);
+#elif GTK_MAJOR_VERSION == 3
+    GtkWidget *child = gtk_bin_get_child(GTK_BIN(button));
+    gtk_label_set_ellipsize(GTK_LABEL(child), PANGO_ELLIPSIZE_END);
+#endif
     g_object_set_data(G_OBJECT(button), "ui_linkbutton", data);
     g_signal_connect(
             button,
@@ -806,6 +897,11 @@
     if(s->value.free) {
         s->value.free(s->value.ptr);
     }
+#if GTK_MAJOR_VERSION == 3
+    UiLinkButton *data = s->obj;
+    GtkWidget *child = gtk_bin_get_child(GTK_BIN(data->widget));
+    gtk_label_set_ellipsize(GTK_LABEL(child), PANGO_ELLIPSIZE_END);
+#endif
 }
 
 

mercurial