You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
235 lines
7.8 KiB
235 lines
7.8 KiB
using UnityEngine;
|
|
using UnityEditor;
|
|
using UnityEditorInternal;
|
|
using System;
|
|
using System.Linq;
|
|
using System.Collections.Generic;
|
|
|
|
[CustomEditor(typeof(RsProcessingProfile))]
|
|
public class RsProcessingPipeEditor : Editor
|
|
{
|
|
private SerializedProperty _property;
|
|
private ReorderableList _list;
|
|
|
|
private void OnEnable()
|
|
{
|
|
_property = serializedObject.FindProperty("_processingBlocks");
|
|
_list = new ReorderableList(serializedObject, _property, true, true, true, true)
|
|
{
|
|
drawHeaderCallback = DrawListHeader,
|
|
drawElementCallback = DrawListElement,
|
|
drawElementBackgroundCallback = DrawElementBackground,
|
|
elementHeightCallback = GetElementHeightCallback,
|
|
onAddDropdownCallback = AddDropdownCallback,
|
|
onRemoveCallback = RemoveCallback,
|
|
#if UNITY_2018_1_OR_NEWER
|
|
//onReorderCallbackWithDetails = ReorderCallbackWithDetails,
|
|
#endif
|
|
onSelectCallback = SelectElement,
|
|
};
|
|
}
|
|
|
|
private void SelectElement(ReorderableList list)
|
|
{
|
|
var element = list.serializedProperty.GetArrayElementAtIndex(list.index);
|
|
EditorGUIUtility.PingObject(element.objectReferenceValue);
|
|
}
|
|
|
|
private void ReorderCallbackWithDetails(ReorderableList list, int oldIndex, int newIndex)
|
|
{
|
|
var e0 = list.serializedProperty.GetArrayElementAtIndex(oldIndex).isExpanded;
|
|
var e = list.serializedProperty.GetArrayElementAtIndex(newIndex).isExpanded;
|
|
list.serializedProperty.GetArrayElementAtIndex(newIndex).isExpanded = e0;
|
|
list.serializedProperty.GetArrayElementAtIndex(oldIndex).isExpanded = e;
|
|
}
|
|
|
|
|
|
private void DrawElementBackground(Rect rect, int index, bool isActive, bool isFocused)
|
|
{
|
|
if (Event.current.type == EventType.Repaint)
|
|
{
|
|
rect.height = GetElementHeightCallback(index);
|
|
// rect.height += 3f;
|
|
ReorderableList.defaultBehaviours.DrawElementBackground(rect, index, isActive, isFocused, true);
|
|
|
|
// Color color = (!EditorGUIUtility.isProSkin) ? new Color(0.6f, 0.6f, 0.6f, 0.333f) : new Color(0.12f, 0.12f, 0.12f, 0.333f);
|
|
// if (index < _list.count - 1)
|
|
// EditorGUI.DrawRect(new Rect(rect.x, rect.y + rect.height - 1f, rect.width, 1f), color);
|
|
// EditorGUI.DrawRect(new Rect(rect.x + 20f, rect.y, 1f, rect.height), color);
|
|
|
|
// var s = new GUIStyle("IN Title");
|
|
// s.Draw(new Rect(rect.x + 1f, rect.y, 19f, rect.height), false, false, true, false);
|
|
|
|
}
|
|
}
|
|
|
|
private void RemoveCallback(ReorderableList list)
|
|
{
|
|
var element = list.serializedProperty.GetArrayElementAtIndex(list.index);
|
|
|
|
ScriptableObject.DestroyImmediate(element.objectReferenceValue, true);
|
|
AssetDatabase.SaveAssets();
|
|
|
|
|
|
element.objectReferenceValue = null;
|
|
list.serializedProperty.DeleteArrayElementAtIndex(list.index);
|
|
if (list.index >= list.serializedProperty.arraySize - 1)
|
|
{
|
|
list.index = list.serializedProperty.arraySize - 1;
|
|
}
|
|
}
|
|
|
|
private void AddDropdownCallback(Rect buttonRect, ReorderableList list)
|
|
{
|
|
var menu = new GenericMenu();
|
|
|
|
// var blocks = AppDomain.CurrentDomain.GetAssemblies()
|
|
// .SelectMany(a => a.GetTypes())
|
|
// .Where(t => t.IsSubclassOf(typeof(Intel.RealSense.ProcessingBlock)))
|
|
// .ToArray();
|
|
|
|
var blocks = AppDomain.CurrentDomain.GetAssemblies()
|
|
.SelectMany(a => a.GetTypes())
|
|
.Select(t => new
|
|
{
|
|
Type = t,
|
|
Attribute = t.GetCustomAttributes(typeof(ProcessingBlockDataAttribute), false).FirstOrDefault() as ProcessingBlockDataAttribute
|
|
}).Where(a => a.Attribute != null)
|
|
;
|
|
|
|
foreach (var b in blocks)
|
|
{
|
|
var t = b.Attribute.blockClass.ToString();
|
|
t = t.Replace('.', '/');
|
|
menu.AddItem(new GUIContent(t), false, data =>
|
|
{
|
|
serializedObject.UpdateIfRequiredOrScript();
|
|
|
|
var block = (data as object[])[0] as Type;
|
|
var index = list.serializedProperty.arraySize;
|
|
list.serializedProperty.arraySize++;
|
|
list.index = index;
|
|
var element = list.serializedProperty.GetArrayElementAtIndex(index);
|
|
|
|
var obj = ScriptableObject.CreateInstance(block);
|
|
// UnityEditor.ObjectNames.GetUniqueName(names.ToArray(), block.Name);
|
|
obj.name = block.Name;
|
|
AssetDatabase.AddObjectToAsset(obj, target);
|
|
element.objectReferenceValue = obj;
|
|
|
|
serializedObject.ApplyModifiedProperties();
|
|
AssetDatabase.SaveAssets();
|
|
|
|
}, new object[] { b.Type, b.Attribute });
|
|
}
|
|
|
|
menu.ShowAsContext();
|
|
}
|
|
|
|
private float GetElementHeightCallback(int index)
|
|
{
|
|
if (index < 0)
|
|
return 0;
|
|
|
|
var item = _property.GetArrayElementAtIndex(index);
|
|
|
|
if (item == null || item.objectReferenceValue == null)
|
|
return 0;
|
|
|
|
if (!item.isExpanded)
|
|
return EditorGUIUtility.singleLineHeight * 1.5f;
|
|
|
|
var obj = new SerializedObject(item.objectReferenceValue);
|
|
|
|
var h = EditorGUIUtility.singleLineHeight * 1.5f;
|
|
|
|
SerializedProperty iterator = obj.GetIterator();
|
|
bool enterChildren = true;
|
|
while (iterator.NextVisible(enterChildren))
|
|
{
|
|
if (iterator.name == "m_Script")
|
|
continue;
|
|
if (iterator.name == "enabled")
|
|
continue;
|
|
h += EditorGUI.GetPropertyHeight(iterator, GUIContent.none, iterator.isExpanded);
|
|
h += 4f;
|
|
enterChildren = false;
|
|
}
|
|
|
|
iterator.Dispose();
|
|
obj.Dispose();
|
|
|
|
return h;
|
|
}
|
|
|
|
private void DrawListHeader(Rect rect)
|
|
{
|
|
GUI.Label(rect, "Processing Blocks");
|
|
}
|
|
|
|
private void DrawListElement(Rect rect, int index, bool isActive, bool isFocused)
|
|
{
|
|
var item = _property.GetArrayElementAtIndex(index);
|
|
|
|
if (item.objectReferenceValue == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var pb = item.objectReferenceValue;
|
|
var obj = new SerializedObject(pb);
|
|
obj.Update();
|
|
|
|
var r = new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight);
|
|
|
|
var enabled = obj.FindProperty("enabled");
|
|
enabled.boolValue = EditorUtility.GetObjectEnabled(obj.targetObject) == 1;
|
|
item.isExpanded = EditorGUI.InspectorTitlebar(r, item.isExpanded, obj.targetObject, true);
|
|
|
|
if (!item.isExpanded)
|
|
{
|
|
obj.ApplyModifiedProperties();
|
|
obj.Dispose();
|
|
return;
|
|
}
|
|
|
|
r.y += EditorGUIUtility.singleLineHeight * 1.5f;
|
|
|
|
SerializedProperty iterator = obj.GetIterator();
|
|
bool enterChildren = true;
|
|
while (iterator.NextVisible(enterChildren))
|
|
{
|
|
if (iterator.name == "m_Script")
|
|
continue;
|
|
|
|
if (iterator.name == "enabled")
|
|
continue;
|
|
|
|
r.height = EditorGUI.GetPropertyHeight(iterator, GUIContent.none, iterator.isExpanded);
|
|
EditorGUI.PropertyField(r, iterator, true);
|
|
enterChildren = false;
|
|
r.y += r.height + 4f;
|
|
}
|
|
obj.ApplyModifiedProperties();
|
|
obj.Dispose();
|
|
}
|
|
|
|
protected override bool ShouldHideOpenButton()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
public override void OnInspectorGUI()
|
|
{
|
|
serializedObject.Update();
|
|
EditorGUILayout.Space();
|
|
using (new EditorGUI.DisabledScope(true))
|
|
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_Script"));
|
|
EditorGUILayout.Space();
|
|
_list.DoLayoutList();
|
|
EditorGUILayout.Space();
|
|
serializedObject.ApplyModifiedProperties();
|
|
|
|
EditorUtility.SetDirty(target);
|
|
}
|
|
} |