aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2022-02-09 21:13:20 +0800
committercrupest <crupest@outlook.com>2022-02-09 21:13:20 +0800
commit1cbbad7166ca3dad08f947aeea5d7efc197bd2f3 (patch)
tree4479041024974fa9f8c819111aff5ec1a031d326
parent18088da4fc1273889b854e659021353217788d04 (diff)
downloadcru-1cbbad7166ca3dad08f947aeea5d7efc197bd2f3.tar.gz
cru-1cbbad7166ca3dad08f947aeea5d7efc197bd2f3.tar.bz2
cru-1cbbad7166ca3dad08f947aeea5d7efc197bd2f3.zip
...
-rw-r--r--include/cru/ui/render/RenderObject.h8
-rw-r--r--include/cru/ui/render/TreeRenderObject.h10
-rw-r--r--src/ui/render/TreeRenderObject.cpp42
3 files changed, 52 insertions, 8 deletions
diff --git a/include/cru/ui/render/RenderObject.h b/include/cru/ui/render/RenderObject.h
index 1e47e7fc..a4ac0f4b 100644
--- a/include/cru/ui/render/RenderObject.h
+++ b/include/cru/ui/render/RenderObject.h
@@ -170,10 +170,14 @@ class CRU_UI_API RenderObject : public Object {
// default is to invalidate both layout and paint
virtual void OnRemoveChild(RenderObject* removed_child, Index position);
- // Draw all children with offset.
+ /**
+ * \brief Draw all children with offset.
+ */
void DefaultDrawChildren(platform::graphics::IPainter* painter);
- // Draw all children with translation of content rect lefttop.
+ /**
+ * \brief Call OnDrawContent with translation of content rect lefttop.
+ */
void DefaultDrawContent(platform::graphics::IPainter* painter);
// Call DefaultDrawContent. Then call DefaultDrawChildren.
diff --git a/include/cru/ui/render/TreeRenderObject.h b/include/cru/ui/render/TreeRenderObject.h
index da45244f..77ec0cff 100644
--- a/include/cru/ui/render/TreeRenderObject.h
+++ b/include/cru/ui/render/TreeRenderObject.h
@@ -1,5 +1,6 @@
#pragma once
#include "RenderObject.h"
+#include "cru/platform/graphics/Painter.h"
namespace cru::ui::render {
class TreeRenderObject;
@@ -33,9 +34,6 @@ class CRU_UI_API TreeRenderObjectItem : public Object {
TreeRenderObjectItem* AddItem(Index position);
void RemoveItem(Index position);
- Point GetCachedOffset() const { return offset_cache_; }
- void SetCachedOffset(const Point& point) { offset_cache_ = point; }
-
private:
TreeRenderObject* tree_render_object_;
@@ -43,8 +41,6 @@ class CRU_UI_API TreeRenderObjectItem : public Object {
std::vector<TreeRenderObjectItem*> children_;
RenderObject* render_object_;
-
- Point offset_cache_;
};
class CRU_UI_API TreeRenderObject : public RenderObject {
@@ -63,7 +59,11 @@ class CRU_UI_API TreeRenderObject : public RenderObject {
float GetTabWidth() const { return tab_width_; }
void SetTabWidth(float tab_width);
+ RenderObject* HitTest(const Point& point) override;
+
protected:
+ void OnDrawCore(platform::graphics::IPainter* painter) override;
+
Size OnMeasureContent(const MeasureRequirement& requirement,
const MeasureSize& preferred_size) override;
void OnLayoutContent(const Rect& content_rect) override;
diff --git a/src/ui/render/TreeRenderObject.cpp b/src/ui/render/TreeRenderObject.cpp
index 60ead683..bea5b9de 100644
--- a/src/ui/render/TreeRenderObject.cpp
+++ b/src/ui/render/TreeRenderObject.cpp
@@ -1,5 +1,7 @@
#include "cru/ui/render/TreeRenderObject.h"
+#include "cru/platform/graphics/Painter.h"
#include "cru/ui/render/MeasureRequirement.h"
+#include "cru/ui/render/RenderObject.h"
namespace cru::ui::render {
TreeRenderObjectItem::TreeRenderObjectItem(TreeRenderObject* tree_render_object,
@@ -44,6 +46,45 @@ void TreeRenderObject::SetTabWidth(float tab_width) {
InvalidateLayout();
}
+RenderObject* TreeRenderObjectItemHitTest(TreeRenderObjectItem* item,
+ const Point& point) {
+ auto render_object = item->GetRenderObject();
+ if (render_object) {
+ auto result = render_object->HitTest(point - render_object->GetOffset());
+ if (result) return result;
+ }
+
+ for (auto child : item->GetChildren()) {
+ auto result = TreeRenderObjectItemHitTest(child, point);
+ if (result) return result;
+ }
+
+ return nullptr;
+}
+
+RenderObject* TreeRenderObject::HitTest(const Point& point) {
+ return TreeRenderObjectItemHitTest(root_item_, point);
+}
+
+void TreeRenderObjectItemDraw(TreeRenderObjectItem* item,
+ platform::graphics::IPainter* painter) {
+ auto render_object = item->GetRenderObject();
+ if (render_object) {
+ painter->PushState();
+ painter->ConcatTransform(Matrix::Translation(render_object->GetOffset()));
+ render_object->Draw(painter);
+ painter->PopState();
+ }
+
+ for (auto child : item->GetChildren()) {
+ TreeRenderObjectItemDraw(child, painter);
+ }
+}
+
+void TreeRenderObject::OnDrawCore(platform::graphics::IPainter* painter) {
+ TreeRenderObjectItemDraw(root_item_, painter);
+}
+
static Size MeasureTreeRenderObjectItem(MeasureSize max_size,
TreeRenderObjectItem* item,
float tab_width) {
@@ -88,7 +129,6 @@ Size TreeRenderObject::OnMeasureContent(const MeasureRequirement& requirement,
static void LayoutTreeRenderObjectItem(Rect rect, TreeRenderObjectItem* item,
float tab_width) {
- item->SetCachedOffset(rect.GetLeftTop());
auto render_object = item->GetRenderObject();
float item_height = 0.f;
if (render_object) {