diff options
author | crupest <crupest@outlook.com> | 2021-12-13 20:58:42 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2021-12-13 20:58:42 +0800 |
commit | 21fccf43ec049569f690674840ca1a10420a40da (patch) | |
tree | 33341a51f41bc9d783221ad363e33ffeb177886b | |
parent | c850d817cc0d8c2c80728f373f89dce91650023a (diff) | |
download | cru-21fccf43ec049569f690674840ca1a10420a40da.tar.gz cru-21fccf43ec049569f690674840ca1a10420a40da.tar.bz2 cru-21fccf43ec049569f690674840ca1a10420a40da.zip |
...
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; |