add new splitpane (GTK)

5 weeks ago

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Wed, 05 Feb 2025 23:03:30 +0100 (5 weeks ago)
changeset 456
6712b08e4f74
parent 453
abe2c7bf2246
child 457
3a825867cfe7

add new splitpane (GTK)

application/main.c file | annotate | diff | comparison | revisions
ui/gtk/container.c file | annotate | diff | comparison | revisions
ui/gtk/container.h file | annotate | diff | comparison | revisions
ui/ui/container.h file | annotate | diff | comparison | revisions
--- a/application/main.c	Sat Feb 01 22:30:58 2025 +0100
+++ b/application/main.c	Wed Feb 05 23:03:30 2025 +0100
@@ -471,6 +471,13 @@
         ui_tab(obj, "Tab 7") {
             ui_itemlist(obj, .create_ui = create_item, .varname = "items", .subcontainer = UI_CONTAINER_HBOX, .sub_spacing = 10, .margin = 10, .spacing = 4, .userdata = doc);
         }
+        
+        ui_tab(obj, "Tab 8") {
+            ui_hsplitpane(obj, .initial_position = 100) {
+                ui_button(obj, .label = "Button 1");
+                ui_button(obj, .label = "Button 2");
+            }
+        }
     }
     
     /*
--- a/ui/gtk/container.c	Sat Feb 01 22:30:58 2025 +0100
+++ b/ui/gtk/container.c	Wed Feb 05 23:03:30 2025 +0100
@@ -957,6 +957,70 @@
 
 
 
+static UIWIDGET splitpane_create(UiObject *obj, UiOrientation orientation, UiSplitPaneArgs args) {
+    UiObject* current = uic_current_obj(obj);
+    
+    GtkWidget *pane0 = create_paned(orientation);
+    printf("pane0: %p\n", pane0);
+    
+    UI_APPLY_LAYOUT1(current, args);
+    current->container->add(current->container, pane0, TRUE);
+    
+    int max = args.max_panes == 0 ? 2 : args.max_panes;
+    
+    UiObject *newobj = uic_object_new(obj, pane0);
+    newobj->container = ui_splitpane_container(obj, pane0, orientation, max);
+    uic_obj_add(obj, newobj);
+    
+    return pane0;
+}
+
+UIWIDGET ui_hsplitpane_create(UiObject *obj, UiSplitPaneArgs args) {
+    return splitpane_create(obj, UI_HORIZONTAL, args);
+}
+
+UIWIDGET ui_vsplitpane_create(UiObject *obj, UiSplitPaneArgs args) {
+    return splitpane_create(obj, UI_VERTICAL, args);
+}
+
+UiContainer* ui_splitpane_container(UiObject *obj, GtkWidget *pane, UiOrientation orientation, int max) {
+    UiSplitPaneContainer *ct = ui_calloc(obj->ctx, 1, sizeof(UiSplitPaneContainer));
+    ct->container.widget = pane;
+    ct->container.add = ui_splitpane_container_add;
+    ct->current_pane = pane;
+    ct->orientation = orientation;
+    ct->max = max;
+    return (UiContainer*)ct;
+}
+
+void ui_splitpane_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) {
+    UiSplitPaneContainer *s = (UiSplitPaneContainer*)ct;
+    
+    if(s->nchildren >= s->max) {
+        fprintf(stderr, "splitpane: maximum number of children reached\n");
+        return;
+    }
+    
+    if(s->pos == 0) {
+        gtk_paned_set_start_child(GTK_PANED(s->current_pane), widget);
+        printf("pane add: %p\n", s->current_pane);
+        s->pos++;
+        s->nchildren++;
+    } else {
+        if(s->nchildren+1 == s->max) {
+            gtk_paned_set_end_child(GTK_PANED(s->current_pane), widget);
+        } else {
+            GtkWidget *pane = create_paned(s->orientation);
+            gtk_paned_set_start_child(GTK_PANED(pane), widget);
+            gtk_paned_set_end_child(GTK_PANED(s->current_pane), pane);
+            s->current_pane = pane;
+        }
+        
+        s->pos = 0;
+        s->nchildren++;
+    }
+}
+
 /* -------------------- ItemList Container -------------------- */
 
 static void remove_item(void *data, void *item) {
--- a/ui/gtk/container.h	Sat Feb 01 22:30:58 2025 +0100
+++ b/ui/gtk/container.h	Wed Feb 05 23:03:30 2025 +0100
@@ -31,6 +31,7 @@
 
 #include "../ui/toolkit.h"
 #include "../ui/container.h"
+#include "toolkit.h"
 #include <string.h>
 
 #include <cx/allocator.h>
@@ -97,16 +98,6 @@
 #endif
 } UiGridContainer;
 
-/*
-typedef struct UiPanedContainer {
-    UiContainer container;
-    GtkWidget *current_pane;
-    int orientation;
-    int max;
-    int cur;
-} UiPanedContainer;
-*/
-
 typedef struct UiTabViewContainer {
     UiContainer container;
 } UiTabViewContainer;
@@ -127,6 +118,16 @@
     int rowspacing;
 } UiGtkTabView;
 
+
+typedef struct UiSplitPaneContainer {
+    UiContainer container;
+    GtkWidget *current_pane;
+    UiOrientation orientation;
+    int pos;
+    int max;
+    int nchildren;
+} UiSplitPaneContainer;
+
 typedef struct UiHeaderbarContainer {
     UiContainer container;
     GtkWidget *centerbox;
@@ -185,10 +186,9 @@
 UiContainer* ui_tabview_container(UiObject *obj, GtkWidget *tabview);
 void ui_tabview_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill);
 
-void ui_paned_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill);
+UiContainer* ui_splitpane_container(UiObject *obj, GtkWidget *pane, UiOrientation orientation, int max);
+void ui_splitpane_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill);
 
-void ui_split_container_add1(UiContainer *ct, GtkWidget *widget, UiBool fill);
-void ui_split_container_add2(UiContainer *ct, GtkWidget *widget, UiBool fill);
 
 UiGtkTabView* ui_widget_get_tabview_data(UIWIDGET tabview);
 
--- a/ui/ui/container.h	Sat Feb 01 22:30:58 2025 +0100
+++ b/ui/ui/container.h	Wed Feb 05 23:03:30 2025 +0100
@@ -160,6 +160,28 @@
     int spacing;
 } UiSidebarArgs;
 
+typedef struct UiSplitPaneArgs {
+    UiTri fill;
+    UiBool hexpand;
+    UiBool vexpand;
+    UiBool hfill;
+    UiBool vfill;
+    int colspan;
+    int rowspan;
+    const char *name;
+    const char *style_class;
+
+    int margin;
+    int spacing;
+    int columnspacing;
+    int rowspacing;
+    
+    int initial_position;
+    UiInteger *value;
+    const char* varname;
+    int max_panes;
+} UiSplitPaneArgs;
+
 typedef struct UiItemListContainerArgs {
     UiTri fill;
     UiBool hexpand;
@@ -234,6 +256,11 @@
 #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_hsplitpane(obj, ...) for(ui_hsplitpane_create(obj, (UiSplitPaneArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
+#define ui_vsplitpane(obj, ...) for(ui_vsplitpane_create(obj, (UiSplitPaneArgs){ __VA_ARGS__ });ui_container_finish(obj);ui_container_begin_close(obj))
+#define ui_hsplitpane0(obj) for(ui_hsplitpane_create(obj, (UiSplitPaneArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj))
+#define ui_vsplitpane0(obj) for(ui_vsplitpane_create(obj, (UiSplitPaneArgs){ 0 });ui_container_finish(obj);ui_container_begin_close(obj))
+
 #define ui_tab(obj, label) for(ui_tab_create(obj, label);ui_container_finish(obj);ui_container_begin_close(obj))
 
 #define ui_headerbar_start(obj) for(ui_headerbar_start_create(obj);ui_container_finish(obj);ui_container_begin_close(obj))
@@ -267,8 +294,8 @@
 
 UIEXPORT UIWIDGET ui_itemlist_create(UiObject *obj, UiItemListContainerArgs args);
 
-UIEXPORT UIWIDGET ui_hsplitpane(UiObject *obj, int max); // TODO
-UIEXPORT UIWIDGET ui_vsplitpane(UiObject *obj, int max); // TODO
+UIEXPORT UIWIDGET ui_hsplitpane_create(UiObject *obj, UiSplitPaneArgs args);
+UIEXPORT UIWIDGET ui_vsplitpane_create(UiObject *obj, UiSplitPaneArgs args);
 
 
 // box container layout functions

mercurial