aboutsummaryrefslogtreecommitdiff
path: root/include/cru/ui
diff options
context:
space:
mode:
author杨宇千 <crupest@outlook.com>2019-08-12 01:03:02 +0800
committer杨宇千 <crupest@outlook.com>2019-08-12 01:03:02 +0800
commit04367ead7027e9f0359d24681f5cc0dd916b934d (patch)
treef2a277ac9d53863c9f4efc8099450138974bdb4d /include/cru/ui
parent86e776eaebf7c45a269001ca7da0dfafba069d0a (diff)
downloadcru-04367ead7027e9f0359d24681f5cc0dd916b934d.tar.gz
cru-04367ead7027e9f0359d24681f5cc0dd916b934d.tar.bz2
cru-04367ead7027e9f0359d24681f5cc0dd916b934d.zip
...
Diffstat (limited to 'include/cru/ui')
-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
3 files changed, 16 insertions, 14 deletions
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