diff --git a/src/Core/SceneHandler.cs b/src/Core/SceneHandler.cs index bd56600..52ad99f 100644 --- a/src/Core/SceneHandler.cs +++ b/src/Core/SceneHandler.cs @@ -145,7 +145,7 @@ namespace UnityExplorer.Core for (int i = 0; i < SceneManager.sceneCount; i++) { Scene scene = SceneManager.GetSceneAt(i); - if (scene == default || scene.handle == -1) + if (scene == default || scene.handle == -1 || !scene.isLoaded) continue; // If no changes yet, ensure the previous list contained this handle. @@ -184,7 +184,8 @@ namespace UnityExplorer.Core var list = new List(); foreach (var obj in allObjects) { - if (obj.TryCast() is GameObject go && !go.scene.IsValid() && go.transform.parent == null) + var go = obj.TryCast(); + if (go.transform.parent == null && !go.scene.IsValid()) list.Add(go); } rootObjects = list.ToArray(); diff --git a/src/UI/Panels/SceneExplorer.cs b/src/UI/Panels/SceneExplorer.cs index ea63fe1..db1c5de 100644 --- a/src/UI/Panels/SceneExplorer.cs +++ b/src/UI/Panels/SceneExplorer.cs @@ -19,6 +19,11 @@ namespace UnityExplorer.UI.Panels public override GameObject UIRoot => uiRoot; private GameObject uiRoot; + /// + /// Whether to automatically update per auto-update interval or not. + /// + public bool AutoUpdate = false; + public TransformTree Tree; private float timeOfLastUpdate = -1f; @@ -33,15 +38,26 @@ namespace UnityExplorer.UI.Panels private IEnumerable GetRootEntries() => SceneHandler.CurrentRootObjects; + public void ForceUpdate() + { + ExpensiveUpdate(); + } + public override void Update() { - if (Time.realtimeSinceStartup - timeOfLastUpdate < 1f) - return; - timeOfLastUpdate = Time.realtimeSinceStartup; + if (AutoUpdate && Time.realtimeSinceStartup - timeOfLastUpdate >= 1f) + { + timeOfLastUpdate = Time.realtimeSinceStartup; + ExpensiveUpdate(); + } + } + public void ExpensiveUpdate() + { Tree.Scroller.ExternallySetting = true; SceneHandler.Update(); Tree.RefreshData(true); + // Tree.Scroller.ExternallySetting = false; } private void OnDropdownChanged(int value) @@ -105,16 +121,21 @@ namespace UnityExplorer.UI.Panels private void SceneExplorer_OnFinishResize(RectTransform obj) { - if (obj.rect.height == previousRectHeight) - { - // horizontal resize, soft refresh. - Tree.Scroller.Refresh(); - return; - } + RuntimeProvider.Instance.StartCoroutine(DelayedRefresh(obj)); + } + + private IEnumerator DelayedRefresh(RectTransform obj) + { + yield return null; + + if (obj.rect.height != previousRectHeight) + { + // height changed, hard refresh required. + previousRectHeight = obj.rect.height; + Tree.Scroller.ReloadData(); + } + Tree.Scroller.Refresh(); - // height changed, hard refresh required. - previousRectHeight = obj.rect.height; - Tree.Scroller.ReloadData(); } public override void ConstructUI(GameObject parent) @@ -129,7 +150,7 @@ namespace UnityExplorer.UI.Panels panelRect.offsetMin = new Vector2(panelRect.offsetMin.x, 10); // bottom panelRect.offsetMax = new Vector2(panelRect.offsetMax.x, -10); // top panelRect.pivot = new Vector2(0.5f, 0.5f); - UIFactory.SetLayoutGroup(panel, true, true, true, true, 0,0,0,0,0, TextAnchor.UpperLeft); + UIFactory.SetLayoutGroup(panel, true, true, true, true, 0, 0, 0, 0, 0, TextAnchor.UpperLeft); UIFactory.SetLayoutGroup(panelContent, true, true, true, true, 2, 2, 2, 2, 2, TextAnchor.UpperLeft); // Title bar @@ -146,7 +167,24 @@ namespace UnityExplorer.UI.Panels new Color(0.15f, 0.15f, 0.15f)); //UIFactory.SetLayoutElement(toolbar, minHeight: 25, flexibleHeight: 0); - //Scene selector dropdown + // refresh row + + var refreshRow = UIFactory.CreateHorizontalGroup(toolbar, "RefreshGroup", true, true, true, true, 2, new Vector4(2, 2, 2, 2)); + UIFactory.SetLayoutElement(refreshRow, minHeight: 30, flexibleHeight: 0); + + var refreshButton = UIFactory.CreateButton(refreshRow, "RefreshButton", "Update", ForceUpdate); + UIFactory.SetLayoutElement(refreshButton.gameObject, minWidth: 65, flexibleWidth: 0); + + var refreshToggle = UIFactory.CreateToggle(refreshRow, "RefreshToggle", out Toggle toggle, out Text text); + UIFactory.SetLayoutElement(refreshToggle, flexibleWidth: 9999); + text.text = "Auto-update (1 second)"; + text.alignment = TextAnchor.MiddleLeft; + text.color = Color.white; + text.fontSize = 12; + toggle.isOn = false; + toggle.onValueChanged.AddListener((bool val) => AutoUpdate = val); + + // Scene selector dropdown var dropdownObj = UIFactory.CreateDropdown(toolbar, out sceneDropdown, "", 13, OnDropdownChanged); UIFactory.SetLayoutElement(dropdownObj, minHeight: 25, flexibleHeight: 0); @@ -154,8 +192,19 @@ namespace UnityExplorer.UI.Panels PopulateSceneDropdown(); sceneDropdown.captionText.text = sceneToDropdownOption.First().Value.text; + // Filter row + + var filterRow = UIFactory.CreateHorizontalGroup(toolbar, "FilterGroup", true, true, true, true, 2, new Vector4(2, 2, 2, 2)); + UIFactory.SetLayoutElement(filterRow, minHeight: 25, flexibleHeight: 0); + + //// filter label + //var label = UIFactory.CreateLabel(filterRow, "FilterLabel", "Search:", TextAnchor.MiddleLeft); + //UIFactory.SetLayoutElement(label.gameObject, minWidth: 50, flexibleWidth: 0); + //Filter input field - var inputFieldObj = UIFactory.CreateInputField(toolbar, "FilterInput", "Search...", out InputField inputField, 13); + var inputFieldObj = UIFactory.CreateInputField(filterRow, "FilterInput", "Search...", out InputField inputField, 13); + inputField.targetGraphic.color = new Color(0.2f, 0.2f, 0.2f); + RuntimeProvider.Instance.SetColorBlock(inputField, new Color(0.4f, 0.4f, 0.4f), new Color(0.2f, 0.2f, 0.2f), new Color(0.08f, 0.08f, 0.08f)); UIFactory.SetLayoutElement(inputFieldObj, minHeight: 25); inputField.onValueChanged.AddListener(OnFilterInput); @@ -166,8 +215,10 @@ namespace UnityExplorer.UI.Panels UIFactory.SetLayoutElement(scrollObj, flexibleHeight: 9999); UIFactory.SetLayoutElement(scrollContent, flexibleHeight: 9999); - Tree = new TransformTree(infiniteScroll); - Tree.GetRootEntriesMethod = GetRootEntries; + Tree = new TransformTree(infiniteScroll) + { + GetRootEntriesMethod = GetRootEntries + }; Tree.Init(); // Prototype tree cell diff --git a/src/UI/UIFactory.cs b/src/UI/UIFactory.cs index 948b42c..2b0da41 100644 --- a/src/UI/UIFactory.cs +++ b/src/UI/UIFactory.cs @@ -610,7 +610,7 @@ namespace UnityExplorer.UI itemToggle.onValueChanged.AddListener((bool val) => { itemToggle.OnDeselect(null); }); Image templateImage = templateObj.AddComponent(); templateImage.type = Image.Type.Sliced; - templateImage.color = new Color(0.15f, 0.15f, 0.15f, 1.0f); + templateImage.color = new Color(0.1f, 0.1f, 0.1f, 1.0f); var scrollRect = templateObj.AddComponent(); scrollRect.scrollSensitivity = 35; diff --git a/src/UI/Widgets/InfiniteScroll/InfiniteScrollRect.cs b/src/UI/Widgets/InfiniteScroll/InfiniteScrollRect.cs index 450cc0b..c4fe947 100644 --- a/src/UI/Widgets/InfiniteScroll/InfiniteScrollRect.cs +++ b/src/UI/Widgets/InfiniteScroll/InfiniteScrollRect.cs @@ -76,13 +76,11 @@ namespace UnityExplorer.UI.Widgets.InfiniteScroll return; this.ExternallySetting = true; - ExplorerCore.Log("Slider value changed"); - // Jump to val * count (ie, 0.0 would jump to top, 1.0 would jump to bottom) var index = Math.Floor(val * DataSource.ItemCount); JumpToIndex((int)index); - this.ExternallySetting = false; + //this.ExternallySetting = false; }); } @@ -104,6 +102,8 @@ namespace UnityExplorer.UI.Widgets.InfiniteScroll _prevAnchoredPos = scrollRect.content.anchoredPosition; SetSliderFromScrollValue(); + + // ExternallySetting = false; } diff --git a/src/UI/Widgets/TransformTree/TransformCell.cs b/src/UI/Widgets/TransformTree/TransformCell.cs index 630a557..fcae63b 100644 --- a/src/UI/Widgets/TransformTree/TransformCell.cs +++ b/src/UI/Widgets/TransformTree/TransformCell.cs @@ -45,6 +45,9 @@ namespace UnityExplorer.UI.Widgets //This is called from the SetCell method in DataSource public void ConfigureCell(CachedTransform cached, int cellIndex) { + if (cached == null || !cached.Value) + return; + if (!Enabled) Enable(); @@ -62,14 +65,16 @@ namespace UnityExplorer.UI.Widgets nameLabel.text = $"[{childCount}] {nameLabel.text}"; expandButton.interactable = true; - expandLabel.enabled = true; + //expandLabel.enabled = true; expandLabel.text = cached.Expanded ? "▼" : "►"; expandLabel.color = cached.Expanded ? new Color(0.5f, 0.5f, 0.5f) : new Color(0.3f, 0.3f, 0.3f); } else { expandButton.interactable = false; - expandLabel.enabled = false; + expandLabel.text = "▪"; + expandLabel.color = new Color(0.3f, 0.3f, 0.3f); + //expandLabel.enabled = false; } }