Skip to content

Commit 35c89be

Browse files
committed
Adding getpages method
1 parent b693b55 commit 35c89be

File tree

3 files changed

+385
-0
lines changed

3 files changed

+385
-0
lines changed

Scripts/Util/Utils.cs

+89
Original file line numberDiff line numberDiff line change
@@ -970,5 +970,94 @@ public static byte[] ReadAllBytes(string filePath)
970970
}
971971
}
972972
}
973+
974+
public static PageElement<T>[][] CalculatePages<T>((T value, float size)[] elements, float maxSize, float leftNavigationSize, float rightNavigationSize)
975+
{
976+
// For 3 elements and less its always best to just make it one page
977+
if (elements.Length <= 3)
978+
{
979+
return new[]
980+
{
981+
elements.Select(e =>
982+
{
983+
return new PageElement<T>
984+
{
985+
Size = e.size,
986+
Element = e.value,
987+
Type = ElementType.Element
988+
};
989+
}).ToArray()
990+
};
991+
}
992+
993+
var pages = new List<List<PageElement<T>>>();
994+
var currentPage = new List<PageElement<T>>();
995+
pages.Add(currentPage);
996+
997+
var buffer = maxSize;
998+
999+
for (var i = 0; i < elements.Length; i++)
1000+
{
1001+
var element = elements[i];
1002+
1003+
// First element of non first page is always left navigation
1004+
if (pages.Count > 1 && currentPage.Count == 0)
1005+
{
1006+
currentPage.Add(new PageElement<T>
1007+
{
1008+
Size = leftNavigationSize,
1009+
Type = ElementType.LeftNav
1010+
});
1011+
buffer -= leftNavigationSize;
1012+
1013+
i--;
1014+
// Skip this iteration
1015+
continue;
1016+
}
1017+
1018+
// Element and nav size does not fit on the page, create new page and continue with that one
1019+
var bufferTooSmall = buffer < element.size + rightNavigationSize;
1020+
var notEmpty = currentPage.Count >= 2;
1021+
var isNotLast = i < elements.Length - 1;
1022+
var biggerThanNav = element.size > rightNavigationSize;
1023+
if (bufferTooSmall && (isNotLast || biggerThanNav) && notEmpty)
1024+
{
1025+
currentPage.Add(new PageElement<T>
1026+
{
1027+
Size = rightNavigationSize,
1028+
Type = ElementType.RightNav
1029+
});
1030+
currentPage = new List<PageElement<T>>();
1031+
pages.Add(currentPage);
1032+
buffer = maxSize;
1033+
1034+
i--;
1035+
// Skip this iteration
1036+
continue;
1037+
}
1038+
1039+
currentPage.Add(new PageElement<T>
1040+
{
1041+
Size = element.size,
1042+
Element = element.value,
1043+
Type = ElementType.Element
1044+
});
1045+
buffer -= element.size;
1046+
}
1047+
1048+
return pages.Select(p => p.ToArray()).ToArray();
1049+
}
1050+
}
1051+
1052+
public struct PageElement<T>
1053+
{
1054+
public float Size;
1055+
public ElementType Type;
1056+
public T Element;
1057+
}
1058+
1059+
public enum ElementType
1060+
{
1061+
LeftNav, Element, RightNav
9731062
}
9741063
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,285 @@
1+
using System.Diagnostics;
2+
using System.IO;
3+
using System.Linq;
4+
using ElasticSea.Framework.Util;
5+
using Newtonsoft.Json;
6+
using Newtonsoft.Json.Converters;
7+
using Newtonsoft.Json.UnityConverters.Math;
8+
using NUnit.Framework;
9+
using PhysicalGizmos;
10+
using Debug = UnityEngine.Debug;
11+
12+
namespace Tests.Editor.Gizmos
13+
{
14+
public class UtilsGetPagesTests
15+
{
16+
[Test]
17+
public static void GetPagesTest2Elements()
18+
{
19+
var elements = new[] { ("0", 0.3f), ("1", 0.3f) };
20+
var maxSize = 1.5f;
21+
var navSize = 0.3f;
22+
var pages = Utils.CalculatePages(elements, maxSize, navSize, navSize);
23+
24+
var expected = new[]
25+
{
26+
new[]
27+
{
28+
new PageElement<string>
29+
{
30+
Element = "0",
31+
Type = ElementType.Element
32+
},
33+
new PageElement<string>
34+
{
35+
Element = "1",
36+
Type = ElementType.Element
37+
}
38+
}
39+
};
40+
41+
PagesEqual(expected, pages);
42+
}
43+
44+
[Test]
45+
public static void GetPagesSmall()
46+
{
47+
var elements = new[] { ("0", 0.3f), ("1", 0.3f), ("2", 0.3f), ("3", 0.3f), ("4", 0.3f) };
48+
var maxSize = 0.1f;
49+
var navSize = 0.3f;
50+
var pages = Utils.CalculatePages(elements, maxSize, navSize, navSize);
51+
52+
var expected = new[]
53+
{
54+
new[]
55+
{
56+
new PageElement<string>
57+
{
58+
Element = "0",
59+
Type = ElementType.Element
60+
},
61+
new PageElement<string>
62+
{
63+
Element = "1",
64+
Type = ElementType.Element
65+
},
66+
new PageElement<string>
67+
{
68+
Element = null,
69+
Type = ElementType.RightNav
70+
}
71+
},
72+
new[]
73+
{
74+
new PageElement<string>
75+
{
76+
Element = null,
77+
Type = ElementType.LeftNav
78+
},
79+
new PageElement<string>
80+
{
81+
Element = "2",
82+
Type = ElementType.Element
83+
},
84+
new PageElement<string>
85+
{
86+
Element = null,
87+
Type = ElementType.RightNav
88+
}
89+
},
90+
new[]
91+
{
92+
new PageElement<string>
93+
{
94+
Element = null,
95+
Type = ElementType.LeftNav
96+
},
97+
new PageElement<string>
98+
{
99+
Element = "3",
100+
Type = ElementType.Element
101+
},
102+
new PageElement<string>
103+
{
104+
Element = "4",
105+
Type = ElementType.Element
106+
}
107+
}
108+
};
109+
110+
PagesEqual(expected, pages);
111+
}
112+
113+
[Test]
114+
public static void GetPages4ElementsTooBig()
115+
{
116+
var elements = new[] { ("0", 146.9f), ("1", 146.9f), ("2", 146.9f), ("3", 146.9f)};
117+
var maxSize = 500f;
118+
var navSize = 13.96f;
119+
var pages = Utils.CalculatePages(elements, maxSize, navSize, navSize);
120+
121+
var expected = new[]
122+
{
123+
new[]
124+
{
125+
new PageElement<string>
126+
{
127+
Element = "0",
128+
Type = ElementType.Element
129+
},
130+
new PageElement<string>
131+
{
132+
Element = "1",
133+
Type = ElementType.Element
134+
},
135+
new PageElement<string>
136+
{
137+
Element = "2",
138+
Type = ElementType.Element
139+
},
140+
new PageElement<string>
141+
{
142+
Element = null,
143+
Type = ElementType.RightNav
144+
}
145+
},
146+
new[]
147+
{
148+
new PageElement<string>
149+
{
150+
Element = null,
151+
Type = ElementType.LeftNav
152+
},
153+
new PageElement<string>
154+
{
155+
Element = "3",
156+
Type = ElementType.Element
157+
}
158+
}
159+
};
160+
161+
PagesEqual(expected, pages);
162+
}
163+
164+
// [Test]
165+
// public static void GetPagesTestPageTooSmall()
166+
// {
167+
// var elements = new[] { "0", "1" };
168+
// var maxSize = 0f;
169+
// var navSize = 0.3f;
170+
// var buttonSizeFormatter = new TestFormater(0.3f);
171+
// var pages = PhysicsButtonUtils.GetPages(elements, maxSize, navSize, buttonSizeFormatter);
172+
//
173+
// var expected = new[]
174+
// {
175+
// new[]
176+
// {
177+
// new PageElement<string>
178+
// {
179+
// Element = "0",
180+
// Type = ElementType.Element
181+
// },
182+
// new PageElement<string>
183+
// {
184+
// Type = ElementType.RightNav
185+
// }
186+
// }
187+
// };
188+
//
189+
// PagesEqual(expected, pages);
190+
// }
191+
192+
[Test]
193+
public static void GetPagesTest4Elements3MaxInPage()
194+
{
195+
var elements = new[] { ("0", 0.5f), ("1", 0.5f), ("2", 0.5f), ("3", 0.5f) };
196+
var maxSize = 1.5f;
197+
var navSize = 0.5f;
198+
var pages = Utils.CalculatePages(elements, maxSize, navSize, navSize);
199+
200+
var expected = new[]
201+
{
202+
new[]
203+
{
204+
new PageElement<string>()
205+
{
206+
Element = "0",
207+
Type = ElementType.Element
208+
},
209+
new PageElement<string>()
210+
{
211+
Element = "1",
212+
Type = ElementType.Element
213+
},
214+
new PageElement<string>()
215+
{
216+
Type = ElementType.RightNav
217+
}
218+
},
219+
new[]
220+
{
221+
new PageElement<string>
222+
{
223+
Type = ElementType.LeftNav
224+
},
225+
new PageElement<string>
226+
{
227+
Element = "2",
228+
Type = ElementType.Element
229+
},
230+
new PageElement<string>
231+
{
232+
Element = "3",
233+
Type = ElementType.Element
234+
}
235+
}
236+
};
237+
238+
PagesEqual(expected, pages);
239+
}
240+
241+
// [Test]
242+
// public static void GetPagesTest()
243+
// {
244+
// var elements = Enumerable.Range(0, 11).Select(i => i.ToString()).ToArray();
245+
// var maxSize = 1.5f;
246+
// var navSize = 0.3f;
247+
// var buttonSizeFormatter = new TestFormater(0.3f);
248+
// var pages = PhysicsButtonUtils.GetPages(elements, maxSize, navSize, buttonSizeFormatter);
249+
//
250+
// // var expected = new PageElement<string>[][]
251+
// // {
252+
// // new PageElement<string>[]
253+
// // {
254+
// //
255+
// // }
256+
// // }
257+
// // Assert.AreEqual(pages.Length, 3);
258+
// // Assert.AreEqual(pages[0].Length, 5);
259+
// // Assert.AreEqual(pages[1].Length, 5);
260+
// // Assert.AreEqual(pages[2].Length, 5);
261+
// // Debug.Log("hhelo");
262+
// // PagesEqual()
263+
// }
264+
265+
private static void PagesEqual(PageElement<string>[][] expected, PageElement<string>[][] actual)
266+
{
267+
Assert.AreEqual(expected.Length, actual.Length);
268+
for (int i = 0; i < expected.Length; i++)
269+
{
270+
var e = expected[i];
271+
var a = actual[i];
272+
273+
Assert.AreEqual(e.Length, a.Length);
274+
for (int j = 0; j < e.Length; j++)
275+
{
276+
var e1 = e[j];
277+
var a1 = a[j];
278+
279+
Assert.AreEqual(e1.Type, a1.Type);
280+
Assert.AreEqual(e1.Element, a1.Element);
281+
}
282+
}
283+
}
284+
}
285+
}

Tests/Editor/Utils/PhysicsButtonUtilsTests.cs.meta

+11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)