aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CruUI/ui/control.cpp45
-rw-r--r--CruUI/ui/layout_base.h16
2 files changed, 49 insertions, 12 deletions
diff --git a/CruUI/ui/control.cpp b/CruUI/ui/control.cpp
index 32edc0cc..db409e34 100644
--- a/CruUI/ui/control.cpp
+++ b/CruUI/ui/control.cpp
@@ -386,35 +386,58 @@ namespace cru {
::OutputDebugStringW(L"LayoutParams is not valid.");
#endif
- auto&& f = [&](
+ auto&& f = [](
const MeasureLength& layout_length,
const float available_length,
const std::optional<float> max_length,
const std::optional<float> min_length
) -> float
{
- float length;
switch (layout_length.mode)
{
case MeasureMode::Exactly:
{
- length = std::maxlayout_length.length;
- break;
+ auto length = layout_length.length;
+ if (min_length.has_value())
+ length = std::max(min_length.value(), length);
+ if (max_length.has_value())
+ length = std::min(max_length.value(), length);
+ if (available_length < length)
+ {
+ length = available_length;
+ ::OutputDebugStringW(L"Available length is not enough");
+ }
+ return length;
}
case MeasureMode::Stretch:
case MeasureMode::Content:
- return available_length;
+ {
+ auto length = available_length;
+ if (min_length.has_value() && min_length.value() > length)
+ ::OutputDebugStringW(L"Min length is less than available length.");
+ if (max_length.has_value())
+ length = std::min(max_length.value(), length);
+ return length;
+ }
default:
- return 0.0f;
+ throw std::logic_error("Unreachable code.");
}
- if (max_length.has_value())
- length = std::min(max_length.value(), length);
-
};
Size size_for_children;
- size_for_children.width = f(layout_params->size.width, available_size.width);
- size_for_children.height = f(layout_params->size.height, available_size.height);
+ size_for_children.width = f(layout_params->size.width, available_size.width, layout_params->max_size.width, layout_params->min_size.width);
+ size_for_children.height = f(layout_params->size.height, available_size.height, layout_params->max_size.height, layout_params->min_size.height);;
+
+ auto max_child_size = Size::zero;
+ ForeachChild([&](Control* control)
+ {
+ control->Measure(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;
+ });
//TODO!
diff --git a/CruUI/ui/layout_base.h b/CruUI/ui/layout_base.h
index 9bbbc9fd..409c2875 100644
--- a/CruUI/ui/layout_base.h
+++ b/CruUI/ui/layout_base.h
@@ -85,7 +85,21 @@ namespace cru
bool Validate() const
{
- return size.Validate() && max_size.Validate() && min_size.Validate();
+ if (!(size.Validate() && max_size.Validate() && min_size.Validate()))
+ return false;
+
+ auto&& f = [](const std::optional<float> max_length, const std::optional<float> min_length) -> bool
+ {
+ return max_length.has_value() && min_length.has_value() && max_length.value() < min_length.value();
+ };
+
+ if (!f(max_size.width, min_size.width))
+ return false;
+
+ if (!f(max_size.height, min_size.height))
+ return false;
+
+ return true;
}
MeasureSize size;