implement tooltips for toolbar items (GTK)

Thu, 09 Oct 2025 18:23:07 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Thu, 09 Oct 2025 18:23:07 +0200
changeset 823
1e1df80772ed
parent 822
54e43e4efac2
child 824
a0ea8f3aa6e8

implement tooltips for toolbar items (GTK)

ui/common/toolbar.c file | annotate | diff | comparison | revisions
ui/gtk/button.c file | annotate | diff | comparison | revisions
ui/gtk/button.h file | annotate | diff | comparison | revisions
ui/gtk/headerbar.c file | annotate | diff | comparison | revisions
ui/gtk/toolbar.c file | annotate | diff | comparison | revisions
ui/gtk/window.c file | annotate | diff | comparison | revisions
ui/ui/toolbar.h file | annotate | diff | comparison | revisions
--- a/ui/common/toolbar.c	Thu Oct 09 12:49:53 2025 +0200
+++ b/ui/common/toolbar.c	Thu Oct 09 18:23:07 2025 +0200
@@ -55,6 +55,7 @@
     newargs.label = nl_strdup(args->label);
     newargs.stockid = nl_strdup(args->stockid);
     newargs.icon = nl_strdup(args->icon);
+    newargs.tooltip = nl_strdup(args->tooltip);
     newargs.onclick = args->onclick;
     newargs.onclickdata = args->onclickdata;
     newargs.groups = uic_copy_groups(args->groups, ngroups);
@@ -74,6 +75,7 @@
     newargs.label = nl_strdup(args->label);
     newargs.stockid = nl_strdup(args->stockid);
     newargs.icon = nl_strdup(args->icon);
+    newargs.tooltip = nl_strdup(args->tooltip);
     newargs.varname = nl_strdup(args->varname);
     newargs.onchange = args->onchange;
     newargs.onchangedata = args->onchangedata;
@@ -93,6 +95,7 @@
     newargs.label = nl_strdup(args->label);
     newargs.stockid = nl_strdup(args->stockid);
     newargs.icon = nl_strdup(args->icon);
+    newargs.tooltip = nl_strdup(args->tooltip);
     return newargs;
 }
 
--- a/ui/gtk/button.c	Thu Oct 09 12:49:53 2025 +0200
+++ b/ui/gtk/button.c	Thu Oct 09 18:23:07 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,7 +104,7 @@
 }
 
 UIWIDGET ui_button_create(UiObject *obj, UiButtonArgs *args) {
-    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, NULL/*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);
     UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end;
@@ -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,
@@ -295,6 +303,7 @@
             widget,
             args->label,
             args->icon,
+            NULL, // tooltip
             args->varname,
             args->value,
             args->onchange,
--- a/ui/gtk/button.h	Thu Oct 09 12:49:53 2025 +0200
+++ b/ui/gtk/button.h	Thu Oct 09 18:23:07 2025 +0200
@@ -55,6 +55,7 @@
         UiObject *obj,
         const char *label,
         const char *icon,
+        const char *tooltip,
         ui_callback onclick,
         void *userdata,
         int event_value,
@@ -65,6 +66,7 @@
         GtkWidget *togglebutton,
         const char *label,
         const char *icon,
+        const char *tooltip,
         const char *varname,
         UiInteger *value,
         ui_callback onchange,
--- a/ui/gtk/headerbar.c	Thu Oct 09 12:49:53 2025 +0200
+++ b/ui/gtk/headerbar.c	Thu Oct 09 18:23:07 2025 +0200
@@ -163,7 +163,7 @@
         UiObject *obj,
         enum UiToolbarPos pos)
 {
-    GtkWidget *button = ui_create_button(obj, item->args.label, item->args.icon, item->args.onclick, item->args.onclickdata, 0, FALSE);
+    GtkWidget *button = ui_create_button(obj, item->args.label, item->args.icon, item->args.tooltip, item->args.onclick, item->args.onclickdata, 0, FALSE);
     ui_set_widget_groups(obj->ctx, button, item->args.groups);
     WIDGET_ADD_CSS_CLASS(button, "flat");
     headerbar_add(headerbar, box, button, pos);
@@ -179,7 +179,7 @@
     GtkWidget *button = gtk_toggle_button_new();
     ui_set_widget_groups(obj->ctx, button, item->args.groups);
     WIDGET_ADD_CSS_CLASS(button, "flat");
-    ui_setup_togglebutton(obj, button, item->args.label, item->args.icon, item->args.varname, NULL, item->args.onchange, item->args.onchangedata, 0);
+    ui_setup_togglebutton(obj, button, item->args.label, item->args.icon, NULL/*tooltip*/, item->args.varname, NULL, item->args.onchange, item->args.onchangedata, 0);
     headerbar_add(headerbar, box, button, pos);
 }
 
--- a/ui/gtk/toolbar.c	Thu Oct 09 12:49:53 2025 +0200
+++ b/ui/gtk/toolbar.c	Thu Oct 09 18:23:07 2025 +0200
@@ -138,6 +138,9 @@
     } else {
         button = gtk_tool_button_new(NULL, item->args.label);
     }
+    if(item->args.tooltip) {
+        gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(button), item->args.tooltip);
+    }
     
     gtk_tool_item_set_homogeneous(button, FALSE);
     if(item->args.icon) {
@@ -192,6 +195,9 @@
             set_toolbutton_icon(button, item->args.icon);
         }    
     }
+    if(item->args.tooltip) {
+        gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(button), item->args.tooltip);
+    }
     ui_set_widget_ngroups(obj->ctx, GTK_WIDGET(button), item->args.groups, item->ngroups);
     
     UiVar* var = uic_widget_var(obj->ctx, obj->ctx, NULL, item->args.varname, UI_VAR_INTEGER);
@@ -297,6 +303,9 @@
     if(item->args.icon) {
         set_toolbutton_icon(button, item->args.icon);
     }
+    if(item->args.tooltip) {
+        gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(button), item->args.tooltip);
+    }
     gtk_tool_item_set_is_important(button, TRUE);
     
     gtk_toolbar_insert(tb, button, -1);
--- a/ui/gtk/window.c	Thu Oct 09 12:49:53 2025 +0200
+++ b/ui/gtk/window.c	Thu Oct 09 18:23:07 2025 +0200
@@ -945,7 +945,7 @@
             }
             
             if(args->lbutton1) {
-                GtkWidget *button = ui_create_button(obj, args->lbutton1, NULL, args->onclick, args->onclickdata, 1, args->default_button == 1);
+                GtkWidget *button = ui_create_button(obj, args->lbutton1, NULL, NULL/*tooltip*/, args->onclick, args->onclickdata, 1, args->default_button == 1);
                 gtk_header_bar_pack_start(GTK_HEADER_BAR(headerbar), button);
                 if(args->default_button == 1) {
                     WIDGET_ADD_CSS_CLASS(button, "suggested-action");
@@ -953,7 +953,7 @@
                 }
             }
             if(args->lbutton2) {
-                GtkWidget *button = ui_create_button(obj, args->lbutton2, NULL, args->onclick, args->onclickdata, 2, args->default_button == 2);
+                GtkWidget *button = ui_create_button(obj, args->lbutton2, NULL, NULL/*tooltip*/, args->onclick, args->onclickdata, 2, args->default_button == 2);
                 gtk_header_bar_pack_start(GTK_HEADER_BAR(headerbar), button);
                 if(args->default_button == 2) {
                     WIDGET_ADD_CSS_CLASS(button, "suggested-action");
@@ -962,7 +962,7 @@
             }
             
             if(args->rbutton4) {
-                GtkWidget *button = ui_create_button(obj, args->rbutton4, NULL, args->onclick, args->onclickdata, 4, args->default_button == 4);
+                GtkWidget *button = ui_create_button(obj, args->rbutton4, NULL, NULL/*tooltip*/, args->onclick, args->onclickdata, 4, args->default_button == 4);
                 gtk_header_bar_pack_end(GTK_HEADER_BAR(headerbar), button);
                 if(args->default_button == 4) {
                     WIDGET_ADD_CSS_CLASS(button, "suggested-action");
@@ -970,7 +970,7 @@
                 }
             }
             if(args->rbutton3) {
-                GtkWidget *button = ui_create_button(obj, args->rbutton3, NULL, args->onclick, args->onclickdata, 3, args->default_button == 3);
+                GtkWidget *button = ui_create_button(obj, args->rbutton3, NULL, NULL/*tooltip*/, args->onclick, args->onclickdata, 3, args->default_button == 3);
                 gtk_header_bar_pack_end(GTK_HEADER_BAR(headerbar), button);
                 if(args->default_button == 3) {
                     WIDGET_ADD_CSS_CLASS(button, "suggested-action");
@@ -991,7 +991,7 @@
         gtk_grid_set_column_homogeneous(GTK_GRID(grid), TRUE); 
         
         if(args->lbutton1) {
-            GtkWidget *button = ui_create_button(obj, args->lbutton1, NULL, args->onclick, args->onclickdata, 1, args->default_button == 1);
+            GtkWidget *button = ui_create_button(obj, args->lbutton1, NULL, NULL/*tooltip*/, args->onclick, args->onclickdata, 1, args->default_button == 1);
             gtk_grid_attach(GTK_GRID(grid), button, 0, 0, 1, 1);
             if(args->default_button == 1) {
                 WIDGET_ADD_CSS_CLASS(button, "suggested-action");
@@ -999,7 +999,7 @@
             }
         }
         if(args->lbutton2) {
-            GtkWidget *button = ui_create_button(obj, args->lbutton2, NULL, args->onclick, args->onclickdata, 2, args->default_button == 2);
+            GtkWidget *button = ui_create_button(obj, args->lbutton2, NULL, NULL/*tooltip*/, args->onclick, args->onclickdata, 2, args->default_button == 2);
             gtk_grid_attach(GTK_GRID(grid), button, 1, 0, 1, 1);
             if(args->default_button == 2) {
                 WIDGET_ADD_CSS_CLASS(button, "suggested-action");
@@ -1010,7 +1010,7 @@
         gtk_widget_set_hexpand(space, TRUE);
         gtk_grid_attach(GTK_GRID(grid), space, 2, 0, 1, 1);
         if(args->rbutton3) {
-            GtkWidget *button = ui_create_button(obj, args->rbutton3, NULL, args->onclick, args->onclickdata, 3, args->default_button == 3);
+            GtkWidget *button = ui_create_button(obj, args->rbutton3, NULL, NULL/*tooltip*/, args->onclick, args->onclickdata, 3, args->default_button == 3);
             gtk_grid_attach(GTK_GRID(grid), button, 3, 0, 1, 1);
             if(args->default_button == 3) {
                 WIDGET_ADD_CSS_CLASS(button, "suggested-action");
@@ -1018,7 +1018,7 @@
             }
         }
         if(args->rbutton4) {
-            GtkWidget *button = ui_create_button(obj, args->rbutton4, NULL, args->onclick, args->onclickdata, 4, args->default_button == 4);
+            GtkWidget *button = ui_create_button(obj, args->rbutton4, NULL, NULL/*tooltip*/, args->onclick, args->onclickdata, 4, args->default_button == 4);
             gtk_grid_attach(GTK_GRID(grid), button, 4, 0, 1, 1);
             if(args->default_button == 4) {
                 WIDGET_ADD_CSS_CLASS(button, "suggested-action");
--- a/ui/ui/toolbar.h	Thu Oct 09 12:49:53 2025 +0200
+++ b/ui/ui/toolbar.h	Thu Oct 09 18:23:07 2025 +0200
@@ -37,9 +37,10 @@
 #endif
 
 typedef struct UiToolbarItemArgs {
-    const char* label;
-    const char* stockid;
-    const char* icon;
+    const char *label;
+    const char *stockid;
+    const char *icon;
+    const char *tooltip;
 
     ui_callback onclick;
     void* onclickdata;
@@ -48,21 +49,23 @@
 } UiToolbarItemArgs;
 
 typedef struct UiToolbarToggleItemArgs {
-    const char* label;
-    const char* stockid;
-    const char* icon;
+    const char *label;
+    const char *stockid;
+    const char *icon;
+    const char *tooltip;
 
-    const char* varname;
+    const char *varname;
     ui_callback onchange;
-    void* onchangedata;
+    void *onchangedata;
 
     const int *groups;
 } UiToolbarToggleItemArgs;
 
 typedef struct UiToolbarMenuArgs {
-    const char* label;
-    const char* stockid;
-    const char* icon;
+    const char *label;
+    const char *stockid;
+    const char *icon;
+    const char *tooltip;
 } UiToolbarMenuArgs;
 
 enum UiToolbarPos {

mercurial