ui/gtk/window.c

changeset 100
d2bd73d28ff1
parent 98
16e84fac48bd
--- a/ui/gtk/window.c	Fri Nov 29 22:21:36 2024 +0100
+++ b/ui/gtk/window.c	Thu Dec 12 20:01:43 2024 +0100
@@ -101,7 +101,7 @@
 }
 #endif
 
-static UiObject* create_window(const char *title, void *window_data, UiBool simple) {
+static UiObject* create_window(const char *title, void *window_data, UiBool sidebar, UiBool simple) {
     CxMempool *mp = cxBasicMempoolCreate(256);
     UiObject *obj = cxCalloc(mp->allocator, 1, sizeof(UiObject));
     obj->ref = 0;
@@ -136,7 +136,7 @@
     } else {
         gtk_window_set_default_size(
                 GTK_WINDOW(obj->widget),
-                window_default_width,
+                window_default_width + sidebar*250,
                 window_default_height);
     }
     
@@ -163,8 +163,27 @@
     GtkWidget *vbox = ui_gtk_vbox_new(0);
 #ifdef UI_LIBADWAITA
     GtkWidget *toolbar_view = adw_toolbar_view_new();
-    adw_application_window_set_content(ADW_APPLICATION_WINDOW(obj->widget), toolbar_view);
     adw_toolbar_view_set_content(ADW_TOOLBAR_VIEW(toolbar_view), vbox);
+    
+    GtkWidget *content_box = ui_gtk_vbox_new(0);
+    BOX_ADD_EXPAND(GTK_BOX(vbox), content_box);
+    
+    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);
+        GtkWidget *sidebar_headerbar = adw_header_bar_new();
+        adw_toolbar_view_add_top_bar(ADW_TOOLBAR_VIEW(sidebar_toolbar_view), sidebar_headerbar);
+        
+        adw_overlay_split_view_set_content(ADW_OVERLAY_SPLIT_VIEW(splitview), toolbar_view);
+        
+        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);
+    }
+    
 
     GtkWidget *headerbar = adw_header_bar_new();
     adw_toolbar_view_add_top_bar(ADW_TOOLBAR_VIEW(toolbar_view), headerbar);
@@ -174,10 +193,19 @@
         ui_fill_headerbar(obj, headerbar);
     }
 #elif GTK_MAJOR_VERSION >= 4
+    GtkWidget *content_box = ui_gtk_vbox_new(0);
     WINDOW_SET_CONTENT(obj->widget, vbox);
+    if(sidebar) {
+        GtkWidget *paned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
+        GtkWidget *sidebar_vbox = ui_gtk_vbox_new(0);
+        gtk_paned_set_start_child(GTK_PANED(paned), sidebar_vbox);
+        gtk_paned_set_end_child(GTK_PANED(paned), content_box);
+        BOX_ADD_EXPAND(GTK_BOX(vbox), paned);
+        g_object_set_data(G_OBJECT(obj->widget), "ui_sidebar", sidebar_vbox);
+    } else {
+        BOX_ADD_EXPAND(GTK_BOX(vbox), content_box);
+    }
 #else
-    gtk_container_add(GTK_CONTAINER(obj->widget), vbox);
-    
     if(!simple) {
         // menu
         if(uic_get_menu_list()) {
@@ -198,6 +226,21 @@
         //GtkWidget *hb = ui_create_headerbar(obj);
         //gtk_window_set_titlebar(GTK_WINDOW(obj->widget), hb);
     }
+    
+    GtkWidget *content_box = ui_gtk_vbox_new(0);
+    WINDOW_SET_CONTENT(obj->widget, vbox);
+    if(sidebar) {
+        GtkWidget *paned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
+        GtkWidget *sidebar_vbox = ui_gtk_vbox_new(0);
+        gtk_paned_add1(GTK_PANED(paned), sidebar_vbox);
+        gtk_paned_add2(GTK_PANED(paned), content_box);
+        BOX_ADD_EXPAND(GTK_BOX(vbox), paned);
+        g_object_set_data(G_OBJECT(obj->widget), "ui_sidebar", sidebar_vbox);
+        gtk_paned_set_position (GTK_PANED(paned), 200);
+    } else {
+        BOX_ADD_EXPAND(GTK_BOX(vbox), content_box);
+    }
+    
 #endif
     
     // window content
@@ -213,8 +256,6 @@
     gtk_container_add(GTK_CONTAINER(frame), content_box);
     obj->container = ui_box_container(obj, content_box);
     */
-    GtkWidget *content_box = ui_gtk_vbox_new(0);
-    BOX_ADD_EXPAND(GTK_BOX(vbox), content_box);
     obj->container = ui_box_container(obj, content_box, UI_CONTAINER_VBOX);
     
     nwindows++;
@@ -223,11 +264,15 @@
 
 
 UiObject* ui_window(const char *title, void *window_data) {
-    return create_window(title, window_data, FALSE);
+    return create_window(title, window_data, FALSE, FALSE);
+}
+
+UiObject *ui_sidebar_window(const char *title, void *window_data) {
+    return create_window(title, window_data, TRUE, FALSE);
 }
 
 UiObject* ui_simple_window(const char *title, void *window_data) {
-    return create_window(title, window_data, TRUE);
+    return create_window(title, window_data, FALSE, TRUE);
 }
 
 void ui_window_size(UiObject *obj, int width, int height) {

mercurial