ObjectDetailListBox.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. using System.Collections.Generic;
  2. using UnityEditor;
  3. using UnityEngine;
  4. namespace MTE
  5. {
  6. internal class ObjectDetailListBox : DetailListBox<ObjectDetail>
  7. {
  8. public override void NoDetailGUI()
  9. {
  10. EditorGUILayout.LabelField(StringTable.Get(C.Warning_NoPrefabAdded));
  11. if (GUILayout.Button(StringTable.Get(C.LoadFromFile)))
  12. {
  13. string path;
  14. if(Utility.OpenFileDialog(StringTable.Get(C.Open), s_assetFileFilter, out path))
  15. {
  16. LoadDetailListFromAFile(path);
  17. }
  18. }
  19. }
  20. public override void DrawButtonBackground(int detailIndex, Rect buttonRect)
  21. {
  22. var detail = this.detailList[detailIndex] as ObjectDetail;
  23. if (detail == null)
  24. {
  25. Debug.LogWarning($"Ignored invalid Object detail at {detailIndex}");
  26. return;
  27. }
  28. var rect = buttonRect;
  29. rect.min += new Vector2(5, 5);
  30. rect.max -= new Vector2(5, 5);
  31. //draw preview texture
  32. var previewTexture = AssetPreview.GetAssetPreview(detail.Object);
  33. if (previewTexture)
  34. {
  35. GUI.DrawTexture(rect, previewTexture);
  36. }
  37. var textRect = buttonRect;
  38. var rectMin = textRect.min;
  39. rectMin.y = rect.max.y - EditorStyles.miniBoldLabel.lineHeight;
  40. textRect.min = rectMin;
  41. GUI.Label(textRect, detail.Object.name, EditorStyles.miniBoldLabel);
  42. }
  43. protected override void SaveDetailList()
  44. {
  45. var path = Res.DetailDir + "SavedObjectDetailList.asset";
  46. var relativePath = Utility.GetUnityPath(path);
  47. ObjectDetailList obj = ScriptableObject.CreateInstance<ObjectDetailList>();
  48. obj.list = this.detailList as List<ObjectDetail>;
  49. AssetDatabase.CreateAsset(obj, relativePath);
  50. MTEDebug.LogFormat("ObjectDetailList saved to {0}", path);
  51. }
  52. protected override C DetailType { get; } = C.Object;
  53. protected override void AddCallback()
  54. {
  55. ObjectDetailEditorWindow window = ScriptableObject.CreateInstance<ObjectDetailEditorWindow>();
  56. window.titleContent = new GUIContent($"{StringTable.Get(C.Add)} {StringTable.Get(DetailType)}");
  57. window.detailList = this.detailList as List<ObjectDetail>;
  58. window.IsAdding = true;
  59. window.OnSave = this.SaveDetailList;
  60. window.ShowUtility();
  61. }
  62. protected override void EditCallback()
  63. {
  64. ObjectDetailEditorWindow window = ScriptableObject.CreateInstance<ObjectDetailEditorWindow>();
  65. window.titleContent = new GUIContent($"{StringTable.Get(C.Edit)} {StringTable.Get(DetailType)}");
  66. window.detailList = this.detailList as List<ObjectDetail>;
  67. window.editingIndex = selectedIndex;
  68. window.IsAdding = false;
  69. window.OnSave = this.SaveDetailList;
  70. window.ShowUtility();
  71. }
  72. public void LoadDetailListFromAFile(string path)
  73. {
  74. MTEDebug.LogFormat("Loading Object detail list from <{0}>", path);
  75. var relativePath = Utility.GetUnityPath(path);
  76. var obj = AssetDatabase.LoadAssetAtPath<ObjectDetailList>(relativePath);
  77. if (obj != null)
  78. {
  79. this.detailList = obj.list;
  80. MTEDebug.LogFormat("Detail list loaded from {0}", path);
  81. if (this.detailList.Count == 0)
  82. {
  83. MTEDebug.Log("No detail found in the detail list.");
  84. }
  85. }
  86. else
  87. {
  88. MTEDebug.LogFormat("No detail list found in {0}.", path);
  89. }
  90. }
  91. private static readonly string[] s_assetFileFilter = {"detail list", "asset"};
  92. }
  93. }