HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
grid_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 "widget.hpp"
8#include "grid_delegate.hpp"
10#include "../flow_layout.hpp"
11#include "../weak_or_unique_ptr.hpp"
12#include <memory>
13
14namespace tt {
15
37class grid_widget : public widget {
38public:
39 using super = widget;
41
50
59 template<typename Widget, typename... Args>
60 Widget &make_widget(size_t column_nr, size_t row_nr, Args &&...args)
61 {
62 auto tmp = std::make_unique<Widget>(window, this, std::forward<Args>(args)...);
63 tmp->init();
64 return static_cast<Widget &>(add_widget(column_nr, row_nr, std::move(tmp)));
65 }
66
75 template<typename Widget, typename... Args>
76 Widget &make_widget(std::string_view address, Args &&...args)
77 {
78 ttlet[column_nr, row_nr] = parse_spreadsheet_address(address);
79 return make_widget<Widget>(column_nr, row_nr, std::forward<Args>(args)...);
80 }
81
83 void init() noexcept override;
84 void deinit() noexcept override;
85 [[nodiscard]] float margin() const noexcept override;
86 [[nodiscard]] bool constrain(utc_nanoseconds display_time_point, bool need_reconstrain) noexcept override;
87 [[nodiscard]] void layout(utc_nanoseconds display_time_point, bool need_layout) noexcept override;
89private:
90 struct cell {
91 size_t column_nr;
92 size_t row_nr;
94
95 cell(size_t column_nr, size_t row_nr, tt::widget *widget) noexcept : column_nr(column_nr), row_nr(row_nr), widget(widget)
96 {
97 }
98
99 [[nodiscard]] aarectangle
100 rectangle(flow_layout const &columns, flow_layout const &rows, float container_height) const noexcept
101 {
102 ttlet[x, width] = columns.get_offset_and_size(column_nr);
103 ttlet[y, height] = rows.get_offset_and_size(row_nr);
104
105 return {x, container_height - y - height, width, height};
106 };
107 };
108
109 std::vector<cell> _cells;
110
111 flow_layout _rows;
112 flow_layout _columns;
113
115
116 [[nodiscard]] static std::pair<size_t, size_t> calculate_grid_size(std::vector<cell> const &cells) noexcept;
117 [[nodiscard]] static std::tuple<extent2, extent2, extent2>
118 calculate_size(std::vector<cell> const &cells, flow_layout &rows, flow_layout &columns) noexcept;
119 [[nodiscard]] bool address_in_use(size_t column_nr, size_t row_nr) const noexcept;
120
121 /* Add a widget to the grid.
122 */
123 widget &add_widget(size_t column_nr, size_t row_nr, std::unique_ptr<widget> child_widget) noexcept;
124};
125
126} // namespace tt
The functions in this file are for handling spreadsheet addresses.
std::pair< size_t, size_t > parse_spreadsheet_address(std::string_view address, size_t start_column_nr=0, size_t start_row_nr=0)
Parse a spreadsheet address.
Definition spreadsheet_address.hpp:73
Definition gui_window.hpp:39
Definition grid_delegate.hpp:13
A GUI widget that lays out child-widgets in a grid with variable sized cells.
Definition grid_widget.hpp:37
Widget & make_widget(std::string_view address, Args &&...args)
Add a widget directly to this grid-widget.
Definition grid_widget.hpp:76
grid_widget(gui_window &window, widget *parent, std::weak_ptr< delegate_type > delegate={}) noexcept
Constructs an empty grid widget.
Widget & make_widget(size_t column_nr, size_t row_nr, Args &&...args)
Add a widget directly to this grid-widget.
Definition grid_widget.hpp:60
An interactive graphical object as part of the user-interface.
Definition widget.hpp:37
widget *const parent
Pointer to the parent widget.
Definition widget.hpp:46
aarectangle rectangle() const noexcept
Get the rectangle in local coordinates.
gui_window & window
Convenient reference to the Window.
Definition widget.hpp:41
widget(gui_window &window, widget *parent) noexcept
T move(T... args)