diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main.cpp | 3 | ||||
-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 |
4 files changed, 14 insertions, 6 deletions
diff --git a/src/main.cpp b/src/main.cpp index fb2222d4..0172838e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4,6 +4,7 @@ #include "cru/ui/controls/flex_layout.hpp" #include "cru/ui/controls/stack_layout.hpp" #include "cru/ui/controls/text_block.hpp" +#include "cru/ui/ui_host.hpp" #include "cru/ui/window.hpp" #include "cru/win/native/ui_application.hpp" @@ -51,7 +52,7 @@ int main() { text_block4->SetText("Hello World!!!"); flex_layout->AddChild(text_block4, 2); - window->ResolveNativeWindow()->SetVisible(true); + window->GetUiHost()->GetNativeWindowResolver()->Resolve()->SetVisible(true); return application->Run(); } 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{}); } |