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"
9#include "grid_layout.hpp"
11#include "../weak_or_unique_ptr.hpp"
12#include <memory>
13
14namespace hi::inline v1 {
15
37class grid_widget : public widget {
38public:
39 using super = widget;
41
43
51 grid_widget(gui_window &window, widget *parent, std::weak_ptr<delegate_type> delegate = {}) noexcept;
52
61 template<typename Widget, typename... Args>
62 Widget &make_widget(std::size_t column_first, std::size_t row_first, std::size_t column_last, std::size_t row_last, Args &&...args)
63 {
64 auto tmp = std::make_unique<Widget>(window, this, std::forward<Args>(args)...);
65 return static_cast<Widget &>(add_widget(column_first, row_first, column_last, row_last, std::move(tmp)));
66 }
67
76 template<typename Widget, typename... Args>
77 Widget &make_widget(std::size_t column, std::size_t row, Args &&...args)
78 {
79 auto tmp = std::make_unique<Widget>(window, this, std::forward<Args>(args)...);
80 return static_cast<Widget &>(add_widget(column, row, column + 1, row + 1, std::move(tmp)));
81 }
82
91 template<typename Widget, typename... Args>
92 Widget &make_widget(std::string_view address, Args &&...args)
93 {
94 hilet[column_first, row_first, column_last, row_last] = parse_spreadsheet_range(address);
95 return make_widget<Widget>(column_first, row_first, column_last, row_last, std::forward<Args>(args)...);
96 }
97
99 [[nodiscard]] generator<widget *> children() const noexcept override
100 {
101 for (hilet &cell : _cells) {
102 co_yield cell.widget.get();
103 }
104 }
105
106 widget_constraints const &set_constraints() noexcept override;
107 void set_layout(widget_layout const &layout) noexcept override;
108 void draw(draw_context const &context) noexcept override;
109 [[nodiscard]] hitbox hitbox_test(point3 position) const noexcept override;
111private:
112 struct cell_type {
113 std::size_t column_first;
114 std::size_t row_first;
115 std::size_t column_last;
116 std::size_t row_last;
118
119 cell_type(
120 std::size_t column_first,
121 std::size_t row_first,
122 std::size_t column_last,
123 std::size_t row_last,
124 std::unique_ptr<hi::widget> widget) noexcept :
125 column_first(column_first),
126 row_first(row_first),
127 column_last(column_last),
128 row_last(row_last),
129 widget(std::move(widget))
130 {
131 }
132
133 [[nodiscard]] aarectangle
134 rectangle(grid_layout const &columns, grid_layout const &rows, float container_height) const noexcept
135 {
136 hilet[x0, x3] = columns.get_positions(column_first, column_last);
137 hilet[y0, y3] = rows.get_positions(row_first, row_last);
138
139 return {point2{x0, container_height - y3}, point2{x3, container_height - y0}};
140 }
141
142 [[nodiscard]] widget_baseline baseline(grid_layout const &rows) const noexcept
143 {
144 return rows.get_baseline(row_first, row_last);
145 }
146 };
147
149
150 grid_layout _rows;
151 grid_layout _columns;
152
154
155 [[nodiscard]] bool address_in_use(std::size_t column_first, std::size_t row_first, std::size_t column_last, std::size_t row_last) const noexcept;
156
157 /* Add a widget to the grid.
158 */
159 widget &add_widget(
160 std::size_t column_first,
161 std::size_t row_first,
162 std::size_t column_last,
163 std::size_t row_last,
164 std::unique_ptr<widget> child_widget) noexcept;
165};
166
167} // namespace hi::inline v1
#define hilet
Invariant should be the default for variables.
Definition required.hpp:23
The functions in this file are for handling spreadsheet addresses.
A return value for a generator-function.
Definition generator.hpp:28
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:92
Widget & make_widget(std::size_t column, std::size_t row, Args &&...args)
Add a widget directly to this grid-widget.
Definition grid_widget.hpp:77
grid_widget(gui_window &window, widget *parent, std::weak_ptr< delegate_type > delegate={}) noexcept
Constructs an empty grid widget.
Widget & make_widget(std::size_t column_first, std::size_t row_first, std::size_t column_last, std::size_t row_last, Args &&...args)
Add a widget directly to this grid-widget.
Definition grid_widget.hpp:62
An interactive graphical object as part of the user-interface.
Definition widget.hpp:39
T move(T... args)