1
0
mirror of https://github.com/ppy/osu.git synced 2025-02-15 11:02:57 +08:00

Add omission of pages when there are too many

This commit is contained in:
Dean Herbert 2022-01-04 19:05:14 +09:00
parent 86f72b71b1
commit 5ed69338a6
3 changed files with 76 additions and 27 deletions

View File

@ -35,14 +35,24 @@ namespace osu.Game.Tests.Visual.UserInterface
{ {
setAvailablePages(100); setAvailablePages(100);
AddAssert("Correct page buttons", () => pageSelector.ChildrenOfType<PageSelectorPageButton>().Select(p => p.PageNumber).SequenceEqual(new[] { 1, 2, 3, 100 })); selectPageIndex(0);
checkVisiblePageNumbers(new[] { 1, 2, 3, 100 });
selectPageIndex(6);
checkVisiblePageNumbers(new[] { 1, 5, 6, 7, 8, 9, 100 });
selectPageIndex(49);
checkVisiblePageNumbers(new[] { 1, 48, 49, 50, 51, 52, 100 });
selectPageIndex(99);
checkVisiblePageNumbers(new[] { 1, 98, 99, 100 });
} }
[Test] [Test]
public void TestResetCurrentPage() public void TestResetCurrentPage()
{ {
setAvailablePages(10); setAvailablePages(10);
selectPage(6); selectPageIndex(6);
setAvailablePages(11); setAvailablePages(11);
AddAssert("Page 1 is current", () => pageSelector.CurrentPage.Value == 0); AddAssert("Page 1 is current", () => pageSelector.CurrentPage.Value == 0);
} }
@ -51,14 +61,16 @@ namespace osu.Game.Tests.Visual.UserInterface
public void TestOutOfBoundsSelection() public void TestOutOfBoundsSelection()
{ {
setAvailablePages(10); setAvailablePages(10);
selectPage(11); selectPageIndex(11);
AddAssert("Page 10 is current", () => pageSelector.CurrentPage.Value == pageSelector.AvailablePages.Value - 1); AddAssert("Page 10 is current", () => pageSelector.CurrentPage.Value == pageSelector.AvailablePages.Value - 1);
selectPage(-1); selectPageIndex(-1);
AddAssert("Page 1 is current", () => pageSelector.CurrentPage.Value == 0); AddAssert("Page 1 is current", () => pageSelector.CurrentPage.Value == 0);
} }
private void selectPage(int pageIndex) => private void checkVisiblePageNumbers(int[] expected) => AddAssert($"Sequence is {string.Join(',', expected.Select(i => i.ToString()))}", () => pageSelector.ChildrenOfType<PageSelectorPageButton>().Select(p => p.PageNumber).SequenceEqual(expected));
private void selectPageIndex(int pageIndex) =>
AddStep($"Select page {pageIndex}", () => pageSelector.CurrentPage.Value = pageIndex); AddStep($"Select page {pageIndex}", () => pageSelector.CurrentPage.Value = pageIndex);
private void setAvailablePages(int availablePages) => private void setAvailablePages(int availablePages) =>

View File

@ -0,0 +1,33 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Game.Graphics.Sprites;
using osu.Game.Overlays;
namespace osu.Game.Graphics.UserInterface.PageSelector
{
internal class PageEllipsis : CompositeDrawable
{
[BackgroundDependencyLoader]
private void load(OverlayColourProvider colourProvider)
{
RelativeSizeAxes = Axes.Y;
AutoSizeAxes = Axes.X;
InternalChildren = new Drawable[]
{
new OsuSpriteText
{
Font = OsuFont.GetFont(size: 12, weight: FontWeight.SemiBold),
Text = "...",
Colour = colourProvider.Light3,
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
}
};
}
}
}

View File

@ -1,7 +1,7 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence. // Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text. // See the LICENCE file in the repository root for full licence text.
using System.Linq; using System;
using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Framework.Bindables; using osu.Framework.Bindables;
@ -50,43 +50,47 @@ namespace osu.Game.Graphics.UserInterface.PageSelector
{ {
base.LoadComplete(); base.LoadComplete();
CurrentPage.BindValueChanged(onCurrentPageChanged); CurrentPage.BindValueChanged(_ => redraw());
AvailablePages.BindValueChanged(_ => redraw(), true); AvailablePages.BindValueChanged(_ => redraw(), true);
} }
private void onCurrentPageChanged(ValueChangedEvent<int> currentPage) private void redraw()
{ {
if (currentPage.NewValue >= AvailablePages.Value) if (CurrentPage.Value >= AvailablePages.Value)
{ {
CurrentPage.Value = AvailablePages.Value - 1; CurrentPage.Value = AvailablePages.Value - 1;
return; return;
} }
foreach (var page in itemsFlow.OfType<PageSelectorPageButton>()) previousPageButton.Enabled.Value = CurrentPage.Value != 0;
page.Selected = page.PageNumber == currentPage.NewValue + 1; nextPageButton.Enabled.Value = CurrentPage.Value < AvailablePages.Value - 1;
previousPageButton.Enabled.Value = currentPage.NewValue != 0;
nextPageButton.Enabled.Value = currentPage.NewValue < AvailablePages.Value - 1;
}
private void redraw()
{
itemsFlow.Clear(); itemsFlow.Clear();
for (int i = 0; i < AvailablePages.Value; i++) int totalPages = AvailablePages.Value;
bool lastWasEllipsis = false;
for (int i = 0; i < totalPages; i++)
{ {
int pageIndex = i; int pageIndex = i;
itemsFlow.Add(new PageSelectorPageButton(pageIndex + 1) bool shouldShowPage = pageIndex == 0 || pageIndex == totalPages - 1 || Math.Abs(pageIndex - CurrentPage.Value) <= 2;
{
Action = () => CurrentPage.Value = pageIndex,
});
}
if (CurrentPage.Value != 0) if (shouldShowPage)
CurrentPage.Value = 0; {
else lastWasEllipsis = false;
CurrentPage.TriggerChange(); itemsFlow.Add(new PageSelectorPageButton(pageIndex + 1)
{
Action = () => CurrentPage.Value = pageIndex,
Selected = CurrentPage.Value == pageIndex,
});
}
else if (!lastWasEllipsis)
{
lastWasEllipsis = true;
itemsFlow.Add(new PageEllipsis());
}
}
} }
} }
} }