void SelectedObjectWasDestroyed(int id) { if (m_CustomEditorTools.Any(x => x == m_ActiveTool) && m_ActiveTool.m_Targets.Any(x => x == null || x.GetInstanceID() == id)) { m_PreviousCustomEditorToolContext = new CustomEditorToolContext(m_ActiveTool); RestorePreviousTool(); } }
void RebuildAvailableCustomEditorTools() { EditorApplication.delayCall -= RebuildAvailableCustomEditorTools; // Do not rebuild the cache since objects are serialized, destroyed, deserialized during this phase if (m_PlayModeState == PlayModeStateChange.ExitingEditMode || m_PlayModeState == PlayModeStateChange.ExitingPlayMode) { return; } var preservedActiveTool = false; ClearCustomEditorTools(); var inspectors = InspectorWindow.GetInspectors(); // If the shared tracker is locked, use our own tracker instance so that the current selection is always // represented. Addresses case where a single locked inspector is open. var shared = ActiveEditorTracker.sharedTracker; preservedActiveTool |= CollectCustomEditorToolsFromTracker(shared.isLocked ? tracker : shared, m_CustomEditorTools); foreach (var inspector in inspectors) { if (inspector.isLocked) { preservedActiveTool |= CollectCustomEditorToolsFromTracker(inspector.tracker, m_LockedCustomEditorTools); } } if (IsCustomEditorTool(m_ActiveTool) && !preservedActiveTool) { var previous = m_ActiveTool; m_PreviousCustomEditorToolContext = new CustomEditorToolContext(m_ActiveTool); RestorePreviousTool(); DestroyImmediate(previous); } }
void RestoreCustomEditorTool() { var restored = m_CustomEditorTools.FirstOrDefault(m_PreviousCustomEditorToolContext.IsEqual); // Check for existence in locked inspectors too, but only if the locked inspector target is being inspected if (restored == null && m_PreviousCustomEditorToolContext.targetObject != null && Selection.objects.Any(x => x.Equals(m_PreviousCustomEditorToolContext.targetObject))) { restored = m_LockedCustomEditorTools.FirstOrDefault(m_PreviousCustomEditorToolContext.IsEqual); } if (restored != null) { var targets = restored.targets.ToArray(); EditorJsonUtility.FromJsonOverwrite(m_PreviousCustomEditorToolContext.editorToolState, restored); restored.m_Targets = targets; restored.m_Target = targets.Last(); activeTool = restored; } m_PreviousCustomEditorToolContext = CustomEditorToolContext.Empty; }
void RebuildAvailableCustomEditorTools() { EditorApplication.delayCall -= RebuildAvailableCustomEditorTools; // Do not rebuild the cache since objects are serialized, destroyed, deserialized during this phase if (m_PlayModeState == PlayModeStateChange.ExitingEditMode || m_PlayModeState == PlayModeStateChange.ExitingPlayMode) { return; } var preservedActiveTool = false; ClearCustomEditorTools(); var inspectors = InspectorWindow.GetInspectors(); // If the shared tracker is locked, use our own tracker instance so that the current selection is always // represented. Addresses case where a single locked inspector is open. var shared = ActiveEditorTracker.sharedTracker; m_CustomEditorTools.Clear(); m_LockedCustomEditorTools.Clear(); // Collect editor tools for the shared tracker first EditorToolUtility.GetEditorToolsForTracker(shared.isLocked ? tracker : shared, s_CustomEditorTools); foreach (var customEditorTool in s_CustomEditorTools) { if (m_CustomEditorTools.Any(x => x.GetType() == customEditorTool.editorToolType && x.target == customEditorTool.owner.target)) { continue; } EditorTool tool; preservedActiveTool |= CreateOrRestoreTool(customEditorTool, out tool); m_CustomEditorTools.Add(tool); } // Next, collect tools from locked inspectors foreach (var inspector in inspectors) { if (inspector.isLocked) { EditorToolUtility.GetEditorToolsForTracker(inspector.tracker, s_CustomEditorTools); foreach (var customEditorTool in s_CustomEditorTools) { // Don't add duplicate tools to either another locked inspector with the same target, or a shared tracker if (m_CustomEditorTools.Any(x => x.GetType() == customEditorTool.editorToolType && x.target == customEditorTool.owner.target) || m_LockedCustomEditorTools.Any(x => x.GetType() == customEditorTool.editorToolType && x.target == customEditorTool.owner.target)) { continue; } EditorTool tool; preservedActiveTool |= CreateOrRestoreTool(customEditorTool, out tool); m_LockedCustomEditorTools.Add(tool); } } } if (IsCustomEditorTool(m_ActiveTool) && !preservedActiveTool) { var previous = m_ActiveTool; m_PreviousCustomEditorToolContext = new CustomEditorToolContext(m_ActiveTool); RestorePreviousTool(); DestroyImmediate(previous); } }