Fri, 03 Oct 2025 10:17:31 +0200
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__ } )