diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/cru/platform/graphic_base.hpp | 12 | ||||
-rw-r--r-- | include/cru/platform/native/native_window.hpp | 1 | ||||
-rw-r--r-- | include/cru/ui/click_detector.hpp | 8 | ||||
-rw-r--r-- | include/cru/ui/control.hpp | 12 | ||||
-rw-r--r-- | include/cru/ui/controls/button.hpp | 10 | ||||
-rw-r--r-- | include/cru/win/native/native_window.hpp | 1 |
6 files changed, 27 insertions, 17 deletions
diff --git a/include/cru/platform/graphic_base.hpp b/include/cru/platform/graphic_base.hpp index 2aa4e2cb..fd479e56 100644 --- a/include/cru/platform/graphic_base.hpp +++ b/include/cru/platform/graphic_base.hpp @@ -239,8 +239,14 @@ struct Color { : red(red), green(green), blue(blue), alpha(alpha) {} constexpr static Color FromHex(std::uint32_t hex) { - return Color(hex & (0b11111111 << 16), hex & (0b11111111 << 8), - hex & (0b11111111), hex & (0b11111111 << 24)); + const std::uint32_t mask = 0b11111111; + return Color((hex >> 16) & mask, (hex >> 8) & mask, hex & mask, 255); + } + + constexpr static Color FromHexAlpha(std::uint32_t hex) { + const std::uint32_t mask = 0b11111111; + return Color((hex >> 16) & mask, (hex >> 8) & mask, hex & mask, + (hex >> 24) & mask); } std::uint8_t red; @@ -254,4 +260,4 @@ constexpr Color black{0, 0, 0}; constexpr Color white{255, 255, 255}; constexpr Color skyblue = Color::FromHex(0x87ceeb); } // namespace colors -} // namespace cru::ui +} // namespace cru::platform diff --git a/include/cru/platform/native/native_window.hpp b/include/cru/platform/native/native_window.hpp index b557a0dd..d4e608b4 100644 --- a/include/cru/platform/native/native_window.hpp +++ b/include/cru/platform/native/native_window.hpp @@ -62,6 +62,7 @@ class NativeWindow : public NativeResource { virtual bool CaptureMouse() = 0; virtual bool ReleaseMouse() = 0; + virtual void Repaint() = 0; virtual graph::Painter* BeginPaint() = 0; virtual IEvent<std::nullptr_t>* DestroyEvent() = 0; diff --git a/include/cru/ui/click_detector.hpp b/include/cru/ui/click_detector.hpp index e7d5e417..3806dd82 100644 --- a/include/cru/ui/click_detector.hpp +++ b/include/cru/ui/click_detector.hpp @@ -47,7 +47,7 @@ class ClickDetector : public Object { // Return a union of buttons being pressed. Return 0 if no button is being // pressed. - MouseButton IsPressing() const { + MouseButton GetPressingButton() const { unsigned result = 0; if (click_map_.left.has_value()) result |= MouseButton::Left; if (click_map_.middle.has_value()) result |= MouseButton::Middle; @@ -57,6 +57,9 @@ class ClickDetector : public Object { IEvent<ClickEventArgs>* ClickEvent() { return &event_; } + IEvent<MouseButton>* ClickBeginEvent() { return &begin_event_; } + IEvent<MouseButton>* ClickEndEvent() { return &end_event_; } + private: std::optional<Point>& FromButton(MouseButton button) { switch (button) { @@ -76,6 +79,9 @@ class ClickDetector : public Object { Event<ClickEventArgs> event_; + Event<MouseButton> begin_event_; + Event<MouseButton> end_event_; + std::forward_list<EventRevokerGuard> event_rovoker_guards_; struct { diff --git a/include/cru/ui/control.hpp b/include/cru/ui/control.hpp index b39b59a0..f312272e 100644 --- a/include/cru/ui/control.hpp +++ b/include/cru/ui/control.hpp @@ -62,9 +62,11 @@ class Control : public Object { public: bool IsMouseOver() const { return is_mouse_over_; } - bool CaptureMouse(); // TODO + bool CaptureMouse(); - bool IsMouseCaptured(); // TODO + bool ReleaseMouse(); + + bool IsMouseCaptured(); //*************** region: events *************** public: @@ -128,12 +130,6 @@ class Control : public Object { virtual void OnAttachToWindow(Window* window); virtual void OnDetachToWindow(Window* window); - //*************** region: additional mouse event *************** - protected: - virtual void OnMouseClickBegin(platform::native::MouseButton button); - virtual void OnMouseClickEnd(platform::native::MouseButton button); - virtual void OnMouseClickCancel(platform::native::MouseButton button); - private: Window* window_ = nullptr; Control* parent_ = nullptr; diff --git a/include/cru/ui/controls/button.hpp b/include/cru/ui/controls/button.hpp index 648bb6bc..ca3dcae9 100644 --- a/include/cru/ui/controls/button.hpp +++ b/include/cru/ui/controls/button.hpp @@ -1,10 +1,10 @@ #pragma once #include "../content_control.hpp" +#include "../click_detector.hpp" +#include "../render/border_render_object.hpp" #include "cru/platform/graph/brush.hpp" #include "cru/platform/native/basic_types.hpp" -#include "cru/ui/base.hpp" -#include "cru/ui/render/border_render_object.hpp" #include <memory> @@ -94,13 +94,11 @@ class Button : public ContentControl { protected: void OnChildChanged(Control* old_child, Control* new_child) override; - void OnMouseClickBegin(platform::native::MouseButton button) override; - void OnMouseClickEnd(platform::native::MouseButton button) override; - virtual void OnStateChange(ButtonState oldState, ButtonState newState); private: void SetState(ButtonState newState) { + if (state_ == newState) return; const auto oldState = state_; state_ = newState; OnStateChange(oldState, newState); @@ -114,5 +112,7 @@ class Button : public ContentControl { MouseButton trigger_button_ = MouseButton::Left; ButtonBorderStyle border_style_; + + ClickDetector click_detector_; }; } // namespace cru::ui::controls diff --git a/include/cru/win/native/native_window.hpp b/include/cru/win/native/native_window.hpp index b044aef8..ccbdff40 100644 --- a/include/cru/win/native/native_window.hpp +++ b/include/cru/win/native/native_window.hpp @@ -53,6 +53,7 @@ class WinNativeWindow : public NativeWindow { bool CaptureMouse() override; bool ReleaseMouse() override; + void Repaint() override; graph::Painter* BeginPaint() override; IEvent<std::nullptr_t>* DestroyEvent() override { return &destroy_event_; } |