HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
gui_event.hpp
Go to the documentation of this file.
1// Copyright Take Vos 2022.
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
9#pragma once
10
11#include "gui_event_type.hpp"
12#include "gui_event_variant.hpp"
13#include "keyboard_virtual_key.hpp"
14#include "keyboard_state.hpp"
15#include "keyboard_modifiers.hpp"
16#include "keyboard_focus_group.hpp"
17#include "keyboard_focus_direction.hpp"
18#include "mouse_buttons.hpp"
19#include "../unicode/grapheme.hpp"
20#include "../geometry/vector.hpp"
21#include "../geometry/point.hpp"
22#include "../geometry/transform.hpp"
23#include "../chrono.hpp"
24#include <chrono>
25
26namespace hi { inline namespace v1 {
27
36 point2 position = {};
37
44 point2 down_position = {};
45
50 vector2 wheel_delta = {};
51
54 mouse_buttons cause = {};
55
58 mouse_buttons down = {};
59
62 uint8_t click_count = 0;
63};
64
65class widget;
66
68 hi::widget const *widget = nullptr;
69 keyboard_focus_group group = keyboard_focus_group::normal;
70 keyboard_focus_direction direction = keyboard_focus_direction::here;
71};
72
76class gui_event {
77public:
80 utc_nanoseconds time_point;
81
87
91
99 constexpr gui_event(
101 utc_nanoseconds time_point,
102 hi::keyboard_modifiers keyboard_modifiers,
103 hi::keyboard_state keyboard_state) noexcept :
104 _type(gui_event_type::none),
108 {
109 set_type(type);
110 }
111
114 constexpr gui_event() noexcept :
115 gui_event(gui_event_type::none, utc_nanoseconds{}, keyboard_modifiers::none, keyboard_state::idle)
116 {
117 }
118
124 gui_event(type, std::chrono::utc_clock::now(), keyboard_modifiers::none, keyboard_state::idle)
125 {
126 }
127
133 gui_event(gui_event_type type, aarectangle rectangle) noexcept :
134 gui_event(type, std::chrono::utc_clock::now(), keyboard_modifiers::none, keyboard_state::idle)
135 {
137 this->rectangle() = rectangle;
138 }
139
149 keyboard_virtual_key key,
150 hi::keyboard_modifiers keyboard_modifiers = keyboard_modifiers::none,
151 hi::keyboard_state keyboard_state = keyboard_state::idle) noexcept :
152 gui_event(type, std::chrono::utc_clock::now(), keyboard_modifiers, keyboard_state)
153 {
155 this->key() = key;
156 }
157
158 constexpr ~gui_event() = default;
159 constexpr gui_event(gui_event const&) noexcept = default;
160 constexpr gui_event(gui_event&&) noexcept = default;
161 constexpr gui_event& operator=(gui_event const&) noexcept = default;
162 constexpr gui_event& operator=(gui_event&&) noexcept = default;
163
168 [[nodiscard]] static gui_event make_mouse_enter(point2 position) noexcept
169 {
170 auto r = gui_event{gui_event_type::mouse_enter};
171 r.mouse().position = position;
172 return r;
173 }
174
175 [[nodiscard]] static gui_event keyboard_grapheme(hi::grapheme grapheme) noexcept
176 {
177 auto r = gui_event{gui_event_type::keyboard_grapheme};
178 r.grapheme() = grapheme;
179 return r;
180 }
181
182 [[nodiscard]] static gui_event keyboard_partial_grapheme(hi::grapheme grapheme) noexcept
183 {
184 auto r = gui_event{gui_event_type::keyboard_partial_grapheme};
185 r.grapheme() = grapheme;
186 return r;
187 }
188
189 [[nodiscard]] static gui_event window_set_keyboard_target(
190 widget const *widget,
191 keyboard_focus_group group = keyboard_focus_group::normal,
192 keyboard_focus_direction direction = keyboard_focus_direction::here) noexcept
193 {
195 r.keyboard_target().widget = widget;
196 r.keyboard_target().group = group;
197 r.keyboard_target().direction = direction;
198 return r;
199 }
200
201 [[nodiscard]] static gui_event window_remove_keyboard_target(widget const *widget) noexcept
202 {
204 r.keyboard_target().widget = widget;
205 return r;
206 }
207
213 [[nodiscard]] static gui_event make_clipboard_event(gui_event_type type, std::string_view text) noexcept
214 {
215 auto r = gui_event{type};
216 r.clipboard_data() = text;
217 return r;
218 }
219
222 [[nodiscard]] constexpr gui_event_type type() const noexcept
223 {
224 return _type;
225 }
226
232 [[nodiscard]] constexpr void set_type(gui_event_type type) noexcept
233 {
234 hilet previous_variant = variant();
235
236 _type = type;
237 if (previous_variant != variant()) {
238 switch (variant()) {
240 _data = mouse_event_data{};
241 break;
243 _data = hi::grapheme{};
244 break;
246 _data = keyboard_virtual_key{};
247 break;
249 _data = keyboard_target_data{};
250 break;
252 _data = aarectangle{};
253 break;
255 _data = std::string{};
256 default:;
257 }
258 }
259 }
260
265 [[nodiscard]] mouse_event_data& mouse() noexcept
266 {
268 return std::get<mouse_event_data>(_data);
269 }
270
275 [[nodiscard]] mouse_event_data const& mouse() const noexcept
276 {
278 return std::get<mouse_event_data>(_data);
279 }
280
285 [[nodiscard]] keyboard_virtual_key& key() noexcept
286 {
288 return std::get<keyboard_virtual_key>(_data);
289 }
290
295 [[nodiscard]] keyboard_virtual_key const& key() const noexcept
296 {
298 return std::get<keyboard_virtual_key>(_data);
299 }
300
305 [[nodiscard]] hi::grapheme& grapheme() noexcept
306 {
308 return std::get<hi::grapheme>(_data);
309 }
310
315 [[nodiscard]] hi::grapheme const& grapheme() const noexcept
316 {
318 return std::get<hi::grapheme>(_data);
319 }
320
321 [[nodiscard]] aarectangle& rectangle() noexcept
322 {
324 return std::get<aarectangle>(_data);
325 }
326
327 [[nodiscard]] aarectangle const& rectangle() const noexcept
328 {
330 return std::get<aarectangle>(_data);
331 }
332
333 [[nodiscard]] keyboard_target_data& keyboard_target() noexcept
334 {
336 return std::get<keyboard_target_data>(_data);
337 }
338
339 [[nodiscard]] keyboard_target_data const& keyboard_target() const noexcept
340 {
342 return std::get<keyboard_target_data>(_data);
343 }
344
345 [[nodiscard]] std::string& clipboard_data() noexcept
346 {
348 return std::get<std::string>(_data);
349 }
350
351 [[nodiscard]] std::string const& clipboard_data() const noexcept
352 {
354 return std::get<std::string>(_data);
355 }
356
357 [[nodiscard]] constexpr bool operator==(gui_event_type event_type) const noexcept
358 {
359 return type() == event_type;
360 }
361
362 [[nodiscard]] constexpr bool operator==(gui_event_variant event_variant) const noexcept
363 {
364 return variant() == event_variant;
365 }
366
367 [[nodiscard]] constexpr bool empty() const noexcept
368 {
369 return type() == gui_event_type::none;
370 }
371
372 constexpr operator bool() const noexcept
373 {
374 return not empty();
375 }
376
377 [[nodiscard]] constexpr gui_event_variant variant() const noexcept
378 {
379 return to_gui_event_variant(type());
380 }
381
384 [[nodiscard]] constexpr bool is_left_button_up(aarectangle active_area) const noexcept
385 {
386 using enum gui_event_type;
387 return type() == mouse_up and mouse().cause.left_button and active_area.contains(mouse().position);
388 }
389
392 [[nodiscard]] constexpr vector2 drag_delta() const noexcept
393 {
394 using enum gui_event_type;
395 return type() == mouse_drag ? mouse().position - mouse().down_position : vector2{};
396 }
397
406 [[nodiscard]] constexpr friend gui_event operator*(geo::transformer auto const& transform, gui_event const& rhs) noexcept
407 {
408 auto r = rhs;
409 if (rhs == gui_event_variant::mouse) {
410 r.mouse().position = point2{transform * rhs.mouse().position};
411 r.mouse().down_position = point2{transform * rhs.mouse().down_position};
412 r.mouse().wheel_delta = vector2{transform * rhs.mouse().wheel_delta};
413 }
414 return r;
415 }
416
417private:
418 using data_type =
419 std::variant<mouse_event_data, keyboard_virtual_key, keyboard_target_data, hi::grapheme, aarectangle, std::string>;
420
421 gui_event_type _type;
422 data_type _data;
423};
424
425}} // namespace hi::v1
426
427template<typename CharT>
428struct std::formatter<hi::gui_event, CharT> : std::formatter<std::string_view, CharT> {
429 auto format(hi::gui_event const& t, auto& fc)
430 {
431 return std::formatter<std::string_view, CharT>::format(hi::gui_event_type_metadata[t.type()], fc);
432 }
433};
#define hi_assert(expression)
Assert if expression is true.
Definition assert.hpp:86
#define hilet
Invariant should be the default for variables.
Definition utility.hpp:23
Definition of a GUI event variant.
Definition of GUI event type.
gui_event_type
GUI event type.
Definition gui_event_type.hpp:22
constexpr gui_event_variant to_gui_event_variant(gui_event_type type) noexcept
Convert a gui event type, to an gui event variant.
Definition gui_event_variant.hpp:51
gui_event_variant
A granular gui event type.
Definition gui_event_variant.hpp:18
@ window_set_keyboard_target
Change the keyboard target widget for this window.
@ window_remove_keyboard_target
Remove a widget as keyboard target.
@ keyboard
The gui_event has keyboard data.
@ mouse
The gui_event has mouse data.
@ keyboard_target
The gui_event has keyboard target data.
@ grapheme
The gui_event has grapheme data.
@ rectangle
The gui_event has rectangle data.
@ clipboard_data
The gui_event has clipboard data.
DOXYGEN BUG.
Definition algorithm.hpp:15
The HikoGUI namespace.
Definition ascii.hpp:19
Information for a mouse event.
Definition gui_event.hpp:31
point2 position
The current position of the mouse pointer.
Definition gui_event.hpp:36
uint8_t click_count
Number of clicks from the last button clicked.
Definition gui_event.hpp:62
vector2 wheel_delta
Change in wheel rotation, in points (pt).
Definition gui_event.hpp:50
mouse_buttons down
Buttons that are also held down.
Definition gui_event.hpp:58
mouse_buttons cause
Buttons which have caused this event.
Definition gui_event.hpp:54
point2 down_position
The position the last time a button was pressed.
Definition gui_event.hpp:44
Definition gui_event.hpp:67
A user interface event.
Definition gui_event.hpp:76
utc_nanoseconds time_point
The time when the event was created.
Definition gui_event.hpp:80
constexpr vector2 drag_delta() const noexcept
Get the location of the mouse relative to the start of a drag.
Definition gui_event.hpp:392
mouse_event_data const & mouse() const noexcept
Get the mouse event information.
Definition gui_event.hpp:275
constexpr void set_type(gui_event_type type) noexcept
Change the type of the gui_event.
Definition gui_event.hpp:232
constexpr gui_event() noexcept
Create an empty GUI event.
Definition gui_event.hpp:114
hi::grapheme & grapheme() noexcept
Get the grapheme entered on the keyboard.
Definition gui_event.hpp:305
keyboard_modifiers keyboard_modifiers
Keyboard modifiers: shift, ctrl, alt, etc.
Definition gui_event.hpp:86
static gui_event make_mouse_enter(point2 position) noexcept
Create a mouse enter event.
Definition gui_event.hpp:168
gui_event(gui_event_type type, aarectangle rectangle) noexcept
Create a rectangle event.
Definition gui_event.hpp:133
static gui_event make_clipboard_event(gui_event_type type, std::string_view text) noexcept
Create clipboard event.
Definition gui_event.hpp:213
keyboard_state keyboard_state
State of the keyboard; caps-lock, num-lock, scroll-lock.
Definition gui_event.hpp:90
hi::grapheme const & grapheme() const noexcept
Get the grapheme entered on the keyboard.
Definition gui_event.hpp:315
constexpr bool is_left_button_up(aarectangle active_area) const noexcept
Check if this event is for a left-button-up event while the mouse pointer is in the given area.
Definition gui_event.hpp:384
constexpr gui_event_type type() const noexcept
Get the event type.
Definition gui_event.hpp:222
keyboard_virtual_key const & key() const noexcept
Get the key from the keyboard event.
Definition gui_event.hpp:295
mouse_event_data & mouse() noexcept
Get the mouse event information.
Definition gui_event.hpp:265
constexpr friend gui_event operator*(geo::transformer auto const &transform, gui_event const &rhs) noexcept
Transform a gui-event to another coordinate system.
Definition gui_event.hpp:406
gui_event(gui_event_type type, keyboard_virtual_key key, hi::keyboard_modifiers keyboard_modifiers=keyboard_modifiers::none, hi::keyboard_state keyboard_state=keyboard_state::idle) noexcept
Create a GUI event.
Definition gui_event.hpp:147
constexpr gui_event(gui_event_type type, utc_nanoseconds time_point, hi::keyboard_modifiers keyboard_modifiers, hi::keyboard_state keyboard_state) noexcept
Create a GUI event.
Definition gui_event.hpp:99
gui_event(gui_event_type type) noexcept
Create am empty GUI event.
Definition gui_event.hpp:123
keyboard_virtual_key & key() noexcept
Get the key from the keyboard event.
Definition gui_event.hpp:285
An interactive graphical object as part of the user-interface.
Definition widget.hpp:45