ui/gtk/button.c

changeset 112
c3f2f16fa4b8
parent 110
c00e968d018b
--- a/ui/gtk/button.c	Sat Oct 04 14:54:25 2025 +0200
+++ b/ui/gtk/button.c	Sun Oct 19 21:20:08 2025 +0200
@@ -60,6 +60,7 @@
         UiObject *obj,
         const char *label,
         const char *icon,
+        const char *tooltip,
         ui_callback onclick,
         void *userdata,
         int event_value,
@@ -67,6 +68,9 @@
 {
     GtkWidget *button = gtk_button_new_with_label(label);
     ui_button_set_icon_name(button, icon);
+    if(tooltip) {
+        gtk_widget_set_tooltip_text(button, tooltip);
+    }
     
     if(onclick) {
         UiEventData *event = malloc(sizeof(UiEventData));
@@ -100,12 +104,12 @@
 }
 
 UIWIDGET ui_button_create(UiObject *obj, UiButtonArgs *args) {
-    UiObject* current = uic_current_obj(obj);
-    GtkWidget *button = ui_create_button(obj, args->label, args->icon, args->onclick, args->onclickdata, 0, FALSE);
+    GtkWidget *button = ui_create_button(obj, args->label, args->icon, args->tooltip, args->onclick, args->onclickdata, 0, FALSE);
     ui_set_name_and_style(button, args->name, args->style_class);
     ui_set_widget_groups(obj->ctx, button, args->groups);
-    UI_APPLY_LAYOUT2(current, args);
-    current->container->add(current->container, button);
+    UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end;
+    UiLayout layout = UI_ARGS2LAYOUT(args);
+    ct->add(ct, button, &layout);
     return button;
 }
 
@@ -181,6 +185,7 @@
         GtkWidget *togglebutton,
         const char *label,
         const char *icon,
+        const char *tooltip,
         const char *varname,
         UiInteger *value,
         ui_callback onchange,
@@ -191,6 +196,9 @@
         gtk_button_set_label(GTK_BUTTON(togglebutton), label);
     }
     ui_button_set_icon_name(togglebutton, icon);
+    if(tooltip) {
+        gtk_widget_set_tooltip_text(togglebutton, tooltip);
+    }
     
     ui_bind_togglebutton(
             obj,
@@ -220,8 +228,7 @@
         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);
+    UiVar* var = uic_widget_var(obj->ctx, obj->ctx, value, varname, UI_VAR_INTEGER);
     if (var) {
         UiInteger* value = (UiInteger*)var->value;
         value->obj = widget;
@@ -291,13 +298,12 @@
 }
 
 static UIWIDGET togglebutton_create(UiObject *obj, GtkWidget *widget, UiToggleArgs *args) {
-    UiObject* current = uic_current_obj(obj);
-    
     ui_setup_togglebutton(
             obj,
             widget,
             args->label,
             args->icon,
+            args->tooltip,
             args->varname,
             args->value,
             args->onchange,
@@ -306,8 +312,9 @@
     ui_set_name_and_style(widget, args->name, args->style_class);
     ui_set_widget_groups(obj->ctx, widget, args->groups);
     
-    UI_APPLY_LAYOUT2(current, args);
-    current->container->add(current->container, widget);
+    UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end;
+    UiLayout layout = UI_ARGS2LAYOUT(args);
+    ct->add(ct, widget, &layout);
     
     return widget;
 }
@@ -350,9 +357,7 @@
     }
 }
 
-UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs *args) {
-    UiObject* current = uic_current_obj(obj);
-    
+UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs *args) { 
     GtkWidget *widget = gtk_check_button_new_with_label(args->label); 
     ui_bind_togglebutton(
             obj,
@@ -370,8 +375,9 @@
     ui_set_name_and_style(widget, args->name, args->style_class);
     ui_set_widget_groups(obj->ctx, widget, args->groups);
     
-    UI_APPLY_LAYOUT2(current, args);
-    current->container->add(current->container, widget);
+    UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end;
+    UiLayout layout = UI_ARGS2LAYOUT(args);
+    ct->add(ct, widget, &layout);
     
     return widget;
 }
@@ -411,12 +417,11 @@
 }
 
 UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs *args) {
-    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);
+    UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER);
     if(var) {
         UiInteger *value = var->value;
         value->obj = widget;
@@ -449,8 +454,9 @@
             G_CALLBACK(ui_destroy_vardata),
             event);
     
-    UI_APPLY_LAYOUT2(current, args);
-    current->container->add(current->container, widget);
+    UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end;
+    UiLayout layout = UI_ARGS2LAYOUT(args);
+    ct->add(ct, widget, &layout);
     
     return widget;
 }
@@ -519,12 +525,10 @@
 }
 
 UIWIDGET ui_radiobutton_create(UiObject *obj, UiToggleArgs *args) {
-    UiObject* current = uic_current_obj(obj);
-    
     GSList *rg = NULL;
     UiInteger *rgroup;
     
-    UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_INTEGER);
+    UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER);
     
     UiBool first = FALSE;
     if(var) {
@@ -600,8 +604,9 @@
                 event);
     }
     
-    UI_APPLY_LAYOUT2(current, args);
-    current->container->add(current->container, rbutton);
+    UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end;
+    UiLayout layout = UI_ARGS2LAYOUT(args);
+    ct->add(ct, rbutton, &layout);
     
     return rbutton;
 }
@@ -800,7 +805,7 @@
     return create_linkbutton_jsonvalue(label, uri, TRUE, visited, TRUE);
 }
 
-static void linkbutton_clicked(GtkWidget *widget, UiLinkButton *data) {
+static void linkbutton_callback(GtkWidget *widget, UiLinkButton *data) {
     if(data->onclick) {
         UiEvent e;
         e.obj = data->obj;
@@ -814,8 +819,24 @@
     }
 }
 
+static void linkbutton_clicked(GtkWidget *widget, UiLinkButton *data) {
+    linkbutton_callback(widget, data);
+    if(data->link) {   
+#if GTK_CHECK_VERSION(4, 0, 0)
+        GtkUriLauncher *launcher = gtk_uri_launcher_new (data->link);
+        gtk_uri_launcher_launch (launcher, NULL, NULL, NULL, NULL);
+        g_object_unref (launcher);
+#elif GTK_CHECK_VERSION(3, 22, 0)
+        GError *error = NULL;
+        gtk_show_uri_on_window(NULL, data->link, GDK_CURRENT_TIME, &error);
+#elif
+        // TODO: call xdg-open
+#endif
+    }
+}
+
 static gboolean linkbutton_activate_link(GtkLinkButton *self, UiLinkButton *data) {
-    linkbutton_clicked(data->widget, data);
+    linkbutton_callback(data->widget, data);
     return data->nofollow;
 }
 
@@ -860,8 +881,7 @@
     
     data->widget = button;
     
-    UiObject* current = uic_current_obj(obj);
-    UiVar *var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_STRING);
+    UiVar *var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_STRING);
     if(var) {
         UiString *str = var->value;
         char *current_value = ui_get(str);
@@ -876,8 +896,9 @@
     
     ui_set_name_and_style(button, args->name, args->style_class);
     ui_set_widget_groups(obj->ctx, button, args->groups);
-    UI_APPLY_LAYOUT2(current, args);
-    current->container->add(current->container, button);
+    UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end;
+    UiLayout layout = UI_ARGS2LAYOUT(args);
+    ct->add(ct, button, &layout);
     
     return button;
 }

mercurial