11export module CppUtils.Terminal.Layout;
22
33import std;
4+ import CppUtils.Container.Size;
45import CppUtils.Terminal.Area;
56
67export namespace CppUtils::Terminal
78{
89 class Layout: public Widget
910 {
1011 public:
12+ enum class Direction
13+ {
14+ Horizontal,
15+ Vertical
16+ };
17+
1118 virtual ~Layout() = default;
1219
1320 template<std::derived_from<Widget> T>
@@ -17,12 +24,55 @@ export namespace CppUtils::Terminal
1724 return dynamic_cast<T&>(*m_widgets.emplace_back(std::move(widget)));
1825 }
1926
27+ [[nodiscard]] inline auto getSize() const noexcept -> Container::Size2 final
28+ {
29+ auto totalSize = Container::Size2{0, 0};
30+ for (const auto& widget : m_widgets)
31+ {
32+ if (direction == Direction::Horizontal)
33+ {
34+ totalSize.width() += widget->getSize().width();
35+ totalSize.height() = std::max(totalSize.height(), widget->getSize().height());
36+ }
37+ else
38+ {
39+ totalSize.width() = std::max(totalSize.width(), widget->getSize().width());
40+ totalSize.height() += widget->getSize().height();
41+ }
42+ }
43+ return totalSize;
44+ }
45+
2046 inline auto draw(WritableAreaView& view) noexcept -> void override final
2147 {
48+ auto origin = view.getViewport().getPosition();
49+ auto size = view.getViewport().getSize();
2250 for (const auto& widget : m_widgets)
23- widget->draw(view);
51+ {
52+ auto widgetSize = widget->getSize();
53+ widgetSize.width() = std::min(widgetSize.width(), size.width());
54+ widgetSize.height() = std::min(widgetSize.height(), size.height());
55+
56+ auto subview = view.getSubView(Viewport{widgetSize, origin});
57+ if (not subview)
58+ continue;
59+ widget->draw(subview.value());
60+
61+ if (direction == Direction::Horizontal and size.width() < widgetSize.width())
62+ {
63+ origin.width() += widgetSize.width();
64+ size.width() -= widgetSize.width();
65+ }
66+ else
67+ {
68+ origin.height() += widgetSize.height();
69+ size.height() -= widgetSize.height();
70+ }
71+ }
2472 }
2573
74+ Direction direction = Direction::Vertical;
75+
2676 private:
2777 std::vector<std::unique_ptr<Widget>> m_widgets;
2878 };
0 commit comments