diff options
author | crupest <crupest@outlook.com> | 2022-02-09 21:13:20 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2022-02-09 21:13:20 +0800 |
commit | 1cbbad7166ca3dad08f947aeea5d7efc197bd2f3 (patch) | |
tree | 4479041024974fa9f8c819111aff5ec1a031d326 | |
parent | 18088da4fc1273889b854e659021353217788d04 (diff) | |
download | cru-1cbbad7166ca3dad08f947aeea5d7efc197bd2f3.tar.gz cru-1cbbad7166ca3dad08f947aeea5d7efc197bd2f3.tar.bz2 cru-1cbbad7166ca3dad08f947aeea5d7efc197bd2f3.zip |
...
-rw-r--r-- | include/cru/ui/render/RenderObject.h | 8 | ||||
-rw-r--r-- | include/cru/ui/render/TreeRenderObject.h | 10 | ||||
-rw-r--r-- | src/ui/render/TreeRenderObject.cpp | 42 |
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) { |