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; }
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(); }