From 9110574bb51e9e2959842a7641f598d34c3cd847 Mon Sep 17 00:00:00 2001 From: crupest Date: Fri, 13 Dec 2019 01:02:47 +0800 Subject: ... --- include/cru/ui/base.hpp | 5 +- include/cru/ui/control.hpp | 21 +- include/cru/ui/controls/button.hpp | 17 +- include/cru/ui/controls/container.hpp | 4 +- include/cru/ui/controls/flex_layout.hpp | 4 +- include/cru/ui/controls/text_block.hpp | 12 +- include/cru/ui/event/ui_event.hpp | 213 --------------------- include/cru/ui/render/border_render_object.hpp | 30 ++- .../cru/ui/render/flex_layout_render_object.hpp | 2 +- include/cru/ui/render/render_object.hpp | 7 +- include/cru/ui/render/text_render_object.hpp | 38 ++-- include/cru/ui/render/window_render_object.hpp | 2 +- include/cru/ui/ui_event.hpp | 210 ++++++++++++++++++++ include/cru/ui/ui_manager.hpp | 17 +- include/cru/ui/window.hpp | 16 +- 15 files changed, 294 insertions(+), 304 deletions(-) delete mode 100644 include/cru/ui/event/ui_event.hpp create mode 100644 include/cru/ui/ui_event.hpp (limited to 'include/cru/ui') diff --git a/include/cru/ui/base.hpp b/include/cru/ui/base.hpp index a5e656ff..581e6f8f 100644 --- a/include/cru/ui/base.hpp +++ b/include/cru/ui/base.hpp @@ -1,5 +1,6 @@ #pragma once -#include "cru/platform/graphic_base.hpp" +#include "cru/common/base.hpp" +#include "cru/platform/graph_base.hpp" #include "cru/platform/matrix.hpp" #include "cru/platform/native/basic_types.hpp" @@ -17,7 +18,7 @@ using cru::platform::native::MouseButton; namespace colors { using cru::platform::colors::black; -using cru::platform::colors::white; using cru::platform::colors::skyblue; +using cru::platform::colors::white; } // namespace colors } // namespace cru::ui diff --git a/include/cru/ui/control.hpp b/include/cru/ui/control.hpp index cf4f9053..1fe49261 100644 --- a/include/cru/ui/control.hpp +++ b/include/cru/ui/control.hpp @@ -1,15 +1,18 @@ #pragma once #include "base.hpp" -#include "cru/common/base.hpp" -#include "cru/platform/native/basic_types.hpp" -#include "cru/platform/native/cursor.hpp" -#include "event/ui_event.hpp" +#include "cru/common/event.hpp" +#include "ui_event.hpp" +#include #include #include #include +namespace cru::platform::native { +struct ICursor; +} + namespace cru::ui { class Window; namespace render { @@ -30,7 +33,7 @@ class Control : public Object { ~Control() override = default; public: - virtual std::wstring_view GetControlType() const = 0; + virtual std::string_view GetControlType() const = 0; //*************** region: tree *************** public: @@ -74,13 +77,13 @@ class Control : public Object { // Cursor is inherited from parent recursively if not set. public: // null for not set - std::shared_ptr GetCursor(); + std::shared_ptr GetCursor(); // will not return nullptr - std::shared_ptr GetInheritedCursor(); + std::shared_ptr GetInheritedCursor(); // null to unset - void SetCursor(std::shared_ptr cursor); + void SetCursor(std::shared_ptr cursor); //*************** region: events *************** public: @@ -163,6 +166,6 @@ class Control : public Object { bool right; } click_map_; - std::shared_ptr cursor_ = nullptr; + std::shared_ptr cursor_ = nullptr; }; } // namespace cru::ui diff --git a/include/cru/ui/controls/button.hpp b/include/cru/ui/controls/button.hpp index d4a03e1d..60b1243f 100644 --- a/include/cru/ui/controls/button.hpp +++ b/include/cru/ui/controls/button.hpp @@ -3,24 +3,19 @@ #include "../click_detector.hpp" #include "../render/border_render_object.hpp" -#include "cru/platform/graph/brush.hpp" #include "cru/platform/native/basic_types.hpp" #include -namespace cru::ui::render { -class BorderRenderObject; -} - namespace cru::ui::controls { using render::CornerRadius; struct ButtonStateStyle { - std::shared_ptr border_brush; + std::shared_ptr border_brush; Thickness border_thickness; CornerRadius border_radius; - std::shared_ptr foreground_brush; - std::shared_ptr background_brush; + std::shared_ptr foreground_brush; + std::shared_ptr background_brush; }; struct ButtonStyle { @@ -47,7 +42,7 @@ enum class ButtonState { class Button : public ContentControl { public: - static constexpr auto control_type = L"Button"; + static constexpr std::string_view control_type = "Button"; static Button* Create() { return new Button(); } @@ -61,7 +56,7 @@ class Button : public ContentControl { Button& operator=(Button&& other) = delete; ~Button() override = default; - std::wstring_view GetControlType() const override final { + std::string_view GetControlType() const final { return control_type; } @@ -96,7 +91,7 @@ class Button : public ContentControl { } private: - std::shared_ptr render_object_{}; + std::unique_ptr render_object_{}; ButtonState state_ = ButtonState::Normal; diff --git a/include/cru/ui/controls/container.hpp b/include/cru/ui/controls/container.hpp index 3c877067..efc099f7 100644 --- a/include/cru/ui/controls/container.hpp +++ b/include/cru/ui/controls/container.hpp @@ -7,7 +7,7 @@ class BorderRenderObject; namespace cru::ui::controls { class Container : public ContentControl { - static constexpr auto control_type = L"Container"; + static constexpr std::string_view control_type = "Container"; protected: Container(); @@ -19,7 +19,7 @@ class Container : public ContentControl { ~Container() override; public: - std::wstring_view GetControlType() const override final { + std::string_view GetControlType() const final { return control_type; } diff --git a/include/cru/ui/controls/flex_layout.hpp b/include/cru/ui/controls/flex_layout.hpp index d8d92d08..ff8ec53b 100644 --- a/include/cru/ui/controls/flex_layout.hpp +++ b/include/cru/ui/controls/flex_layout.hpp @@ -15,7 +15,7 @@ using render::FlexMainAlignment; class FlexLayout : public LayoutControl { public: - static constexpr auto control_type = L"FlexLayout"; + static constexpr std::string_view control_type = "FlexLayout"; static FlexLayout* Create() { return new FlexLayout(); } @@ -29,7 +29,7 @@ class FlexLayout : public LayoutControl { FlexLayout& operator=(FlexLayout&& other) = delete; ~FlexLayout() override = default; - std::wstring_view GetControlType() const override final { + std::string_view GetControlType() const final { return control_type; } diff --git a/include/cru/ui/controls/text_block.hpp b/include/cru/ui/controls/text_block.hpp index 45cd12b9..708b62f1 100644 --- a/include/cru/ui/controls/text_block.hpp +++ b/include/cru/ui/controls/text_block.hpp @@ -10,7 +10,7 @@ class TextRenderObject; namespace cru::ui::controls { class TextBlock : public NoChildControl { public: - static constexpr auto control_type = L"TextBlock"; + static constexpr std::string_view control_type = "TextBlock"; static TextBlock* Create() { return new TextBlock(); } @@ -22,18 +22,18 @@ class TextBlock : public NoChildControl { TextBlock(TextBlock&& other) = delete; TextBlock& operator=(const TextBlock& other) = delete; TextBlock& operator=(TextBlock&& other) = delete; - ~TextBlock() override = default; + ~TextBlock() override; - std::wstring_view GetControlType() const override final { + std::string_view GetControlType() const final { return control_type; } render::RenderObject* GetRenderObject() const override; - std::wstring GetText() const; - void SetText(std::wstring text); + std::string GetText() const; + void SetText(std::string text); private: - std::shared_ptr render_object_; + std::unique_ptr render_object_; }; } // namespace cru::ui::controls diff --git a/include/cru/ui/event/ui_event.hpp b/include/cru/ui/event/ui_event.hpp deleted file mode 100644 index b962ff76..00000000 --- a/include/cru/ui/event/ui_event.hpp +++ /dev/null @@ -1,213 +0,0 @@ -#pragma once -#include "cru/common/base.hpp" - -#include "../base.hpp" -#include "cru/common/event.hpp" - -#include -#include -#include - -namespace cru::platform::graph { -class Painter; -} - -namespace cru::ui { -class Control; -} - -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* 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 -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 EventArgs = 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; - - IEvent* Direct() { return &direct_; } - - IEvent* Bubble() { return &bubble_; } - - IEvent* Tunnel() { return &tunnel_; } - - private: - Event direct_; - Event bubble_; - Event tunnel_; -}; - -class MouseEventArgs : public UiEventArgs { - public: - MouseEventArgs(Object* sender, Object* original_sender, - const std::optional& 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; - - Point GetPoint() const { return point_.value_or(Point{}); } - - private: - std::optional point_; -}; - -class MouseButtonEventArgs : public MouseEventArgs { - public: - MouseButtonEventArgs(Object* sender, Object* original_sender, - const Point& point, const MouseButton button) - : MouseEventArgs(sender, original_sender, point), button_(button) {} - MouseButtonEventArgs(Object* sender, Object* original_sender, - const MouseButton button) - : MouseEventArgs(sender, original_sender), button_(button) {} - MouseButtonEventArgs(const MouseButtonEventArgs& other) = default; - MouseButtonEventArgs(MouseButtonEventArgs&& other) = default; - MouseButtonEventArgs& operator=(const MouseButtonEventArgs& other) = default; - MouseButtonEventArgs& operator=(MouseButtonEventArgs&& other) = default; - ~MouseButtonEventArgs() override = default; - - MouseButton GetMouseButton() const { return button_; } - - private: - MouseButton button_; -}; - -class MouseWheelEventArgs : public MouseEventArgs { - public: - MouseWheelEventArgs(Object* sender, Object* original_sender, - const Point& point, const float delta) - : MouseEventArgs(sender, original_sender, point), delta_(delta) {} - MouseWheelEventArgs(const MouseWheelEventArgs& other) = default; - MouseWheelEventArgs(MouseWheelEventArgs&& other) = default; - MouseWheelEventArgs& operator=(const MouseWheelEventArgs& other) = default; - MouseWheelEventArgs& operator=(MouseWheelEventArgs&& other) = default; - ~MouseWheelEventArgs() override = default; - - float GetDelta() const { return delta_; } - - private: - float delta_; -}; - -class PaintEventArgs : public UiEventArgs { - public: - PaintEventArgs(Object* sender, Object* original_sender, - platform::graph::Painter* 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::graph::Painter* GetPainter() const { return painter_; } - - private: - platform::graph::Painter* 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, int virtual_code) - : UiEventArgs(sender, original_sender), virtual_code_(virtual_code) {} - KeyEventArgs(const KeyEventArgs& other) = default; - KeyEventArgs(KeyEventArgs&& other) = default; - KeyEventArgs& operator=(const KeyEventArgs& other) = default; - KeyEventArgs& operator=(KeyEventArgs&& other) = default; - ~KeyEventArgs() override = default; - - int GetVirtualCode() const { return virtual_code_; } - - private: - int virtual_code_; -}; - -/* -class CharEventArgs : public UiEventArgs { - public: - CharEventArgs(Object* sender, Object* original_sender, wchar_t c) - : UiEventArgs(sender, original_sender), c_(c) {} - CharEventArgs(const CharEventArgs& other) = default; - CharEventArgs(CharEventArgs&& other) = default; - CharEventArgs& operator=(const CharEventArgs& other) = default; - CharEventArgs& operator=(CharEventArgs&& other) = default; - ~CharEventArgs() override = default; - - wchar_t GetChar() const { return c_; } - - private: - wchar_t c_; -}; -*/ -} // namespace cru::ui::event diff --git a/include/cru/ui/render/border_render_object.hpp b/include/cru/ui/render/border_render_object.hpp index 5520ab2e..726510a8 100644 --- a/include/cru/ui/render/border_render_object.hpp +++ b/include/cru/ui/render/border_render_object.hpp @@ -1,13 +1,11 @@ #pragma once -#include "cru/platform/graph/brush.hpp" -#include "cru/ui/base.hpp" #include "render_object.hpp" #include namespace cru::platform::graph { -class Brush; -class IGeometry; +struct IBrush; +struct IGeometry; } // namespace cru::platform::graph namespace cru::ui::render { @@ -55,19 +53,19 @@ class BorderRenderObject : public RenderObject { bool IsBorderEnabled() const { return is_border_enabled_; } void SetBorderEnabled(bool enabled) { is_border_enabled_ = enabled; } - std::shared_ptr GetBorderBrush() { + std::shared_ptr GetBorderBrush() { return border_brush_; } - void SetBorderBrush(std::shared_ptr brush) { + void SetBorderBrush(std::shared_ptr brush) { if (brush == border_brush_) return; border_brush_ = std::move(brush); InvalidatePaint(); } - platform::Thickness GetBorderThickness() { return border_thickness_; } + Thickness GetBorderThickness() { return border_thickness_; } - void SetBorderThickness(const platform::Thickness thickness) { + void SetBorderThickness(const Thickness thickness) { if (thickness == border_thickness_) return; border_thickness_ = thickness; InvalidateLayout(); @@ -81,27 +79,27 @@ class BorderRenderObject : public RenderObject { RecreateGeometry(); } - std::shared_ptr GetForegroundBrush() { + std::shared_ptr GetForegroundBrush() { return foreground_brush_; } - void SetForegroundBrush(std::shared_ptr brush) { + void SetForegroundBrush(std::shared_ptr brush) { if (brush == foreground_brush_) return; foreground_brush_ = std::move(brush); InvalidatePaint(); } - std::shared_ptr GetBackgroundBrush() { + std::shared_ptr GetBackgroundBrush() { return background_brush_; } - void SetBackgroundBrush(std::shared_ptr brush) { + void SetBackgroundBrush(std::shared_ptr brush) { if (brush == background_brush_) return; background_brush_ = std::move(brush); InvalidatePaint(); } - void Draw(platform::graph::Painter* painter) override; + void Draw(platform::graph::IPainter* painter) override; RenderObject* HitTest(const Point& point) override; @@ -123,12 +121,12 @@ class BorderRenderObject : public RenderObject { private: bool is_border_enabled_ = false; - std::shared_ptr border_brush_; + std::shared_ptr border_brush_; platform::Thickness border_thickness_; CornerRadius border_radius_; - std::shared_ptr foreground_brush_; - std::shared_ptr background_brush_; + std::shared_ptr foreground_brush_; + std::shared_ptr background_brush_; // The ring. Used for painting. std::unique_ptr geometry_; diff --git a/include/cru/ui/render/flex_layout_render_object.hpp b/include/cru/ui/render/flex_layout_render_object.hpp index 7b71b96e..5a8d09ba 100644 --- a/include/cru/ui/render/flex_layout_render_object.hpp +++ b/include/cru/ui/render/flex_layout_render_object.hpp @@ -78,7 +78,7 @@ class FlexLayoutRenderObject : public RenderObject { InvalidateLayout(); } - void Draw(platform::graph::Painter* painter) override; + void Draw(platform::graph::IPainter* painter) override; RenderObject* HitTest(const Point& point) override; diff --git a/include/cru/ui/render/render_object.hpp b/include/cru/ui/render/render_object.hpp index befaa3ec..55b7f2da 100644 --- a/include/cru/ui/render/render_object.hpp +++ b/include/cru/ui/render/render_object.hpp @@ -1,7 +1,6 @@ #pragma once -#include "cru/common/base.hpp" - #include "../base.hpp" + #include "cru/common/event.hpp" #include @@ -12,7 +11,7 @@ class Control; } namespace cru::platform::graph { -class Painter; +struct IPainter; } namespace cru::ui::render { @@ -75,7 +74,7 @@ class RenderObject : public Object { void Measure(const Size& available_size); void Layout(const Rect& rect); - virtual void Draw(platform::graph::Painter* painter) = 0; + virtual void Draw(platform::graph::IPainter* painter) = 0; virtual RenderObject* HitTest(const Point& point) = 0; diff --git a/include/cru/ui/render/text_render_object.hpp b/include/cru/ui/render/text_render_object.hpp index a10e3b74..6c01ed93 100644 --- a/include/cru/ui/render/text_render_object.hpp +++ b/include/cru/ui/render/text_render_object.hpp @@ -6,33 +6,33 @@ // forward declarations namespace cru::platform::graph { -class Brush; -class Font; -class TextLayout; +struct IBrush; +struct IFont; +struct ITextLayout; } // namespace cru::platform::graph namespace cru::ui::render { class TextRenderObject : public RenderObject { public: - TextRenderObject(std::shared_ptr brush, - std::shared_ptr font, - std::shared_ptr selection_brush); + TextRenderObject(std::shared_ptr brush, + std::shared_ptr font, + std::shared_ptr selection_brush); TextRenderObject(const TextRenderObject& other) = delete; TextRenderObject(TextRenderObject&& other) = delete; TextRenderObject& operator=(const TextRenderObject& other) = delete; TextRenderObject& operator=(TextRenderObject&& other) = delete; ~TextRenderObject() override = default; - std::wstring GetText() const; - void SetText(std::wstring new_text); + std::string GetText() const; + void SetText(std::string new_text); - std::shared_ptr GetBrush() const { return brush_; } - void SetBrush(std::shared_ptr new_brush) { + std::shared_ptr GetBrush() const { return brush_; } + void SetBrush(std::shared_ptr new_brush) { new_brush.swap(brush_); } - std::shared_ptr GetFont() const; - void SetFont(std::shared_ptr font); + std::shared_ptr GetFont() const; + void SetFont(std::shared_ptr font); std::optional GetSelectionRange() const { return selection_range_; @@ -41,14 +41,14 @@ class TextRenderObject : public RenderObject { selection_range_ = std::move(new_range); } - std::shared_ptr GetSelectionBrush() const { + std::shared_ptr GetSelectionBrush() const { return selection_brush_; } - void SetSelectionBrush(std::shared_ptr new_brush) { + void SetSelectionBrush(std::shared_ptr new_brush) { new_brush.swap(selection_brush_); } - void Draw(platform::graph::Painter* painter) override; + void Draw(platform::graph::IPainter* painter) override; RenderObject* HitTest(const Point& point) override; @@ -59,11 +59,11 @@ class TextRenderObject : public RenderObject { void OnAfterLayout() override; private: - std::shared_ptr brush_; - std::shared_ptr font_; - std::shared_ptr text_layout_; + std::shared_ptr brush_; + std::shared_ptr font_; + std::unique_ptr text_layout_; std::optional selection_range_ = std::nullopt; - std::shared_ptr selection_brush_; + std::shared_ptr selection_brush_; }; } // namespace cru::ui::render diff --git a/include/cru/ui/render/window_render_object.hpp b/include/cru/ui/render/window_render_object.hpp index 2260c293..8f35ad80 100644 --- a/include/cru/ui/render/window_render_object.hpp +++ b/include/cru/ui/render/window_render_object.hpp @@ -21,7 +21,7 @@ class WindowRenderObject : public RenderObject { void Relayout(); - void Draw(platform::graph::Painter* painter) override; + void Draw(platform::graph::IPainter* painter) override; RenderObject* HitTest(const Point& point) override; diff --git a/include/cru/ui/ui_event.hpp b/include/cru/ui/ui_event.hpp new file mode 100644 index 00000000..7a688d6d --- /dev/null +++ b/include/cru/ui/ui_event.hpp @@ -0,0 +1,210 @@ +#pragma once +#include "base.hpp" + +#include +#include +#include + +namespace cru::platform::graph { +struct IPainter; +} + +namespace cru::ui { +class Control; +} + +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* 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 +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 EventArgs = 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; + + IEvent* Direct() { return &direct_; } + + IEvent* Bubble() { return &bubble_; } + + IEvent* Tunnel() { return &tunnel_; } + + private: + Event direct_; + Event bubble_; + Event tunnel_; +}; + +class MouseEventArgs : public UiEventArgs { + public: + MouseEventArgs(Object* sender, Object* original_sender, + const std::optional& 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; + + Point GetPoint() const { return point_.value_or(Point{}); } + + private: + std::optional point_; +}; + +class MouseButtonEventArgs : public MouseEventArgs { + public: + MouseButtonEventArgs(Object* sender, Object* original_sender, + const Point& point, const MouseButton button) + : MouseEventArgs(sender, original_sender, point), button_(button) {} + MouseButtonEventArgs(Object* sender, Object* original_sender, + const MouseButton button) + : MouseEventArgs(sender, original_sender), button_(button) {} + MouseButtonEventArgs(const MouseButtonEventArgs& other) = default; + MouseButtonEventArgs(MouseButtonEventArgs&& other) = default; + MouseButtonEventArgs& operator=(const MouseButtonEventArgs& other) = default; + MouseButtonEventArgs& operator=(MouseButtonEventArgs&& other) = default; + ~MouseButtonEventArgs() override = default; + + MouseButton GetMouseButton() const { return button_; } + + private: + MouseButton button_; +}; + +class MouseWheelEventArgs : public MouseEventArgs { + public: + MouseWheelEventArgs(Object* sender, Object* original_sender, + const Point& point, const float delta) + : MouseEventArgs(sender, original_sender, point), delta_(delta) {} + MouseWheelEventArgs(const MouseWheelEventArgs& other) = default; + MouseWheelEventArgs(MouseWheelEventArgs&& other) = default; + MouseWheelEventArgs& operator=(const MouseWheelEventArgs& other) = default; + MouseWheelEventArgs& operator=(MouseWheelEventArgs&& other) = default; + ~MouseWheelEventArgs() override = default; + + float GetDelta() const { return delta_; } + + private: + float delta_; +}; + +class PaintEventArgs : public UiEventArgs { + public: + PaintEventArgs(Object* sender, Object* original_sender, + platform::graph::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::graph::IPainter* GetPainter() const { return painter_; } + + private: + platform::graph::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, int virtual_code) + : UiEventArgs(sender, original_sender), virtual_code_(virtual_code) {} + KeyEventArgs(const KeyEventArgs& other) = default; + KeyEventArgs(KeyEventArgs&& other) = default; + KeyEventArgs& operator=(const KeyEventArgs& other) = default; + KeyEventArgs& operator=(KeyEventArgs&& other) = default; + ~KeyEventArgs() override = default; + + int GetVirtualCode() const { return virtual_code_; } + + private: + int virtual_code_; +}; + +/* +class CharEventArgs : public UiEventArgs { + public: + CharEventArgs(Object* sender, Object* original_sender, wchar_t c) + : UiEventArgs(sender, original_sender), c_(c) {} + CharEventArgs(const CharEventArgs& other) = default; + CharEventArgs(CharEventArgs&& other) = default; + CharEventArgs& operator=(const CharEventArgs& other) = default; + CharEventArgs& operator=(CharEventArgs&& other) = default; + ~CharEventArgs() override = default; + + wchar_t GetChar() const { return c_; } + + private: + wchar_t c_; +}; +*/ +} // namespace cru::ui::event diff --git a/include/cru/ui/ui_manager.hpp b/include/cru/ui/ui_manager.hpp index 5501c62c..199ff28d 100644 --- a/include/cru/ui/ui_manager.hpp +++ b/include/cru/ui/ui_manager.hpp @@ -1,14 +1,13 @@ #pragma once #include "base.hpp" -#include "cru/common/base.hpp" #include "controls/button.hpp" #include namespace cru::platform::graph { -class Brush; -class Font; +struct IBrush; +struct IFont; } // namespace cru::platform::graph namespace cru::ui { @@ -23,12 +22,12 @@ class PredefineResources : public Object { ~PredefineResources() override = default; // region Button - std::shared_ptr button_normal_border_brush; + std::shared_ptr button_normal_border_brush; // region TextBlock - std::shared_ptr text_block_selection_brush; - std::shared_ptr text_block_text_brush; - std::shared_ptr text_block_font; + std::shared_ptr text_block_selection_brush; + std::shared_ptr text_block_text_brush; + std::shared_ptr text_block_font; }; struct ThemeResources { @@ -53,9 +52,7 @@ class UiManager : public Object { return predefine_resources_.get(); } - ThemeResources* GetThemeResources() { - return &theme_resource_; - } + ThemeResources* GetThemeResources() { return &theme_resource_; } private: std::unique_ptr predefine_resources_; diff --git a/include/cru/ui/window.hpp b/include/cru/ui/window.hpp index 4f44fed4..35d6772e 100644 --- a/include/cru/ui/window.hpp +++ b/include/cru/ui/window.hpp @@ -2,14 +2,13 @@ #include "content_control.hpp" #include "cru/common/self_resolvable.hpp" -#include "cru/platform/native/native_event.hpp" -#include "event/ui_event.hpp" +#include "cru/platform/native/event.hpp" #include #include namespace cru::platform::native { -class INativeWindow; +struct INativeWindow; } namespace cru::ui { @@ -21,7 +20,7 @@ class Window final : public ContentControl, public SelfResolvable { friend class Control; public: - static constexpr auto control_type = L"Window"; + static constexpr std::string_view control_type = "Window"; public: static Window* CreateOverlapped(); @@ -39,7 +38,7 @@ class Window final : public ContentControl, public SelfResolvable { ~Window() override; public: - std::wstring_view GetControlType() const override final; + std::string_view GetControlType() const override final; render::RenderObject* GetRenderObject() const override; @@ -90,9 +89,10 @@ class Window final : public ContentControl, public SelfResolvable { void OnNativePaint(std::nullptr_t); void OnNativeResize(const Size& size); - void OnNativeFocus(bool focus); + void OnNativeFocus(cru::platform::native::FocusChangeType focus); - void OnNativeMouseEnterLeave(bool enter); + void OnNativeMouseEnterLeave( + cru::platform::native::MouseEnterLeaveType enter); void OnNativeMouseMove(const Point& point); void OnNativeMouseDown( const platform::native::NativeMouseButtonEventArgs& args); @@ -115,7 +115,7 @@ class Window final : public ContentControl, public SelfResolvable { platform::native::INativeWindow* native_window_; std::vector event_revoker_guards_; - std::shared_ptr render_object_; + std::unique_ptr render_object_; Control* mouse_hover_control_; -- cgit v1.2.3