aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/cru/ui/event/ui_event.hpp21
-rw-r--r--src/ui/control.cpp8
-rw-r--r--src/ui/controls/button.cpp4
-rw-r--r--src/ui/routed_event_dispatch.hpp6
4 files changed, 25 insertions, 14 deletions
diff --git a/include/cru/ui/event/ui_event.hpp b/include/cru/ui/event/ui_event.hpp
index f36e40a2..b962ff76 100644
--- a/include/cru/ui/event/ui_event.hpp
+++ b/include/cru/ui/event/ui_event.hpp
@@ -6,6 +6,7 @@
#include <memory>
#include <optional>
+#include <type_traits>
namespace cru::platform::graph {
class Painter;
@@ -45,22 +46,28 @@ class RoutedEvent {
public:
static_assert(std::is_base_of_v<UiEventArgs, TEventArgs>,
"TEventArgs must be subclass of UiEventArgs.");
+ static_assert(!std::is_reference_v<TEventArgs>,
+ "TEventArgs must not be reference.");
using EventArgs = TEventArgs;
- RoutedEvent()
- : direct(new Event<TEventArgs&>()),
- bubble(new Event<TEventArgs&>()),
- tunnel(new Event<TEventArgs&>()) {}
+ RoutedEvent() = default;
RoutedEvent(const RoutedEvent& other) = delete;
RoutedEvent(RoutedEvent&& other) = delete;
RoutedEvent& operator=(const RoutedEvent& other) = delete;
RoutedEvent& operator=(RoutedEvent&& other) = delete;
~RoutedEvent() = default;
- const std::unique_ptr<IEvent<TEventArgs&>> direct;
- const std::unique_ptr<IEvent<TEventArgs&>> bubble;
- const std::unique_ptr<IEvent<TEventArgs&>> tunnel;
+ IEvent<TEventArgs&>* Direct() { return &direct_; }
+
+ IEvent<TEventArgs&>* Bubble() { return &bubble_; }
+
+ IEvent<TEventArgs&>* Tunnel() { return &tunnel_; }
+
+ private:
+ Event<TEventArgs&> direct_;
+ Event<TEventArgs&> bubble_;
+ Event<TEventArgs&> tunnel_;
};
class MouseEventArgs : public UiEventArgs {
diff --git a/src/ui/control.cpp b/src/ui/control.cpp
index 51e1937a..bcf56c5e 100644
--- a/src/ui/control.cpp
+++ b/src/ui/control.cpp
@@ -15,7 +15,7 @@ void Control::_SetParent(Control* parent) {
const auto new_parent = GetParent();
if (old_parent != new_parent) OnParentChanged(old_parent, new_parent);
- MouseDownEvent()->direct->AddHandler(
+ MouseDownEvent()->Direct()->AddHandler(
[this](event::MouseButtonEventArgs& args) {
switch (args.GetMouseButton()) {
case MouseButton::Left:
@@ -33,11 +33,11 @@ void Control::_SetParent(Control* parent) {
}
});
- MouseEnterEvent()->direct->AddHandler([this](event::MouseEventArgs&) {
+ MouseEnterEvent()->Direct()->AddHandler([this](event::MouseEventArgs&) {
this->is_mouse_over_ = true;
});
- MouseLeaveEvent()->direct->AddHandler([this](event::MouseEventArgs&) {
+ MouseLeaveEvent()->Direct()->AddHandler([this](event::MouseEventArgs&) {
this->is_mouse_over_ = false;
if (click_map_.left) {
OnMouseClickCancel(MouseButton::Left);
@@ -51,7 +51,7 @@ void Control::_SetParent(Control* parent) {
click_map_.left = click_map_.middle = click_map_.right = false;
});
- MouseUpEvent()->direct->AddHandler([this](event::MouseButtonEventArgs& args) {
+ MouseUpEvent()->Direct()->AddHandler([this](event::MouseButtonEventArgs& args) {
switch (args.GetMouseButton()) {
case MouseButton::Left:
if (click_map_.left) {
diff --git a/src/ui/controls/button.cpp b/src/ui/controls/button.cpp
index 2228343c..618371fb 100644
--- a/src/ui/controls/button.cpp
+++ b/src/ui/controls/button.cpp
@@ -37,4 +37,8 @@ void Button::OnMouseClickEnd(platform::native::MouseButton button) {
//TODO!
}
}
+
+void Button::OnStateChange(ButtonState oldState, ButtonState newState) {
+
+}
} // namespace cru::ui::controls
diff --git a/src/ui/routed_event_dispatch.hpp b/src/ui/routed_event_dispatch.hpp
index 3427441b..e9430676 100644
--- a/src/ui/routed_event_dispatch.hpp
+++ b/src/ui/routed_event_dispatch.hpp
@@ -32,7 +32,7 @@ void DispatchEvent(Control* const original_sender,
// tunnel
for (auto i = receive_list.crbegin(); i != receive_list.crend(); ++i) {
EventArgs event_args(*i, original_sender, std::forward<Args>(args)...);
- static_cast<Event<EventArgs>*>(((*i)->*event_ptr)()->tunnel.get())
+ static_cast<Event<EventArgs&>*>(((*i)->*event_ptr)()->Tunnel())
->Raise(event_args);
if (event_args.IsHandled()) {
handled = true;
@@ -44,7 +44,7 @@ void DispatchEvent(Control* const original_sender,
if (!handled) {
for (auto i : receive_list) {
EventArgs event_args(i, original_sender, std::forward<Args>(args)...);
- static_cast<Event<EventArgs>*>((i->*event_ptr)()->bubble.get())
+ static_cast<Event<EventArgs&>*>((i->*event_ptr)()->Bubble())
->Raise(event_args);
if (event_args.IsHandled()) break;
}
@@ -53,7 +53,7 @@ void DispatchEvent(Control* const original_sender,
// direct
for (auto i : receive_list) {
EventArgs event_args(i, original_sender, std::forward<Args>(args)...);
- static_cast<Event<EventArgs>*>((i->*event_ptr)()->direct.get())
+ static_cast<Event<EventArgs&>*>((i->*event_ptr)()->Direct())
->Raise(event_args);
}
}