aboutsummaryrefslogtreecommitdiff
path: root/src/ui/render/TreeRenderObject.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/render/TreeRenderObject.cpp')
-rw-r--r--src/ui/render/TreeRenderObject.cpp43
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) {