add ui_splitview_window

Wed, 01 Oct 2025 14:20:10 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Wed, 01 Oct 2025 14:20:10 +0200
changeset 783
25b2da0aac15
parent 782
a72d7509d292
child 786
150a1180f7ec

add ui_splitview_window

application/main.c file | annotate | diff | comparison | revisions
ui/common/wrapper.c file | annotate | diff | comparison | revisions
ui/gtk/container.c file | annotate | diff | comparison | revisions
ui/gtk/window.c file | annotate | diff | comparison | revisions
ui/ui/container.h file | annotate | diff | comparison | revisions
ui/ui/window.h file | annotate | diff | comparison | revisions
--- 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) {
--- 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;
--- 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) {
--- 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) {
--- 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);
 
--- 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);
 

mercurial