add visibility states to toolbar items (GTK)

Mon, 20 Oct 2025 21:16:53 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Mon, 20 Oct 2025 21:16:53 +0200
changeset 867
83bb0dd7123f
parent 866
4bed9458d355
child 868
be3df094f8db

add visibility states to toolbar items (GTK)

ui/common/toolbar.c file | annotate | diff | comparison | revisions
ui/common/toolbar.h file | annotate | diff | comparison | revisions
ui/gtk/headerbar.c file | annotate | diff | comparison | revisions
ui/gtk/toolkit.c file | annotate | diff | comparison | revisions
ui/gtk/toolkit.h 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	Sun Oct 19 21:17:21 2025 +0200
+++ b/ui/common/toolbar.c	Mon Oct 20 21:16:53 2025 +0200
@@ -50,7 +50,7 @@
     return str ? strdup(str) : NULL;
 }
 
-static UiToolbarItemArgs itemargs_copy(UiToolbarItemArgs *args, size_t *ngroups) {
+static UiToolbarItemArgs itemargs_copy(UiToolbarItemArgs *args, size_t *ngroups, size_t *nvstates) {
     UiToolbarItemArgs newargs;
     newargs.label = nl_strdup(args->label);
     newargs.icon = nl_strdup(args->icon);
@@ -58,18 +58,19 @@
     newargs.onclick = args->onclick;
     newargs.onclickdata = args->onclickdata;
     newargs.groups = uic_copy_groups(args->groups, ngroups);
+    newargs.visibility_states = uic_copy_groups(args->visibility_states, nvstates);
     return newargs;
 }
 
 void ui_toolbar_item_create(const char* name, UiToolbarItemArgs *args) {
     UiToolbarItem* item = malloc(sizeof(UiToolbarItem));
     item->item.type = UI_TOOLBAR_ITEM;
-    item->args = itemargs_copy(args, &item->ngroups);
+    item->args = itemargs_copy(args, &item->ngroups, &item->nvstates);
     cxMapPut(toolbar_items, name, item);
 }
 
 
-static UiToolbarToggleItemArgs toggleitemargs_copy(UiToolbarToggleItemArgs *args, size_t *ngroups) {
+static UiToolbarToggleItemArgs toggleitemargs_copy(UiToolbarToggleItemArgs *args, size_t *ngroups, size_t *nvstates) {
     UiToolbarToggleItemArgs newargs;
     newargs.label = nl_strdup(args->label);
     newargs.icon = nl_strdup(args->icon);
@@ -78,21 +79,23 @@
     newargs.onchange = args->onchange;
     newargs.onchangedata = args->onchangedata;
     newargs.groups = uic_copy_groups(args->groups, ngroups);
+    newargs.visibility_states = uic_copy_groups(args->visibility_states, nvstates);
     return newargs;
 }
 
 void ui_toolbar_toggleitem_create(const char* name, UiToolbarToggleItemArgs *args) {
     UiToolbarToggleItem* item = malloc(sizeof(UiToolbarToggleItem));
     item->item.type = UI_TOOLBAR_TOGGLEITEM;
-    item->args = toggleitemargs_copy(args, &item->ngroups);
+    item->args = toggleitemargs_copy(args, &item->ngroups, &item->nvstates);
     cxMapPut(toolbar_items, name, item);
 }
 
-static UiToolbarMenuArgs menuargs_copy(UiToolbarMenuArgs *args) {
+static UiToolbarMenuArgs menuargs_copy(UiToolbarMenuArgs *args, size_t *nvstates) {
     UiToolbarMenuArgs newargs;
     newargs.label = nl_strdup(args->label);
     newargs.icon = nl_strdup(args->icon);
     newargs.tooltip = nl_strdup(args->tooltip);
+    newargs.visibility_states = uic_copy_groups(args->visibility_states, nvstates);
     return newargs;
 }
 
@@ -100,7 +103,7 @@
     UiToolbarMenuItem* item = malloc(sizeof(UiToolbarMenuItem));
     item->item.type = UI_TOOLBAR_MENU;
     memset(&item->menu, 0, sizeof(UiMenu));
-    item->args = menuargs_copy(args);
+    item->args = menuargs_copy(args, &item->nvstates);
 
     item->end = 0;
 
--- a/ui/common/toolbar.h	Sun Oct 19 21:17:21 2025 +0200
+++ b/ui/common/toolbar.h	Mon Oct 20 21:16:53 2025 +0200
@@ -63,18 +63,21 @@
     UiToolbarItemI item;
     UiToolbarItemArgs args;
     size_t ngroups;
+    size_t nvstates;
 };
 
 struct UiToolbarToggleItem {
     UiToolbarItemI item;
     UiToolbarToggleItemArgs args;
     size_t ngroups;
+    size_t nvstates;
 };
 
 struct UiToolbarMenuItem {
     UiToolbarItemI item;
     UiMenu menu;
     UiToolbarMenuArgs args;
+    size_t nvstates;
     int end;
 };
 
--- a/ui/gtk/headerbar.c	Sun Oct 19 21:17:21 2025 +0200
+++ b/ui/gtk/headerbar.c	Mon Oct 20 21:16:53 2025 +0200
@@ -165,6 +165,7 @@
 {
     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);
+    ui_set_widget_visibility_states(obj->ctx, button, item->args.visibility_states);
     WIDGET_ADD_CSS_CLASS(button, "flat");
     headerbar_add(headerbar, box, button, pos);
 }
@@ -178,6 +179,7 @@
 {
     GtkWidget *button = gtk_toggle_button_new();
     ui_set_widget_groups(obj->ctx, button, item->args.groups);
+    ui_set_widget_visibility_states(obj->ctx, button, item->args.visibility_states);
     WIDGET_ADD_CSS_CLASS(button, "flat");
     ui_setup_togglebutton(obj, button, item->args.label, item->args.icon, item->args.tooltip, item->args.varname, NULL, item->args.onchange, item->args.onchangedata, 0);
     headerbar_add(headerbar, box, button, pos);
@@ -194,6 +196,7 @@
     
 #if GTK_MAJOR_VERSION >= 4
     GtkWidget *menubutton = gtk_menu_button_new();
+    ui_set_widget_visibility_states(obj->ctx, menubutton, item->args.visibility_states);
     if(item->args.label) {
         gtk_menu_button_set_label(GTK_MENU_BUTTON(menubutton), item->args.label);
     }
--- a/ui/gtk/toolkit.c	Sun Oct 19 21:17:21 2025 +0200
+++ b/ui/gtk/toolkit.c	Mon Oct 20 21:16:53 2025 +0200
@@ -544,3 +544,19 @@
         ui_set_enabled(widget, FALSE);
     }
 }
+
+void ui_set_widget_visibility_states(UiContext *ctx, GtkWidget *widget, const int *states) {
+    if(!states) {
+        return;
+    }
+    size_t nstates = uic_group_array_size(states);
+    ui_set_widget_ngroups(ctx, widget, states, nstates);
+}
+
+
+void ui_set_widget_nvisibility_states(UiContext *ctx, GtkWidget *widget, const int *states, size_t ngroups) {
+    if(ngroups > 0) {
+        uic_add_group_widget_i(ctx, widget, (ui_enablefunc)ui_set_visible, states, ngroups);
+        ui_set_visible(widget, FALSE);
+    }
+}
--- a/ui/gtk/toolkit.h	Sun Oct 19 21:17:21 2025 +0200
+++ b/ui/gtk/toolkit.h	Mon Oct 20 21:16:53 2025 +0200
@@ -180,6 +180,8 @@
 void ui_set_name_and_style(GtkWidget *widget, const char *name, const char *style);
 void ui_set_widget_groups(UiContext *ctx, GtkWidget *widget, const int *groups);
 void ui_set_widget_ngroups(UiContext *ctx, GtkWidget *widget, const int *groups, size_t ngroups);
+void ui_set_widget_visibility_states(UiContext *ctx, GtkWidget *widget, const int *states);
+void ui_set_widget_nvisibility_states(UiContext *ctx, GtkWidget *widget, const int *states, size_t ngroups);
 
 void ui_destroy_userdata(GtkWidget *object, void *userdata);
 void ui_destroy_vardata(GtkWidget *object, UiVarEventData *data);
--- a/ui/gtk/window.c	Sun Oct 19 21:17:21 2025 +0200
+++ b/ui/gtk/window.c	Mon Oct 20 21:16:53 2025 +0200
@@ -436,7 +436,6 @@
 }
 
 UIEXPORT void ui_splitview_window_set_visible(UiObject *obj, int pane, UiBool visible) {
-    GtkWidget *splitview = g_object_get_data(G_OBJECT(obj->widget), "ui_window_splitview");
     GtkWidget *panel = NULL;
     if(pane == 0) {
         panel = g_object_get_data(G_OBJECT(obj->widget), "ui_left_panel");
--- a/ui/ui/toolbar.h	Sun Oct 19 21:17:21 2025 +0200
+++ b/ui/ui/toolbar.h	Mon Oct 20 21:16:53 2025 +0200
@@ -45,6 +45,7 @@
     void* onclickdata;
 
     const int *groups;
+    const int *visibility_states;
 } UiToolbarItemArgs;
 
 typedef struct UiToolbarToggleItemArgs {
@@ -57,12 +58,14 @@
     void *onchangedata;
 
     const int *groups;
+    const int *visibility_states;
 } UiToolbarToggleItemArgs;
 
 typedef struct UiToolbarMenuArgs {
     const char *label;
     const char *icon;
     const char *tooltip;
+    const int  *visibility_states;
 } UiToolbarMenuArgs;
 
 enum UiToolbarPos {

mercurial