blob: 7563dc91ee7e2816e609b62db48051667b16cd79 (
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
|
#include "cru/ui/control.hpp"
#include "cru/ui/window.hpp"
#include <cassert>
namespace cru::ui {
void Control::_SetParent(Control* parent) {
const auto old_parent = GetParent();
parent_ = parent;
const auto new_parent = GetParent();
if (old_parent != new_parent) OnParentChanged(old_parent, new_parent);
}
void Control::_SetDescendantWindow(Window* window) {
if (window == nullptr && window_ == nullptr) return;
// You can only attach or detach window.
assert((window != nullptr && window_ == nullptr) ||
(window == nullptr && window_ != nullptr));
if (window == nullptr) {
const auto old = window_;
TraverseDescendants([old](Control* control) {
control->window_ = nullptr;
control->OnDetachToWindow(old);
});
} else
TraverseDescendants([window](Control* control) {
control->window_ = window;
control->OnAttachToWindow(window);
});
}
void Control::TraverseDescendants(
const std::function<void(Control*)>& predicate) {
_TraverseDescendants(this, predicate);
}
void Control::_TraverseDescendants(
Control* control, const std::function<void(Control*)>& predicate) {
predicate(control);
for (auto c : control->GetChildren())
_TraverseDescendants(c, predicate);
}
bool Control::RequestFocus() {
auto window = GetWindow();
if (window == nullptr) return false;
return window->RequestFocusFor(this);
}
bool Control::HasFocus() {
auto window = GetWindow();
if (window == nullptr) return false;
return window->GetFocusControl() == this;
}
void Control::OnParentChanged(Control* old_parent, Control* new_parent) {}
void Control::OnAttachToWindow(Window* window) {}
void Control::OnDetachToWindow(Window* window) {}
void Control::OnMouseClickBegin(platform::native::MouseButton button) {}
void Control::OnMouseClickEnd(platform::native::MouseButton button) {}
} // namespace cru::ui
|