Пример #1
0
        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
                }
            }
        }
Пример #2
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        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);
        }