wuxianshengcong/Library/PackageCache/com.unity.2d.tilemap@1.0.0/Editor/UI/GridPaintPaletteWindowSplitView.cs

122 lines
4.7 KiB
C#
Raw Normal View History

2024-12-30 12:56:27 +08:00
using UnityEngine;
using UnityEngine.UIElements;
namespace UnityEditor.Tilemaps
{
internal class GridPaintPaletteWindowSplitView : VisualElement
{
private static readonly string ussClassName = "unity-tilepalette-splitview";
private static readonly string brushesUssClassName = "unity-tilepalette-splitview-brushes";
private static readonly string splitViewDataKey = "unity-tilepalette-splitview-data";
private const float kMinSplitRatio = 0.3f;
private TwoPaneSplitView m_SplitView;
private TilePaletteElement m_PaletteElement;
private TilePaletteBrushElementToggle m_BrushElementToggle;
private float m_LastSplitRatio = kMinSplitRatio;
public TilePaletteElement paletteElement => m_PaletteElement;
public bool isVerticalOrientation
{
get
{
return m_SplitView.orientation == TwoPaneSplitViewOrientation.Vertical;
}
set
{
m_SplitView.orientation =
value ? TwoPaneSplitViewOrientation.Vertical : TwoPaneSplitViewOrientation.Horizontal;
}
}
private float fullLength => isVerticalOrientation ? layout.height : layout.width;
private bool isMinSplit => (fullLength - m_SplitView.fixedPaneDimension) <= minBottomSplitDimension;
private float minTopSplitDimension => isVerticalOrientation ? 24f : 12f;
private float minBottomSplitDimension => isVerticalOrientation ? 24f : 12f;
public void ChangeSplitDimensions(float dimension)
{
var newLength = fullLength - dimension;
var diff = newLength - m_SplitView.fixedPaneDimension;
if (m_SplitView.m_Resizer != null)
m_SplitView.m_Resizer.ApplyDelta(diff);
}
public GridPaintPaletteWindowSplitView(EditorWindow editorWindow, bool isVerticalOrientation)
{
AddToClassList(ussClassName);
name = "tilePaletteSplitView";
TilePaletteOverlayUtility.SetStyleSheet(this);
m_PaletteElement = new TilePaletteElement();
var brushesElement = new VisualElement();
brushesElement.AddToClassList(brushesUssClassName);
brushesElement.Add(new TilePaletteBrushesPopup());
brushesElement.Add(new TilePaletteBrushInspectorElement());
m_SplitView = new TwoPaneSplitView(0, -1, isVerticalOrientation ? TwoPaneSplitViewOrientation.Vertical : TwoPaneSplitViewOrientation.Horizontal);
m_SplitView.contentContainer.Add(m_PaletteElement);
m_SplitView.contentContainer.Add(brushesElement);
Add(m_SplitView);
m_SplitView.viewDataKey = splitViewDataKey;
brushesElement.RegisterCallback<GeometryChangedEvent>(OnGeometryChanged);
m_BrushElementToggle = this.Q<TilePaletteBrushElementToggle>();
m_BrushElementToggle.ToggleChanged += BrushElementToggleChanged;
m_BrushElementToggle.SetValueWithoutNotify(!isMinSplit);
}
private void BrushElementToggleChanged(bool show)
{
var dimension = minBottomSplitDimension;
if (show)
{
dimension = m_LastSplitRatio * fullLength;
if (dimension < minBottomSplitDimension)
dimension = kMinSplitRatio * fullLength;
}
ChangeSplitDimensions(dimension);
}
private void OnGeometryChanged(GeometryChangedEvent evt)
{
m_BrushElementToggle.SetValueWithoutNotify(!isMinSplit);
if (m_SplitView.fixedPaneDimension < 0f)
{
var defaultLength = fullLength * (1.0f - kMinSplitRatio);
m_SplitView.fixedPaneInitialDimension = defaultLength;
ChangeSplitDimensions(defaultLength);
}
var newDimension = fullLength - m_SplitView.fixedPaneDimension;
if (fullLength > minBottomSplitDimension)
{
// Force the palette toolbar to always be shown
if (m_SplitView.fixedPaneDimension < minTopSplitDimension)
{
ChangeSplitDimensions(fullLength - minTopSplitDimension);
}
// Force the brush toolbar to always be shown
if (newDimension < minBottomSplitDimension)
{
ChangeSplitDimensions(minBottomSplitDimension);
}
}
if (newDimension > minBottomSplitDimension)
{
var newLastSplit = Mathf.Max(newDimension, kMinSplitRatio * fullLength);
m_LastSplitRatio = newLastSplit / fullLength;
}
}
}
}