diff options
Diffstat (limited to 'src/ui/render/window_render_object.cpp')
-rw-r--r-- | src/ui/render/window_render_object.cpp | 47 |
1 files changed, 39 insertions, 8 deletions
diff --git a/src/ui/render/window_render_object.cpp b/src/ui/render/window_render_object.cpp index e61dd286..e2e96897 100644 --- a/src/ui/render/window_render_object.cpp +++ b/src/ui/render/window_render_object.cpp @@ -1,33 +1,64 @@ #include "cru/ui/render/window_render_object.hpp" +#include "cru/common/logger.hpp" #include "cru/platform/graph/util/painter_util.hpp" #include "cru/platform/native/native_window.hpp" +#include "cru/platform/native/ui_application.hpp" #include "cru/ui/window.hpp" #include <cassert> namespace cru::ui::render { -class WindowRenderHost : public IRenderHost { +class WindowRenderHost : public IRenderHost, + public SelfResolvable<WindowRenderHost> { public: - WindowRenderHost(Window* window) : window_(window) { - assert(window != nullptr); + WindowRenderHost(WindowRenderObject* render_object) + : render_object_(render_object) { + assert(render_object != nullptr); } - void InvalidateLayout() override { window_->InvalidateLayout(); } + void InvalidateLayout() override; - void InvalidatePaint() override { window_->GetNativeWindow()->Repaint(); } + void InvalidatePaint() override { + render_object_->GetWindow()->GetNativeWindow()->Repaint(); + } + + IEvent<AfterLayoutEventArgs>* AfterLayoutEvent() override { + return &after_layout_event_; + } private: - Window* window_; + WindowRenderObject* render_object_; + + bool need_layout_ = false; + + Event<AfterLayoutEventArgs> after_layout_event_; }; +void WindowRenderHost::InvalidateLayout() { + if (!need_layout_) { + log::Debug(L"A relayout is required."); + platform::native::UiApplication::GetInstance()->InvokeLater( + [resolver = this->CreateResolver()] { + if (const auto host = resolver.Resolve()) { + host->render_object_->Relayout(); + host->need_layout_ = false; + host->after_layout_event_.Raise(AfterLayoutEventArgs{}); + log::Debug(L"A relayout finished."); + host->InvalidatePaint(); + } + }); + need_layout_ = true; + } +} + WindowRenderObject::WindowRenderObject(Window* window) - : window_(window), render_host_(new WindowRenderHost(window)) { + : window_(window), render_host_(new WindowRenderHost(this)) { SetChildMode(ChildMode::Single); SetRenderHost(render_host_.get()); } -void WindowRenderObject::MeasureAndLayout() { +void WindowRenderObject::Relayout() { const auto client_size = window_->GetNativeWindow()->GetClientSize(); Measure(client_size); Layout(Rect{Point{}, client_size}); |