osu/osu.Game/Overlays/Rankings/Tables/RankingsTable.cs

141 lines
4.8 KiB
C#
Raw Normal View History

2019-09-27 16:33:52 +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;
using osu.Framework.Graphics.Containers;
using System.Collections.Generic;
using System.Linq;
using osu.Framework.Allocation;
using osu.Framework.Extensions;
using osu.Game.Graphics;
using osu.Game.Graphics.Sprites;
using osu.Framework.Extensions.IEnumerableExtensions;
using osu.Game.Users;
using osu.Game.Users.Drawables;
using osuTK;
2019-09-27 16:33:52 +00:00
namespace osu.Game.Overlays.Rankings.Tables
{
public abstract class RankingsTable<TModel> : TableContainer
{
2020-02-03 18:22:37 +00:00
protected const int TEXT_SIZE = 12;
2019-09-27 16:33:52 +00:00
private const float horizontal_inset = 20;
private const float row_height = 25;
private const int items_per_page = 50;
2019-11-29 06:35:33 +00:00
private readonly int page;
private readonly IReadOnlyList<TModel> rankings;
2019-11-28 17:09:05 +00:00
protected RankingsTable(int page, IReadOnlyList<TModel> rankings)
2019-09-27 16:33:52 +00:00
{
2019-11-29 06:35:33 +00:00
this.page = page;
this.rankings = rankings;
2019-09-27 16:33:52 +00:00
RelativeSizeAxes = Axes.X;
AutoSizeAxes = Axes.Y;
Padding = new MarginPadding { Horizontal = horizontal_inset };
RowSize = new Dimension(GridSizeMode.Absolute, row_height);
2019-11-29 06:35:33 +00:00
}
[BackgroundDependencyLoader]
private void load()
{
FillFlowContainer backgroundFlow;
2019-09-27 16:33:52 +00:00
AddInternal(backgroundFlow = new FillFlowContainer
{
RelativeSizeAxes = Axes.Both,
Depth = 1f,
Margin = new MarginPadding { Top = row_height }
});
2019-11-27 18:37:34 +00:00
2019-11-28 17:09:05 +00:00
rankings.ForEach(_ => backgroundFlow.Add(new TableRowBackground()));
2019-11-27 18:37:34 +00:00
2019-11-28 17:09:05 +00:00
Columns = mainHeaders.Concat(CreateAdditionalHeaders()).ToArray();
Content = rankings.Select((s, i) => createContent((page - 1) * items_per_page + i, s)).ToArray().ToRectangular();
2019-11-27 18:37:34 +00:00
}
private Drawable[] createContent(int index, TModel item) => new Drawable[] { createIndexDrawable(index), createMainContent(item) }.Concat(CreateAdditionalContent(item)).ToArray();
private static TableColumn[] mainHeaders => new[]
{
2020-02-03 18:22:37 +00:00
new TableColumn(string.Empty, Anchor.Centre, new Dimension(GridSizeMode.Absolute, 40)), // place
new TableColumn(string.Empty, Anchor.CentreLeft, new Dimension(GridSizeMode.Distributed)), // flag and username (country name)
};
protected abstract TableColumn[] CreateAdditionalHeaders();
2019-09-27 16:33:52 +00:00
protected abstract Drawable[] CreateAdditionalContent(TModel item);
2019-09-27 16:33:52 +00:00
protected override Drawable CreateHeader(int index, TableColumn column) => new HeaderText(column?.Header ?? string.Empty, HighlightedColumn());
protected abstract Country GetCountry(TModel item);
protected abstract Drawable CreateFlagContent(TModel item);
private OsuSpriteText createIndexDrawable(int index) => new OsuSpriteText
{
Text = $"#{index + 1}",
2020-02-03 18:22:37 +00:00
Font = OsuFont.GetFont(size: TEXT_SIZE, weight: FontWeight.SemiBold)
};
private FillFlowContainer createMainContent(TModel item) => new FillFlowContainer
{
AutoSizeAxes = Axes.Both,
Direction = FillDirection.Horizontal,
Spacing = new Vector2(7, 0),
2019-11-27 20:58:31 +00:00
Children = new[]
{
new UpdateableFlag(GetCountry(item))
{
Size = new Vector2(20, 13),
ShowPlaceholderOnNull = false,
},
CreateFlagContent(item)
}
};
2019-09-27 16:33:52 +00:00
protected virtual string HighlightedColumn() => @"Performance";
private class HeaderText : OsuSpriteText
{
private readonly string highlighted;
public HeaderText(string text, string highlighted)
{
this.highlighted = highlighted;
Text = text;
Font = OsuFont.GetFont(size: 12);
Margin = new MarginPadding { Horizontal = 10 };
2019-09-27 16:33:52 +00:00
}
[BackgroundDependencyLoader]
2020-02-03 18:22:37 +00:00
private void load(OverlayColourProvider colourProvider)
2019-09-27 16:33:52 +00:00
{
if (Text != highlighted)
2020-02-03 18:22:37 +00:00
Colour = colourProvider.Foreground1;
2019-09-27 16:33:52 +00:00
}
}
2019-10-01 11:12:03 +00:00
protected class RowText : OsuSpriteText
2019-09-27 16:33:52 +00:00
{
2019-10-01 11:12:03 +00:00
public RowText()
2019-09-27 16:33:52 +00:00
{
2019-09-29 12:27:29 +00:00
Font = OsuFont.GetFont(size: TEXT_SIZE);
2019-11-03 11:31:23 +00:00
Margin = new MarginPadding { Horizontal = 10 };
2019-09-27 16:33:52 +00:00
}
}
2019-10-01 11:12:03 +00:00
protected class ColoredRowText : RowText
2019-09-27 16:33:52 +00:00
{
[BackgroundDependencyLoader]
2020-02-03 18:22:37 +00:00
private void load(OverlayColourProvider colourProvider)
2019-09-27 16:33:52 +00:00
{
2020-02-03 18:22:37 +00:00
Colour = colourProvider.Foreground1;
2019-09-27 16:33:52 +00:00
}
}
}
}