From f1da8e06253748887ae769845a6e605d56d5789b Mon Sep 17 00:00:00 2001 From: 杨宇千 Date: Mon, 16 Sep 2019 21:45:01 +0800 Subject: ... --- include/cru/ui/render/border_render_object.hpp | 2 -- .../cru/ui/render/flex_layout_render_object.hpp | 2 +- include/cru/ui/render/render_object.hpp | 37 ++++++++++++++++++++++ include/cru/ui/render/window_render_object.hpp | 7 +++- 4 files changed, 44 insertions(+), 4 deletions(-) (limited to 'include/cru/ui/render') diff --git a/include/cru/ui/render/border_render_object.hpp b/include/cru/ui/render/border_render_object.hpp index 5c147df5..22e8ab58 100644 --- a/include/cru/ui/render/border_render_object.hpp +++ b/include/cru/ui/render/border_render_object.hpp @@ -77,8 +77,6 @@ class BorderRenderObject : public RenderObject { RenderObject* HitTest(const Point& point) override; protected: - void OnAddChild(RenderObject* new_child, int position) override; - void OnSizeChanged(const Size& old_size, const Size& new_size) override; void OnMeasureCore(const Size& available_size) override; diff --git a/include/cru/ui/render/flex_layout_render_object.hpp b/include/cru/ui/render/flex_layout_render_object.hpp index 1234b920..68ffc89e 100644 --- a/include/cru/ui/render/flex_layout_render_object.hpp +++ b/include/cru/ui/render/flex_layout_render_object.hpp @@ -41,7 +41,7 @@ struct FlexChildLayoutData { class FlexLayoutRenderObject : public RenderObject { public: - FlexLayoutRenderObject() = default; + FlexLayoutRenderObject(); FlexLayoutRenderObject(const FlexLayoutRenderObject& other) = delete; FlexLayoutRenderObject& operator=(const FlexLayoutRenderObject& other) = delete; diff --git a/include/cru/ui/render/render_object.hpp b/include/cru/ui/render/render_object.hpp index dca254cc..8ea7ca79 100644 --- a/include/cru/ui/render/render_object.hpp +++ b/include/cru/ui/render/render_object.hpp @@ -15,6 +15,18 @@ class Painter; } namespace cru::ui::render { +struct IRenderHost : Interface { + // Mark the layout as invalid, and arrange a re-layout later. + // Note this method might be called more than one times in a message cycle. So + // implementation should merge multiple request into once. + virtual void InvalidateLayout() = 0; + + // Mark the paint as invalid, and arrange a re-paint later. + // Note this method might be called more than one times in a message cycle. So + // implementation should merge multiple request into once. + virtual void InvalidatePaint() = 0; +}; + class RenderObject : public Object { protected: RenderObject() = default; @@ -29,6 +41,9 @@ class RenderObject : public Object { Control* GetAttachedControl() const { return control_; } void SetAttachedControl(Control* new_control) { control_ = new_control; } + IRenderHost* GetRenderHost() const { return render_host_; } + void SetRenderHost(IRenderHost* render_host) { render_host_ = render_host; } + RenderObject* GetParent() const { return parent_; } const std::vector& GetChildren() const { return children_; } @@ -62,11 +77,30 @@ class RenderObject : public Object { virtual RenderObject* HitTest(const Point& point) = 0; + protected: + enum class ChildMode { + None, + Single, + Multiple, + }; + + void SetChildMode(ChildMode mode) { child_mode_ = mode; } + + void InvalidateLayout() const { + if (render_host_ != nullptr) render_host_->InvalidateLayout(); + } + + void InvalidatePaint() const { + if (render_host_ != nullptr) render_host_->InvalidatePaint(); + } + protected: virtual void OnParentChanged(RenderObject* old_parent, RenderObject* new_parent); + // default is to invalidate both layout and paint virtual void OnAddChild(RenderObject* new_child, int position); + // default is to invalidate both layout and paint virtual void OnRemoveChild(RenderObject* removed_child, int position); virtual void OnSizeChanged(const Size& old_size, const Size& new_size); @@ -83,10 +117,13 @@ class RenderObject : public Object { private: Control* control_ = nullptr; + IRenderHost* render_host_ = nullptr; RenderObject* parent_ = nullptr; std::vector children_{}; + ChildMode child_mode_ = ChildMode::None; + Point offset_{}; Size size_{}; diff --git a/include/cru/ui/render/window_render_object.hpp b/include/cru/ui/render/window_render_object.hpp index dfeae487..e73a6bfe 100644 --- a/include/cru/ui/render/window_render_object.hpp +++ b/include/cru/ui/render/window_render_object.hpp @@ -1,6 +1,8 @@ #pragma once #include "render_object.hpp" +#include + namespace cru::ui { class Window; } @@ -8,7 +10,7 @@ class Window; namespace cru::ui::render { class WindowRenderObject : public RenderObject { public: - WindowRenderObject(Window* window) : window_(window) {} + WindowRenderObject(Window* window); WindowRenderObject(const WindowRenderObject& other) = delete; WindowRenderObject(WindowRenderObject&& other) = delete; WindowRenderObject& operator=(const WindowRenderObject& other) = delete; @@ -23,6 +25,7 @@ class WindowRenderObject : public RenderObject { protected: void OnAddChild(RenderObject* new_child, int position) override; + void OnRemoveChild(RenderObject* new_child, int position) override; Size OnMeasureContent(const Size& available_size) override; void OnLayoutContent(const Rect& content_rect) override; @@ -34,5 +37,7 @@ class WindowRenderObject : public RenderObject { private: Window* window_; + + std::unique_ptr render_host_; }; } // namespace cru::ui::render -- cgit v1.2.3