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; }
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(); }