public void Update() { var hoveredLocal = hoveredComponent; if (!DrawDebugInfo || hoveredLocal == null) { return; } if (Input.GetKey(KeyCode.LeftControl) && Input.GetKeyDown(KeyCode.F)) { var refChain = ReferenceChainBuilder.ForUIComponent(hoveredLocal); var sceneExplorer = FindObjectOfType <SceneExplorer>(); sceneExplorer.Show(refChain); if (MainWindow.Instance.Config.DebugRendererAutoTurnOff && sceneExplorer.Visible) { DrawDebugInfo = false; } } if (Input.GetKey(KeyCode.LeftControl) && Input.GetKeyDown(KeyCode.G) && hoveredComponents.Count > 1 && hoveredComponent != null) { var index = hoveredComponents.IndexOf(hoveredComponent); var newIndex = (index + hoveredComponents.Count + 1) % hoveredComponents.Count; hoveredComponent = hoveredComponents[newIndex]; } }
private void ShowCitizen(InstanceID instanceId) { var citizenId = instanceId.GetCitizenId(); if (citizenId != 0) { sceneExplorer.Show(ReferenceChainBuilder.ForCitizen(citizenId)); } }
private void ShowBuilding(InstanceID instanceId) { var buildingId = instanceId.Building; if (buildingId != 0) { sceneExplorer.Show(ReferenceChainBuilder.ForBuilding(buildingId)); } }
public static void SetupJumpButton(object value, ReferenceChain refChain) { if (!GUILayout.Button(">", GUILayout.ExpandWidth(false))) { return; } var sceneExplorer = Object.FindObjectOfType <SceneExplorer>(); if (sceneExplorer == null) { return; } sceneExplorer.Show(ReferenceChainBuilder.Optimize(refChain, value)); }
private void ShowVehicle(InstanceID instanceId) { var vehicleId = instanceId.Vehicle; if (vehicleId != 0) { sceneExplorer.Show(ReferenceChainBuilder.ForVehicle(vehicleId)); return; } vehicleId = instanceId.ParkedVehicle; if (vehicleId != 0) { sceneExplorer.Show(ReferenceChainBuilder.ForParkedVehicle(vehicleId)); } }
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(); }
public void DrawSceneTree() { var gameObjects = sceneRoots.Keys.ToArray(); if (MainWindow.Instance.Config.SortItemsAlphabetically) { Array.Sort(gameObjects, (x, y) => string.CompareOrdinal(x?.name, y?.name)); } if (!sceneTreeArea.Begin()) { return; } GUILayout.BeginHorizontal(); if (GUILayout.Button("Refresh", GUILayout.ExpandWidth(false))) { RefreshSceneRoots(); } if (GUILayout.Button("Fold all / Clear", GUILayout.ExpandWidth(false))) { ClearExpanded(); RefreshSceneRoots(); ClearHistory(); } GUILayout.EndHorizontal(); if (ToolManager.exists && ToolManager.instance?.m_properties?.CurrentTool != null) { GUILayout.BeginHorizontal(); if (GUILayout.Button("Show current tool", GUILayout.ExpandWidth(false))) { Show(ReferenceChainBuilder.ForCurrentTool()); } GUILayout.EndHorizontal(); } if (ToolManager.exists && ToolManager.instance?.m_properties?.m_editPrefabInfo != null) { GUILayout.BeginHorizontal(); if (GUILayout.Button("Show edited prefab", GUILayout.ExpandWidth(false))) { Show(ReferenceChainBuilder.ForEditPrefabInfo()); } GUILayout.EndHorizontal(); } if (!string.IsNullOrEmpty(searchDisplayString)) { GUI.contentColor = Color.green; GUILayout.Label(searchDisplayString); GUI.contentColor = Color.white; } sceneTreeScrollPosition = GUILayout.BeginScrollView(sceneTreeScrollPosition); foreach (var obj in gameObjects) { GUIRecursiveTree.OnSceneTreeRecursive(gameObject, state, new ReferenceChain().Add(obj), obj); } GUILayout.EndScrollView(); sceneTreeArea.End(); }
protected override void OnToolGUI(Event e) { DrawLabel(); if (m_toolController.IsInsideUI || e.type != EventType.MouseDown) { base.OnToolGUI(e); return; } if (m_hoverInstance.IsEmpty) { return; } var sceneExplorer = FindObjectOfType <SceneExplorer>(); if (e.button == 0) { if (m_hoverInstance.NetNode > 0) { sceneExplorer.Show(ReferenceChainBuilder.ForNode(m_hoverInstance.NetNode)); } else if (m_hoverInstance.NetSegment > 0) { sceneExplorer.Show(ReferenceChainBuilder.ForSegment(m_hoverInstance.NetSegment)); } else if (m_hoverInstance.Tree > 0) { sceneExplorer.Show(ReferenceChainBuilder.ForTree(m_hoverInstance.Tree)); } else if (m_hoverInstance.Prop > 0) { sceneExplorer.Show(ReferenceChainBuilder.ForProp(m_hoverInstance.Prop)); } else if (m_hoverInstance.CitizenInstance > 0) { sceneExplorer.Show(ReferenceChainBuilder.ForCitizenInstance(m_hoverInstance.CitizenInstance)); } else if (m_hoverInstance.Building > 0) { sceneExplorer.Show(ReferenceChainBuilder.ForBuilding(m_hoverInstance.Building)); } else if (m_hoverInstance.Vehicle > 0) { sceneExplorer.Show(ReferenceChainBuilder.ForVehicle(m_hoverInstance.Vehicle)); } else if (m_hoverInstance.ParkedVehicle > 0) { sceneExplorer.Show(ReferenceChainBuilder.ForParkedVehicle(m_hoverInstance.ParkedVehicle)); } else if (m_hoverInstance.District > 0) { sceneExplorer.Show(ReferenceChainBuilder.ForDistrict(m_hoverInstance.District)); } else if (m_hoverInstance.Park > 0) { sceneExplorer.Show(ReferenceChainBuilder.ForPark(m_hoverInstance.Park)); } else if (m_hoverInstance.TransportLine > 0) { sceneExplorer.Show(ReferenceChainBuilder.ForTransportLine(m_hoverInstance.TransportLine)); } } else if (e.button == 1) { if (m_hoverInstance.CitizenInstance > 0) { sceneExplorer.Show(ReferenceChainBuilder.ForCitizen(m_hoverInstance.GetCitizenId())); } else if (m_hoverInstance.NetNode > 0) { sceneExplorer.Show(ReferenceChainBuilder.ForSegment(hoveredSegment)); } else if (m_hoverInstance.NetSegment > 0) { sceneExplorer.Show(ReferenceChainBuilder.ForBuilding(hoveredBuilding)); } } }
public static void SetupSmartShowButtons(object value, TypeUtil.SmartType smartType) { if (smartType == TypeUtil.SmartType.Undefined || value == null || value.GetType().IsArray) { return; } try { switch (smartType) { case TypeUtil.SmartType.Sprite: { if (!(value is string stringValue) || !UIView.GetAView().defaultAtlas.spriteNames.Contains(stringValue)) { return; } if (GUILayout.Button("Show sprite")) { var sceneExplorer = Object.FindObjectOfType <SceneExplorer>(); sceneExplorer.Show(ReferenceChainBuilder.ForSprite(stringValue)); } break; } case TypeUtil.SmartType.ParkedVehicle: { if (Convert.ToUInt16(value) < 1) { return; } if (GUILayout.Button("Show parked vehicle")) { var sceneExplorer = Object.FindObjectOfType <SceneExplorer>(); sceneExplorer.Show(ReferenceChainBuilder.ForParkedVehicle(Convert.ToUInt16(value))); } break; } case TypeUtil.SmartType.Vehicle: { if (Convert.ToUInt16(value) < 1) { return; } if (GUILayout.Button("Show vehicle")) { var sceneExplorer = Object.FindObjectOfType <SceneExplorer>(); sceneExplorer.Show(ReferenceChainBuilder.ForVehicle(Convert.ToUInt16(value))); } break; } case TypeUtil.SmartType.Building: { if (Convert.ToUInt16(value) < 1) { return; } if (GUILayout.Button("Show building")) { var sceneExplorer = Object.FindObjectOfType <SceneExplorer>(); sceneExplorer.Show(ReferenceChainBuilder.ForBuilding(Convert.ToUInt16(value))); } break; } case TypeUtil.SmartType.CitizenUnit: { if (Convert.ToUInt32(value) < 1) { return; } if (GUILayout.Button("Show citizen unit")) { var sceneExplorer = Object.FindObjectOfType <SceneExplorer>(); sceneExplorer.Show(ReferenceChainBuilder.ForCitizenUnit(Convert.ToUInt32(value))); } break; } case TypeUtil.SmartType.Citizen: { if (Convert.ToUInt32(value) < 1) { return; } if (GUILayout.Button("Show citizen")) { var sceneExplorer = Object.FindObjectOfType <SceneExplorer>(); sceneExplorer.Show(ReferenceChainBuilder.ForCitizen(Convert.ToUInt32(value))); } break; } case TypeUtil.SmartType.TransportLine: { if (Convert.ToUInt16(value) < 1) { return; } if (GUILayout.Button("Show transport line")) { var sceneExplorer = Object.FindObjectOfType <SceneExplorer>(); sceneExplorer.Show(ReferenceChainBuilder.ForTransportLine(Convert.ToUInt16(value))); } break; } case TypeUtil.SmartType.PathUnit: { if (Convert.ToUInt32(value) < 1) { return; } if (GUILayout.Button("Show path unit")) { var sceneExplorer = Object.FindObjectOfType <SceneExplorer>(); sceneExplorer.Show(ReferenceChainBuilder.ForPathUnit(Convert.ToUInt32(value))); } break; } case TypeUtil.SmartType.NetNode: { if (Convert.ToUInt16(value) < 1) { return; } if (GUILayout.Button("Show network node")) { var sceneExplorer = Object.FindObjectOfType <SceneExplorer>(); sceneExplorer.Show(ReferenceChainBuilder.ForNode(Convert.ToUInt16(value))); } break; } case TypeUtil.SmartType.NetSegment: { if (Convert.ToUInt16(value) < 1) { return; } if (GUILayout.Button("Show network segment")) { var sceneExplorer = Object.FindObjectOfType <SceneExplorer>(); sceneExplorer.Show(ReferenceChainBuilder.ForSegment(Convert.ToUInt16(value))); } break; } case TypeUtil.SmartType.NetLane: { if (Convert.ToUInt32(value) < 1) { return; } if (GUILayout.Button("Show network lane")) { var sceneExplorer = Object.FindObjectOfType <SceneExplorer>(); sceneExplorer.Show(ReferenceChainBuilder.ForLane(Convert.ToUInt32(value))); } break; } case TypeUtil.SmartType.ParkDistrict: { if (Convert.ToByte(value) < 1) { return; } if (GUILayout.Button("Show park district")) { var sceneExplorer = Object.FindObjectOfType <SceneExplorer>(); sceneExplorer.Show(ReferenceChainBuilder.ForPark(Convert.ToByte(value))); } break; } case TypeUtil.SmartType.District: { if (Convert.ToByte(value) < 1) { return; } if (GUILayout.Button("Show district")) { var sceneExplorer = Object.FindObjectOfType <SceneExplorer>(); sceneExplorer.Show(ReferenceChainBuilder.ForDistrict(Convert.ToByte(value))); } break; } case TypeUtil.SmartType.Tree: { if (Convert.ToUInt32(value) < 1) { return; } if (GUILayout.Button("Show tree")) { var sceneExplorer = Object.FindObjectOfType <SceneExplorer>(); sceneExplorer.Show(ReferenceChainBuilder.ForTree(Convert.ToUInt32(value))); } break; } case TypeUtil.SmartType.Prop: { if (Convert.ToUInt16(value) < 1) { return; } if (GUILayout.Button("Show prop")) { var sceneExplorer = Object.FindObjectOfType <SceneExplorer>(); sceneExplorer.Show(ReferenceChainBuilder.ForProp(Convert.ToUInt16(value))); } break; } case TypeUtil.SmartType.CitizenInstance: { if (Convert.ToUInt16(value) < 1) { return; } if (GUILayout.Button("Show citizen instance")) { var sceneExplorer = Object.FindObjectOfType <SceneExplorer>(); sceneExplorer.Show(ReferenceChainBuilder.ForCitizenInstance(Convert.ToUInt16(value))); } break; } case TypeUtil.SmartType.ZoneBlock: { if (Convert.ToUInt16(value) < 1) { return; } if (GUILayout.Button("Show zone block")) { var sceneExplorer = Object.FindObjectOfType <SceneExplorer>(); sceneExplorer.Show(ReferenceChainBuilder.ForZoneBlock(Convert.ToUInt16(value))); } break; } default: return; } } catch { // suppress } }