A game about forced loneliness, made by TACStudios
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}