FR2_Bookmark.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Text;
  4. using UnityEditor;
  5. using UnityEngine;
  6. using UnityObject = UnityEngine.Object;
  7. namespace vietlabs.fr2
  8. {
  9. public class FR2_Bookmark : IRefDraw
  10. {
  11. internal static HashSet<string> guidSet = new HashSet<string>();
  12. internal static HashSet<string> instSet = new HashSet<string>(); // Do not reference directly to SceneObject (which might be destroyed anytime)
  13. public static int Count
  14. {
  15. get { return guidSet.Count + instSet.Count; }
  16. }
  17. public static bool Contains(string guidOrInstID)
  18. {
  19. return guidSet.Contains(guidOrInstID) || instSet.Contains(guidOrInstID);
  20. }
  21. public static bool Contains(UnityObject sceneObject)
  22. {
  23. var id = sceneObject.GetInstanceID().ToString();
  24. return instSet.Contains(id);
  25. }
  26. public static bool Contains(FR2_Ref rf)
  27. {
  28. if (rf.isSceneRef)
  29. {
  30. if (instSet == null) return false;
  31. return instSet.Contains(rf.component.GetInstanceID().ToString());
  32. }
  33. else
  34. {
  35. if (guidSet == null) return false;
  36. return guidSet.Contains(rf.asset.guid);
  37. }
  38. }
  39. public static void Add(UnityObject sceneObject)
  40. {
  41. if (sceneObject == null) return;
  42. var id = sceneObject.GetInstanceID().ToString();
  43. instSet.Add(id); // hashset does not need to check exist before add
  44. dirty = true;
  45. }
  46. public static void Add(string guid)
  47. {
  48. if (guidSet.Contains(guid)) return;
  49. var assetPath = AssetDatabase.GUIDToAssetPath(guid);
  50. if (string.IsNullOrEmpty(assetPath))
  51. {
  52. Debug.LogWarning("Invalid GUID: " + guid);
  53. return;
  54. }
  55. guidSet.Add(guid);
  56. dirty = true;
  57. //Debug.Log(instSet.Count + " : " + guidSet.Count);
  58. }
  59. public static void Remove(UnityObject sceneObject)
  60. {
  61. if (sceneObject == null) return;
  62. var id = sceneObject.GetInstanceID().ToString();
  63. instSet.Remove(id);
  64. dirty = true;
  65. }
  66. public static void Remove(string guidOrInstID)
  67. {
  68. guidSet.Remove(guidOrInstID);
  69. instSet.Remove(guidOrInstID);
  70. dirty = true;
  71. }
  72. public static void Clear()
  73. {
  74. guidSet.Clear();
  75. instSet.Clear();
  76. dirty = true;
  77. }
  78. public static void Add(FR2_Ref rf)
  79. {
  80. if (rf.isSceneRef)
  81. {
  82. //Debug.Log("add " + rf.component);
  83. Add(rf.component);
  84. }
  85. else
  86. {
  87. Add(rf.asset.guid);
  88. }
  89. }
  90. public static void Remove(FR2_Ref rf)
  91. {
  92. if (rf.isSceneRef)
  93. {
  94. //Debug.Log("remove: " + rf.component);
  95. Remove(rf.component);
  96. }
  97. else
  98. {
  99. Remove(rf.asset.guid);
  100. }
  101. }
  102. public static void Commit()
  103. {
  104. var list = new List<Object>();
  105. foreach (string guid in guidSet)
  106. {
  107. string path = AssetDatabase.GUIDToAssetPath(guid);
  108. Object obj = AssetDatabase.LoadAssetAtPath(path, typeof(Object));
  109. if (obj != null) list.Add(obj);
  110. }
  111. foreach (string instID in instSet)
  112. {
  113. var id = int.Parse(instID);
  114. var obj = EditorUtility.InstanceIDToObject(id);
  115. if (obj != null) list.Add(obj);
  116. }
  117. Selection.objects = list.ToArray();
  118. }
  119. // ------------ instance
  120. //private readonly FR2_TreeUI2.GroupDrawer groupDrawer;
  121. private static bool dirty;
  122. private readonly FR2_RefDrawer drawer;
  123. internal Dictionary<string, FR2_Ref> refs = new Dictionary<string, FR2_Ref>();
  124. public FR2_Bookmark(IWindow window)
  125. {
  126. this.window = window;
  127. drawer = new FR2_RefDrawer(window);
  128. drawer.messageNoRefs = "Do bookmark something!";
  129. drawer.groupDrawer.hideGroupIfPossible = true;
  130. drawer.forceHideDetails = true;
  131. drawer.level0Group = string.Empty;
  132. dirty = true;
  133. drawer.SetDirty();
  134. }
  135. public IWindow window { get; set; }
  136. public int ElementCount()
  137. {
  138. return refs == null ? 0 : refs.Count;
  139. }
  140. public bool DrawLayout()
  141. {
  142. if (dirty) RefreshView();
  143. return drawer.DrawLayout();
  144. }
  145. public bool Draw(Rect rect)
  146. {
  147. if (dirty) RefreshView();
  148. if (refs == null)
  149. {
  150. Debug.Log("Refs is null!");
  151. return false;
  152. }
  153. var bottomRect = new Rect(rect.x+1f, rect.yMax - 16f, rect.width-2f, 16f);
  154. DrawButtons(bottomRect);
  155. rect.yMax -= 16f;
  156. return drawer.Draw(rect);
  157. }
  158. public void SetDirty()
  159. {
  160. drawer.SetDirty();
  161. }
  162. void DrawButtons(Rect rect)
  163. {
  164. if (Count == 0) return;
  165. GUILayout.BeginArea(rect);
  166. {
  167. GUILayout.BeginHorizontal();
  168. {
  169. if (GUILayout.Button("Select"))
  170. {
  171. Commit();
  172. window.WillRepaint = true;
  173. }
  174. if (GUILayout.Button("Clear"))
  175. {
  176. Clear();
  177. window.WillRepaint = true;
  178. }
  179. if (GUILayout.Button("CSV"))
  180. {
  181. FR2_Export.ExportCSV(refs.Values.ToArray());
  182. }
  183. if (GUILayout.Button("Delete"))
  184. {
  185. FR2_Unity.BackupAndDeleteAssets(refs.Values.ToArray());
  186. Clear();
  187. GUIUtility.ExitGUI();
  188. }
  189. }
  190. GUILayout.EndHorizontal();
  191. }
  192. GUILayout.EndArea();
  193. }
  194. public void RefreshView()
  195. {
  196. if (refs == null) refs = new Dictionary<string, FR2_Ref>();
  197. refs.Clear();
  198. foreach (var guid in guidSet)
  199. {
  200. var asset = FR2_Cache.Api.Get(guid, false);
  201. refs.Add(guid, new FR2_Ref(0, 0, asset, null));
  202. }
  203. foreach (var instId in instSet)
  204. {
  205. refs.Add(instId, new FR2_SceneRef(0, EditorUtility.InstanceIDToObject(int.Parse(instId))));
  206. }
  207. drawer.SetRefs(refs);
  208. //Debug.Log("RefreshView: " + refs.Count);
  209. dirty = false;
  210. }
  211. internal void RefreshSort()
  212. {
  213. drawer.RefreshSort();
  214. }
  215. }
  216. }