diff options
-rw-r--r-- | CruUI/ui/control.cpp | 45 | ||||
-rw-r--r-- | CruUI/ui/layout_base.h | 16 |
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; |