public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { if (PeekPlugin.Configuration.enableReferenceInspector && !property.hasMultipleDifferentValues && property.objectReferenceValue != null) { Rect buttonPosition, fieldPosition; if (label != GUIContent.none) { buttonPosition = new Rect ( position.x + EditorGUIUtility.labelWidth - IconSize.Small - 1, position.y, IconSize.Small, IconSize.Small ); fieldPosition = position; } else { buttonPosition = new Rect ( position.xMax - IconSize.Small, position.y + 1, IconSize.Small, IconSize.Small ); fieldPosition = new Rect ( position.x, position.y, position.width - buttonPosition.width - 2, position.height ); } DefaultField(property, label, fieldPosition); var isActive = PopupWatcher.IsOpenOrJustClosed(lastPopup); var activatedButton = LudiqGUI.DropdownToggle(buttonPosition, isActive, LudiqGUIUtility.TempContent(PeekPlugin.Icons.propertyDrawer?[IconSize.Small]), GUIStyle.none); if (activatedButton && !isActive) { PopupWatcher.Release(lastPopup); lastPopup = null; var targets = new[] { property.objectReferenceValue }; var activatorGuiPosition = buttonPosition; var activatorScreenPosition = LudiqGUIUtility.GUIToScreenRect(activatorGuiPosition); if (e.IsContextMouseButton()) { if (property.objectReferenceValue is GameObject go) { GameObjectContextMenu.Open(new[] { go }, activatorScreenPosition); } else { UnityObjectContextMenu.Open(targets, activatorGuiPosition); } } else { lastPopup = EditorPopup.Open(targets, activatorScreenPosition); PopupWatcher.Watch(lastPopup); } } } else { DefaultField(property, label, position); } }
internal static void OnSceneGUI(SceneView sceneView) { if (!PeekPlugin.Configuration.enableCreator.Display(sceneView.maximized)) { return; } if (SceneViewIntegration.used) { return; } try { Profiler.BeginSample("Peek." + nameof(Creator)); var position = sceneView.GetInnerGuiPosition(); var shortcut = PeekPlugin.Configuration.creatorShortcut; var preview = shortcut.Preview(e); var activate = shortcut.Check(e); if (position.Contains(e.mousePosition) && (preview || activate)) { Handles.BeginGUI(); var filter = ProbeFilter.@default; filter.proBuilder = false; // Too slow and useless here anyway var hit = Probe.Pick(filter, sceneView, e.mousePosition, out var point); if (preview) { var createIndicatorStyle = LudiqStyles.CommandButton(true, true); var createIndicatorContent = LudiqGUIUtility.TempContent(PeekPlugin.Icons.createGameObjectOptions?[IconSize.Small]); var createIndicatorSize = createIndicatorStyle.CalcSize(createIndicatorContent); var createIndicatorPosition = new Rect ( e.mousePosition.x - (createIndicatorSize.x / 2), e.mousePosition.y + Styles.indicatorMargin, createIndicatorSize.x, createIndicatorSize.y ); GUI.Label ( createIndicatorPosition, createIndicatorContent, createIndicatorStyle ); } if (activate) { var activatorPosition = new Rect(e.mousePosition, Vector2.zero); activatorPosition.width = 220; activatorPosition = LudiqGUIUtility.GUIToScreenRect(activatorPosition); // Delay closure allocations var _hit = hit; var _point = point; var _sceneView = sceneView; LudiqGUI.FuzzyDropdown ( activatorPosition, new CreateGameObjectOptionTree(), null, (_instance) => { var instance = (GameObject)_instance; var is2D = instance.GetComponent <RectTransform>() != null || instance.GetComponent <SpriteRenderer>() != null; if (_hit != null) { instance.transform.SetParent(_hit.Value.transform.parent, true); } instance.transform.position = _point; if (!is2D && PeekPlugin.Configuration.createOnBounds && instance.CalculateBounds(out var bounds, Space.World, true, false, false, false, false)) { var difference = _point.y - bounds.min.y; instance.transform.position += difference * Vector3.up; } Selection.activeGameObject = instance; if (_hit == null && !_sceneView.in2DMode) { _sceneView.FrameSelected(); } } ); FuzzyWindow.instance.Focus(); e.Use(); }
public static void Draw(bool drawIcon, ToolbarControlProvider toolbarControlProvider, UnityObject target, UnityObject[] targets, bool isSelected, string label, Rect contentPosition, Rect rowPosition, bool hasFocus) { var isHovered = rowPosition.Contains(Event.current.mousePosition); try { // TODO: We can hook into AssetsTreeViewGUI.postAssetIconDrawCallback // to draw under the VCS integration icons var leftPadding = 0; if (toolbarControlProvider.window == ToolbarWindow.Project) { if (UnityEditor.VersionControl.Provider.enabled) { leftPadding = 9; } else { leftPadding = 2; } } var iconPosition = new Rect ( contentPosition.x + leftPadding, contentPosition.y, IconSize.Small, IconSize.Small ); if (drawIcon) { if (PeekPlugin.Configuration.enablePreviewIcons && PreviewUtility.TryGetPreview(target, out var preview) && preview != null) { GUI.DrawTexture(iconPosition, preview); if (target is GameObject gameObject && PrefabUtility.IsAddedGameObjectOverride(gameObject)) { GUI.DrawTexture(iconPosition, PeekPlugin.Icons.prefabOverlayAdded?[(int)iconPosition.width]); } } } if (isHovered || isSelected) { var toolbar = ObjectToolbarProvider.GetToolbar(targets); if (!toolbar.isValid) { return; } toolbar.Update(); var toolbarControl = toolbarControlProvider.GetControl(toolbar, target); toolbarControl.DrawMainToolInTreeView(iconPosition, contentPosition); var nameWidth = EditorStyles.label.CalcSize(LudiqGUIUtility.TempContent(label)).x; var maxStripWidth = contentPosition.width - nameWidth - IconSize.Small; var desiredStripWidth = toolbarControl.GetTreeViewWidth(); var stripWidth = Mathf.Min(desiredStripWidth, maxStripWidth); float stripX; switch (PeekPlugin.Configuration.treeViewToolbarAlignment) { case TreeViewToolbarAlignment.Left: stripX = iconPosition.xMax + nameWidth; break; case TreeViewToolbarAlignment.Right: stripX = contentPosition.xMax - stripWidth; break; default: throw PeekPlugin.Configuration.treeViewToolbarAlignment.Unexpected(); } var stripPosition = new Rect ( stripX, contentPosition.y, stripWidth, contentPosition.height ); toolbarControl.guiPosition = stripPosition; toolbarControl.DrawInTreeView(contentPosition, isSelected && hasFocus); } } catch (Exception ex) { Debug.LogException(ex); } }