Esempio n. 1
0
        private void OnGUI()
        {
            if (activeClipboardBackgroundStyle == null)
            {
                Texture2D background = new Texture2D(1, 1);
                background.SetPixel(0, 0, activeClipboardColor);
                background.Apply(false, true);

                activeClipboardBackgroundStyle = new GUIStyle();
                activeClipboardBackgroundStyle.normal.background   = background;
                activeClipboardBackgroundStyle.onNormal.background = background;
            }

            Event ev = Event.current;

            bool  originalWideMode   = EditorGUIUtility.wideMode;
            float originalLabelWidth = EditorGUIUtility.labelWidth;

            float windowWidth = position.width;

            EditorGUIUtility.wideMode   = windowWidth > 330f;
            EditorGUIUtility.labelWidth = windowWidth < 350f ? 130f : windowWidth * 0.4f;

            EditorGUILayout.HelpBox("The highlighted value will be used in Paste operations. You can right click a value to set it active or remove it. Note that changing these values here won't affect the source objects.", MessageType.None);

            scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition);

            for (int i = 0; i < clipboard.Count; i++)
            {
                if (clipboard[i] == null || clipboard[i].Equals(null))
                {
                    RemoveClipboard(i--);
                    continue;
                }

                if (activeClipboardIndex == i)
                {
                    GUILayout.BeginHorizontal(activeClipboardBackgroundStyle);
                }

                if (clipboard[i] is Object)
                {
                    clipboard[i] = EditorGUILayout.ObjectField(clipboardLabels[i], clipboard[i] as Object, typeof(Object), true);
                }
                else if (clipboard[i] is long)
                {
                    clipboard[i] = EditorGUILayout.LongField(clipboardLabels[i], (long)clipboard[i]);
                }
                else if (clipboard[i] is double)
                {
                    clipboard[i] = EditorGUILayout.DoubleField(clipboardLabels[i], (double)clipboard[i]);
                }
                else if (clipboard[i] is Color)
                {
                    clipboard[i] = EditorGUILayout.ColorField(clipboardLabels[i], (Color)clipboard[i]);
                }
                else if (clipboard[i] is string)
                {
                    clipboard[i] = EditorGUILayout.TextField(clipboardLabels[i], (string)clipboard[i]);
                }
                else if (clipboard[i] is bool)
                {
                    clipboard[i] = EditorGUILayout.Toggle(clipboardLabels[i], (bool)clipboard[i]);
                }
                else if (clipboard[i] is AnimationCurve)
                {
                    clipboard[i] = EditorGUILayout.CurveField(clipboardLabels[i], (AnimationCurve)clipboard[i]);
                }
                else if (clipboard[i] is Gradient)
                {
                    clipboard[i] = gradientField.Invoke(null, new object[] { clipboardLabels[i], clipboard[i], null });
                }
                else if (clipboard[i] is CLVector)
                {
                    clipboard[i] = (CLVector)EditorGUILayout.Vector4Field(clipboardLabels[i], (CLVector)clipboard[i]);
                }
                else if (clipboard[i] is CLArray)
                {
                    CLArray obj = (CLArray)clipboard[i];
                    GUI.enabled = false;
                    EditorGUILayout.TextField(clipboardLabels[i], string.Concat(obj.elementType, "[", obj.size, "] array"));
                    GUI.enabled = true;
                }
                else if (clipboard[i] is CLGeneric)
                {
                    GUI.enabled = false;
                    EditorGUILayout.TextField(clipboardLabels[i], ((CLGeneric)clipboard[i]).type + " object");
                    GUI.enabled = true;
                }

                if (activeClipboardIndex == i)
                {
                    GUILayout.EndHorizontal();
                }

                if (ev.type == EventType.MouseDown && ev.button == 0 && GUILayoutUtility.GetLastRect().Contains(ev.mousePosition))
                {
                    activeClipboardIndex = i;
                    Repaint();
                    ev.Use();
                }
                else if (ev.type == EventType.ContextClick && GUILayoutUtility.GetLastRect().Contains(ev.mousePosition))
                {
                    int j = i;

                    GenericMenu menu = new GenericMenu();
                    menu.AddItem(new GUIContent("Copy"), false, SetActiveClipboard, j);
                    menu.AddItem(new GUIContent("Remove"), false, RemoveClipboard, j);
                    menu.ShowAsContext();

                    GUIUtility.keyboardControl = 0;
                }
            }

            EditorGUILayout.EndScrollView();

            if ((ev.type == EventType.DragPerform || ev.type == EventType.DragUpdated) && GUILayoutUtility.GetLastRect().Contains(ev.mousePosition))
            {
                // Accept drag&drop
                DragAndDrop.visualMode = DragAndDropVisualMode.Copy;
                if (ev.type == EventType.DragPerform)
                {
                    DragAndDrop.AcceptDrag();

                    Object[] draggedObjects = DragAndDrop.objectReferences;
                    for (int i = 0; i < draggedObjects.Length; i++)
                    {
                        AddToClipboard(draggedObjects[i], "DRAG&DROP");
                    }
                }

                ev.Use();
            }
            else if (ev.type == EventType.KeyDown)
            {
                // KeyCode.Delete won't be captured by PasteBinWindow if an ObjectField has keyboard focus, therefore
                // there are some "GUIUtility.keyboardControl = 0;" calls here and there to remove keyboard focus
                if (ev.keyCode == KeyCode.Delete)
                {
                    RemoveClipboard(activeClipboardIndex);
                    Repaint();
                    ev.Use();
                }
                else if (ev.keyCode == KeyCode.UpArrow)
                {
                    activeClipboardIndex       = Mathf.Max(0, activeClipboardIndex - 1);
                    GUIUtility.keyboardControl = 0;
                    Repaint();
                    ev.Use();
                }
                else if (ev.keyCode == KeyCode.DownArrow)
                {
                    activeClipboardIndex       = Mathf.Min(clipboard.Count - 1, activeClipboardIndex + 1);
                    GUIUtility.keyboardControl = 0;
                    Repaint();
                    ev.Use();
                }
            }

            EditorGUIUtility.wideMode   = originalWideMode;
            EditorGUIUtility.labelWidth = originalLabelWidth;
        }
Esempio n. 2
0
        public static void DrawClipboardOnGUI(SerializedClipboard clipboard, object clipboardValue, bool isActiveClipboard, bool showTooltip)
        {
            if (clipboardLabelGUIStyle == null)
            {
                clipboardLabelGUIStyle = new GUIStyle(EditorStyles.boldLabel)
                {
                    wordWrap = true
                }
            }
            ;

            if (!isActiveClipboard)
            {
                GUILayout.BeginVertical(PasteBinTooltip.Style);
            }
            else
            {
                Color backgroundColor = GUI.backgroundColor;
                GUI.backgroundColor = Color.Lerp(backgroundColor, ACTIVE_CLIPBOARD_COLOR, 0.5f);
                GUILayout.BeginVertical(PasteBinTooltip.Style);
                GUI.backgroundColor = backgroundColor;
            }

            if (showTooltip)
            {
                EditorGUILayout.LabelField(clipboard.LabelContent, clipboardLabelGUIStyle);
            }
            else
            {
                EditorGUILayout.LabelField(clipboard.Label, clipboardLabelGUIStyle);
            }

            EditorGUI.indentLevel++;

            if (clipboardValue == null || clipboardValue.Equals(null) || clipboardValue is Object)
            {
                EditorGUILayout.ObjectField(GUIContent.none, clipboardValue as Object, typeof(Object), true);
            }
            else if (clipboardValue is long)
            {
                EditorGUILayout.TextField(GUIContent.none, ((long)clipboardValue).ToString());
            }
            else if (clipboardValue is double)
            {
                EditorGUILayout.TextField(GUIContent.none, ((double)clipboardValue).ToString());
            }
            else if (clipboardValue is Color)
            {
                EditorGUILayout.ColorField(GUIContent.none, (Color)clipboardValue);
            }
            else if (clipboardValue is string)
            {
                EditorGUILayout.TextField(GUIContent.none, (string)clipboardValue);
            }
            else if (clipboardValue is bool)
            {
                EditorGUILayout.Toggle(GUIContent.none, (bool)clipboardValue);
            }
            else if (clipboardValue is AnimationCurve)
            {
                EditorGUILayout.CurveField(GUIContent.none, (AnimationCurve)clipboardValue);
            }
            else if (clipboardValue is Gradient)
            {
                gradientField.Invoke(null, new object[] { GUIContent.none, clipboardValue, null });
            }
            else if (clipboardValue is VectorClipboard)
            {
                EditorGUILayout.Vector4Field(GUIContent.none, (VectorClipboard)clipboardValue);
            }
            else if (clipboardValue is ArrayClipboard)
            {
                ArrayClipboard obj = (ArrayClipboard)clipboardValue;
                EditorGUILayout.TextField(GUIContent.none, string.Concat(obj.elementType, "[", obj.elements.Length, "] array"));
            }
            else if (clipboardValue is GenericObjectClipboard)
            {
                EditorGUILayout.TextField(GUIContent.none, ((GenericObjectClipboard)clipboardValue).type + " object");
            }
            else if (clipboardValue is ManagedObjectClipboard)
            {
                EditorGUILayout.TextField(GUIContent.none, ((ManagedObjectClipboard)clipboardValue).type + " object (SerializeField)");
            }
            else if (clipboardValue is GameObjectHierarchyClipboard)
            {
                EditorGUILayout.TextField(GUIContent.none, ((GameObjectHierarchyClipboard)clipboardValue).name + " (Complete GameObject)");
            }
            else if (clipboardValue is AssetFilesClipboard)
            {
                EditorGUILayout.TextField(GUIContent.none, ((AssetFilesClipboard)clipboardValue).paths[0] + " (Asset File)");
            }
            else
            {
                EditorGUILayout.TextField(GUIContent.none, clipboard.RootValue.GetType().Name + " object");
            }

            EditorGUI.indentLevel--;
            GUILayout.EndVertical();
        }