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 /include/cru/ui/render | |
parent | 574e69fb379cd54fc3034fe45a155e770435b97d (diff) | |
download | cru-f1da8e06253748887ae769845a6e605d56d5789b.tar.gz cru-f1da8e06253748887ae769845a6e605d56d5789b.tar.bz2 cru-f1da8e06253748887ae769845a6e605d56d5789b.zip |
...
Diffstat (limited to 'include/cru/ui/render')
-rw-r--r-- | include/cru/ui/render/border_render_object.hpp | 2 | ||||
-rw-r--r-- | include/cru/ui/render/flex_layout_render_object.hpp | 2 | ||||
-rw-r--r-- | include/cru/ui/render/render_object.hpp | 37 | ||||
-rw-r--r-- | include/cru/ui/render/window_render_object.hpp | 7 |
4 files changed, 44 insertions, 4 deletions
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<RenderObject*>& GetChildren() const { return children_; } @@ -63,10 +78,29 @@ 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<RenderObject*> 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 <memory> + 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<IRenderHost> render_host_; }; } // namespace cru::ui::render |