--- a/ui/qt/container.cpp Thu Oct 09 11:44:10 2025 +0200 +++ b/ui/qt/container.cpp Thu Oct 09 12:49:53 2025 +0200 @@ -42,7 +42,7 @@ delete ct; } -void ui_container_add(UiObject *obj, UiContainerPrivate *ct) { +void ui_obj_add_container(UiObject *obj, UiContainerPrivate *ct) { UiContainerX *container = (UiContainerX*)ui_malloc(obj->ctx, sizeof(UiContainerX)); container->close = 0; container->container = ct; @@ -53,10 +53,27 @@ uic_object_push_container(obj, container); } +/* ------------------------ margin helper ------------------------ */ + +QWidget* ui_widget_set_margin(QWidget *w, int left, int right, int top, int bottom) { + if((left | right | top | bottom) == 0) { + return w; + } + QWidget* wrapper = new QWidget; + QVBoxLayout* inner = new QVBoxLayout(wrapper); + inner->setContentsMargins(left, top, right, bottom); + inner->addWidget(w); + + // TODO: handle widget visibility changes + + return wrapper; +} + /* -------------------- UiBoxContainer -------------------- */ UiBoxContainer::UiBoxContainer(QBoxLayout* box) { this->box = box; + this->direction = box->direction(); box->setContentsMargins(QMargins(0,0,0,0)); box->setSpacing(0); } @@ -68,7 +85,12 @@ fprintf(stderr, "UiError: container has 2 filled widgets"); } + uic_layout_setup_margin(&layout); + widget = ui_widget_set_margin(widget, layout.margin_left, layout.margin_right, layout.margin_top, layout.margin_bottom); box->addWidget(widget); + if(direction == Qt::LeftToRight) { + box->setAlignment(widget, Qt::AlignTop); + } if(!hasStretchedWidget) { QSpacerItem *newspace = new QSpacerItem(0, 0, QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); @@ -92,7 +114,7 @@ widget->setLayout(box); ctn->add(widget, layout); - ui_container_add(obj, new UiBoxContainer(box)); + ui_obj_add_container(obj, new UiBoxContainer(box)); return widget; } @@ -137,6 +159,7 @@ } uic_layout_setup_expand_fill(&layout, def_hexpand, def_vexpand, def_hfill, def_vfill); + uic_layout_setup_margin(&layout); if(layout.hexpand) { col_expanding = true; @@ -163,6 +186,7 @@ int colspan = layout.colspan > 0 ? layout.colspan : 1; int rowspan = layout.rowspan > 0 ? layout.rowspan : 1; + widget = ui_widget_set_margin(widget, layout.margin_left, layout.margin_right, layout.margin_top, layout.margin_bottom); grid->addWidget(widget, y, x, rowspan, colspan, alignment); if(x > max_x) { @@ -201,7 +225,7 @@ widget->setLayout(grid); ctn->add(widget, layout); - ui_container_add(obj, new UiGridContainer( + ui_obj_add_container(obj, new UiGridContainer( grid, args->margin, args->columnspacing, @@ -230,7 +254,7 @@ widget->setLayout(box); dock->setWidget(widget); - ui_container_add(obj, new UiBoxContainer(box)); + ui_obj_add_container(obj, new UiBoxContainer(box)); return dock; }