InsAsterix/InsAsterix/Library/PackageCache/com.unity.visualscripting@1.8.0/Editor/VisualScripting.Core/Windows/Sidebars/SidebarPanel.cs
2023-03-02 20:21:33 +01:00

243 satır
6,8 KiB
C#

using UnityEditor;
using UnityEngine;
namespace Unity.VisualScripting
{
public sealed class SidebarPanel
{
public SidebarPanel(ISidebarPanelContent content)
{
Ensure.That(nameof(content)).IsNotNull(content);
this.content = content;
}
[DoNotSerialize]
public Sidebars sidebars { get; set; }
[DoNotSerialize]
public Sidebar sidebar => sidebars[anchor];
[DoNotSerialize]
public bool enabled { get; private set; }
[Serialize]
private object controlHint;
[Serialize]
public float height { get; set; }
[Serialize]
public SidebarAnchor anchor { get; set; }
[Serialize]
private Vector2 scroll;
[Serialize]
public int order { get; set; }
[DoNotSerialize]
private EventWrapper e;
[DoNotSerialize]
private ISidebarPanelContent _content;
[DoNotSerialize]
public ISidebarPanelContent content
{
get => _content;
private set
{
_content = value;
controlHint = content?.sidebarControlHint;
e = new EventWrapper(controlHint);
enabled = content != null;
}
}
[DoNotSerialize]
private bool isResizing;
public bool TryAssociate(ISidebarPanelContent content)
{
if (content.sidebarControlHint == controlHint)
{
this.content = content;
return true;
}
else
{
return false;
}
}
public void Disable()
{
_content = null;
enabled = false;
}
public void OnGUI(Rect position, ref float y, float? heightOverride = null)
{
if (content == null)
{
var message = "Missing sidebar content.";
var messageType = MessageType.Warning;
var messageHeight = LudiqGUIUtility.GetHelpBoxHeight(message, messageType, position.width);
EditorGUI.HelpBox(position.VerticalSection(ref y, messageHeight), message, messageType);
return;
}
var height = heightOverride ?? this.height;
var panelPosition = new Rect
(
position.x,
y,
position.width,
height
);
var titlePosition = new Rect
(
position.x,
y,
position.width,
Styles.title.fixedHeight
);
if (e.IsRepaint)
{
Styles.title.Draw(titlePosition, content.titleContent, false, false, false, false);
}
var orderSpinnerPosition = new Rect
(
position.xMax - Styles.orderSpinnerWidth,
y,
Styles.orderSpinnerWidth,
titlePosition.height
);
sidebar.OrderSpinner(orderSpinnerPosition, this);
var anchorButtonPosition = new Rect
(
orderSpinnerPosition.x - Styles.anchorButtonWidth,
y,
Styles.anchorButtonWidth,
titlePosition.height
);
DrawAnchorButton(anchorButtonPosition);
y += titlePosition.height;
var panelContentPosition = new Rect
(
position.x,
y,
position.width,
height - titlePosition.height
);
if (e.IsRepaint)
{
Styles.background.Draw(panelContentPosition, false, false, false, false);
}
LudiqGUIUtility.BeginScrollablePanel(panelContentPosition, content.GetHeight, out var panelInnerPosition, ref scroll, new RectOffset(1, 1, 0, 0));
content.OnGUI(panelInnerPosition);
LudiqGUIUtility.EndScrollablePanel();
y += panelContentPosition.height;
if (heightOverride == null)
{
HandleResize(panelPosition);
}
}
private void DrawAnchorButton(Rect position)
{
SidebarAnchor destination;
EditorTexture icon;
switch (anchor)
{
case SidebarAnchor.Left:
destination = SidebarAnchor.Right;
icon = BoltCore.Icons.sidebarAnchorRight;
break;
case SidebarAnchor.Right:
destination = SidebarAnchor.Left;
icon = BoltCore.Icons.sidebarAnchorLeft;
break;
default:
throw new UnexpectedEnumValueException<SidebarAnchor>(anchor);
}
if (GUI.Button(position, icon?.Single(), LudiqStyles.toolbarButton))
{
anchor = destination;
}
}
private void HandleResize(Rect panelPosition)
{
var resizeArea = new Rect
(
panelPosition.x,
panelPosition.yMax - (Styles.resizeGrip / 2),
panelPosition.width - Styles.orderSpinnerWidth,
Styles.resizeGrip
);
EditorGUIUtility.AddCursorRect(resizeArea, MouseCursor.ResizeVertical);
e.HandleCapture(resizeArea.Contains(e.mousePosition), false);
if (e.IsMouseDown(MouseButton.Left) && resizeArea.Contains(e.mousePosition))
{
isResizing = true;
}
if (isResizing && e.IsMouseUp(MouseButton.Left))
{
isResizing = false;
}
if (isResizing && e.IsMouseDrag(MouseButton.Left))
{
height = e.mousePosition.y - panelPosition.y;
}
e.HandleRelease();
}
private static class Styles
{
public static readonly GUIStyle background;
public static readonly GUIStyle title;
public static readonly float resizeGrip = 14f;
public static readonly float orderSpinnerWidth = LudiqGUIUtility.scrollBarWidth;
public static readonly float anchorButtonWidth = 22;
static Styles()
{
background = ColorPalette.unityBackgroundLight.CreateBackground();
title = new GUIStyle(EditorStyles.toolbar);
title.fontSize = 11;
title.alignment = TextAnchor.MiddleLeft;
title.padding = new RectOffset(4, 4, 0, 0);
title.imagePosition = ImagePosition.ImageLeft;
title.fixedHeight = 18;
}
}
}
}