5 weeks ago
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