aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/cru/platform/graphic_base.hpp12
-rw-r--r--include/cru/platform/native/native_window.hpp1
-rw-r--r--include/cru/ui/click_detector.hpp8
-rw-r--r--include/cru/ui/control.hpp12
-rw-r--r--include/cru/ui/controls/button.hpp10
-rw-r--r--include/cru/win/native/native_window.hpp1
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_; }