aboutsummaryrefslogtreecommitdiff
path: root/include/cru/ui/render/CanvasRenderObject.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/cru/ui/render/CanvasRenderObject.hpp')
-rw-r--r--include/cru/ui/render/CanvasRenderObject.hpp39
1 files changed, 39 insertions, 0 deletions
diff --git a/include/cru/ui/render/CanvasRenderObject.hpp b/include/cru/ui/render/CanvasRenderObject.hpp
new file mode 100644
index 00000000..ba50a985
--- /dev/null
+++ b/include/cru/ui/render/CanvasRenderObject.hpp
@@ -0,0 +1,39 @@
+#pragma once
+#include "RenderObject.hpp"
+
+namespace cru::ui::render {
+// The measure logic for `CanvasRenderObject` is that you set a desired size by
+// `SetDesiredSize` (not `SetPreferredSize`) and it will compare desired size
+// and available size and use the smaller one (by `Min`).
+class CanvasRenderObject : public RenderObject {
+ public:
+ CanvasRenderObject();
+
+ CRU_DELETE_COPY(CanvasRenderObject)
+ CRU_DELETE_MOVE(CanvasRenderObject)
+
+ ~CanvasRenderObject();
+
+ public:
+ void Draw(platform::graph::IPainter* painter) override;
+
+ RenderObject* HitTest(const Point& point) override;
+
+ Size GetDesiredSize() const { return desired_size_; }
+
+ // Set the desired size. This is the content size excluding padding and
+ // margin.
+ void SetDesiredSize(const Size& new_size) { desired_size_ = new_size; }
+
+ IEvent<CanvasPaintEventArgs>* PaintEvent() { return &paint_event_; }
+
+ protected:
+ Size OnMeasureContent(const Size& available_size) override;
+ void OnLayoutContent(const Rect& content_rect) override;
+
+ private:
+ Size desired_size_{};
+
+ Event<CanvasPaintEventArgs> paint_event_;
+};
+} // namespace cru::ui::render