ui/gtk/container.c

changeset 29
3fc287f06305
parent 0
2483f517c562
--- a/ui/gtk/container.c	Sun Feb 11 15:59:56 2024 +0100
+++ b/ui/gtk/container.c	Mon Feb 12 17:32:02 2024 +0100
@@ -67,22 +67,6 @@
 #endif
 }
 
-/* -------------------- Frame Container (deprecated) -------------------- */
-UiContainer* ui_frame_container(UiObject *obj, GtkWidget *frame) {
-    UiContainer *ct = cxCalloc(
-            obj->ctx->allocator,
-            1,
-            sizeof(UiContainer));
-    ct->widget = frame;
-    ct->add = ui_frame_container_add;
-    return ct;
-}
-
-void ui_frame_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) {
-    gtk_container_add(GTK_CONTAINER(ct->widget), widget);
-    ui_reset_layout(ct->layout);
-    ct->current = widget;
-}
 
 
 /* -------------------- Box Container -------------------- */
@@ -243,13 +227,6 @@
 }
 
 
-UIWIDGET ui_vbox(UiObject *obj) {
-    return ui_vbox_sp(obj, 0, 0);
-}
-
-UIWIDGET ui_hbox(UiObject *obj) {
-    return ui_hbox_sp(obj, 0, 0);
-}
 
 static GtkWidget* box_set_margin(GtkWidget *box, int margin) {
     GtkWidget *ret = box;
@@ -272,11 +249,13 @@
     return ret;
 }
 
-UIWIDGET ui_vbox_sp(UiObject *obj, int margin, int spacing) {
-    UiContainer *ct = uic_get_current_container(obj);
+UIWIDGET ui_box_create(UiObject *obj, UiContainerArgs args, UiSubContainerType type) {
+    UiObject *current = uic_current_obj(obj);
+    UiContainer *ct = current->container;
+    UI_APPLY_LAYOUT1(current, args);
     
-    GtkWidget *vbox = ui_gtk_vbox_new(spacing);   
-    GtkWidget *widget = margin > 0 ? box_set_margin(vbox, margin) : vbox;
+    GtkWidget *vbox = ui_gtk_vbox_new(args.spacing);   
+    GtkWidget *widget = args.margin > 0 ? box_set_margin(vbox, args.margin) : vbox;
     ct->add(ct, widget, TRUE);
     
     UiObject *newobj = uic_object_new(obj, vbox);
@@ -286,41 +265,33 @@
     return widget;
 }
 
-UIWIDGET ui_hbox_sp(UiObject *obj, int margin, int spacing) {
-    UiContainer *ct = uic_get_current_container(obj);
-    
-    GtkWidget *hbox = ui_gtk_hbox_new(spacing);
-    GtkWidget *widget = margin > 0 ? box_set_margin(hbox, margin) : hbox;
-    ct->add(ct, widget, TRUE);
-    
-    UiObject *newobj = uic_object_new(obj, hbox);
-    newobj->container = ui_box_container(obj, hbox);
-    uic_obj_add(obj, newobj);
-    
-    return widget;
+UIEXPORT UIWIDGET ui_vbox_create(UiObject *obj, UiContainerArgs args) {
+    return ui_box_create(obj, args, UI_CONTAINER_VBOX);
 }
 
-UIWIDGET ui_grid(UiObject *obj) {
-    return ui_grid_sp(obj, 0, 0, 0);
+UIEXPORT UIWIDGET ui_hbox_create(UiObject *obj, UiContainerArgs args) {
+    return ui_box_create(obj, args, UI_CONTAINER_HBOX);
 }
 
-UIWIDGET ui_grid_sp(UiObject *obj, int margin, int columnspacing, int rowspacing) {
+
+
+UIWIDGET ui_grid_create(UiObject *obj, UiContainerArgs args) {
     UiContainer *ct = uic_get_current_container(obj);
     GtkWidget *widget;
     
 #ifdef UI_GTK3
     GtkWidget *grid = gtk_grid_new();
-    gtk_grid_set_column_spacing(GTK_GRID(grid), columnspacing);
-    gtk_grid_set_row_spacing(GTK_GRID(grid), rowspacing);
+    gtk_grid_set_column_spacing(GTK_GRID(grid), args.columnspacing);
+    gtk_grid_set_row_spacing(GTK_GRID(grid), args.rowspacing);
 #if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION >= 12
-    gtk_widget_set_margin_start(grid, margin);
-    gtk_widget_set_margin_end(grid, margin);
+    gtk_widget_set_margin_start(grid, args.margin);
+    gtk_widget_set_margin_end(grid, args.margin);
 #else
     gtk_widget_set_margin_left(grid, margin);
     gtk_widget_set_margin_right(grid, margin);
 #endif
-    gtk_widget_set_margin_top(grid, margin);
-    gtk_widget_set_margin_bottom(grid, margin);
+    gtk_widget_set_margin_top(grid, args.margin);
+    gtk_widget_set_margin_bottom(grid, args.margin);
     
     widget = grid;
 #elif defined(UI_GTK2)
@@ -347,38 +318,6 @@
     return widget;
 }
 
-UIWIDGET ui_scrolledwindow(UiObject *obj) {
-    UiContainer *ct = uic_get_current_container(obj);
-    GtkWidget *sw = gtk_scrolled_window_new(NULL, NULL);
-    ct->add(ct, sw, TRUE);
-    
-    UiObject *newobj = uic_object_new(obj, sw);
-    newobj->container = ui_scrolledwindow_container(obj, sw);
-    uic_obj_add(obj, newobj);
-    
-    return sw;
-}
-
-UIWIDGET ui_tabview(UiObject *obj) {
-    GtkWidget *tabview = gtk_notebook_new();
-    gtk_notebook_set_show_border(GTK_NOTEBOOK(tabview), FALSE);
-    gtk_notebook_set_show_tabs(GTK_NOTEBOOK(tabview), FALSE);
-    
-    UiContainer *ct = uic_get_current_container(obj);
-    ct->add(ct, tabview, TRUE);
-    
-    UiObject *tabviewobj = uic_object_new(obj, tabview);
-    tabviewobj->container = ui_tabview_container(obj, tabview);
-    uic_obj_add(obj, tabviewobj);
-    
-    return tabview;
-}
-
-void ui_tab(UiObject *obj, char *title) {
-    UiContainer *ct = uic_get_current_container(obj);
-    ct->layout.label = title;
-    ui_vbox(obj);
-}
 
 void ui_select_tab(UIWIDGET tabview, int tab) {
     gtk_notebook_set_current_page(GTK_NOTEBOOK(tabview), tab);
@@ -401,192 +340,9 @@
     return NULL;
 }
 
-UIWIDGET ui_splitpane(UiObject *obj, int max, UiOrientation orientation) {
-    GtkWidget *paned = create_paned(orientation);
-    UiContainer *ct = uic_get_current_container(obj);
-    ct->add(ct, paned, TRUE);
-    
-    if(max <= 0) max = INT_MAX;
-    
-    UiPanedContainer *pctn = cxCalloc(
-            obj->ctx->allocator,
-            1,
-            sizeof(UiPanedContainer));
-    pctn->container.widget = paned;
-    pctn->container.add = ui_paned_container_add;
-    pctn->current_pane = paned;
-    pctn->orientation = orientation;
-    pctn->max = max;
-    pctn->cur = 0;
-    
-    UiObject *pobj = uic_object_new(obj, paned);
-    pobj->container = (UiContainer*)pctn;
-    
-    uic_obj_add(obj, pobj);
-    
-    return paned;
-}
-
-UIWIDGET ui_hsplitpane(UiObject *obj, int max) {
-    return ui_splitpane(obj, max, UI_HORIZONTAL);
-}
-
-UIWIDGET ui_vsplitpane(UiObject *obj, int max) {
-    return ui_splitpane(obj, max, UI_VERTICAL);
-}
-
-void ui_paned_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) {
-    UiPanedContainer *pctn = (UiPanedContainer*)ct;
-    
-    gboolean resize = (ct->layout.hexpand || ct->layout.vexpand) ? TRUE : FALSE;
-    int width = ct->layout.width;
-    ui_reset_layout(ct->layout);
-    
-    if(pctn->cur == 0) {
-        gtk_paned_pack1(GTK_PANED(pctn->current_pane), widget, resize, resize);
-    } else if(pctn->cur < pctn->max-1) {
-        GtkWidget *nextPane = create_paned(pctn->orientation);
-        gtk_paned_pack2(GTK_PANED(pctn->current_pane), nextPane, TRUE, TRUE);
-        gtk_paned_pack1(GTK_PANED(nextPane), widget, resize, resize);
-        pctn->current_pane = nextPane;
-    } else if(pctn->cur == pctn->max-1) {
-        gtk_paned_pack2(GTK_PANED(pctn->current_pane), widget, resize, resize);
-        width = 0; // disable potential call of gtk_paned_set_position
-    } else {
-        fprintf(stderr, "Splitpane max reached: %d\n", pctn->max);
-        return;
-    }
-    
-    if(width > 0) {
-        gtk_paned_set_position(GTK_PANED(pctn->current_pane), width);
-    }
-    
-    pctn->cur++;
-}
 
 
-/* -------------------- Sidebar (deprecated) -------------------- */
-UIWIDGET ui_sidebar(UiObject *obj) {
-#ifdef UI_GTK3
-    GtkWidget *paned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
-#else
-    GtkWidget *paned = gtk_hpaned_new();
-#endif
-    gtk_paned_set_position(GTK_PANED(paned), 200);
-    
-    GtkWidget *sidebar = ui_gtk_vbox_new(0);
-    gtk_paned_pack1(GTK_PANED(paned), sidebar, TRUE, FALSE);
-    
-    UiObject *left = uic_object_new(obj, sidebar);
-    UiContainer *ct1 = ui_box_container(obj, sidebar);
-    left->container = ct1;
-    
-    UiObject *right = uic_object_new(obj, sidebar);
-    UiContainer *ct2 = cxCalloc(
-            obj->ctx->allocator,
-            1,
-            sizeof(UiContainer));
-    ct2->widget = paned;
-    ct2->add = ui_split_container_add2;
-    right->container = ct2;
-    
-    UiContainer *ct = uic_get_current_container(obj);
-    ct->add(ct, paned, TRUE);
-    
-    uic_obj_add(obj, right);
-    uic_obj_add(obj, left);
-    
-    return sidebar;
-}
 
-void ui_split_container_add1(UiContainer *ct, GtkWidget *widget, UiBool fill) {
-    // TODO: remove
-    gtk_paned_pack1(GTK_PANED(ct->widget), widget, TRUE, FALSE);
-    
-    ui_reset_layout(ct->layout);
-    ct->current = widget;
-}
-
-void ui_split_container_add2(UiContainer *ct, GtkWidget *widget, UiBool fill) {
-    gtk_paned_pack2(GTK_PANED(ct->widget), widget, TRUE, FALSE);
-    
-    ui_reset_layout(ct->layout);
-    ct->current = widget;
-}
-
-
-/* -------------------- Document Tabview -------------------- */
-static void page_change(GtkNotebook *notebook, GtkWidget *page, guint page_num, gpointer data) {
-    GQuark q = g_quark_from_static_string("ui.tab.object");
-    UiObject *tab = g_object_get_qdata(G_OBJECT(page), q);
-    if(!tab) {
-        return;
-    }
-    
-    //printf("page_change: %d\n", page_num);
-    UiContext *ctx = tab->ctx;
-    uic_context_detach_all(ctx->parent); // TODO: fix?
-    ctx->parent->attach_document(ctx->parent, ctx->document);
-}
-
-UiTabbedPane* ui_tabbed_document_view(UiObject *obj) {
-    GtkWidget *tabview = gtk_notebook_new();
-    gtk_notebook_set_show_border(GTK_NOTEBOOK(tabview), FALSE);
-    
-    g_signal_connect(
-                tabview,
-                "switch-page",
-                G_CALLBACK(page_change),
-                NULL);
-    
-    UiContainer *ct = uic_get_current_container(obj);
-    ct->add(ct, tabview, TRUE);
-    
-    UiTabbedPane *tabbedpane = ui_malloc(obj->ctx, sizeof(UiTabbedPane));
-    tabbedpane->ctx = uic_current_obj(obj)->ctx;
-    tabbedpane->widget = tabview;
-    tabbedpane->document = NULL;
-    
-    return tabbedpane;
-}
-
-UiObject* ui_document_tab(UiTabbedPane *view) {
-    GtkWidget *frame = gtk_frame_new(NULL);
-    gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_NONE);
-    // TODO: label
-    gtk_notebook_append_page(GTK_NOTEBOOK(view->widget), frame, NULL);
-    
-    UiObject *tab = ui_malloc(view->ctx, sizeof(UiObject));
-    tab->widget = NULL; // initialization for uic_context()
-    tab->ctx = uic_context(tab, view->ctx->allocator);
-    tab->ctx->parent = view->ctx;
-    tab->ctx->attach_document = uic_context_attach_document;
-    tab->ctx->detach_document2 = uic_context_detach_document2;
-    tab->widget = frame;
-    tab->window = view->ctx->obj->window;
-    tab->container = ui_frame_container(tab, frame);
-    tab->next = NULL;
-    
-    GQuark q = g_quark_from_static_string("ui.tab.object");
-    g_object_set_qdata(G_OBJECT(frame), q, tab);
-    
-    return tab;
-}
-
-void ui_tab_set_document(UiContext *ctx, void *document) {
-    // TODO: remove?
-    if(ctx->parent->document) {
-        //ctx->parent->detach_document(ctx->parent, ctx->parent->document);
-    }
-    //uic_context_set_document(ctx, document);
-    //uic_context_set_document(ctx->parent, document);
-    //ctx->parent->document = document;
-}
-
-void ui_tab_detach_document(UiContext *ctx) {
-    // TODO: remove?
-    //uic_context_detach_document(ctx->parent);
-}
 
 
 /*
@@ -611,16 +367,21 @@
     ct->layout.vexpand = expand;
 }
 
-void ui_layout_width(UiObject *obj, int width) {
-    UiContainer *ct = uic_get_current_container(obj);
-    ct->layout.width = width;
-}
-
 void ui_layout_gridwidth(UiObject *obj, int width) {
     UiContainer *ct = uic_get_current_container(obj);
     ct->layout.gridwidth = width;
 }
 
+void ui_layout_colspan(UiObject* obj, int cols) {
+    UiContainer* ct = uic_get_current_container(obj);
+    ct->layout.colspan = cols;
+}
+
+void ui_layout_rowspan(UiObject* obj, int rows) {
+    UiContainer* ct = uic_get_current_container(obj);
+    ct->layout.rowspan = rows;
+}
+
 void ui_newline(UiObject *obj) {
     UiContainer *ct = uic_get_current_container(obj);
     ct->layout.newline = TRUE;

mercurial