Merge remote-tracking branch 'peppy/modular-results-screen' into timeshift-wip

# Conflicts:
#	osu.Game/Screens/Multi/IMultiplayerScreen.cs
#	osu.Game/Screens/Play/Player.cs
#	osu.Game/Screens/Play/SoloResults.cs
#	osu.Game/Screens/Ranking/IResultPageInfo.cs
#	osu.Game/Screens/Ranking/ResultMode.cs
#	osu.Game/Screens/Ranking/ResultModeButton.cs
#	osu.Game/Screens/Ranking/ResultModeTabControl.cs
#	osu.Game/Screens/Ranking/Results.cs
This commit is contained in:
smoogipoo 2018-12-22 16:22:02 +09:00
commit c2a00b84c7
13 changed files with 200 additions and 206 deletions

View File

@ -68,31 +68,33 @@ namespace osu.Game.Tests.Visual
chatDisplay.Channel.Value = testChannel; chatDisplay.Channel.Value = testChannel;
chatDisplay2.Channel.Value = testChannel; chatDisplay2.Channel.Value = testChannel;
AddStep("message from admin", () => testChannel.AddLocalEcho(new LocalEchoMessage int sequence = 0;
AddStep("message from admin", () => testChannel.AddNewMessages(new Message(sequence++)
{ {
Sender = admin, Sender = admin,
Content = "I am a wang!" Content = "I am a wang!"
})); }));
AddStep("message from team red", () => testChannel.AddLocalEcho(new LocalEchoMessage AddStep("message from team red", () => testChannel.AddNewMessages(new Message(sequence++)
{ {
Sender = redUser, Sender = redUser,
Content = "I am team red." Content = "I am team red."
})); }));
AddStep("message from team red", () => testChannel.AddLocalEcho(new LocalEchoMessage AddStep("message from team red", () => testChannel.AddNewMessages(new Message(sequence++)
{ {
Sender = redUser, Sender = redUser,
Content = "I plan to win!" Content = "I plan to win!"
})); }));
AddStep("message from team blue", () => testChannel.AddLocalEcho(new LocalEchoMessage AddStep("message from team blue", () => testChannel.AddNewMessages(new Message(sequence++)
{ {
Sender = blueUser, Sender = blueUser,
Content = "Not on my watch. Prepare to eat saaaaaaaaaand. Lots and lots of saaaaaaand." Content = "Not on my watch. Prepare to eat saaaaaaaaaand. Lots and lots of saaaaaaand."
})); }));
AddStep("message from admin", () => testChannel.AddLocalEcho(new LocalEchoMessage AddStep("message from admin", () => testChannel.AddNewMessages(new Message(sequence++)
{ {
Sender = admin, Sender = admin,
Content = "Okay okay, calm down guys. Let's do this!" Content = "Okay okay, calm down guys. Let's do this!"

View File

@ -1,19 +1,15 @@
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>. // Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using System.Collections.Generic; using System;
using System.Linq;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Configuration; using osu.Framework.Configuration;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes; using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.UserInterface; using osu.Framework.Graphics.UserInterface;
using osu.Game.Graphics;
using osu.Game.Graphics.Containers;
using osu.Game.Graphics.Sprites;
using osu.Game.Graphics.UserInterface; using osu.Game.Graphics.UserInterface;
using osuTK; using osu.Game.Overlays.Chat;
using osuTK.Graphics; using osuTK.Graphics;
namespace osu.Game.Online.Chat namespace osu.Game.Online.Chat
@ -23,22 +19,27 @@ namespace osu.Game.Online.Chat
/// </summary> /// </summary>
public class StandAloneChatDisplay : CompositeDrawable public class StandAloneChatDisplay : CompositeDrawable
{ {
private readonly bool postingTextbox;
public readonly Bindable<Channel> Channel = new Bindable<Channel>(); public readonly Bindable<Channel> Channel = new Bindable<Channel>();
private readonly FillFlowContainer messagesFlow;
private Channel lastChannel;
private readonly FocusedTextBox textbox; private readonly FocusedTextBox textbox;
protected ChannelManager ChannelManager; protected ChannelManager ChannelManager;
private ScrollContainer scroll;
private DrawableChannel drawableChannel;
private const float textbox_height = 30;
/// <summary> /// <summary>
/// Construct a new instance. /// Construct a new instance.
/// </summary> /// </summary>
/// <param name="postingTextbox">Whether a textbox for posting new messages should be displayed.</param> /// <param name="postingTextbox">Whether a textbox for posting new messages should be displayed.</param>
public StandAloneChatDisplay(bool postingTextbox = false) public StandAloneChatDisplay(bool postingTextbox = false)
{ {
this.postingTextbox = postingTextbox;
CornerRadius = 10; CornerRadius = 10;
Masking = true; Masking = true;
@ -50,23 +51,10 @@ namespace osu.Game.Online.Chat
Alpha = 0.8f, Alpha = 0.8f,
RelativeSizeAxes = Axes.Both RelativeSizeAxes = Axes.Both
}, },
messagesFlow = new FillFlowContainer
{
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
LayoutEasing = Easing.Out,
LayoutDuration = 500,
Anchor = Anchor.BottomLeft,
Origin = Anchor.BottomLeft,
Direction = FillDirection.Vertical
}
}; };
const float textbox_height = 30;
if (postingTextbox) if (postingTextbox)
{ {
messagesFlow.Y -= textbox_height;
AddInternal(textbox = new FocusedTextBox AddInternal(textbox = new FocusedTextBox
{ {
RelativeSizeAxes = Axes.X, RelativeSizeAxes = Axes.X,
@ -117,112 +105,43 @@ namespace osu.Game.Online.Chat
this.MoveToY(100, 500, Easing.In); this.MoveToY(100, 500, Easing.In);
} }
protected virtual Drawable CreateMessage(Message message) protected virtual ChatLine CreateMessage(Message message) => new StandAloneMessage(message);
{
return new StandAloneMessage(message);
}
private void channelChanged(Channel channel) private void channelChanged(Channel channel)
{ {
if (lastChannel != null) drawableChannel?.Expire();
lastChannel.NewMessagesArrived -= newMessages;
lastChannel = channel;
messagesFlow.Clear();
if (channel == null) return; if (channel == null) return;
channel.NewMessagesArrived += newMessages; AddInternal(drawableChannel = new StandAloneDrawableChannel(channel)
{
newMessages(channel.Messages); CreateChatLineAction = CreateMessage,
Padding = new MarginPadding { Bottom = postingTextbox ? textbox_height : 0 }
});
} }
private void newMessages(IEnumerable<Message> messages) protected class StandAloneDrawableChannel : DrawableChannel
{ {
var excessChildren = messagesFlow.Children.Count - 10; public Func<Message,ChatLine> CreateChatLineAction;
if (excessChildren > 0)
foreach (var c in messagesFlow.Children.Take(excessChildren))
c.Expire();
foreach (var message in messages) protected override ChatLine CreateChatLine(Message m) => CreateChatLineAction(m);
public StandAloneDrawableChannel(Channel channel)
: base(channel)
{ {
var formatted = MessageFormatter.FormatMessage(message); ChatLineFlow.Padding = new MarginPadding { Horizontal = 0 };
var drawable = CreateMessage(formatted);
drawable.Y = messagesFlow.Height;
messagesFlow.Add(drawable);
} }
} }
protected class StandAloneMessage : CompositeDrawable protected class StandAloneMessage : ChatLine
{ {
protected readonly Message Message; protected override float TextSize => 15;
protected OsuSpriteText SenderText;
protected Circle ColourBox;
public StandAloneMessage(Message message) protected override float HorizontalPadding => 10;
protected override float MessagePadding => 120;
public StandAloneMessage(Message message) : base(message)
{ {
Message = message;
}
[BackgroundDependencyLoader]
private void load()
{
Margin = new MarginPadding(3);
RelativeSizeAxes = Axes.X;
AutoSizeAxes = Axes.Y;
InternalChildren = new Drawable[]
{
new FillFlowContainer
{
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
Direction = FillDirection.Horizontal,
Children = new Drawable[]
{
new Container
{
RelativeSizeAxes = Axes.X,
Width = 0.2f,
Children = new Drawable[]
{
SenderText = new OsuSpriteText
{
Font = @"Exo2.0-Bold",
Anchor = Anchor.TopRight,
Origin = Anchor.TopRight,
Text = Message.Sender.ToString()
}
}
},
new Container
{
Size = new Vector2(8, OsuSpriteText.FONT_SIZE),
Margin = new MarginPadding { Horizontal = 3 },
Children = new Drawable[]
{
ColourBox = new Circle
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
Size = new Vector2(8)
}
}
},
new OsuTextFlowContainer
{
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
Width = 0.5f,
Text = Message.DisplayContent
}
}
}
};
if (!string.IsNullOrEmpty(Message.Sender.Colour))
SenderText.Colour = ColourBox.Colour = OsuColour.FromHex(Message.Sender.Colour);
} }
} }
} }

View File

@ -1,72 +1,38 @@
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>. // Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using System; using System;
using System.Linq; using System.Linq;
using osuTK;
using osuTK.Graphics;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Cursor;
using osu.Framework.Graphics.UserInterface;
using osu.Game.Graphics; using osu.Game.Graphics;
using osu.Game.Graphics.Containers; using osu.Game.Graphics.Containers;
using osu.Game.Graphics.Sprites; using osu.Game.Graphics.Sprites;
using osu.Game.Graphics.UserInterface;
using osu.Game.Online.Chat; using osu.Game.Online.Chat;
using osu.Game.Users; using osu.Game.Users;
using osu.Framework.Graphics.Cursor; using osuTK;
using osu.Framework.Graphics.UserInterface; using osuTK.Graphics;
using osu.Game.Graphics.UserInterface;
namespace osu.Game.Overlays.Chat namespace osu.Game.Overlays.Chat
{ {
public class ChatLine : Container public class ChatLine : CompositeDrawable
{ {
private static readonly Color4[] username_colours = public const float LEFT_PADDING = default_message_padding + default_horizontal_padding * 2;
{
OsuColour.FromHex("588c7e"),
OsuColour.FromHex("b2a367"),
OsuColour.FromHex("c98f65"),
OsuColour.FromHex("bc5151"),
OsuColour.FromHex("5c8bd6"),
OsuColour.FromHex("7f6ab7"),
OsuColour.FromHex("a368ad"),
OsuColour.FromHex("aa6880"),
OsuColour.FromHex("6fad9b"), private const float default_message_padding = 200;
OsuColour.FromHex("f2e394"),
OsuColour.FromHex("f2ae72"),
OsuColour.FromHex("f98f8a"),
OsuColour.FromHex("7daef4"),
OsuColour.FromHex("a691f2"),
OsuColour.FromHex("c894d3"),
OsuColour.FromHex("d895b0"),
OsuColour.FromHex("53c4a1"), protected virtual float MessagePadding => default_message_padding;
OsuColour.FromHex("eace5c"),
OsuColour.FromHex("ea8c47"),
OsuColour.FromHex("fc4f4f"),
OsuColour.FromHex("3d94ea"),
OsuColour.FromHex("7760ea"),
OsuColour.FromHex("af52c6"),
OsuColour.FromHex("e25696"),
OsuColour.FromHex("677c66"), private const float default_horizontal_padding = 15;
OsuColour.FromHex("9b8732"),
OsuColour.FromHex("8c5129"),
OsuColour.FromHex("8c3030"),
OsuColour.FromHex("1f5d91"),
OsuColour.FromHex("4335a5"),
OsuColour.FromHex("812a96"),
OsuColour.FromHex("992861"),
};
public const float LEFT_PADDING = message_padding + padding * 2; protected virtual float HorizontalPadding => default_horizontal_padding;
private const float padding = 15; protected virtual float TextSize => 20;
private const float message_padding = 200;
private const float action_padding = 3;
private const float text_size = 20;
private Color4 customUsernameColour; private Color4 customUsernameColour;
@ -75,14 +41,13 @@ namespace osu.Game.Overlays.Chat
public ChatLine(Message message) public ChatLine(Message message)
{ {
Message = message; Message = message;
Padding = new MarginPadding { Left = HorizontalPadding, Right = HorizontalPadding };
RelativeSizeAxes = Axes.X; RelativeSizeAxes = Axes.X;
AutoSizeAxes = Axes.Y; AutoSizeAxes = Axes.Y;
Padding = new MarginPadding { Left = padding, Right = padding };
} }
private ChannelManager chatManager; [Resolved(CanBeNull = true)]
private ChannelManager chatManager { get; set; }
private Message message; private Message message;
private OsuSpriteText username; private OsuSpriteText username;
@ -106,10 +71,9 @@ namespace osu.Game.Overlays.Chat
} }
} }
[BackgroundDependencyLoader(true)] [BackgroundDependencyLoader]
private void load(OsuColour colours, ChannelManager chatManager) private void load(OsuColour colours)
{ {
this.chatManager = chatManager;
customUsernameColour = colours.ChatBlue; customUsernameColour = colours.ChatBlue;
} }
@ -125,7 +89,7 @@ namespace osu.Game.Overlays.Chat
{ {
Font = @"Exo2.0-BoldItalic", Font = @"Exo2.0-BoldItalic",
Colour = hasBackground ? customUsernameColour : username_colours[message.Sender.Id % username_colours.Length], Colour = hasBackground ? customUsernameColour : username_colours[message.Sender.Id % username_colours.Length],
TextSize = text_size, TextSize = TextSize,
}; };
if (hasBackground) if (hasBackground)
@ -163,11 +127,11 @@ namespace osu.Game.Overlays.Chat
}; };
} }
Children = new Drawable[] InternalChildren = new Drawable[]
{ {
new Container new Container
{ {
Size = new Vector2(message_padding, text_size), Size = new Vector2(MessagePadding, TextSize),
Children = new Drawable[] Children = new Drawable[]
{ {
timestamp = new OsuSpriteText timestamp = new OsuSpriteText
@ -176,7 +140,7 @@ namespace osu.Game.Overlays.Chat
Origin = Anchor.CentreLeft, Origin = Anchor.CentreLeft,
Font = @"Exo2.0-SemiBold", Font = @"Exo2.0-SemiBold",
FixedWidth = true, FixedWidth = true,
TextSize = text_size * 0.75f, TextSize = TextSize * 0.75f,
}, },
new MessageSender(message.Sender) new MessageSender(message.Sender)
{ {
@ -191,7 +155,7 @@ namespace osu.Game.Overlays.Chat
{ {
RelativeSizeAxes = Axes.X, RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y, AutoSizeAxes = Axes.Y,
Padding = new MarginPadding { Left = message_padding + padding }, Padding = new MarginPadding { Left = MessagePadding + HorizontalPadding },
Children = new Drawable[] Children = new Drawable[]
{ {
contentFlow = new LinkFlowContainer(t => contentFlow = new LinkFlowContainer(t =>
@ -204,7 +168,7 @@ namespace osu.Game.Overlays.Chat
t.Colour = OsuColour.FromHex(message.Sender.Colour); t.Colour = OsuColour.FromHex(message.Sender.Colour);
} }
t.TextSize = text_size; t.TextSize = TextSize;
}) })
{ {
AutoSizeAxes = Axes.Y, AutoSizeAxes = Axes.Y,
@ -257,5 +221,44 @@ namespace osu.Game.Overlays.Chat
new OsuMenuItem("Start Chat", MenuItemType.Standard, startChatAction), new OsuMenuItem("Start Chat", MenuItemType.Standard, startChatAction),
}; };
} }
private static readonly Color4[] username_colours =
{
OsuColour.FromHex("588c7e"),
OsuColour.FromHex("b2a367"),
OsuColour.FromHex("c98f65"),
OsuColour.FromHex("bc5151"),
OsuColour.FromHex("5c8bd6"),
OsuColour.FromHex("7f6ab7"),
OsuColour.FromHex("a368ad"),
OsuColour.FromHex("aa6880"),
OsuColour.FromHex("6fad9b"),
OsuColour.FromHex("f2e394"),
OsuColour.FromHex("f2ae72"),
OsuColour.FromHex("f98f8a"),
OsuColour.FromHex("7daef4"),
OsuColour.FromHex("a691f2"),
OsuColour.FromHex("c894d3"),
OsuColour.FromHex("d895b0"),
OsuColour.FromHex("53c4a1"),
OsuColour.FromHex("eace5c"),
OsuColour.FromHex("ea8c47"),
OsuColour.FromHex("fc4f4f"),
OsuColour.FromHex("3d94ea"),
OsuColour.FromHex("7760ea"),
OsuColour.FromHex("af52c6"),
OsuColour.FromHex("e25696"),
OsuColour.FromHex("677c66"),
OsuColour.FromHex("9b8732"),
OsuColour.FromHex("8c5129"),
OsuColour.FromHex("8c3030"),
OsuColour.FromHex("1f5d91"),
OsuColour.FromHex("4335a5"),
OsuColour.FromHex("812a96"),
OsuColour.FromHex("992861"),
};
} }
} }

View File

@ -17,7 +17,7 @@ namespace osu.Game.Overlays.Chat
public class DrawableChannel : Container public class DrawableChannel : Container
{ {
public readonly Channel Channel; public readonly Channel Channel;
private readonly ChatLineContainer flow; protected readonly ChatLineContainer ChatLineFlow;
private readonly ScrollContainer scroll; private readonly ScrollContainer scroll;
public DrawableChannel(Channel channel) public DrawableChannel(Channel channel)
@ -38,7 +38,7 @@ namespace osu.Game.Overlays.Chat
{ {
RelativeSizeAxes = Axes.X, RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y, AutoSizeAxes = Axes.Y,
Child = flow = new ChatLineContainer Child = ChatLineFlow = new ChatLineContainer
{ {
Padding = new MarginPadding { Left = 20, Right = 20 }, Padding = new MarginPadding { Left = 20, Right = 20 },
RelativeSizeAxes = Axes.X, RelativeSizeAxes = Axes.X,
@ -72,17 +72,19 @@ namespace osu.Game.Overlays.Chat
Channel.PendingMessageResolved -= pendingMessageResolved; Channel.PendingMessageResolved -= pendingMessageResolved;
} }
protected virtual ChatLine CreateChatLine(Message m) => new ChatLine(m);
private void newMessagesArrived(IEnumerable<Message> newMessages) private void newMessagesArrived(IEnumerable<Message> newMessages)
{ {
// Add up to last Channel.MAX_HISTORY messages // Add up to last Channel.MAX_HISTORY messages
var displayMessages = newMessages.Skip(Math.Max(0, newMessages.Count() - Channel.MaxHistory)); var displayMessages = newMessages.Skip(Math.Max(0, newMessages.Count() - Channel.MaxHistory));
flow.AddRange(displayMessages.Select(m => new ChatLine(m))); ChatLineFlow.AddRange(displayMessages.Select(CreateChatLine));
if (scroll.IsScrolledToEnd(10) || !flow.Children.Any() || newMessages.Any(m => m is LocalMessage)) if (scroll.IsScrolledToEnd(10) || !ChatLineFlow.Children.Any() || newMessages.Any(m => m is LocalMessage))
scrollToEnd(); scrollToEnd();
var staleMessages = flow.Children.Where(c => c.LifetimeEnd == double.MaxValue).ToArray(); var staleMessages = ChatLineFlow.Children.Where(c => c.LifetimeEnd == double.MaxValue).ToArray();
int count = staleMessages.Length - Channel.MaxHistory; int count = staleMessages.Length - Channel.MaxHistory;
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
@ -96,25 +98,25 @@ namespace osu.Game.Overlays.Chat
private void pendingMessageResolved(Message existing, Message updated) private void pendingMessageResolved(Message existing, Message updated)
{ {
var found = flow.Children.LastOrDefault(c => c.Message == existing); var found = ChatLineFlow.Children.LastOrDefault(c => c.Message == existing);
if (found != null) if (found != null)
{ {
Trace.Assert(updated.Id.HasValue, "An updated message was returned with no ID."); Trace.Assert(updated.Id.HasValue, "An updated message was returned with no ID.");
flow.Remove(found); ChatLineFlow.Remove(found);
found.Message = updated; found.Message = updated;
flow.Add(found); ChatLineFlow.Add(found);
} }
} }
private void messageRemoved(Message removed) private void messageRemoved(Message removed)
{ {
flow.Children.FirstOrDefault(c => c.Message == removed)?.FadeColour(Color4.Red, 400).FadeOut(600).Expire(); ChatLineFlow.Children.FirstOrDefault(c => c.Message == removed)?.FadeColour(Color4.Red, 400).FadeOut(600).Expire();
} }
private void scrollToEnd() => ScheduleAfterChildren(() => scroll.ScrollToEnd()); private void scrollToEnd() => ScheduleAfterChildren(() => scroll.ScrollToEnd());
private class ChatLineContainer : FillFlowContainer<ChatLine> protected class ChatLineContainer : FillFlowContainer<ChatLine>
{ {
protected override int Compare(Drawable x, Drawable y) protected override int Compare(Drawable x, Drawable y)
{ {

View File

@ -28,7 +28,6 @@ using osu.Game.Rulesets.Mods;
using osu.Game.Rulesets.Scoring; using osu.Game.Rulesets.Scoring;
using osu.Game.Rulesets.UI; using osu.Game.Rulesets.UI;
using osu.Game.Scoring; using osu.Game.Scoring;
using osu.Game.Screens.Ranking;
using osu.Game.Skinning; using osu.Game.Skinning;
using osu.Game.Storyboards.Drawables; using osu.Game.Storyboards.Drawables;
@ -288,7 +287,7 @@ namespace osu.Game.Screens.Play
if (RulesetContainer.Replay == null) if (RulesetContainer.Replay == null)
scoreManager.Import(score, true); scoreManager.Import(score, true);
Push(CreateResults(score)); Push(new SoloResults(score));
onCompletionEvent = null; onCompletionEvent = null;
}); });
@ -432,7 +431,5 @@ namespace osu.Game.Screens.Play
if (storyboardVisible && beatmap.Storyboard.ReplacesBackground) if (storyboardVisible && beatmap.Storyboard.ReplacesBackground)
Background?.FadeTo(0, BACKGROUND_FADE_DURATION, Easing.OutQuint); Background?.FadeTo(0, BACKGROUND_FADE_DURATION, Easing.OutQuint);
} }
protected virtual Results CreateResults(ScoreInfo score) => new SoloResults(score);
} }
} }

View File

@ -15,10 +15,10 @@ namespace osu.Game.Screens.Play
{ {
} }
protected override IEnumerable<IResultType> CreateResultTypes() => new IResultType[] protected override IEnumerable<IResultPageInfo> CreateResultPages() => new IResultPageInfo[]
{ {
new ScoreResultType(Score, Beatmap), new ScoreOverviewPageInfo(Score, Beatmap),
new RankingResultType(Score, Beatmap) new BeatmapLeaderboardPageInfo(Score, Beatmap)
}; };
} }
} }

View File

@ -0,0 +1,16 @@
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using osu.Game.Graphics;
namespace osu.Game.Screens.Ranking
{
public interface IResultPageInfo
{
FontAwesome Icon { get; }
string Name { get; }
ResultsPage CreatePage();
}
}

View File

@ -14,7 +14,7 @@ using osuTK.Graphics;
namespace osu.Game.Screens.Ranking.Pages namespace osu.Game.Screens.Ranking.Pages
{ {
public class ResultsPage : Container public abstract class ResultsPage : Container
{ {
protected readonly ScoreInfo Score; protected readonly ScoreInfo Score;
protected readonly WorkingBeatmap Beatmap; protected readonly WorkingBeatmap Beatmap;
@ -23,7 +23,7 @@ namespace osu.Game.Screens.Ranking.Pages
protected override Container<Drawable> Content => content; protected override Container<Drawable> Content => content;
public ResultsPage(ScoreInfo score, WorkingBeatmap beatmap) protected ResultsPage(ScoreInfo score, WorkingBeatmap beatmap)
{ {
Score = score; Score = score;
Beatmap = beatmap; Beatmap = beatmap;

View File

@ -10,18 +10,17 @@ using osu.Game.Graphics;
using osuTK; using osuTK;
using osuTK.Graphics; using osuTK.Graphics;
using osu.Framework.Graphics.Shapes; using osu.Framework.Graphics.Shapes;
using osu.Game.Screens.Ranking.Types;
namespace osu.Game.Screens.Ranking namespace osu.Game.Screens.Ranking
{ {
public class ResultModeButton : TabItem<IResultType> public class ResultModeButton : TabItem<IResultPageInfo>
{ {
private readonly FontAwesome icon; private readonly FontAwesome icon;
private Color4 activeColour; private Color4 activeColour;
private Color4 inactiveColour; private Color4 inactiveColour;
private CircularContainer colouredPart; private CircularContainer colouredPart;
public ResultModeButton(IResultType mode) public ResultModeButton(IResultPageInfo mode)
: base(mode) : base(mode)
{ {
icon = mode.Icon; icon = mode.Icon;

View File

@ -3,12 +3,11 @@
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Framework.Graphics.UserInterface; using osu.Framework.Graphics.UserInterface;
using osu.Game.Screens.Ranking.Types;
using osuTK; using osuTK;
namespace osu.Game.Screens.Ranking namespace osu.Game.Screens.Ranking
{ {
public class ResultModeTabControl : TabControl<IResultType> public class ResultModeTabControl : TabControl<IResultPageInfo>
{ {
public ResultModeTabControl() public ResultModeTabControl()
{ {
@ -20,9 +19,9 @@ namespace osu.Game.Screens.Ranking
TabContainer.Padding = new MarginPadding(5); TabContainer.Padding = new MarginPadding(5);
} }
protected override Dropdown<IResultType> CreateDropdown() => null; protected override Dropdown<IResultPageInfo> CreateDropdown() => null;
protected override TabItem<IResultType> CreateTabItem(IResultType value) => new ResultModeButton(value) protected override TabItem<IResultPageInfo> CreateTabItem(IResultPageInfo value) => new ResultModeButton(value)
{ {
Anchor = TabContainer.Anchor, Anchor = TabContainer.Anchor,
Origin = TabContainer.Origin Origin = TabContainer.Origin

View File

@ -19,7 +19,6 @@ using osu.Game.Graphics.UserInterface;
using osu.Framework.Graphics.Shapes; using osu.Framework.Graphics.Shapes;
using osu.Game.Graphics.Sprites; using osu.Game.Graphics.Sprites;
using osu.Game.Scoring; using osu.Game.Scoring;
using osu.Game.Screens.Ranking.Types;
namespace osu.Game.Screens.Ranking namespace osu.Game.Screens.Ranking
{ {
@ -265,7 +264,7 @@ namespace osu.Game.Screens.Ranking
}, },
}; };
foreach (var t in CreateResultTypes()) foreach (var t in CreateResultPages())
modeChangeButtons.AddItem(t); modeChangeButtons.AddItem(t);
modeChangeButtons.Current.Value = modeChangeButtons.Items.FirstOrDefault(); modeChangeButtons.Current.Value = modeChangeButtons.Items.FirstOrDefault();
@ -281,6 +280,6 @@ namespace osu.Game.Screens.Ranking
}, true); }, true);
} }
protected abstract IEnumerable<IResultType> CreateResultTypes(); protected abstract IEnumerable<IResultPageInfo> CreateResultPages();
} }
} }

View File

@ -0,0 +1,28 @@
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using osu.Game.Beatmaps;
using osu.Game.Graphics;
using osu.Game.Scoring;
using osu.Game.Screens.Ranking.Pages;
namespace osu.Game.Screens.Ranking.Types
{
public class BeatmapLeaderboardPageInfo : IResultPageInfo
{
private readonly ScoreInfo score;
private readonly WorkingBeatmap beatmap;
public BeatmapLeaderboardPageInfo(ScoreInfo score, WorkingBeatmap beatmap)
{
this.score = score;
this.beatmap = beatmap;
}
public FontAwesome Icon => FontAwesome.fa_list;
public string Name => @"Beatmap Leaderboard";
public ResultsPage CreatePage() => new RankingResultsPage(score, beatmap);
}
}

View File

@ -0,0 +1,30 @@
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using osu.Game.Beatmaps;
using osu.Game.Graphics;
using osu.Game.Scoring;
using osu.Game.Screens.Ranking.Pages;
namespace osu.Game.Screens.Ranking.Types
{
public class ScoreOverviewPageInfo : IResultPageInfo
{
public FontAwesome Icon => FontAwesome.fa_asterisk;
public string Name => "Overview";
private readonly ScoreInfo score;
private readonly WorkingBeatmap beatmap;
public ScoreOverviewPageInfo(ScoreInfo score, WorkingBeatmap beatmap)
{
this.score = score;
this.beatmap = beatmap;
}
public ResultsPage CreatePage()
{
return new ScoreResultsPage(score, beatmap);
}
}
}