#include #include using namespace bwidgets; auto AlignedLayout::size() const noexcept -> Size { Size min_size {0, 0}; if (alignment == Alignment::HORIZONTAL) { for (const auto* w : _widgets) { if (w->size().w > min_size.w) min_size.w = w->size().w; if (w->size().h > min_size.h) min_size.h = w->size().h; } return {(int)_widgets.size() * min_size.w + ((int)_widgets.size() + 1) * margins.w, min_size.h + 2 * margins.h}; } for (const auto* w : _widgets) { if (w->size().w > min_size.w) min_size.w = w->size().w; min_size.h += w->size().h; } return {min_size.w + 2 * margins.w, min_size.h + ((int)_widgets.size() + 1) * margins.h}; } void AlignedLayout::_update_layout(const SDL_Rect& vp) noexcept { if (alignment == Alignment::HORIZONTAL) { int widget_width = (vp.w - ((int)_widgets.size() + 1) * margins.w) / (int)_widgets.size(); for (std::vector::size_type i = 0; i < _widgets.size(); i++) { auto* w = _widgets[i]; w->viewport({vp.x + margins.w + (int)i * (widget_width + margins.w), vp.y + center_line(vp.h, w->size().h), widget_width, w->size().h}); } } else { int offset = 0; for (std::vector::size_type i = 0; i < _widgets.size(); i++) { auto* w = _widgets[i]; w->viewport({ vp.x, vp.y + ((int)i + 1) * margins.h + offset, vp.w, w->size().h, }); offset += w->size().h; } } }