add toolbar content toggle button (GTK)

Wed, 17 Jun 2026 20:54:22 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Wed, 17 Jun 2026 20:54:22 +0200
changeset 1206
4637da12bc6c
parent 1205
749a32e91513
child 1207
833c37fc5475

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);

mercurial