|
|
|
|
|
|
using System.Reflection; |
|
|
|
using UnityEngine; |
|
|
|
using UnityEditor; |
|
|
|
public class SelectionHistoryWindow : EditorWindow |
|
|
|
|
|
|
|
namespace GameplayIngredients.Editor |
|
|
|
[MenuItem("Window/Selection History")] |
|
|
|
public static void OpenSelectionHistoryWindow() |
|
|
|
public class SelectionHistoryWindow : EditorWindow |
|
|
|
EditorWindow.GetWindow<SelectionHistoryWindow>(); |
|
|
|
} |
|
|
|
|
|
|
|
Vector2 scrollPos = Vector2.zero; |
|
|
|
|
|
|
|
void OnGUI() |
|
|
|
{ |
|
|
|
titleContent = Contents.title; |
|
|
|
|
|
|
|
scrollPos = EditorGUILayout.BeginScrollView(scrollPos); |
|
|
|
[MenuItem("Window/General/Selection History")] |
|
|
|
public static void OpenSelectionHistoryWindow() |
|
|
|
Selection_OnGUI(); |
|
|
|
EditorWindow.GetWindow<SelectionHistoryWindow>(); |
|
|
|
EditorGUILayout.EndScrollView(); |
|
|
|
} |
|
|
|
void OnEnable() |
|
|
|
{ |
|
|
|
lockedObjects = null; |
|
|
|
selectionHistory = null; |
|
|
|
} |
|
|
|
Vector2 scrollPos = Vector2.zero; |
|
|
|
void OnDisable() |
|
|
|
{ |
|
|
|
lockedObjects = null; |
|
|
|
selectionHistory = null; |
|
|
|
} |
|
|
|
void OnGUI() |
|
|
|
{ |
|
|
|
titleContent = Contents.title; |
|
|
|
List<GameObject> selectionHistory; |
|
|
|
List<GameObject> lockedObjects; |
|
|
|
scrollPos = EditorGUILayout.BeginScrollView(scrollPos); |
|
|
|
{ |
|
|
|
Selection_OnGUI(); |
|
|
|
} |
|
|
|
EditorGUILayout.EndScrollView(); |
|
|
|
} |
|
|
|
int maxHistoryCount = 32; |
|
|
|
bool ignoreNextSelection = false; |
|
|
|
void OnEnable() |
|
|
|
{ |
|
|
|
lockedObjects = null; |
|
|
|
selectionHistory = null; |
|
|
|
} |
|
|
|
void OnSelectionChange() |
|
|
|
{ |
|
|
|
if (ignoreNextSelection) |
|
|
|
void OnDisable() |
|
|
|
ignoreNextSelection = false; |
|
|
|
return; |
|
|
|
lockedObjects = null; |
|
|
|
selectionHistory = null; |
|
|
|
if (selectionHistory == null) selectionHistory = new List<GameObject>(); |
|
|
|
if (lockedObjects == null) lockedObjects = new List<GameObject>(); |
|
|
|
List<GameObject> selectionHistory; |
|
|
|
List<GameObject> lockedObjects; |
|
|
|
|
|
|
|
int maxHistoryCount = 32; |
|
|
|
bool ignoreNextSelection = false; |
|
|
|
if (Selection.activeGameObject != null || Selection.gameObjects.Length > 0) |
|
|
|
void OnSelectionChange() |
|
|
|
|
|
|
|
foreach(var go in Selection.gameObjects) |
|
|
|
if (ignoreNextSelection) |
|
|
|
if (!selectionHistory.Contains(go)) |
|
|
|
selectionHistory.Add(go); |
|
|
|
ignoreNextSelection = false; |
|
|
|
return; |
|
|
|
if (selectionHistory.Count > maxHistoryCount) |
|
|
|
selectionHistory.Take(maxHistoryCount); |
|
|
|
if (selectionHistory == null) selectionHistory = new List<GameObject>(); |
|
|
|
if (lockedObjects == null) lockedObjects = new List<GameObject>(); |
|
|
|
Repaint(); |
|
|
|
} |
|
|
|
if (Selection.activeGameObject != null || Selection.gameObjects.Length > 0) |
|
|
|
{ |
|
|
|
} |
|
|
|
foreach(var go in Selection.gameObjects) |
|
|
|
{ |
|
|
|
if (!selectionHistory.Contains(go)) |
|
|
|
selectionHistory.Add(go); |
|
|
|
} |
|
|
|
public bool CompareArray(GameObject[] a, GameObject[] b) |
|
|
|
{ |
|
|
|
return a.SequenceEqual(b); |
|
|
|
} |
|
|
|
if (selectionHistory.Count > maxHistoryCount) |
|
|
|
selectionHistory.Take(maxHistoryCount); |
|
|
|
void Selection_OnGUI() |
|
|
|
{ |
|
|
|
if (selectionHistory == null) selectionHistory = new List<GameObject>(); |
|
|
|
if (lockedObjects == null) lockedObjects = new List<GameObject>(); |
|
|
|
int i = 0; |
|
|
|
int toRemove = -1; |
|
|
|
Repaint(); |
|
|
|
} |
|
|
|
if (lockedObjects.Count > 0) |
|
|
|
} |
|
|
|
|
|
|
|
public bool CompareArray(GameObject[] a, GameObject[] b) |
|
|
|
GUILayout.Label("Favorites", EditorStyles.boldLabel); |
|
|
|
i = 0; |
|
|
|
toRemove = -1; |
|
|
|
foreach (var obj in lockedObjects) |
|
|
|
return a.SequenceEqual(b); |
|
|
|
} |
|
|
|
|
|
|
|
void Selection_OnGUI() |
|
|
|
{ |
|
|
|
if (selectionHistory == null) selectionHistory = new List<GameObject>(); |
|
|
|
if (lockedObjects == null) lockedObjects = new List<GameObject>(); |
|
|
|
int i = 0; |
|
|
|
int toRemove = -1; |
|
|
|
|
|
|
|
if (lockedObjects.Count > 0) |
|
|
|
if (obj == null) |
|
|
|
GUILayout.Label("Favorites", EditorStyles.boldLabel); |
|
|
|
i = 0; |
|
|
|
toRemove = -1; |
|
|
|
foreach (var obj in lockedObjects) |
|
|
|
using (new EditorGUILayout.HorizontalScope()) |
|
|
|
if (obj == null) |
|
|
|
GUILayout.Label("(object is either null or has been deleted)"); |
|
|
|
if (GUILayout.Button("X", GUILayout.Width(24))) |
|
|
|
using (new EditorGUILayout.HorizontalScope()) |
|
|
|
toRemove = i; |
|
|
|
GUILayout.Label("(object is either null or has been deleted)"); |
|
|
|
if (GUILayout.Button("X", GUILayout.Width(24))) |
|
|
|
{ |
|
|
|
toRemove = i; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
bool highlight = Selection.gameObjects.Contains(obj); |
|
|
|
Color backup = GUI.color; |
|
|
|
|
|
|
|
if (highlight) |
|
|
|
GUI.color = Styles.highlightColor; |
|
|
|
|
|
|
|
using (new EditorGUILayout.HorizontalScope()) |
|
|
|
{ |
|
|
|
var b = GUI.color; |
|
|
|
GUI.color = Color.yellow * 3; |
|
|
|
if (GUILayout.Button(Contents.star, Styles.icon, GUILayout.Width(24))) |
|
|
|
{ |
|
|
|
toRemove = i; |
|
|
|
} |
|
|
|
|
|
|
|
GUI.color = b; |
|
|
|
|
|
|
|
string label = obj.name; |
|
|
|
|
|
|
|
if (GUILayout.Button(label, EditorStyles.foldout)) |
|
|
|
{ |
|
|
|
ignoreNextSelection = true; |
|
|
|
Selection.activeObject = obj; |
|
|
|
} |
|
|
|
if (GUILayout.Button("Focus", EditorStyles.miniButton, GUILayout.Width(40))) |
|
|
|
{ |
|
|
|
ignoreNextSelection = true; |
|
|
|
Selection.activeObject = obj; |
|
|
|
SceneView.lastActiveSceneView.FrameSelected(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
GUI.color = backup; |
|
|
|
} |
|
|
|
i++; |
|
|
|
else |
|
|
|
if (toRemove != -1) lockedObjects.RemoveAt(toRemove); |
|
|
|
} |
|
|
|
|
|
|
|
int toAdd = -1; |
|
|
|
toRemove = -1; |
|
|
|
i = 0; |
|
|
|
using (new EditorGUILayout.HorizontalScope()) |
|
|
|
{ |
|
|
|
GUILayout.Label("History", EditorStyles.boldLabel); |
|
|
|
GUILayout.FlexibleSpace(); |
|
|
|
if (GUILayout.Button("Clear", EditorStyles.miniButton)) |
|
|
|
{ |
|
|
|
selectionHistory.Clear(); |
|
|
|
Repaint(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
GUILayout.Space(8); |
|
|
|
|
|
|
|
var reversedHistory = selectionHistory.Reverse<GameObject>().ToArray(); |
|
|
|
foreach (var obj in reversedHistory) |
|
|
|
{ |
|
|
|
if (obj != null) |
|
|
|
{ |
|
|
|
bool highlight = Selection.gameObjects.Contains(obj); |
|
|
|
Color backup = GUI.color; |
|
|
|
|
|
|
|
|
|
|
using (new EditorGUILayout.HorizontalScope()) |
|
|
|
{ |
|
|
|
var b = GUI.color; |
|
|
|
GUI.color = Color.yellow * 3; |
|
|
|
if (GUILayout.Button(Contents.star, Styles.icon, GUILayout.Width(24))) |
|
|
|
|
|
|
|
if (GUILayout.Button(Contents.starDisabled, Styles.icon, GUILayout.Width(24))) |
|
|
|
toRemove = i; |
|
|
|
toAdd = i; |
|
|
|
|
|
|
|
GUI.color = b; |
|
|
|
|
|
|
|
if (GUILayout.Button("Focus", EditorStyles.miniButton, GUILayout.Width(40))) |
|
|
|
if (GUILayout.Button("Focus", Styles.historyButton, GUILayout.Width(40))) |
|
|
|
{ |
|
|
|
ignoreNextSelection = true; |
|
|
|
Selection.activeObject = obj; |
|
|
|
|
|
|
var rect = GUILayoutUtility.GetLastRect(); |
|
|
|
EditorGUI.DrawRect(rect, new Color(0.2f,0.2f,0.2f,0.5f)); |
|
|
|
|
|
|
|
if (toRemove != -1) lockedObjects.RemoveAt(toRemove); |
|
|
|
} |
|
|
|
|
|
|
|
int toAdd = -1; |
|
|
|
toRemove = -1; |
|
|
|
i = 0; |
|
|
|
using (new EditorGUILayout.HorizontalScope()) |
|
|
|
{ |
|
|
|
GUILayout.Label("History", EditorStyles.boldLabel); |
|
|
|
GUILayout.FlexibleSpace(); |
|
|
|
if (GUILayout.Button("Clear", EditorStyles.miniButton)) |
|
|
|
if (toAdd != -1) |
|
|
|
{ |
|
|
|
lockedObjects.Add(reversedHistory[toAdd]); |
|
|
|
Repaint(); |
|
|
|
} |
|
|
|
if (toRemove != -1) |
|
|
|
selectionHistory.Clear(); |
|
|
|
selectionHistory.RemoveAt(toRemove); |
|
|
|
} |
|
|
|
GUILayout.Space(8); |
|
|
|
} |
|
|
|
var reversedHistory = selectionHistory.Reverse<GameObject>().ToArray(); |
|
|
|
foreach (var obj in reversedHistory) |
|
|
|
static class Styles |
|
|
|
if (obj != null) |
|
|
|
{ |
|
|
|
bool highlight = Selection.gameObjects.Contains(obj); |
|
|
|
Color backup = GUI.color; |
|
|
|
|
|
|
|
if (highlight) |
|
|
|
GUI.color = Styles.highlightColor; |
|
|
|
public static GUIStyle historyButton; |
|
|
|
public static GUIStyle highlight; |
|
|
|
public static Color highlightColor = new Color(2.0f, 2.0f, 2.0f); |
|
|
|
using (new EditorGUILayout.HorizontalScope()) |
|
|
|
{ |
|
|
|
public static GUIStyle icon; |
|
|
|
if (GUILayout.Button(Contents.starDisabled, Styles.icon, GUILayout.Width(24))) |
|
|
|
{ |
|
|
|
toAdd = i; |
|
|
|
} |
|
|
|
static Styles() |
|
|
|
{ |
|
|
|
historyButton = new GUIStyle(EditorStyles.miniButton); |
|
|
|
historyButton.alignment = TextAnchor.MiddleLeft; |
|
|
|
highlight = new GUIStyle(EditorStyles.miniLabel); |
|
|
|
highlight.onNormal.background = Texture2D.whiteTexture; |
|
|
|
highlight.onHover.background = Texture2D.whiteTexture; |
|
|
|
highlight.onActive.background = Texture2D.whiteTexture; |
|
|
|
highlight.onFocused.background = Texture2D.whiteTexture; |
|
|
|
string label = obj.name; |
|
|
|
if (GUILayout.Button(label, EditorStyles.foldout)) |
|
|
|
{ |
|
|
|
ignoreNextSelection = true; |
|
|
|
Selection.activeObject = obj; |
|
|
|
} |
|
|
|
if (GUILayout.Button("Focus", Styles.historyButton, GUILayout.Width(40))) |
|
|
|
{ |
|
|
|
ignoreNextSelection = true; |
|
|
|
Selection.activeObject = obj; |
|
|
|
SceneView.lastActiveSceneView.FrameSelected(); |
|
|
|
} |
|
|
|
} |
|
|
|
var rect = GUILayoutUtility.GetLastRect(); |
|
|
|
EditorGUI.DrawRect(rect, new Color(0.2f,0.2f,0.2f,0.5f)); |
|
|
|
icon = new GUIStyle(EditorStyles.label); |
|
|
|
icon.fixedHeight = 16; |
|
|
|
icon.padding = new RectOffset(8,2,2,0); |
|
|
|
icon.margin = new RectOffset(); |
|
|
|
GUI.color = backup; |
|
|
|
|
|
|
|
i++; |
|
|
|
} |
|
|
|
if (toAdd != -1) |
|
|
|
{ |
|
|
|
lockedObjects.Add(reversedHistory[toAdd]); |
|
|
|
Repaint(); |
|
|
|
} |
|
|
|
if (toRemove != -1) |
|
|
|
{ |
|
|
|
selectionHistory.RemoveAt(toRemove); |
|
|
|
Repaint(); |
|
|
|
} |
|
|
|
|
|
|
|
static class Styles |
|
|
|
{ |
|
|
|
public static GUIStyle historyButton; |
|
|
|
public static GUIStyle highlight; |
|
|
|
public static Color highlightColor = new Color(2.0f, 2.0f, 2.0f); |
|
|
|
|
|
|
|
public static GUIStyle icon; |
|
|
|
|
|
|
|
static Styles() |
|
|
|
static class Contents |
|
|
|
historyButton = new GUIStyle(EditorStyles.miniButton); |
|
|
|
historyButton.alignment = TextAnchor.MiddleLeft; |
|
|
|
highlight = new GUIStyle(EditorStyles.miniLabel); |
|
|
|
highlight.onNormal.background = Texture2D.whiteTexture; |
|
|
|
highlight.onHover.background = Texture2D.whiteTexture; |
|
|
|
highlight.onActive.background = Texture2D.whiteTexture; |
|
|
|
highlight.onFocused.background = Texture2D.whiteTexture; |
|
|
|
|
|
|
|
icon = new GUIStyle(EditorStyles.label); |
|
|
|
icon.fixedHeight = 16; |
|
|
|
icon.padding = new RectOffset(8,2,2,0); |
|
|
|
icon.margin = new RectOffset(); |
|
|
|
|
|
|
|
public static GUIContent title = new GUIContent("Selection History"); |
|
|
|
public static GUIContent star = new GUIContent(EditorGUIUtility.IconContent("Favorite Icon").image); |
|
|
|
public static GUIContent starDisabled = new GUIContent(EditorGUIUtility.IconContent("Favorite").image); |
|
|
|
} |
|
|
|
|
|
|
|
static class Contents |
|
|
|
{ |
|
|
|
public static GUIContent title = new GUIContent("Selection History"); |
|
|
|
public static GUIContent star = new GUIContent(EditorGUIUtility.IconContent("Favorite Icon").image); |
|
|
|
public static GUIContent starDisabled = new GUIContent(EditorGUIUtility.IconContent("Favorite").image); |
|
|
|
} |
|
|
|
} |