예제 #1
0
        private void ProcessShowRequest(ShowRequest request)
        {
            if (state.CurrentRefChain != null && request.AddChainToHistory)
            {
                state.RefChainHistory.Add(state.CurrentRefChain);
            }

            if (request.HideUnrelatedSceneRoots)
            {
                sceneTreeScrollPosition = Vector2.zero;
                sceneRoots.Clear();
                ClearExpanded();
            }

            searchDisplayString = request.UpdatedSearchString;
            ReferenceChain currentRefChain = null;
            var            singleRefChain  = request.ReferenceChains.Count == 1;

            foreach (var refChain in request.ReferenceChains)
            {
                var rootGameObject = (GameObject)refChain.GetChainItem(0);
                if (!sceneRoots.ContainsKey(rootGameObject))
                {
                    sceneRoots.Add(rootGameObject, true);
                }

                var expandedRefChain = ReferenceChainBuilder.ForGameObject(rootGameObject);
                if (!state.ExpandedGameObjects.Contains(expandedRefChain.UniqueId))
                {
                    state.ExpandedGameObjects.Add(expandedRefChain.UniqueId);
                }

                if (!singleRefChain)
                {
                    continue;
                }

                for (var i = 1; i < refChain.Length; i++)
                {
                    var breakLoop = false;
                    switch (refChain.GetChainItemType(i))
                    {
                    case ReferenceChain.ReferenceType.GameObject:
                        var go = (GameObject)refChain.GetChainItem(i);
                        expandedRefChain = expandedRefChain.Add(go);
                        if (!state.ExpandedGameObjects.Contains(expandedRefChain.UniqueId))
                        {
                            state.ExpandedGameObjects.Add(expandedRefChain.UniqueId);
                        }

                        break;

                    case ReferenceChain.ReferenceType.Component:
                        var component = (Component)refChain.GetChainItem(i);
                        expandedRefChain = expandedRefChain.Add(component);
                        if (currentRefChain != null)
                        {
                            breakLoop = true;
                        }

                        break;

                    case ReferenceChain.ReferenceType.Field:
                        var field = (FieldInfo)refChain.GetChainItem(i);
                        expandedRefChain = expandedRefChain.Add(field);
                        if (!state.ExpandedObjects.Contains(expandedRefChain.UniqueId))
                        {
                            state.ExpandedObjects.Add(expandedRefChain.UniqueId);
                        }

                        break;

                    case ReferenceChain.ReferenceType.Property:
                        var property = (PropertyInfo)refChain.GetChainItem(i);
                        expandedRefChain = expandedRefChain.Add(property);
                        if (!state.ExpandedObjects.Contains(expandedRefChain.UniqueId))
                        {
                            state.ExpandedObjects.Add(expandedRefChain.UniqueId);
                        }

                        break;

                    case ReferenceChain.ReferenceType.EnumerableItem:
                        var  index = (uint)refChain.GetChainItem(i);
                        uint startIndex;
                        if (state.SelectedArrayStartIndices.TryGetValue(expandedRefChain.UniqueId, out startIndex))
                        {
                            startIndex = Math.Min(index, startIndex);
                        }
                        else if (index > 16)
                        {
                            startIndex = index - 16;
                        }
                        else
                        {
                            startIndex = 0;
                        }

                        uint endIndex;
                        if (state.SelectedArrayEndIndices.TryGetValue(expandedRefChain.UniqueId, out endIndex))
                        {
                            endIndex = Math.Max(index, endIndex);
                        }
                        else
                        {
                            endIndex = startIndex + 31;
                        }

                        state.SelectedArrayStartIndices[expandedRefChain.UniqueId] = startIndex;
                        state.SelectedArrayEndIndices[expandedRefChain.UniqueId]   = endIndex;
                        expandedRefChain = expandedRefChain.Add(index);
                        if (!state.ExpandedObjects.Contains(expandedRefChain.UniqueId))
                        {
                            state.ExpandedObjects.Add(expandedRefChain.UniqueId);
                        }

                        break;
                    }

                    if (breakLoop)
                    {
                        break;
                    }
                }

                if (currentRefChain == null)
                {
                    currentRefChain = refChain.Clone();
                    currentRefChain.IndentationOffset = refChain.Length;
                }
            }
            state.CurrentRefChain = currentRefChain;
        }
예제 #2
0
        public void DrawComponent()
        {
            componentArea.Begin();

            object value;

            try
            {
                value = state.CurrentRefChain?.Evaluate();
                if (state.CurrentRefChain?.Length > 1)
                {
                    GUILayout.BeginHorizontal();
                    GUILayout.Label("Actions", GUILayout.MinWidth(110f));
                    if (GUILayout.Button("Back") && state.RefChainHistory.Count > 0)
                    {
                        BackToPreviousRefChain();
                    }

                    if (GUILayout.Button("Up", GUILayout.ExpandWidth(false)))
                    {
                        Show(state.CurrentRefChain.SubChain(state.CurrentRefChain.Length - 1), false);
                    }

                    GUIButtons.SetupCommonButtons(state.CurrentRefChain, value, state.CurrentRefChain.LastItem is uint u ? u : 0);
                    GUILayout.FlexibleSpace();
                    GUILayout.EndHorizontal();
                }
                else if (state.CurrentRefChain?.LastItem is GameObject gameObject)
                {
                    if (gameObject.transform?.parent?.gameObject != null)
                    {
                        GUILayout.BeginHorizontal();
                        GUILayout.Label("Actions", GUILayout.MinWidth(110f));
                        if (GUILayout.Button("Back") && state.RefChainHistory.Count > 0)
                        {
                            BackToPreviousRefChain();
                        }

                        if (GUILayout.Button("Up", GUILayout.ExpandWidth(false)))
                        {
                            Show(ReferenceChainBuilder.ForGameObject(gameObject.transform?.parent?.gameObject));
                        }

                        GUILayout.FlexibleSpace();
                        GUILayout.EndHorizontal();
                    }
                }
            }
            catch (Exception e)
            {
                Debug.LogException(e);
                value = null;
            }

            DrawQuickFilter();

            componentScrollPosition = GUILayout.BeginScrollView(componentScrollPosition);

            if (value != null)
            {
                try
                {
                    GUIReflect.OnSceneTreeReflect(state, state.CurrentRefChain, value, false, TypeUtil.SmartType.Undefined, quickFilter);
                }
                catch (Exception e)
                {
                    Debug.LogException(e);
                    state.CurrentRefChain = null;
                }
            }

            GUILayout.EndScrollView();

            componentArea.End();
        }