aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/cru/ui/render/canvas_render_object.hpp43
-rw-r--r--include/cru/ui/render/render_object.hpp1
-rw-r--r--src/ui/CMakeLists.txt2
-rw-r--r--src/ui/render/canvas_render_object.cpp18
-rw-r--r--src/ui/render/render_object.cpp8
-rw-r--r--src/ui/render/text_render_object.cpp10
6 files changed, 74 insertions, 8 deletions
diff --git a/include/cru/ui/render/canvas_render_object.hpp b/include/cru/ui/render/canvas_render_object.hpp
new file mode 100644
index 00000000..fea68576
--- /dev/null
+++ b/include/cru/ui/render/canvas_render_object.hpp
@@ -0,0 +1,43 @@
+#pragma once
+#include "render_object.hpp"
+
+#include "cru/common/event.hpp"
+
+namespace cru::ui::render {
+class CanvasPaintEventArgs {
+ public:
+ CanvasPaintEventArgs(platform::graph::IPainter* painter,
+ const Rect& paint_rect)
+ : painter_(painter), paint_rect_(paint_rect) {}
+ CRU_DEFAULT_COPY(CanvasPaintEventArgs)
+ CRU_DEFAULT_MOVE(CanvasPaintEventArgs)
+ ~CanvasPaintEventArgs() = default;
+
+ platform::graph::IPainter* GetPainter() const { return painter_; }
+ Rect GetPaintRect() const { return paint_rect_; }
+
+ private:
+ platform::graph::IPainter* painter_;
+ Rect paint_rect_;
+};
+
+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;
+
+ IEvent<CanvasPaintEventArgs>* PaintEvent() { return &paint_event_; }
+
+ private:
+ Event<CanvasPaintEventArgs> paint_event_;
+};
+} // namespace cru::ui::render
diff --git a/include/cru/ui/render/render_object.hpp b/include/cru/ui/render/render_object.hpp
index 73543aa3..b0a65819 100644
--- a/include/cru/ui/render/render_object.hpp
+++ b/include/cru/ui/render/render_object.hpp
@@ -116,6 +116,7 @@ class RenderObject : public Object {
virtual void OnAfterLayout();
static void NotifyAfterLayoutRecursive(RenderObject* render_object);
+ Rect GetPaddingRect() const;
Rect GetContentRect() const;
private:
diff --git a/src/ui/CMakeLists.txt b/src/ui/CMakeLists.txt
index 64799b7a..cb34e590 100644
--- a/src/ui/CMakeLists.txt
+++ b/src/ui/CMakeLists.txt
@@ -19,6 +19,7 @@ add_library(cru_ui STATIC
controls/text_block.cpp
controls/text_box.cpp
render/border_render_object.cpp
+ render/canvas_render_object.cpp
render/flex_layout_render_object.cpp
render/render_object.cpp
render/stack_layout_render_object.cpp
@@ -42,6 +43,7 @@ target_sources(cru_ui PUBLIC
${CRU_UI_INCLUDE_DIR}/controls/text_box.hpp
${CRU_UI_INCLUDE_DIR}/controls/text_block.hpp
${CRU_UI_INCLUDE_DIR}/render/border_render_object.hpp
+ ${CRU_UI_INCLUDE_DIR}/render/canvas_render_object.hpp
${CRU_UI_INCLUDE_DIR}/render/flex_layout_render_object.hpp
${CRU_UI_INCLUDE_DIR}/render/layout_render_object.hpp
${CRU_UI_INCLUDE_DIR}/render/render_object.hpp
diff --git a/src/ui/render/canvas_render_object.cpp b/src/ui/render/canvas_render_object.cpp
new file mode 100644
index 00000000..7a2a1af0
--- /dev/null
+++ b/src/ui/render/canvas_render_object.cpp
@@ -0,0 +1,18 @@
+#include "cru/ui/render/canvas_render_object.hpp"
+
+namespace cru::ui::render {
+CanvasRenderObject::CanvasRenderObject() : RenderObject(ChildMode::None) {}
+
+CanvasRenderObject::~CanvasRenderObject() = default;
+
+void CanvasRenderObject::Draw(platform::graph::IPainter* painter) {
+ const auto rect = GetContentRect();
+ CanvasPaintEventArgs args{painter, rect};
+ paint_event_.Raise(args);
+}
+
+RenderObject* CanvasRenderObject::HitTest(const Point& point) {
+ const auto padding_rect = GetPaddingRect();
+ return padding_rect.IsPointInside(point) ? this : nullptr;
+}
+} // namespace cru::ui::render
diff --git a/src/ui/render/render_object.cpp b/src/ui/render/render_object.cpp
index d220b1c1..54c2d1b4 100644
--- a/src/ui/render/render_object.cpp
+++ b/src/ui/render/render_object.cpp
@@ -121,6 +121,14 @@ void RenderObject::OnLayoutCore(const Rect& rect) {
void RenderObject::OnAfterLayout() {}
+Rect RenderObject::GetPaddingRect() const {
+ Rect rect{Point{}, GetSize()};
+ rect = rect.Shrink(GetMargin());
+ rect.width = std::max(rect.width, 0.0f);
+ rect.height = std::max(rect.height, 0.0f);
+ return rect;
+}
+
Rect RenderObject::GetContentRect() const {
Rect rect{Point{}, GetSize()};
rect = rect.Shrink(GetMargin());
diff --git a/src/ui/render/text_render_object.cpp b/src/ui/render/text_render_object.cpp
index 5022cc04..6048f731 100644
--- a/src/ui/render/text_render_object.cpp
+++ b/src/ui/render/text_render_object.cpp
@@ -64,14 +64,8 @@ void TextRenderObject::Draw(platform::graph::IPainter* painter) {
}
RenderObject* TextRenderObject::HitTest(const Point& point) {
- const auto margin = GetMargin();
- const auto size = GetSize();
- return Rect{margin.left, margin.top,
- std::max(size.width - margin.GetHorizontalTotal(), 0.0f),
- std::max(size.height - margin.GetVerticalTotal(), 0.0f)}
- .IsPointInside(point)
- ? this
- : nullptr;
+ const auto padding_rect = GetPaddingRect();
+ return padding_rect.IsPointInside(point) ? this : nullptr;
}
Size TextRenderObject::OnMeasureContent(const Size& available_size) {