diff options
author | crupest <crupest@outlook.com> | 2022-03-12 21:43:40 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2022-03-12 21:43:40 +0800 |
commit | 3ce391f85443ce8bb47a7e0ff3bef0051cf4006e (patch) | |
tree | 59f8c4b4a6c66676d206bda5bfce3ff5020e4d26 | |
parent | f3b5009040a05e8efd15c385cacf5dd594ecf801 (diff) | |
download | cru-3ce391f85443ce8bb47a7e0ff3bef0051cf4006e.tar.gz cru-3ce391f85443ce8bb47a7e0ff3bef0051cf4006e.tar.bz2 cru-3ce391f85443ce8bb47a7e0ff3bef0051cf4006e.zip |
...
-rw-r--r-- | include/cru/ui/render/BorderRenderObject.h | 3 | ||||
-rw-r--r-- | include/cru/ui/render/CanvasRenderObject.h | 2 | ||||
-rw-r--r-- | include/cru/ui/render/GeometryRenderObject.h | 3 | ||||
-rw-r--r-- | include/cru/ui/render/RenderObject.h | 15 | ||||
-rw-r--r-- | include/cru/ui/render/ScrollRenderObject.h | 3 | ||||
-rw-r--r-- | include/cru/ui/render/TextRenderObject.h | 3 | ||||
-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 |
12 files changed, 102 insertions, 11 deletions
diff --git a/include/cru/ui/render/BorderRenderObject.h b/include/cru/ui/render/BorderRenderObject.h index 8de0eea3..9f3cff4a 100644 --- a/include/cru/ui/render/BorderRenderObject.h +++ b/include/cru/ui/render/BorderRenderObject.h @@ -2,6 +2,7 @@ #include "SingleChildRenderObject.h" #include "../style/ApplyBorderStyleInfo.h" +#include "cru/ui/render/RenderObject.h" namespace cru::ui::render { class CRU_UI_API BorderRenderObject : public SingleChildRenderObject { @@ -56,6 +57,8 @@ class CRU_UI_API BorderRenderObject : public SingleChildRenderObject { const MeasureSize& preferred_size) override; void OnLayoutContent(const Rect& content_rect) override; + Size OnMeasureContent1(const BoxConstraint& constraint) override; + void OnResize(const Size& new_size) override; private: diff --git a/include/cru/ui/render/CanvasRenderObject.h b/include/cru/ui/render/CanvasRenderObject.h index 2488dc91..f498c5ae 100644 --- a/include/cru/ui/render/CanvasRenderObject.h +++ b/include/cru/ui/render/CanvasRenderObject.h @@ -47,6 +47,8 @@ class CRU_UI_API CanvasRenderObject : public RenderObject { const MeasureSize& preferred_size) override; void OnLayoutContent(const Rect& content_rect) override; + Size OnMeasureContent1(const BoxConstraint& constraint) override; + private: Size desired_size_{}; diff --git a/include/cru/ui/render/GeometryRenderObject.h b/include/cru/ui/render/GeometryRenderObject.h index 6c5702ae..5d2ba1e0 100644 --- a/include/cru/ui/render/GeometryRenderObject.h +++ b/include/cru/ui/render/GeometryRenderObject.h @@ -2,6 +2,7 @@ #include "RenderObject.h" #include "cru/platform/graphics/Brush.h" #include "cru/platform/graphics/Geometry.h" +#include "cru/ui/render/MeasureRequirement.h" #include <optional> @@ -40,6 +41,8 @@ class GeometryRenderObject : public RenderObject { const MeasureSize& preferred_size) override; void OnLayoutContent(const Rect& content_rect) override; + Size OnMeasureContent1(const BoxConstraint& constraint) override; + private: std::shared_ptr<platform::graphics::IGeometry> geometry_ = nullptr; Rect view_port_{}; diff --git a/include/cru/ui/render/RenderObject.h b/include/cru/ui/render/RenderObject.h index 134fb935..8a0ba511 100644 --- a/include/cru/ui/render/RenderObject.h +++ b/include/cru/ui/render/RenderObject.h @@ -15,6 +15,16 @@ struct BoxConstraint { return max.width >= min.width && max.height >= min.height && min.width >= 0 && min.height >= 0; } + + constexpr bool Satisfy(const Size& size) const { + return size.width <= max.width && size.height <= max.height && + size.width >= min.width && size.height >= min.height; + } + + constexpr Size Coerce(const Size& size) const { + return Size{std::min(std::max(size.width, min.width), max.width), + std::min(std::max(size.height, min.height), max.height)}; + } }; /** @@ -96,9 +106,10 @@ class CRU_UI_API RenderObject : public Object { Size GetMinSize1() const { return min_size_; } void SetMinSize1(const Size& min_size); - Size GetMaxSize1() const { return max_size_; } void SetMaxSize1(const Size& max_size); + BoxConstraint CalculateMergedConstraint( + const BoxConstraint& constraint) const; // This method will merge requirement passed by argument and requirement of // the render object using MeasureRequirement::Merge and then call @@ -112,7 +123,7 @@ class CRU_UI_API RenderObject : public Object { // This will set offset of this render object and call OnLayoutCore. void Layout(const Point& offset); - void Measure1(const BoxConstraint& constraint); + Size Measure1(const BoxConstraint& constraint); virtual Thickness GetTotalSpaceThickness() const; virtual Thickness GetInnerSpaceThickness() const; diff --git a/include/cru/ui/render/ScrollRenderObject.h b/include/cru/ui/render/ScrollRenderObject.h index 53c64c6c..44656942 100644 --- a/include/cru/ui/render/ScrollRenderObject.h +++ b/include/cru/ui/render/ScrollRenderObject.h @@ -3,6 +3,7 @@ #include "ScrollBar.h" #include "cru/common/Event.h" +#include "cru/ui/render/RenderObject.h" #include <memory> #include <optional> @@ -80,6 +81,8 @@ class CRU_UI_API ScrollRenderObject : public SingleChildRenderObject { const MeasureSize& preferred_size) override; void OnLayoutContent(const Rect& content_rect) override; + Size OnMeasureContent1(const BoxConstraint& constraint) override; + void OnAttachedControlChanged(controls::Control* old_control, controls::Control* new_control) override; diff --git a/include/cru/ui/render/TextRenderObject.h b/include/cru/ui/render/TextRenderObject.h index 16aff29d..f12ac72f 100644 --- a/include/cru/ui/render/TextRenderObject.h +++ b/include/cru/ui/render/TextRenderObject.h @@ -101,6 +101,9 @@ class CRU_UI_API TextRenderObject : public RenderObject { // See remarks of this class. Size OnMeasureContent(const MeasureRequirement& requirement, const MeasureSize& preferred_size) override; + + Size OnMeasureContent1(const BoxConstraint& constraint) override; + void OnLayoutContent(const Rect& content_rect) override; private: 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) } |