UniEaseCopyWindow.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. using net.shutosg.UnityEditor;
  2. using UnityEditor;
  3. using UnityEngine;
  4. using UnityEngine.UIElements;
  5. namespace net.shutosg.UniEaseCopy
  6. {
  7. public class UniEaseCopyWindow : EditorWindow
  8. {
  9. private Label logTypeLabel;
  10. private Label logText;
  11. private Label keyCountText;
  12. private ListView keyframeList;
  13. private Button pasteEaseButton;
  14. private Button pasteValueButton;
  15. [MenuItem("Window/Animation/UniEaseCopy")]
  16. public static void ShowWindow()
  17. {
  18. var openedWindows = (EditorWindow[])Resources.FindObjectsOfTypeAll(typeof(UniEaseCopyWindow));
  19. var window = openedWindows.Length == 0 ? CreateInstance<UniEaseCopyWindow>() : openedWindows[0];
  20. window.titleContent = new GUIContent("UniEaseCopy");
  21. window.ShowUtility();
  22. }
  23. private static T LoadAsset<T>(string assetName) where T : Object
  24. {
  25. return AssetDatabase.LoadAssetAtPath<T>(DirectoryAnchor.Find("EditorResources") + assetName);
  26. }
  27. private static VisualTreeAsset LoadTreeAsset(string assetName) => LoadAsset<VisualTreeAsset>(assetName);
  28. private static StyleSheet LoadStyleAsset(string assetName) => LoadAsset<StyleSheet>(assetName);
  29. public void CreateGUI()
  30. {
  31. #if UNITY_2020_1_OR_NEWER
  32. var index = LoadTreeAsset("Index.uxml").CloneTree();
  33. #else
  34. var index = LoadTreeAsset("IndexWithoutStyle.uxml").CloneTree();
  35. index.styleSheets.Add(LoadStyleAsset("Index.uss"));
  36. #endif
  37. rootVisualElement.Add(index);
  38. logText = index.Q<Label>("LogMessageText");
  39. logTypeLabel = index.Q<Label>("LogTypeText");
  40. keyCountText = index.Q<Label>("CopiedKeyframeLabel");
  41. keyframeList = index.Q<ListView>("CopiedKeyframeList");
  42. var copyButton = index.Q<Button>("CopyButton");
  43. copyButton.clicked += () => UniEaseCopy.CopyKeyframes(onCopied: UpdateCopiedKeyInfo, onLogged: OnCopyLogged);
  44. pasteEaseButton = index.Q<Button>("PasteEaseButton");
  45. pasteEaseButton.clicked += () => UniEaseCopy.PasteEase(UpdateLog);
  46. pasteValueButton = index.Q<Button>("PasteValueButton");
  47. pasteValueButton.clicked += () => UniEaseCopy.PasteValue(UpdateLog);
  48. var node = LoadTreeAsset("KeyframeNode.uxml");
  49. #if UNITY_2020_1_OR_NEWER
  50. keyframeList.makeItem = () => node.CloneTree();
  51. keyframeList.bindItem = (element, i) =>
  52. {
  53. element.Q<Label>().text = $"[{i}] {((Keyframe)keyframeList.itemsSource[i]).Dump()}";
  54. };
  55. #else
  56. keyframeList.style.display = new StyleEnum<DisplayStyle>(DisplayStyle.None);
  57. #endif
  58. UpdateCopiedKeyInfo(null);
  59. UpdateLog(new UniEaseCopyLog() { Message = "initialized.", Type = LogType.Log });
  60. }
  61. private void OnCopyLogged(UniEaseCopyLog log)
  62. {
  63. UpdateLog(log);
  64. pasteEaseButton.SetEnabled(log.Type != LogType.Error);
  65. pasteValueButton.SetEnabled(log.Type != LogType.Error);
  66. }
  67. private void UpdateCopiedKeyInfo(Keyframe[] keyframes)
  68. {
  69. keyCountText.text = $"Copied Keyframes: {keyframes?.Length ?? 0}";
  70. keyframeList.itemsSource = keyframes;
  71. #if UNITY_2021_2_OR_NEWER
  72. keyframeList.Rebuild();
  73. #else
  74. keyframeList.Refresh();
  75. #endif
  76. }
  77. private void UpdateLog(UniEaseCopyLog log)
  78. {
  79. #if UNITY_2021_2_OR_NEWER
  80. logText.text = $"<b>[{log.Type}]</b> {log.Message}";
  81. #else
  82. logText.text = $"[{log.Type}] {log.Message}";
  83. #endif
  84. SetLogClass(logTypeLabel, log.Type);
  85. }
  86. private static void RemoveAllLogClass(VisualElement element)
  87. {
  88. element.RemoveFromClassList($"LogType{LogType.Log}");
  89. element.RemoveFromClassList($"LogType{LogType.Success}");
  90. element.RemoveFromClassList($"LogType{LogType.Warning}");
  91. element.RemoveFromClassList($"LogType{LogType.Error}");
  92. }
  93. private static void SetLogClass(VisualElement element, LogType logType)
  94. {
  95. RemoveAllLogClass(element);
  96. element.AddToClassList($"LogType{logType.ToString()}");
  97. }
  98. }
  99. }