diff options
author | 杨宇千 <crupest@outlook.com> | 2019-09-16 21:45:01 +0800 |
---|---|---|
committer | 杨宇千 <crupest@outlook.com> | 2019-09-16 21:45:01 +0800 |
commit | f1da8e06253748887ae769845a6e605d56d5789b (patch) | |
tree | 3a2a92cc52f77b4b2e77b5a802ed477525253bc2 /src/ui/render/window_render_object.cpp | |
parent | 574e69fb379cd54fc3034fe45a155e770435b97d (diff) | |
download | cru-f1da8e06253748887ae769845a6e605d56d5789b.tar.gz cru-f1da8e06253748887ae769845a6e605d56d5789b.tar.bz2 cru-f1da8e06253748887ae769845a6e605d56d5789b.zip |
...
Diffstat (limited to 'src/ui/render/window_render_object.cpp')
-rw-r--r-- | src/ui/render/window_render_object.cpp | 35 |
1 files changed, 34 insertions, 1 deletions
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 <cassert> 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) { |