From 23ef59b6aa14874e3b68c8716c137eb65583cd63 Mon Sep 17 00:00:00 2001 From: crupest Date: Sat, 11 Apr 2020 00:01:51 +0800 Subject: ... --- src/ui/render/render_object.cpp | 16 ++++++--- src/ui/render/window_render_object.cpp | 65 +++------------------------------- 2 files changed, 16 insertions(+), 65 deletions(-) (limited to 'src/ui/render') diff --git a/src/ui/render/render_object.cpp b/src/ui/render/render_object.cpp index e329d150..4a1bedf3 100644 --- a/src/ui/render/render_object.cpp +++ b/src/ui/render/render_object.cpp @@ -1,6 +1,7 @@ #include "cru/ui/render/render_object.hpp" #include "cru/common/logger.hpp" +#include "cru/ui/ui_host.hpp" #include @@ -18,7 +19,7 @@ void RenderObject::AddChild(RenderObject* render_object, const Index position) { children_.insert(children_.cbegin() + position, render_object); render_object->SetParent(this); - render_object->SetRenderHostRecursive(GetRenderHost()); + render_object->SetRenderHostRecursive(GetUiHost()); OnAddChild(render_object, position); } @@ -165,6 +166,14 @@ void RenderObject::SetParent(RenderObject* new_parent) { OnParentChanged(old_parent, new_parent); } +void RenderObject::InvalidateLayout() { + if (ui_host_ != nullptr) ui_host_->InvalidateLayout(); +} + +void RenderObject::InvalidatePaint() { + if (ui_host_ != nullptr) ui_host_->InvalidatePaint(); +} + void RenderObject::NotifyAfterLayoutRecursive(RenderObject* render_object) { render_object->OnAfterLayout(); for (const auto o : render_object->GetChildren()) { @@ -172,11 +181,10 @@ void RenderObject::NotifyAfterLayoutRecursive(RenderObject* render_object) { } } -void RenderObject::SetRenderHostRecursive(IRenderHost* host) { - SetRenderHost(host); +void RenderObject::SetRenderHostRecursive(UiHost* host) { + ui_host_ = host; for (const auto child : GetChildren()) { child->SetRenderHostRecursive(host); } } - } // namespace cru::ui::render diff --git a/src/ui/render/window_render_object.cpp b/src/ui/render/window_render_object.cpp index 29313645..abed6fa4 100644 --- a/src/ui/render/window_render_object.cpp +++ b/src/ui/render/window_render_object.cpp @@ -1,74 +1,17 @@ #include "cru/ui/render/window_render_object.hpp" #include "../helper.hpp" -#include "cru/common/logger.hpp" #include "cru/platform/graph/util/painter.hpp" -#include "cru/platform/native/ui_application.hpp" -#include "cru/platform/native/window.hpp" -#include "cru/ui/window.hpp" +#include "cru/ui/ui_host.hpp" namespace cru::ui::render { -class WindowRenderHost : public IRenderHost, - public SelfResolvable { - public: - WindowRenderHost(WindowRenderObject* render_object) - : render_object_(render_object) { - Expects(render_object != nullptr); - } - - void InvalidateLayout() override; - - void InvalidatePaint() override { - if (const auto native_window = - render_object_->GetWindow()->ResolveNativeWindow()) - native_window->RequestRepaint(); - } - - IEvent* AfterLayoutEvent() override { - return &after_layout_event_; - } - - private: - WindowRenderObject* render_object_; - - bool need_layout_ = false; - - Event after_layout_event_; -}; - -void WindowRenderHost::InvalidateLayout() { - if (!need_layout_) { - log::Debug("A relayout is required."); - GetUiApplication()->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("A relayout finished."); - host->InvalidatePaint(); - } - }); - need_layout_ = true; - } -} - -WindowRenderObject::WindowRenderObject(Window* window) - : window_(window), render_host_(new WindowRenderHost(this)) { +WindowRenderObject::WindowRenderObject(UiHost* host) { SetChildMode(ChildMode::Single); - SetRenderHost(render_host_.get()); - after_layout_event_guard_.Reset(render_host_->AfterLayoutEvent()->AddHandler( + ui_host_ = host; + after_layout_event_guard_.Reset(host->AfterLayoutEvent()->AddHandler( [this](auto) { NotifyAfterLayoutRecursive(this); })); } -void WindowRenderObject::Relayout() { - const auto native_window = window_->ResolveNativeWindow(); - const auto client_size = native_window - ? native_window->GetClientSize() - : Size{100, 100}; // a reasonable assumed size - Measure(client_size); - Layout(Rect{Point{}, client_size}); -} - void WindowRenderObject::Draw(platform::graph::IPainter* painter) { painter->Clear(colors::white); if (const auto child = GetChild()) { -- cgit v1.2.3