ui/qt/container.cpp

changeset 103
6606616eca9f
parent 0
2483f517c562
child 108
77254bd6dccb
--- a/ui/qt/container.cpp	Tue Feb 25 21:11:00 2025 +0100
+++ b/ui/qt/container.cpp	Sat Apr 05 16:46:11 2025 +0200
@@ -28,16 +28,31 @@
 
 #include <stdio.h>
 #include "container.h"
+#include "../common/object.h"
+
+#include <cx/mempool.h>
 
 #include <QSpacerItem>
 #include <QStackedWidget>
+#include <QLabel>
 
+static void delete_container(UiContainerPrivate *ct) {
+    delete ct;
+}
+
+void ui_container_add(UiObject *obj, UiContainerPrivate *ct) {
+    UiContainerX *container = (UiContainerX*)ui_malloc(obj->ctx, sizeof(UiContainerX));
+    container->close = 0;
+    container->container = ct;
+    container->prev = NULL;
+    container->next = NULL;
+    cxMempoolRegister(obj->ctx->mp, ct, (cx_destructor_func)delete_container);
+    uic_object_push_container(obj, container);
+}
 
 /* -------------------- UiBoxContainer -------------------- */
 
 UiBoxContainer::UiBoxContainer(QBoxLayout* box) {
-    this->current = NULL;
-    this->menu = NULL;
     this->box = box;
     box->setContentsMargins(QMargins(0,0,0,0));
     box->setSpacing(0);
@@ -71,36 +86,47 @@
     current = widget;
 }
 
-UIWIDGET ui_box(UiObject *obj, QBoxLayout::Direction dir) {
-    UiContainer *ct = uic_get_current_container(obj);
+UIWIDGET ui_box(UiObject *obj, UiContainerArgs args, QBoxLayout::Direction dir) {
+    UiContainerPrivate *ctn = (UiContainerPrivate*)ui_obj_container(obj);
+    UI_APPLY_LAYOUT(ctn->layout, args);
+    
     QWidget *widget = new QWidget();
     QBoxLayout *box = new QBoxLayout(dir);
     widget->setLayout(box);
-    ct->add(widget, true);
+    ctn->add(widget, true);
     
-    UiObject *newobj = uic_object_new(obj, widget);
-    newobj->container = new UiBoxContainer(box);
-    uic_obj_add(obj, newobj);
+    ui_container_add(obj, new UiBoxContainer(box));
     
     return widget;
 }
 
-UIWIDGET ui_vbox(UiObject *obj) {
-    return ui_box(obj, QBoxLayout::TopToBottom);
+UIWIDGET ui_vbox_create(UiObject *obj, UiContainerArgs args) {
+    return ui_box(obj, args, QBoxLayout::TopToBottom);
 }
 
-UIWIDGET ui_hbox(UiObject *obj) {
-    return ui_box(obj, QBoxLayout::LeftToRight);
+UIWIDGET ui_hbox_create(UiObject *obj, UiContainerArgs args) {
+    return ui_box(obj, args, QBoxLayout::LeftToRight);
 }
 
 
-
 /* -------------------- UiGridContainer -------------------- */
 
-UiGridContainer::UiGridContainer(QGridLayout* grid, int margin, int columnspacing, int rowspacing) {
+UiGridContainer::UiGridContainer(
+        QGridLayout *grid,
+        int margin,
+        int columnspacing,
+        int rowspacing,
+        bool def_hexpand,
+        bool def_vexpand,
+        bool def_hfill,
+        bool def_vfill)
+{
     this->current = NULL;
-    this->menu = NULL;
     this->grid = grid;
+    this->def_hexpand = def_hexpand;
+    this->def_vexpand = def_vexpand;
+    this->def_hfill = def_hfill;
+    this->def_vfill = def_vfill;
     grid->setContentsMargins(QMargins(margin, margin, margin, margin));
     grid->setHorizontalSpacing(columnspacing);
     grid->setVerticalSpacing(rowspacing);
@@ -113,144 +139,149 @@
         y++;
     }
     
-    Qt::Alignment alignment = Qt::AlignTop;
-    grid->setColumnStretch(x, layout.hexpand ? 1 : 0);
-    if(layout.vexpand) {
-        grid->setRowStretch(y, 1);
-        alignment = 0;
-    } else {
-        grid->setRowStretch(y, 0);
+    int hexpand = false;
+    int vexpand = false;
+    int hfill = false;
+    int vfill = false;
+    if(!layout.override_defaults) {
+        if(def_hexpand) {
+            hexpand = true;
+            hfill = true;
+        } else if(def_hfill) {
+            hfill = true;
+        }
+        if(def_vexpand) {
+            vexpand = true;
+            vfill = true;
+        } else if(def_vfill) {
+            vfill = true;
+        }
     }
     
-    int gwidth = layout.gridwidth > 0 ? layout.gridwidth : 1;
+    if(layout.fill != UI_LAYOUT_UNDEFINED) {
+        fill = ui_lb2bool(layout.fill);
+    }
+    if(layout.hexpand) {
+        hexpand = true;
+        //hfill = true;
+    } else if(layout.hfill) {
+        hfill = true;
+    }
+    if(layout.vexpand) {
+        vexpand = true;
+        //vfill = true;
+    } else if(layout.vfill) {
+        vfill = true;
+    }
+    if(fill) {
+        hfill = true;
+        vfill = true;
+    }
+    
+    if(hexpand) {
+        col_expanding = true;
+    }
+    if(vexpand) {
+        row_expanding = true;
+    }
     
-    grid->addWidget(widget, y, x, 1, gwidth, alignment);
-    x += gwidth;
+    if(hexpand) {
+        grid->setColumnStretch(x, 1);
+    }
+    if(vexpand) {
+        grid->setRowStretch(y, 1);
+    }
+    
+    Qt::Alignment alignment = 0;
+    if(!hfill) {
+        alignment = Qt::AlignLeft;
+    }
+    if(!vfill) {
+        alignment = Qt::AlignTop;
+    }
+    
+    int colspan = layout.colspan > 0 ? layout.colspan : 1;
+    int rowspan = layout.rowspan > 0 ? layout.rowspan : 1;
+    
+    grid->addWidget(widget, y, x, rowspan, colspan, alignment);
+    
+    if(x > max_x) {
+        max_x = x;
+    }
+    if(y > max_y) {
+        max_y = y;
+    }
+    
+    x += colspan;
     
     ui_reset_layout(layout);
     current = widget;
 }
 
-UIWIDGET ui_grid(UiObject *obj) {
-    return ui_grid_sp(obj, 0, 0, 0);
+void UiGridContainer::end() {
+    if(!col_expanding) {
+        QSpacerItem *filler = new QSpacerItem(0, 0);
+        x = max_x + 1;
+        grid->setColumnStretch(x, 1);
+        grid->addItem(filler, 0, x, 1, 1, 0);
+    }
+    if(!row_expanding) {
+        QSpacerItem *filler = new QSpacerItem(0, 0);
+        y++;
+        grid->setRowStretch(y, 1);
+        grid->addItem(filler, y, 0, 1, 1, 0);
+    }
 }
 
-UIWIDGET ui_grid_sp(UiObject *obj, int margin, int columnspacing, int rowspacing) {
-    UiContainer *ct = uic_get_current_container(obj);
+UIEXPORT UIWIDGET ui_grid_create(UiObject *obj, UiContainerArgs args) {
+    UiContainerPrivate *ctn = (UiContainerPrivate*)ui_obj_container(obj);
+    UI_APPLY_LAYOUT(ctn->layout, args);
+    
     QWidget *widget = new QWidget();
     QGridLayout *grid = new QGridLayout();
     widget->setLayout(grid);
-    ct->add(widget, true);
+    ctn->add(widget, true);
     
-    UiObject *newobj = uic_object_new(obj, widget);
-    newobj->container = new UiGridContainer(grid, margin, columnspacing, rowspacing);
-    uic_obj_add(obj, newobj);
+    ui_container_add(obj, new UiGridContainer(
+            grid,
+            args.margin,
+            args.columnspacing,
+            args.rowspacing,
+            args.def_hexpand,
+            args.def_vexpand,
+            args.def_hfill,
+            args.def_vfill));
     
     return widget;
 }
 
 
-/* -------------------- UiTabViewContainer -------------------- */
 
-UiTabViewContainer::UiTabViewContainer(QTabWidget* tabwidget) {
-    this->current = NULL;
-    this->menu = NULL;
-    this->tabwidget = tabwidget;
-}
+/* -------------------- Container Helper Functions -------------------- */
 
-void UiTabViewContainer::add(QWidget* widget, bool fill) {
-    QString str = QString::fromUtf8(layout.label);
-    tabwidget->addTab(widget, str);
-}
-
-
-/* -------------------- UiStackContainer -------------------- */
-
-UiStackContainer::UiStackContainer(QStackedWidget *stack) {
-    this->stack = stack;
+void ui_container_begin_close(UiObject *obj) {
+    obj->container_end->close = true;
 }
 
-void UiStackContainer::add(QWidget* widget, bool fill) {
-    stack->addWidget(widget);
-    current = widget;
-}
-
-UIWIDGET ui_tabview(UiObject *obj) {
-    QStackedWidget *tabwidget = new QStackedWidget();
-    
-    UiContainer *ct = uic_get_current_container(obj);
-    ct->add(tabwidget, true);
-    
-    UiObject *tabviewobj = uic_object_new(obj, tabwidget);
-    tabviewobj->container = new UiStackContainer(tabwidget);
-    uic_obj_add(obj, tabviewobj);
-    
-    return tabwidget;
-}
-
-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) {
-    QStackedWidget *w = (QStackedWidget*)tabview;
-    w->setCurrentIndex(tab);
+int ui_container_finish(UiObject *obj) {
+    if(obj->container_end->close) {
+        UiContainerPrivate *ctn = (UiContainerPrivate*)obj->container_end->container;
+        ctn->end();
+        ui_end_new(obj);
+        return 0;
+    }
+    return 1;
 }
 
 
-/* -------------------- UiSidebarContainer -------------------- */
-
-UiSidebarContainer::UiSidebarContainer(QSplitter *splitter) {
-    this->splitter = splitter;
-}
-
-UIWIDGET ui_sidebar(UiObject *obj) {
-    QSplitter *splitter = new QSplitter(Qt::Horizontal);
-    UiContainer *ct = uic_get_current_container(obj);
-    ct->add(splitter, true);
-    
-    UiObject *left = uic_object_new(obj, splitter);
-    left->container = new UiSidebarContainer(splitter);
-    
-    UiObject *right = uic_object_new(obj, splitter);
-    right->container = new UiSidebarContainer(splitter);
-    
-    uic_obj_add(obj, right);
-    uic_obj_add(obj, left);
-    
-    return splitter;
-}
-
-void UiSidebarContainer::add(QWidget *widget, bool fill) {
-    splitter->addWidget(widget);
-}
-
-
-/* -------------------- layout functions -------------------- */
-
-void ui_layout_fill(UiObject *obj, UiBool fill) {
-    UiContainer *ct = uic_get_current_container(obj);
-    ct->layout.fill = ui_bool2lb(fill);
-}
-
-void ui_layout_hexpand(UiObject *obj, UiBool expand) {
-    UiContainer *ct = uic_get_current_container(obj);
-    ct->layout.hexpand = expand;
-}
-
-void ui_layout_vexpand(UiObject *obj, UiBool expand) {
-    UiContainer *ct = uic_get_current_container(obj);
-    ct->layout.vexpand = expand;
-}
-
-void ui_layout_gridwidth(UiObject *obj, int width) {
-    UiContainer *ct = uic_get_current_container(obj);
-    ct->layout.gridwidth = width;
-}
+/*
+ * -------------------- Layout Functions --------------------
+ * 
+ * functions for setting layout attributes for the current container
+ *
+ */
 
 void ui_newline(UiObject *obj) {
-    UiContainer *ct = uic_get_current_container(obj);
+    UiContainerPrivate *ct = ui_obj_container(obj);
     ct->layout.newline = TRUE;
 }

mercurial