Fix editor host resize and dock splitter behavior
This commit is contained in:
@@ -49,6 +49,25 @@ inline float ClampFiniteExtent(float value, float minValue, float maxValue) {
|
||||
return (std::clamp)(value, minValue, maxValue);
|
||||
}
|
||||
|
||||
inline float ResolveOverflowPrimaryExtentFromMinimums(
|
||||
float usableExtent,
|
||||
float preferredPrimaryMinimum,
|
||||
float preferredSecondaryMinimum) {
|
||||
const float clampedUsableExtent = ClampSplitterExtent(usableExtent);
|
||||
const float primaryMinimum = ClampSplitterExtent(preferredPrimaryMinimum);
|
||||
const float secondaryMinimum = ClampSplitterExtent(preferredSecondaryMinimum);
|
||||
const float totalMinimum = primaryMinimum + secondaryMinimum;
|
||||
if (clampedUsableExtent <= 0.0f) {
|
||||
return 0.0f;
|
||||
}
|
||||
|
||||
if (totalMinimum <= 0.0f) {
|
||||
return clampedUsableExtent * 0.5f;
|
||||
}
|
||||
|
||||
return clampedUsableExtent * (primaryMinimum / totalMinimum);
|
||||
}
|
||||
|
||||
inline float GetMainExtent(const UISize& size, UILayoutAxis axis) {
|
||||
return axis == UILayoutAxis::Horizontal ? size.width : size.height;
|
||||
}
|
||||
@@ -108,8 +127,12 @@ inline float ClampSplitterRatio(
|
||||
float minimumPrimaryExtent = minPrimaryExtent;
|
||||
float maximumPrimaryExtent = usableExtent - minSecondaryExtent;
|
||||
if (minimumPrimaryExtent > maximumPrimaryExtent) {
|
||||
minimumPrimaryExtent = 0.0f;
|
||||
maximumPrimaryExtent = usableExtent;
|
||||
const float overflowPrimaryExtent =
|
||||
SplitterDetail::ResolveOverflowPrimaryExtentFromMinimums(
|
||||
usableExtent,
|
||||
options.minPrimaryExtent,
|
||||
options.minSecondaryExtent);
|
||||
return usableExtent <= 0.0f ? 0.5f : overflowPrimaryExtent / usableExtent;
|
||||
}
|
||||
|
||||
const float clampedPrimaryExtent = (std::clamp)(
|
||||
@@ -161,7 +184,20 @@ inline float ClampSplitterRatio(
|
||||
|
||||
minimumPrimaryExtent = (std::max)(minimumPrimaryExtent, minimumFromSecondary);
|
||||
maximumPrimaryExtent = (std::min)(maximumPrimaryExtent, maximumFromSecondary);
|
||||
const bool minimumsOverflow =
|
||||
SplitterDetail::ClampSplitterExtent(constraints.primaryMin) +
|
||||
SplitterDetail::ClampSplitterExtent(constraints.secondaryMin) >
|
||||
usableExtent;
|
||||
if (minimumPrimaryExtent > maximumPrimaryExtent) {
|
||||
if (minimumsOverflow) {
|
||||
const float overflowPrimaryExtent =
|
||||
SplitterDetail::ResolveOverflowPrimaryExtentFromMinimums(
|
||||
usableExtent,
|
||||
constraints.primaryMin,
|
||||
constraints.secondaryMin);
|
||||
return usableExtent <= 0.0f ? 0.5f : overflowPrimaryExtent / usableExtent;
|
||||
}
|
||||
|
||||
minimumPrimaryExtent = 0.0f;
|
||||
maximumPrimaryExtent = usableExtent;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user