aboutsummaryrefslogtreecommitdiff
path: root/src/ui/render/TreeRenderObject.cpp
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2022-02-08 23:25:26 +0800
committercrupest <crupest@outlook.com>2022-02-08 23:25:26 +0800
commitc29abb75272c4ee9ff216876aa8323ccb5080558 (patch)
treeda594457c70dbb794fed4cf34305ec864d0bc0fa /src/ui/render/TreeRenderObject.cpp
parente6911396948bc8ddb0304fa087c8aecb730a5048 (diff)
downloadcru-c29abb75272c4ee9ff216876aa8323ccb5080558.tar.gz
cru-c29abb75272c4ee9ff216876aa8323ccb5080558.tar.bz2
cru-c29abb75272c4ee9ff216876aa8323ccb5080558.zip
...
Diffstat (limited to 'src/ui/render/TreeRenderObject.cpp')
-rw-r--r--src/ui/render/TreeRenderObject.cpp37
1 files changed, 32 insertions, 5 deletions
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