aboutsummaryrefslogtreecommitdiff
path: root/include/cru/ui/render
diff options
context:
space:
mode:
author杨宇千 <crupest@outlook.com>2019-09-16 21:45:01 +0800
committer杨宇千 <crupest@outlook.com>2019-09-16 21:45:01 +0800
commitf1da8e06253748887ae769845a6e605d56d5789b (patch)
tree3a2a92cc52f77b4b2e77b5a802ed477525253bc2 /include/cru/ui/render
parent574e69fb379cd54fc3034fe45a155e770435b97d (diff)
downloadcru-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.hpp2
-rw-r--r--include/cru/ui/render/flex_layout_render_object.hpp2
-rw-r--r--include/cru/ui/render/render_object.hpp37
-rw-r--r--include/cru/ui/render/window_render_object.hpp7
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