aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/cru/ui/render/TreeRenderObject.h5
-rw-r--r--src/ui/render/TreeRenderObject.cpp37
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