Fix editor host resize and dock splitter behavior

This commit is contained in:
2026-04-14 03:34:31 +08:00
parent ba91e0f5dd
commit 72d09a1c49
10 changed files with 639 additions and 115 deletions

View File

@@ -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;
}