diff options
Diffstat (limited to 'src/ui')
-rw-r--r-- | src/ui/render/BorderRenderObject.cpp | 8 | ||||
-rw-r--r-- | src/ui/render/CanvasRenderObject.cpp | 6 | ||||
-rw-r--r-- | src/ui/render/GeometryRenderObject.cpp | 4 | ||||
-rw-r--r-- | src/ui/render/RenderObject.cpp | 44 | ||||
-rw-r--r-- | src/ui/render/ScrollRenderObject.cpp | 10 | ||||
-rw-r--r-- | src/ui/render/TextRenderObject.cpp | 12 |
6 files changed, 75 insertions, 9 deletions
diff --git a/src/ui/render/BorderRenderObject.cpp b/src/ui/render/BorderRenderObject.cpp index 8e93e205..1392af1e 100644 --- a/src/ui/render/BorderRenderObject.cpp +++ b/src/ui/render/BorderRenderObject.cpp @@ -6,6 +6,7 @@ #include "cru/platform/graphics/Geometry.h" #include "cru/platform/graphics/Painter.h" #include "cru/ui/DebugFlags.h" +#include "cru/ui/render/RenderObject.h" #include <algorithm> @@ -122,6 +123,13 @@ Size BorderRenderObject::OnMeasureContent(const MeasureRequirement& requirement, } } +Size BorderRenderObject::OnMeasureContent1(const BoxConstraint& constraint) { + auto child = GetChild(); + if (child == nullptr) return constraint.min; + auto child_size = child->Measure1(BoxConstraint::kNotLimit); + return constraint.Coerce(child_size); +} + void BorderRenderObject::OnLayoutContent(const Rect& content_rect) { if (auto child = GetChild()) { child->Layout(content_rect.GetLeftTop()); diff --git a/src/ui/render/CanvasRenderObject.cpp b/src/ui/render/CanvasRenderObject.cpp index 431b8f56..e0f1726b 100644 --- a/src/ui/render/CanvasRenderObject.cpp +++ b/src/ui/render/CanvasRenderObject.cpp @@ -1,7 +1,7 @@ #include "cru/ui/render/CanvasRenderObject.h" namespace cru::ui::render { -CanvasRenderObject::CanvasRenderObject() {} +CanvasRenderObject::CanvasRenderObject() {} CanvasRenderObject::~CanvasRenderObject() = default; @@ -22,6 +22,10 @@ Size CanvasRenderObject::OnMeasureContent(const MeasureRequirement& requirement, preferred_size.height.GetLengthOr(100)}); } +Size CanvasRenderObject::OnMeasureContent1(const BoxConstraint& constraint) { + return constraint.Coerce(Size{100, 100}); +} + void CanvasRenderObject::OnLayoutContent(const Rect& content_rect) { CRU_UNUSED(content_rect) } diff --git a/src/ui/render/GeometryRenderObject.cpp b/src/ui/render/GeometryRenderObject.cpp index ea9b6e11..07c5b911 100644 --- a/src/ui/render/GeometryRenderObject.cpp +++ b/src/ui/render/GeometryRenderObject.cpp @@ -106,5 +106,9 @@ Size GeometryRenderObject::OnMeasureContent( return requirement.Coerce(result); } +Size GeometryRenderObject::OnMeasureContent1(const BoxConstraint& constraint) { + return constraint.Coerce(GetViewPort().GetSize()); +} + void GeometryRenderObject::OnLayoutContent(const Rect& content_rect) {} } // namespace cru::ui::render diff --git a/src/ui/render/RenderObject.cpp b/src/ui/render/RenderObject.cpp index 8904f0dc..a370f749 100644 --- a/src/ui/render/RenderObject.cpp +++ b/src/ui/render/RenderObject.cpp @@ -84,6 +84,32 @@ void RenderObject::SetMaxSize1(const Size& max_size) { InvalidateLayout(); } +BoxConstraint RenderObject::CalculateMergedConstraint( + const BoxConstraint& constraint) const { + auto result = constraint; + if (max_size_.width >= constraint.min.width && + max_size_.width < constraint.max.width) { + result.max.width = max_size_.width; + } + + if (max_size_.height >= constraint.min.height && + max_size_.height < constraint.max.height) { + result.max.height = max_size_.height; + } + + if (min_size_.width <= constraint.max.width && + min_size_.width > constraint.min.width) { + result.min.width = min_size_.width; + } + + if (min_size_.height <= constraint.max.height && + min_size_.height > constraint.min.height) { + result.min.height = min_size_.height; + } + + return result; +} + void RenderObject::Measure(const MeasureRequirement& requirement, const MeasureSize& preferred_size) { MeasureRequirement merged_requirement = @@ -109,9 +135,11 @@ void RenderObject::Measure(const MeasureRequirement& requirement, Ensures(desired_size_.height >= 0); } -void RenderObject::Measure1(const BoxConstraint& constraint) { +Size RenderObject::Measure1(const BoxConstraint& constraint) { Expects(constraint.Validate()); desired_size_ = OnMeasureCore1(constraint); + Ensures(constraint.Satisfy(desired_size_)); + return desired_size_; } void RenderObject::Layout(const Point& offset) { @@ -156,24 +184,26 @@ Size RenderObject::OnMeasureCore(const MeasureRequirement& requirement, } Size RenderObject::OnMeasureCore1(const BoxConstraint& constraint) { + auto merged_constraint = CalculateMergedConstraint(constraint); + const Thickness outer_space = GetTotalSpaceThickness(); Size space_size{outer_space.GetHorizontalTotal(), outer_space.GetVerticalTotal()}; - if (space_size.width > constraint.max.width) { - space_size.width = constraint.max.width; + if (space_size.width > merged_constraint.max.width) { + space_size.width = merged_constraint.max.width; CRU_LOG_WARN(u"{} space width is over constraint.max.width", this->GetDebugPathInTree()); } - if (space_size.height > constraint.max.height) { - space_size.height = constraint.max.height; + if (space_size.height > merged_constraint.max.height) { + space_size.height = merged_constraint.max.height; CRU_LOG_WARN(u"{} space height is over constraint.max.height", this->GetDebugPathInTree()); } - BoxConstraint content_constraint{constraint.max - space_size, - constraint.min - space_size}; + BoxConstraint content_constraint{merged_constraint.max - space_size, + merged_constraint.min - space_size}; const auto content_size = OnMeasureContent1(content_constraint); diff --git a/src/ui/render/ScrollRenderObject.cpp b/src/ui/render/ScrollRenderObject.cpp index 03bb1a2d..b8b6904d 100644 --- a/src/ui/render/ScrollRenderObject.cpp +++ b/src/ui/render/ScrollRenderObject.cpp @@ -2,6 +2,7 @@ #include "cru/platform/graphics/Painter.h" #include "cru/ui/controls/Control.h" +#include "cru/ui/render/RenderObject.h" #include "cru/ui/render/ScrollBar.h" #include <algorithm> @@ -185,7 +186,14 @@ Size ScrollRenderObject::OnMeasureContent(const MeasureRequirement& requirement, : requirement.min.height.GetLengthOr0()}; return result; } -} // namespace cru::ui::render +} + +Size ScrollRenderObject::OnMeasureContent1(const BoxConstraint& constraint) { + auto child = GetChild(); + if (child == nullptr) return constraint.min; + auto child_size = child->Measure1(BoxConstraint::kNotLimit); + return constraint.Coerce(child_size); +} void ScrollRenderObject::OnLayoutContent(const Rect& content_rect) { if (auto child = GetChild()) { diff --git a/src/ui/render/TextRenderObject.cpp b/src/ui/render/TextRenderObject.cpp index 0b9009c5..11548106 100644 --- a/src/ui/render/TextRenderObject.cpp +++ b/src/ui/render/TextRenderObject.cpp @@ -6,6 +6,7 @@ #include "cru/platform/graphics/Painter.h" #include "cru/platform/graphics/TextLayout.h" #include "cru/ui/DebugFlags.h" +#include "cru/ui/render/RenderObject.h" #include <algorithm> #include <limits> @@ -226,6 +227,17 @@ Size TextRenderObject::OnMeasureContent(const MeasureRequirement& requirement, return result; } +Size TextRenderObject::OnMeasureContent1(const BoxConstraint& constraint) { + text_layout_->SetMaxWidth(constraint.max.width); + text_layout_->SetMaxHeight(std::numeric_limits<float>::max()); + + const Size text_size( + text_layout_->GetTextBounds(is_measure_including_trailing_space_) + .GetRightBottom()); + + return constraint.Coerce(text_size); +} + void TextRenderObject::OnLayoutContent(const Rect& content_rect) { CRU_UNUSED(content_rect) } |