diff --git a/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform.Tests/osu.Game.Rulesets.EmptyFreeform.Tests.csproj b/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform.Tests/osu.Game.Rulesets.EmptyFreeform.Tests.csproj
index 7d43eb2b05..f77cda1533 100644
--- a/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform.Tests/osu.Game.Rulesets.EmptyFreeform.Tests.csproj
+++ b/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform.Tests/osu.Game.Rulesets.EmptyFreeform.Tests.csproj
@@ -9,7 +9,7 @@
false
-
+
diff --git a/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj b/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj
index 7dc8a1336b..47cabaddb1 100644
--- a/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj
+++ b/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj
@@ -9,7 +9,7 @@
false
-
+
diff --git a/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling.Tests/osu.Game.Rulesets.EmptyScrolling.Tests.csproj b/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling.Tests/osu.Game.Rulesets.EmptyScrolling.Tests.csproj
index 9c4c8217f0..a7d62291d0 100644
--- a/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling.Tests/osu.Game.Rulesets.EmptyScrolling.Tests.csproj
+++ b/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling.Tests/osu.Game.Rulesets.EmptyScrolling.Tests.csproj
@@ -9,7 +9,7 @@
false
-
+
diff --git a/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj b/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj
index 7dc8a1336b..47cabaddb1 100644
--- a/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj
+++ b/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj
@@ -9,7 +9,7 @@
false
-
+
diff --git a/osu.Game.Benchmarks/osu.Game.Benchmarks.csproj b/osu.Game.Benchmarks/osu.Game.Benchmarks.csproj
index af84ee47f1..9764c71493 100644
--- a/osu.Game.Benchmarks/osu.Game.Benchmarks.csproj
+++ b/osu.Game.Benchmarks/osu.Game.Benchmarks.csproj
@@ -7,7 +7,7 @@
-
+
diff --git a/osu.Game.Rulesets.Catch.Tests/osu.Game.Rulesets.Catch.Tests.csproj b/osu.Game.Rulesets.Catch.Tests/osu.Game.Rulesets.Catch.Tests.csproj
index 619081c754..b434d6aaf9 100644
--- a/osu.Game.Rulesets.Catch.Tests/osu.Game.Rulesets.Catch.Tests.csproj
+++ b/osu.Game.Rulesets.Catch.Tests/osu.Game.Rulesets.Catch.Tests.csproj
@@ -1,7 +1,7 @@
-
+
diff --git a/osu.Game.Rulesets.Mania.Tests/osu.Game.Rulesets.Mania.Tests.csproj b/osu.Game.Rulesets.Mania.Tests/osu.Game.Rulesets.Mania.Tests.csproj
index eee06acdb8..e7abd47881 100644
--- a/osu.Game.Rulesets.Mania.Tests/osu.Game.Rulesets.Mania.Tests.csproj
+++ b/osu.Game.Rulesets.Mania.Tests/osu.Game.Rulesets.Mania.Tests.csproj
@@ -1,7 +1,7 @@
-
+
diff --git a/osu.Game.Rulesets.Osu.Tests/osu.Game.Rulesets.Osu.Tests.csproj b/osu.Game.Rulesets.Osu.Tests/osu.Game.Rulesets.Osu.Tests.csproj
index ea54c8d313..5ea231e606 100644
--- a/osu.Game.Rulesets.Osu.Tests/osu.Game.Rulesets.Osu.Tests.csproj
+++ b/osu.Game.Rulesets.Osu.Tests/osu.Game.Rulesets.Osu.Tests.csproj
@@ -1,7 +1,7 @@
-
+
diff --git a/osu.Game.Rulesets.Taiko.Tests/osu.Game.Rulesets.Taiko.Tests.csproj b/osu.Game.Rulesets.Taiko.Tests/osu.Game.Rulesets.Taiko.Tests.csproj
index a2420fc679..2170009ae8 100644
--- a/osu.Game.Rulesets.Taiko.Tests/osu.Game.Rulesets.Taiko.Tests.csproj
+++ b/osu.Game.Rulesets.Taiko.Tests/osu.Game.Rulesets.Taiko.Tests.csproj
@@ -1,7 +1,7 @@
-
+
diff --git a/osu.Game.Tests/Database/BeatmapImporterTests.cs b/osu.Game.Tests/Database/BeatmapImporterTests.cs
index 0eac70f9c8..38746f2567 100644
--- a/osu.Game.Tests/Database/BeatmapImporterTests.cs
+++ b/osu.Game.Tests/Database/BeatmapImporterTests.cs
@@ -716,7 +716,7 @@ namespace osu.Game.Tests.Database
{
foreach (var entry in zip.Entries.ToArray())
{
- if (entry.Key.EndsWith(".osu", StringComparison.InvariantCulture))
+ if (entry.Key!.EndsWith(".osu", StringComparison.InvariantCulture))
zip.RemoveEntry(entry);
}
diff --git a/osu.Game.Tests/Visual/UserInterface/TestSceneBeatmapAttributeText.cs b/osu.Game.Tests/Visual/UserInterface/TestSceneBeatmapAttributeText.cs
new file mode 100644
index 0000000000..bf959d9862
--- /dev/null
+++ b/osu.Game.Tests/Visual/UserInterface/TestSceneBeatmapAttributeText.cs
@@ -0,0 +1,98 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using System.Linq;
+using NUnit.Framework;
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Sprites;
+using osu.Framework.Testing;
+using osu.Game.Beatmaps;
+using osu.Game.Models;
+using osu.Game.Rulesets.Osu;
+using osu.Game.Skinning.Components;
+using osu.Game.Tests.Beatmaps;
+
+namespace osu.Game.Tests.Visual.UserInterface
+{
+ public partial class TestSceneBeatmapAttributeText : OsuTestScene
+ {
+ private readonly BeatmapAttributeText text;
+
+ public TestSceneBeatmapAttributeText()
+ {
+ Child = text = new BeatmapAttributeText
+ {
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre
+ };
+ }
+
+ [SetUp]
+ public void Setup() => Schedule(() =>
+ {
+ Beatmap.Value = CreateWorkingBeatmap(new TestBeatmap(new OsuRuleset().RulesetInfo)
+ {
+ BeatmapInfo =
+ {
+ BPM = 100,
+ DifficultyName = "_Difficulty",
+ Status = BeatmapOnlineStatus.Loved,
+ Metadata =
+ {
+ Title = "_Title",
+ TitleUnicode = "_Title",
+ Artist = "_Artist",
+ ArtistUnicode = "_Artist",
+ Author = new RealmUser { Username = "_Creator" },
+ Source = "_Source",
+ },
+ Difficulty =
+ {
+ CircleSize = 1,
+ DrainRate = 2,
+ OverallDifficulty = 3,
+ ApproachRate = 4,
+ }
+ }
+ });
+ });
+
+ [TestCase(BeatmapAttribute.CircleSize, "Circle Size: 1.00")]
+ [TestCase(BeatmapAttribute.HPDrain, "HP Drain: 2.00")]
+ [TestCase(BeatmapAttribute.Accuracy, "Accuracy: 3.00")]
+ [TestCase(BeatmapAttribute.ApproachRate, "Approach Rate: 4.00")]
+ [TestCase(BeatmapAttribute.Title, "Title: _Title")]
+ [TestCase(BeatmapAttribute.Artist, "Artist: _Artist")]
+ [TestCase(BeatmapAttribute.Creator, "Creator: _Creator")]
+ [TestCase(BeatmapAttribute.DifficultyName, "Difficulty: _Difficulty")]
+ [TestCase(BeatmapAttribute.Source, "Source: _Source")]
+ [TestCase(BeatmapAttribute.RankedStatus, "Beatmap Status: Loved")]
+ public void TestAttributeDisplay(BeatmapAttribute attribute, string expectedText)
+ {
+ AddStep($"set attribute: {attribute}", () => text.Attribute.Value = attribute);
+ AddAssert("check correct text", getText, () => Is.EqualTo(expectedText));
+ }
+
+ [Test]
+ public void TestChangeBeatmap()
+ {
+ AddStep("set title attribute", () => text.Attribute.Value = BeatmapAttribute.Title);
+ AddAssert("check initial title", getText, () => Is.EqualTo("Title: _Title"));
+
+ AddStep("change to beatmap with another title", () => Beatmap.Value = CreateWorkingBeatmap(new TestBeatmap(new OsuRuleset().RulesetInfo)
+ {
+ BeatmapInfo =
+ {
+ Metadata =
+ {
+ Title = "Another"
+ }
+ }
+ }));
+
+ AddAssert("check new title", getText, () => Is.EqualTo("Title: Another"));
+ }
+
+ private string getText() => text.ChildrenOfType().Single().Text.ToString();
+ }
+}
diff --git a/osu.Game.Tests/osu.Game.Tests.csproj b/osu.Game.Tests/osu.Game.Tests.csproj
index c0bbdfb4ed..28a1d4d021 100644
--- a/osu.Game.Tests/osu.Game.Tests.csproj
+++ b/osu.Game.Tests/osu.Game.Tests.csproj
@@ -1,8 +1,8 @@
+
-
diff --git a/osu.Game.Tournament.Tests/osu.Game.Tournament.Tests.csproj b/osu.Game.Tournament.Tests/osu.Game.Tournament.Tests.csproj
index 8f1d7114b1..04683cd83b 100644
--- a/osu.Game.Tournament.Tests/osu.Game.Tournament.Tests.csproj
+++ b/osu.Game.Tournament.Tests/osu.Game.Tournament.Tests.csproj
@@ -4,7 +4,7 @@
osu.Game.Tournament.Tests.TournamentTestRunner
-
+
diff --git a/osu.Game/Beatmaps/BeatmapInfo.cs b/osu.Game/Beatmaps/BeatmapInfo.cs
index 425fd98d27..f1463eb632 100644
--- a/osu.Game/Beatmaps/BeatmapInfo.cs
+++ b/osu.Game/Beatmaps/BeatmapInfo.cs
@@ -62,7 +62,7 @@ namespace osu.Game.Beatmaps
}
[UsedImplicitly]
- private BeatmapInfo()
+ protected BeatmapInfo()
{
}
diff --git a/osu.Game/Online/Multiplayer/InvalidPasswordException.cs b/osu.Game/Online/Multiplayer/InvalidPasswordException.cs
index d3da8f491b..b76a1cc05d 100644
--- a/osu.Game/Online/Multiplayer/InvalidPasswordException.cs
+++ b/osu.Game/Online/Multiplayer/InvalidPasswordException.cs
@@ -2,7 +2,6 @@
// See the LICENCE file in the repository root for full licence text.
using System;
-using System.Runtime.Serialization;
using Microsoft.AspNetCore.SignalR;
namespace osu.Game.Online.Multiplayer
@@ -10,13 +9,5 @@ namespace osu.Game.Online.Multiplayer
[Serializable]
public class InvalidPasswordException : HubException
{
- public InvalidPasswordException()
- {
- }
-
- protected InvalidPasswordException(SerializationInfo info, StreamingContext context)
- : base(info, context)
- {
- }
}
}
diff --git a/osu.Game/Online/Multiplayer/InvalidStateChangeException.cs b/osu.Game/Online/Multiplayer/InvalidStateChangeException.cs
index 4c793dba68..2bae31196a 100644
--- a/osu.Game/Online/Multiplayer/InvalidStateChangeException.cs
+++ b/osu.Game/Online/Multiplayer/InvalidStateChangeException.cs
@@ -2,7 +2,6 @@
// See the LICENCE file in the repository root for full licence text.
using System;
-using System.Runtime.Serialization;
using Microsoft.AspNetCore.SignalR;
namespace osu.Game.Online.Multiplayer
@@ -14,10 +13,5 @@ namespace osu.Game.Online.Multiplayer
: base($"Cannot change from {oldState} to {newState}")
{
}
-
- protected InvalidStateChangeException(SerializationInfo info, StreamingContext context)
- : base(info, context)
- {
- }
}
}
diff --git a/osu.Game/Online/Multiplayer/InvalidStateException.cs b/osu.Game/Online/Multiplayer/InvalidStateException.cs
index 27b111a781..c9705e9e53 100644
--- a/osu.Game/Online/Multiplayer/InvalidStateException.cs
+++ b/osu.Game/Online/Multiplayer/InvalidStateException.cs
@@ -2,7 +2,6 @@
// See the LICENCE file in the repository root for full licence text.
using System;
-using System.Runtime.Serialization;
using Microsoft.AspNetCore.SignalR;
namespace osu.Game.Online.Multiplayer
@@ -14,10 +13,5 @@ namespace osu.Game.Online.Multiplayer
: base(message)
{
}
-
- protected InvalidStateException(SerializationInfo info, StreamingContext context)
- : base(info, context)
- {
- }
}
}
diff --git a/osu.Game/Online/Multiplayer/NotHostException.cs b/osu.Game/Online/Multiplayer/NotHostException.cs
index cd43b13e52..f4fd217c87 100644
--- a/osu.Game/Online/Multiplayer/NotHostException.cs
+++ b/osu.Game/Online/Multiplayer/NotHostException.cs
@@ -2,7 +2,6 @@
// See the LICENCE file in the repository root for full licence text.
using System;
-using System.Runtime.Serialization;
using Microsoft.AspNetCore.SignalR;
namespace osu.Game.Online.Multiplayer
@@ -14,10 +13,5 @@ namespace osu.Game.Online.Multiplayer
: base("User is attempting to perform a host level operation while not the host")
{
}
-
- protected NotHostException(SerializationInfo info, StreamingContext context)
- : base(info, context)
- {
- }
}
}
diff --git a/osu.Game/Online/Multiplayer/NotJoinedRoomException.cs b/osu.Game/Online/Multiplayer/NotJoinedRoomException.cs
index 0a96406c16..72773e28db 100644
--- a/osu.Game/Online/Multiplayer/NotJoinedRoomException.cs
+++ b/osu.Game/Online/Multiplayer/NotJoinedRoomException.cs
@@ -2,7 +2,6 @@
// See the LICENCE file in the repository root for full licence text.
using System;
-using System.Runtime.Serialization;
using Microsoft.AspNetCore.SignalR;
namespace osu.Game.Online.Multiplayer
@@ -14,10 +13,5 @@ namespace osu.Game.Online.Multiplayer
: base("This user has not yet joined a multiplayer room.")
{
}
-
- protected NotJoinedRoomException(SerializationInfo info, StreamingContext context)
- : base(info, context)
- {
- }
}
}
diff --git a/osu.Game/Online/Multiplayer/UserBlockedException.cs b/osu.Game/Online/Multiplayer/UserBlockedException.cs
index e964b13c75..58e86d9f32 100644
--- a/osu.Game/Online/Multiplayer/UserBlockedException.cs
+++ b/osu.Game/Online/Multiplayer/UserBlockedException.cs
@@ -2,7 +2,6 @@
// See the LICENCE file in the repository root for full licence text.
using System;
-using System.Runtime.Serialization;
using Microsoft.AspNetCore.SignalR;
namespace osu.Game.Online.Multiplayer
@@ -16,10 +15,5 @@ namespace osu.Game.Online.Multiplayer
: base(MESSAGE)
{
}
-
- protected UserBlockedException(SerializationInfo info, StreamingContext context)
- : base(info, context)
- {
- }
}
}
diff --git a/osu.Game/Online/Multiplayer/UserBlocksPMsException.cs b/osu.Game/Online/Multiplayer/UserBlocksPMsException.cs
index 14ed6fc212..0ea583ae2c 100644
--- a/osu.Game/Online/Multiplayer/UserBlocksPMsException.cs
+++ b/osu.Game/Online/Multiplayer/UserBlocksPMsException.cs
@@ -2,7 +2,6 @@
// See the LICENCE file in the repository root for full licence text.
using System;
-using System.Runtime.Serialization;
using Microsoft.AspNetCore.SignalR;
namespace osu.Game.Online.Multiplayer
@@ -16,10 +15,5 @@ namespace osu.Game.Online.Multiplayer
: base(MESSAGE)
{
}
-
- protected UserBlocksPMsException(SerializationInfo info, StreamingContext context)
- : base(info, context)
- {
- }
}
}
diff --git a/osu.Game/Scoring/ScoreInfo.cs b/osu.Game/Scoring/ScoreInfo.cs
index 92c18c9c1e..a3dabc7945 100644
--- a/osu.Game/Scoring/ScoreInfo.cs
+++ b/osu.Game/Scoring/ScoreInfo.cs
@@ -165,7 +165,7 @@ namespace osu.Game.Scoring
}
[UsedImplicitly] // Realm
- private ScoreInfo()
+ protected ScoreInfo()
{
}
diff --git a/osu.Game/Skinning/Components/BeatmapAttributeText.cs b/osu.Game/Skinning/Components/BeatmapAttributeText.cs
index 6e1d655cef..4ecf5acea7 100644
--- a/osu.Game/Skinning/Components/BeatmapAttributeText.cs
+++ b/osu.Game/Skinning/Components/BeatmapAttributeText.cs
@@ -3,8 +3,6 @@
using System;
using System.Collections.Generic;
-using System.Collections.Immutable;
-using System.Linq;
using JetBrains.Annotations;
using osu.Framework.Allocation;
using osu.Framework.Bindables;
@@ -35,25 +33,6 @@ namespace osu.Game.Skinning.Components
[Resolved]
private IBindable beatmap { get; set; } = null!;
- private readonly Dictionary valueDictionary = new Dictionary();
-
- private static readonly ImmutableDictionary label_dictionary = new Dictionary
- {
- [BeatmapAttribute.CircleSize] = BeatmapsetsStrings.ShowStatsCs,
- [BeatmapAttribute.Accuracy] = BeatmapsetsStrings.ShowStatsAccuracy,
- [BeatmapAttribute.HPDrain] = BeatmapsetsStrings.ShowStatsDrain,
- [BeatmapAttribute.ApproachRate] = BeatmapsetsStrings.ShowStatsAr,
- [BeatmapAttribute.StarRating] = BeatmapsetsStrings.ShowStatsStars,
- [BeatmapAttribute.Title] = EditorSetupStrings.Title,
- [BeatmapAttribute.Artist] = EditorSetupStrings.Artist,
- [BeatmapAttribute.DifficultyName] = EditorSetupStrings.DifficultyHeader,
- [BeatmapAttribute.Creator] = EditorSetupStrings.Creator,
- [BeatmapAttribute.Source] = EditorSetupStrings.Source,
- [BeatmapAttribute.Length] = ArtistStrings.TracklistLength.ToTitle(),
- [BeatmapAttribute.RankedStatus] = BeatmapDiscussionsStrings.IndexFormBeatmapsetStatusDefault,
- [BeatmapAttribute.BPM] = BeatmapsetsStrings.ShowStatsBpm,
- }.ToImmutableDictionary();
-
private readonly OsuSpriteText text;
public BeatmapAttributeText()
@@ -74,52 +53,135 @@ namespace osu.Game.Skinning.Components
{
base.LoadComplete();
- Attribute.BindValueChanged(_ => updateLabel());
- Template.BindValueChanged(_ => updateLabel());
- beatmap.BindValueChanged(b =>
- {
- updateBeatmapContent(b.NewValue);
- updateLabel();
- }, true);
+ Attribute.BindValueChanged(_ => updateText());
+ Template.BindValueChanged(_ => updateText());
+ beatmap.BindValueChanged(_ => updateText());
+
+ updateText();
}
- private void updateBeatmapContent(WorkingBeatmap workingBeatmap)
- {
- valueDictionary[BeatmapAttribute.Title] = new RomanisableString(workingBeatmap.BeatmapInfo.Metadata.TitleUnicode, workingBeatmap.BeatmapInfo.Metadata.Title);
- valueDictionary[BeatmapAttribute.Artist] = new RomanisableString(workingBeatmap.BeatmapInfo.Metadata.ArtistUnicode, workingBeatmap.BeatmapInfo.Metadata.Artist);
- valueDictionary[BeatmapAttribute.DifficultyName] = workingBeatmap.BeatmapInfo.DifficultyName;
- valueDictionary[BeatmapAttribute.Creator] = workingBeatmap.BeatmapInfo.Metadata.Author.Username;
- valueDictionary[BeatmapAttribute.Source] = workingBeatmap.BeatmapInfo.Metadata.Source;
- valueDictionary[BeatmapAttribute.Length] = TimeSpan.FromMilliseconds(workingBeatmap.BeatmapInfo.Length).ToFormattedDuration();
- valueDictionary[BeatmapAttribute.RankedStatus] = workingBeatmap.BeatmapInfo.Status.GetLocalisableDescription();
- valueDictionary[BeatmapAttribute.BPM] = workingBeatmap.BeatmapInfo.BPM.ToLocalisableString(@"F2");
- valueDictionary[BeatmapAttribute.CircleSize] = ((double)workingBeatmap.BeatmapInfo.Difficulty.CircleSize).ToLocalisableString(@"F2");
- valueDictionary[BeatmapAttribute.HPDrain] = ((double)workingBeatmap.BeatmapInfo.Difficulty.DrainRate).ToLocalisableString(@"F2");
- valueDictionary[BeatmapAttribute.Accuracy] = ((double)workingBeatmap.BeatmapInfo.Difficulty.OverallDifficulty).ToLocalisableString(@"F2");
- valueDictionary[BeatmapAttribute.ApproachRate] = ((double)workingBeatmap.BeatmapInfo.Difficulty.ApproachRate).ToLocalisableString(@"F2");
- valueDictionary[BeatmapAttribute.StarRating] = workingBeatmap.BeatmapInfo.StarRating.ToLocalisableString(@"F2");
- }
-
- private void updateLabel()
+ private void updateText()
{
string numberedTemplate = Template.Value
.Replace("{", "{{")
.Replace("}", "}}")
.Replace(@"{{Label}}", "{0}")
- .Replace(@"{{Value}}", $"{{{1 + (int)Attribute.Value}}}");
+ .Replace(@"{{Value}}", "{1}");
- object?[] args = valueDictionary.OrderBy(pair => pair.Key)
- .Select(pair => pair.Value)
- .Prepend(label_dictionary[Attribute.Value])
- .Cast
-
+
-
+
-
-
-
-
-
-
+
+
+
+
+
+
@@ -37,11 +37,11 @@
-
+
-
+
-
+