aboutsummaryrefslogtreecommitdiff
path: root/src/ui/render/render_object.hpp
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2019-03-20 17:08:57 +0800
committercrupest <crupest@outlook.com>2019-03-20 17:08:57 +0800
commit1e3cad155a234d2e3e9b6aca650d4d1c4c9e8d4e (patch)
tree3fc01db4d6d36ed9f6e7795d2b87da96b4412f5f /src/ui/render/render_object.hpp
parent5dc738a57930271194bd86673eb86f149096a7b2 (diff)
downloadcru-1e3cad155a234d2e3e9b6aca650d4d1c4c9e8d4e.tar.gz
cru-1e3cad155a234d2e3e9b6aca650d4d1c4c9e8d4e.tar.bz2
cru-1e3cad155a234d2e3e9b6aca650d4d1c4c9e8d4e.zip
...
Diffstat (limited to 'src/ui/render/render_object.hpp')
-rw-r--r--src/ui/render/render_object.hpp133
1 files changed, 60 insertions, 73 deletions
diff --git a/src/ui/render/render_object.hpp b/src/ui/render/render_object.hpp
index 00f761d1..aeba1457 100644
--- a/src/ui/render/render_object.hpp
+++ b/src/ui/render/render_object.hpp
@@ -1,5 +1,4 @@
#pragma once
-
#include "pre.hpp"
#include <optional>
@@ -9,101 +8,89 @@
#include "base.hpp"
#include "ui/ui_base.hpp"
-namespace cru::ui::render
-{
-struct MeasureConstraint
-{
- std::optional<float> min_width;
- std::optional<float> min_height;
- std::optional<float> max_width;
- std::optional<float> max_height;
+namespace cru::ui::render {
+struct IRenderHost : Interface {
+ virtual void InvalidatePaint() = 0;
+ virtual void InvalidateLayout() = 0;
};
+class RenderObject : public Object {
+ protected:
+ RenderObject() = default;
-struct LayoutConstraint
-{
- float preferred_width;
- float preferred_height;
-};
+ public:
+ RenderObject(const RenderObject& other) = delete;
+ RenderObject(RenderObject&& other) = delete;
+ RenderObject& operator=(const RenderObject& other) = delete;
+ RenderObject& operator=(RenderObject&& other) = delete;
+ ~RenderObject() override = default;
+ IRenderHost* GetRenderHost() const { return render_host_; }
+ void SetRenderHost(IRenderHost* new_render_host);
-struct IRenderHost : Interface
-{
- virtual void InvalidatePaint() = 0;
- virtual void InvalidateLayout() = 0;
-};
+ RenderObject* GetParent() const { return parent_; }
+ const std::vector<RenderObject*>& GetChildren() const { return children_; }
+ void AddChild(RenderObject* render_object, int position);
+ void RemoveChild(int position);
-// features:
-// 1. tree
-// 2. layout
-// 3. paint
-// 3. hit test
-class RenderObject : public Object
-{
-protected:
- RenderObject() = default;
+ Point GetOffset() const { return offset_; }
+ void SetOffset(const Point& offset) { offset_ = offset; }
+ Size GetSize() const { return size_; }
+ void SetSize(const Size& size) { size_ = size; }
-public:
- RenderObject(const RenderObject& other) = delete;
- RenderObject(RenderObject&& other) = delete;
- RenderObject& operator=(const RenderObject& other) = delete;
- RenderObject& operator=(RenderObject&& other) = delete;
- ~RenderObject() override = default;
+ Thickness GetMargin() const { return margin_; }
+ void SetMargin(const Thickness& margin) { margin_ = margin; }
- IRenderHost* GetRenderHost() const { return render_host_; }
- void SetRenderHost(IRenderHost* new_render_host);
+ Thickness GetPadding() const { return padding_; }
+ void SetPadding(const Thickness& padding) { padding_ = padding; }
- RenderObject* GetParent() const { return parent_; }
+ Size GetPreferredSize() const { return preferred_size_; }
+ void SetPreferredSize(const Size& preferred_size) {
+ preferred_size_ = preferred_size;
+ }
- const std::vector<RenderObject*>& GetChildren() const { return children_; }
- void AddChild(RenderObject* render_object, int position);
- void RemoveChild(int position);
+ void Measure(const Size& available_size);
+ void Layout(const Rect& rect);
- virtual void Measure(const MeasureConstraint& constraint) = 0;
- virtual void Layout(const LayoutConstraint& constraint) = 0;
+ virtual void Draw(ID2D1RenderTarget* render_target) = 0;
- virtual void Draw(ID2D1RenderTarget* render_target) = 0;
+ virtual RenderObject* HitTest(const Point& point) = 0;
- virtual void HitTest(const Point& point) = 0;
+ protected:
+ virtual void OnRenderHostChanged(IRenderHost* old_render_host,
+ IRenderHost* new_render_host);
-protected:
- virtual void OnRenderHostChanged(IRenderHost* old_render_host,
- IRenderHost* new_render_host);
+ void InvalidateRenderHostPaint() const;
+ void InvalidateRenderHostLayout() const;
- void InvalidateRenderHostPaint() const;
- void InvalidateRenderHostLayout() const;
+ virtual void OnParentChanged(RenderObject* old_parent,
+ RenderObject* new_parent);
- virtual void OnParentChanged(RenderObject* old_parent,
- RenderObject* new_parent);
+ virtual void OnAddChild(RenderObject* new_child, int position);
+ virtual void OnRemoveChild(RenderObject* removed_child, int position);
- virtual void OnAddChild(RenderObject* new_child, int position);
- virtual void OnRemoveChild(RenderObject* removed_child, int position);
+ virtual Size OnMeasureContent(const Size& available_size) = 0;
+ virtual void OnLayoutContent(const Rect& content_rect) = 0;
-private:
- void SetParent(RenderObject* new_parent);
+ private:
+ void SetParent(RenderObject* new_parent);
-private:
- IRenderHost* render_host_ = nullptr;
- RenderObject* parent_ = nullptr;
- std::vector<RenderObject*> children_;
-};
+ void OnMeasureCore(const Size& available_size);
+ void OnLayoutCore(const Rect& rect);
+
+ private:
+ IRenderHost* render_host_ = nullptr;
+ RenderObject* parent_ = nullptr;
+ std::vector<RenderObject*> children_{};
-class LinearLayoutRenderObject : public RenderObject
-{
-public:
- LinearLayoutRenderObject() = default;
- LinearLayoutRenderObject(const LinearLayoutRenderObject& other) = delete;
- LinearLayoutRenderObject& operator=(const LinearLayoutRenderObject& other) =
- delete;
- LinearLayoutRenderObject(LinearLayoutRenderObject&& other) = delete;
- LinearLayoutRenderObject& operator=(LinearLayoutRenderObject&& other) =
- delete;
- ~LinearLayoutRenderObject() = default;
+ Point offset_ = Point::Zero();
+ Size size_ = Size::Zero();
- void Measure(const MeasureConstraint& constraint) override;
+ Thickness margin_ = Thickness::Zero();
+ Thickness padding_ = Thickness::Zero();
-private:
+ Size preferred_size_ = Size::Zero();
};
} // namespace cru::ui::render