blob: df71f660353ce9f65a2ff630e8061c1c8549797f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
#include "cru/ui/controls/Control.h"
#include "cru/common/Base.h"
#include "cru/platform/gui/Cursor.h"
#include "cru/platform/gui/UiApplication.h"
#include "cru/ui/Base.h"
#include "cru/ui/host/WindowHost.h"
#include "cru/ui/render/RenderObject.h"
#include "cru/ui/style/StyleRuleSet.h"
#include <memory>
namespace cru::ui::controls {
using platform::gui::ICursor;
using platform::gui::IUiApplication;
using platform::gui::SystemCursorType;
Control::Control() {
style_rule_set_ = std::make_shared<style::StyleRuleSet>();
style_rule_set_bind_ =
std::make_unique<style::StyleRuleSetBind>(this, style_rule_set_);
MouseEnterEvent()->Direct()->AddHandler([this](events::MouseEventArgs&) {
this->is_mouse_over_ = true;
this->OnMouseHoverChange(true);
});
MouseLeaveEvent()->Direct()->AddHandler([this](events::MouseEventArgs&) {
this->is_mouse_over_ = false;
this->OnMouseHoverChange(true);
});
}
Control::~Control() {}
host::WindowHost* Control::GetWindowHost() const {
auto parent = GetParent();
if (parent) {
return parent->GetWindowHost();
}
return nullptr;
}
void Control::SetParent(Control* parent) {
if (parent_ == parent) return;
auto old_parent = parent_;
parent_ = parent;
OnParentChanged(old_parent, parent);
}
bool Control::HasFocus() {
auto host = GetWindowHost();
if (host == nullptr) return false;
return host->GetFocusControl() == this;
}
bool Control::CaptureMouse() {
auto host = GetWindowHost();
if (host == nullptr) return false;
return host->CaptureMouseFor(this);
}
void Control::SetFocus() {
auto host = GetWindowHost();
if (host == nullptr) return;
host->SetFocusControl(this);
}
bool Control::ReleaseMouse() {
auto host = GetWindowHost();
if (host == nullptr) return false;
return host->CaptureMouseFor(nullptr);
}
bool Control::IsMouseCaptured() {
auto host = GetWindowHost();
if (host == nullptr) return false;
return host->GetMouseCaptureControl() == this;
}
std::shared_ptr<ICursor> Control::GetCursor() { return cursor_; }
std::shared_ptr<ICursor> Control::GetInheritedCursor() {
Control* control = this;
while (control != nullptr) {
const auto cursor = control->GetCursor();
if (cursor != nullptr) return cursor;
control = control->GetParent();
}
return IUiApplication::GetInstance()->GetCursorManager()->GetSystemCursor(
SystemCursorType::Arrow);
}
void Control::SetCursor(std::shared_ptr<ICursor> cursor) {
cursor_ = std::move(cursor);
const auto host = GetWindowHost();
if (host != nullptr) {
host->UpdateCursor();
}
}
std::shared_ptr<style::StyleRuleSet> Control::GetStyleRuleSet() {
return style_rule_set_;
}
} // namespace cru::ui::controls
|