diff options
Diffstat (limited to 'src/ui')
-rw-r--r-- | src/ui/controls/Control.cpp | 42 | ||||
-rw-r--r-- | src/ui/controls/RootControl.cpp | 3 | ||||
-rw-r--r-- | src/ui/render/SingleChildRenderObject.cpp | 2 |
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_) { |