aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2022-03-12 21:43:40 +0800
committercrupest <crupest@outlook.com>2022-03-12 21:43:40 +0800
commit3ce391f85443ce8bb47a7e0ff3bef0051cf4006e (patch)
tree59f8c4b4a6c66676d206bda5bfce3ff5020e4d26
parentf3b5009040a05e8efd15c385cacf5dd594ecf801 (diff)
downloadcru-3ce391f85443ce8bb47a7e0ff3bef0051cf4006e.tar.gz
cru-3ce391f85443ce8bb47a7e0ff3bef0051cf4006e.tar.bz2
cru-3ce391f85443ce8bb47a7e0ff3bef0051cf4006e.zip
...
-rw-r--r--include/cru/ui/render/BorderRenderObject.h3
-rw-r--r--include/cru/ui/render/CanvasRenderObject.h2
-rw-r--r--include/cru/ui/render/GeometryRenderObject.h3
-rw-r--r--include/cru/ui/render/RenderObject.h15
-rw-r--r--include/cru/ui/render/ScrollRenderObject.h3
-rw-r--r--include/cru/ui/render/TextRenderObject.h3
-rw-r--r--src/ui/render/BorderRenderObject.cpp8
-rw-r--r--src/ui/render/CanvasRenderObject.cpp6
-rw-r--r--src/ui/render/GeometryRenderObject.cpp4
-rw-r--r--src/ui/render/RenderObject.cpp44
-rw-r--r--src/ui/render/ScrollRenderObject.cpp10
-rw-r--r--src/ui/render/TextRenderObject.cpp12
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)
}