public static void HandleFieldFocus(string id, ref int focusField) { if (focusField > 0) { // Trigger a Layout event. GUI.changed = true; GUI.SetNextControlName(id); if (Event.current.type == EventType.Layout) { // Only call FocusControl at the lastest possible moment to prevent issue where keyboard focus would visibly jump between multiple controls. if (focusField == 1) { DrawGUI.FocusControl(id); } focusField--; #if DEV_MODE && DEBUG_FOCUS_FIELD Debug.Log(StringUtils.ToColorizedString("focusing field " + id + ", repeats=", focusField, ", Event=", StringUtils.ToString(Event.current))); #endif } } }
public static void HandleFieldFocusAndStartEditing(int controlID, ref bool editField, ref int focusField) { if (focusField > 0) { #if DEV_MODE Debug.Assert(!InspectorUtility.ActiveManager.HasMultiSelectedControls); #endif // Trigger a Layout event. GUI.changed = true; if (editField) { string id = StringUtils.ToString(controlID); GUI.SetNextControlName(id); // Only call FocusControl and EditingTextField at the lastest possible moment // to prevent issue where keyboard focus would visibly jump between multiple controls. if (Event.current.type == EventType.Layout && focusField == 1) { DrawGUI.FocusControl(id); DrawGUI.EditingTextField = true; } } else { KeyboardControlUtility.KeyboardControl = 0; } if (Event.current.type == EventType.Layout) { focusField--; if (focusField == 0) { editField = false; } #if DEV_MODE && (DEBUG_EDIT_FIELD || DEBUG_FOCUS_FIELD) Debug.Log(StringUtils.ToColorizedString("focusing field " + controlID + " with editField=", editField, ", repeats=", focusField, ", Event=", StringUtils.ToString(Event.current))); #endif } } }
private bool Draw(ref bool addedComponent) { if (instance == null) { return(false); } bool dirty = false; GUI.Label(headerLabelRect, categoryLabel, InspectorPreferences.Styles.PopupMenuTitle); #if UNITY_EDITOR if (GUI.Button(createScriptButtonRect, GUIContent.none, InspectorPreferences.Styles.Blank)) { dirty = true; openCreateNewScriptViewNextLayout = true; } #endif bool hasFilter = FilterString.Length > 0; bool hasBackArrow = !hasFilter && activeItem != null; if (hasBackArrow && GUI.Button(backArrowRect, GUIContent.none, InspectorPreferences.Styles.Blank)) { #if UNITY_EDITOR if (!openCreateNewScriptViewNextLayout) #endif { goBackLevelNextLayout = true; dirty = true; } } if (DrawFilterField()) { dirty = true; } 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; } var mousePos = Event.current.mousePosition; 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(mousePos)) { if (memberIndex != selectedComponentIndex) { SetSelectedMember(memberIndex, false); dirty = true; } } if (visibleMembersHaveConflicts[n]) { GUI.enabled = false; } if (member.Draw(memberRect)) { switch (Event.current.button) { case 0: break; case 1: member.OpenContextMenu(Event.current, memberRect, true, Part.Base); return(true); case 2: var script = FileUtility.FindScriptFile(member.Type); if (script != null) { DrawGUI.Active.PingObject(script); } return(true); default: return(false); } var type = member.Type; dirty = true; var itemDrawer = member as AddComponentMenuItemDrawer; if (type == null) { SetActiveItem(itemDrawer.Item); break; } addedComponent = true; if (itemDrawer.nameBy) { string setName = StringUtils.SplitPascalCaseToWords(type.Name); var gameObjectDrawers = inspector.State.drawers.Members; for (int d = gameObjectDrawers.Length - 1; d >= 0; d--) { var gameObjectDrawer = gameObjectDrawers[d] as IGameObjectDrawer; if (gameObjectDrawer != null) { var gameObjects = gameObjectDrawer.GameObjects; for (int g = gameObjectDrawers.Length - 1; g >= 0; g--) { var gameObject = gameObjects[g]; gameObject.name = setName; } } } } inspector.OnNextLayout(() => AddComponent(type)); if (Event.current.type == EventType.MouseDown) { DrawGUI.Use(Event.current); } break; } GUI.enabled = true; memberRect.y += DrawGUI.SingleLineHeight; } GUI.EndScrollView(); } if (clearingText) { if (Event.current.type == 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 (hasBackArrow) { DrawGUI.Active.ColorRect(backArrowBgRect, BgColorNavigationBar); DrawGUI.Active.AddCursorRect(backArrowRect, MouseCursor.Link); GUI.Label(backArrowRect, GUIContent.none, backArrowStyle); } #if UNITY_EDITOR DrawGUI.Active.ColorRect(createScriptBgRect, BgColorNavigationBar); DrawGUI.Active.AddCursorRect(createScriptButtonRect, MouseCursor.Link); GUI.Label(createScriptButtonRect, GUIContent.none, createNewStyle); #endif DrawGUI.DrawLine(dividerRect1, InspectorUtility.Preferences.theme.ComponentSeparatorLine); DrawGUI.DrawLine(dividerRect2, InspectorUtility.Preferences.theme.ComponentSeparatorLine); return(dirty); }
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); }
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); }