#if UNITY_EDITOR using UnityEngine; using UnityEngine.UIElements; using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEditor.ShortcutManagement; using System.Reflection; using System.Linq; using System.Text.RegularExpressions; using Type = System.Type; using static VInspector.Libs.VUtils; using static VInspector.Libs.VGUI; namespace VInspector { public class VInspectorSelectionHistory : ScriptableSingleton { public void MoveBack() { var prevState = prevStates.Last(); instance.RecordUndo("VInspectorSelectionHistory.MoveBack"); prevStates.Remove(prevState); nextStates.Add(curState); curState = prevState; ignoreThisSelectionChange = true; prevState.selectedObjects.ToArray().SelectInInspector(frameInHierarchy: false, frameInProject: false); } public void MoveForward() { var nextState = nextStates.Last(); instance.RecordUndo("VInspectorSelectionHistory.MoveForward"); nextStates.Remove(nextState); prevStates.Add(curState); curState = nextState; ignoreThisSelectionChange = true; nextState.selectedObjects.ToArray().SelectInInspector(frameInHierarchy: false, frameInProject: false); } static void OnSelectionChange() { if (ignoreThisSelectionChange) { ignoreThisSelectionChange = false; return; } if (curEvent.modifiers == EventModifiers.Command && curEvent.keyCode == KeyCode.Z) return; if (curEvent.modifiers == (EventModifiers.Command | EventModifiers.Shift) && curEvent.keyCode == KeyCode.Z) return; if (curEvent.modifiers == EventModifiers.Control && curEvent.keyCode == KeyCode.Z) return; if (curEvent.modifiers == EventModifiers.Control && curEvent.keyCode == KeyCode.Y) return; instance.RecordUndo(Undo.GetCurrentGroupName()); instance.prevStates.Add(instance.curState); instance.curState = new SelectionState() { selectedObjects = Selection.objects.ToList() }; instance.nextStates.Clear(); if (instance.prevStates.Count > 50) instance.prevStates.RemoveAt(0); } static bool ignoreThisSelectionChange; public List prevStates = new(); public List nextStates = new(); public SelectionState curState; [System.Serializable] public class SelectionState { public List selectedObjects = new(); } [InitializeOnLoadMethod] static void Init() { Selection.selectionChanged -= OnSelectionChange; Selection.selectionChanged += OnSelectionChange; // var globalEventHandler = typeof(EditorApplication).GetFieldValue("globalEventHandler"); // typeof(EditorApplication).SetFieldValue("globalEventHandler", ClearHistories + (globalEventHandler - ClearHistories)); instance.curState = new SelectionState() { selectedObjects = Selection.objects.ToList() }; } // static void ClearHistories() // just for debug // { // if (curEvent.holdingAnyModifierKey) return; // if (!curEvent.isKeyDown || curEvent.keyCode != KeyCode.Y) return; // VInspectorSelectionHistory.instance.prevStates.Clear(); // VInspectorSelectionHistory.instance.nextStates.Clear(); // Undo.ClearAll(); // VInspectorMenu.RepaintInspectors(); // } } } #endif