110 lines
3.3 KiB
C#
110 lines
3.3 KiB
C#
|
|
using System;
|
|||
|
|
|
|||
|
|
using UnityEngine;
|
|||
|
|
|
|||
|
|
namespace Unity.PlasticSCM.Editor.UI.Tree
|
|||
|
|
{
|
|||
|
|
internal class EmptyStateData
|
|||
|
|
{
|
|||
|
|
internal Rect Rect { get { return mLastValidRect; } }
|
|||
|
|
internal GUIContent Content { get { return mContent; } }
|
|||
|
|
|
|||
|
|
internal bool IsEmpty()
|
|||
|
|
{
|
|||
|
|
return string.IsNullOrEmpty(mContent.text);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
internal void Update(string contentText, Rect rect, EventType eventType, Action repaint)
|
|||
|
|
{
|
|||
|
|
UpdateText(contentText);
|
|||
|
|
|
|||
|
|
UpdateValidRect(rect, eventType, repaint);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
internal void UpdateText(string contentText)
|
|||
|
|
{
|
|||
|
|
mContent.text = contentText;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
internal void UpdateValidRect(Rect rect, EventType eventType, Action repaint)
|
|||
|
|
{
|
|||
|
|
mLastValidRect = EnsureValidRect(rect, mLastValidRect, eventType, repaint);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
internal static Rect EnsureValidRect(
|
|||
|
|
Rect rect, Rect lastValidRect, EventType eventType, Action repaint)
|
|||
|
|
{
|
|||
|
|
if (eventType == EventType.Layout)
|
|||
|
|
return lastValidRect;
|
|||
|
|
|
|||
|
|
if (lastValidRect == rect)
|
|||
|
|
return lastValidRect;
|
|||
|
|
|
|||
|
|
// Unity's layout system initially provides a placeholder rectangle during Layout.
|
|||
|
|
// A valid rectangle is only provided on following events like Repaint or Mouse events.
|
|||
|
|
//
|
|||
|
|
// - If we use the placeholder rectangle, the layout system won't position UI elements correctly.
|
|||
|
|
// - If we skip layout processing when the rectangle is invalid, we break GUILayout’s Begin/End pairing.
|
|||
|
|
//
|
|||
|
|
// To prevent both issues, we save the last valid rectangle and use it for drawing.
|
|||
|
|
|
|||
|
|
repaint();
|
|||
|
|
|
|||
|
|
return rect;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Rect mLastValidRect;
|
|||
|
|
|
|||
|
|
readonly GUIContent mContent = new GUIContent(string.Empty);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
internal static class DrawTreeViewEmptyState
|
|||
|
|
{
|
|||
|
|
internal static void For(EmptyStateData data)
|
|||
|
|
{
|
|||
|
|
DrawCenteredOnRect(data.Rect, ()=>
|
|||
|
|
{
|
|||
|
|
GUILayout.Label(data.Content, UnityStyles.Tree.StatusLabel);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
internal static void For(Texture2D icon, EmptyStateData data)
|
|||
|
|
{
|
|||
|
|
DrawCenteredOnRect(data.Rect, () =>
|
|||
|
|
{
|
|||
|
|
DrawIconAndLabel(icon, data.Content);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
internal static void DrawCenteredOnRect(Rect rect, Action onGUI)
|
|||
|
|
{
|
|||
|
|
GUILayout.BeginArea(rect);
|
|||
|
|
|
|||
|
|
GUILayout.FlexibleSpace();
|
|||
|
|
|
|||
|
|
GUILayout.BeginHorizontal();
|
|||
|
|
GUILayout.FlexibleSpace();
|
|||
|
|
|
|||
|
|
onGUI.Invoke();
|
|||
|
|
|
|||
|
|
GUILayout.FlexibleSpace();
|
|||
|
|
GUILayout.EndHorizontal();
|
|||
|
|
|
|||
|
|
GUILayout.FlexibleSpace();
|
|||
|
|
|
|||
|
|
GUILayout.EndArea();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static void DrawIconAndLabel(Texture2D icon, GUIContent label)
|
|||
|
|
{
|
|||
|
|
GUILayout.Label(
|
|||
|
|
icon,
|
|||
|
|
UnityStyles.Tree.StatusLabel,
|
|||
|
|
GUILayout.Width(UnityConstants.TREEVIEW_STATUS_ICON_SIZE),
|
|||
|
|
GUILayout.Height(UnityConstants.TREEVIEW_STATUS_ICON_SIZE));
|
|||
|
|
GUILayout.Space(UnityConstants.TREEVIEW_STATUS_CONTENT_PADDING);
|
|||
|
|
GUILayout.Label(label, UnityStyles.Tree.StatusLabel);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|