mirror of
https://github.com/ppy/osu.git
synced 2025-02-15 20:05:29 +08:00
Add omission of pages when there are too many
This commit is contained in:
parent
86f72b71b1
commit
5ed69338a6
@ -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) =>
|
||||||
|
33
osu.Game/Graphics/UserInterface/PageSelector/PageEllipsis.cs
Normal file
33
osu.Game/Graphics/UserInterface/PageSelector/PageEllipsis.cs
Normal 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,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
|
||||||
|
bool shouldShowPage = pageIndex == 0 || pageIndex == totalPages - 1 || Math.Abs(pageIndex - CurrentPage.Value) <= 2;
|
||||||
|
|
||||||
|
if (shouldShowPage)
|
||||||
|
{
|
||||||
|
lastWasEllipsis = false;
|
||||||
itemsFlow.Add(new PageSelectorPageButton(pageIndex + 1)
|
itemsFlow.Add(new PageSelectorPageButton(pageIndex + 1)
|
||||||
{
|
{
|
||||||
Action = () => CurrentPage.Value = pageIndex,
|
Action = () => CurrentPage.Value = pageIndex,
|
||||||
|
Selected = CurrentPage.Value == pageIndex,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
else if (!lastWasEllipsis)
|
||||||
if (CurrentPage.Value != 0)
|
{
|
||||||
CurrentPage.Value = 0;
|
lastWasEllipsis = true;
|
||||||
else
|
itemsFlow.Add(new PageEllipsis());
|
||||||
CurrentPage.TriggerChange();
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user