Initial Commit

This commit is contained in:
Sebastian Cabrera 2021-08-02 05:44:37 -04:00
parent 53eb92e9af
commit 270ab7d11f
15341 changed files with 700234 additions and 0 deletions

View file

@ -0,0 +1,31 @@
using System;
using UnityEditor.IMGUI.Controls;
using UnityEngine.Timeline;
namespace UnityEditor.Timeline.Signals
{
static class SignalListFactory
{
public static SignalReceiverTreeView CreateSignalInspectorList(TreeViewState state, SignalReceiverHeader header, SignalReceiver target, SerializedObject so)
{
return new SignalReceiverTreeView(state, header, target, so);
}
public static SignalReceiverHeader CreateHeader(MultiColumnHeaderState state, int columnHeight)
{
var header = new SignalReceiverHeader(state) { height = columnHeight };
header.ResizeToFit();
return header;
}
public static MultiColumnHeaderState CreateHeaderState()
{
return new MultiColumnHeaderState(SignalReceiverTreeView.GetColumns());
}
public static TreeViewState CreateViewState()
{
return new TreeViewState();
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 01cd96d8687272f4898cfd1562079dd7
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,185 @@
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEditor.IMGUI.Controls;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Timeline;
using Object = UnityEngine.Object;
namespace UnityEditor.Timeline.Signals
{
class SignalReceiverItem : TreeViewItem, ISignalAssetProvider
{
static readonly SignalEventDrawer k_EvtDrawer = new SignalEventDrawer();
readonly SerializedProperty m_Asset;
readonly SerializedProperty m_Evt;
readonly SignalReceiverTreeView m_TreeView;
int m_CurrentRowIdx;
SignalReceiver m_CurrentReceiver;
internal readonly bool enabled;
internal readonly bool readonlySignal;
internal const string SignalName = "SignalName";
internal const string SignalNameReadOnly = "SignalNameReadOnly";
internal const string SignalOptions = "SignalOptions";
public SignalReceiverItem(SerializedProperty signalAsset, SerializedProperty eventListEntry, int id, bool readonlySignal, bool enabled, SignalReceiverTreeView treeView)
: base(id, 0)
{
m_Asset = signalAsset;
m_Evt = eventListEntry;
this.enabled = enabled;
this.readonlySignal = readonlySignal;
m_TreeView = treeView;
}
public SignalAsset signalAsset
{
get { return m_CurrentReceiver.GetSignalAssetAtIndex(m_CurrentRowIdx); }
set
{
Undo.RecordObject(m_CurrentReceiver, Styles.UndoCreateSignalAsset);
m_CurrentReceiver.ChangeSignalAtIndex(m_CurrentRowIdx, value);
PrefabUtility.RecordPrefabInstancePropertyModifications(m_CurrentReceiver);
}
}
public float GetHeight()
{
return k_EvtDrawer.GetPropertyHeight(m_Evt, GUIContent.none);
}
public void Draw(Rect rect, int colIdx, int rowIdx, float padding, SignalReceiver target)
{
switch (colIdx)
{
case 0:
DrawSignalNameColumn(rect, padding, target, rowIdx);
break;
case 1:
DrawReactionColumn(rect, rowIdx);
break;
default:
throw new ArgumentOutOfRangeException();
}
}
void DrawSignalNameColumn(Rect rect, float padding, SignalReceiver target, int rowIdx)
{
using (new EditorGUI.DisabledScope(!enabled))
{
if (!readonlySignal)
{
m_CurrentRowIdx = rowIdx;
m_CurrentReceiver = target;
rect.x += padding;
rect.width -= padding;
rect.height = EditorGUIUtility.singleLineHeight;
GUI.SetNextControlName(SignalName);
SignalUtility.DrawSignalNames(this, rect, GUIContent.none, false);
}
else
{
GUI.SetNextControlName(SignalNameReadOnly);
var signalAsset = m_Asset.objectReferenceValue;
GUI.Label(rect,
signalAsset != null
? EditorGUIUtility.TempContent(signalAsset.name)
: Styles.EmptySignalList);
}
}
}
void DrawReactionColumn(Rect rect, int rowIdx)
{
if (!readonlySignal)
{
var optionButtonSize = GetOptionButtonSize();
rect.width -= optionButtonSize.x;
var optionButtonRect = new Rect
{
x = rect.xMax,
y = rect.y,
width = optionButtonSize.x,
height = optionButtonSize.y
};
DrawOptionsButton(optionButtonRect, rowIdx, m_CurrentReceiver);
}
using (new EditorGUI.DisabledScope(!enabled))
{
var nameAsString = m_Asset.objectReferenceValue == null ? "Null" : m_Asset.objectReferenceValue.name;
using (var change = new EditorGUI.ChangeCheckScope())
{
EditorGUI.PropertyField(rect, m_Evt, EditorGUIUtility.TempContent(nameAsString));
if (change.changed)
m_TreeView.dirty = true;
}
}
}
static Vector2 GetOptionButtonSize()
{
EditorGUIUtility.SetIconSize(Vector2.zero);
return EditorStyles.iconButton.CalcSize(EditorGUI.GUIContents.titleSettingsIcon);
}
void DrawOptionsButton(Rect rect, int rowIdx, SignalReceiver target)
{
GUI.SetNextControlName(SignalOptions);
if (EditorGUI.DropdownButton(rect, EditorGUI.GUIContents.titleSettingsIcon, FocusType.Passive, EditorStyles.iconButton))
{
var menu = new GenericMenu();
menu.AddItem(new GUIContent(Styles.SignalListDuplicateOption), false, () =>
{
Undo.RecordObject(target, Styles.UndoDuplicateRow);
var evtCloner = ScriptableObject.CreateInstance<UnityEventCloner>();
evtCloner.evt = target.GetReactionAtIndex(rowIdx);
var clone = Object.Instantiate(evtCloner);
target.AddEmptyReaction(clone.evt);
m_TreeView.dirty = true;
PrefabUtility.RecordPrefabInstancePropertyModifications(target);
});
menu.AddItem(new GUIContent(Styles.SignalListDeleteOption), false, () =>
{
Undo.RecordObject(target, Styles.UndoDeleteRow);
target.RemoveAtIndex(rowIdx);
m_TreeView.dirty = true;
PrefabUtility.RecordPrefabInstancePropertyModifications(target);
});
menu.ShowAsContext();
}
}
IEnumerable<SignalAsset> ISignalAssetProvider.AvailableSignalAssets()
{
var ret = SignalManager.assets.Except(m_CurrentReceiver.GetRegisteredSignals());
return signalAsset == null ? ret : ret.Union(new List<SignalAsset> {signalAsset}).ToList();
}
void ISignalAssetProvider.CreateNewSignalAsset(string path)
{
var newSignalAsset = SignalManager.CreateSignalAssetInstance(path);
Undo.RecordObject(m_CurrentReceiver, Styles.UndoCreateSignalAsset);
// case 1241170 - overwriting an existing signal with throw an exception. Instead, clear the old key
int index = m_CurrentReceiver.GetRegisteredSignals().ToList().IndexOf(newSignalAsset);
if (index != -1)
m_CurrentReceiver.ChangeSignalAtIndex(index, null);
m_CurrentReceiver.ChangeSignalAtIndex(m_CurrentRowIdx, newSignalAsset);
PrefabUtility.RecordPrefabInstancePropertyModifications(m_CurrentReceiver);
}
class UnityEventCloner : ScriptableObject
{
public UnityEvent evt;
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 9bc2b69915879416f8df18971dc98e2e
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,155 @@
using System;
using System.Collections.Generic;
using UnityEditor.IMGUI.Controls;
using UnityEngine;
using UnityEngine.Timeline;
namespace UnityEditor.Timeline.Signals
{
class SignalReceiverTreeView : TreeView
{
public bool dirty { private get; set; }
SerializedProperty signals { get; set; }
SerializedProperty events { get; set; }
readonly SignalReceiver m_Target;
const float k_VerticalPadding = 5;
const float k_HorizontalPadding = 5;
public SignalReceiverTreeView(TreeViewState state, MultiColumnHeader multiColumnHeader, SignalReceiver receiver, SerializedObject serializedObject)
: base(state, multiColumnHeader)
{
m_Target = receiver;
useScrollView = true;
SetSerializedProperties(serializedObject);
getNewSelectionOverride = (item, selection, shift) => new List<int>(); // Disable Selection
}
SignalAsset signalAssetContext { get; set; }
public bool readonlySignals { get; set; }
public void SetSignalContext(SignalAsset assetContext = null)
{
signalAssetContext = assetContext;
dirty = true;
}
void SetSerializedProperties(SerializedObject serializedObject)
{
signals = SignalReceiverUtility.FindSignalsProperty(serializedObject);
events = SignalReceiverUtility.FindEventsProperty(serializedObject);
Reload();
}
public void Draw()
{
var rect = EditorGUILayout.GetControlRect(true, GetTotalHeight());
OnGUI(rect);
}
public void RefreshIfDirty()
{
var signalsListSizeHasChanged = signals.arraySize != GetRows().Count;
if (dirty || signalsListSizeHasChanged)
Reload();
dirty = false;
}
public static MultiColumnHeaderState.Column[] GetColumns()
{
return new[]
{
new MultiColumnHeaderState.Column
{
headerContent = L10n.TextContent("Signal"),
contextMenuText = "",
headerTextAlignment = TextAlignment.Center,
width = 50, minWidth = 50,
autoResize = true,
allowToggleVisibility = false,
canSort = false
},
new MultiColumnHeaderState.Column
{
headerContent = L10n.TextContent("Reaction"),
contextMenuText = "",
headerTextAlignment = TextAlignment.Center,
width = 120, minWidth = 120,
autoResize = true,
allowToggleVisibility = false,
canSort = false
}
};
}
protected override TreeViewItem BuildRoot()
{
var root = new TreeViewItem(-1, -1) { children = new List<TreeViewItem>() };
var matchingId = signalAssetContext != null && readonlySignals ? FindIdForSignal(signals, signalAssetContext) : -1;
if (matchingId >= 0)
AddItem(root, matchingId);
for (var i = 0; i < signals.arraySize; ++i)
{
if (i == matchingId) continue;
AddItem(root, i, !readonlySignals);
}
return root;
}
protected override void RowGUI(RowGUIArgs args)
{
var item = (SignalReceiverItem)args.item;
for (var i = 0; i < args.GetNumVisibleColumns(); ++i)
{
var rect = args.GetCellRect(i);
rect.y += k_VerticalPadding;
item.Draw(rect, args.GetColumn(i), args.row, k_HorizontalPadding, m_Target);
}
}
protected override float GetCustomRowHeight(int row, TreeViewItem treeItem)
{
var item = treeItem as SignalReceiverItem;
return item.GetHeight() + k_VerticalPadding;
}
void AddItem(TreeViewItem root, int id, bool enabled = true)
{
var signal = signals.GetArrayElementAtIndex(id);
var evt = events.GetArrayElementAtIndex(id);
root.children.Add(new SignalReceiverItem(signal, evt, id, readonlySignals, enabled, this));
}
float GetTotalHeight()
{
var height = 0.0f;
foreach (var item in GetRows())
{
var signalListItem = item as SignalReceiverItem;
height += signalListItem.GetHeight() + k_VerticalPadding;
}
var scrollbarPadding = showingHorizontalScrollBar ? GUI.skin.horizontalScrollbar.fixedHeight : k_VerticalPadding;
return height + multiColumnHeader.height + scrollbarPadding;
}
static int FindIdForSignal(SerializedProperty signals, SignalAsset signalToFind)
{
for (var i = 0; i < signals.arraySize; ++i)
{
//signal in the receiver that matches the current signal asset will be displayed first
var serializedProperty = signals.GetArrayElementAtIndex(i);
var signalReferenceValue = serializedProperty.objectReferenceValue;
var signalToFindRefValue = signalToFind;
if (signalReferenceValue != null && signalReferenceValue == signalToFindRefValue)
return i;
}
return -1;
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 698b660e9477f4f16abad03ec00ce38c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: