HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
grid_layout_widget.hpp
1// Copyright Take Vos 2020.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
4
5#pragma once
6
7#include "abstract_container_widget.hpp"
8#include "grid_layout_delegate.hpp"
9#include "../geometry/spread_sheet_address.hpp"
10#include "../GUI/theme.hpp"
11#include "../flow_layout.hpp"
12#include <memory>
13
14namespace tt {
15
17public:
19
23 std::weak_ptr<grid_layout_delegate> delegate = {}) noexcept :
24 abstract_container_widget(window, parent), _delegate(delegate)
25 {
26 }
27
29 {
30 if (auto delegate_ = _delegate.lock()) {
31 delegate_->deinit(*this);
32 }
33 }
34
35 void init() noexcept override
36 {
37 if (auto delegate_ = _delegate.lock()) {
38 delegate_->init(*this);
39 }
40 }
41
42 [[nodiscard]] bool
43 update_constraints(hires_utc_clock::time_point display_time_point, bool need_reconstrain) noexcept override;
44 [[nodiscard]] void update_layout(hires_utc_clock::time_point display_time_point, bool need_layout) noexcept override;
45
46 /* Add a widget to the grid.
47 */
48 std::shared_ptr<widget> add_widget(size_t column_nr, size_t row_nr, std::shared_ptr<widget> childWidget) noexcept;
49
54 template<typename T, typename... Args>
55 std::shared_ptr<T> make_widget(size_t column_nr, size_t row_nr, Args &&...args)
56 {
57 auto tmp = std::make_shared<T>(window, shared_from_this(), std::forward<Args>(args)...);
58 tmp->init();
59 return std::static_pointer_cast<T>(add_widget(column_nr, row_nr, std::move(tmp)));
60 }
61
66 template<typename T, typename... Args>
67 std::shared_ptr<T> make_widget(std::string_view address, Args &&...args)
68 {
69 ttlet [column_nr, row_nr] = parse_absolute_spread_sheet_address(address);
70 return make_widget<T>(column_nr, row_nr, std::forward<Args>(args)...);
71 }
72
73private:
74 struct cell {
75 size_t column_nr;
76 size_t row_nr;
78
79 cell(size_t column_nr, size_t row_nr, std::shared_ptr<tt::widget> widget) noexcept :
80 column_nr(column_nr), row_nr(row_nr), widget(std::move(widget))
81 {
82 }
83
84 [[nodiscard]] aarectangle rectangle(flow_layout const &columns, flow_layout const &rows, float container_height) const noexcept
85 {
86 ttlet[x, width] = columns.get_offset_and_size(column_nr);
87 ttlet[y, height] = rows.get_offset_and_size(row_nr);
88
89 return {x, container_height - y - height, width, height};
90 };
91 };
92
93 std::vector<cell> _cells;
94
96
97 flow_layout _rows;
98 flow_layout _columns;
99
100 [[nodiscard]] static std::pair<size_t, size_t> calculate_grid_size(std::vector<cell> const &cells) noexcept;
101 [[nodiscard]] static extent2
102 calculate_cell_min_size(std::vector<cell> const &cells, flow_layout &rows, flow_layout &columns) noexcept;
103 [[nodiscard]] bool address_in_use(size_t column_nr, size_t row_nr) const noexcept;
104};
105
106} // namespace tt
Definition gui_window.hpp:37
Definition abstract_container_widget.hpp:11
Definition grid_layout_widget.hpp:16
void init() noexcept override
Should be called right after allocating and constructing a widget.
Definition grid_layout_widget.hpp:35
bool update_constraints(hires_utc_clock::time_point display_time_point, bool need_reconstrain) noexcept override
Update the constraints of the widget.
std::shared_ptr< T > make_widget(size_t column_nr, size_t row_nr, Args &&...args)
Add a widget directly to this widget.
Definition grid_layout_widget.hpp:55
void update_layout(hires_utc_clock::time_point display_time_point, bool need_layout) noexcept override
Update the internal layout of the widget.
std::shared_ptr< T > make_widget(std::string_view address, Args &&...args)
Add a widget directly to this widget.
Definition grid_layout_widget.hpp:67
Definition widget.hpp:97
aarectangle rectangle() const noexcept
Get the rectangle in local coordinates.
Definition widget.hpp:342
gui_window & window
Convenient reference to the Window.
Definition widget.hpp:101
abstract_container_widget const & parent() const noexcept
Get a reference to the parent.
T move(T... args)