diff options
author | crupest <crupest@outlook.com> | 2019-03-20 18:47:05 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2019-03-20 18:47:05 +0800 |
commit | d518396a7fcdb2add413a9a37bb34515ff4f4cc4 (patch) | |
tree | a06d8088bc4646313b9fab22f382d5e5febc3630 /src | |
parent | 7f1acd3ab4bddf6c61551ebc867667fbdd3ad7b8 (diff) | |
download | cru-d518396a7fcdb2add413a9a37bb34515ff4f4cc4.tar.gz cru-d518396a7fcdb2add413a9a37bb34515ff4f4cc4.tar.bz2 cru-d518396a7fcdb2add413a9a37bb34515ff4f4cc4.zip |
...
Diffstat (limited to 'src')
-rw-r--r-- | src/ui/render/flex_layout_render_object.cpp | 63 | ||||
-rw-r--r-- | src/ui/render/flex_layout_render_object.hpp | 8 |
2 files changed, 47 insertions, 24 deletions
diff --git a/src/ui/render/flex_layout_render_object.cpp b/src/ui/render/flex_layout_render_object.cpp index 4e5171a2..58e7e338 100644 --- a/src/ui/render/flex_layout_render_object.cpp +++ b/src/ui/render/flex_layout_render_object.cpp @@ -152,58 +152,73 @@ Size FlexLayoutRenderObject::OnMeasureContent(const Size& available_size) { } void FlexLayoutRenderObject::OnLayoutContent(const Rect& content_rect) { - auto calculate_cross_anchor = [](Alignment alignment, float start_point, - float content_length, - float preferred_length) -> float { + auto calculate_anchor = [](Alignment alignment, float start_point, + float total_length, + float content_length) -> float { switch (alignment) { case Alignment::Start: return start_point; case Alignment::Center: - return start_point + (content_length - preferred_length) / 2.0f; + return start_point + (total_length - content_length) / 2.0f; case Alignment::End: - return start_point + content_length - preferred_length; + return start_point + total_length - content_length; } }; const auto& children = GetChildren(); if (direction_ == FlexDirection::Horizontal || direction_ == FlexDirection::HorizontalReverse) { + float actual_content_width = 0; + for (const auto child : children) { + actual_content_width += child->GetPreferredSize().width; + } + + const float content_anchor_x = calculate_anchor( + content_main_align_, 0, content_rect.width, actual_content_width); + auto anchor_x = 0; for (int i = 0; i < children.size(); i++) { const auto child = children[i]; const auto size = child->GetPreferredSize(); - float real_anchor_x; - if (direction_ == FlexDirection::Horizontal) { - real_anchor_x = anchor_x + content_rect.left; - } else { - real_anchor_x = content_rect.GetRight() - anchor_x; - } - child->Layout(Rect{real_anchor_x, - calculate_cross_anchor( - child_layout_data_[i].alignment, content_rect.top, - content_rect.height, size.height), - size.width, size.height}); + float real_anchor_x = anchor_x + content_anchor_x; + if (direction_ == FlexDirection::Horizontal) + real_anchor_x = content_rect.left + real_anchor_x; + else + real_anchor_x = content_rect.GetRight() - real_anchor_x; + child->Layout(Rect{ + real_anchor_x, + calculate_anchor(child_layout_data_[i].alignment, content_rect.top, + content_rect.height, size.height), + size.width, size.height}); anchor_x += size.width; } } else { + float actual_content_height = 0; + for (const auto child : children) { + actual_content_height = child->GetPreferredSize().height; + } + + const float content_anchor_y = calculate_anchor( + content_main_align_, 0, content_rect.height, actual_content_height); + auto anchor_y = 0; for (int i = 0; i < children.size(); i++) { const auto child = children[i]; const auto size = child->GetPreferredSize(); - float real_anchor_y; + float real_anchor_y = anchor_y + content_anchor_y; if (direction_ == FlexDirection::Vertical) { - real_anchor_y = anchor_y + content_rect.top; + real_anchor_y = content_rect.top + real_anchor_y; } else { - real_anchor_y = content_rect.GetBottom() - anchor_y; + real_anchor_y = content_rect.GetBottom() - real_anchor_y; } - child->Layout(Rect{real_anchor_y, - calculate_cross_anchor(child_layout_data_[i].alignment, - content_rect.left, - content_rect.width, size.width), - size.width, size.height}); + child->Layout(Rect{ + real_anchor_y, + calculate_anchor(child_layout_data_[i].alignment, content_rect.left, + content_rect.width, size.width), + size.width, size.height}); anchor_y += size.height; } diff --git a/src/ui/render/flex_layout_render_object.hpp b/src/ui/render/flex_layout_render_object.hpp index 7172f0c0..b12362e8 100644 --- a/src/ui/render/flex_layout_render_object.hpp +++ b/src/ui/render/flex_layout_render_object.hpp @@ -35,6 +35,13 @@ class FlexLayoutRenderObject : public RenderObject { FlexDirection GetFlexDirection() const { return direction_; } void SetFlexDirection(FlexDirection direction) { direction_ = direction; } + Alignment GetContentMainAlign() const { + return content_main_align_; + } + void SetContentMainAlign(Alignment align) { + content_main_align_ = align; + } + FlexChildLayoutData* GetChildLayoutData(int position); void Draw(ID2D1RenderTarget* render_target) override; @@ -50,6 +57,7 @@ class FlexLayoutRenderObject : public RenderObject { private: FlexDirection direction_ = FlexDirection::Horizontal; + Alignment content_main_align_ = Alignment::Start; std::vector<FlexChildLayoutData> child_layout_data_{}; }; } // namespace cru::ui::render |