diff options
Diffstat (limited to 'src/ui/render/TreeRenderObject.cpp')
-rw-r--r-- | src/ui/render/TreeRenderObject.cpp | 43 |
1 files changed, 42 insertions, 1 deletions
diff --git a/src/ui/render/TreeRenderObject.cpp b/src/ui/render/TreeRenderObject.cpp index 46965b7f..bb983ea5 100644 --- a/src/ui/render/TreeRenderObject.cpp +++ b/src/ui/render/TreeRenderObject.cpp @@ -1,4 +1,5 @@ #include "cru/ui/render/TreeRenderObject.h" +#include "cru/ui/render/MeasureRequirement.h" namespace cru::ui::render { TreeRenderObjectItem::TreeRenderObjectItem(TreeRenderObject* tree_render_object, @@ -37,9 +38,49 @@ TreeRenderObject::TreeRenderObject() { TreeRenderObject::~TreeRenderObject() { delete root_item_; } +void TreeRenderObject::SetTabWidth(float tab_width) { + if (tab_width == tab_width_) return; + tab_width_ = tab_width; + InvalidateLayout(); +} + +static Size MeasureTreeRenderObjectItem(MeasureSize max_size, + TreeRenderObjectItem* item, + float tab_width) { + item->GetRenderObject()->Measure( + MeasureRequirement(max_size, MeasureSize::NotSpecified()), + MeasureSize::NotSpecified()); + + auto item_size = item->GetRenderObject()->GetSize(); + + if (max_size.width.IsSpecified()) { + max_size.width = max_size.width.GetLengthOrUndefined() - tab_width; + } + + if (max_size.height.IsSpecified()) { + max_size.height = max_size.height.GetLengthOrUndefined() - item_size.height; + } + + Size result_size = item_size; + + for (auto child : item->GetChildren()) { + auto child_size = MeasureTreeRenderObjectItem(max_size, child, tab_width); + if (child_size.width > result_size.width) + result_size.width = child_size.width; + result_size.height += child_size.height; + } + + return result_size; +} + Size TreeRenderObject::OnMeasureContent(const MeasureRequirement& requirement, const MeasureSize& preferred_size) { - throw Exception(u"Not implemented."); + auto size = + MeasureTreeRenderObjectItem(requirement.max, root_item_, tab_width_); + + size = Max(size, requirement.min.GetSizeOr0()); + + return size; } void TreeRenderObject::OnLayoutContent(const Rect& content_rect) { |