diff options
-rw-r--r-- | include/cru/ui/render/canvas_render_object.hpp | 43 | ||||
-rw-r--r-- | include/cru/ui/render/render_object.hpp | 1 | ||||
-rw-r--r-- | src/ui/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/ui/render/canvas_render_object.cpp | 18 | ||||
-rw-r--r-- | src/ui/render/render_object.cpp | 8 | ||||
-rw-r--r-- | src/ui/render/text_render_object.cpp | 10 |
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) { |