Initial Commit
This commit is contained in:
parent
53eb92e9af
commit
270ab7d11f
15341 changed files with 700234 additions and 0 deletions
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 01cd96d8687272f4898cfd1562079dd7
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 9bc2b69915879416f8df18971dc98e2e
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 698b660e9477f4f16abad03ec00ce38c
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Loading…
Add table
Add a link
Reference in a new issue