aboutsummaryrefslogtreecommitdiff
path: root/src/ui/render/BorderRenderObject.cpp
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2020-06-25 23:44:43 +0800
committercrupest <crupest@outlook.com>2020-06-25 23:44:43 +0800
commita48ff30f9d4ac8ae6cc9adef4a07f8d9beb69e7a (patch)
tree077a74943214da7627cca2ba9966d90d5bed144a /src/ui/render/BorderRenderObject.cpp
parentce0ae2c3727f83f1943d528b006eec94ad80ece9 (diff)
downloadcru-a48ff30f9d4ac8ae6cc9adef4a07f8d9beb69e7a.tar.gz
cru-a48ff30f9d4ac8ae6cc9adef4a07f8d9beb69e7a.tar.bz2
cru-a48ff30f9d4ac8ae6cc9adef4a07f8d9beb69e7a.zip
Write layout logic at half way.
Diffstat (limited to 'src/ui/render/BorderRenderObject.cpp')
-rw-r--r--src/ui/render/BorderRenderObject.cpp68
1 files changed, 43 insertions, 25 deletions
diff --git a/src/ui/render/BorderRenderObject.cpp b/src/ui/render/BorderRenderObject.cpp
index ad0c6455..74e50561 100644
--- a/src/ui/render/BorderRenderObject.cpp
+++ b/src/ui/render/BorderRenderObject.cpp
@@ -73,9 +73,10 @@ RenderObject* BorderRenderObject::HitTest(const Point& point) {
}
}
-Size BorderRenderObject::OnMeasureCore(const MeasureRequirement& requirement) {
+Size BorderRenderObject::OnMeasureCore(const MeasureRequirement& requirement,
+ const MeasureSize& preferred_size) {
if (!is_border_enabled_) {
- return RenderObject::OnMeasureCore(requirement);
+ return RenderObject::OnMeasureCore(requirement, preferred_size);
}
const auto margin = GetMargin();
@@ -90,36 +91,51 @@ Size BorderRenderObject::OnMeasureCore(const MeasureRequirement& requirement) {
MeasureRequirement content_requirement = requirement;
- if (!requirement.max_width.IsNotSpecify()) {
- const auto max_width = requirement.max_width.GetLength();
+ if (!requirement.max.width.IsNotSpecified()) {
+ const auto max_width = requirement.max.width.GetLengthOrMax();
if (coerced_space_size.width > max_width) {
log::Warn(
- "Measure: horizontal length of padding and margin is bigger than "
- "available length.");
+ "BorderRenderObject: During measure, horizontal length of padding, "
+ "border and margin is bigger than required max length.");
coerced_space_size.width = max_width;
}
- content_requirement.max_width = max_width - coerced_space_size.width;
+ content_requirement.max.width = max_width - coerced_space_size.width;
}
- if (!requirement.max_height.IsNotSpecify()) {
- const auto max_height = requirement.max_height.GetLength();
+ if (!requirement.min.width.IsNotSpecified()) {
+ const auto min_width = requirement.min.width.GetLengthOr0();
+ content_requirement.min.width = std::max(0.f, min_width - space_size.width);
+ }
+
+ if (!requirement.max.height.IsNotSpecified()) {
+ const auto max_height = requirement.max.height.GetLengthOrMax();
if (coerced_space_size.height > max_height) {
log::Warn(
- "Measure: horizontal length of padding and margin is bigger than "
- "available length.");
+ "BorderRenderObject: During measure, vertical length of padding, "
+ "border and margin is bigger than required max length.");
coerced_space_size.height = max_height;
}
- content_requirement.max_height = max_height - coerced_space_size.height;
+ content_requirement.max.height = max_height - coerced_space_size.height;
}
- const auto content_size = OnMeasureContent(content_requirement);
+ if (!requirement.min.height.IsNotSpecified()) {
+ const auto min_height = requirement.min.height.GetLengthOr0();
+ content_requirement.min.height =
+ std::max(0.f, min_height - space_size.height);
+ }
+
+ MeasureSize content_preferred_size =
+ content_requirement.Coerce(preferred_size.Minus(space_size));
+
+ const auto content_size =
+ OnMeasureContent(content_requirement, content_preferred_size);
return coerced_space_size + content_size;
-} // namespace cru::ui::render
+}
-void BorderRenderObject::OnLayoutCore(const Size& size) {
+void BorderRenderObject::OnLayoutCore() {
if (!is_border_enabled_) {
- return RenderObject::OnLayoutCore(size);
+ return RenderObject::OnLayoutCore();
}
const auto margin = GetMargin();
@@ -129,18 +145,20 @@ void BorderRenderObject::OnLayoutCore(const Size& size) {
margin.GetVerticalTotal() + padding.GetVerticalTotal() +
border_thickness_.GetVerticalTotal()};
+ const auto size = GetSize();
+
auto content_size = size - space_size;
if (content_size.width < 0) {
log::Warn(
- "Layout: horizontal length of padding, border and margin is bigger "
- "than available length.");
+ "BorderRenderObject: During layout, horizontal length of padding, "
+ "border and margin is bigger than available length.");
content_size.width = 0;
}
if (content_size.height < 0) {
log::Warn(
- "Layout: vertical length of padding, border and margin is bigger "
- "than available length.");
+ "BorderRenderObject: During layout, vertical length of padding, "
+ "border and margin is bigger than available length.");
content_size.height = 0;
}
@@ -158,12 +176,12 @@ void BorderRenderObject::OnLayoutCore(const Size& size) {
OnLayoutContent(content_rect);
}
-Size BorderRenderObject::OnMeasureContent(
- const MeasureRequirement& requirement) {
+Size BorderRenderObject::OnMeasureContent(const MeasureRequirement& requirement,
+ const MeasureSize& preferred_size) {
const auto child = GetSingleChild();
if (child) {
- child->Measure(requirement);
- return child->GetMeasuredSize();
+ child->Measure(requirement, preferred_size);
+ return child->GetSize();
} else {
return Size{};
}
@@ -172,7 +190,7 @@ Size BorderRenderObject::OnMeasureContent(
void BorderRenderObject::OnLayoutContent(const Rect& content_rect) {
const auto child = GetSingleChild();
if (child) {
- child->Layout(content_rect);
+ child->Layout(content_rect.GetLeftTop());
}
}