diff -r 64ded9f6a6c6 -r 6606616eca9f ui/qt/container.cpp --- 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 #include "container.h" +#include "../common/object.h" + +#include #include #include +#include +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; }