2021-08-06 14:22:56 +02:00
|
|
|
#ifndef BWIDGETS_ALIGNED_LAYOUT_HPP
|
|
|
|
#define BWIDGETS_ALIGNED_LAYOUT_HPP
|
|
|
|
|
2021-08-14 11:20:26 +02:00
|
|
|
#include <basic_widgets/core/math.hpp>
|
2021-08-06 14:22:56 +02:00
|
|
|
#include <basic_widgets/w/base/layout.hpp>
|
|
|
|
|
|
|
|
namespace bwidgets
|
|
|
|
{
|
2021-08-14 11:20:26 +02:00
|
|
|
enum struct LayoutAlignment
|
|
|
|
{
|
|
|
|
HORIZONTAL,
|
|
|
|
VERTICAL
|
|
|
|
};
|
|
|
|
|
|
|
|
template<LayoutAlignment alignment>
|
2021-08-06 14:22:56 +02:00
|
|
|
class AlignedLayout final : public Layout
|
|
|
|
{
|
|
|
|
private:
|
2021-08-14 11:20:26 +02:00
|
|
|
void _update_layout(const SDL_Rect& vp) override
|
2021-08-06 14:22:56 +02:00
|
|
|
{
|
2021-08-14 11:20:26 +02:00
|
|
|
if constexpr (alignment == LayoutAlignment::HORIZONTAL) {
|
|
|
|
int widget_width =
|
|
|
|
(vp.w - ((int)_widgets.size() + 1) * margins.w) / (int)_widgets.size();
|
|
|
|
|
|
|
|
for (std::vector<Widget*>::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<Widget*>::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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-08-06 14:22:56 +02:00
|
|
|
|
2021-08-14 11:20:26 +02:00
|
|
|
public:
|
|
|
|
AlignedLayout(Widget* p = nullptr) noexcept : Layout(p) {}
|
2021-08-06 14:22:56 +02:00
|
|
|
|
2021-08-12 23:50:22 +02:00
|
|
|
AlignedLayout(const AlignedLayout&) = delete;
|
2021-08-14 09:25:28 +02:00
|
|
|
AlignedLayout(AlignedLayout&&) = delete;
|
|
|
|
~AlignedLayout() override = default;
|
2021-08-12 23:50:22 +02:00
|
|
|
auto operator=(const AlignedLayout&) = delete;
|
|
|
|
auto operator=(AlignedLayout&&) = delete;
|
|
|
|
|
2021-08-14 11:20:26 +02:00
|
|
|
[[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};
|
|
|
|
}
|
2021-08-06 14:22:56 +02:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|