osu/osu.Game/Graphics/UserInterface/PageSelector/PageSelector.cs

108 lines
3.2 KiB
C#
Raw Normal View History

2019-09-07 04:31:07 +00:00
// 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.Graphics.Containers;
using osu.Framework.Graphics;
using osu.Framework.Bindables;
2019-09-07 20:42:30 +00:00
using osu.Framework.Extensions.IEnumerableExtensions;
2019-09-07 04:31:07 +00:00
namespace osu.Game.Graphics.UserInterface.PageSelector
2019-09-07 04:31:07 +00:00
{
public class PageSelector : CompositeDrawable
{
2019-09-07 06:20:11 +00:00
public readonly BindableInt CurrentPage = new BindableInt(1);
2019-09-09 22:36:25 +00:00
public readonly BindableInt MaxPages = new BindableInt(1);
2019-09-07 04:31:07 +00:00
2020-01-04 18:14:56 +00:00
private readonly FillFlowContainer<DrawablePage> itemsFlow;
2019-09-07 04:31:07 +00:00
2020-01-04 18:14:56 +00:00
private readonly PageSelectorButton previousPageButton;
private readonly PageSelectorButton nextPageButton;
2019-09-09 22:36:25 +00:00
public PageSelector()
2019-09-07 04:31:07 +00:00
{
AutoSizeAxes = Axes.Both;
InternalChild = new FillFlowContainer
2019-09-07 04:31:07 +00:00
{
AutoSizeAxes = Axes.Both,
2019-09-07 04:31:07 +00:00
Direction = FillDirection.Horizontal,
Children = new Drawable[]
{
2020-01-04 18:14:56 +00:00
previousPageButton = new PageSelectorButton(false, "prev")
{
Action = () => CurrentPage.Value -= 1,
},
2020-01-04 18:14:56 +00:00
itemsFlow = new FillFlowContainer<DrawablePage>
{
AutoSizeAxes = Axes.Both,
Direction = FillDirection.Horizontal,
},
2020-01-04 18:14:56 +00:00
nextPageButton = new PageSelectorButton(true, "next")
{
Action = () => CurrentPage.Value += 1
}
}
2019-09-07 04:31:07 +00:00
};
}
protected override void LoadComplete()
{
base.LoadComplete();
2020-01-04 18:14:56 +00:00
MaxPages.BindValueChanged(_ => redraw());
CurrentPage.BindValueChanged(page => onCurrentPageChanged(page.NewValue));
redraw();
2019-09-07 04:31:07 +00:00
}
2020-01-04 18:14:56 +00:00
private void onCurrentPageChanged(int newPage)
2019-09-07 04:31:07 +00:00
{
2020-01-04 18:14:56 +00:00
if (newPage < 1)
2019-09-07 21:27:40 +00:00
{
2020-01-04 18:14:56 +00:00
CurrentPage.Value = 1;
2019-09-07 21:27:40 +00:00
return;
}
2020-01-04 18:14:56 +00:00
if (newPage > MaxPages.Value)
2019-09-09 22:36:25 +00:00
{
2020-01-04 18:14:56 +00:00
CurrentPage.Value = MaxPages.Value;
2019-09-09 22:36:25 +00:00
return;
}
2020-01-04 19:05:34 +00:00
itemsFlow.ForEach(page => page.Selected = page.Page == newPage);
2020-01-04 18:14:56 +00:00
updateButtonsState();
2019-09-09 22:36:25 +00:00
}
2020-01-04 18:14:56 +00:00
private void redraw()
2019-09-09 22:36:25 +00:00
{
2020-01-04 18:14:56 +00:00
itemsFlow.Clear();
if (MaxPages.Value < 1)
{
MaxPages.Value = 1;
return;
}
for (int i = 1; i <= MaxPages.Value; i++)
addDrawablePage(i);
2020-01-04 19:25:08 +00:00
if (CurrentPage.Value == 1)
CurrentPage.TriggerChange();
else
2019-09-07 21:27:40 +00:00
CurrentPage.Value = 1;
2019-09-09 22:36:25 +00:00
}
2020-01-04 18:14:56 +00:00
private void updateButtonsState()
2019-09-09 22:36:25 +00:00
{
2019-09-07 21:27:40 +00:00
int newPage = CurrentPage.Value;
2019-09-09 22:36:25 +00:00
int maxPages = MaxPages.Value;
2019-09-07 21:27:40 +00:00
2019-09-07 19:33:26 +00:00
previousPageButton.Enabled.Value = newPage != 1;
nextPageButton.Enabled.Value = newPage != maxPages;
}
2020-01-04 18:14:56 +00:00
private void addDrawablePage(int page) => itemsFlow.Add(new DrawablePage(page)
{
2019-09-07 20:42:30 +00:00
Action = () => CurrentPage.Value = page,
});
2019-09-07 04:31:07 +00:00
}
}