aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ui/controls/Control.cpp42
-rw-r--r--src/ui/controls/RootControl.cpp3
-rw-r--r--src/ui/render/SingleChildRenderObject.cpp2
3 files changed, 36 insertions, 11 deletions
diff --git a/src/ui/controls/Control.cpp b/src/ui/controls/Control.cpp
index a66b605f..43faba69 100644
--- a/src/ui/controls/Control.cpp
+++ b/src/ui/controls/Control.cpp
@@ -27,21 +27,13 @@ Control::Control() {
});
}
-Control::~Control() { ReleaseMouse(); }
-
-host::WindowHost* Control::GetWindowHost() const {
- auto parent = GetParent();
- if (parent) {
- return parent->GetWindowHost();
- }
- return nullptr;
-}
+Control::~Control() { RemoveFromParent(); }
void Control::SetParent(Control* parent) {
if (parent_ == parent) return;
auto old_parent = parent_;
parent_ = parent;
- OnParentChanged(old_parent, parent);
+ OnParentChangedCore(old_parent, parent);
}
void Control::RemoveFromParent() {
@@ -109,4 +101,34 @@ void Control::SetCursor(std::shared_ptr<ICursor> cursor) {
std::shared_ptr<style::StyleRuleSet> Control::GetStyleRuleSet() {
return style_rule_set_;
}
+
+void Control::OnParentChangedCore(Control* old_parent, Control* new_parent) {
+ auto new_window_host =
+ new_parent == nullptr ? nullptr : new_parent->GetWindowHost();
+ if (window_host_ != new_window_host) {
+ auto old_host = window_host_;
+ window_host_ = new_window_host;
+ OnWindowHostChangedCore(old_host, new_window_host);
+ }
+
+ OnParentChanged(old_parent, new_parent);
+}
+
+void Control::OnWindowHostChangedCore(host::WindowHost* old_host,
+ host::WindowHost* new_host) {
+ if (old_host != nullptr) {
+ if (old_host->GetMouseCaptureControl() == this) {
+ old_host->CaptureMouseFor(nullptr);
+ }
+ if (old_host->GetMouseHoverControl() == this) {
+ old_host->mouse_hover_control_ = nullptr;
+ }
+ }
+
+ ForEachChild([old_host, new_host](Control* child) {
+ child->window_host_ = new_host;
+ child->OnWindowHostChangedCore(old_host, new_host);
+ });
+ OnWindowHostChanged(old_host, new_host);
+}
} // namespace cru::ui::controls
diff --git a/src/ui/controls/RootControl.cpp b/src/ui/controls/RootControl.cpp
index 07647024..609223a1 100644
--- a/src/ui/controls/RootControl.cpp
+++ b/src/ui/controls/RootControl.cpp
@@ -15,6 +15,9 @@ RootControl::RootControl(Control* attached_control)
GetContainerRenderObject()->SetDefaultHorizontalAlignment(Alignment::Stretch);
GetContainerRenderObject()->SetDefaultVertialAlignment(Alignment::Stretch);
window_host_ = std::make_unique<host::WindowHost>(this);
+
+ Control::window_host_ = this->window_host_.get();
+
window_host_->SetLayoutPreferToFillWindow(true);
}
diff --git a/src/ui/render/SingleChildRenderObject.cpp b/src/ui/render/SingleChildRenderObject.cpp
index 7b10b343..d62a233e 100644
--- a/src/ui/render/SingleChildRenderObject.cpp
+++ b/src/ui/render/SingleChildRenderObject.cpp
@@ -2,7 +2,7 @@
namespace cru::ui::render {
void SingleChildRenderObject::SetChild(RenderObject *new_child) {
- assert(new_child->GetParent() == nullptr);
+ assert(new_child == nullptr || new_child->GetParent() == nullptr);
if (child_ == new_child) return;
auto old_child = child_;
if (child_) {