A game about forced loneliness, made by TACStudios
at master 4.5 kB view raw
1using UnityEngine; 2using UnityEngine.UIElements; 3 4namespace UnityEditor.Tilemaps 5{ 6 internal class GridPaintPaletteWindowSplitView : VisualElement 7 { 8 private static readonly string ussClassName = "unity-tilepalette-splitview"; 9 private static readonly string splitViewDataKey = "unity-tilepalette-splitview-data"; 10 11 private const float kMinSplitRatio = 0.3f; 12 13 private TwoPaneSplitView m_SplitView; 14 private TilePaletteElement m_PaletteElement; 15 private TilePaletteBrushElementToggle m_BrushElementToggle; 16 private float m_LastSplitRatio = kMinSplitRatio; 17 18 public TilePaletteElement paletteElement => m_PaletteElement; 19 20 public bool isVerticalOrientation 21 { 22 get 23 { 24 return m_SplitView.orientation == TwoPaneSplitViewOrientation.Vertical; 25 } 26 set 27 { 28 m_SplitView.orientation = 29 value ? TwoPaneSplitViewOrientation.Vertical : TwoPaneSplitViewOrientation.Horizontal; 30 } 31 } 32 33 private float fullLength => isVerticalOrientation ? layout.height : layout.width; 34 35 private bool isMinSplit => (fullLength - m_SplitView.fixedPaneDimension) <= minBottomSplitDimension; 36 37 private float minTopSplitDimension => isVerticalOrientation ? 24f : 12f; 38 private float minBottomSplitDimension => isVerticalOrientation ? 24f : 12f; 39 40 public void ChangeSplitDimensions(float dimension) 41 { 42 var newLength = fullLength - dimension; 43 var diff = newLength - m_SplitView.fixedPaneDimension; 44 if (m_SplitView.m_Resizer != null) 45 m_SplitView.m_Resizer.ApplyDelta(diff); 46 } 47 48 public GridPaintPaletteWindowSplitView(bool isVerticalOrientation) 49 { 50 AddToClassList(ussClassName); 51 52 name = "tilePaletteSplitView"; 53 TilePaletteOverlayUtility.SetStyleSheet(this); 54 55 m_PaletteElement = new TilePaletteElement(); 56 57 var brushesElement = new TilePaletteBrushModalElement(); 58 m_SplitView = new TwoPaneSplitView(0, -1, isVerticalOrientation ? TwoPaneSplitViewOrientation.Vertical : TwoPaneSplitViewOrientation.Horizontal); 59 m_SplitView.contentContainer.Add(m_PaletteElement); 60 m_SplitView.contentContainer.Add(brushesElement); 61 Add(m_SplitView); 62 63 m_SplitView.viewDataKey = splitViewDataKey; 64 65 brushesElement.RegisterCallback<GeometryChangedEvent>(OnGeometryChanged); 66 67 m_BrushElementToggle = this.Q<TilePaletteBrushElementToggle>(); 68 m_BrushElementToggle.ToggleChanged += BrushElementToggleChanged; 69 m_BrushElementToggle.SetValueWithoutNotify(!isMinSplit); 70 } 71 72 private void BrushElementToggleChanged(bool show) 73 { 74 var dimension = minBottomSplitDimension; 75 if (show) 76 { 77 dimension = m_LastSplitRatio * fullLength; 78 if (dimension < minBottomSplitDimension) 79 dimension = kMinSplitRatio * fullLength; 80 } 81 ChangeSplitDimensions(dimension); 82 } 83 84 private void OnGeometryChanged(GeometryChangedEvent evt) 85 { 86 m_BrushElementToggle.SetValueWithoutNotify(!isMinSplit); 87 88 if (m_SplitView.fixedPaneDimension < 0f) 89 { 90 var defaultLength = fullLength * (1.0f - kMinSplitRatio); 91 m_SplitView.fixedPaneInitialDimension = defaultLength; 92 ChangeSplitDimensions(defaultLength); 93 } 94 95 var newDimension = fullLength - m_SplitView.fixedPaneDimension; 96 if (fullLength > minBottomSplitDimension) 97 { 98 // Force the palette toolbar to always be shown 99 if (m_SplitView.fixedPaneDimension < minTopSplitDimension) 100 { 101 ChangeSplitDimensions(fullLength - minTopSplitDimension); 102 } 103 // Force the brush toolbar to always be shown 104 if (newDimension < minBottomSplitDimension) 105 { 106 ChangeSplitDimensions(minBottomSplitDimension); 107 } 108 } 109 if (newDimension > minBottomSplitDimension) 110 { 111 var newLastSplit = Mathf.Max(newDimension, kMinSplitRatio * fullLength); 112 m_LastSplitRatio = newLastSplit / fullLength; 113 } 114 } 115 } 116}