using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TinaX.Tween.Components;
using TinaXEditor.Utils;
using UnityEditor;
using UnityEditorInternal;
using UnityEngine;
namespace TinaXEditor.Tween.CustomEditors
{
[CustomEditor(typeof(TweenSequence))]
public class TweenSequenceCustomEditor : TweenComponentBaseCustomEditor
{
SerializedProperty _Seq;
public ReorderableList SequencesList;
private bool m_RefreshDataFlag = false;
protected override void OnEnable()
{
base.OnEnable();
//定义标题
switch (Application.systemLanguage)
{
default:
Title = "Tween Queue";
break;
case SystemLanguage.Chinese:
case SystemLanguage.ChineseSimplified:
Title = "补间动画序列";
break;
}
}
public override void OnInspectorGUI()
{
if (!m_RefreshDataFlag || _Seq == null)
_RefreshData();
//base.OnInspectorGUI();
var _serializedObject = this.serializedObject;
UIDraw.DrawTitle(this.Title);
EditorGUIUtil.HorizontalLine(1, Color.gray);
EditorGUILayout.Space();
SequencesList.DoLayoutList();
if (GUILayout.Button(EditorGUIUtil.IsCmnHans ? "打开独立编辑窗口" : "Open Edit Window"))
{
TweenSequenceEditWindow.TargetCustomEditor = this;
TweenSequenceEditWindow.OpenUI();
}
EditorGUILayout.Space();
EditorGUIUtil.HorizontalLine(1, Color.gray);
EditorGUILayout.Space();
//UIDraw.DrawDuration(ref _serializedObject);
UIDraw.DrawPlayOnAwake(ref _serializedObject);
UIDraw.DrawDelayBefore(ref _serializedObject);
UIDraw.DrawDescription(ref _serializedObject);
EditorGUILayout.Space();
UIDraw.DrawEvents_FinishAndStop(ref _serializedObject);
_serializedObject.ApplyModifiedProperties();
}
private void _RefreshData()
{
_Seq = this.serializedObject.FindProperty("_Sequences");
SequencesList = new ReorderableList(this.serializedObject, _Seq, true, true, true, true);
SequencesList.drawElementCallback = (rect, index, isActive, isFocus) =>
{
rect.height = EditorGUIUtility.singleLineHeight;
rect.y += 2;
SerializedProperty itemData = _Seq.GetArrayElementAtIndex(index);
SerializedProperty itemData_Tweens = itemData.FindPropertyRelative("Tweens");
SerializedProperty itemData_Delay = itemData.FindPropertyRelative("DelayAfter");
if (itemData_Tweens.arraySize > 0)
{
for (var i = 0; i < itemData_Tweens.arraySize; i++)
{
var rect_item = rect;
rect_item.y += i * (EditorGUIUtility.singleLineHeight + 2);
var tween_item = itemData_Tweens.GetArrayElementAtIndex(i);
var tween_component = tween_item.FindPropertyRelative("TweenComponent");
var ready = tween_item.FindPropertyRelative("ReadyOnSequenceStart");
var rect_obj = rect_item;
rect_obj.width -= 80;
tween_component.objectReferenceValue = EditorGUI.ObjectField(rect_obj, tween_component.objectReferenceValue, typeof(TweenComponentBase), true);
var rect_ready = rect_item;
rect_ready.x += rect_obj.width + 4;
rect_ready.width = 55;
ready.boolValue = EditorGUI.ToggleLeft(rect_ready, new GUIContent("Ready", "If ready, The target of this animation will be set to the origin value at the beginning of the sequence"), ready.boolValue);
var rect_del = rect_item;
rect_del.x += rect_obj.width + 4 + rect_ready.width + 2;
rect_del.width = 19;
if (GUI.Button(rect_del, new GUIContent("×", "Delete")))
{
itemData_Tweens.DeleteArrayElementAtIndex(i);
}
}
}
//add btn
var rect_btn_add = rect;
rect_btn_add.y += (itemData_Tweens.arraySize) * (EditorGUIUtility.singleLineHeight + 2);
rect_btn_add.width = 80;
if (GUI.Button(rect_btn_add, "Add"))
{
var __index = itemData_Tweens.arraySize;
itemData_Tweens.InsertArrayElementAtIndex(__index);
var this_data = itemData_Tweens.GetArrayElementAtIndex(__index);
this_data.FindPropertyRelative("TweenComponent").objectReferenceValue = null;
this_data.FindPropertyRelative("ReadyOnSequenceStart").boolValue = false;
}
var rect_delay = rect;
rect_delay.y += (itemData_Tweens.arraySize + 1) * (EditorGUIUtility.singleLineHeight + 2);
itemData_Delay.floatValue = EditorGUI.FloatField(rect_delay, new GUIContent("Delay After:"), itemData_Delay.floatValue);
};
SequencesList.elementHeightCallback = (index) =>
{
var count = _Seq.GetArrayElementAtIndex(index).FindPropertyRelative("Tweens").arraySize;
return (EditorGUIUtility.singleLineHeight + 2) * (count + 2) + 5;
};
SequencesList.onAddCallback = (list) =>
{
if (list.serializedProperty != null)
{
list.serializedProperty.arraySize++;
list.index = list.serializedProperty.arraySize - 1;
SerializedProperty itemData = list.serializedProperty.GetArrayElementAtIndex(list.index);
SerializedProperty item_tweens = itemData.FindPropertyRelative("Tweens");
SerializedProperty item_delay = itemData.FindPropertyRelative("DelayAfter");
item_tweens.ClearArray();
item_delay.floatValue = 0;
}
else
{
ReorderableList.defaultBehaviours.DoAddButton(list);
}
};
SequencesList.drawHeaderCallback = rect =>
{
EditorGUI.LabelField(rect, EditorGUIUtil.IsCmnHans ? "补间动画序列" : "Tween Sequences");
};
m_RefreshDataFlag = true;
}
}
///
/// 独立编辑窗
///
public class TweenSequenceEditWindow : EditorWindow
{
public static TweenSequenceCustomEditor TargetCustomEditor;
private static TweenSequenceEditWindow wnd;
public static void OpenUI()
{
if (wnd == null)
{
wnd = GetWindow();
wnd.titleContent = new GUIContent(EditorGUIUtil.IsCmnHans ? "序列编辑器" : "Sequences Editor");
}
else
{
wnd.Show();
wnd.Focus();
}
}
private void OnGUI()
{
if(TargetCustomEditor == null)
{
GUILayout.FlexibleSpace();
GUILayout.Label(EditorGUIUtil.IsCmnHans ? "编辑器目标丢失,请重新打开本窗口." : "Editor target lost, please reopen it.");
GUILayout.FlexibleSpace();
return;
}
TargetCustomEditor.SequencesList.DoLayoutList();
TargetCustomEditor.serializedObject.ApplyModifiedProperties();
}
private void OnDestroy()
{
wnd = null;
TargetCustomEditor = null;
}
}
}