diff --git a/examples/run.hpp b/examples/run.hpp index 963b91d..793babe 100644 --- a/examples/run.hpp +++ b/examples/run.hpp @@ -47,11 +47,11 @@ void run_example( std::make_shared(win(), -1, SDL_RENDERER_ACCELERATED); renderer->blend_mode(SDL_BLENDMODE_BLEND); - bwidgets::AlignedLayout layout(bwidgets::AlignedLayout::Alignment::HORIZONTAL); + bwidgets::AlignedLayout layout; for (auto x = 0; x < w; x++) { - auto col = std::make_unique( - bwidgets::AlignedLayout::Alignment::VERTICAL); + auto col = std::make_unique< + bwidgets::AlignedLayout>(); for (auto y = 0; y < h; y++) { auto widget = std::make_unique(); setup(widget.get(), font, x, y); diff --git a/inc/basic_widgets/w/aligned_layout.hpp b/inc/basic_widgets/w/aligned_layout.hpp index 96f102d..247bb91 100644 --- a/inc/basic_widgets/w/aligned_layout.hpp +++ b/inc/basic_widgets/w/aligned_layout.hpp @@ -1,25 +1,51 @@ #ifndef BWIDGETS_ALIGNED_LAYOUT_HPP #define BWIDGETS_ALIGNED_LAYOUT_HPP +#include #include namespace bwidgets { + enum struct LayoutAlignment + { + HORIZONTAL, + VERTICAL + }; + + template class AlignedLayout final : public Layout { private: - void _update_layout(const SDL_Rect&) override; + void _update_layout(const SDL_Rect& vp) override + { + if constexpr (alignment == LayoutAlignment::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++) { + const 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++) { + const 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; + } + } + } public: - enum struct Alignment - { - HORIZONTAL, - VERTICAL - } alignment; - - AlignedLayout(Alignment align, Widget* p = nullptr) noexcept - : Layout(p), alignment(align) - {} + AlignedLayout(Widget* p = nullptr) noexcept : Layout(p) {} AlignedLayout(const AlignedLayout&) = delete; AlignedLayout(AlignedLayout&&) = delete; @@ -27,7 +53,30 @@ namespace bwidgets auto operator=(const AlignedLayout&) = delete; auto operator=(AlignedLayout&&) = delete; - [[nodiscard]] auto size() const noexcept -> Size override; + [[nodiscard]] auto size() const noexcept -> Size override + { + Size min_size {0, 0}; + + if constexpr (alignment == LayoutAlignment::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}; + } }; } diff --git a/meson.build b/meson.build index ae65067..84be9ca 100644 --- a/meson.build +++ b/meson.build @@ -25,7 +25,6 @@ libbasic_widgets = static_library('basic_widgets', 'src/core/font.cpp', 'src/core/renderer.cpp', 'src/core/texture.cpp', - 'src/w/aligned_layout.cpp', 'src/w/base/layout.cpp', 'src/w/base/widget.cpp', 'src/w/button.cpp', diff --git a/src/w/aligned_layout.cpp b/src/w/aligned_layout.cpp deleted file mode 100644 index b174f45..0000000 --- a/src/w/aligned_layout.cpp +++ /dev/null @@ -1,57 +0,0 @@ -#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) -{ - 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++) { - const 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++) { - const 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; - } - } -}