diff options
Diffstat (limited to 'src/ui')
| -rw-r--r-- | src/ui/controls/ControlHost.cpp | 15 | ||||
| -rw-r--r-- | src/ui/render/BorderRenderObject.cpp | 14 | ||||
| -rw-r--r-- | src/ui/render/CanvasRenderObject.cpp | 9 | ||||
| -rw-r--r-- | src/ui/render/FlexLayoutRenderObject.cpp | 79 | ||||
| -rw-r--r-- | src/ui/render/GeometryRenderObject.cpp | 13 | ||||
| -rw-r--r-- | src/ui/render/RenderObject.cpp | 95 | ||||
| -rw-r--r-- | src/ui/render/ScrollBar.cpp | 16 | ||||
| -rw-r--r-- | src/ui/render/ScrollRenderObject.cpp | 31 | ||||
| -rw-r--r-- | src/ui/render/StackLayoutRenderObject.cpp | 27 | ||||
| -rw-r--r-- | src/ui/render/TextRenderObject.cpp | 31 | ||||
| -rw-r--r-- | src/ui/render/TreeRenderObject.cpp | 20 | ||||
| -rw-r--r-- | src/ui/style/Styler.cpp | 2 |
12 files changed, 135 insertions, 217 deletions
diff --git a/src/ui/controls/ControlHost.cpp b/src/ui/controls/ControlHost.cpp index f83aa1a2..caa907da 100644 --- a/src/ui/controls/ControlHost.cpp +++ b/src/ui/controls/ControlHost.cpp @@ -156,16 +156,15 @@ void ControlHost::Relayout() { void ControlHost::RelayoutWithSize(const Size& available_size, bool set_window_size_to_fit_content) { auto render_object = root_control_->GetRenderObject(); - render_object->Measure( - render::MeasureRequirement{ - available_size, - !set_window_size_to_fit_content && IsLayoutPreferToFillWindow() - ? render::MeasureSize(available_size) - : render::MeasureSize::NotSpecified()}, - render::MeasureSize::NotSpecified()); + render_object->Measure(render::MeasureRequirement{ + available_size, + !set_window_size_to_fit_content && IsLayoutPreferToFillWindow() + ? render::MeasureSize(available_size) + : render::MeasureSize::NotSpecified(), + render::MeasureSize::NotSpecified()}); if (set_window_size_to_fit_content) { - native_window_->SetClientSize(render_object->GetDesiredSize()); + native_window_->SetClientSize(render_object->GetMeasureResultSize()); } render_object->Layout(Point{}); diff --git a/src/ui/render/BorderRenderObject.cpp b/src/ui/render/BorderRenderObject.cpp index 23405aac..18fc6475 100644 --- a/src/ui/render/BorderRenderObject.cpp +++ b/src/ui/render/BorderRenderObject.cpp @@ -114,13 +114,13 @@ void BorderRenderObject::Draw(platform::graphics::IPainter* painter) { foreground_brush_.get()); } -Size BorderRenderObject::OnMeasureContent(const MeasureRequirement& requirement, - const MeasureSize& preferred_size) { +Size BorderRenderObject::OnMeasureContent( + const MeasureRequirement& requirement) { if (auto child = GetChild()) { - child->Measure(requirement, preferred_size); - return child->GetDesiredSize(); + child->Measure(requirement); + return child->GetMeasureResultSize(); } else { - return preferred_size.GetSizeOr0(); + return requirement.suggest.GetSizeOr0(); } } @@ -157,7 +157,7 @@ Rect BorderRenderObject::GetPaddingRect() { } Rect BorderRenderObject::GetContentRect() { - const auto size = GetDesiredSize(); + const auto size = GetMeasureResultSize(); Rect rect{Point{}, size}; rect = rect.Shrink(GetMargin()); if (is_border_enabled_) rect = rect.Shrink(border_thickness_); @@ -212,7 +212,7 @@ void BorderRenderObject::RecreateGeometry() { builder->CloseFigure(true); }; - const auto size = GetDesiredSize(); + const auto size = GetMeasureResultSize(); const auto margin = GetMargin(); const Rect outer_rect{margin.left, margin.top, size.width - margin.GetHorizontalTotal(), diff --git a/src/ui/render/CanvasRenderObject.cpp b/src/ui/render/CanvasRenderObject.cpp index b68f9afd..0c5ca3ed 100644 --- a/src/ui/render/CanvasRenderObject.cpp +++ b/src/ui/render/CanvasRenderObject.cpp @@ -12,13 +12,12 @@ RenderObject* CanvasRenderObject::HitTest(const Point& point) { void CanvasRenderObject::Draw(platform::graphics::IPainter* painter) { const auto rect = GetContentRect(); CanvasPaintEventArgs args{painter, rect.GetSize()}; - paint_event_.Raise(args); + PaintEvent_.Raise(args); } -Size CanvasRenderObject::OnMeasureContent(const MeasureRequirement& requirement, - const MeasureSize& preferred_size) { - return requirement.Coerce(Size{preferred_size.width.GetLengthOr(100), - preferred_size.height.GetLengthOr(100)}); +Size CanvasRenderObject::OnMeasureContent( + const MeasureRequirement& requirement) { + return requirement.Coerce(requirement.suggest.GetSizeOr({100, 100})); } void CanvasRenderObject::OnLayoutContent(const Rect& content_rect) { diff --git a/src/ui/render/FlexLayoutRenderObject.cpp b/src/ui/render/FlexLayoutRenderObject.cpp index 8cbc0295..124f7e70 100644 --- a/src/ui/render/FlexLayoutRenderObject.cpp +++ b/src/ui/render/FlexLayoutRenderObject.cpp @@ -10,6 +10,7 @@ namespace cru::ui::render { FlexLayoutRenderObject::FlexLayoutRenderObject() : LayoutRenderObject<FlexChildLayoutData>(kRenderObjectName) {} +namespace { struct tag_horizontal_t {}; struct tag_vertical_t {}; @@ -69,7 +70,6 @@ constexpr TSize CreateTSize(decltype(std::declval<TSize>().width) main, enum class FlexLayoutAdjustType { None, Expand, Shrink }; -namespace { void Remove(std::vector<Index>& v, const std::vector<Index>& to_remove_v) { Index current = 0; for (auto to_remove : to_remove_v) { @@ -106,16 +106,15 @@ Size FlexLayoutMeasureContentImpl( // step 1. for (Index i = 0; i < child_count; i++) { const auto child = children[i]; - child->Measure(MeasureRequirement{CreateTSize<MeasureSize>( - MeasureLength::NotSpecified(), - max_cross_length, direction_tag), - MeasureSize::NotSpecified()}, - MeasureSize::NotSpecified()); + child->Measure(MeasureRequirement{ + CreateTSize<MeasureSize>(MeasureLength::NotSpecified(), + max_cross_length, direction_tag), + MeasureSize::NotSpecified(), MeasureSize::NotSpecified()}); } float total_length = 0.f; for (auto child : children) { - total_length += GetMain(child->GetDesiredSize(), direction_tag); + total_length += GetMain(child->GetMeasureResultSize(), direction_tag); } // step 2. @@ -188,7 +187,8 @@ Size FlexLayoutMeasureContentImpl( const float shrink_length = layout_data[i].shrink_factor / total_shrink_factor * total_shrink_length; float new_measure_length = - GetMain(child->GetDesiredSize(), direction_tag) - shrink_length; + GetMain(child->GetMeasureResultSize(), direction_tag) - + shrink_length; MeasureLength child_min_main_length = GetMain(child->GetMinSize(), direction_tag); @@ -200,15 +200,15 @@ Size FlexLayoutMeasureContentImpl( new_measure_length = 0.f; } - child->Measure(MeasureRequirement{CreateTSize<MeasureSize>( - new_measure_length, - max_cross_length, direction_tag), - MeasureSize::NotSpecified()}, - CreateTSize<MeasureSize>(new_measure_length, - MeasureLength::NotSpecified(), - direction_tag)); + child->Measure(MeasureRequirement{ + CreateTSize<MeasureSize>(new_measure_length, max_cross_length, + direction_tag), + MeasureSize::NotSpecified(), + CreateTSize<MeasureSize>(new_measure_length, + MeasureLength::NotSpecified(), + direction_tag)}); - const Size new_size = child->GetDesiredSize(); + const Size new_size = child->GetMeasureResultSize(); const float new_main_length = GetMain(new_size, direction_tag); if (new_main_length >= new_measure_length) { to_remove.push_back(i); @@ -217,7 +217,7 @@ Size FlexLayoutMeasureContentImpl( total_length = 0.f; for (auto child : children) { - total_length += GetMain(child->GetDesiredSize(), direction_tag); + total_length += GetMain(child->GetMeasureResultSize(), direction_tag); } if (total_length <= target_length) break; @@ -248,7 +248,8 @@ Size FlexLayoutMeasureContentImpl( const float expand_length = layout_data[i].expand_factor / total_expand_factor * total_expand_length; float new_measure_length = - GetMain(child->GetDesiredSize(), direction_tag) + expand_length; + GetMain(child->GetMeasureResultSize(), direction_tag) + + expand_length; MeasureLength child_max_main_length = GetMain(child->GetMaxSize(), direction_tag); @@ -258,18 +259,17 @@ Size FlexLayoutMeasureContentImpl( new_measure_length = child_max_main_length.GetLengthOrUndefined(); } - child->Measure( - MeasureRequirement{ - CreateTSize<MeasureSize>(MeasureLength::NotSpecified(), - max_cross_length, direction_tag), - CreateTSize<MeasureSize>(new_measure_length, - MeasureLength::NotSpecified(), - direction_tag)}, + child->Measure(MeasureRequirement{ + CreateTSize<MeasureSize>(MeasureLength::NotSpecified(), + max_cross_length, direction_tag), + CreateTSize<MeasureSize>(new_measure_length, + MeasureLength::NotSpecified(), + direction_tag), CreateTSize<MeasureSize>(new_measure_length, MeasureLength::NotSpecified(), - direction_tag)); + direction_tag)}); - const Size new_size = child->GetDesiredSize(); + const Size new_size = child->GetMeasureResultSize(); const float new_main_length = GetMain(new_size, direction_tag); if (new_main_length <= new_measure_length) { to_remove.push_back(i); @@ -278,7 +278,7 @@ Size FlexLayoutMeasureContentImpl( total_length = 0.f; for (auto child : children) { - total_length += GetMain(child->GetDesiredSize(), direction_tag); + total_length += GetMain(child->GetMeasureResultSize(), direction_tag); } if (total_length >= target_length) break; @@ -290,7 +290,8 @@ Size FlexLayoutMeasureContentImpl( float child_max_cross_length = 0.f; for (auto child : children) { - const float cross_length = GetCross(child->GetDesiredSize(), direction_tag); + const float cross_length = + GetCross(child->GetMeasureResultSize(), direction_tag); if (cross_length > child_max_cross_length) { child_max_cross_length = cross_length; } @@ -311,16 +312,16 @@ Size FlexLayoutMeasureContentImpl( child_max_cross_length = std::max(min_cross_length.GetLengthOr0(), child_max_cross_length); child_max_cross_length = - std::min(max_cross_length.GetLengthOrMax(), child_max_cross_length); + std::min(max_cross_length.GetLengthOrMaxFloat(), child_max_cross_length); for (Index i = 0; i < child_count; i++) { auto child_layout_data = layout_data[i]; auto child = children[i]; if (child_layout_data.cross_alignment.value_or(item_cross_align) == Alignment::Stretch) { - auto size = child->GetDesiredSize(); + auto size = child->GetMeasureResultSize(); GetCross(size, direction_tag) = child_max_cross_length; - child->Measure({size, size}, MeasureSize::NotSpecified()); + child->Measure({size, size, MeasureSize::NotSpecified()}); } } @@ -329,7 +330,7 @@ Size FlexLayoutMeasureContentImpl( } // namespace Size FlexLayoutRenderObject::OnMeasureContent( - const MeasureRequirement& requirement, const MeasureSize& preferred_size) { + const MeasureRequirement& requirement) { const bool horizontal = (direction_ == FlexDirection::Horizontal || direction_ == FlexDirection::HorizontalReverse); std::vector<RenderObject*> children; @@ -341,11 +342,11 @@ Size FlexLayoutRenderObject::OnMeasureContent( if (horizontal) { return FlexLayoutMeasureContentImpl<tag_horizontal_t>( - requirement, preferred_size, children, layout_data_list, + requirement, requirement.suggest, children, layout_data_list, item_cross_align_, kLogTag); } else { return FlexLayoutMeasureContentImpl<tag_vertical_t>( - requirement, preferred_size, children, layout_data_list, + requirement, requirement.suggest, children, layout_data_list, item_cross_align_, kLogTag); } } @@ -363,7 +364,7 @@ void FlexLayoutRenderObject::OnLayoutContent(const Rect& content_rect) { float current_main_offset = 0; for (Index i = 0; i < child_count; i++) { const auto child = children[i]; - const auto size = child->GetDesiredSize(); + const auto size = child->GetMeasureResultSize(); const auto cross_align = layout_data_list[i].cross_alignment.value_or(GetItemCrossAlign()); child->Layout( @@ -377,7 +378,7 @@ void FlexLayoutRenderObject::OnLayoutContent(const Rect& content_rect) { float current_main_offset = 0; for (Index i = 0; i < child_count; i++) { const auto child = children[i]; - const auto size = child->GetDesiredSize(); + const auto size = child->GetMeasureResultSize(); const auto cross_align = layout_data_list[i].cross_alignment.value_or(GetItemCrossAlign()); child->Layout( @@ -390,7 +391,7 @@ void FlexLayoutRenderObject::OnLayoutContent(const Rect& content_rect) { float current_main_offset = 0; for (Index i = 0; i < child_count; i++) { const auto child = children[i]; - const auto size = child->GetDesiredSize(); + const auto size = child->GetMeasureResultSize(); const auto cross_align = layout_data_list[i].cross_alignment.value_or(GetItemCrossAlign()); child->Layout(Point{ @@ -404,7 +405,7 @@ void FlexLayoutRenderObject::OnLayoutContent(const Rect& content_rect) { float current_main_offset = 0; for (Index i = 0; i < child_count; i++) { const auto child = children[i]; - const auto size = child->GetDesiredSize(); + const auto size = child->GetMeasureResultSize(); const auto cross_align = layout_data_list[i].cross_alignment.value_or(GetItemCrossAlign()); child->Layout( diff --git a/src/ui/render/GeometryRenderObject.cpp b/src/ui/render/GeometryRenderObject.cpp index 9b4eb572..84379b39 100644 --- a/src/ui/render/GeometryRenderObject.cpp +++ b/src/ui/render/GeometryRenderObject.cpp @@ -91,18 +91,9 @@ RenderObject* GeometryRenderObject::HitTest(const Point& point) { } Size GeometryRenderObject::OnMeasureContent( - const MeasureRequirement& requirement, const MeasureSize& preferred_size) { + const MeasureRequirement& requirement) { Size result = GetViewPort().GetSize(); - - if (preferred_size.width.IsSpecified()) { - result.width = preferred_size.width.GetLengthOrUndefined(); - } - - if (preferred_size.height.IsSpecified()) { - result.height = preferred_size.height.GetLengthOrUndefined(); - } - - return requirement.Coerce(result); + return requirement.ExpandToSuggestAndCoerce(result); } void GeometryRenderObject::OnLayoutContent(const Rect& content_rect) {} diff --git a/src/ui/render/RenderObject.cpp b/src/ui/render/RenderObject.cpp index 9081d553..59dc6d6a 100644 --- a/src/ui/render/RenderObject.cpp +++ b/src/ui/render/RenderObject.cpp @@ -1,8 +1,8 @@ #include "cru/ui/render/RenderObject.h" +#include "cru/base/Base.h" #include "cru/base/log/Logger.h" #include "cru/platform/GraphicsBase.h" -#include "cru/ui/DebugFlags.h" #include "cru/ui/controls/Control.h" #include "cru/ui/controls/ControlHost.h" @@ -63,8 +63,8 @@ void RenderObject::SetPadding(const Thickness& padding) { InvalidateLayout(); } -void RenderObject::SetPreferredSize(const MeasureSize& preferred_size) { - preferred_size_ = preferred_size; +void RenderObject::SetSuggestSize(const MeasureSize& suggest_size) { + custom_measure_requirement_.suggest = suggest_size; InvalidateLayout(); } @@ -78,93 +78,56 @@ void RenderObject::SetMaxSize(const MeasureSize& max_size) { InvalidateLayout(); } -void RenderObject::Measure(const MeasureRequirement& requirement, - const MeasureSize& preferred_size) { - MeasureRequirement merged_requirement = - MeasureRequirement::Merge(requirement, custom_measure_requirement_) - .Normalize(); - MeasureSize merged_preferred_size = - preferred_size.OverrideBy(preferred_size_); +void RenderObject::Measure(const MeasureRequirement& requirement) { + CRU_LOG_TAG_DEBUG("{} Measure begins, requirement {}.", + this->GetDebugPathInTree(), requirement); - if constexpr (cru::ui::debug_flags::layout) { - CRU_LOG_TAG_DEBUG( - "{} Measure begins :\nrequirement: {}\npreferred size: {}", - this->GetDebugPathInTree(), requirement.ToDebugString(), - preferred_size.ToDebugString()); + measure_result_size_ = OnMeasureCore(requirement); + if (measure_result_size_.width < 0 || measure_result_size_.height < 0) { + throw Exception("Measure result size is invalid."); } - desired_size_ = OnMeasureCore(merged_requirement, merged_preferred_size); - - if constexpr (cru::ui::debug_flags::layout) { - CRU_LOG_TAG_DEBUG("{} Measure ends :\nresult size: {}", - this->GetDebugPathInTree(), desired_size_); - } - - Ensures(desired_size_.width >= 0); - Ensures(desired_size_.height >= 0); + CRU_LOG_TAG_DEBUG("{} Measure ends, result size: {}.", + this->GetDebugPathInTree(), measure_result_size_); } void RenderObject::Layout(const Point& offset) { - if constexpr (cru::ui::debug_flags::layout) { - CRU_LOG_TAG_DEBUG("{} Layout :\noffset: {} size: {}", - this->GetDebugPathInTree(), offset, desired_size_); - } + CRU_LOG_TAG_DEBUG("{} Layout begins, offset: {}, size: {}.", + this->GetDebugPathInTree(), offset, measure_result_size_); + offset_ = offset; - size_ = desired_size_; + size_ = measure_result_size_; OnResize(size_); OnLayoutCore(); + + CRU_LOG_TAG_DEBUG("{} Layout ends.", this->GetDebugPathInTree()); } Thickness RenderObject::GetTotalSpaceThickness() { return margin_ + padding_; } Thickness RenderObject::GetInnerSpaceThickness() { return padding_; } -Size RenderObject::OnMeasureCore(const MeasureRequirement& requirement, - const MeasureSize& preferred_size) { - const Thickness outer_space = GetTotalSpaceThickness(); - const Size space_size{outer_space.GetHorizontalTotal(), - outer_space.GetVerticalTotal()}; - - MeasureRequirement content_requirement = requirement; +Size RenderObject::OnMeasureCore(const MeasureRequirement& requirement) { + auto space_size = GetTotalSpaceThickness().GetTotalSize(); - content_requirement.max = content_requirement.max.Minus(space_size); - content_requirement.min = content_requirement.min.Minus(space_size); + auto content_requirement = + requirement.Merge(custom_measure_requirement_).Minus(space_size); - auto inner_space = GetInnerSpaceThickness(); - MeasureSize content_preferred_size = - content_requirement.Coerce(preferred_size.Minus( - {inner_space.GetHorizontalTotal(), inner_space.GetVerticalTotal()})); - - const auto content_size = - OnMeasureContent(content_requirement, content_preferred_size); + auto content_size = OnMeasureContent(content_requirement); return space_size + content_size; } void RenderObject::OnLayoutCore() { - Size total_size = GetDesiredSize(); - const Thickness outer_space = GetTotalSpaceThickness(); - const Size space_size{outer_space.GetHorizontalTotal(), - outer_space.GetVerticalTotal()}; - - auto content_size = total_size - space_size; - - if (content_size.width < 0) { - content_size.width = 0; - } - if (content_size.height < 0) { - content_size.height = 0; - } + auto total_size = GetMeasureResultSize(); + auto outer_space = GetTotalSpaceThickness(); + auto content_size = (total_size - outer_space.GetTotalSize()).AtLeast0(); Point lefttop{outer_space.left, outer_space.top}; - if (lefttop.x > total_size.width) { - lefttop.x = total_size.width; - } - if (lefttop.y > total_size.height) { - lefttop.y = total_size.height; - } + lefttop.x = std::min(lefttop.x, total_size.width); + lefttop.y = std::min(lefttop.y, total_size.height); const Rect content_rect{lefttop, content_size}; @@ -172,7 +135,7 @@ void RenderObject::OnLayoutCore() { } Rect RenderObject::GetPaddingRect() { - const auto size = GetDesiredSize(); + const auto size = GetMeasureResultSize(); Rect rect{Point{}, size}; rect = rect.Shrink(GetMargin()); rect.left = std::min(rect.left, size.width); @@ -183,7 +146,7 @@ Rect RenderObject::GetPaddingRect() { } Rect RenderObject::GetContentRect() { - const auto size = GetDesiredSize(); + const auto size = GetMeasureResultSize(); Rect rect{Point{}, size}; rect = rect.Shrink(GetMargin()); rect = rect.Shrink(GetPadding()); diff --git a/src/ui/render/ScrollBar.cpp b/src/ui/render/ScrollBar.cpp index 9e35cd30..8b2beac5 100644 --- a/src/ui/render/ScrollBar.cpp +++ b/src/ui/render/ScrollBar.cpp @@ -422,7 +422,7 @@ bool HorizontalScrollBar::IsShowBar() { if (child == nullptr) return false; const auto view_rect = render_object_->GetViewRect(); - const auto child_size = child->GetDesiredSize(); + const auto child_size = child->GetMeasureResultSize(); if (view_rect.width >= child_size.width) return false; @@ -439,7 +439,7 @@ std::optional<Rect> HorizontalScrollBar::GetExpandedAreaRect( const auto child = render_object_->GetChild(); const auto view_rect = render_object_->GetViewRect(); - const auto child_size = child->GetDesiredSize(); + const auto child_size = child->GetMeasureResultSize(); const float start_percentage = view_rect.left / child_size.width; const float length_percentage = view_rect.width / child_size.width; @@ -491,7 +491,7 @@ std::optional<Rect> HorizontalScrollBar::GetCollapsedThumbRect() { const auto child = render_object_->GetChild(); const auto view_rect = render_object_->GetViewRect(); - const auto child_size = child->GetDesiredSize(); + const auto child_size = child->GetMeasureResultSize(); const float start_percentage = view_rect.left / child_size.width; const float length_percentage = view_rect.width / child_size.width; @@ -517,7 +517,7 @@ float HorizontalScrollBar::CalculateNewScrollPosition( auto thumb_head_end = scroll_area_end - thumb_original_rect.width; const auto child = render_object_->GetChild(); - const auto child_size = child->GetDesiredSize(); + const auto child_size = child->GetMeasureResultSize(); new_thumb_start = std::clamp(new_thumb_start, scroll_area_start, thumb_head_end); @@ -570,7 +570,7 @@ bool VerticalScrollBar::IsShowBar() { if (child == nullptr) return false; const auto view_rect = render_object_->GetViewRect(); - const auto child_size = child->GetDesiredSize(); + const auto child_size = child->GetMeasureResultSize(); if (view_rect.height >= child_size.height) return false; @@ -587,7 +587,7 @@ std::optional<Rect> VerticalScrollBar::GetExpandedAreaRect( const auto child = render_object_->GetChild(); const auto view_rect = render_object_->GetViewRect(); - const auto child_size = child->GetDesiredSize(); + const auto child_size = child->GetMeasureResultSize(); const float start_percentage = view_rect.top / child_size.height; const float length_percentage = view_rect.height / child_size.height; @@ -637,7 +637,7 @@ std::optional<Rect> VerticalScrollBar::GetCollapsedThumbRect() { const auto view_rect = render_object_->GetViewRect(); const auto padding_rect = render_object_->GetPaddingRect(); - const auto child_size = child->GetDesiredSize(); + const auto child_size = child->GetMeasureResultSize(); if (view_rect.height >= child_size.height) return std::nullopt; @@ -663,7 +663,7 @@ float VerticalScrollBar::CalculateNewScrollPosition( auto thumb_head_end = scroll_area_end - thumb_original_rect.height; const auto child = render_object_->GetChild(); - const auto child_size = child->GetDesiredSize(); + const auto child_size = child->GetMeasureResultSize(); new_thumb_start = std::clamp(new_thumb_start, scroll_area_start, thumb_head_end); diff --git a/src/ui/render/ScrollRenderObject.cpp b/src/ui/render/ScrollRenderObject.cpp index d3e00db1..4d359a86 100644 --- a/src/ui/render/ScrollRenderObject.cpp +++ b/src/ui/render/ScrollRenderObject.cpp @@ -163,29 +163,18 @@ void ScrollRenderObject::SetMouseWheelScrollEnabled(bool enable) { } } -Size ScrollRenderObject::OnMeasureContent(const MeasureRequirement& requirement, - const MeasureSize& preferred_size) { +Size ScrollRenderObject::OnMeasureContent( + const MeasureRequirement& requirement) { if (auto child = GetChild()) { - child->Measure(MeasureRequirement{MeasureSize::NotSpecified(), - MeasureSize::NotSpecified()}, - MeasureSize::NotSpecified()); + child->Measure({MeasureSize::NotSpecified(), MeasureSize::NotSpecified(), + MeasureSize::NotSpecified()}); + + auto result = + requirement.ExpandToSuggestAndCoerce(child->GetMeasureResultSize()); - Size result = requirement.Coerce(child->GetDesiredSize()); - if (preferred_size.width.IsSpecified()) { - result.width = preferred_size.width.GetLengthOrUndefined(); - } - if (preferred_size.height.IsSpecified()) { - result.height = preferred_size.height.GetLengthOrUndefined(); - } return result; } else { - Size result{preferred_size.width.IsSpecified() - ? preferred_size.width.GetLengthOrUndefined() - : requirement.min.width.GetLengthOr0(), - preferred_size.height.IsSpecified() - ? preferred_size.height.GetLengthOrUndefined() - : requirement.min.height.GetLengthOr0()}; - return result; + return requirement.suggest.GetSizeOr0(); } } @@ -247,7 +236,7 @@ bool ScrollRenderObject::HorizontalCanScrollDown() { auto child = GetChild(); if (child == nullptr) return false; return GetScrollOffset().x < - child->GetDesiredSize().width - GetViewRect().width; + child->GetMeasureResultSize().width - GetViewRect().width; } bool ScrollRenderObject::VerticalCanScrollUp() { @@ -258,6 +247,6 @@ bool ScrollRenderObject::VerticalCanScrollDown() { auto child = GetChild(); if (child == nullptr) return false; return GetScrollOffset().y < - child->GetDesiredSize().height - GetViewRect().height; + child->GetMeasureResultSize().height - GetViewRect().height; } } // namespace cru::ui::render diff --git a/src/ui/render/StackLayoutRenderObject.cpp b/src/ui/render/StackLayoutRenderObject.cpp index 6d5b9a10..d7017227 100644 --- a/src/ui/render/StackLayoutRenderObject.cpp +++ b/src/ui/render/StackLayoutRenderObject.cpp @@ -3,8 +3,6 @@ #include "cru/ui/render/LayoutHelper.h" #include "cru/ui/render/MeasureRequirement.h" -#include <algorithm> - namespace cru::ui::render { StackLayoutRenderObject::StackLayoutRenderObject() @@ -22,20 +20,18 @@ void StackLayoutRenderObject::SetDefaultVerticalAlignment(Alignment alignment) { } Size StackLayoutRenderObject::OnMeasureContent( - const MeasureRequirement& requirement, const MeasureSize& preferred_size) { + const MeasureRequirement& requirement) { Size child_max_size; for (int i = 0; i < GetChildCount(); i++) { auto child = GetChildAt(i); - child->Measure( - MeasureRequirement(requirement.max, MeasureSize::NotSpecified()), - MeasureSize::NotSpecified()); - const auto size = child->GetDesiredSize(); - child_max_size.width = std::max(child_max_size.width, size.width); - child_max_size.height = std::max(child_max_size.height, size.height); + child->Measure({requirement.max, MeasureSize::NotSpecified(), + MeasureSize::NotSpecified()}); + auto size = child->GetMeasureResultSize(); + child_max_size = child_max_size.Max(size); } - child_max_size = Max(preferred_size.GetSizeOr0(), child_max_size); - child_max_size = Max(requirement.min.GetSizeOr0(), child_max_size); + child_max_size = requirement.suggest.Max(child_max_size); + child_max_size = requirement.min.Max(child_max_size); for (Index i = 0; i < GetChildCount(); ++i) { auto child_layout_data = GetChildLayoutDataAt(i); @@ -47,8 +43,9 @@ Size StackLayoutRenderObject::OnMeasureContent( Alignment::Stretch; if (horizontal_stretch || vertical_stretch) { auto child = GetChildAt(i); - auto child_size = child->GetDesiredSize(); - MeasureRequirement child_requirement(child_size, child_size); + auto child_size = child->GetMeasureResultSize(); + MeasureRequirement child_requirement(child_size, child_size, + MeasureSize::NotSpecified()); if (horizontal_stretch) { child_requirement.min.width = child_requirement.max.width = child_max_size.width; @@ -58,7 +55,7 @@ Size StackLayoutRenderObject::OnMeasureContent( child_requirement.min.height = child_requirement.max.height = child_max_size.height; } - child->Measure(child_requirement, MeasureSize::NotSpecified()); + child->Measure(child_requirement); } } @@ -71,7 +68,7 @@ void StackLayoutRenderObject::OnLayoutContent(const Rect& content_rect) { for (int i = 0; i < count; i++) { const auto child = GetChildAt(i); const auto& layout_data = GetChildLayoutDataAt(i); - const auto& size = child->GetDesiredSize(); + const auto& size = child->GetMeasureResultSize(); child->Layout(Point{ CalculateAnchorByAlignment( layout_data.horizontal.value_or(default_horizontal_alignment_), diff --git a/src/ui/render/TextRenderObject.cpp b/src/ui/render/TextRenderObject.cpp index b9ab8dd9..44dee1aa 100644 --- a/src/ui/render/TextRenderObject.cpp +++ b/src/ui/render/TextRenderObject.cpp @@ -8,7 +8,6 @@ #include "cru/ui/DebugFlags.h" #include "cru/ui/render/RenderObject.h" -#include <algorithm> #include <limits> namespace cru::ui::render { @@ -180,7 +179,7 @@ void TextRenderObject::Draw(platform::graphics::IPainter* painter) { CRU_LOG_TAG_DEBUG( "Begin to paint, total_offset: {}, size: {}, text_layout: " "{}, brush: {}.", - this->GetTotalOffset(), this->GetDesiredSize(), + this->GetTotalOffset(), this->GetMeasureResultSize(), this->text_layout_->GetDebugString(), this->brush_->GetDebugString()); } @@ -197,32 +196,16 @@ void TextRenderObject::Draw(platform::graphics::IPainter* painter) { } } -Size TextRenderObject::OnMeasureContent(const MeasureRequirement& requirement, - const MeasureSize& preferred_size) { - float measure_width; - if (preferred_size.width.IsSpecified()) - measure_width = preferred_size.width.GetLengthOrUndefined(); - else - measure_width = requirement.max.width.GetLengthOrMax(); +Size TextRenderObject::OnMeasureContent(const MeasureRequirement& requirement) { + float measure_width = requirement.suggest.width.GetLengthOr( + requirement.max.width.GetLengthOrMaxFloat()); text_layout_->SetMaxWidth(measure_width); text_layout_->SetMaxHeight(std::numeric_limits<float>::max()); - const Size text_size( - text_layout_->GetTextBounds(is_measure_including_trailing_space_) - .GetRightBottom()); - auto result = text_size; - - result.width = std::max(result.width, preferred_size.width.GetLengthOr0()); - result.width = std::max(result.width, requirement.min.width.GetLengthOr0()); - result.width = std::min(result.width, requirement.max.width.GetLengthOrMax()); - - result.height = std::max(result.height, preferred_size.height.GetLengthOr0()); - result.height = - std::max(result.height, requirement.min.height.GetLengthOr0()); - result.height = - std::min(result.height, requirement.max.height.GetLengthOrMax()); - + Size result(text_layout_->GetTextBounds(is_measure_including_trailing_space_) + .GetRightBottom()); + result = requirement.ExpandToSuggestAndCoerce(result); return result; } diff --git a/src/ui/render/TreeRenderObject.cpp b/src/ui/render/TreeRenderObject.cpp index 8c13e93a..758108f6 100644 --- a/src/ui/render/TreeRenderObject.cpp +++ b/src/ui/render/TreeRenderObject.cpp @@ -101,12 +101,12 @@ static Size MeasureTreeRenderObjectItem(MeasureSize max_size, float tab_width) { auto render_object = item->GetRenderObject(); if (render_object) { - render_object->Measure( - MeasureRequirement(max_size, MeasureSize::NotSpecified()), - MeasureSize::NotSpecified()); + render_object->Measure(MeasureRequirement( + max_size, MeasureSize::NotSpecified(), MeasureSize::NotSpecified())); } - Size item_size = render_object ? render_object->GetDesiredSize() : Size{}; + Size item_size = + render_object ? render_object->GetMeasureResultSize() : Size{}; if (max_size.width.IsSpecified()) { max_size.width = max_size.width.GetLengthOrUndefined() - tab_width; @@ -128,14 +128,10 @@ static Size MeasureTreeRenderObjectItem(MeasureSize max_size, return result_size; } -Size TreeRenderObject::OnMeasureContent(const MeasureRequirement& requirement, - const MeasureSize& preferred_size) { +Size TreeRenderObject::OnMeasureContent(const MeasureRequirement& requirement) { auto size = MeasureTreeRenderObjectItem(requirement.max, root_item_, tab_width_); - - size = Max(size, requirement.min.GetSizeOr0()); - - return size; + return requirement.ExpandToSuggestAndCoerce(size); } static void LayoutTreeRenderObjectItem(Rect rect, TreeRenderObjectItem* item, @@ -144,7 +140,7 @@ static void LayoutTreeRenderObjectItem(Rect rect, TreeRenderObjectItem* item, float item_height = 0.f; if (render_object) { render_object->Layout(rect.GetLeftTop()); - item_height = render_object->GetDesiredSize().height; + item_height = render_object->GetMeasureResultSize().height; } rect.left += tab_width; @@ -156,7 +152,7 @@ static void LayoutTreeRenderObjectItem(Rect rect, TreeRenderObjectItem* item, LayoutTreeRenderObjectItem(rect, child, tab_width); auto child_render_object = child->GetRenderObject(); auto child_height = child_render_object - ? child_render_object->GetDesiredSize().height + ? child_render_object->GetMeasureResultSize().height : 0.f; rect.top += child_height; rect.height -= child_height; diff --git a/src/ui/style/Styler.cpp b/src/ui/style/Styler.cpp index 251d403c..b0b14c61 100644 --- a/src/ui/style/Styler.cpp +++ b/src/ui/style/Styler.cpp @@ -31,7 +31,7 @@ void CursorStyler::Apply(controls::Control* control) const { } void PreferredSizeStyler::Apply(controls::Control* control) const { - control->SetPreferredSize(size_); + control->SetSuggestSize(size_); } void MarginStyler::Apply(controls::Control* control) const { |
