# HG changeset patch # User Olaf Wintermann # Date 1759321210 -7200 # Node ID 25b2da0aac15697f7d513d6b23cfa7c762b6b18c # Parent a72d7509d2920fe248cadaec83c0a76ca4655118 add ui_splitview_window diff -r a72d7509d292 -r 25b2da0aac15 application/main.c --- a/application/main.c Mon Sep 29 21:34:43 2025 +0200 +++ b/application/main.c Wed Oct 01 14:20:10 2025 +0200 @@ -585,7 +585,7 @@ - UiObject *obj = ui_sidebar_window("Test", NULL); + UiObject *obj = ui_splitview_window("Test", TRUE); MyDocument *doc = create_doc(); ui_attach_document(obj->ctx, doc); @@ -597,6 +597,10 @@ .onactivate = action_sourcelist_activate); } + ui_right_panel(obj, .margin = 10, .spacing = 10) { + ui_button(obj, .label = "Test"); + } + ui_tabview(obj, .spacing=10, .margin=10, .tabview = UI_TABVIEW_NAVIGATION_SIDE, .varname="tabview", .fill = TRUE) { ui_tab(obj, "Tab 0") { ui_vbox(obj, .fill = FALSE, .margin = 15, .spacing = 15) { diff -r a72d7509d292 -r 25b2da0aac15 ui/common/wrapper.c --- a/ui/common/wrapper.c Mon Sep 29 21:34:43 2025 +0200 +++ b/ui/common/wrapper.c Wed Oct 01 14:20:10 2025 +0200 @@ -301,7 +301,7 @@ } -/* ---------------------------- UiTextStyle ---------------------------- */ +/* ---------------------------- UiCellValue ---------------------------- */ UiBool ui_cell_value_is_string(UiCellValue *value) { return value->type == UI_STRING_EDITABLE; diff -r a72d7509d292 -r 25b2da0aac15 ui/gtk/container.c --- a/ui/gtk/container.c Mon Sep 29 21:34:43 2025 +0200 +++ b/ui/gtk/container.c Wed Oct 01 14:20:10 2025 +0200 @@ -1053,6 +1053,34 @@ } #endif +/* ------------------------ Split Window Panels ------------------------ */ + +static UIWIDGET splitwindow_panel(UiObject *obj, GtkWidget *pbox, UiSidebarArgs *args) { + if(!pbox) { + fprintf(stderr, "Error: window is not a splitview window\n"); + return NULL; + } + + GtkWidget *box = ui_gtk_vbox_new(args->spacing); + ui_box_set_margin(box, args->margin); + BOX_ADD_EXPAND(pbox, box); + + UiObject *newobj = uic_object_new(obj, box); + newobj->container = ui_box_container(obj, box, UI_CONTAINER_VBOX); + uic_obj_add(obj, newobj); + + return box; +} + +UIWIDGET ui_left_panel_create(UiObject *obj, UiSidebarArgs *args) { + return splitwindow_panel(obj, g_object_get_data(G_OBJECT(obj->widget), "ui_left_panel"), args); +} + +UIWIDGET ui_right_panel_create(UiObject *obj, UiSidebarArgs *args) { + return splitwindow_panel(obj, g_object_get_data(G_OBJECT(obj->widget), "ui_right_panel"), args); +} + + /* -------------------- Splitpane -------------------- */ static GtkWidget* create_paned(UiOrientation orientation) { diff -r a72d7509d292 -r 25b2da0aac15 ui/gtk/window.c --- a/ui/gtk/window.c Mon Sep 29 21:34:43 2025 +0200 +++ b/ui/gtk/window.c Wed Oct 01 14:20:10 2025 +0200 @@ -131,7 +131,7 @@ } #endif -static UiObject* create_window(const char *title, void *window_data, UiBool sidebar, UiBool simple) { +static UiObject* create_window(const char *title, void *window_data, UiBool sidebar, UiBool splitview, UiBool simple) { UiObject *obj = uic_object_new_toplevel(); #ifdef UI_LIBADWAITA @@ -200,50 +200,73 @@ GtkWidget *toolbar_view = adw_toolbar_view_new(); adw_toolbar_view_set_content(ADW_TOOLBAR_VIEW(toolbar_view), vbox); + GtkWidget *headerbar_sidebar = NULL; + GtkWidget *headerbar_main = adw_header_bar_new(); + GtkWidget *headerbar_right = NULL; + + GtkWidget *content = toolbar_view; + if(splitview) { + content = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL); + + GtkWidget *right_panel = adw_toolbar_view_new(); + GtkWidget *right_vbox = ui_gtk_vbox_new(0); + adw_toolbar_view_set_content(ADW_TOOLBAR_VIEW(right_panel), right_vbox); + + headerbar_right = adw_header_bar_new(); + adw_header_bar_set_show_title(ADW_HEADER_BAR(headerbar_right), FALSE); + adw_toolbar_view_add_top_bar(ADW_TOOLBAR_VIEW(right_panel), headerbar_right); + + adw_header_bar_set_show_end_title_buttons(ADW_HEADER_BAR(headerbar_main), FALSE); + + gtk_paned_set_start_child(GTK_PANED(content), toolbar_view); + gtk_paned_set_end_child(GTK_PANED(content), right_panel); + + g_object_set_data(G_OBJECT(obj->widget), "ui_window_splitview", content); + g_object_set_data(G_OBJECT(obj->widget), "ui_left_panel", vbox); + g_object_set_data(G_OBJECT(obj->widget), "ui_right_panel", right_vbox); + } + GtkWidget *content_box = ui_gtk_vbox_new(0); BOX_ADD_EXPAND(GTK_BOX(vbox), content_box); - GtkWidget *sidebar_headerbar = NULL; if(sidebar) { GtkWidget *splitview = adw_overlay_split_view_new(); adw_application_window_set_content(ADW_APPLICATION_WINDOW(obj->widget), splitview); GtkWidget *sidebar_toolbar_view = adw_toolbar_view_new(); adw_overlay_split_view_set_sidebar(ADW_OVERLAY_SPLIT_VIEW(splitview), sidebar_toolbar_view); - sidebar_headerbar = adw_header_bar_new(); - adw_toolbar_view_add_top_bar(ADW_TOOLBAR_VIEW(sidebar_toolbar_view), sidebar_headerbar); + headerbar_sidebar = adw_header_bar_new(); + 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), toolbar_view); + adw_overlay_split_view_set_content(ADW_OVERLAY_SPLIT_VIEW(splitview), content); g_object_set_data(G_OBJECT(obj->widget), "ui_sidebar", sidebar_toolbar_view); } else { - adw_application_window_set_content(ADW_APPLICATION_WINDOW(obj->widget), toolbar_view); + adw_application_window_set_content(ADW_APPLICATION_WINDOW(obj->widget), content); } - GtkWidget *headerbar = adw_header_bar_new(); - const char *show_title = ui_get_property("ui.gtk.window.showtitle"); if(show_title) { if(!strcmp(show_title, "main") && sidebar) { - adw_header_bar_set_show_title(ADW_HEADER_BAR(sidebar_headerbar), FALSE); + 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), FALSE); + adw_header_bar_set_show_title(ADW_HEADER_BAR(headerbar_main), FALSE); } else if(!strcmp(show_title, "false")) { - adw_header_bar_set_show_title(ADW_HEADER_BAR(sidebar_headerbar), FALSE); - adw_header_bar_set_show_title(ADW_HEADER_BAR(headerbar), 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); } else { fprintf(stderr, "Unknown value '%s' for property ui.gtk.window.showtitle\n", show_title); - adw_header_bar_set_show_title(ADW_HEADER_BAR(sidebar_headerbar), FALSE); + adw_header_bar_set_show_title(ADW_HEADER_BAR(headerbar_sidebar), FALSE); } } else { - adw_header_bar_set_show_title(ADW_HEADER_BAR(headerbar), FALSE); + adw_header_bar_set_show_title(ADW_HEADER_BAR(headerbar_main), FALSE); } - adw_toolbar_view_add_top_bar(ADW_TOOLBAR_VIEW(toolbar_view), headerbar); - g_object_set_data(G_OBJECT(obj->widget), "ui_headerbar", headerbar); + 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); + ui_fill_headerbar(obj, headerbar_main); } #elif GTK_MAJOR_VERSION >= 4 GtkWidget *content_box = ui_gtk_vbox_new(0); @@ -325,15 +348,19 @@ UiObject* ui_window(const char *title, void *window_data) { - return create_window(title, window_data, FALSE, FALSE); + return create_window(title, window_data, FALSE, FALSE, FALSE); } UiObject *ui_sidebar_window(const char *title, void *window_data) { - return create_window(title, window_data, TRUE, FALSE); + return create_window(title, window_data, TRUE, FALSE, FALSE); +} + +UIEXPORT UiObject *ui_splitview_window(const char *title, UiBool sidebar) { + return create_window(title, NULL, sidebar, TRUE, FALSE); } UiObject* ui_simple_window(const char *title, void *window_data) { - return create_window(title, window_data, FALSE, TRUE); + return create_window(title, window_data, FALSE, FALSE, TRUE); } void ui_window_size(UiObject *obj, int width, int height) { diff -r a72d7509d292 -r 25b2da0aac15 ui/ui/container.h --- a/ui/ui/container.h Mon Sep 29 21:34:43 2025 +0200 +++ b/ui/ui/container.h Wed Oct 01 14:20:10 2025 +0200 @@ -244,6 +244,8 @@ #define ui_tabview(obj, ...) for(ui_tabview_create(obj, &(UiTabViewArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) #define ui_headerbar(obj, ...) for(ui_headerbar_create(obj, &(UiHeaderbarArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) #define ui_sidebar(obj, ...) for(ui_sidebar_create(obj, &(UiSidebarArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) +#define ui_left_panel(obj, ...) for(ui_left_panel_create(obj, &(UiSidebarArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) +#define ui_right_panel(ob, ...) for(ui_right_panel_create(obj, &(UiSidebarArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) #define ui_vbox0(obj) for(ui_vbox_create(obj, &(UiContainerArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj)) #define ui_hbox0(obj) for(ui_hbox_create(obj, &(UiContainerArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj)) @@ -254,6 +256,9 @@ #define ui_tabview0(obj) for(ui_tabview_create(obj, &(UiTabViewArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj)) #define ui_headerbar0(obj) for(ui_headerbar_create(obj, &(UiHeaderbarArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj)) #define ui_sidebar0(obj) for(ui_sidebar_create(obj, &(UiSidebarArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj)) +#define ui_left_panel0(obj) for(ui_left_panel_create(obj, &(UiSidebarArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj)) +#define ui_right_panel0(obj) for(ui_right_panel_create(obj, &(UiSidebarArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj)) + #define ui_vbox_w(obj, w, ...) for(w = ui_vbox_create(obj, &(UiContainerArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) #define ui_hbox_w(obj, w, ...) for(w = ui_hbox_create(obj, &(UiContainerArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj)) @@ -299,6 +304,8 @@ UIEXPORT void ui_headerbar_end_create(UiObject *obj); UIEXPORT UIWIDGET ui_sidebar_create(UiObject *obj, UiSidebarArgs *args); +UIEXPORT UIWIDGET ui_left_panel_create(UiObject *obj, UiSidebarArgs *args); +UIEXPORT UIWIDGET ui_right_panel_create(UiObject *obj, UiSidebarArgs *args); UIEXPORT UIWIDGET ui_itemlist_create(UiObject *obj, UiItemListContainerArgs *args); diff -r a72d7509d292 -r 25b2da0aac15 ui/ui/window.h --- a/ui/ui/window.h Mon Sep 29 21:34:43 2025 +0200 +++ b/ui/ui/window.h Wed Oct 01 14:20:10 2025 +0200 @@ -74,6 +74,7 @@ UIEXPORT UiObject *ui_window(const char *title, void *window_data); UIEXPORT UiObject *ui_sidebar_window(const char *title, void *window_data); +UIEXPORT UiObject *ui_splitview_window(const char *title, UiBool sidebar); UIEXPORT UiObject *ui_simple_window(const char *title, void *window_data); UIEXPORT UiObject *ui_dialog_window_create(UiObject *parent, UiDialogWindowArgs *args);