diff options
author | crupest <crupest@outlook.com> | 2020-06-26 18:31:43 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2020-06-26 18:31:43 +0800 |
commit | a8ffc35510fa44e6b10fbfd0f0db48d719d404d9 (patch) | |
tree | e0d11bb64c8c82a3a0f06c2fb77449ab0bcd37dc | |
parent | a48ff30f9d4ac8ae6cc9adef4a07f8d9beb69e7a (diff) | |
download | cru-a8ffc35510fa44e6b10fbfd0f0db48d719d404d9.tar.gz cru-a8ffc35510fa44e6b10fbfd0f0db48d719d404d9.tar.bz2 cru-a8ffc35510fa44e6b10fbfd0f0db48d719d404d9.zip |
Add flex layout layout logic docs.
-rw-r--r-- | include/cru/ui/render/FlexLayoutRenderObject.hpp | 70 |
1 files changed, 69 insertions, 1 deletions
diff --git a/include/cru/ui/render/FlexLayoutRenderObject.hpp b/include/cru/ui/render/FlexLayoutRenderObject.hpp index f82bffad..5a3fddeb 100644 --- a/include/cru/ui/render/FlexLayoutRenderObject.hpp +++ b/include/cru/ui/render/FlexLayoutRenderObject.hpp @@ -2,6 +2,73 @@ #include "LayoutRenderObject.hpp" namespace cru::ui::render { +// Layout logic (v0.1): +// 1. Layout all children with unspecified(infinate) max main axis length. If +// max cross axis length of parent is specified, then it is passed to children. +// +// 2. Add up main axis length of children to get total length. +// +// 2.1. If preferred main axis length of parent is specified, then compare +// total length with it. If bigger, shrink is performed. If smaller, expand is +// performed. And preferred main axis length is used as target length. +// +// 2.2. If preferred main axis length of parent is not specified. +// +// 2.2.1. If max main axis length is specified and total length is bigger +// than max main axis length, shrink is performed and max main axis length is +// used as target length. +// +// 2.2.2. If min main axis length is specified and total length is smaller +// than min main axis length, expand is performed and min main axis length is +// used as target length. +// +// 2.2.3. If any child has a positive expand factor and max main axis length +// is set, then expand is performed and max main axis length is used as +// target length. +// +// 3. If shrink or expand is needed, then +// +// 3.1. Shrink: +// +// 3.1.1. Find out all shrink_factor > 0 children to form a adjusting list. +// +// 3.1.2. Add up all main axis length of children and minus target length to +// get the total shrink length. Add up all shrink_factor in adjusting list to +// get total shrink factor. +// +// 3.1.3. Iterate all children in adjusting list: +// +// 3.1.3.1. Calculate its own shrink length as +// shrink_factor / total_shrink_factor * total_shrink_length . +// Use current main axis length of child minus shrink length to get new +// measure length. +// +// 3.1.3.2. If min main axis length of the child is specified and new +// measure length is less than it, then min main axis length is used as new +// measure length. +// +// 3.1.3.3. Or if new measure length is less than 0, then it is coerced to +// 0. +// +// 3.1.3.4. Call measure with max main axis length set to new measure +// length. Cross axis length requirement is the same as step 1. +// +// 3.1.3.5. After measure, if it has min main axis length specified and +// actual main axis length is equal to it or its actual main axis length is +// 0, then remove it from adjusting list. +// +// 3.1.4. If adjusting list is not empty, go to step 2). +// +// 3.2. Expand: +// The same as shrink after you exchange related things. +// +// 4. If final total main axis length does not satisfy requirement, then report +// an error. And use the coerced size. +// +// 5. Result cross axis length is the max cross axis length of all children. If +// min cross axis length is specified and result length is smaller than it, then +// result length is coerced to it. +// class FlexLayoutRenderObject : public LayoutRenderObject<FlexChildLayoutData> { public: FlexLayoutRenderObject() = default; @@ -31,7 +98,8 @@ class FlexLayoutRenderObject : public LayoutRenderObject<FlexChildLayoutData> { } protected: - Size OnMeasureContent(const MeasureRequirement& requirement, const MeasureSize& preferred_size) override; + Size OnMeasureContent(const MeasureRequirement& requirement, + const MeasureSize& preferred_size) override; void OnLayoutContent(const Rect& content_rect) override; private: |