diff options
Diffstat (limited to 'src/ui')
-rw-r--r-- | src/ui/control.cpp | 4 | ||||
-rw-r--r-- | src/ui/ui_host.cpp | 12 | ||||
-rw-r--r-- | src/ui/window.cpp | 1 |
3 files changed, 12 insertions, 5 deletions
diff --git a/src/ui/control.cpp b/src/ui/control.cpp index 7691dac2..5417f4ce 100644 --- a/src/ui/control.cpp +++ b/src/ui/control.cpp @@ -33,12 +33,12 @@ void Control::_SetParent(Control* parent) { } void Control::_SetDescendantUiHost(UiHost* host) { + if (host == nullptr && ui_host_ == nullptr) return; + // You can only attach or detach window. Expects((host != nullptr && ui_host_ == nullptr) || (host == nullptr && ui_host_ != nullptr)); - if (host == nullptr && ui_host_ == nullptr) return; - if (host == nullptr) { const auto old = ui_host_; TraverseDescendants([old](Control* control) { diff --git a/src/ui/ui_host.cpp b/src/ui/ui_host.cpp index c82709dd..8b85ad30 100644 --- a/src/ui/ui_host.cpp +++ b/src/ui/ui_host.cpp @@ -101,7 +101,7 @@ UiHost::UiHost(Window* window) IUiApplication::GetInstance()->CreateWindow(nullptr); const auto native_window = native_window_resolver_->Resolve(); - window->_SetDescendantUiHost(this); + window->ui_host_ = this; root_render_object_ = std::make_unique<render::WindowRenderObject>(this); root_render_object_->SetAttachedControl(window); @@ -130,8 +130,15 @@ UiHost::UiHost(Window* window) } UiHost::~UiHost() { + deleting_ = true; window_control_->TraverseDescendants( [this](Control* control) { control->OnDetachFromHost(this); }); + if (!native_window_destroyed_) { + const auto native_window = native_window_resolver_->Resolve(); + if (native_window) { + native_window->Close(); + } + } } void UiHost::InvalidatePaint() { @@ -216,7 +223,8 @@ Control* UiHost::GetMouseCaptureControl() { return mouse_captured_control_; } void UiHost::OnNativeDestroy(INativeWindow* window, std::nullptr_t) { CRU_UNUSED(window) - delete this; // TODO: Develop this. + native_window_destroyed_ = true; + if (!deleting_ && !retain_after_destroy_) delete window_control_; } void UiHost::OnNativePaint(INativeWindow* window, std::nullptr_t) { diff --git a/src/ui/window.cpp b/src/ui/window.cpp index 4f414385..7c0683af 100644 --- a/src/ui/window.cpp +++ b/src/ui/window.cpp @@ -4,7 +4,6 @@ #include "cru/ui/ui_host.hpp" namespace cru::ui { - Window* Window::CreateOverlapped() { return new Window(tag_overlapped_constructor{}); } |