add new toolbar positions for splitview windows

Fri, 03 Oct 2025 10:17:31 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Fri, 03 Oct 2025 10:17:31 +0200
changeset 789
d70799b3333e
parent 788
27f126f6e361
child 790
67da3f795226

add new toolbar positions for splitview windows

application/main.c file | annotate | diff | comparison | revisions
ui/common/toolbar.c file | annotate | diff | comparison | revisions
ui/gtk/headerbar.c file | annotate | diff | comparison | revisions
ui/gtk/headerbar.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/application/main.c	Fri Oct 03 09:03:59 2025 +0200
+++ b/application/main.c	Fri Oct 03 10:17:31 2025 +0200
@@ -793,7 +793,8 @@
     ui_init("app1", argc, argv);
     ui_onstartup(application_startup, NULL);
     
-    ui_set_property("ui.gtk.window.showtitle", "main");
+    ui_set_property("ui.gtk.window.showtitle", "sidebar");
+    ui_set_property("ui.gtk.window.appmenu.position", "rightpanel");
     
     // menu
     ui_menu("File") {
--- a/ui/common/toolbar.c	Fri Oct 03 09:03:59 2025 +0200
+++ b/ui/common/toolbar.c	Fri Oct 03 10:17:31 2025 +0200
@@ -33,16 +33,16 @@
 
 static CxMap* toolbar_items;
 
-static CxList* toolbar_defaults[3]; // 0: left 1: center 2: right
+static CxList* toolbar_defaults[8]; // 0: left 1: center 2: right
 
 static UiToolbarMenuItem* ui_appmenu;
 
 
 void uic_toolbar_init(void) {
     toolbar_items = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 16);
-    toolbar_defaults[0] = cxLinkedListCreateSimple(CX_STORE_POINTERS);
-    toolbar_defaults[1] = cxLinkedListCreateSimple(CX_STORE_POINTERS);
-    toolbar_defaults[2] = cxLinkedListCreateSimple(CX_STORE_POINTERS);
+    for(int i=0;i<8;i++) {
+        toolbar_defaults[i] = cxLinkedListCreateSimple(CX_STORE_POINTERS);
+    }
 }
 
 static char* nl_strdup(const char* str) {
@@ -120,7 +120,7 @@
 }
 
 CxList* uic_get_toolbar_defaults(enum UiToolbarPos pos) {
-    if (pos >= 0 && pos < 3) {
+    if (pos >= 0 && pos < 8) {
         return toolbar_defaults[pos];
     }
     return NULL;
@@ -128,15 +128,19 @@
 
 void ui_toolbar_add_default(const char* name, enum UiToolbarPos pos) {
     char* cp = strdup(name);
-    if (pos >= 0 && pos < 3) {
+    if (pos >= 0 && pos < 8) {
         cxListAdd(toolbar_defaults[pos], cp);
     } else {
-        // TODO: error
+        fprintf(stderr, "Error: illegal toolbar position: %d\n", (int)pos);
     }
 }
 
 UiBool uic_toolbar_isenabled(void) {
-    return cxListSize(toolbar_defaults[0]) + cxListSize(toolbar_defaults[1]) + cxListSize(toolbar_defaults[2]) > 0;
+    size_t size = 0;
+    for(int i=0;i<8;i++) {
+        size += cxListSize(toolbar_defaults[i]);
+    }
+    return size > 0;
 }
 
 UiToolbarItemI* uic_toolbar_get_item(const char* name) {
--- a/ui/gtk/headerbar.c	Fri Oct 03 09:03:59 2025 +0200
+++ b/ui/gtk/headerbar.c	Fri Oct 03 10:17:31 2025 +0200
@@ -31,21 +31,70 @@
 #include "button.h"
 #include "menu.h"
 
+#include "../ui/properties.h"
+
 #if GTK_CHECK_VERSION(3, 10, 0)
     
-void ui_fill_headerbar(UiObject *obj, GtkWidget *headerbar) {
+void ui_fill_headerbar(UiObject *obj, GtkWidget *sidebar_headerbar, GtkWidget *main_headerbar, GtkWidget *right_headerbar) {
+    CxList *sidebar_left_defaults = uic_get_toolbar_defaults(UI_TOOLBAR_SIDEBAR_LEFT);
+    CxList *sidebar_right_defaults = uic_get_toolbar_defaults(UI_TOOLBAR_SIDEBAR_RIGHT);
+    
     CxList *left_defaults = uic_get_toolbar_defaults(UI_TOOLBAR_LEFT);
     CxList *center_defaults = uic_get_toolbar_defaults(UI_TOOLBAR_CENTER);
     CxList *right_defaults = uic_get_toolbar_defaults(UI_TOOLBAR_RIGHT);
     
-    ui_headerbar_add_items(obj, headerbar, left_defaults, UI_TOOLBAR_LEFT);
-    ui_headerbar_add_items(obj, headerbar, center_defaults, UI_TOOLBAR_CENTER);
-    
+    CxList *rightpanel_left_defaults = uic_get_toolbar_defaults(UI_TOOLBAR_RIGHTPANEL_LEFT);
+    CxList *rightpanel_center_defaults = uic_get_toolbar_defaults(UI_TOOLBAR_RIGHTPANEL_CENTER);
+    CxList *rightpanel_right_defaults = uic_get_toolbar_defaults(UI_TOOLBAR_RIGHTPANEL_RIGHT);
+
     UiToolbarMenuItem *appmenu = uic_get_appmenu();
-    if(appmenu) {
-        ui_add_headerbar_menu(headerbar, NULL, appmenu, obj, UI_TOOLBAR_RIGHT);
+    const char *appmenu_pos_str = ui_get_property("ui.gtk.window.appmenu.position");
+    int appmenu_pos = UI_TOOLBAR_RIGHT;
+    if(sidebar_headerbar) {
+        appmenu_pos = UI_TOOLBAR_SIDEBAR_RIGHT;
+    } else if(right_headerbar) {
+        appmenu_pos = UI_TOOLBAR_RIGHTPANEL_RIGHT;
+    }
+    if(appmenu_pos_str) {
+        if(!strcmp(appmenu_pos_str, "sidebar") && sidebar_headerbar) {
+            appmenu_pos = UI_TOOLBAR_SIDEBAR_RIGHT;
+        } else if(!strcmp(appmenu_pos_str, "main")) {
+            appmenu_pos = UI_TOOLBAR_RIGHT;
+        } else if(!strcmp(appmenu_pos_str, "rightpanel") && right_headerbar) {
+            appmenu_pos = UI_TOOLBAR_RIGHTPANEL_RIGHT;
+        }
+    }
+    
+    // main toolbar
+    ui_headerbar_add_items(obj, main_headerbar, left_defaults, UI_TOOLBAR_LEFT);
+    ui_headerbar_add_items(obj, main_headerbar, center_defaults, UI_TOOLBAR_CENTER);
+    
+    if(appmenu && appmenu_pos == UI_TOOLBAR_RIGHT) {
+        ui_add_headerbar_menu(main_headerbar, NULL, appmenu, obj, UI_TOOLBAR_RIGHT);
     }
-    ui_headerbar_add_items(obj, headerbar, right_defaults, UI_TOOLBAR_RIGHT);
+    ui_headerbar_add_items(obj, main_headerbar, right_defaults, UI_TOOLBAR_RIGHT);
+    
+    // sidebar
+    if(sidebar_headerbar) {
+        // ui_headerbar_add_items pos parameter uses only UI_TOOLBAR_LEFT, UI_TOOLBAR_CENTER, UI_TOOLBAR_RIGHT
+        ui_headerbar_add_items(obj, sidebar_headerbar, sidebar_left_defaults, UI_TOOLBAR_LEFT);
+
+        if(appmenu && appmenu_pos == UI_TOOLBAR_SIDEBAR_RIGHT) {
+            ui_add_headerbar_menu(sidebar_headerbar, NULL, appmenu, obj, UI_TOOLBAR_RIGHT);
+        }
+        ui_headerbar_add_items(obj, sidebar_headerbar, sidebar_right_defaults, UI_TOOLBAR_RIGHT);
+    }
+    
+    // right panel
+    if(right_headerbar) {
+        ui_headerbar_add_items(obj, right_headerbar, rightpanel_left_defaults, UI_TOOLBAR_LEFT);
+        ui_headerbar_add_items(obj, right_headerbar, rightpanel_center_defaults, UI_TOOLBAR_CENTER);
+
+        if(appmenu && appmenu_pos == UI_TOOLBAR_RIGHTPANEL_RIGHT) {
+            ui_add_headerbar_menu(right_headerbar, NULL, appmenu, obj, UI_TOOLBAR_RIGHT);
+        }
+        ui_headerbar_add_items(obj, right_headerbar, rightpanel_right_defaults, UI_TOOLBAR_RIGHT);
+    }
 }
 
 static void create_item(UiObject *obj, GtkWidget *headerbar, GtkWidget *box, UiToolbarItemI *i, enum UiToolbarPos pos) {
--- a/ui/gtk/headerbar.h	Fri Oct 03 09:03:59 2025 +0200
+++ b/ui/gtk/headerbar.h	Fri Oct 03 10:17:31 2025 +0200
@@ -58,7 +58,7 @@
 #endif
 #endif
     
-void ui_fill_headerbar(UiObject *obj, GtkWidget *headerbar);
+void ui_fill_headerbar(UiObject *obj, GtkWidget *sidebar_headerbar, GtkWidget *main_headerbar, GtkWidget *right_headerbar);
 
 void ui_headerbar_add_items(UiObject *obj, GtkWidget *headerbar, CxList *items, enum UiToolbarPos pos);
 
--- a/ui/gtk/window.c	Fri Oct 03 09:03:59 2025 +0200
+++ b/ui/gtk/window.c	Fri Oct 03 10:17:31 2025 +0200
@@ -236,6 +236,7 @@
         GtkWidget *sidebar_toolbar_view = adw_toolbar_view_new();
         adw_overlay_split_view_set_sidebar(ADW_OVERLAY_SPLIT_VIEW(splitview), sidebar_toolbar_view);
         headerbar_sidebar = adw_header_bar_new();
+        adw_header_bar_set_show_title(ADW_HEADER_BAR(headerbar_sidebar), FALSE);
         adw_toolbar_view_add_top_bar(ADW_TOOLBAR_VIEW(sidebar_toolbar_view), headerbar_sidebar);
         
         adw_overlay_split_view_set_content(ADW_OVERLAY_SPLIT_VIEW(splitview), content);
@@ -251,6 +252,7 @@
             adw_header_bar_set_show_title(ADW_HEADER_BAR(headerbar_sidebar), FALSE);
         } else if(!strcmp(show_title, "sidebar")) {
             adw_header_bar_set_show_title(ADW_HEADER_BAR(headerbar_main), FALSE);
+            adw_header_bar_set_show_title(ADW_HEADER_BAR(headerbar_sidebar), TRUE);
         } else if(!strcmp(show_title, "false")) {
             adw_header_bar_set_show_title(ADW_HEADER_BAR(headerbar_sidebar), FALSE);
             adw_header_bar_set_show_title(ADW_HEADER_BAR(headerbar_main), FALSE);
@@ -260,13 +262,16 @@
         }
     } else {
         adw_header_bar_set_show_title(ADW_HEADER_BAR(headerbar_main), FALSE);
+        if(sidebar) {
+            adw_header_bar_set_show_title(ADW_HEADER_BAR(headerbar_sidebar), TRUE);
+        }
     }
     
     adw_toolbar_view_add_top_bar(ADW_TOOLBAR_VIEW(toolbar_view), headerbar_main);
     g_object_set_data(G_OBJECT(obj->widget), "ui_headerbar", headerbar_main);
     
     if(!simple) {
-        ui_fill_headerbar(obj, headerbar_main);
+        ui_fill_headerbar(obj, headerbar_sidebar, headerbar_main, headerbar_right);
     }
 #elif GTK_MAJOR_VERSION >= 4
     GtkWidget *content_box = ui_gtk_vbox_new(0);
--- a/ui/ui/toolbar.h	Fri Oct 03 09:03:59 2025 +0200
+++ b/ui/ui/toolbar.h	Fri Oct 03 10:17:31 2025 +0200
@@ -37,38 +37,43 @@
 #endif
 
 typedef struct UiToolbarItemArgs {
-	const char* label;
-	const char* stockid;
-	const char* icon;
+    const char* label;
+    const char* stockid;
+    const char* icon;
 
-	ui_callback onclick;
-	void* onclickdata;
-        
-        const int *groups;
+    ui_callback onclick;
+    void* onclickdata;
+
+    const int *groups;
 } UiToolbarItemArgs;
 
 typedef struct UiToolbarToggleItemArgs {
-	const char* label;
-	const char* stockid;
-	const char* icon;
+    const char* label;
+    const char* stockid;
+    const char* icon;
 
-	const char* varname;
-	ui_callback onchange;
-	void* onchangedata;
-        
-        const int *groups;
+    const char* varname;
+    ui_callback onchange;
+    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;
 } UiToolbarMenuArgs;
 
 enum UiToolbarPos {
-	UI_TOOLBAR_LEFT = 0,
-	UI_TOOLBAR_CENTER,
-	UI_TOOLBAR_RIGHT
+    UI_TOOLBAR_LEFT = 0,
+    UI_TOOLBAR_CENTER,
+    UI_TOOLBAR_RIGHT,
+    UI_TOOLBAR_SIDEBAR_LEFT,
+    UI_TOOLBAR_SIDEBAR_RIGHT,
+    UI_TOOLBAR_RIGHTPANEL_LEFT,
+    UI_TOOLBAR_RIGHTPANEL_CENTER,
+    UI_TOOLBAR_RIGHTPANEL_RIGHT
 };
 
 #define ui_toolbar_item(name, ...) ui_toolbar_item_create(name, &(UiToolbarItemArgs){ __VA_ARGS__ } )

mercurial