1.10
event.h
1/*
2 * Copyright (C) 2018 Microchip Technology Inc. All rights reserved.
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6#ifndef EGT_EVENT_H
7#define EGT_EVENT_H
8
14#include <egt/detail/meta.h>
15#include <egt/flags.h>
16#include <egt/geometry.h>
17#include <egt/keycode.h>
18#include <iosfwd>
19
20namespace egt
21{
22inline namespace v1
23{
24
69
71EGT_API std::ostream& operator<<(std::ostream& os, const EventId& event);
72
78struct EGT_API Pointer
79{
83 enum class Button
84 {
85 none,
86 left,
87 middle,
88 right
89 };
90
91 constexpr Pointer() noexcept = default;
92
97 constexpr explicit Pointer(const DisplayPoint& p, size_t s = 0) noexcept
98 : point(p),
99 slot(s)
100 {}
101
107 constexpr Pointer(const DisplayPoint& p, Button b, size_t s = 0) noexcept
108 : point(p),
109 btn(b),
110 slot(s)
111 {}
112
118 constexpr Pointer(const DisplayPoint& p,
119 const DisplayPoint& d,
120 size_t s = 0) noexcept
121 : point(p),
122 drag_start(d),
123 slot(s)
124 {}
125
127 EGT_NODISCARD DisplayPoint delta() const
128 {
129 return point - drag_start;
130 }
131
134
136 Button btn{Button::none};
137
147
149 size_t slot{};
150};
151
152static_assert(detail::rule_of_5<Pointer>(), "must fulfill rule of 5");
153
155EGT_API std::ostream& operator<<(std::ostream& os, const Pointer::Button& btn);
157EGT_API std::ostream& operator<<(std::ostream& os, const Pointer& pointer);
158
164struct EGT_API Key
165{
166 enum class KeyMod : uint32_t
167 {
168 shift = detail::bit(0),
169 control = detail::bit(1),
170 lock = detail::bit(2),
171 };
172
174
175 constexpr Key() noexcept = default;
176
181 constexpr explicit Key(KeyboardCode k, uint32_t u = 0, const KeyState& s = {}) noexcept
182 : keycode(k),
183 unicode(u),
184 state(s)
185 {}
186
199
203 uint32_t unicode{0};
204
210 KeyState state{};
211};
212
213static_assert(detail::rule_of_5<Key>(), "must fulfill rule of 5");
214
216EGT_API std::ostream& operator<<(std::ostream& os, const Key& key);
217
222{
223public:
224
228 void stop()
229 {
230 m_stop = true;
231 }
232
236 EGT_NODISCARD bool quit() const
237 {
238 return m_stop;
239 }
240
241protected:
242
244 bool m_stop{false};
245};
246
247class Widget;
248
254struct EGT_API Event : public EventArg
255{
256 constexpr Event() noexcept = default;
257
261 constexpr explicit Event(EventId id) noexcept
262 : m_id(id)
263 {}
264
269 constexpr Event(EventId id, const Pointer& pointer) noexcept
270 : m_id(id),
271 m_pointer(pointer)
272 {}
273
278 constexpr Event(EventId id, const Key& key) noexcept
279 : m_id(id),
280 m_key(key)
281 {}
282
284 EGT_NODISCARD const EventId& id() const noexcept
285 {
286 return m_id;
287 }
288
290 void id(EventId id)
291 {
292 m_id = id;
293 }
294
310 {
311 return m_pointer;
312 }
313
317 EGT_NODISCARD const Pointer& pointer() const
318 {
319 return m_pointer;
320 }
321
331 {
332 return m_key;
333 }
334
338 EGT_NODISCARD const Key& key() const
339 {
340 return m_key;
341 };
342
348 void grab(Widget* widget);
349
355 {
356 m_postponed_stop = true;
357 }
358
363 EGT_NODISCARD bool postponed_quit() const
364 {
365 return m_postponed_stop;
366 }
367
368protected:
369
373 EventId m_id{EventId::none};
374
379
384
388 bool m_postponed_stop{false};
389};
390
391static_assert(detail::rule_of_5<Event>(), "must fulfill rule of 5");
392
394EGT_API std::ostream& operator<<(std::ostream& os, const Event& event);
395
396}
397}
398
399#endif
Base event argument class.
Definition event.h:222
bool m_stop
Is the event stopped.
Definition event.h:244
void stop()
Stop the event from propagating.
Definition event.h:228
EGT_NODISCARD bool quit() const
Was the event stopped from propagating?
Definition event.h:236
Utility class for managing a set of flags with the ability to observe changes to the flags.
Definition flags.h:40
Base Widget class.
Definition widget.h:53
EventId
Event identifiers.
Definition event.h:36
@ raw_pointer_up
Raw pointer event.
@ keyboard_repeat
Keyboard event.
@ raw_pointer_move
Raw pointer event.
@ pointer_drag_stop
Pointer event.
@ raw_pointer_down
Raw pointer event.
@ pointer_click
Pointer event.
@ pointer_hold
Pointer event.
@ pointer_drag
Pointer event.
@ keyboard_down
Keyboard event.
@ pointer_dblclick
Pointer event.
@ keyboard_up
Keyboard event.
@ pointer_drag_start
Pointer event.
constexpr T bit(T n)
Utility to create a bit mask for the specified bit.
Definition meta.h:306
KeyboardCode
Key codes that represent a physical key.
Definition keycode.h:26
@ EKEY_UNKNOWN
Definition keycode.h:27
T & right(T &widget)
Helper to set alignment of a widget.
Definition widgetflags.h:468
T & left(T &widget)
Helper to set alignment of a widget.
Definition widgetflags.h:442
EGT_API std::ostream & operator<<(std::ostream &os, const Color &color)
Overloaded std::ostream insertion operator.
EGT framework namespace.
Definition animation.h:24
A single event that has information about the event and state for the event.
Definition event.h:255
constexpr Event(EventId id, const Key &key) noexcept
Definition event.h:278
EGT_NODISCARD const Pointer & pointer() const
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition event.h:317
Pointer m_pointer
Pointer event data.
Definition event.h:383
EGT_NODISCARD const EventId & id() const noexcept
Get the id of the event.
Definition event.h:284
Key m_key
Key event data.
Definition event.h:378
EGT_NODISCARD bool postponed_quit() const
Was the event scheduled to be stopped just after the latest handle() completes?
Definition event.h:363
void id(EventId id)
Change the id of the event.
Definition event.h:290
constexpr Event() noexcept=default
constexpr Event(EventId id, const Pointer &pointer) noexcept
Definition event.h:269
EGT_NODISCARD const Key & key() const
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition event.h:338
void grab(Widget *widget)
Grab any related following events to this one.
Pointer & pointer()
Get the Pointer event data.
Definition event.h:309
void postpone_stop()
Stop the event from propagating but only after the current handle() completes.
Definition event.h:354
Key & key()
Get the Key event data.
Definition event.h:330
Keyboard event data.
Definition event.h:165
constexpr Key() noexcept=default
KeyMod
Definition event.h:167
Pointer event data.
Definition event.h:79
Button
Definitions for pointer buttons.
Definition event.h:84
constexpr Pointer() noexcept=default
constexpr Pointer(const DisplayPoint &p, Button b, size_t s=0) noexcept
Definition event.h:107
constexpr Pointer(const DisplayPoint &p, const DisplayPoint &d, size_t s=0) noexcept
Definition event.h:118
EGT_NODISCARD DisplayPoint delta() const
Get the drag delta.
Definition event.h:127
DisplayPoint point
Mouse position in display coordinates.
Definition event.h:133
DisplayPoint drag_start
The mouse point where EventId::pointer_drag_start occurred.
Definition event.h:146