private void OnGUI() { GUI.depth = -100; //handle assembly reload causing drawer to go null, resulting in null reference exceptions if (drawer == null) { Close(); return; } var preferences = inspector.Preferences; DrawGUI.BeginOnGUI(preferences, true); bool addedComponent = false; EditorGUI.BeginChangeCheck(); { if (drawer.OnGUI(ref addedComponent)) { GUI.changed = true; Repaint(); isDirty = 3; } } if (EditorGUI.EndChangeCheck()) { isDirty = 3; } if (addedComponent) { Close(); return; } if (isDirty > 0) { GUI.changed = true; Repaint(); } var rect = position; rect.x = 0f; rect.y = 0f; DrawGUI.DrawRect(rect, preferences.theme.ComponentSeparatorLine); }
/// <inheritdoc cref="IDrawer.DrawSelectionRect" /> public override void DrawSelectionRect() { //when editing text field we use the internally created selection rect if (!DrawGUI.EditingTextField || !Inspector.InspectorDrawer.HasFocus) { var rect = controlLastDrawPosition; rect.yMin += 1f; rect.height -= 1f; var theme = InspectorUtility.Preferences.theme; var color = Inspector.InspectorDrawer.HasFocus ? theme.ControlSelectedRect : theme.ControlSelectedUnfocusedRect; DrawGUI.DrawRect(rect, color, localDrawAreaOffset); } base.DrawSelectionRect(); }
/// <inheritdoc /> public sealed override void DrawSelectionRect() { //when editing text field we use the internally created selection rect if (!DrawGUI.EditingTextField && HasNumberField) { var rect = NumberFieldPosition; rect.yMin += 1f; rect.height -= 1f; DrawGUI.DrawRect(rect, InspectorUtility.Preferences.theme.ControlSelectedRect, localDrawAreaOffset); } if (IsFullInspectorWidth) { DrawGUI.DrawSelectionRect(SelectionRect, localDrawAreaOffset); } }
private bool Draw(ref bool menuItemWasClicked) { if (instance == null) { return(false); } #if DEV_MODE || PROFILE_POWER_INSPECTOR Profiler.BeginSample("PopupMenu.Draw"); #endif PopupMenuItemUtility.drawWithFullPath = filter.Length > 0; bool dirty = false; var e = Event.current; //using raw type, since we consume all click events var eventType = e.rawType; bool lmbClick = eventType == EventType.MouseDown && e.button == 0; bool mmbClick = eventType == EventType.MouseDown && e.button == 2; if (clearingText) { if (eventType == EventType.Layout) { clearingText = false; } GUI.changed = true; dirty = true; } else { if (!DrawGUI.EditingTextField) { DrawGUI.EditingTextField = true; GUI.changed = true; dirty = true; } if (!string.Equals(GUI.GetNameOfFocusedControl(), ControlName)) { DrawGUI.FocusControl(ControlName); GUI.changed = true; dirty = true; } } if (DrawFilterField()) { dirty = true; } DrawGUI.Active.ColorRect(headerRect, BgColorNavigationBar); bool hasFilter = FilterString.Length > 0; bool drawBackArrow = !hasFilter && activeGroup != null; bool drawLabelField = currentViewLabel.text.Length > 0; if (drawBackArrow || drawLabelField) { if (drawBackArrow) { GUI.Label(backArrowRect, GUIContent.none, "AC LeftArrow"); if (lmbClick && backArrowRect.Contains(e.mousePosition)) { goBackLevelNextLayout = true; dirty = true; } } DrawGUI.DrawRect(headerRect, new Color32(24, 24, 24, 255), localDrawAreaOffset); if (drawLabelField) { GUI.Label(headerLabelRect, currentViewLabel, InspectorPreferences.Styles.PopupMenuTitle); } GUI.DrawTexture(dividerRect, InspectorUtility.Preferences.graphics.horizontalSplitterBg); } #if DEV_MODE && PI_ASSERTATIONS Debug.Assert(contentRect.x == 0f, "contentRect.x=" + contentRect.x); Debug.Assert(contentRect.y == 0f, "contentRect.y=" + contentRect.y); Debug.Assert(contentRect.height == currentViewItemCount * DrawGUI.SingleLineHeight, "contentRect.height=" + contentRect.height + ", currentViewItemCount=" + currentViewItemCount); Debug.Assert(currentViewItemCount == currentViewItems.Count, "currentViewItemCount=" + currentViewItemCount + ", currentViewItems.Count=" + currentViewItems.Count); Debug.Assert(viewRect.height == contentRect.height || viewRect.height == ScrollAreaMaxHeight, "viewRect.height (" + viewRect.height + ") != contentRect.height (" + contentRect.height + ") NOR ScrollAreaMaxHeight (" + ScrollAreaMaxHeight + ")"); #endif var setScrollPos = GUI.BeginScrollView(viewRect, scrollPos, contentRect); { if (setScrollPos.y != scrollPos.y) { SetScrollPos(setScrollPos.y, true); dirty = true; } var memberRect = contentRect; DrawGUI.Active.ColorRect(memberRect, BgColor); memberRect.height = DrawGUI.SingleLineHeight; //only start drawing from first visible member memberRect.y += firstVisibleIndex * DrawGUI.SingleLineHeight; int last = lastVisibleIndex; if (last >= currentViewItemCount) { #if DEV_MODE Debug.LogWarning(ToString() + " - last (" + last + ") >= visibleCount (" + (lastVisibleIndex - firstVisibleIndex + 1) + ") with firstVisibleIndex=" + firstVisibleIndex + " and lastVisibleIndex=" + lastVisibleIndex); #endif last = currentViewItemCount - 1; } for (int n = firstVisibleIndex; n <= last; n++) { var item = currentViewItems[n]; bool selected = n == selectedMemberIndex; if (selected) { DrawGUI.Active.ColorRect(memberRect, InspectorUtility.Preferences.theme.BackgroundSelected); } if (memberRect.Contains(e.mousePosition)) { if (!selected) { SetSelectedMember(n, false); dirty = true; } if (lmbClick) { dirty = true; if (item.IsGroup) { SetActiveItem(item); break; } menuItemWasClicked = true; inspector.OnNextLayout(() => OnMenuItemClicked(item)); break; } if (mmbClick) { if (item.IsGroup) { var unityObjects = item.children.Select(menuItem => menuItem.IdentifyingObject as Object).ToArray(); if (unityObjects.Length > 0) { DrawGUI.Ping(unityObjects); } } else { var itemValue = item.IdentifyingObject; var unityObject = itemValue as Object; if (unityObject != null) { DrawGUI.Ping(unityObject); } var unityObjects = itemValue as Object[]; if (unityObjects != null) { DrawGUI.Ping(unityObjects); } } } } if (PopupMenuItemUtility.Draw(memberRect, selectedMemberIndex == n, item)) { #if DEV_MODE Debug.Log(GetType().Name + " - member " + item + " clicked with eventType " + eventType + "! (member returned true)"); #endif dirty = true; if (item.IsGroup) { SetActiveItem(item); break; } menuItemWasClicked = true; inspector.OnNextLayout(() => OnMenuItemClicked(item)); DrawGUI.Use(e); break; } if (!item.IsGroup) { bool ticked = tickedItems != null && tickedItems.Contains(item); var toggleRect = memberRect; toggleRect.width = 16f; toggleRect.x += memberRect.width - toggleRect.width; if (canTickMultiple) { bool setTicked = GUI.Toggle(toggleRect, ticked, GUIContent.none, InspectorUtility.Preferences.GetStyle("OL Toggle")); if (setTicked != ticked) { if (ticked) { tickedItems.Add(item); } else { tickedItems.Remove(item); } menuItemWasClicked = true; inspector.OnNextLayout(() => OnMenuItemClicked(item)); DrawGUI.Use(e); break; } } else if (ticked) { GUI.Toggle(toggleRect, true, GUIContent.none, InspectorUtility.Preferences.GetStyle("OL Toggle")); } } GUI.enabled = true; memberRect.y += DrawGUI.SingleLineHeight; } ///after visible part, count * DrawGUI.singleLineHeight GUI.EndScrollView(); } #if DEV_MODE || PROFILE_POWER_INSPECTOR Profiler.EndSample(); #endif return(dirty); }
/// <inheritdoc/> public override bool DrawPrefix(Rect position) { if (Event.current.type == EventType.Repaint) { //hide prefix resizer line behind the field EditorGUI.DrawRect(lastDrawPosition, DrawGUI.Active.InspectorBackgroundColor); if (backgroundRect.width > 0f) { GUI.Label(backgroundRect, "", InspectorPreferences.Styles.MethodBackground); } } bool drawBackgroundBehindFoldoutsWas = DrawGUI.drawBackgroundBehindFoldouts; DrawGUI.drawBackgroundBehindFoldouts = false; var prefixDrawRect = PrefixLabelPosition; var clipLabelInsideRect = prefixDrawRect; clipLabelInsideRect.width += clipLabelInsideRect.x; clipLabelInsideRect.x = 0f; prefixDrawRect.y = 0f; //use BeginArea to prevent foldout text clipping past the Button GUILayout.BeginArea(clipLabelInsideRect); bool dirty = base.DrawPrefix(prefixDrawRect); GUILayout.EndArea(); DrawGUI.drawBackgroundBehindFoldouts = drawBackgroundBehindFoldoutsWas; if (GUI.Button(buttonRect, buttonLabel, Style)) { DrawGUI.UseEvent(); if (Event.current.button == 0) { dirty = true; Select(ReasonSelectionChanged.ControlClicked); Invoke(); } else if (Event.current.button == 1) { var menu = Menu.Create(); menu.Add(Menu.Item("Invoke", () => Invoke(false, false, false, false))); if (hasReturnValue) { #if !POWER_INSPECTOR_LITE menu.AddSeparator(); menu.Add(Menu.Item("Copy Return Value", () => Invoke(false, false, true, false))); #endif if (UnityObjectExtensions.IsUnityObjectOrUnityObjectCollectionType(Type)) { menu.Add(Menu.Item("Ping Return Value", () => Invoke(true, false, false, false))); menu.Add(Menu.Item("Select Return Value", () => Invoke(false, false, false, true))); } } if (isCoroutine) { bool addedSeparator = false; var monoBehaviour = UnityObject as MonoBehaviour; string methodName = MethodInfo.Name; if (monoBehaviour != null && Application.isPlaying) { menu.AddSeparator(); addedSeparator = true; menu.Add("Invoke Repeating/Every Second", () => monoBehaviour.InvokeRepeating(methodName, 1f, 1f)); menu.Add("Invoke Repeating/Every 5 Seconds", () => monoBehaviour.InvokeRepeating(methodName, 5f, 5f)); menu.Add("Invoke Repeating/Every 10 Seconds", () => monoBehaviour.InvokeRepeating(methodName, 10f, 10f)); } if (IsInvoking()) { if (!addedSeparator) { menu.AddSeparator(); } menu.Add("Stop Coroutine", () => monoBehaviour.StopCoroutine(methodName)); menu.Add("Cancel Invoke", () => monoBehaviour.CancelInvoke(methodName)); } } ContextMenuUtility.Open(menu, this); } else if (Event.current.button == 2) { Invoke(true, false, true, false); } } if (IsInvoking()) { var buttonUnderlineRect = buttonRect; buttonUnderlineRect.x += 1f; buttonUnderlineRect.y += buttonUnderlineRect.height - 3f; buttonUnderlineRect.width -= 2f; buttonUnderlineRect.height = 2f; DrawGUI.DrawRect(buttonUnderlineRect, Color.green); } return(dirty); }
private bool Draw(ref bool addedComponent) { if (instance == null) { return(false); } bool dirty = false; var e = Event.current; //using raw type, since we consume all click events var eventType = e.rawType; bool lmbClick = eventType == EventType.MouseDown && e.button == 0; if (clearingText) { if (eventType == EventType.Layout) { clearingText = false; } GUI.changed = true; dirty = true; } else { if (!DrawGUI.EditingTextField) { DrawGUI.EditingTextField = true; GUI.changed = true; dirty = true; } if (!string.Equals(GUI.GetNameOfFocusedControl(), ControlName)) { DrawGUI.FocusControl(ControlName); GUI.changed = true; dirty = true; } } if (DrawFilterField()) { dirty = true; } DrawGUI.Active.ColorRect(headerRect, BgColorNavigationBar); #if UNITY_EDITOR GUI.Label(createScriptButtonRect, GUIContent.none, "OL Plus"); if (lmbClick && createScriptButtonRect.Contains(Event.current.mousePosition)) { dirty = true; openCreateNewScriptViewNextLayout = true; } #endif bool hasFilter = FilterString.Length > 0; if (!hasFilter && activeItem != null) { GUI.Label(backArrowRect, GUIContent.none, "AC LeftArrow"); if (lmbClick && backArrowRect.Contains(Event.current.mousePosition)) { #if UNITY_EDITOR if (!openCreateNewScriptViewNextLayout) #endif { goBackLevelNextLayout = true; dirty = true; } } } DrawGUI.DrawRect(headerRect, new Color32(24, 24, 24, 255), localDrawAreaOffset); GUI.Label(headerLabelRect, categoryLabel, InspectorPreferences.Styles.PopupMenuTitle); GUI.DrawTexture(dividerRect, InspectorUtility.Preferences.graphics.horizontalSplitterBg); var setScrollPos = GUI.BeginScrollView(viewRect, scrollPos, contentRect); { if (setScrollPos.y != scrollPos.y) { SetScrollPos(setScrollPos.y, true); dirty = true; } var memberRect = contentRect; DrawGUI.Active.ColorRect(memberRect, BgColor); memberRect.height = DrawGUI.SingleLineHeight; //only start drawing from first visible member memberRect.y += firstVisibleIndex * DrawGUI.SingleLineHeight; int last = lastVisibleIndex - firstVisibleIndex; int visibleCount = visibleMembers.Length; if (last >= visibleCount) { #if DEV_MODE Debug.LogWarning(ToString() + " - last (" + last + ") >= visibleCount (" + visibleCount + ") with firstVisibleIndex=" + firstVisibleIndex + " and lastVisibleIndex=" + lastVisibleIndex); #endif last = visibleCount - 1; } for (int n = 0; n <= last; n++) { int memberIndex = firstVisibleIndex + n; //TEMP if (last >= visibleMembers.Length) { #if DEV_MODE Debug.LogError("n=" + n + ", last=" + last + ", visibleMembers.Length=" + visibleMembers.Length + ", "); #endif break; } var member = visibleMembers[n]; bool selected = memberIndex == selectedComponentIndex; if (selected) { DrawGUI.Active.ColorRect(memberRect, InspectorUtility.Preferences.theme.BackgroundSelected); } if (memberRect.Contains(e.mousePosition)) { if (memberIndex != selectedComponentIndex) { SetSelectedMember(memberIndex, false); dirty = true; } if (lmbClick) { var type = member.Type; #if DEV_MODE Debug.Log(GetType().Name + " - member " + member.Label.text + " clicked! (custom detection)"); #endif dirty = true; if (type == null) { SetActiveItem((member as AddComponentMenuItemDrawer).Item); break; } addedComponent = true; inspector.OnNextLayout(() => AddComponent(type)); break; } } if (visibleMembersHaveConflicts[n]) { GUI.enabled = false; } if (member.Draw(memberRect)) { var type = member.Type; #if DEV_MODE Debug.Log(GetType().Name + " - member " + member.Label.text + " clicked with eventType " + eventType + "! (member returned true)"); #endif dirty = true; if (type == null) { SetActiveItem((member as AddComponentMenuItemDrawer).Item); break; } addedComponent = true; inspector.OnNextLayout(() => AddComponent(type)); DrawGUI.Use(e); break; } GUI.enabled = true; memberRect.y += DrawGUI.SingleLineHeight; } GUI.EndScrollView(); } return(dirty); }