using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; using Robust.Shared.Input; namespace Content.Client.UserInterface.Controls; /// /// A split container that performs an action when the split resizing is finished. /// public sealed class RecordedSplitContainer : SplitContainer { public Action? OnSplitResizeFinish; public double? DesiredSplitCenter; protected override Vector2 ArrangeOverride(Vector2 finalSize) { if (ResizeMode == SplitResizeMode.RespectChildrenMinSize && DesiredSplitCenter != null) { var secondMin = GetChild(1).DesiredSize; double minSize = Orientation == SplitOrientation.Vertical ? secondMin.Y : secondMin.X; double finalSizeComponent = Orientation == SplitOrientation.Vertical ? finalSize.Y : finalSize.X; var firstTotalFractional = (finalSizeComponent - minSize - SplitWidth - SplitEdgeSeparation) / finalSizeComponent; DesiredSplitCenter = Math.Round(DesiredSplitCenter.Value, 2, MidpointRounding.ToZero); // total space the split center takes up must fit the available space percentage given to the first child var canFirstFit = DesiredSplitCenter <= firstTotalFractional; if (DesiredSplitCenter > 1 || DesiredSplitCenter < 0 || !canFirstFit) { DesiredSplitCenter = Math.Round(firstTotalFractional, 2, MidpointRounding.ToZero); } // don't need anything more than two digits of precision for this var currentSplitFraction = Math.Round(SplitFraction, 2, MidpointRounding.ToZero); // brute force it if (currentSplitFraction != DesiredSplitCenter.Value) { SplitFraction = (float) DesiredSplitCenter.Value; } else { DesiredSplitCenter = null; } } return base.ArrangeOverride(finalSize); } protected override void KeyBindUp(GUIBoundKeyEventArgs args) { base.KeyBindUp(args); if (args.Function != EngineKeyFunctions.UIClick) { return; } if (ChildCount != 2) { return; } var first = GetChild(0); var second = GetChild(1); OnSplitResizeFinish?.Invoke(first.Size, second.Size); } }