aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--demos/main/main.cpp4
-rw-r--r--include/cru/ui/controls/Control.hpp46
-rw-r--r--include/cru/ui/controls/TextHostControlService.hpp14
-rw-r--r--include/cru/ui/events/FocusChangeEventArgs.hpp23
-rw-r--r--include/cru/ui/events/KeyEventArgs.hpp29
-rw-r--r--include/cru/ui/events/MouseButtonEventArgs.hpp35
-rw-r--r--include/cru/ui/events/MouseEventArgs.hpp26
-rw-r--r--include/cru/ui/events/MouseWheelEventArgs.hpp29
-rw-r--r--include/cru/ui/events/PaintEventArgs.hpp25
-rw-r--r--include/cru/ui/events/RoutedEvent.hpp39
-rw-r--r--include/cru/ui/events/UiEvent.hpp235
-rw-r--r--include/cru/ui/events/UiEventArgs.hpp28
-rw-r--r--include/cru/ui/events/UiEvents.hpp10
-rw-r--r--include/cru/ui/helper/ShortcutHub.hpp8
-rw-r--r--src/ui/CMakeLists.txt12
-rw-r--r--src/ui/controls/Control.cpp4
-rw-r--r--src/ui/controls/TextHostControlService.cpp12
-rw-r--r--src/ui/events/MouseEventArgs.cpp (renamed from src/ui/events/UiEvent.cpp)6
-rw-r--r--src/ui/helper/ClickDetector.cpp8
-rw-r--r--src/ui/helper/ShortcutHub.cpp2
-rw-r--r--src/ui/host/RoutedEventDispatch.hpp2
-rw-r--r--src/ui/render/ScrollBar.cpp10
-rw-r--r--src/ui/render/ScrollRenderObject.cpp2
23 files changed, 313 insertions, 296 deletions
diff --git a/demos/main/main.cpp b/demos/main/main.cpp
index cb07d25e..c98b9fcc 100644
--- a/demos/main/main.cpp
+++ b/demos/main/main.cpp
@@ -11,7 +11,7 @@
#include "cru/ui/controls/TextBlock.hpp"
#include "cru/ui/controls/TextBox.hpp"
#include "cru/ui/controls/Window.hpp"
-#include "cru/ui/events/UiEvent.hpp"
+#include "cru/ui/events/UiEvents.hpp"
#include "cru/ui/host/WindowHost.hpp"
using cru::platform::gui::IUiApplication;
@@ -50,7 +50,7 @@ int main() {
popup_menu->GetMenu()->AddTextItem(u"Item 2000", [] {});
window->MouseDownEvent()->Bubble()->AddHandler(
- [window, &popup_menu](cru::ui::event::MouseButtonEventArgs& e) {
+ [window, &popup_menu](cru::ui::events::MouseButtonEventArgs& e) {
if (e.GetButton() == cru::ui::mouse_buttons::right) {
popup_menu->SetPosition(e.GetPoint() + window->GetWindowHost()
->GetNativeWindow()
diff --git a/include/cru/ui/controls/Control.hpp b/include/cru/ui/controls/Control.hpp
index c6101370..29d48f21 100644
--- a/include/cru/ui/controls/Control.hpp
+++ b/include/cru/ui/controls/Control.hpp
@@ -1,7 +1,7 @@
#pragma once
#include "Base.hpp"
-#include "../events/UiEvent.hpp"
+#include "../events/UiEvents.hpp"
#include "../render/Base.hpp"
#include "cru/common/Event.hpp"
@@ -75,57 +75,57 @@ class Control : public Object {
// the mouse, this event is raised as regular. But if mouse is captured by
// another control, the control will not receive any mouse enter event. You
// can use `IsMouseCaptured` to get more info.
- event::RoutedEvent<event::MouseEventArgs>* MouseEnterEvent() {
+ events::RoutedEvent<events::MouseEventArgs>* MouseEnterEvent() {
return &mouse_enter_event_;
}
// Raised when mouse is leave the control. Even when the control itself
// captures the mouse, this event is raised as regular. But if mouse is
// captured by another control, the control will not receive any mouse leave
// event. You can use `IsMouseCaptured` to get more info.
- event::RoutedEvent<event::MouseEventArgs>* MouseLeaveEvent() {
+ events::RoutedEvent<events::MouseEventArgs>* MouseLeaveEvent() {
return &mouse_leave_event_;
}
// Raised when mouse is move in the control.
- event::RoutedEvent<event::MouseEventArgs>* MouseMoveEvent() {
+ events::RoutedEvent<events::MouseEventArgs>* MouseMoveEvent() {
return &mouse_move_event_;
}
// Raised when a mouse button is pressed in the control.
- event::RoutedEvent<event::MouseButtonEventArgs>* MouseDownEvent() {
+ events::RoutedEvent<events::MouseButtonEventArgs>* MouseDownEvent() {
return &mouse_down_event_;
}
// Raised when a mouse button is released in the control.
- event::RoutedEvent<event::MouseButtonEventArgs>* MouseUpEvent() {
+ events::RoutedEvent<events::MouseButtonEventArgs>* MouseUpEvent() {
return &mouse_up_event_;
}
- event::RoutedEvent<event::MouseWheelEventArgs>* MouseWheelEvent() {
+ events::RoutedEvent<events::MouseWheelEventArgs>* MouseWheelEvent() {
return &mouse_wheel_event_;
}
- event::RoutedEvent<event::KeyEventArgs>* KeyDownEvent() {
+ events::RoutedEvent<events::KeyEventArgs>* KeyDownEvent() {
return &key_down_event_;
}
- event::RoutedEvent<event::KeyEventArgs>* KeyUpEvent() {
+ events::RoutedEvent<events::KeyEventArgs>* KeyUpEvent() {
return &key_up_event_;
}
- event::RoutedEvent<event::FocusChangeEventArgs>* GainFocusEvent() {
+ events::RoutedEvent<events::FocusChangeEventArgs>* GainFocusEvent() {
return &gain_focus_event_;
}
- event::RoutedEvent<event::FocusChangeEventArgs>* LoseFocusEvent() {
+ events::RoutedEvent<events::FocusChangeEventArgs>* LoseFocusEvent() {
return &lose_focus_event_;
}
private:
- event::RoutedEvent<event::MouseEventArgs> mouse_enter_event_;
- event::RoutedEvent<event::MouseEventArgs> mouse_leave_event_;
- event::RoutedEvent<event::MouseEventArgs> mouse_move_event_;
- event::RoutedEvent<event::MouseButtonEventArgs> mouse_down_event_;
- event::RoutedEvent<event::MouseButtonEventArgs> mouse_up_event_;
- event::RoutedEvent<event::MouseWheelEventArgs> mouse_wheel_event_;
-
- event::RoutedEvent<event::KeyEventArgs> key_down_event_;
- event::RoutedEvent<event::KeyEventArgs> key_up_event_;
-
- event::RoutedEvent<event::FocusChangeEventArgs> gain_focus_event_;
- event::RoutedEvent<event::FocusChangeEventArgs> lose_focus_event_;
+ events::RoutedEvent<events::MouseEventArgs> mouse_enter_event_;
+ events::RoutedEvent<events::MouseEventArgs> mouse_leave_event_;
+ events::RoutedEvent<events::MouseEventArgs> mouse_move_event_;
+ events::RoutedEvent<events::MouseButtonEventArgs> mouse_down_event_;
+ events::RoutedEvent<events::MouseButtonEventArgs> mouse_up_event_;
+ events::RoutedEvent<events::MouseWheelEventArgs> mouse_wheel_event_;
+
+ events::RoutedEvent<events::KeyEventArgs> key_down_event_;
+ events::RoutedEvent<events::KeyEventArgs> key_up_event_;
+
+ events::RoutedEvent<events::FocusChangeEventArgs> gain_focus_event_;
+ events::RoutedEvent<events::FocusChangeEventArgs> lose_focus_event_;
//*************** region: tree ***************
protected:
diff --git a/include/cru/ui/controls/TextHostControlService.hpp b/include/cru/ui/controls/TextHostControlService.hpp
index 93b74d09..1bdf0509 100644
--- a/include/cru/ui/controls/TextHostControlService.hpp
+++ b/include/cru/ui/controls/TextHostControlService.hpp
@@ -161,18 +161,18 @@ class TextHostControlService : public Object {
void UpdateInputMethodPosition();
template <typename TArgs>
- void SetupOneHandler(event::RoutedEvent<TArgs>* (Control::*event)(),
+ void SetupOneHandler(events::RoutedEvent<TArgs>* (Control::*event)(),
void (TextHostControlService::*handler)(
- typename event::RoutedEvent<TArgs>::EventArgs)) {
+ typename events::RoutedEvent<TArgs>::EventArgs)) {
this->event_guard_ += (this->control_->*event)()->Bubble()->AddHandler(
std::bind(handler, this, std::placeholders::_1));
}
- void MouseMoveHandler(event::MouseEventArgs& args);
- void MouseDownHandler(event::MouseButtonEventArgs& args);
- void MouseUpHandler(event::MouseButtonEventArgs& args);
- void GainFocusHandler(event::FocusChangeEventArgs& args);
- void LoseFocusHandler(event::FocusChangeEventArgs& args);
+ void MouseMoveHandler(events::MouseEventArgs& args);
+ void MouseDownHandler(events::MouseButtonEventArgs& args);
+ void MouseUpHandler(events::MouseButtonEventArgs& args);
+ void GainFocusHandler(events::FocusChangeEventArgs& args);
+ void LoseFocusHandler(events::FocusChangeEventArgs& args);
void SetUpShortcuts();
diff --git a/include/cru/ui/events/FocusChangeEventArgs.hpp b/include/cru/ui/events/FocusChangeEventArgs.hpp
new file mode 100644
index 00000000..0e65c6e0
--- /dev/null
+++ b/include/cru/ui/events/FocusChangeEventArgs.hpp
@@ -0,0 +1,23 @@
+#pragma once
+#include "UiEventArgs.hpp"
+
+namespace cru::ui::events {
+
+class FocusChangeEventArgs : public UiEventArgs {
+ public:
+ FocusChangeEventArgs(Object* sender, Object* original_sender,
+ const bool is_window = false)
+ : UiEventArgs(sender, original_sender), is_window_(is_window) {}
+ FocusChangeEventArgs(const FocusChangeEventArgs& other) = default;
+ FocusChangeEventArgs(FocusChangeEventArgs&& other) = default;
+ FocusChangeEventArgs& operator=(const FocusChangeEventArgs& other) = default;
+ FocusChangeEventArgs& operator=(FocusChangeEventArgs&& other) = default;
+ ~FocusChangeEventArgs() override = default;
+
+ // Return whether the focus change is caused by the window-wide focus change.
+ bool IsWindow() const { return is_window_; }
+
+ private:
+ bool is_window_;
+};
+} // namespace cru::ui::event
diff --git a/include/cru/ui/events/KeyEventArgs.hpp b/include/cru/ui/events/KeyEventArgs.hpp
new file mode 100644
index 00000000..e402dd07
--- /dev/null
+++ b/include/cru/ui/events/KeyEventArgs.hpp
@@ -0,0 +1,29 @@
+#pragma once
+#include "UiEventArgs.hpp"
+
+#include "cru/platform/gui/Keyboard.hpp"
+
+namespace cru::ui::events {
+class KeyEventArgs : public UiEventArgs {
+ public:
+ KeyEventArgs(Object* sender, Object* original_sender,
+ platform::gui::KeyCode key_code,
+ platform::gui::KeyModifier key_modifier)
+ : UiEventArgs(sender, original_sender),
+ key_code_(key_code),
+ key_modifier_(key_modifier) {}
+ KeyEventArgs(const KeyEventArgs& other) = default;
+ KeyEventArgs(KeyEventArgs&& other) = default;
+ KeyEventArgs& operator=(const KeyEventArgs& other) = default;
+ KeyEventArgs& operator=(KeyEventArgs&& other) = default;
+ ~KeyEventArgs() override = default;
+
+ platform::gui::KeyCode GetKeyCode() const { return key_code_; }
+ platform::gui::KeyModifier GetKeyModifier() const { return key_modifier_; }
+
+ private:
+ platform::gui::KeyCode key_code_;
+ platform::gui::KeyModifier key_modifier_;
+};
+
+} // namespace cru::ui::event
diff --git a/include/cru/ui/events/MouseButtonEventArgs.hpp b/include/cru/ui/events/MouseButtonEventArgs.hpp
new file mode 100644
index 00000000..179ce8c8
--- /dev/null
+++ b/include/cru/ui/events/MouseButtonEventArgs.hpp
@@ -0,0 +1,35 @@
+#pragma once
+#include "MouseEventArgs.hpp"
+
+#include "cru/platform/gui/Keyboard.hpp"
+
+namespace cru::ui::events {
+
+class MouseButtonEventArgs : public MouseEventArgs {
+ public:
+ MouseButtonEventArgs(Object* sender, Object* original_sender,
+ const Point& point, const MouseButton button,
+ platform::gui::KeyModifier key_modifier)
+ : MouseEventArgs(sender, original_sender, point),
+ button_(button),
+ key_modifier_(key_modifier) {}
+ MouseButtonEventArgs(Object* sender, Object* original_sender,
+ const MouseButton button,
+ platform::gui::KeyModifier key_modifier)
+ : MouseEventArgs(sender, original_sender),
+ button_(button),
+ key_modifier_(key_modifier) {}
+ MouseButtonEventArgs(const MouseButtonEventArgs& other) = default;
+ MouseButtonEventArgs(MouseButtonEventArgs&& other) = default;
+ MouseButtonEventArgs& operator=(const MouseButtonEventArgs& other) = default;
+ MouseButtonEventArgs& operator=(MouseButtonEventArgs&& other) = default;
+ ~MouseButtonEventArgs() override = default;
+
+ MouseButton GetButton() const { return button_; }
+ platform::gui::KeyModifier GetKeyModifier() const { return key_modifier_; }
+
+ private:
+ MouseButton button_;
+ platform::gui::KeyModifier key_modifier_;
+};
+} // namespace cru::ui::event
diff --git a/include/cru/ui/events/MouseEventArgs.hpp b/include/cru/ui/events/MouseEventArgs.hpp
new file mode 100644
index 00000000..6d6aba15
--- /dev/null
+++ b/include/cru/ui/events/MouseEventArgs.hpp
@@ -0,0 +1,26 @@
+#pragma once
+#include "UiEventArgs.hpp"
+
+#include <optional>
+
+namespace cru::ui::events {
+class MouseEventArgs : public UiEventArgs {
+ public:
+ MouseEventArgs(Object* sender, Object* original_sender,
+ const std::optional<Point>& point = std::nullopt)
+ : UiEventArgs(sender, original_sender), point_(point) {}
+ MouseEventArgs(const MouseEventArgs& other) = default;
+ MouseEventArgs(MouseEventArgs&& other) = default;
+ MouseEventArgs& operator=(const MouseEventArgs& other) = default;
+ MouseEventArgs& operator=(MouseEventArgs&& other) = default;
+ ~MouseEventArgs() override = default;
+
+ // This point is relative to window client lefttop.
+ Point GetPoint() const { return point_.value_or(Point{}); }
+ Point GetPoint(render::RenderObject* render_target) const;
+ Point GetPointToContent(render::RenderObject* render_target) const;
+
+ private:
+ std::optional<Point> point_;
+};
+} // namespace cru::ui::event
diff --git a/include/cru/ui/events/MouseWheelEventArgs.hpp b/include/cru/ui/events/MouseWheelEventArgs.hpp
new file mode 100644
index 00000000..d0b3a145
--- /dev/null
+++ b/include/cru/ui/events/MouseWheelEventArgs.hpp
@@ -0,0 +1,29 @@
+#pragma once
+#include "MouseEventArgs.hpp"
+
+#include "cru/platform/gui/Keyboard.hpp"
+
+namespace cru::ui::events {
+class MouseWheelEventArgs : public MouseEventArgs {
+ public:
+ MouseWheelEventArgs(Object* sender, Object* original_sender,
+ const Point& point, const float delta,
+ platform::gui::KeyModifier key_modifier)
+ : MouseEventArgs(sender, original_sender, point),
+ delta_(delta),
+ key_modifier_(key_modifier) {}
+ MouseWheelEventArgs(const MouseWheelEventArgs& other) = default;
+ MouseWheelEventArgs(MouseWheelEventArgs&& other) = default;
+ MouseWheelEventArgs& operator=(const MouseWheelEventArgs& other) = default;
+ MouseWheelEventArgs& operator=(MouseWheelEventArgs&& other) = default;
+ ~MouseWheelEventArgs() override = default;
+
+ // Positive means down; Negative means up.
+ float GetDelta() const { return delta_; }
+ platform::gui::KeyModifier GetKeyModifier() const { return key_modifier_; }
+
+ private:
+ float delta_;
+ platform::gui::KeyModifier key_modifier_;
+};
+} // namespace cru::ui::event
diff --git a/include/cru/ui/events/PaintEventArgs.hpp b/include/cru/ui/events/PaintEventArgs.hpp
new file mode 100644
index 00000000..8bcb1590
--- /dev/null
+++ b/include/cru/ui/events/PaintEventArgs.hpp
@@ -0,0 +1,25 @@
+#pragma once
+#include "UiEventArgs.hpp"
+
+namespace cru::platform::graphics {
+struct IPainter;
+}
+
+namespace cru::ui::events {
+class PaintEventArgs : public UiEventArgs {
+ public:
+ PaintEventArgs(Object* sender, Object* original_sender,
+ platform::graphics::IPainter* painter)
+ : UiEventArgs(sender, original_sender), painter_(painter) {}
+ PaintEventArgs(const PaintEventArgs& other) = default;
+ PaintEventArgs(PaintEventArgs&& other) = default;
+ PaintEventArgs& operator=(const PaintEventArgs& other) = default;
+ PaintEventArgs& operator=(PaintEventArgs&& other) = default;
+ ~PaintEventArgs() = default;
+
+ platform::graphics::IPainter* GetPainter() const { return painter_; }
+
+ private:
+ platform::graphics::IPainter* painter_;
+};
+} // namespace cru::ui::event
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 <typename TEventArgs>
+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 RawEventArgs = TEventArgs;
+ using IEventType = IEvent<TEventArgs&>;
+ 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<TEventArgs&>* Direct() { return &direct_; }
+
+ IEvent<TEventArgs&>* Bubble() { return &bubble_; }
+
+ IEvent<TEventArgs&>* Tunnel() { return &tunnel_; }
+
+ private:
+ Event<TEventArgs&> direct_;
+ Event<TEventArgs&> bubble_;
+ Event<TEventArgs&> tunnel_;
+};
+} // namespace cru::ui::event
diff --git a/include/cru/ui/events/UiEvent.hpp b/include/cru/ui/events/UiEvent.hpp
deleted file mode 100644
index 33bc0a60..00000000
--- a/include/cru/ui/events/UiEvent.hpp
+++ /dev/null
@@ -1,235 +0,0 @@
-#pragma once
-#include "../Base.hpp"
-
-#include "cru/common/Event.hpp"
-#include "cru/platform/gui/Keyboard.hpp"
-
-#include <memory>
-#include <optional>
-#include <string>
-#include <type_traits>
-
-namespace cru::platform::graphics {
-struct IPainter;
-}
-
-namespace cru::ui::event {
-class UiEventArgs : public Object {
- public:
- UiEventArgs(Object* sender, Object* original_sender)
- : sender_(sender), original_sender_(original_sender), handled_(false) {}
-
- UiEventArgs(const UiEventArgs& other) = default;
- UiEventArgs(UiEventArgs&& other) = default;
- UiEventArgs& operator=(const UiEventArgs& other) = default;
- UiEventArgs& operator=(UiEventArgs&& other) = default;
- ~UiEventArgs() override = default;
-
- Object* GetSender() const { return sender_; }
-
- Object* GetOriginalSender() const { return original_sender_; }
-
- bool IsHandled() const { return handled_; }
- void SetHandled(const bool handled = true) { handled_ = handled; }
-
- private:
- Object* sender_;
- Object* original_sender_;
- bool handled_;
-};
-
-// TEventArgs must not be a reference type. This class help add reference.
-// EventArgs must be reference because the IsHandled property must be settable.
-template <typename TEventArgs>
-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 RawEventArgs = TEventArgs;
- using IEventType = IEvent<TEventArgs&>;
- 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<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 {
- public:
- MouseEventArgs(Object* sender, Object* original_sender,
- const std::optional<Point>& point = std::nullopt)
- : UiEventArgs(sender, original_sender), point_(point) {}
- MouseEventArgs(const MouseEventArgs& other) = default;
- MouseEventArgs(MouseEventArgs&& other) = default;
- MouseEventArgs& operator=(const MouseEventArgs& other) = default;
- MouseEventArgs& operator=(MouseEventArgs&& other) = default;
- ~MouseEventArgs() override = default;
-
- // This point is relative to window client lefttop.
- Point GetPoint() const { return point_.value_or(Point{}); }
- Point GetPoint(render::RenderObject* render_target) const;
- Point GetPointToContent(render::RenderObject* render_target) const;
-
- private:
- std::optional<Point> point_;
-};
-
-class MouseButtonEventArgs : public MouseEventArgs {
- public:
- MouseButtonEventArgs(Object* sender, Object* original_sender,
- const Point& point, const MouseButton button,
- platform::gui::KeyModifier key_modifier)
- : MouseEventArgs(sender, original_sender, point),
- button_(button),
- key_modifier_(key_modifier) {}
- MouseButtonEventArgs(Object* sender, Object* original_sender,
- const MouseButton button,
- platform::gui::KeyModifier key_modifier)
- : MouseEventArgs(sender, original_sender),
- button_(button),
- key_modifier_(key_modifier) {}
- MouseButtonEventArgs(const MouseButtonEventArgs& other) = default;
- MouseButtonEventArgs(MouseButtonEventArgs&& other) = default;
- MouseButtonEventArgs& operator=(const MouseButtonEventArgs& other) = default;
- MouseButtonEventArgs& operator=(MouseButtonEventArgs&& other) = default;
- ~MouseButtonEventArgs() override = default;
-
- MouseButton GetButton() const { return button_; }
- platform::gui::KeyModifier GetKeyModifier() const { return key_modifier_; }
-
- private:
- MouseButton button_;
- platform::gui::KeyModifier key_modifier_;
-};
-
-class MouseWheelEventArgs : public MouseEventArgs {
- public:
- MouseWheelEventArgs(Object* sender, Object* original_sender,
- const Point& point, const float delta,
- platform::gui::KeyModifier key_modifier)
- : MouseEventArgs(sender, original_sender, point),
- delta_(delta),
- key_modifier_(key_modifier) {}
- MouseWheelEventArgs(const MouseWheelEventArgs& other) = default;
- MouseWheelEventArgs(MouseWheelEventArgs&& other) = default;
- MouseWheelEventArgs& operator=(const MouseWheelEventArgs& other) = default;
- MouseWheelEventArgs& operator=(MouseWheelEventArgs&& other) = default;
- ~MouseWheelEventArgs() override = default;
-
- // Positive means down; Negative means up.
- float GetDelta() const { return delta_; }
- platform::gui::KeyModifier GetKeyModifier() const { return key_modifier_; }
-
- private:
- float delta_;
- platform::gui::KeyModifier key_modifier_;
-};
-
-class PaintEventArgs : public UiEventArgs {
- public:
- PaintEventArgs(Object* sender, Object* original_sender,
- platform::graphics::IPainter* painter)
- : UiEventArgs(sender, original_sender), painter_(painter) {}
- PaintEventArgs(const PaintEventArgs& other) = default;
- PaintEventArgs(PaintEventArgs&& other) = default;
- PaintEventArgs& operator=(const PaintEventArgs& other) = default;
- PaintEventArgs& operator=(PaintEventArgs&& other) = default;
- ~PaintEventArgs() = default;
-
- platform::graphics::IPainter* GetPainter() const { return painter_; }
-
- private:
- platform::graphics::IPainter* painter_;
-};
-
-class FocusChangeEventArgs : public UiEventArgs {
- public:
- FocusChangeEventArgs(Object* sender, Object* original_sender,
- const bool is_window = false)
- : UiEventArgs(sender, original_sender), is_window_(is_window) {}
- FocusChangeEventArgs(const FocusChangeEventArgs& other) = default;
- FocusChangeEventArgs(FocusChangeEventArgs&& other) = default;
- FocusChangeEventArgs& operator=(const FocusChangeEventArgs& other) = default;
- FocusChangeEventArgs& operator=(FocusChangeEventArgs&& other) = default;
- ~FocusChangeEventArgs() override = default;
-
- // Return whether the focus change is caused by the window-wide focus change.
- bool IsWindow() const { return is_window_; }
-
- private:
- bool is_window_;
-};
-
-/*
-class ToggleEventArgs : public UiEventArgs {
- public:
- ToggleEventArgs(Object* sender, Object* original_sender, bool new_state)
- : UiEventArgs(sender, original_sender), new_state_(new_state) {}
- ToggleEventArgs(const ToggleEventArgs& other) = default;
- ToggleEventArgs(ToggleEventArgs&& other) = default;
- ToggleEventArgs& operator=(const ToggleEventArgs& other) = default;
- ToggleEventArgs& operator=(ToggleEventArgs&& other) = default;
- ~ToggleEventArgs() override = default;
-
- bool GetNewState() const { return new_state_; }
-
- private:
- bool new_state_;
-};
-*/
-
-class KeyEventArgs : public UiEventArgs {
- public:
- KeyEventArgs(Object* sender, Object* original_sender,
- platform::gui::KeyCode key_code,
- platform::gui::KeyModifier key_modifier)
- : UiEventArgs(sender, original_sender),
- key_code_(key_code),
- key_modifier_(key_modifier) {}
- KeyEventArgs(const KeyEventArgs& other) = default;
- KeyEventArgs(KeyEventArgs&& other) = default;
- KeyEventArgs& operator=(const KeyEventArgs& other) = default;
- KeyEventArgs& operator=(KeyEventArgs&& other) = default;
- ~KeyEventArgs() override = default;
-
- platform::gui::KeyCode GetKeyCode() const { return key_code_; }
- platform::gui::KeyModifier GetKeyModifier() const { return key_modifier_; }
-
- private:
- platform::gui::KeyCode key_code_;
- platform::gui::KeyModifier key_modifier_;
-};
-
-class CharEventArgs : public UiEventArgs {
- public:
- CharEventArgs(Object* sender, Object* original_sender, std::u16string c)
- : UiEventArgs(sender, original_sender), c_(std::move(c)) {}
- CharEventArgs(const CharEventArgs& other) = default;
- CharEventArgs(CharEventArgs&& other) = default;
- CharEventArgs& operator=(const CharEventArgs& other) = default;
- CharEventArgs& operator=(CharEventArgs&& other) = default;
- ~CharEventArgs() override = default;
-
- std::u16string GetChar() const { return c_; }
-
- private:
- std::u16string c_;
-};
-} // namespace cru::ui::event
diff --git a/include/cru/ui/events/UiEventArgs.hpp b/include/cru/ui/events/UiEventArgs.hpp
new file mode 100644
index 00000000..d1b44940
--- /dev/null
+++ b/include/cru/ui/events/UiEventArgs.hpp
@@ -0,0 +1,28 @@
+#pragma once
+#include "../Base.hpp"
+
+namespace cru::ui::events {
+class UiEventArgs : public Object {
+ public:
+ UiEventArgs(Object* sender, Object* original_sender)
+ : sender_(sender), original_sender_(original_sender), handled_(false) {}
+
+ UiEventArgs(const UiEventArgs& other) = default;
+ UiEventArgs(UiEventArgs&& other) = default;
+ UiEventArgs& operator=(const UiEventArgs& other) = default;
+ UiEventArgs& operator=(UiEventArgs&& other) = default;
+ ~UiEventArgs() override = default;
+
+ Object* GetSender() const { return sender_; }
+
+ Object* GetOriginalSender() const { return original_sender_; }
+
+ bool IsHandled() const { return handled_; }
+ void SetHandled(const bool handled = true) { handled_ = handled; }
+
+ private:
+ Object* sender_;
+ Object* original_sender_;
+ bool handled_;
+};
+} // namespace cru::ui::event
diff --git a/include/cru/ui/events/UiEvents.hpp b/include/cru/ui/events/UiEvents.hpp
new file mode 100644
index 00000000..bd6f7d2a
--- /dev/null
+++ b/include/cru/ui/events/UiEvents.hpp
@@ -0,0 +1,10 @@
+#pragma once
+
+#include "FocusChangeEventArgs.hpp"
+#include "KeyEventArgs.hpp"
+#include "MouseButtonEventArgs.hpp"
+#include "MouseEventArgs.hpp"
+#include "MouseWheelEventArgs.hpp"
+#include "PaintEventArgs.hpp"
+#include "RoutedEvent.hpp"
+#include "UiEventArgs.hpp"
diff --git a/include/cru/ui/helper/ShortcutHub.hpp b/include/cru/ui/helper/ShortcutHub.hpp
index 5b9612ba..def024a8 100644
--- a/include/cru/ui/helper/ShortcutHub.hpp
+++ b/include/cru/ui/helper/ShortcutHub.hpp
@@ -1,7 +1,7 @@
#pragma once
#include "../Base.hpp"
-#include "../events/UiEvent.hpp"
+#include "../events/UiEvents.hpp"
#include "cru/common/Event.hpp"
#include "cru/platform/gui/Keyboard.hpp"
@@ -120,13 +120,13 @@ class ShortcutHub : public Object {
const std::vector<ShortcutInfo>& GetShortcutByKeyBind(
const ShortcutKeyBind& key_bind) const;
- IEvent<event::KeyEventArgs&>* FallbackKeyEvent() { return &fallback_event_; }
+ IEvent<events::KeyEventArgs&>* FallbackKeyEvent() { return &fallback_event_; }
void Install(controls::Control* control);
void Uninstall();
private:
- void OnKeyDown(event::KeyEventArgs& event);
+ void OnKeyDown(events::KeyEventArgs& event);
private:
std::unordered_map<ShortcutKeyBind, std::vector<ShortcutInfo>> map_;
@@ -135,7 +135,7 @@ class ShortcutHub : public Object {
int current_id_ = 1;
- Event<event::KeyEventArgs&> fallback_event_;
+ Event<events::KeyEventArgs&> fallback_event_;
EventRevokerListGuard event_guard_;
};
diff --git a/src/ui/CMakeLists.txt b/src/ui/CMakeLists.txt
index 35c3581f..e4707cbc 100644
--- a/src/ui/CMakeLists.txt
+++ b/src/ui/CMakeLists.txt
@@ -24,7 +24,7 @@ add_library(cru_ui STATIC
controls/TextBox.cpp
controls/TextHostControlService.cpp
controls/Window.cpp
- events/UiEvent.cpp
+ events/MouseEventArgs.cpp
helper/ClickDetector.cpp
helper/ShortcutHub.cpp
host/LayoutPaintCycler.cpp
@@ -68,7 +68,15 @@ target_sources(cru_ui PUBLIC
${CRU_UI_INCLUDE_DIR}/controls/TextBox.hpp
${CRU_UI_INCLUDE_DIR}/controls/TextHostControlService.hpp
${CRU_UI_INCLUDE_DIR}/controls/Window.hpp
- ${CRU_UI_INCLUDE_DIR}/events/UiEvent.hpp
+ ${CRU_UI_INCLUDE_DIR}/events/FocusChangeEventArgs.hpp
+ ${CRU_UI_INCLUDE_DIR}/events/KeyEventArgs.hpp
+ ${CRU_UI_INCLUDE_DIR}/events/MouseButtonEventArgs.hpp
+ ${CRU_UI_INCLUDE_DIR}/events/MouseEventArgs.hpp
+ ${CRU_UI_INCLUDE_DIR}/events/MouseWheelEventArgs.hpp
+ ${CRU_UI_INCLUDE_DIR}/events/PaintEventArgs.hpp
+ ${CRU_UI_INCLUDE_DIR}/events/RoutedEvent.hpp
+ ${CRU_UI_INCLUDE_DIR}/events/UiEventArgs.hpp
+ ${CRU_UI_INCLUDE_DIR}/events/UiEvents.hpp
${CRU_UI_INCLUDE_DIR}/helper/ClickDetector.hpp
${CRU_UI_INCLUDE_DIR}/helper/ShortcutHub.hpp
${CRU_UI_INCLUDE_DIR}/host/LayoutPaintCycler.hpp
diff --git a/src/ui/controls/Control.cpp b/src/ui/controls/Control.cpp
index 29c2c46a..44da7f6f 100644
--- a/src/ui/controls/Control.cpp
+++ b/src/ui/controls/Control.cpp
@@ -20,12 +20,12 @@ Control::Control() {
style_rule_set_bind_ =
std::make_unique<style::StyleRuleSetBind>(this, style_rule_set_.get());
- MouseEnterEvent()->Direct()->AddHandler([this](event::MouseEventArgs&) {
+ MouseEnterEvent()->Direct()->AddHandler([this](events::MouseEventArgs&) {
this->is_mouse_over_ = true;
this->OnMouseHoverChange(true);
});
- MouseLeaveEvent()->Direct()->AddHandler([this](event::MouseEventArgs&) {
+ MouseLeaveEvent()->Direct()->AddHandler([this](events::MouseEventArgs&) {
this->is_mouse_over_ = false;
this->OnMouseHoverChange(true);
});
diff --git a/src/ui/controls/TextHostControlService.cpp b/src/ui/controls/TextHostControlService.cpp
index b0759058..3a67860d 100644
--- a/src/ui/controls/TextHostControlService.cpp
+++ b/src/ui/controls/TextHostControlService.cpp
@@ -15,7 +15,7 @@
#include "cru/ui/Base.hpp"
#include "cru/ui/DebugFlags.hpp"
#include "cru/ui/components/Menu.hpp"
-#include "cru/ui/events/UiEvent.hpp"
+#include "cru/ui/events/UiEvents.hpp"
#include "cru/ui/helper/ShortcutHub.hpp"
#include "cru/ui/host/WindowHost.hpp"
#include "cru/ui/render/ScrollRenderObject.hpp"
@@ -445,7 +445,7 @@ void TextHostControlService::UpdateInputMethodPosition() {
}
void TextHostControlService::MouseDownHandler(
- event::MouseButtonEventArgs& args) {
+ events::MouseButtonEventArgs& args) {
if (IsEnabled()) {
this->control_->SetFocus();
if (args.GetButton() == mouse_buttons::left &&
@@ -461,14 +461,14 @@ void TextHostControlService::MouseDownHandler(
}
}
-void TextHostControlService::MouseUpHandler(event::MouseButtonEventArgs& args) {
+void TextHostControlService::MouseUpHandler(events::MouseButtonEventArgs& args) {
if (args.GetButton() == mouse_buttons::left && mouse_move_selecting_) {
this->control_->ReleaseMouse();
this->mouse_move_selecting_ = false;
}
}
-void TextHostControlService::MouseMoveHandler(event::MouseEventArgs& args) {
+void TextHostControlService::MouseMoveHandler(events::MouseEventArgs& args) {
if (this->mouse_move_selecting_) {
const auto text_render_object = this->GetTextRenderObject();
const auto result = text_render_object->TextHitTest(
@@ -479,7 +479,7 @@ void TextHostControlService::MouseMoveHandler(event::MouseEventArgs& args) {
}
void TextHostControlService::GainFocusHandler(
- event::FocusChangeEventArgs& args) {
+ events::FocusChangeEventArgs& args) {
CRU_UNUSED(args);
if (editable_) {
auto input_method_context = GetInputMethodContext();
@@ -514,7 +514,7 @@ void TextHostControlService::GainFocusHandler(
}
void TextHostControlService::LoseFocusHandler(
- event::FocusChangeEventArgs& args) {
+ events::FocusChangeEventArgs& args) {
if (!args.IsWindow()) this->AbortSelection();
input_method_context_event_guard_.Clear();
auto input_method_context = GetInputMethodContext();
diff --git a/src/ui/events/UiEvent.cpp b/src/ui/events/MouseEventArgs.cpp
index 4c75f690..b27bb9d4 100644
--- a/src/ui/events/UiEvent.cpp
+++ b/src/ui/events/MouseEventArgs.cpp
@@ -1,8 +1,8 @@
-#include "cru/ui/events/UiEvent.hpp"
+#include "cru/ui/events/MouseEventArgs.hpp"
#include "cru/ui/render/RenderObject.hpp"
-namespace cru::ui::event {
+namespace cru::ui::events {
Point MouseEventArgs::GetPoint(render::RenderObject* render_object) const {
return GetPoint() - render_object->GetTotalOffset();
}
@@ -11,4 +11,4 @@ Point MouseEventArgs::GetPointToContent(
render::RenderObject* render_object) const {
return render_object->FromRootToContent(GetPoint());
}
-} // namespace cru::ui::event
+} // namespace cru::ui::events
diff --git a/src/ui/helper/ClickDetector.cpp b/src/ui/helper/ClickDetector.cpp
index 309685d3..d8d51327 100644
--- a/src/ui/helper/ClickDetector.cpp
+++ b/src/ui/helper/ClickDetector.cpp
@@ -12,7 +12,7 @@ ClickDetector::ClickDetector(controls::Control* control) {
event_rovoker_guards_.push_back(
EventRevokerGuard(control->MouseEnterEvent()->Direct()->AddHandler(
- [this](event::MouseEventArgs&) {
+ [this](events::MouseEventArgs&) {
if (this->enable_) {
if (this->state_ == ClickState::PressInactive) {
if ((this->button_ & this->trigger_button_)) {
@@ -26,7 +26,7 @@ ClickDetector::ClickDetector(controls::Control* control) {
event_rovoker_guards_.push_back(
EventRevokerGuard(control->MouseLeaveEvent()->Direct()->AddHandler(
- [this](event::MouseEventArgs&) {
+ [this](events::MouseEventArgs&) {
if (this->enable_) {
if (this->state_ == ClickState::Press) {
if ((this->button_ & this->trigger_button_)) {
@@ -40,7 +40,7 @@ ClickDetector::ClickDetector(controls::Control* control) {
event_rovoker_guards_.push_back(
EventRevokerGuard(control->MouseDownEvent()->Direct()->AddHandler(
- [this](event::MouseButtonEventArgs& args) {
+ [this](events::MouseButtonEventArgs& args) {
const auto button = args.GetButton();
if (this->enable_ && (button & this->trigger_button_) &&
this->state_ == ClickState::Hover) {
@@ -59,7 +59,7 @@ ClickDetector::ClickDetector(controls::Control* control) {
event_rovoker_guards_.push_back(
EventRevokerGuard(control->MouseUpEvent()->Direct()->AddHandler(
- [this](event::MouseButtonEventArgs& args) {
+ [this](events::MouseButtonEventArgs& args) {
const auto button = args.GetButton();
if (this->enable_ && (button & this->trigger_button_) &&
button == button_) {
diff --git a/src/ui/helper/ShortcutHub.cpp b/src/ui/helper/ShortcutHub.cpp
index f35ad0ef..c0b6c5d8 100644
--- a/src/ui/helper/ShortcutHub.cpp
+++ b/src/ui/helper/ShortcutHub.cpp
@@ -81,7 +81,7 @@ void ShortcutHub::Uninstall() {
event_guard_.Clear();
}
-void ShortcutHub::OnKeyDown(event::KeyEventArgs& event) {
+void ShortcutHub::OnKeyDown(events::KeyEventArgs& event) {
ShortcutKeyBind key_bind(event.GetKeyCode(), event.GetKeyModifier());
const auto& shortcut_list = this->GetShortcutByKeyBind(key_bind);
diff --git a/src/ui/host/RoutedEventDispatch.hpp b/src/ui/host/RoutedEventDispatch.hpp
index 52507fc7..027ddbe4 100644
--- a/src/ui/host/RoutedEventDispatch.hpp
+++ b/src/ui/host/RoutedEventDispatch.hpp
@@ -23,7 +23,7 @@ template <typename EventArgs, typename... Args>
void DispatchEvent(
const std::u16string_view& event_name,
controls::Control* const original_sender,
- event::RoutedEvent<EventArgs>* (controls::Control::*event_ptr)(),
+ events::RoutedEvent<EventArgs>* (controls::Control::*event_ptr)(),
controls::Control* const last_receiver, Args&&... args) {
CRU_UNUSED(event_name)
diff --git a/src/ui/render/ScrollBar.cpp b/src/ui/render/ScrollBar.cpp
index aeecd9e2..8e16862f 100644
--- a/src/ui/render/ScrollBar.cpp
+++ b/src/ui/render/ScrollBar.cpp
@@ -12,7 +12,7 @@
#include "cru/ui/Base.hpp"
#include "cru/ui/ThemeManager.hpp"
#include "cru/ui/UiManager.hpp"
-#include "cru/ui/events/UiEvent.hpp"
+#include "cru/ui/events/UiEvents.hpp"
#include "cru/ui/helper/ClickDetector.hpp"
#include "cru/ui/host/WindowHost.hpp"
#include "cru/ui/render/ScrollRenderObject.hpp"
@@ -124,7 +124,7 @@ void ScrollBar::InstallHandlers(controls::Control* control) {
if (control != nullptr) {
event_guard_ +=
control->MouseDownEvent()->Tunnel()->PrependShortCircuitHandler(
- [control, this](event::MouseButtonEventArgs& event) {
+ [control, this](events::MouseButtonEventArgs& event) {
if (event.GetButton() == mouse_buttons::left && IsEnabled() &&
IsExpanded()) {
auto hit_test_result =
@@ -178,7 +178,7 @@ void ScrollBar::InstallHandlers(controls::Control* control) {
event_guard_ +=
control->MouseUpEvent()->Tunnel()->PrependShortCircuitHandler(
- [control, this](event::MouseButtonEventArgs& event) {
+ [control, this](events::MouseButtonEventArgs& event) {
if (mouse_press_ != std::nullopt) {
mouse_press_ = std::nullopt;
render_object_->InvalidatePaint();
@@ -203,7 +203,7 @@ void ScrollBar::InstallHandlers(controls::Control* control) {
event_guard_ +=
control->MouseMoveEvent()->Tunnel()->PrependShortCircuitHandler(
- [this](event::MouseEventArgs& event) {
+ [this](events::MouseEventArgs& event) {
if (move_thumb_start_) {
auto new_scroll_position = CalculateNewScrollPosition(
move_thumb_thumb_original_rect_,
@@ -249,7 +249,7 @@ void ScrollBar::InstallHandlers(controls::Control* control) {
event_guard_ +=
control->MouseLeaveEvent()->Tunnel()->PrependShortCircuitHandler(
- [this](event::MouseEventArgs&) {
+ [this](events::MouseEventArgs&) {
if (IsExpanded() && !move_thumb_start_) {
if (mouse_hover_ != std::nullopt) {
mouse_hover_ = std::nullopt;
diff --git a/src/ui/render/ScrollRenderObject.cpp b/src/ui/render/ScrollRenderObject.cpp
index 93472cdc..bd9b8559 100644
--- a/src/ui/render/ScrollRenderObject.cpp
+++ b/src/ui/render/ScrollRenderObject.cpp
@@ -211,7 +211,7 @@ void ScrollRenderObject::InstallMouseWheelHandler(controls::Control* control) {
if (control != nullptr) {
guard_ += control->MouseWheelEvent()->Bubble()->PrependShortCircuitHandler(
- [this](event::MouseWheelEventArgs& args) {
+ [this](events::MouseWheelEventArgs& args) {
auto delta = args.GetDelta();
delta *= 24;