aboutsummaryrefslogtreecommitdiff
path: root/src/ui/controls/margin_container.cpp
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2018-10-02 01:09:35 +0800
committercrupest <crupest@outlook.com>2018-10-02 01:09:35 +0800
commit040a6c18f18100b825a56443a73aa1de64e4518c (patch)
treea271bddb244fa2041f14f8d46d249457cee09e5f /src/ui/controls/margin_container.cpp
parenta3b78397f71c35e51681104b572de06a1780e4ee (diff)
downloadcru-040a6c18f18100b825a56443a73aa1de64e4518c.tar.gz
cru-040a6c18f18100b825a56443a73aa1de64e4518c.tar.bz2
cru-040a6c18f18100b825a56443a73aa1de64e4518c.zip
Make text box use border delegate. Fix layout bug in margin container.
Diffstat (limited to 'src/ui/controls/margin_container.cpp')
-rw-r--r--src/ui/controls/margin_container.cpp63
1 files changed, 2 insertions, 61 deletions
diff --git a/src/ui/controls/margin_container.cpp b/src/ui/controls/margin_container.cpp
index 26acb172..12dde025 100644
--- a/src/ui/controls/margin_container.cpp
+++ b/src/ui/controls/margin_container.cpp
@@ -25,70 +25,11 @@ namespace cru::ui::controls
Size MarginContainer::OnMeasure(const Size& available_size)
{
- const auto layout_params = GetLayoutParams();
-
- if (!layout_params->Validate())
- throw std::runtime_error("LayoutParams is not valid. Please check it.");
-
- auto&& get_available_length_for_child = [](const LayoutSideParams& layout_length, const float available_length) -> float
- {
- switch (layout_length.mode)
- {
- case MeasureMode::Exactly:
- {
- return std::min(layout_length.length, available_length);
- }
- case MeasureMode::Stretch:
- case MeasureMode::Content:
- {
- return available_length;
- }
- default:
- UnreachableCode();
- }
- };
-
- const Size size_for_children(get_available_length_for_child(layout_params->width, available_size.width),
- get_available_length_for_child(layout_params->height, available_size.height));
-
- const auto margin_size = Size(margin_.left + margin_.right, margin_.top + margin_.bottom);
- const auto coerced_size_for_children = AtLeast0(size_for_children - margin_size);
-
- auto max_child_size = Size::Zero();
- ForeachChild([coerced_size_for_children, &max_child_size](Control* control)
- {
- control->Measure(coerced_size_for_children);
- const auto&& size = control->GetDesiredSize();
- if (max_child_size.width < size.width)
- max_child_size.width = size.width;
- if (max_child_size.height < size.height)
- max_child_size.height = size.height;
- });
-
- auto&& calculate_final_length = [](const LayoutSideParams& layout_length, const float length_for_children, const float max_child_length) -> float
- {
- switch (layout_length.mode)
- {
- case MeasureMode::Exactly:
- case MeasureMode::Stretch:
- return length_for_children;
- case MeasureMode::Content:
- return max_child_length;
- default:
- UnreachableCode();
- }
- };
-
- return Size(
- calculate_final_length(layout_params->width, coerced_size_for_children.width, max_child_size.width),
- calculate_final_length(layout_params->height, coerced_size_for_children.height, max_child_size.height)
- );
+ return DefaultMeasureWithPadding(available_size, margin_);
}
void MarginContainer::OnLayout(const Rect& rect)
{
- const auto anchor = Point(margin_.left, margin_.top);
- const auto margin_size = Size(margin_.left + margin_.right, margin_.top + margin_.bottom);
- Control::OnLayout(Rect(anchor, AtLeast0(rect.GetSize() - margin_size)));
+ DefaultLayoutWithPadding(rect, margin_);
}
}