From 21fccf43ec049569f690674840ca1a10420a40da Mon Sep 17 00:00:00 2001 From: crupest Date: Mon, 13 Dec 2021 20:58:42 +0800 Subject: ... --- include/cru/ui/events/RoutedEvent.hpp | 39 +++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 include/cru/ui/events/RoutedEvent.hpp (limited to 'include/cru/ui/events/RoutedEvent.hpp') diff --git a/include/cru/ui/events/RoutedEvent.hpp b/include/cru/ui/events/RoutedEvent.hpp new file mode 100644 index 00000000..0cedc671 --- /dev/null +++ b/include/cru/ui/events/RoutedEvent.hpp @@ -0,0 +1,39 @@ +#pragma once +#include "UiEventArgs.hpp" + +#include "cru/common/Event.hpp" + +namespace cru::ui::events { +// TEventArgs must not be a reference type. This class help add reference. +// EventArgs must be reference because the IsHandled property must be settable. +template +class RoutedEvent { + public: + static_assert(std::is_base_of_v, + "TEventArgs must be subclass of UiEventArgs."); + static_assert(!std::is_reference_v, + "TEventArgs must not be reference."); + + using RawEventArgs = TEventArgs; + using IEventType = IEvent; + using EventArgs = typename IEventType::EventArgs; + + RoutedEvent() = default; + RoutedEvent(const RoutedEvent& other) = delete; + RoutedEvent(RoutedEvent&& other) = delete; + RoutedEvent& operator=(const RoutedEvent& other) = delete; + RoutedEvent& operator=(RoutedEvent&& other) = delete; + ~RoutedEvent() = default; + + IEvent* Direct() { return &direct_; } + + IEvent* Bubble() { return &bubble_; } + + IEvent* Tunnel() { return &tunnel_; } + + private: + Event direct_; + Event bubble_; + Event tunnel_; +}; +} // namespace cru::ui::event -- cgit v1.2.3