Mon, 20 Oct 2025 21:16:53 +0200
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 {