1
0
mirror of https://github.com/ppy/osu.git synced 2025-02-20 04:23:14 +08:00

Refactor and general tidying up

This commit is contained in:
FreezyLemon 2017-12-28 20:11:21 +01:00
parent 128603a99f
commit 7454633f63
8 changed files with 89 additions and 89 deletions

View File

@ -6,6 +6,7 @@ using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Colour;
using osu.Framework.Graphics.Containers;
using osu.Game.Graphics.Containers;
using osu.Game.Online.Chat;
using osu.Game.Overlays;
using osu.Game.Overlays.Chat;
@ -51,13 +52,11 @@ namespace osu.Game.Tests.Visual
var newLine = new ChatLine(new DummyMessage(text, isAction));
textContainer.Add(newLine);
AddAssert($"check msg having {linkAmount} link(s)", () => newLine.Message.Links.Count == linkAmount);
// todo: tidy this lambda up
AddAssert("check link(s) displaying", () => newLine.ContentFlow.Any()
&& newLine.ContentFlow
.Cast<ChatLink>()
.All(sprite => sprite.HandleInput && !sprite.TextColour.Equals((SRGBColour)Color4.White)
|| !sprite.HandleInput && sprite.TextColour.Equals((SRGBColour)Color4.White)));
AddAssert($"msg #{textContainer.Count} has {linkAmount} link(s)", () => newLine.Message.Links.Count == linkAmount);
AddAssert($"msg #{textContainer.Count} shows link(s)", () => newLine.ContentFlow.Any() && isShowingLinks(newLine.ContentFlow));
bool isShowingLinks(OsuTextFlowContainer c) => c.Cast<ChatLink>().All(sprite => sprite.HandleInput && !sprite.TextColour.Equals((SRGBColour)Color4.White)
|| !sprite.HandleInput && sprite.TextColour.Equals((SRGBColour)Color4.White));
}
private void testLinksGeneral()

View File

@ -0,0 +1,59 @@
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using OpenTK.Graphics;
using osu.Framework.Graphics.Colour;
using osu.Framework.Graphics.Sprites;
using osu.Game.Graphics.Sprites;
using System;
using System.Collections.Generic;
namespace osu.Game.Graphics.Containers
{
public class OsuLinkFlowContainer : OsuLinkFlowContainer<OsuSpriteLink>
{
public OsuLinkFlowContainer(Action<SpriteText> defaultCreationParameters = null)
: base(defaultCreationParameters)
{
}
}
public class OsuLinkFlowContainer<T> : OsuTextFlowContainer
where T : OsuSpriteLink, new()
{
public override bool HandleInput => true;
public OsuLinkFlowContainer(Action<SpriteText> defaultCreationParameters = null) : base(defaultCreationParameters)
{
}
protected override SpriteText CreateSpriteText() => new T();
/// <summary>
/// The colour for text (links override this). Will only be used for new text elements.
/// </summary>
public ColourInfo TextColour = Color4.White;
public IEnumerable<SpriteText> AddLink(string text, string url, Action<SpriteText> creationParameters = null)
{
// TODO: Remove this and get word wrapping working
text = text.Replace(' ', '_');
return AddText(text, link =>
{
creationParameters?.Invoke(link);
((T)link).Url = url;
});
}
public new IEnumerable<SpriteText> AddText(string text, Action<SpriteText> creationParameters = null)
{
return base.AddText(text, sprite =>
{
((OsuSpriteLink)sprite).TextColour = TextColour;
creationParameters?.Invoke(sprite);
});
}
}
}

View File

@ -1,60 +0,0 @@
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using osu.Framework.Graphics.Colour;
using osu.Framework.Graphics.Sprites;
using osu.Game.Graphics.Sprites;
using System;
using System.Collections.Generic;
namespace osu.Game.Graphics.Containers
{
public class OsuLinkTextFlowContainer : OsuLinkTextFlowContainer<OsuLinkSpriteText>
{
public OsuLinkTextFlowContainer(Action<SpriteText> defaultCreationParameters = null)
: base(defaultCreationParameters)
{
}
}
public class OsuLinkTextFlowContainer<T> : OsuTextFlowContainer
where T : OsuLinkSpriteText, new()
{
public override bool HandleInput => true;
public OsuLinkTextFlowContainer(Action<SpriteText> defaultCreationParameters = null) : base(defaultCreationParameters)
{
}
protected override SpriteText CreateSpriteText() => new T();
/// <summary>
/// The colour for normal text (links ignore this). Will only be used for new text elements.
/// <para>Default is white.</para>
/// </summary>
public ColourInfo? TextColour;
public void AddLink(string text, string url, Action<SpriteText> creationParameters = null)
{
// TODO: Remove this and get word wrapping working
text = text.Replace(' ', '_');
AddText(text, link =>
{
creationParameters?.Invoke(link);
LoadComponentAsync(link, d => ((T)d).Url = url);
});
}
public IEnumerable<SpriteText> AddText(string text, Action<SpriteText> creationParameters = null)
{
return base.AddText(text, sprite =>
{
if (TextColour.HasValue)
((OsuLinkSpriteText)sprite).TextColour = TextColour.Value;
creationParameters?.Invoke(sprite);
});
}
}
}

View File

@ -10,7 +10,7 @@ using osu.Game.Graphics.Containers;
namespace osu.Game.Graphics.Sprites
{
public class OsuLinkSpriteText : OsuSpriteText
public class OsuSpriteLink : OsuSpriteText
{
protected override IEnumerable<Drawable> FlowingChildren => Children;
@ -18,7 +18,7 @@ namespace osu.Game.Graphics.Sprites
private readonly Container content;
public OsuLinkSpriteText()
public OsuSpriteLink()
{
AddInternal(content = new OsuHoverContainer
{

View File

@ -12,7 +12,7 @@ using System.Text.RegularExpressions;
namespace osu.Game.Online.Chat
{
public class ChatLink : OsuLinkSpriteText, IHasTooltip
public class ChatLink : OsuSpriteLink, IHasTooltip
{
private APIAccess api;
private BeatmapSetOverlay beatmapSetOverlay;
@ -20,9 +20,13 @@ namespace osu.Game.Online.Chat
public override bool HandleInput => !string.IsNullOrEmpty(Url);
// 'protocol' -> 'https', 'http', 'osu', 'osump' etc.
// 'content' -> everything after '<protocol>://'
private Match getUrlMatch() => Regex.Match(Url, @"^(?<protocol>osu(?:mp)?|https?):\/\/(?<content>.*)");
protected override void OnLinkClicked()
{
var urlMatch = Regex.Matches(Url, @"^(?<protocol>osu(?:mp)?|https?):\/\/(?<content>.*)")[0];
var urlMatch = getUrlMatch();
if (urlMatch.Success)
{
var args = urlMatch.Groups["content"].Value.Split('/');
@ -41,11 +45,8 @@ namespace osu.Game.Online.Chat
case "chan":
var foundChannel = chat.AvailableChannels.Find(channel => channel.Name == args[1]);
if (foundChannel == null)
throw new ArgumentException($"Unknown channel name ({args[1]}).");
else
chat.OpenChannel(foundChannel);
// links should be filtered out by now if a channel doesn't exist
chat.OpenChannel(foundChannel ?? throw new ArgumentException($"Unknown channel name ({args[1]})."));
break;
case "edit":
chat.Game?.LoadEditorTimestamp();
@ -130,9 +131,10 @@ namespace osu.Game.Online.Chat
if (Url == Text)
return null;
if (Url.StartsWith("osu://"))
var urlMatch = getUrlMatch();
if (urlMatch.Success && urlMatch.Groups["protocol"].Value == "osu")
{
var args = Url.Substring(6).Split('/');
var args = urlMatch.Groups["content"].Value.Split('/');
if (args.Length < 2)
return Url;
@ -140,7 +142,7 @@ namespace osu.Game.Online.Chat
if (args[0] == "chan")
return "Switch to channel " + args[1];
if (args[0] == "edit")
return "Go to " + args[1].Remove(9).TrimEnd();
return "Go to " + args[1];
}
return Url;

View File

@ -83,7 +83,10 @@ namespace osu.Game.Overlays.Chat
private Message message;
private OsuSpriteText username;
private OsuLinkTextFlowContainer<ChatLink> contentFlow;
private OsuLinkFlowContainer<ChatLink> contentFlow;
// this is only used for testing
public OsuTextFlowContainer ContentFlow => contentFlow;
public Message Message
{
@ -101,9 +104,6 @@ namespace osu.Game.Overlays.Chat
}
}
// this is only used for testing
public OsuTextFlowContainer ContentFlow => contentFlow;
[BackgroundDependencyLoader(true)]
private void load(OsuColour colours, ChatOverlay chat)
{
@ -193,7 +193,7 @@ namespace osu.Game.Overlays.Chat
Padding = new MarginPadding { Left = message_padding + padding },
Children = new Drawable[]
{
contentFlow = new OsuLinkTextFlowContainer<ChatLink>(t =>
contentFlow = new OsuLinkFlowContainer<ChatLink>(t =>
{
if (Message.IsAction)
t.Font = "Exo2.0-MediumItalic";

View File

@ -23,7 +23,7 @@ namespace osu.Game.Overlays.Profile
public class ProfileHeader : Container
{
private readonly OsuTextFlowContainer infoTextLeft;
private readonly OsuLinkTextFlowContainer infoTextRight;
private readonly OsuLinkFlowContainer infoTextRight;
private readonly FillFlowContainer<SpriteText> scoreText, scoreNumberText;
private readonly RankGraph rankGraph;
@ -142,7 +142,7 @@ namespace osu.Game.Overlays.Profile
ParagraphSpacing = 0.8f,
LineSpacing = 0.2f
},
infoTextRight = new OsuLinkTextFlowContainer(t =>
infoTextRight = new OsuLinkFlowContainer(t =>
{
t.TextSize = 14;
t.Font = @"Exo2.0-RegularItalic";
@ -473,7 +473,7 @@ namespace osu.Game.Overlays.Profile
}
}
private class ProfileLink : OsuLinkSpriteText, IHasTooltip
private class ProfileLink : OsuSpriteLink, IHasTooltip
{
public string TooltipText => "View Profile in Browser";

View File

@ -270,8 +270,8 @@
<Compile Include="Database\IHasPrimaryKey.cs" />
<Compile Include="Overlays\Profile\SupporterIcon.cs" />
<Compile Include="Overlays\Settings\DangerousSettingsButton.cs" />
<Compile Include="Graphics\Containers\OsuLinkTextFlowContainer.cs" />
<Compile Include="Graphics\Sprites\OsuLinkSpriteText.cs" />
<Compile Include="Graphics\Containers\OsuLinkFlowContainer.cs" />
<Compile Include="Graphics\Sprites\OsuSpriteLink.cs" />
<Compile Include="Graphics\UserInterface\HoverClickSounds.cs" />
<Compile Include="Graphics\UserInterface\HoverSounds.cs" />
<Compile Include="Graphics\UserInterface\OsuButton.cs" />