Wed, 17 Jun 2026 20:54:22 +0200
add toolbar content toggle button (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/headerbar.h | file | annotate | diff | comparison | revisions | |
| ui/ui/button.h | file | annotate | diff | comparison | revisions | |
| ui/ui/toolbar.h | file | annotate | diff | comparison | revisions |
--- a/ui/common/toolbar.c Wed Jun 17 20:42:21 2026 +0200 +++ b/ui/common/toolbar.c Wed Jun 17 20:54:22 2026 +0200 @@ -85,6 +85,25 @@ return newargs; } +static UiToolbarContentToggleItemArgs contenttoggleitemargs_copy(UiToolbarContentToggleItemArgs *args, size_t *ngroups, size_t *nvstates) { + UiToolbarContentToggleItemArgs newargs; + newargs.label0 = nl_strdup(args->label0); + newargs.icon0 = nl_strdup(args->icon0); + newargs.tooltip0 = nl_strdup(args->tooltip0); + newargs.label1 = nl_strdup(args->label1); + newargs.icon1 = nl_strdup(args->icon1); + newargs.tooltip1 = nl_strdup(args->tooltip1); + newargs.varname = nl_strdup(args->varname); + newargs.onchange = args->onchange; + newargs.onchangedata = args->onchangedata; + newargs.action = nl_strdup(args->action); + newargs.toggled_by_state = args->toggled_by_state; + newargs.istogglebutton = args->istogglebutton; + newargs.states = uic_copy_states(args->states, ngroups); + newargs.visibility_states = uic_copy_states(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; @@ -92,6 +111,13 @@ cxMapPut(toolbar_items, name, item); } +void ui_toolbar_content_toggleitem_create(const char* name, UiToolbarContentToggleItemArgs *args) { + UiToolbarContentToggleItem* item = malloc(sizeof(UiToolbarContentToggleItem)); + item->item.type = UI_TOOLBAR_CONTENT_TOGGLEITEM; + item->args = contenttoggleitemargs_copy(args, &item->nstates, &item->nvstates); + cxMapPut(toolbar_items, name, item); +} + static UiToolbarMenuArgs menuargs_copy(UiToolbarMenuArgs *args, size_t *nvstates) { UiToolbarMenuArgs newargs; newargs.label = nl_strdup(args->label);
--- a/ui/common/toolbar.h Wed Jun 17 20:42:21 2026 +0200 +++ b/ui/common/toolbar.h Wed Jun 17 20:54:22 2026 +0200 @@ -40,16 +40,18 @@ extern "C" { #endif -typedef struct UiToolbarItemI UiToolbarItemI; +typedef struct UiToolbarItemI UiToolbarItemI; -typedef struct UiToolbarItem UiToolbarItem; -typedef struct UiToolbarToggleItem UiToolbarToggleItem; +typedef struct UiToolbarItem UiToolbarItem; +typedef struct UiToolbarToggleItem UiToolbarToggleItem; +typedef struct UiToolbarContentToggleItem UiToolbarContentToggleItem; -typedef struct UiToolbarMenuItem UiToolbarMenuItem; +typedef struct UiToolbarMenuItem UiToolbarMenuItem; enum UiToolbarItemType { UI_TOOLBAR_ITEM = 0, UI_TOOLBAR_TOGGLEITEM, + UI_TOOLBAR_CONTENT_TOGGLEITEM, UI_TOOLBAR_MENU }; @@ -73,6 +75,13 @@ size_t nvstates; }; +struct UiToolbarContentToggleItem { + UiToolbarItemI item; + UiToolbarContentToggleItemArgs args; + size_t nstates; + size_t nvstates; +}; + struct UiToolbarMenuItem { UiToolbarItemI item; UiMenu menu;
--- a/ui/gtk/headerbar.c Wed Jun 17 20:42:21 2026 +0200 +++ b/ui/gtk/headerbar.c Wed Jun 17 20:54:22 2026 +0200 @@ -120,6 +120,9 @@ case UI_TOOLBAR_TOGGLEITEM: { return ui_add_headerbar_toggleitem(headerbar, box, (UiToolbarToggleItem*)i, obj, pos); } + case UI_TOOLBAR_CONTENT_TOGGLEITEM: { + return ui_add_headerbar_content_toggleitem(headerbar, box, (UiToolbarContentToggleItem*)i, obj, pos); + } case UI_TOOLBAR_MENU: { return ui_add_headerbar_menu(headerbar, box, (UiToolbarMenuItem*)i, obj, pos); } @@ -206,6 +209,33 @@ return button; } +GtkWidget* ui_add_headerbar_content_toggleitem( + GtkWidget *headerbar, + GtkWidget *box, + UiToolbarContentToggleItem *item, + UiObject *obj, + enum UiToolbarPos pos) +{ + UiContentToggleArgs args = { 0 }; + args.label0 = item->args.label0; + args.icon0 = item->args.icon0; + args.tooltip0 = item->args.tooltip0; + args.label1 = item->args.label1; + args.icon1 = item->args.icon1; + args.tooltip1 = item->args.tooltip1; + args.varname = item->args.varname; + args.onchange = item->args.onchange; + args.onchangedata = item->args.onchangedata; + args.action = item->args.action; + args.istogglebutton = item->args.istogglebutton; + args.toggled_by_state = item->args.toggled_by_state; + + GtkWidget *button = ui_create_content_togglebutton(obj, &args); + WIDGET_ADD_CSS_CLASS(button, "flat"); + headerbar_add(headerbar, box, button, pos); + return button; +} + GtkWidget* ui_add_headerbar_menu( GtkWidget *headerbar, GtkWidget *box,
--- a/ui/gtk/headerbar.h Wed Jun 17 20:42:21 2026 +0200 +++ b/ui/gtk/headerbar.h Wed Jun 17 20:54:22 2026 +0200 @@ -81,6 +81,13 @@ UiObject *obj, enum UiToolbarPos pos); +GtkWidget* ui_add_headerbar_content_toggleitem( + GtkWidget *headerbar, + GtkWidget *box, + UiToolbarContentToggleItem *item, + UiObject *obj, + enum UiToolbarPos pos); + GtkWidget* ui_add_headerbar_menu( GtkWidget *headerbar, GtkWidget *box,
--- a/ui/ui/button.h Wed Jun 17 20:42:21 2026 +0200 +++ b/ui/ui/button.h Wed Jun 17 20:54:22 2026 +0200 @@ -133,7 +133,7 @@ const char *action; UiBool istogglebutton; int enable_state; - int enabled_by_state; + int toggled_by_state; const int *states; const int *visibility_states;
--- a/ui/ui/toolbar.h Wed Jun 17 20:42:21 2026 +0200 +++ b/ui/ui/toolbar.h Wed Jun 17 20:54:22 2026 +0200 @@ -67,6 +67,28 @@ const int *visibility_states; } UiToolbarToggleItemArgs; +typedef struct UiToolbarContentToggleItemArgs { + const char *label0; + const char *icon0; + const char *tooltip0; + const char *label1; + const char *icon1; + const char *tooltip1; + + const char *varname; + ui_callback onchange; + void *onchangedata; + const char *action; + const char *accelerator; + const char *accelerator_text; + + int toggled_by_state; + UiBool istogglebutton; + + const int *states; + const int *visibility_states; +} UiToolbarContentToggleItemArgs; + typedef struct UiToolbarMenuArgs { const char *label; const char *icon; @@ -87,6 +109,7 @@ #define ui_toolbar_item(name, ...) ui_toolbar_item_create(name, &(UiToolbarItemArgs){ __VA_ARGS__ } ) #define ui_toolbar_toggleitem(name, ...) ui_toolbar_toggleitem_create(name, &(UiToolbarToggleItemArgs){ __VA_ARGS__ } ) +#define ui_toolbar_content_toggleitem(name, ...) ui_toolbar_toggleitem_create(name, &(UiToolbarToggleItemArgs){ __VA_ARGS__ } ) #define ui_toolbar_menu(name, ...) for(ui_toolbar_menu_create(name, &(UiToolbarMenuArgs){ __VA_ARGS__ });ui_menu_is_open();ui_menu_close()) #define ui_toolbar_appmenu() for(ui_toolbar_menu_create(NULL, &(UiToolbarMenuArgs){ 0 });ui_menu_is_open();ui_menu_close()) @@ -94,6 +117,7 @@ UIEXPORT void ui_toolbar_item_create(const char* name, UiToolbarItemArgs *args); UIEXPORT void ui_toolbar_toggleitem_create(const char* name, UiToolbarToggleItemArgs *args); +UIEXPORT void ui_toolbar_content_toggleitem_create(const char* name, UiToolbarContentToggleItemArgs *args); UIEXPORT void ui_toolbar_menu_create(const char* name, UiToolbarMenuArgs *args); UIEXPORT void ui_toolbar_add_default(const char *name, enum UiToolbarPos pos);