bool UIHorizontalLayout::internalUpdate() { UIWidgetPtr parentWidget = getParentWidget(); if(!parentWidget) return false; UIWidgetList widgets = parentWidget->getChildren(); if(m_alignRight) std::reverse(widgets.begin(), widgets.end()); bool changed = false; Rect paddingRect = parentWidget->getPaddingRect(); Point pos = (m_alignRight) ? paddingRect.topRight() : paddingRect.topLeft(); int preferredWidth = 0; int gap; for(const UIWidgetPtr& widget : widgets) { if(!widget->isExplicitlyVisible()) continue; Size size = widget->getSize(); gap = (m_alignRight) ? -(widget->getMarginRight()+widget->getWidth()) : widget->getMarginLeft(); pos.x += gap; preferredWidth += gap; if(widget->isFixedSize()) { if(widget->getTextAlign() & Fw::AlignTop) { pos.y = paddingRect.top() + widget->getMarginTop(); } else if(widget->getTextAlign() & Fw::AlignBottom) { pos.y = paddingRect.bottom() - widget->getHeight() - widget->getMarginBottom(); pos.y = std::max<int>(pos.y, paddingRect.top()); } else { // center it pos.y = paddingRect.top() + (paddingRect.height() - (widget->getMarginTop() + widget->getHeight() + widget->getMarginBottom()))/2; pos.y = std::max<int>(pos.y, paddingRect.top()); } } else { // expand height size.setHeight(paddingRect.height() - (widget->getMarginTop() + widget->getMarginBottom())); pos.y = paddingRect.top() + (paddingRect.height() - size.height())/2; } if(widget->setRect(Rect(pos - parentWidget->getVirtualOffset(), size))) changed = true; gap = (m_alignRight) ? -widget->getMarginLeft() : (widget->getWidth() + widget->getMarginRight()); gap += m_spacing; pos.x += gap; preferredWidth += gap; } preferredWidth -= m_spacing; preferredWidth += parentWidget->getPaddingLeft() + parentWidget->getPaddingRight(); if(m_fitChildren && preferredWidth != parentWidget->getWidth()) { // must set the preferred width later g_dispatcher.addEvent([=] { parentWidget->setWidth(preferredWidth); }); } return changed; }