diff options
-rw-r--r-- | include/cru/ui/render/TreeRenderObject.h | 5 | ||||
-rw-r--r-- | src/ui/render/TreeRenderObject.cpp | 37 |
2 files changed, 36 insertions, 6 deletions
diff --git a/include/cru/ui/render/TreeRenderObject.h b/include/cru/ui/render/TreeRenderObject.h index f3a6075d..da45244f 100644 --- a/include/cru/ui/render/TreeRenderObject.h +++ b/include/cru/ui/render/TreeRenderObject.h @@ -33,6 +33,9 @@ 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_; @@ -41,7 +44,7 @@ class CRU_UI_API TreeRenderObjectItem : public Object { RenderObject* render_object_; - Rect rect_cache_; + Point offset_cache_; }; class CRU_UI_API TreeRenderObject : public RenderObject { diff --git a/src/ui/render/TreeRenderObject.cpp b/src/ui/render/TreeRenderObject.cpp index bb983ea5..c5cfcc82 100644 --- a/src/ui/render/TreeRenderObject.cpp +++ b/src/ui/render/TreeRenderObject.cpp @@ -47,11 +47,14 @@ void TreeRenderObject::SetTabWidth(float tab_width) { static Size MeasureTreeRenderObjectItem(MeasureSize max_size, TreeRenderObjectItem* item, float tab_width) { - item->GetRenderObject()->Measure( - MeasureRequirement(max_size, MeasureSize::NotSpecified()), - MeasureSize::NotSpecified()); + auto render_object = item->GetRenderObject(); + if (render_object) { + render_object->Measure( + MeasureRequirement(max_size, MeasureSize::NotSpecified()), + MeasureSize::NotSpecified()); + } - auto item_size = item->GetRenderObject()->GetSize(); + Size item_size = render_object ? render_object->GetSize() : Size{}; if (max_size.width.IsSpecified()) { max_size.width = max_size.width.GetLengthOrUndefined() - tab_width; @@ -83,7 +86,31 @@ Size TreeRenderObject::OnMeasureContent(const MeasureRequirement& requirement, return size; } +static void LayoutTreeRenderObjectItem(Rect rect, TreeRenderObjectItem* item, + float tab_width) { + auto render_object = item->GetRenderObject(); + float item_height = 0.f; + if (render_object) { + render_object->Layout(rect.GetLeftTop()); + item_height = render_object->GetSize().height; + } + + rect.left += tab_width; + rect.width -= tab_width; + rect.top += item_height; + rect.height -= item_height; + + for (auto child : item->GetChildren()) { + LayoutTreeRenderObjectItem(rect, child, tab_width); + auto child_render_object = child->GetRenderObject(); + auto child_height = + child_render_object ? child_render_object->GetSize().height : 0.f; + rect.top += child_height; + rect.height -= child_height; + } +} + void TreeRenderObject::OnLayoutContent(const Rect& content_rect) { - throw Exception(u"Not implemented."); + LayoutTreeRenderObjectItem(content_rect, root_item_, tab_width_); } } // namespace cru::ui::render |