| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 | using net.shutosg.UnityEditor;using UnityEditor;using UnityEngine;using UnityEngine.UIElements;namespace net.shutosg.UniEaseCopy{    public class UniEaseCopyWindow : EditorWindow    {        private Label logTypeLabel;        private Label logText;        private Label keyCountText;        private ListView keyframeList;        private Button pasteEaseButton;        private Button pasteValueButton;        [MenuItem("Window/Animation/UniEaseCopy")]        public static void ShowWindow()        {            var openedWindows = (EditorWindow[])Resources.FindObjectsOfTypeAll(typeof(UniEaseCopyWindow));            var window = openedWindows.Length == 0 ? CreateInstance<UniEaseCopyWindow>() : openedWindows[0];            window.titleContent = new GUIContent("UniEaseCopy");            window.ShowUtility();        }        private static T LoadAsset<T>(string assetName) where T : Object        {            return AssetDatabase.LoadAssetAtPath<T>(DirectoryAnchor.Find("EditorResources") + assetName);        }        private static VisualTreeAsset LoadTreeAsset(string assetName) => LoadAsset<VisualTreeAsset>(assetName);        private static StyleSheet LoadStyleAsset(string assetName) => LoadAsset<StyleSheet>(assetName);        public void CreateGUI()        {#if UNITY_2020_1_OR_NEWER            var index = LoadTreeAsset("Index.uxml").CloneTree();#else            var index = LoadTreeAsset("IndexWithoutStyle.uxml").CloneTree();            index.styleSheets.Add(LoadStyleAsset("Index.uss"));#endif            rootVisualElement.Add(index);            logText = index.Q<Label>("LogMessageText");            logTypeLabel = index.Q<Label>("LogTypeText");            keyCountText = index.Q<Label>("CopiedKeyframeLabel");            keyframeList = index.Q<ListView>("CopiedKeyframeList");            var copyButton = index.Q<Button>("CopyButton");            copyButton.clicked += () => UniEaseCopy.CopyKeyframes(onCopied: UpdateCopiedKeyInfo, onLogged: OnCopyLogged);            pasteEaseButton = index.Q<Button>("PasteEaseButton");            pasteEaseButton.clicked += () => UniEaseCopy.PasteEase(UpdateLog);            pasteValueButton = index.Q<Button>("PasteValueButton");            pasteValueButton.clicked += () => UniEaseCopy.PasteValue(UpdateLog);            var node = LoadTreeAsset("KeyframeNode.uxml");#if UNITY_2020_1_OR_NEWER            keyframeList.makeItem = () => node.CloneTree();            keyframeList.bindItem = (element, i) =>            {                element.Q<Label>().text = $"[{i}] {((Keyframe)keyframeList.itemsSource[i]).Dump()}";            };#else            keyframeList.style.display = new StyleEnum<DisplayStyle>(DisplayStyle.None);#endif            UpdateCopiedKeyInfo(null);            UpdateLog(new UniEaseCopyLog() { Message = "initialized.", Type = LogType.Log });        }        private void OnCopyLogged(UniEaseCopyLog log)        {            UpdateLog(log);            pasteEaseButton.SetEnabled(log.Type != LogType.Error);            pasteValueButton.SetEnabled(log.Type != LogType.Error);        }        private void UpdateCopiedKeyInfo(Keyframe[] keyframes)        {            keyCountText.text = $"Copied Keyframes: {keyframes?.Length ?? 0}";            keyframeList.itemsSource = keyframes;#if UNITY_2021_2_OR_NEWER            keyframeList.Rebuild();#else            keyframeList.Refresh();#endif        }        private void UpdateLog(UniEaseCopyLog log)        {#if UNITY_2021_2_OR_NEWER            logText.text = $"<b>[{log.Type}]</b> {log.Message}";#else            logText.text = $"[{log.Type}] {log.Message}";#endif            SetLogClass(logTypeLabel, log.Type);        }        private static void RemoveAllLogClass(VisualElement element)        {            element.RemoveFromClassList($"LogType{LogType.Log}");            element.RemoveFromClassList($"LogType{LogType.Success}");            element.RemoveFromClassList($"LogType{LogType.Warning}");            element.RemoveFromClassList($"LogType{LogType.Error}");        }        private static void SetLogClass(VisualElement element, LogType logType)        {            RemoveAllLogClass(element);            element.AddToClassList($"LogType{logType.ToString()}");        }    }}
 |