Net.Like.Xue.Tokyo/Assets/Plugins/MonKey Commander/Editor/MonKey/Console/ParametricPanelDisplay.cs

658 lines
24 KiB
C#

#if UNITY_EDITOR
using System;
using System.Linq;
using MonKey.Editor.Internal;
using MonKey.Extensions;
using MonKey.Internal;
using UnityEditor;
using UnityEngine;
using Object = UnityEngine.Object;
namespace MonKey.Editor.Console
{
internal static class ParametricPanelDisplay
{
private static readonly int ArrayIdBreakout = 8;
internal static void DisplayParametricPanel(CommandConsoleWindow window)
{
try
{
if (Event.current.type == EventType.MouseDown)
{
window.Repaint();
window.Focus();
window.TabFrames = 10;
}
CommandConsoleWindow.RowHeight = new Rect(0, 0, 0, 0.55f);
DisplayCommandInfo(window.CurrentExecution);
Rect selectedRect = new Rect();
if (window.CurrentExecution.Info.CommandParameterInfo.Count > 1)
selectedRect = DisplayParameterTabs(window);
window.CheckSearch();
if (window.CurrentExecution.CurrentParameterInfo != null)
{
DisplayParameterPanel(window);
}
if (window.CurrentExecution.Info.CommandParameterInfo.Count > 1)
DisplayTabLink(selectedRect);
DisplayBottomHelp(window);
}
catch (Exception e)
{
if (CommandConsoleWindow.LogExceptions)
Debug.Log(e);
GUIUtility.ExitGUI();
}
}
private static void DisplayTabLink(Rect selectedRect)
{
Rect overlayForTab = new Rect(selectedRect.x,
selectedRect.y + selectedRect.height, selectedRect.width, 3);
GUI.DrawTexture(overlayForTab, MonkeyStyle.Instance.SelectedVariableTex);
}
private static void DisplayBottomHelp(CommandConsoleWindow window)
{
GUILayout.Label("", MonkeyStyle.Instance.HorizontalSideLineStyle);
GUILayout.Label("", MonkeyStyle.Instance.HorizontalSideSecondLineStyle);
EditorGUILayout.BeginHorizontal(MonkeyStyle.Instance.HelpStyle);
GUILayout.FlexibleSpace();
CommandSearchPanelDisplay.DisplayParametricCommandTip(window);
GUILayout.FlexibleSpace();
EditorGUILayout.EndHorizontal();
}
internal static void DisplayCommandInfo(ParametricCommandExecution execution)
{
GUILayout.BeginHorizontal(MonkeyStyle.Instance.TopSearchParametricPanelStyle);
GUILayout.BeginVertical(MonkeyStyle.Instance.MonkeyLogoParametricGroupStyle);
GUILayout.Label("", MonkeyStyle.Instance.MonkeyLogoStyleHappy);
GUILayout.EndVertical();
GUILayout.BeginVertical();
DisplayLogoTop();
DisplayCommandDetails(execution);
GUILayout.EndVertical();
GUILayout.EndHorizontal();
GUILayout.Label("", MonkeyStyle.Instance.HorizontalSideSecondLineStyle);
GUILayout.Label("", MonkeyStyle.Instance.HorizontalSideLineStyle);
}
private static void DisplayCommandDetails(ParametricCommandExecution execution)
{
GUILayout.BeginVertical(MonkeyStyle.Instance.ParametricMethodMethodGroup,
GUILayout.ExpandWidth(true), GUILayout.ExpandHeight(true));
CommandDisplay.DisplayCommandTitle(false, execution.Info, null);
CommandDisplay.DisplayCommandHelp(execution.Info, false, true);
GUILayout.FlexibleSpace();
GUILayout.EndVertical();
}
private static void DisplayLogoTop()
{
EditorGUILayout.BeginHorizontal(MonkeyStyle.Instance.NameLogoStyleGroup);
GUILayout.FlexibleSpace();
GUILayout.Label("", MonkeyStyle.Instance.ParametricNameLogoStyle);
EditorGUILayout.EndHorizontal();
}
internal static Rect DisplayParameterTabs(CommandConsoleWindow window)
{
MonkeyStyle monkeyStyle = MonkeyStyle.Instance;
GUILayout.BeginVertical(monkeyStyle.ParametricWindowBackgroundStyle);
int i = 0;
GUILayout.BeginHorizontal();
int current = window.CurrentExecution.CurrentParameterID;
Rect selectedRect = new Rect(0, 0, 0, 0);
foreach (var info in window.CurrentExecution.Info.CommandParameterInfo)
{
GUIStyle panelStyle = current == i
? monkeyStyle.VariableSelectedGroupStyle
: monkeyStyle.VariableNonSelectedGroupStyle;
GUILayout.BeginHorizontal(monkeyStyle.VariableGroupStyle);
GUILayout.Label("", monkeyStyle.ParametricTabShadow2Style);
GUILayout.Label("", monkeyStyle.ParametricTabShadow1Style);
GUILayout.BeginVertical(panelStyle, GUILayout.ExpandHeight(true));
if (current == i)
{
GUILayout.Label("", monkeyStyle.ParametricTabOutline1HorizontalStyle);
GUILayout.Label("", monkeyStyle.ParametricTabOutline2HorizontalStyle);
}
else
{
GUILayout.Label("", monkeyStyle.ParametricTabOutlineUnfocusedHorizontalStyle);
}
GUIStyle variableStyle;
if (window.CurrentExecution.IsParameterError(i))
{
variableStyle = monkeyStyle.VariableNameErrorTextStyle;
}
else
{
variableStyle = current == i
? monkeyStyle.VariableNameSelectedTextStyle
: monkeyStyle.VariableNameNonSelectedTextStyle;
}
GUILayout.BeginHorizontal();
GUILayout.Label(ObjectNames.NicifyVariableName(info.Name).Bold()
, variableStyle);
if (window.CurrentExecution.IsParameterError(i))
GUILayout.Label("", monkeyStyle.ParameterWarningIconStyle);
GUILayout.EndHorizontal();
GUILayout.EndVertical();
if (current == i)
{
GUILayout.Label("", monkeyStyle.ParametricTabOutline2VerticalStyle);
GUILayout.Label("", monkeyStyle.ParametricTabOutline1VerticalStyle);
}
else
{
GUILayout.Label("", monkeyStyle.ParametricTabOutlineUnfocusedVerticalStyle);
}
GUILayout.EndHorizontal();
if (GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition) &&
Event.current.type == EventType.MouseDown)
{
window.CurrentExecution.JumpToID(i);
window.Repaint();
}
if (current == i)
{
selectedRect = GUILayoutUtility.GetLastRect();
}
i++;
}
GUILayout.EndHorizontal();
GUILayout.EndVertical();
return selectedRect;
}
internal static void DisplayParameterPanel(CommandConsoleWindow window)
{
const string controlName = "searchParameter";
GUILayout.BeginVertical(MonkeyStyle.Instance.VariablePanelStyle,
GUILayout.ExpandWidth(true));
GUILayout.Label("", MonkeyStyle.Instance.ParametricTabOutline1HorizontalStyle);
GUILayout.Label("", MonkeyStyle.Instance.ParametricTabOutline2HorizontalStyle);
GUILayout.BeginHorizontal(new GUIStyle { margin = new RectOffset(10, 10, 20, 10) });
DisplayHelpPanel(window);
DisplayAutoCompleteSection(window, controlName);
GUILayout.EndHorizontal();
GUILayout.FlexibleSpace();
GUILayout.EndVertical();
window.Repaint();
if (window.TabFrames > 0 && window.TabFrames < 5)
{
CommandConsoleWindow.ForceEditSearchAtEnd(window.SearchTerms);
GUI.FocusControl(controlName);
}
}
private static void DisplayAutoCompleteSection(CommandConsoleWindow window,
string controlName)
{
ParametricCommandExecution exec = window.CurrentExecution;
GUILayout.BeginVertical(MonkeyStyle.Instance.SearchLabelGroupStyle);
if (exec.IsArray && exec.CurrentTextEntered.IsNullOrEmpty()
&& exec.CurrentAutoCompleteID == -1)
{
if (exec.HasNextVariable)
{
GUILayout.Label("Press TAB or ENTER to go to the next variable",
MonkeyStyle.Instance.VariableTypeTextStyle, GUILayout.ExpandWidth(true));
}
else
{
GUILayout.Label("Press TAB or ENTER to go to execute the command",
MonkeyStyle.Instance.VariableTypeTextStyle, GUILayout.ExpandWidth(true));
}
}
GUILayout.BeginHorizontal(MonkeyStyle.Instance.SearchLabelStyle);
GUILayout.BeginHorizontal(MonkeyStyle.Instance.AutoCompleteSearchLabelGroupStyle);
DisplayInstructionOrDefault(window, exec);
GUI.SetNextControlName(controlName);
window.SearchTerms = EditorGUIExt.TextField(window.SearchTerms, controlName,
MonkeyStyle.Instance.SearchLabelStyle);
if (!window.IsDocked || window.JustOpenedActiveMode ||
window.PreventSearchMovement || window.Focused)
{
if (window.PreventSearchMovement)
CommandConsoleWindow.ForceEditSearchAtEnd(window.SearchTerms);
window.Focus();
GUI.FocusControl(controlName);
}
// GUILayout.FlexibleSpace();
GUILayout.EndHorizontal();
GUILayout.EndHorizontal();
ComputeDragAndDrop(window);
GUILayout.BeginVertical(GUILayout.ExpandWidth(true));
DisplayAutoCompleteOptions(window);
GUILayout.EndVertical();
GUILayout.FlexibleSpace();
GUILayout.EndVertical();
}
private static bool startedDrag = false;
private static void ComputeDragAndDrop(CommandConsoleWindow window)
{
Type currentParameterType = window.CurrentExecution.CurrentParameterInfo.ParameterType;
if (window.CurrentExecution.CurrentParameterInfo.IsArray)
currentParameterType = currentParameterType.GetElementType();
if (!currentParameterType.IsSubclassOf(typeof(Object)) &&
currentParameterType != typeof(string))
return;
Event evt = Event.current;
Rect dropArea = GUILayoutUtility.GetLastRect();
bool isDrag = EventType.DragUpdated == evt.type || evt.type == EventType.DragPerform;
if (isDrag && !startedDrag)
{
startedDrag = true;
}
bool stringParam = currentParameterType == typeof(string);
string message = stringParam ? "Drop Your Asset Here!"
: "Drop Your Scene Object Here!";
GUI.Box(dropArea, startedDrag ? message : "", new GUIStyle()
{
alignment = TextAnchor.MiddleCenter,
normal =
{
background = MonkeyStyle.ColorTexture(1,1,startedDrag?
Color.white.Alphaed(1f) : Color.white.Alphaed(0) )
}
});
if (isDrag)
{
if (!dropArea.Contains(evt.mousePosition))
return;
bool validDragAndDrop = false;
if (stringParam)
{
validDragAndDrop = !DragAndDrop.objectReferences.Where(_ => _ is GameObject)
.Any(_ => ((GameObject)_).scene.IsValid());
}
else
{
validDragAndDrop =
DragAndDrop.objectReferences
.All(_ => _ is GameObject && ((GameObject)_).scene.IsValid());
}
DragAndDrop.visualMode = validDragAndDrop ? DragAndDropVisualMode.Copy
: DragAndDropVisualMode.Rejected;
if (evt.type == EventType.DragPerform && validDragAndDrop)
{
if (window.CurrentExecution.CurrentParameterInfo.IsArray)
window.CurrentExecution.NotifyFewInputs(DragAndDrop.objectReferences.Convert(_ => _.name).ToArray(), window);
else
{
window.SearchTerms = DragAndDrop.objectReferences[0].name;
window.CurrentExecution.NotifyNewInput(DragAndDrop.objectReferences[0].name, window);
}
DragAndDrop.AcceptDrag();
}
}
else if (evt.type == EventType.DragExited)
{
startedDrag = false;
}
}
private static void DisplayInstructionOrDefault(CommandConsoleWindow window,
ParametricCommandExecution exec)
{
bool customInstruction = exec.CurrentAutoComplete != null
&& !exec.CurrentAutoComplete.SearchInstruction.IsNullOrEmpty()
&& exec.CurrentParameterInfo.PreventDefaultValueUsage;
string textEntered = null;
if (exec.CurrentAutoCompleteID == -1)
{
if (!customInstruction && exec.CurrentTextEntered.IsNullOrEmpty())
{
if (exec.CurrentParameterInfo.PreventDefaultValueUsage
|| exec.CurrentParameterInfo.DefaultValueName.IsNullOrEmpty())
{
textEntered = MonKeyLocManager.CurrentLoc.NoValue;
}
else
{
textEntered = exec.CurrentParameterInfo.DefaultValueName;
textEntered += " ( ";
textEntered += MonKeyLocManager.CurrentLoc.Default;
textEntered += " )";
}
}
textEntered = customInstruction ? exec.CurrentAutoComplete.SearchInstruction : textEntered;
}
else if (exec.CurrentAutoComplete != null && exec.CurrentAutoCompleteID < exec.CurrentAutoComplete.Count)
textEntered = exec.CurrentAutoComplete.GetStringValue(exec.CurrentAutoCompleteID);
bool noValue = customInstruction &&
textEntered == exec.CurrentAutoComplete.SearchInstruction;
if (!textEntered.IsNullOrEmpty())
GUILayout.Label(textEntered + " | ",
noValue ? MonkeyStyle.Instance.SearchLabelHelpStyle : MonkeyStyle.Instance.SearchLabelStyle,
GUILayout.ExpandWidth(false));
}
private static void DisplayArrayIds(CommandConsoleWindow window, ParametricCommandExecution exec)
{
GUILayout.Label("", MonkeyStyle.Instance.ParametricTabUnderline1Style);
GUILayout.Label("", MonkeyStyle.Instance.ParametricTabUnderline2Style);
string textEntered = "";
if (exec.IsArray)
textEntered = MonKeyLocManager.CurrentLoc.CurrentArrayValues;
else
{
if (exec.IsParameterError(exec.CurrentParameterID))
{
textEntered = (MonKeyLocManager.CurrentLoc.Error)
.Colored(MonkeyStyle.Instance.VariableValueErrorTextColor);
}
}
GUILayout.Label(textEntered, MonkeyStyle.Instance.VariableValueSelectedTextStyle);
GUILayout.BeginHorizontal();
if (exec.IsArray)
{
GUILayout.BeginHorizontal(new GUIStyle()
{
margin = new RectOffset(2, 2, 2, 2),
normal = { background = MonkeyStyle.Instance.HelpVariableTex }
});
int startValue = exec.CurrentArrayIDEdited == -1 ? -1 : 0;
int columnCount = 0;
for (int i = startValue;
i < Mathf.Max(exec.CurrentArrayTextEntered.Count,
exec.CurrentArrayIDEdited + 1);
i++)
{
GUIStyle style;
if (i == exec.CurrentArrayIDEdited && i != -1)
style = MonkeyStyle.Instance.ArrayVariableSelectedGroupStyle;
else
{
if (i >= exec.CurrentArrayTextEntered.Count || i == -1)
{
style = MonkeyStyle.Instance.ArrayVariableNewGroupStyle;
}
else
{
style = MonkeyStyle.Instance.ArrayVariableNonSelectedGroupStyle;
}
}
GUILayout.BeginHorizontal(style);
GUILayout.Label((i >= exec.CurrentArrayTextEntered.Count || i == -1 ? " (New)" : i.ToString())
, MonkeyStyle.Instance.VariableTypeTextStyle);
if (i >= 0 && exec.CurrentArrayTextEntered.Count > i &&
!exec.CurrentArrayTextEntered[i].IsNullOrEmpty()
&& exec.CurrentArrayValuesParsed[i] == null)
{
GUILayout.Label("", MonkeyStyle.Instance.ArrayWarningIconStyle);
}
GUILayout.EndHorizontal();
if (Event.current.type == EventType.MouseDown &&
GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition))
{
exec.JumpToArrayID(window, i);
}
if (i - columnCount * ArrayIdBreakout >= ArrayIdBreakout)
{
GUILayout.EndHorizontal();
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
GUILayout.BeginHorizontal(new GUIStyle()
{
margin = new RectOffset(2, 2, 2, 2),
normal = { background = MonkeyStyle.Instance.HelpVariableTex }
});
columnCount++;
}
}
if (exec.CurrentArrayTextEntered.Count == 0 && exec.CurrentArrayIDEdited != -1)
GUILayout.Label("None", MonkeyStyle.Instance.VariableTypeTextStyle);
GUILayout.EndHorizontal();
}
GUILayout.EndHorizontal();
}
private static void DisplayHelpPanel(CommandConsoleWindow window)
{
ParametricCommandExecution exec = window.CurrentExecution;
GUILayout.BeginVertical(GUILayout.MinWidth(70),
GUILayout.MaxWidth(200), GUILayout.ExpandHeight(true));
GUILayout.BeginVertical(MonkeyStyle.Instance.VariableHelpGroupStyle);
GUILayout.Label(exec.CurrentParameterInfo.
Name.NicifyVariableName().Bold()
, MonkeyStyle.Instance.VariableTypeTextStyle);
GUILayout.Label("", MonkeyStyle.Instance.ParametricTabUnderline1Style);
GUILayout.Label("", MonkeyStyle.Instance.ParametricTabUnderline2Style);
CommandParameterInfo info = exec.CurrentParameterInfo;
string parameterTypeName = info.HasTypeNameOverride ?
info.ParameterTypeNameOverride :
MonkeyStyle.PrettifyTypeName(exec.CurrentParameterInfo.ParameterType);
GUILayout.Label(MonKeyLocManager.CurrentLoc.Type + parameterTypeName
, MonkeyStyle.Instance.VariableTypeTextStyle);
GUILayout.Label("", MonkeyStyle.Instance.ParametricTabUnderline1Style);
GUILayout.Label("", MonkeyStyle.Instance.ParametricTabUnderline2Style);
if (!info.Help.IsNullOrEmpty())
{
GUILayout.Label(info.Help, MonkeyStyle.Instance.VariableHelpTextStyle);
}
GUILayout.EndVertical();
DisplayArrayIds(window, exec);
GUILayout.FlexibleSpace();
GUILayout.EndVertical();
}
private static void DisplayAutoCompleteOptions(CommandConsoleWindow window)
{
if (!window.CurrentExecution.IsAutoCompleteSuggestions)
return;
if (window.MouseActivity)
window.MouseOverField = false;
GUI.skin = MonkeyStyle.Instance.MonkeyScrollBarStyle;
window.ScrollIndex = EditorGUILayout.BeginScrollView(window.ScrollIndex, new GUIStyle()
{
normal = { background = MonkeyStyle.Instance.ResultFieldTex }
});
for (int i = 0; i < window.CurrentExecution.CurrentAutoComplete.Count; i++)
{
bool selected = InitResultSelectionStyle(i, window.SelectedIndex,
window.MouseActivity);
GUILayout.Label("", MonkeyStyle.Instance.AutoCompleteLine1Style);
if (!selected)
GUILayout.Label("", MonkeyStyle.Instance.AutoCompleteLine2Style);
else
{
GUILayout.Label("", MonkeyStyle.Instance.AutoCompleteLine1Style);
}
GUILayout.BeginVertical(new GUIStyle { margin = new RectOffset(2, 2, 5, 5) });
GUILayout.BeginHorizontal();
GUILayout.BeginVertical();
DisplayAutoCompleteField(window.CurrentExecution.CurrentAutoComplete,
window.CurrentExecution.GetFormattedCurrentlyChosen(), selected, i);
GUILayout.EndVertical();
GUILayout.EndHorizontal();
GUILayout.EndVertical();
GUILayout.EndVertical();
if ((window.MouseActivity || Event.current.type == EventType.MouseDown) &&
GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition))
{
if (Event.current.type == EventType.MouseDown)
{
window.SelectedIndex = i;
window.CurrentExecution.
NotifyInputFromAutoComplete(window.SelectedIndex);
window.CurrentExecution.NotifyNextVariable(window);
}
window.MouseOverField = true;
window.SelectedIndex = i;
window.Repaint();
}
if (selected)
{
window.Repaint();
}
}
EditorGUILayout.EndScrollView();
GUI.skin = MonkeyStyle.Instance.DefaultStyle;
}
private static bool InitResultSelectionStyle(int index, int selectedIndex,
bool mouseActivity)
{
bool selected = false;
if (mouseActivity)
{
GUILayout.BeginVertical(MonkeyStyle.Instance.AutoCompleteResultLayoutStyle);
selected = true;
}
else if (index == selectedIndex)
{
GUILayout.BeginVertical(MonkeyStyle.Instance.AutoCompleteResultLayoutForcedHighlightStyle);
selected = true;
}
else
GUILayout.BeginVertical(MonkeyStyle.Instance.AutoCompleteResultLayoutNoHighlightStyle);
return selected;
}
private static void DisplayAutoCompleteField(
GenericCommandParameterAutoComplete autoComplete,
string searchTerms, bool selected, int id)
{
autoComplete.DrawAutoCompleteMember(id, searchTerms, selected);
}
}
}
#endif