daily pastebin goal
47%
SHARE
TWEET

SelectionLog

Powerhoof Nov 29th, 2017 (edited) 609 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //-----------------------------------------------------------------
  2. // Selection Log - Keeps history of your selected objects in unity
  3. //
  4. //  To use, stick this under a folder named "Editor"
  5. //   then select "Window->Selection Log" from toolbar
  6. //
  7. //  Feel free to use/adapt however you want
  8. //
  9. //   More info:
  10. //     http://tools.powerhoof.com
  11. //     dave@powerhoof.com
  12. //     @DuzzOnDrums
  13. //
  14. //-----------------------------------------------------------------
  15.  
  16. using UnityEditor;
  17. using UnityEngine;
  18. using System.Collections;
  19. using System.Collections.Generic;
  20.  
  21. namespace PowerTools
  22. {
  23.  
  24. public class SelectionLog : EditorWindow
  25. {
  26.     #region Definitions
  27.  
  28.     [System.Serializable]
  29.     class SelectedObject
  30.     {
  31.         public bool m_locked = false;
  32.         public Object m_object = null;
  33.         public bool m_inScene = false;
  34.     }
  35.  
  36.     static readonly int MAX_ITEMS = 50;
  37.     static readonly string STRING_INSCENE = "*";
  38.  
  39.     #endregion
  40.     #region Vars: Private
  41.  
  42.     [SerializeField] SelectedObject m_selectedObject = null;
  43.     [SerializeField] List<SelectedObject> m_selectedObjects = new List<SelectedObject>();
  44.  
  45.     [SerializeField] Vector2 m_scrollPosition = Vector2.zero;
  46.  
  47.     [System.NonSerialized]
  48.     GUIStyle m_lockButtonStyle;
  49.     [System.NonSerialized]
  50.     GUIContent m_searchButtonContent = null;
  51.  
  52.     #endregion
  53.     #region Funcs: Private
  54.  
  55.     // Add menu item named "Super Animation Editor" to the Window menu
  56.     [MenuItem("Window/Selection Log")]
  57.     static void ShowWindow()
  58.     {
  59.         //Show existing window instance. If one doesn't exist, make one.
  60.         EditorWindow.GetWindow<SelectionLog>("Selection Log");
  61.     }
  62.  
  63.     /// Called by unity when selection changes
  64.     void OnSelectionChange()
  65.     {
  66.         if ( Selection.activeObject == null )
  67.         {
  68.             m_selectedObject = null;
  69.         }
  70.         else if ( m_selectedObject == null || m_selectedObject.m_object != Selection.activeObject )
  71.         {
  72.             // If the object's in the list, select it, and if not locked, move it to the top of the list
  73.             SelectedObject obj = m_selectedObjects.Find(item => item.m_object == Selection.activeObject);
  74.  
  75.             m_selectedObject = obj;
  76.  
  77.             if ( obj != null )
  78.             {
  79.                 m_selectedObjects.Remove (obj);
  80.                 int firstNonLocked = ( m_selectedObjects.FindIndex(item => item.m_locked == true) );
  81.                 if ( firstNonLocked >= 0 )
  82.                     m_selectedObjects.Insert(firstNonLocked, obj );
  83.                 else
  84.                     m_selectedObjects.Add( obj );
  85.                 m_selectedObject = obj;
  86.             }
  87.             else
  88.             {
  89.  
  90.                 // Find first non-locked item
  91.                 obj = new SelectedObject()
  92.                     {
  93.                         m_object = Selection.activeObject,
  94.                         m_inScene = AssetDatabase.Contains(Selection.activeInstanceID) == false
  95.                     };
  96.                 int firstNonLocked = ( m_selectedObjects.FindIndex(item => item.m_locked == true) );
  97.                 if ( firstNonLocked >= 0 )
  98.                 {
  99.                     m_selectedObjects.Insert(firstNonLocked, obj );
  100.                 }
  101.                 else
  102.                 {
  103.                     m_selectedObjects.Add( obj );
  104.                 }
  105.                 m_selectedObject = obj;
  106.  
  107.             }
  108.  
  109.             // Cap number of items to reasonable amount
  110.             while ( m_selectedObjects.Count > MAX_ITEMS )
  111.                 m_selectedObjects.RemoveAt(0);
  112.  
  113.             Repaint();
  114.         }
  115.     }
  116.  
  117.  
  118.     void OnGUI ()
  119.     {
  120.         m_scrollPosition = EditorGUILayout.BeginScrollView(m_scrollPosition);
  121.  
  122.         GUILayout.Space(5);
  123.  
  124.         bool shownClear = false;
  125.         bool processingLocked = false;
  126.         for ( int i = m_selectedObjects.Count-1; i >= 0; --i)
  127.         {
  128.             if ( m_selectedObjects[i].m_locked == false )
  129.             {
  130.                 if ( processingLocked )
  131.                 {
  132.                     // First non-locked. so add Clear button
  133.  
  134.                     shownClear = true;
  135.                     if ( LayoutClearButton() )
  136.                         break;
  137.                     processingLocked = false;
  138.                 }
  139.             }
  140.             else
  141.             {
  142.                 processingLocked = true;
  143.             }
  144.  
  145.             LayoutItem(i, m_selectedObjects[i] );
  146.         }
  147.  
  148.         // If clear button hasn't shown above (ie: no locked items), show it below
  149.         if ( shownClear == false )
  150.             LayoutClearButton();
  151.  
  152.         EditorGUILayout.EndScrollView();
  153.  
  154.     }
  155.  
  156.     bool LayoutClearButton()
  157.     {
  158.         GUILayout.Space(5);
  159.  
  160.         bool clear = GUILayout.Button("Clear", EditorStyles.miniButton);
  161.         if ( clear )
  162.         {
  163.             for ( int j = m_selectedObjects.Count-1; j >= 0; --j)
  164.             {
  165.                 if ( m_selectedObjects[j].m_locked == false )
  166.                     m_selectedObjects.RemoveAt(j);
  167.             }
  168.         }
  169.  
  170.         GUILayout.Space(5);
  171.         return clear;
  172.     }
  173.  
  174.     void LayoutItem(int i, SelectedObject obj)
  175.     {
  176.  
  177.         // Lazy create and cache lock button style
  178.         if (m_lockButtonStyle == null)
  179.         {
  180.             GUIStyle temp = "IN LockButton";
  181.             m_lockButtonStyle = new GUIStyle(temp);
  182.             m_lockButtonStyle.margin.top = 3;
  183.             m_lockButtonStyle.margin.left = 10;
  184.             m_lockButtonStyle.margin.right = 10;
  185.         }
  186.  
  187.         GUIStyle style = EditorStyles.miniButtonLeft;
  188.         style.alignment = TextAnchor.MiddleLeft;
  189.  
  190.         if (  obj != null && obj.m_object != null)
  191.         {
  192.             GUILayout.BeginHorizontal();
  193.  
  194.  
  195.             bool wasLocked = obj.m_locked;
  196.             obj.m_locked = GUILayout.Toggle( obj.m_locked, GUIContent.none, m_lockButtonStyle);
  197.             if ( wasLocked != obj.m_locked )
  198.             {
  199.  
  200.                 m_selectedObjects.Remove(obj);
  201.                 int firstNonLocked = ( m_selectedObjects.FindIndex(item => item.m_locked == true) );
  202.  
  203.                 if ( firstNonLocked >= 0 )
  204.                 {
  205.                     m_selectedObjects.Insert(firstNonLocked, obj );
  206.                 }
  207.                 else
  208.                 {
  209.                     m_selectedObjects.Add( obj );
  210.                 }
  211.  
  212.             }
  213.  
  214.             /* // Enable "up arrow" that lets you move item to top of list. Not really that useful now there's the "lock"
  215.             if ( GUILayout.Button( "\u25B2", EditorStyles.miniButtonLeft, GUILayout.MaxWidth(20) ) )
  216.             {
  217.                 m_selectedObject = obj;
  218.                 Selection.activeObject = obj.m_object;
  219.  
  220.                 // Move to top
  221.                 m_selectedObjects.Remove(obj);
  222.                 int firstNonLocked = ( m_selectedObjects.FindIndex(item => item.m_locked == true) );
  223.                 if ( obj.m_locked == false && firstNonLocked >= 0 )
  224.                 {
  225.                     m_selectedObjects.Insert(firstNonLocked, obj );
  226.                 }
  227.                 else
  228.                 {
  229.                     m_selectedObjects.Add( obj );
  230.                 }
  231.             }
  232.             */
  233.  
  234.             if ( obj == m_selectedObject )
  235.             {
  236.                 GUI.enabled = false;
  237.             }
  238.  
  239.             string objName = obj.m_object.name;
  240.             if ( obj.m_inScene )
  241.                 objName +=  STRING_INSCENE; // Append string to scene instances to easily tell them apart
  242.             if ( GUILayout.Button( objName, style ) )
  243.             {
  244.                 m_selectedObject = obj;
  245.                 Selection.activeObject = obj.m_object;
  246.             }
  247.  
  248.             GUI.enabled = true;
  249.  
  250.             // Lazy find and cache Search button
  251.             if ( m_searchButtonContent == null )
  252.                 m_searchButtonContent = EditorGUIUtility.IconContent("d_ViewToolZoom");
  253.  
  254.             if ( GUILayout.Button( m_searchButtonContent, EditorStyles.miniButtonRight, GUILayout.MaxWidth(25), GUILayout.MaxHeight(15) ) )
  255.             {
  256.                 EditorGUIUtility.PingObject(obj.m_object);
  257.             }
  258.  
  259.             GUILayout.EndHorizontal();
  260.         }
  261.     }
  262.  
  263.     #endregion
  264.  
  265. }
  266.  
  267. }
RAW Paste Data
Top