From f1da8e06253748887ae769845a6e605d56d5789b Mon Sep 17 00:00:00 2001 From: 杨宇千 Date: Mon, 16 Sep 2019 21:45:01 +0800 Subject: ... --- src/ui/render/window_render_object.cpp | 35 +++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) (limited to 'src/ui/render/window_render_object.cpp') diff --git a/src/ui/render/window_render_object.cpp b/src/ui/render/window_render_object.cpp index 18faeee8..e61dd286 100644 --- a/src/ui/render/window_render_object.cpp +++ b/src/ui/render/window_render_object.cpp @@ -7,6 +7,26 @@ #include namespace cru::ui::render { +class WindowRenderHost : public IRenderHost { + public: + WindowRenderHost(Window* window) : window_(window) { + assert(window != nullptr); + } + + void InvalidateLayout() override { window_->InvalidateLayout(); } + + void InvalidatePaint() override { window_->GetNativeWindow()->Repaint(); } + + private: + Window* window_; +}; + +WindowRenderObject::WindowRenderObject(Window* window) + : window_(window), render_host_(new WindowRenderHost(window)) { + SetChildMode(ChildMode::Single); + SetRenderHost(render_host_.get()); +} + void WindowRenderObject::MeasureAndLayout() { const auto client_size = window_->GetNativeWindow()->GetClientSize(); Measure(client_size); @@ -35,8 +55,21 @@ RenderObject* WindowRenderObject::HitTest(const Point& point) { return Rect{Point{}, GetSize()}.IsPointInside(point) ? this : nullptr; } +namespace { +void SetRenderHostRecursive(RenderObject* render_object, IRenderHost* host) { + render_object->SetRenderHost(host); + for (const auto child : render_object->GetChildren()) { + SetRenderHostRecursive(render_object, host); + } +} +} // namespace + void WindowRenderObject::OnAddChild(RenderObject* new_child, int position) { - assert(GetChildren().size() == 1); + SetRenderHostRecursive(new_child, render_host_.get()); +} + +void WindowRenderObject::OnRemoveChild(RenderObject* new_child, int position) { + SetRenderHostRecursive(new_child, nullptr); } Size WindowRenderObject::OnMeasureContent(const Size& available_size) { -- cgit v1.2.3