aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2022-02-08 22:42:41 +0800
committercrupest <crupest@outlook.com>2022-02-08 22:42:41 +0800
commite6911396948bc8ddb0304fa087c8aecb730a5048 (patch)
tree10ac93983b7fb76759b5e4661c069b7e6ee8e1d1
parenta3db329c7756d9b198f36f03f641462645ad05ed (diff)
downloadcru-e6911396948bc8ddb0304fa087c8aecb730a5048.tar.gz
cru-e6911396948bc8ddb0304fa087c8aecb730a5048.tar.bz2
cru-e6911396948bc8ddb0304fa087c8aecb730a5048.zip
...
-rw-r--r--include/cru/ui/render/TreeRenderObject.h7
-rw-r--r--src/ui/render/TreeRenderObject.cpp43
2 files changed, 49 insertions, 1 deletions
diff --git a/include/cru/ui/render/TreeRenderObject.h b/include/cru/ui/render/TreeRenderObject.h
index 203474db..f3a6075d 100644
--- a/include/cru/ui/render/TreeRenderObject.h
+++ b/include/cru/ui/render/TreeRenderObject.h
@@ -40,6 +40,8 @@ class CRU_UI_API TreeRenderObjectItem : public Object {
std::vector<TreeRenderObjectItem*> children_;
RenderObject* render_object_;
+
+ Rect rect_cache_;
};
class CRU_UI_API TreeRenderObject : public RenderObject {
@@ -55,12 +57,17 @@ class CRU_UI_API TreeRenderObject : public RenderObject {
TreeRenderObjectItem* GetRootItem() { return root_item_; }
+ float GetTabWidth() const { return tab_width_; }
+ void SetTabWidth(float tab_width);
+
protected:
Size OnMeasureContent(const MeasureRequirement& requirement,
const MeasureSize& preferred_size) override;
void OnLayoutContent(const Rect& content_rect) override;
private:
+ float tab_width_ = 12.f;
+
TreeRenderObjectItem* root_item_;
};
} // namespace cru::ui::render
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) {