diff --git a/src/CachedObjects/CacheList.cs b/src/CachedObjects/CacheList.cs index 88d17e4..2c39b7f 100644 --- a/src/CachedObjects/CacheList.cs +++ b/src/CachedObjects/CacheList.cs @@ -11,8 +11,7 @@ namespace Explorer public class CacheList : CacheObjectBase { public bool IsExpanded { get; set; } - public int ArrayOffset { get; set; } - public int ArrayLimit { get; set; } = 20; + public PageHelper Pages = new PageHelper(); public float WhiteSpace = 215f; public float ButtonWidthOffset = 290f; @@ -230,18 +229,6 @@ namespace Explorer { list.Add(null); } - - //var type = ReflectionHelpers.GetActualType(obj); - - //if (obj is Il2CppSystem.Object iObj) - //{ - // obj = iObj.Il2CppCast(type); - //} - - //var cached = GetCacheObject(obj, null, null, type); - //cached.UpdateValue(); - - //list.Add(cached); } m_cachedEntries = list.ToArray(); @@ -286,51 +273,51 @@ namespace Explorer if (IsExpanded) { - float whitespace = WhiteSpace; - + float whitespace = WhiteSpace; if (whitespace > 0) { ClampLabelWidth(window, ref whitespace); } - if (count > ArrayLimit) + Pages.Count = count; + + if (count > Pages.PageLimit) { GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(null); GUILayout.Space(whitespace); - int maxOffset = (int)Mathf.Ceil((float)(count / (decimal)ArrayLimit)) - 1; - GUILayout.Label($"Page {ArrayOffset + 1}/{maxOffset + 1}", new GUILayoutOption[] { GUILayout.Width(80) }); + //int maxOffset = (int)Mathf.Ceil((float)(count / (decimal)ArrayLimit)) - 1; + Pages.CalculateMaxOffset(); + + //GUILayout.Label($"Page {PH.ArrayOffset + 1}/{maxOffset + 1}", new GUILayoutOption[] { GUILayout.Width(80) }); + Pages.CurrentPageLabel(); + // prev/next page buttons if (GUILayout.Button("< Prev", new GUILayoutOption[] { GUILayout.Width(60) })) { - if (ArrayOffset > 0) ArrayOffset--; + Pages.TurnPage(Turn.Left); } if (GUILayout.Button("Next >", new GUILayoutOption[] { GUILayout.Width(60) })) { - if (ArrayOffset < maxOffset) ArrayOffset++; - } - GUILayout.Label("Limit: ", new GUILayoutOption[] { GUILayout.Width(50) }); - var limit = this.ArrayLimit.ToString(); - limit = GUILayout.TextField(limit, new GUILayoutOption[] { GUILayout.Width(50) }); - if (limit != ArrayLimit.ToString() && int.TryParse(limit, out int i)) - { - ArrayLimit = i; + Pages.TurnPage(Turn.Right); } + Pages.DrawLimitInputArea(); + GUILayout.Space(5); } - int offset = ArrayOffset * ArrayLimit; + //int offset = ArrayOffset * ArrayLimit; + //if (offset >= count) + //{ + // offset = 0; + // ArrayOffset = 0; + //} + int offset = Pages.CalculateOffsetIndex(); - if (offset >= count) - { - offset = 0; - ArrayOffset = 0; - } - - for (int i = offset; i < offset + ArrayLimit && i < count; i++) + for (int i = offset; i < offset + Pages.PageLimit && i < count; i++) { var entry = m_cachedEntries[i]; diff --git a/src/CppExplorer.cs b/src/CppExplorer.cs index c630e27..933bd4a 100644 --- a/src/CppExplorer.cs +++ b/src/CppExplorer.cs @@ -12,7 +12,7 @@ namespace Explorer public class CppExplorer : MelonMod { public const string GUID = "com.sinai.cppexplorer"; - public const string VERSION = "1.5.1"; + public const string VERSION = "1.5.2"; public const string AUTHOR = "Sinai"; public const string NAME = "CppExplorer" diff --git a/src/CppExplorer.csproj b/src/CppExplorer.csproj index cc1ea50..22c6d8b 100644 --- a/src/CppExplorer.csproj +++ b/src/CppExplorer.csproj @@ -60,9 +60,7 @@ ..\..\..\..\..\Steam\steamapps\common\Hellpoint\MelonLoader\Managed\UnhollowerBaseLib.dll False - - ..\..\..\Steam\steamapps\common\Hellpoint\MelonLoader\Managed\UnityEngine.dll False @@ -91,9 +89,7 @@ ..\..\..\Steam\steamapps\common\Hellpoint\MelonLoader\Managed\UnityEngine.UI.dll False - - ..\..\..\Steam\steamapps\common\VRChat\MelonLoader\Managed\UnityEngine.dll False @@ -122,7 +118,6 @@ ..\..\..\Steam\steamapps\common\VRChat\MelonLoader\Managed\UnityEngine.UI.dll False - @@ -135,6 +130,7 @@ + diff --git a/src/Helpers/PageHelper.cs b/src/Helpers/PageHelper.cs new file mode 100644 index 0000000..a402e0c --- /dev/null +++ b/src/Helpers/PageHelper.cs @@ -0,0 +1,88 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; + +namespace Explorer +{ + public enum Turn + { + Left, + Right + } + + public class PageHelper + { + public int PageOffset { get; set; } + public int PageLimit { get; set; } = 20; + public int Count { get; set; } + public int MaxOffset { get; set; } = -1; + + public int CalculateMaxOffset() + { + return MaxOffset = (int)Mathf.Ceil((float)(Count / (decimal)PageLimit)) - 1; + } + + public void CurrentPageLabel() + { + var orig = GUI.skin.label.alignment; + GUI.skin.label.alignment = TextAnchor.MiddleCenter; + + GUILayout.Label($"Page {PageOffset + 1}/{MaxOffset + 1}", new GUILayoutOption[] { GUILayout.Width(80) }); + + GUI.skin.label.alignment = orig; + } + + public void TurnPage(Turn direction) + { + var _ = Vector2.zero; + TurnPage(direction, ref _); + } + + public void TurnPage(Turn direction, ref Vector2 scroll) + { + if (direction == Turn.Left) + { + if (PageOffset > 0) + { + PageOffset--; + scroll = Vector2.zero; + } + } + else + { + if (PageOffset < MaxOffset) + { + PageOffset++; + scroll = Vector2.zero; + } + } + } + + public int CalculateOffsetIndex() + { + int offset = PageOffset * PageLimit; + + if (offset >= Count) + { + offset = 0; + PageOffset = 0; + } + + return offset; + } + + public void DrawLimitInputArea() + { + GUILayout.Label("Limit: ", new GUILayoutOption[] { GUILayout.Width(50) }); + var limit = this.PageLimit.ToString(); + limit = GUILayout.TextField(limit, new GUILayoutOption[] { GUILayout.Width(50) }); + if (limit != PageLimit.ToString() && int.TryParse(limit, out int i)) + { + PageLimit = i; + } + } + } +} diff --git a/src/MainMenu/Pages/ScenePage.cs b/src/MainMenu/Pages/ScenePage.cs index 437e80b..3d9a2c2 100644 --- a/src/MainMenu/Pages/ScenePage.cs +++ b/src/MainMenu/Pages/ScenePage.cs @@ -14,9 +14,7 @@ namespace Explorer public override string Name { get => "Scene Explorer"; set => base.Name = value; } - private int m_pageOffset = 0; - private int m_limit = 20; - private int m_currentTotalCount = 0; + public PageHelper Pages = new PageHelper(); private float m_timeOfLastUpdate = -1f; @@ -46,14 +44,14 @@ namespace Explorer SetTransformTarget(null); } - public void CheckOffset(ref int offset, int childCount) - { - if (offset >= childCount) - { - offset = 0; - m_pageOffset = 0; - } - } + //public void CheckOffset(ref int offset, int childCount) + //{ + // if (offset >= childCount) + // { + // offset = 0; + // m_pageOffset = 0; + // } + //} public override void Update() { @@ -63,7 +61,6 @@ namespace Explorer m_timeOfLastUpdate = Time.time; m_objectList = new List(); - int offset = m_pageOffset * m_limit; var allTransforms = new List(); @@ -86,15 +83,14 @@ namespace Explorer } } - m_currentTotalCount = allTransforms.Count; + Pages.Count = allTransforms.Count; - // make sure offset doesn't exceed count - CheckOffset(ref offset, m_currentTotalCount); + int offset = Pages.CalculateOffsetIndex(); // sort by childcount allTransforms.Sort((a, b) => b.childCount.CompareTo(a.childCount)); - for (int i = offset; i < offset + m_limit && i < m_currentTotalCount; i++) + for (int i = offset; i < offset + Pages.PageLimit && i < Pages.Count; i++) { var child = allTransforms[i]; m_objectList.Add(new GameObjectCache(child.gameObject)); @@ -128,7 +124,7 @@ namespace Explorer { m_searchResults = SearchSceneObjects(m_searchInput); m_searching = true; - m_currentTotalCount = m_searchResults.Count; + Pages.Count = m_searchResults.Count; } public void CancelSearch() @@ -242,33 +238,21 @@ namespace Explorer { GUILayout.BeginHorizontal(null); - GUILayout.Label("Limit per page: ", new GUILayoutOption[] { GUILayout.Width(100) }); - var limit = m_limit.ToString(); - limit = GUILayout.TextField(limit, new GUILayoutOption[] { GUILayout.Width(30) }); - if (int.TryParse(limit, out int lim)) - { - m_limit = lim; - } + Pages.DrawLimitInputArea(); - // prev/next page buttons - if (m_currentTotalCount > m_limit) + if (Pages.Count > Pages.PageLimit) { - int count = m_currentTotalCount; - int maxOffset = (int)Mathf.Ceil((float)(count / (decimal)m_limit)) - 1; - if (GUILayout.Button("< Prev", null)) + if (GUILayout.Button("< Prev", new GUILayoutOption[] { GUILayout.Width(80) })) { - if (m_pageOffset > 0) m_pageOffset--; - m_timeOfLastUpdate = -1f; + Pages.TurnPage(Turn.Left, ref this.scroll); Update(); } - GUI.skin.label.alignment = TextAnchor.MiddleCenter; - GUILayout.Label($"Page {m_pageOffset + 1}/{maxOffset + 1}", new GUILayoutOption[] { GUILayout.Width(80) }); + Pages.CurrentPageLabel(); - if (GUILayout.Button("Next >", null)) + if (GUILayout.Button("Next >", new GUILayoutOption[] { GUILayout.Width(80) })) { - if (m_pageOffset < maxOffset) m_pageOffset++; - m_timeOfLastUpdate = -1f; + Pages.TurnPage(Turn.Right, ref this.scroll); Update(); } } @@ -342,15 +326,9 @@ namespace Explorer if (m_searchResults.Count > 0) { - int offset = m_pageOffset * m_limit; + int offset = Pages.CalculateOffsetIndex(); - if (offset >= m_searchResults.Count) - { - offset = 0; - m_pageOffset = 0; - } - - for (int i = offset; i < offset + m_limit && i < m_searchResults.Count; i++) + for (int i = offset; i < offset + Pages.PageLimit && i < m_searchResults.Count; i++) { var obj = m_searchResults[i]; diff --git a/src/MainMenu/Pages/SearchPage.cs b/src/MainMenu/Pages/SearchPage.cs index 7011131..abab30c 100644 --- a/src/MainMenu/Pages/SearchPage.cs +++ b/src/MainMenu/Pages/SearchPage.cs @@ -5,11 +5,7 @@ using System.Linq; using System.Text; using UnityEngine; using System.Reflection; -using UnityEngine.SceneManagement; -using Object = UnityEngine.Object; -using UnhollowerRuntimeLib; using MelonLoader; -using UnhollowerBaseLib; namespace Explorer { @@ -21,11 +17,11 @@ namespace Explorer private string m_searchInput = ""; private string m_typeInput = ""; - private int m_limit = 20; - private int m_pageOffset = 0; - //private List m_searchResults = new List(); + private Vector2 resultsScroll = Vector2.zero; + public PageHelper Pages = new PageHelper(); + private List m_searchResults = new List(); public SceneFilter SceneMode = SceneFilter.Any; @@ -55,7 +51,7 @@ namespace Explorer public void OnSceneChange() { m_searchResults.Clear(); - m_pageOffset = 0; + Pages.PageOffset = 0; } public override void Update() @@ -78,6 +74,9 @@ namespace Explorer var cache = CacheObjectBase.GetCacheObject(toCache); m_searchResults.Add(cache); } + + Pages.Count = m_searchResults.Count; + Pages.PageOffset = 0; } public override void DrawWindow() @@ -90,8 +89,7 @@ namespace Explorer if (GUILayout.Button("Find Static Instances", new GUILayoutOption[] { GUILayout.Width(180) })) { //m_searchResults = GetInstanceClassScanner().ToList(); - CacheResults(GetInstanceClassScanner()); - m_pageOffset = 0; + CacheResults(GetInstanceClassScanner()); } GUILayout.EndHorizontal(); @@ -106,36 +104,45 @@ namespace Explorer GUI.skin.label.alignment = TextAnchor.UpperLeft; int count = m_searchResults.Count; + Pages.CalculateMaxOffset(); - if (count > this.m_limit) + GUILayout.BeginHorizontal(null); + + Pages.DrawLimitInputArea(); + + if (count > Pages.PageLimit) { // prev/next page buttons - GUILayout.BeginHorizontal(null); - int maxOffset = (int)Mathf.Ceil((float)(count / (decimal)m_limit)) - 1; - if (GUILayout.Button("< Prev", null)) - { - if (m_pageOffset > 0) m_pageOffset--; - } - GUILayout.Label($"Page {m_pageOffset + 1}/{maxOffset + 1}", new GUILayoutOption[] { GUILayout.Width(80) }); - - if (GUILayout.Button("Next >", null)) + if (Pages.Count > Pages.PageLimit) { - if (m_pageOffset < maxOffset) m_pageOffset++; + if (GUILayout.Button("< Prev", new GUILayoutOption[] { GUILayout.Width(80) })) + { + Pages.TurnPage(Turn.Left, ref this.resultsScroll); + } + + Pages.CurrentPageLabel(); + + if (GUILayout.Button("Next >", new GUILayoutOption[] { GUILayout.Width(80) })) + { + Pages.TurnPage(Turn.Right, ref this.resultsScroll); + } } - GUILayout.EndHorizontal(); } + GUILayout.EndHorizontal(); + resultsScroll = GUILayout.BeginScrollView(resultsScroll, GUI.skin.scrollView); var _temprect = new Rect(MainMenu.MainRect.x, MainMenu.MainRect.y, MainMenu.MainRect.width + 160, MainMenu.MainRect.height); if (m_searchResults.Count > 0) { - int offset = m_pageOffset * this.m_limit; - if (offset >= count) m_pageOffset = 0; + //int offset = m_pageOffset * this.m_limit; + //if (offset >= count) m_pageOffset = 0; + int offset = Pages.CalculateOffsetIndex(); - for (int i = offset; i < offset + m_limit && i < count; i++) + for (int i = offset; i < offset + Pages.PageLimit && i < count; i++) { m_searchResults[i].Draw(MainMenu.MainRect, 0f); //m_searchResults[i].DrawValue(MainMenu.MainRect); @@ -169,15 +176,15 @@ namespace Explorer GUILayout.Label("Name Contains:", new GUILayoutOption[] { GUILayout.Width(100) }); m_searchInput = GUILayout.TextField(m_searchInput, new GUILayoutOption[] { GUILayout.Width(200) }); - GUI.skin.label.alignment = TextAnchor.MiddleRight; - GUILayout.Label("Results per page:", new GUILayoutOption[] { GUILayout.Width(120) }); - var resultinput = m_limit.ToString(); - resultinput = GUILayout.TextField(resultinput, new GUILayoutOption[] { GUILayout.Width(55) }); - if (int.TryParse(resultinput, out int _i) && _i > 0) - { - m_limit = _i; - } - GUI.skin.label.alignment = TextAnchor.UpperLeft; + //GUI.skin.label.alignment = TextAnchor.MiddleRight; + //GUILayout.Label("Results per page:", new GUILayoutOption[] { GUILayout.Width(120) }); + //var resultinput = m_limit.ToString(); + //resultinput = GUILayout.TextField(resultinput, new GUILayoutOption[] { GUILayout.Width(55) }); + //if (int.TryParse(resultinput, out int _i) && _i > 0) + //{ + // m_limit = _i; + //} + //GUI.skin.label.alignment = TextAnchor.UpperLeft; GUILayout.EndHorizontal(); @@ -256,7 +263,7 @@ namespace Explorer private void Search() { - m_pageOffset = 0; + Pages.PageOffset = 0; CacheResults(FindAllObjectsOfType(m_searchInput, m_typeInput)); } diff --git a/src/Windows/GameObjectWindow.cs b/src/Windows/GameObjectWindow.cs index 702bfd0..75cb2ce 100644 --- a/src/Windows/GameObjectWindow.cs +++ b/src/Windows/GameObjectWindow.cs @@ -21,11 +21,13 @@ namespace Explorer private string m_name; private string m_scene; - private Vector2 m_transformScroll = Vector2.zero; private Transform[] m_children; - private Component[] m_components; + private Vector2 m_transformScroll = Vector2.zero; + private PageHelper ChildPages = new PageHelper(); + private Component[] m_components; private Vector2 m_compScroll = Vector2.zero; + private PageHelper CompPages = new PageHelper(); private float m_translateAmount = 0.3f; private float m_rotateAmount = 50f; @@ -74,12 +76,7 @@ namespace Explorer ? "None" : m_object.scene.name; - var list = new List(); - for (int i = 0; i < m_object.transform.childCount; i++) - { - list.Add(m_object.transform.GetChild(i)); - } - m_children = list.ToArray(); + Update(); } public override void Update() @@ -91,12 +88,30 @@ namespace Explorer throw new Exception("Object is null!"); } - var list = new List(); + var list = new List(); + for (int i = 0; i < m_object.transform.childCount; i++) + { + list.Add(m_object.transform.GetChild(i)); + } + list.Sort((a, b) => b.childCount.CompareTo(a.childCount)); + m_children = list.ToArray(); + + ChildPages.Count = m_children.Length; + + var list2 = new List(); foreach (var comp in m_object.GetComponents(ReflectionHelpers.ComponentType)) { - list.Add(comp); + var ilType = comp.GetIl2CppType(); + if (ilType == ReflectionHelpers.TransformType) + { + continue; + } + + list2.Add(comp); } - m_components = list.ToArray(); + m_components = list2.ToArray(); + + CompPages.Count = m_components.Length; } catch (Exception e) { @@ -221,26 +236,46 @@ namespace Explorer GUILayout.BeginVertical(GUI.skin.box, null); // new GUILayoutOption[] { GUILayout.Height(250) }); m_transformScroll = GUILayout.BeginScrollView(m_transformScroll, GUI.skin.scrollView); - GUILayout.Label("Children:", null); + GUILayout.Label("Children", null); + + GUILayout.BeginHorizontal(null); + ChildPages.DrawLimitInputArea(); + + if (ChildPages.Count > ChildPages.PageLimit) + { + ChildPages.CalculateMaxOffset(); + + ChildPages.CurrentPageLabel(); + + GUILayout.EndHorizontal(); + GUILayout.BeginHorizontal(null); + + if (GUILayout.Button("< Prev", new GUILayoutOption[] { GUILayout.Width(80) })) + { + ChildPages.TurnPage(Turn.Left, ref this.m_transformScroll); + } + if (GUILayout.Button("Next >", new GUILayoutOption[] { GUILayout.Width(80) })) + { + ChildPages.TurnPage(Turn.Right, ref this.m_transformScroll); + } + } + GUILayout.EndHorizontal(); + if (m_children != null && m_children.Length > 0) { - foreach (var obj in m_children.Where(x => x.childCount > 0)) + int start = ChildPages.CalculateOffsetIndex(); + + for (int j = start; (j < start + ChildPages.PageLimit && j < ChildPages.Count); j++) { + var obj = m_children[j]; + if (!obj) { GUILayout.Label("null", null); continue; } - UIHelpers.GameobjButton(obj.gameObject, InspectGameObject, false, m_rect.width / 2 - 60); - } - foreach (var obj in m_children.Where(x => x.childCount == 0)) - { - if (!obj) - { - GUILayout.Label("null", null); - continue; - } - UIHelpers.GameobjButton(obj.gameObject, InspectGameObject, false, m_rect.width / 2 - 60); + + UIHelpers.GameobjButton(obj.gameObject, InspectGameObject, false, m_rect.width / 2 - 80); } } else @@ -252,13 +287,35 @@ namespace Explorer GUILayout.EndVertical(); } - private void ComponentList(Rect m_rect) { GUILayout.BeginVertical(GUI.skin.box, null); // new GUILayoutOption[] { GUILayout.Height(250) }); m_compScroll = GUILayout.BeginScrollView(m_compScroll, GUI.skin.scrollView); GUILayout.Label("Components", null); + GUILayout.BeginHorizontal(null); + CompPages.DrawLimitInputArea(); + + if (CompPages.Count > CompPages.PageLimit) + { + CompPages.CalculateMaxOffset(); + + CompPages.CurrentPageLabel(); + + GUILayout.EndHorizontal(); + GUILayout.BeginHorizontal(null); + + if (GUILayout.Button("< Prev", new GUILayoutOption[] { GUILayout.Width(80) })) + { + CompPages.TurnPage(Turn.Left, ref this.m_compScroll); + } + if (GUILayout.Button("Next >", new GUILayoutOption[] { GUILayout.Width(80) })) + { + CompPages.TurnPage(Turn.Right, ref this.m_compScroll); + } + } + GUILayout.EndHorizontal(); + GUI.skin.button.alignment = TextAnchor.MiddleLeft; if (m_cachedDestroyList.Count > 0) { @@ -267,15 +324,15 @@ namespace Explorer if (m_components != null) { - foreach (var component in m_components) + int start = CompPages.CalculateOffsetIndex(); + + for (int j = start; (j < start + CompPages.PageLimit && j < CompPages.Count); j++) { + var component = m_components[j]; + if (!component) continue; var ilType = component.GetIl2CppType(); - if (ilType == ReflectionHelpers.TransformType) - { - continue; - } GUILayout.BeginHorizontal(null); if (ReflectionHelpers.BehaviourType.IsAssignableFrom(ilType)) @@ -286,7 +343,7 @@ namespace Explorer { GUILayout.Space(26); } - if (GUILayout.Button("" + ilType.Name + "", new GUILayoutOption[] { GUILayout.Width(m_rect.width / 2 - 90) })) + if (GUILayout.Button("" + ilType.Name + "", new GUILayoutOption[] { GUILayout.Width(m_rect.width / 2 - 100) })) { ReflectObject(component); } diff --git a/src/Windows/ReflectionWindow.cs b/src/Windows/ReflectionWindow.cs index fca607b..6132843 100644 --- a/src/Windows/ReflectionWindow.cs +++ b/src/Windows/ReflectionWindow.cs @@ -20,8 +20,10 @@ namespace Explorer private CacheObjectBase[] m_allCachedMembers; private CacheObjectBase[] m_cachedMembersFiltered; - private int m_pageOffset; - private int m_limitPerPage = 20; + + public PageHelper Pages = new PageHelper(); + //private int m_pageOffset; + //private int m_limitPerPage = 20; private bool m_autoUpdate = false; private string m_search = ""; @@ -138,7 +140,7 @@ namespace Explorer var name = $"{member.DeclaringType.Name}.{member.Name}"; // blacklist (should probably make a proper implementation) - if (name == "Type.DeclaringMethod" || member.Name.Contains("Il2CppType") || member.Name.StartsWith("get_") || member.Name.StartsWith("set_")) + if (name == "Type.DeclaringMethod" || member.Name.StartsWith("get_") || member.Name.StartsWith("set_")) //|| member.Name.Contains("Il2CppType") { continue; } @@ -254,34 +256,27 @@ namespace Explorer GUILayout.Space(10); + Pages.Count = m_cachedMembersFiltered.Length; + // prev/next page buttons GUILayout.BeginHorizontal(null); - GUILayout.Label("Limit per page:", new GUILayoutOption[] { GUILayout.Width(125) }); - var limitString = m_limitPerPage.ToString(); - limitString = GUILayout.TextField(limitString, new GUILayoutOption[] { GUILayout.Width(60) }); - if (int.TryParse(limitString, out int lim)) - { - m_limitPerPage = lim; - } - int count = m_cachedMembersFiltered.Length; - if (count > m_limitPerPage) + Pages.DrawLimitInputArea(); + + if (Pages.Count > Pages.PageLimit) { - int maxOffset = (int)Mathf.Ceil((float)(count / (decimal)m_limitPerPage)) - 1; + Pages.CalculateMaxOffset(); + if (GUILayout.Button("< Prev", new GUILayoutOption[] { GUILayout.Width(80) })) { - if (m_pageOffset > 0) m_pageOffset--; - scroll = Vector2.zero; + Pages.TurnPage(Turn.Left, ref this.scroll); } - GUI.skin.label.alignment = TextAnchor.MiddleCenter; - GUILayout.Label($"Page {m_pageOffset + 1}/{maxOffset + 1}", new GUILayoutOption[] { GUILayout.Width(80) }); - GUI.skin.label.alignment = TextAnchor.UpperLeft; + Pages.CurrentPageLabel(); if (GUILayout.Button("Next >", new GUILayoutOption[] { GUILayout.Width(80) })) { - if (m_pageOffset < maxOffset) m_pageOffset++; - scroll = Vector2.zero; + Pages.TurnPage(Turn.Right, ref this.scroll); } } GUILayout.EndHorizontal(); @@ -297,18 +292,9 @@ namespace Explorer GUILayout.BeginVertical(GUI.skin.box, null); var members = this.m_cachedMembersFiltered; - int start = m_pageOffset * m_limitPerPage; + int start = Pages.CalculateOffsetIndex(); - if (start >= count) - { - int maxOffset = (int)Mathf.Ceil((float)(m_cachedMembersFiltered.Length / (decimal)m_limitPerPage)) - 1; - if (m_pageOffset > maxOffset) - { - m_pageOffset = 0; - } - } - - for (int j = start; (j < start + m_limitPerPage && j < members.Length); j++) + for (int j = start; (j < start + Pages.PageLimit && j < members.Length); j++) { var holder = members[j]; @@ -325,7 +311,7 @@ namespace Explorer GUILayout.EndHorizontal(); // if not last element - if (!(j == (start + m_limitPerPage - 1) || j == (members.Length - 1))) + if (!(j == (start + Pages.PageLimit - 1) || j == (members.Length - 1))) UIStyles.HorizontalLine(new Color(0.07f, 0.07f, 0.07f), true); } @@ -367,7 +353,8 @@ namespace Explorer if (GUILayout.Button(label, new GUILayoutOption[] { GUILayout.Width(100) })) { m_filter = mode; - m_pageOffset = 0; + Pages.PageOffset = 0; + scroll = Vector2.zero; } GUI.color = Color.white; }