mirror of
https://github.com/osukey/osukey.git
synced 2025-05-07 22:57:31 +09:00
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:
commit
c2a00b84c7
@ -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!"
|
||||||
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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"),
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
16
osu.Game/Screens/Ranking/IResultPageInfo.cs
Normal file
16
osu.Game/Screens/Ranking/IResultPageInfo.cs
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
28
osu.Game/Screens/Ranking/Types/BeatmapLeaderboardPageInfo.cs
Normal file
28
osu.Game/Screens/Ranking/Types/BeatmapLeaderboardPageInfo.cs
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
30
osu.Game/Screens/Ranking/Types/ScoreOverviewPageInfo.cs
Normal file
30
osu.Game/Screens/Ranking/Types/ScoreOverviewPageInfo.cs
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user