bwidgets/inc/basic_widgets/w/aligned_layout.hpp

84 lines
2.7 KiB
C++
Raw Normal View History

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