You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
3.4 KiB
94 lines
3.4 KiB
using System.Collections.Generic; |
|
using UnityEditor.ShaderGraph.Drawing; |
|
using UnityEngine; |
|
using UnityEngine.UIElements; |
|
|
|
namespace UnityEditor.ShaderGraph.Drawing |
|
{ |
|
class ResizableElementFactory : UxmlFactory<ResizableElement> |
|
{ } |
|
|
|
class ResizableElement : VisualElement |
|
{ |
|
Dictionary<Resizer, VisualElement> m_Resizers = new Dictionary<Resizer, VisualElement>(); |
|
|
|
List<Manipulator> m_Manipulators = new List<Manipulator>(); |
|
public ResizableElement() : this("uxml/Resizable") |
|
{ |
|
pickingMode = PickingMode.Ignore; |
|
} |
|
|
|
public ResizableElement(string uiFile) |
|
{ |
|
var tpl = Resources.Load<VisualTreeAsset>(uiFile); |
|
var sheet = Resources.Load<StyleSheet>("Resizable"); |
|
styleSheets.Add(sheet); |
|
|
|
tpl.CloneTree(this); |
|
|
|
foreach (Resizer direction in new[] { Resizer.Top, Resizer.Bottom, Resizer.Left, Resizer.Right }) |
|
{ |
|
VisualElement resizer = this.Q(direction.ToString().ToLower() + "-resize"); |
|
if (resizer != null) |
|
{ |
|
var manipulator = new ElementResizer(this, direction); |
|
resizer.AddManipulator(manipulator); |
|
m_Manipulators.Add(manipulator); |
|
} |
|
m_Resizers[direction] = resizer; |
|
} |
|
|
|
foreach (Resizer vertical in new[] { Resizer.Top, Resizer.Bottom }) |
|
foreach (Resizer horizontal in new[] { Resizer.Left, Resizer.Right }) |
|
{ |
|
VisualElement resizer = this.Q(vertical.ToString().ToLower() + "-" + horizontal.ToString().ToLower() + "-resize"); |
|
if (resizer != null) |
|
{ |
|
var manipulator = new ElementResizer(this, vertical | horizontal); |
|
resizer.AddManipulator(manipulator); |
|
m_Manipulators.Add(manipulator); |
|
} |
|
m_Resizers[vertical | horizontal] = resizer; |
|
} |
|
} |
|
|
|
public void SetResizeRules(Resizer allowedResizeDirections) |
|
{ |
|
foreach (var manipulator in m_Manipulators) |
|
{ |
|
if (manipulator == null) |
|
return; |
|
var resizeElement = manipulator as ElementResizer; |
|
// If resizer direction is not in list of allowed directions, disable the callbacks on it |
|
if ((resizeElement.direction & allowedResizeDirections) == 0) |
|
{ |
|
resizeElement.isEnabled = false; |
|
} |
|
else if ((resizeElement.direction & allowedResizeDirections) != 0) |
|
{ |
|
resizeElement.isEnabled = true; |
|
} |
|
} |
|
} |
|
|
|
public enum Resizer |
|
{ |
|
None = 0, |
|
Top = 1 << 0, |
|
Bottom = 1 << 1, |
|
Left = 1 << 2, |
|
Right = 1 << 3, |
|
} |
|
|
|
// Lets visual element owners bind a callback to when any resize operation is completed |
|
public void BindOnResizeCallback(EventCallback<MouseUpEvent> mouseUpEvent) |
|
{ |
|
foreach (var manipulator in m_Manipulators) |
|
{ |
|
if (manipulator == null) |
|
return; |
|
manipulator.target.RegisterCallback(mouseUpEvent); |
|
} |
|
} |
|
} |
|
}
|
|
|