diff --git a/.idea/.idea.osu/.idea/runConfigurations/VisualTests__netcoreapp2_0_.xml b/.idea/.idea.osu/.idea/runConfigurations/VisualTests__netcoreapp2_1_.xml
similarity index 83%
rename from .idea/.idea.osu/.idea/runConfigurations/VisualTests__netcoreapp2_0_.xml
rename to .idea/.idea.osu/.idea/runConfigurations/VisualTests__netcoreapp2_1_.xml
index 08b4e38667..2d3a848922 100644
--- a/.idea/.idea.osu/.idea/runConfigurations/VisualTests__netcoreapp2_0_.xml
+++ b/.idea/.idea.osu/.idea/runConfigurations/VisualTests__netcoreapp2_1_.xml
@@ -1,6 +1,6 @@
-
-
+
+
@@ -12,7 +12,7 @@
-
+
\ No newline at end of file
diff --git a/.idea/.idea.osu/.idea/runConfigurations/osu___netcoreapp2_0_.xml b/.idea/.idea.osu/.idea/runConfigurations/osu___netcoreapp2_1_.xml
similarity index 83%
rename from .idea/.idea.osu/.idea/runConfigurations/osu___netcoreapp2_0_.xml
rename to .idea/.idea.osu/.idea/runConfigurations/osu___netcoreapp2_1_.xml
index 2f5c137631..36efe211c6 100644
--- a/.idea/.idea.osu/.idea/runConfigurations/osu___netcoreapp2_0_.xml
+++ b/.idea/.idea.osu/.idea/runConfigurations/osu___netcoreapp2_1_.xml
@@ -1,6 +1,6 @@
-
-
+
+
@@ -12,7 +12,7 @@
-
+
\ No newline at end of file
diff --git a/.vscode/launch.json b/.vscode/launch.json
index 32c82685c0..b9bb75d5bb 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -58,12 +58,12 @@
"console": "internalConsole"
},
{
- "name": "VisualTests (Debug, netcoreapp2.0)",
+ "name": "VisualTests (Debug, netcoreapp2.1)",
"type": "coreclr",
"request": "launch",
"program": "dotnet",
"args": [
- "${workspaceRoot}/osu.Game.Tests/bin/Debug/netcoreapp2.0/osu.Game.Tests.dll"
+ "${workspaceRoot}/osu.Game.Tests/bin/Debug/netcoreapp2.1/osu.Game.Tests.dll"
],
"cwd": "${workspaceRoot}",
"preLaunchTask": "Build tests (Debug, dotnet)",
@@ -71,12 +71,12 @@
"console": "internalConsole"
},
{
- "name": "VisualTests (Release, netcoreapp2.0)",
+ "name": "VisualTests (Release, netcoreapp2.1)",
"type": "coreclr",
"request": "launch",
"program": "dotnet",
"args": [
- "${workspaceRoot}/osu.Game.Tests/bin/Release/netcoreapp2.0/osu.Game.Tests.dll"
+ "${workspaceRoot}/osu.Game.Tests/bin/Release/netcoreapp2.1/osu.Game.Tests.dll"
],
"cwd": "${workspaceRoot}",
"preLaunchTask": "Build tests (Release, dotnet)",
@@ -84,12 +84,12 @@
"console": "internalConsole"
},
{
- "name": "osu! (Debug, netcoreapp2.0)",
+ "name": "osu! (Debug, netcoreapp2.1)",
"type": "coreclr",
"request": "launch",
"program": "dotnet",
"args": [
- "${workspaceRoot}/osu.Desktop/bin/Debug/netcoreapp2.0/osu!.dll",
+ "${workspaceRoot}/osu.Desktop/bin/Debug/netcoreapp2.1/osu!.dll",
],
"cwd": "${workspaceRoot}",
"preLaunchTask": "Build osu! (Debug, dotnet)",
@@ -97,12 +97,12 @@
"console": "internalConsole"
},
{
- "name": "osu! (Release, netcoreapp2.0)",
+ "name": "osu! (Release, netcoreapp2.1)",
"type": "coreclr",
"request": "launch",
"program": "dotnet",
"args": [
- "${workspaceRoot}/osu.Desktop/bin/Release/netcoreapp2.0/osu!.dll",
+ "${workspaceRoot}/osu.Desktop/bin/Release/netcoreapp2.1/osu!.dll",
],
"cwd": "${workspaceRoot}",
"preLaunchTask": "Build osu! (Release, dotnet)",
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
index 0908ff6108..bebad750ca 100644
--- a/.vscode/tasks.json
+++ b/.vscode/tasks.json
@@ -38,7 +38,7 @@
"build",
"--no-restore",
"osu.Desktop",
- "/p:TargetFramework=netcoreapp2.0",
+ "/p:TargetFramework=netcoreapp2.1",
"/p:GenerateFullPaths=true",
"/m",
"/verbosity:m"
@@ -54,7 +54,7 @@
"build",
"--no-restore",
"osu.Desktop",
- "/p:TargetFramework=netcoreapp2.0",
+ "/p:TargetFramework=netcoreapp2.1",
"/p:Configuration=Release",
"/p:GenerateFullPaths=true",
"/m",
@@ -71,7 +71,7 @@
"build",
"--no-restore",
"osu.Game.Tests",
- "/p:TargetFramework=netcoreapp2.0",
+ "/p:TargetFramework=netcoreapp2.1",
"/p:GenerateFullPaths=true",
"/m",
"/verbosity:m"
@@ -87,7 +87,7 @@
"build",
"--no-restore",
"osu.Game.Tests",
- "/p:TargetFramework=netcoreapp2.0",
+ "/p:TargetFramework=netcoreapp2.1",
"/p:Configuration=Release",
"/p:GenerateFullPaths=true",
"/m",
@@ -106,7 +106,7 @@
"problemMatcher": []
},
{
- "label": "Restore (netcoreapp2.0)",
+ "label": "Restore (netcoreapp2.1)",
"type": "shell",
"command": "dotnet",
"args": [
diff --git a/appveyor.yml b/appveyor.yml
index 69bc762f4c..314faa617a 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -1,6 +1,6 @@
clone_depth: 1
version: '{branch}-{build}'
-image: Visual Studio 2017
+image: Visual Studio 2017 preview
configuration: Debug
cache:
- C:\ProgramData\chocolatey\bin -> appveyor.yml
diff --git a/osu-framework b/osu-framework
index 804a4b81b8..b963ce8250 160000
--- a/osu-framework
+++ b/osu-framework
@@ -1 +1 @@
-Subproject commit 804a4b81b89cb4569af5221e6fa2296d559c28fb
+Subproject commit b963ce82505bc953db0a0763679e1ec80a060811
diff --git a/osu.Desktop/osu.Desktop.csproj b/osu.Desktop/osu.Desktop.csproj
index af027da2fc..b8efd76506 100644
--- a/osu.Desktop/osu.Desktop.csproj
+++ b/osu.Desktop/osu.Desktop.csproj
@@ -1,7 +1,7 @@
- net471;netcoreapp2.0
+ net471;netcoreapp2.1
WinExe
AnyCPU
true
@@ -20,8 +20,6 @@
osu.Desktop.Program
-
-
@@ -38,8 +36,4 @@
-
-
-
-
\ No newline at end of file
diff --git a/osu.Game.Rulesets.Catch.Tests/.vscode/launch.json b/osu.Game.Rulesets.Catch.Tests/.vscode/launch.json
index eb80f4474c..2a82d65014 100644
--- a/osu.Game.Rulesets.Catch.Tests/.vscode/launch.json
+++ b/osu.Game.Rulesets.Catch.Tests/.vscode/launch.json
@@ -22,7 +22,7 @@
},
"type": "mono",
"request": "launch",
- "program": "${workspaceRoot}/bin/Debug/net471/osu.Game.Rulesets.Catch.Tests.exe",
+ "program": "${workspaceRoot}/bin/Release/net471/osu.Game.Rulesets.Catch.Tests.exe",
"cwd": "${workspaceRoot}",
"preLaunchTask": "Build (Release, msbuild)",
"runtimeExecutable": null,
@@ -30,12 +30,12 @@
"console": "internalConsole"
},
{
- "name": "VisualTests (Debug, netcoreapp2.0)",
+ "name": "VisualTests (Debug, netcoreapp2.1)",
"type": "coreclr",
"request": "launch",
"program": "dotnet",
"args": [
- "${workspaceRoot}/bin/Debug/netcoreapp2.0/osu.Game.Rulesets.Catch.Tests.dll"
+ "${workspaceRoot}/bin/Debug/netcoreapp2.1/osu.Game.Rulesets.Catch.Tests.dll"
],
"cwd": "${workspaceRoot}",
"preLaunchTask": "Build (Debug, dotnet)",
@@ -43,12 +43,12 @@
"console": "internalConsole"
},
{
- "name": "VisualTests (Release, netcoreapp2.0)",
+ "name": "VisualTests (Release, netcoreapp2.1)",
"type": "coreclr",
"request": "launch",
"program": "dotnet",
"args": [
- "${workspaceRoot}/bin/Debug/netcoreapp2.0/osu.Game.Rulesets.Catch.Tests.dll"
+ "${workspaceRoot}/bin/Release/netcoreapp2.1/osu.Game.Rulesets.Catch.Tests.dll"
],
"cwd": "${workspaceRoot}",
"preLaunchTask": "Build (Release, dotnet)",
diff --git a/osu.Game.Rulesets.Catch.Tests/.vscode/tasks.json b/osu.Game.Rulesets.Catch.Tests/.vscode/tasks.json
index 41ae88f425..6c6d562512 100644
--- a/osu.Game.Rulesets.Catch.Tests/.vscode/tasks.json
+++ b/osu.Game.Rulesets.Catch.Tests/.vscode/tasks.json
@@ -40,7 +40,7 @@
"build",
"--no-restore",
"osu.Game.Rulesets.Catch.Tests.csproj",
- "/p:TargetFramework=netcoreapp2.0",
+ "/p:TargetFramework=netcoreapp2.1",
"/p:GenerateFullPaths=true",
"/m",
"/verbosity:m"
@@ -56,7 +56,7 @@
"build",
"--no-restore",
"osu.Game.Rulesets.Catch.Tests.csproj",
- "/p:TargetFramework=netcoreapp2.0",
+ "/p:TargetFramework=netcoreapp2.1",
"/p:Configuration=Release",
"/p:GenerateFullPaths=true",
"/m",
@@ -75,7 +75,7 @@
"problemMatcher": []
},
{
- "label": "Restore (netcoreapp2.0)",
+ "label": "Restore (netcoreapp2.1)",
"type": "shell",
"command": "dotnet",
"args": [
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 3797edde61..93fa2c4d67 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
@@ -2,7 +2,7 @@
WinExe
- netcoreapp2.0;net471
+ netcoreapp2.1;net471
diff --git a/osu.Game.Rulesets.Mania.Tests/.vscode/launch.json b/osu.Game.Rulesets.Mania.Tests/.vscode/launch.json
index fceb403f30..bc41d4ccf9 100644
--- a/osu.Game.Rulesets.Mania.Tests/.vscode/launch.json
+++ b/osu.Game.Rulesets.Mania.Tests/.vscode/launch.json
@@ -22,7 +22,7 @@
},
"type": "mono",
"request": "launch",
- "program": "${workspaceRoot}/bin/Debug/net471/osu.Game.Rulesets.Mania.Tests.exe",
+ "program": "${workspaceRoot}/bin/Release/net471/osu.Game.Rulesets.Mania.Tests.exe",
"cwd": "${workspaceRoot}",
"preLaunchTask": "Build (Release, msbuild)",
"runtimeExecutable": null,
@@ -30,12 +30,12 @@
"console": "internalConsole"
},
{
- "name": "VisualTests (Debug, netcoreapp2.0)",
+ "name": "VisualTests (Debug, netcoreapp2.1)",
"type": "coreclr",
"request": "launch",
"program": "dotnet",
"args": [
- "${workspaceRoot}/bin/Debug/netcoreapp2.0/osu.Game.Rulesets.Mania.Tests.dll"
+ "${workspaceRoot}/bin/Debug/netcoreapp2.1/osu.Game.Rulesets.Mania.Tests.dll"
],
"cwd": "${workspaceRoot}",
"preLaunchTask": "Build (Debug, dotnet)",
@@ -43,12 +43,12 @@
"console": "internalConsole"
},
{
- "name": "VisualTests (Release, netcoreapp2.0)",
+ "name": "VisualTests (Release, netcoreapp2.1)",
"type": "coreclr",
"request": "launch",
"program": "dotnet",
"args": [
- "${workspaceRoot}/bin/Debug/netcoreapp2.0/osu.Game.Rulesets.Mania.Tests.dll"
+ "${workspaceRoot}/bin/Release/netcoreapp2.1/osu.Game.Rulesets.Mania.Tests.dll"
],
"cwd": "${workspaceRoot}",
"preLaunchTask": "Build (Release, dotnet)",
diff --git a/osu.Game.Rulesets.Mania.Tests/.vscode/tasks.json b/osu.Game.Rulesets.Mania.Tests/.vscode/tasks.json
index b04b068b0d..7fc2f7b2ef 100644
--- a/osu.Game.Rulesets.Mania.Tests/.vscode/tasks.json
+++ b/osu.Game.Rulesets.Mania.Tests/.vscode/tasks.json
@@ -40,7 +40,7 @@
"build",
"--no-restore",
"osu.Game.Rulesets.Mania.Tests.csproj",
- "/p:TargetFramework=netcoreapp2.0",
+ "/p:TargetFramework=netcoreapp2.1",
"/p:GenerateFullPaths=true",
"/m",
"/verbosity:m"
@@ -56,7 +56,7 @@
"build",
"--no-restore",
"osu.Game.Rulesets.Mania.Tests.csproj",
- "/p:TargetFramework=netcoreapp2.0",
+ "/p:TargetFramework=netcoreapp2.1",
"/p:Configuration=Release",
"/p:GenerateFullPaths=true",
"/m",
@@ -75,7 +75,7 @@
"problemMatcher": []
},
{
- "label": "Restore (netcoreapp2.0)",
+ "label": "Restore (netcoreapp2.1)",
"type": "shell",
"command": "dotnet",
"args": [
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 e90155568e..77504fdc3c 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
@@ -2,7 +2,7 @@
WinExe
- netcoreapp2.0;net471
+ netcoreapp2.1;net471
diff --git a/osu.Game.Rulesets.Osu.Tests/.vscode/launch.json b/osu.Game.Rulesets.Osu.Tests/.vscode/launch.json
index 714fb6db6f..13aba025fd 100644
--- a/osu.Game.Rulesets.Osu.Tests/.vscode/launch.json
+++ b/osu.Game.Rulesets.Osu.Tests/.vscode/launch.json
@@ -22,7 +22,7 @@
},
"type": "mono",
"request": "launch",
- "program": "${workspaceRoot}/bin/Debug/net471/osu.Game.Rulesets.Osu.Tests.exe",
+ "program": "${workspaceRoot}/bin/Release/net471/osu.Game.Rulesets.Osu.Tests.exe",
"cwd": "${workspaceRoot}",
"preLaunchTask": "Build (Release, msbuild)",
"runtimeExecutable": null,
@@ -30,12 +30,12 @@
"console": "internalConsole"
},
{
- "name": "VisualTests (Debug, netcoreapp2.0)",
+ "name": "VisualTests (Debug, netcoreapp2.1)",
"type": "coreclr",
"request": "launch",
"program": "dotnet",
"args": [
- "${workspaceRoot}/bin/Debug/netcoreapp2.0/osu.Game.Rulesets.Osu.Tests.dll"
+ "${workspaceRoot}/bin/Debug/netcoreapp2.1/osu.Game.Rulesets.Osu.Tests.dll"
],
"cwd": "${workspaceRoot}",
"preLaunchTask": "Build (Debug, dotnet)",
@@ -43,12 +43,12 @@
"console": "internalConsole"
},
{
- "name": "VisualTests (Release, netcoreapp2.0)",
+ "name": "VisualTests (Release, netcoreapp2.1)",
"type": "coreclr",
"request": "launch",
"program": "dotnet",
"args": [
- "${workspaceRoot}/bin/Debug/netcoreapp2.0/osu.Game.Rulesets.Osu.Tests.dll"
+ "${workspaceRoot}/bin/Release/netcoreapp2.1/osu.Game.Rulesets.Osu.Tests.dll"
],
"cwd": "${workspaceRoot}",
"preLaunchTask": "Build (Release, dotnet)",
diff --git a/osu.Game.Rulesets.Osu.Tests/.vscode/tasks.json b/osu.Game.Rulesets.Osu.Tests/.vscode/tasks.json
index 657fe07e1a..62cf51382f 100644
--- a/osu.Game.Rulesets.Osu.Tests/.vscode/tasks.json
+++ b/osu.Game.Rulesets.Osu.Tests/.vscode/tasks.json
@@ -40,7 +40,7 @@
"build",
"--no-restore",
"osu.Game.Rulesets.Osu.Tests.csproj",
- "/p:TargetFramework=netcoreapp2.0",
+ "/p:TargetFramework=netcoreapp2.1",
"/p:GenerateFullPaths=true",
"/m",
"/verbosity:m"
@@ -56,7 +56,7 @@
"build",
"--no-restore",
"osu.Game.Rulesets.Osu.Tests.csproj",
- "/p:TargetFramework=netcoreapp2.0",
+ "/p:TargetFramework=netcoreapp2.1",
"/p:Configuration=Release",
"/p:GenerateFullPaths=true",
"/m",
@@ -75,7 +75,7 @@
"problemMatcher": []
},
{
- "label": "Restore (netcoreapp2.0)",
+ "label": "Restore (netcoreapp2.1)",
"type": "shell",
"command": "dotnet",
"args": [
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 1695ceacee..c5d9b26145 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
@@ -2,7 +2,7 @@
WinExe
- netcoreapp2.0;net471
+ netcoreapp2.1;net471
diff --git a/osu.Game.Rulesets.Taiko.Tests/.vscode/launch.json b/osu.Game.Rulesets.Taiko.Tests/.vscode/launch.json
index e1df54e99b..df49e177dc 100644
--- a/osu.Game.Rulesets.Taiko.Tests/.vscode/launch.json
+++ b/osu.Game.Rulesets.Taiko.Tests/.vscode/launch.json
@@ -22,7 +22,7 @@
},
"type": "mono",
"request": "launch",
- "program": "${workspaceRoot}/bin/Debug/net471/osu.Game.Rulesets.Taiko.Tests.exe",
+ "program": "${workspaceRoot}/bin/Release/net471/osu.Game.Rulesets.Taiko.Tests.exe",
"cwd": "${workspaceRoot}",
"preLaunchTask": "Build (Release, msbuild)",
"runtimeExecutable": null,
@@ -30,12 +30,12 @@
"console": "internalConsole"
},
{
- "name": "VisualTests (Debug, netcoreapp2.0)",
+ "name": "VisualTests (Debug, netcoreapp2.1)",
"type": "coreclr",
"request": "launch",
"program": "dotnet",
"args": [
- "${workspaceRoot}/bin/Debug/netcoreapp2.0/osu.Game.Rulesets.Taiko.Tests.dll"
+ "${workspaceRoot}/bin/Debug/netcoreapp2.1/osu.Game.Rulesets.Taiko.Tests.dll"
],
"cwd": "${workspaceRoot}",
"preLaunchTask": "Build (Debug, dotnet)",
@@ -43,12 +43,12 @@
"console": "internalConsole"
},
{
- "name": "VisualTests (Release, netcoreapp2.0)",
+ "name": "VisualTests (Release, netcoreapp2.1)",
"type": "coreclr",
"request": "launch",
"program": "dotnet",
"args": [
- "${workspaceRoot}/bin/Debug/netcoreapp2.0/osu.Game.Rulesets.Taiko.Tests.dll"
+ "${workspaceRoot}/bin/Release/netcoreapp2.1/osu.Game.Rulesets.Taiko.Tests.dll"
],
"cwd": "${workspaceRoot}",
"preLaunchTask": "Build (Release, dotnet)",
diff --git a/osu.Game.Rulesets.Taiko.Tests/.vscode/tasks.json b/osu.Game.Rulesets.Taiko.Tests/.vscode/tasks.json
index 8bdbcd8e8e..7c8beed00f 100644
--- a/osu.Game.Rulesets.Taiko.Tests/.vscode/tasks.json
+++ b/osu.Game.Rulesets.Taiko.Tests/.vscode/tasks.json
@@ -40,7 +40,7 @@
"build",
"--no-restore",
"osu.Game.Rulesets.Taiko.Tests.csproj",
- "/p:TargetFramework=netcoreapp2.0",
+ "/p:TargetFramework=netcoreapp2.1",
"/p:GenerateFullPaths=true",
"/m",
"/verbosity:m"
@@ -56,7 +56,7 @@
"build",
"--no-restore",
"osu.Game.Rulesets.Taiko.Tests.csproj",
- "/p:TargetFramework=netcoreapp2.0",
+ "/p:TargetFramework=netcoreapp2.1",
"/p:Configuration=Release",
"/p:GenerateFullPaths=true",
"/m",
@@ -75,7 +75,7 @@
"problemMatcher": []
},
{
- "label": "Restore (netcoreapp2.0)",
+ "label": "Restore (netcoreapp2.1)",
"type": "shell",
"command": "dotnet",
"args": [
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 1221584a2b..dea34d25e7 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
@@ -2,7 +2,7 @@
WinExe
- netcoreapp2.0;net471
+ netcoreapp2.1;net471
diff --git a/osu.Game.Tests/Visual/TestCaseBeatmapCarousel.cs b/osu.Game.Tests/Visual/TestCaseBeatmapCarousel.cs
index f819e882d9..4679fca855 100644
--- a/osu.Game.Tests/Visual/TestCaseBeatmapCarousel.cs
+++ b/osu.Game.Tests/Visual/TestCaseBeatmapCarousel.cs
@@ -65,11 +65,7 @@ namespace osu.Game.Tests.Visual
carousel.SelectionChanged = s => currentSelection = s;
- AddStep("Load Beatmaps", () => { carousel.BeatmapSets = beatmapSets; });
-
- bool changed = false;
- carousel.BeatmapSetsChanged = () => changed = true;
- AddUntilStep(() => changed, "Wait for load");
+ loadBeatmaps(beatmapSets);
testTraversal();
testFiltering();
@@ -84,6 +80,17 @@ namespace osu.Game.Tests.Visual
testCarouselRootIsRandom();
}
+ private void loadBeatmaps(List beatmapSets)
+ {
+ bool changed = false;
+ AddStep($"Load {beatmapSets.Count} Beatmaps", () =>
+ {
+ carousel.BeatmapSetsChanged = () => changed = true;
+ carousel.BeatmapSets = beatmapSets;
+ });
+ AddUntilStep(() => changed, "Wait for load");
+ }
+
private void ensureRandomFetchSuccess() =>
AddAssert("ensure prev random fetch worked", () => selectedSets.Peek() == carousel.SelectedBeatmapSet);
@@ -423,7 +430,7 @@ namespace osu.Game.Tests.Visual
for (int i = 1; i <= 50; i++)
beatmapSets.Add(createTestBeatmapSet(i));
- AddStep("Load 50 Beatmaps", () => { carousel.BeatmapSets = beatmapSets; });
+ loadBeatmaps(beatmapSets);
advanceSelection(direction: 1, diff: false);
checkNonmatchingFilter();
checkNonmatchingFilter();
diff --git a/osu.Game.Tests/Visual/TestCaseBeatmapInfoWedge.cs b/osu.Game.Tests/Visual/TestCaseBeatmapInfoWedge.cs
index 0d3e08154f..996c3b8695 100644
--- a/osu.Game.Tests/Visual/TestCaseBeatmapInfoWedge.cs
+++ b/osu.Game.Tests/Visual/TestCaseBeatmapInfoWedge.cs
@@ -53,7 +53,7 @@ namespace osu.Game.Tests.Visual
AddStep("show", () =>
{
infoWedge.State = Visibility.Visible;
- infoWedge.UpdateBeatmap(beatmap);
+ infoWedge.Beatmap = beatmap;
});
// select part is redundant, but wait for load isn't
@@ -133,7 +133,7 @@ namespace osu.Game.Tests.Visual
AddStep($"select {b.Metadata.Title} beatmap", () =>
{
infoBefore = infoWedge.Info;
- infoWedge.UpdateBeatmap(beatmap.Value = new TestWorkingBeatmap(b));
+ infoWedge.Beatmap = beatmap.Value = new TestWorkingBeatmap(b);
});
AddUntilStep(() => infoWedge.Info != infoBefore, "wait for async load");
@@ -144,7 +144,7 @@ namespace osu.Game.Tests.Visual
AddStep("select null beatmap", () =>
{
beatmap.Value = beatmap.Default;
- infoWedge.UpdateBeatmap(beatmap);
+ infoWedge.Beatmap = beatmap;
});
}
diff --git a/osu.Game.Tests/Visual/TestCaseLoaderAnimation.cs b/osu.Game.Tests/Visual/TestCaseLoaderAnimation.cs
new file mode 100644
index 0000000000..600784f8db
--- /dev/null
+++ b/osu.Game.Tests/Visual/TestCaseLoaderAnimation.cs
@@ -0,0 +1,115 @@
+// Copyright (c) 2007-2018 ppy Pty Ltd .
+// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
+
+using NUnit.Framework;
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Shapes;
+using osu.Game.Screens;
+using osu.Game.Screens.Menu;
+using OpenTK.Graphics;
+
+namespace osu.Game.Tests.Visual
+{
+ [TestFixture]
+ public class TestCaseLoaderAnimation : OsuTestCase
+ {
+ private TestLoader loader;
+
+ protected override void LoadComplete()
+ {
+ base.LoadComplete();
+
+ // required to preload the logo in a headless run (so it doesn't delay the loading itself).
+ Add(new OsuLogo());
+
+ bool logoVisible = false;
+ AddStep("almost instant display", () => Child = loader = new TestLoader(250));
+ AddUntilStep(() =>
+ {
+ logoVisible = loader.Logo?.Alpha > 0;
+ return loader.Logo != null && loader.ScreenLoaded;
+ }, "loaded");
+ AddAssert("logo not visible", () => !logoVisible);
+
+ AddStep("short load", () => Child = loader = new TestLoader(800));
+ AddUntilStep(() =>
+ {
+ logoVisible = loader.Logo?.Alpha > 0;
+ return loader.Logo != null && loader.ScreenLoaded;
+ }, "loaded");
+ AddAssert("logo visible", () => logoVisible);
+ AddUntilStep(() => loader.Logo?.Alpha == 0, "logo gone");
+
+ AddStep("longer load", () => Child = loader = new TestLoader(1400));
+ AddUntilStep(() =>
+ {
+ logoVisible = loader.Logo?.Alpha > 0;
+ return loader.Logo != null && loader.ScreenLoaded;
+ }, "loaded");
+ AddAssert("logo visible", () => logoVisible);
+ AddUntilStep(() => loader.Logo?.Alpha == 0, "logo gone");
+ }
+
+ private class TestLoader : Loader
+ {
+ private readonly double delay;
+
+ public OsuLogo Logo;
+ private TestScreen screen;
+
+ public bool ScreenLoaded => screen.IsCurrentScreen;
+
+ public TestLoader(double delay)
+ {
+ this.delay = delay;
+ }
+
+ protected override void LogoArriving(OsuLogo logo, bool resuming)
+ {
+ Logo = logo;
+ base.LogoArriving(logo, resuming);
+ }
+
+ protected override OsuScreen CreateLoadableScreen() => screen = new TestScreen();
+ protected override ShaderPrecompiler CreateShaderPrecompiler() => new TestShaderPrecompiler(delay);
+
+ private class TestShaderPrecompiler : ShaderPrecompiler
+ {
+ private readonly double delay;
+ private double startTime;
+
+ public TestShaderPrecompiler(double delay)
+ {
+ this.delay = delay;
+ }
+
+ protected override void LoadComplete()
+ {
+ base.LoadComplete();
+ startTime = Time.Current;
+ }
+
+ protected override bool AllLoaded => Time.Current > startTime + delay;
+ }
+
+ private class TestScreen : OsuScreen
+ {
+ public TestScreen()
+ {
+ Child = new Box
+ {
+ RelativeSizeAxes = Axes.Both,
+ Colour = Color4.DarkSlateGray,
+ Alpha = 0,
+ };
+ }
+
+ protected override void LogoArriving(OsuLogo logo, bool resuming)
+ {
+ base.LogoArriving(logo, resuming);
+ Child.FadeInFromZero(200);
+ }
+ }
+ }
+ }
+}
diff --git a/osu.Game.Tests/osu.Game.Tests.csproj b/osu.Game.Tests/osu.Game.Tests.csproj
index 057c2c2de1..532915100b 100644
--- a/osu.Game.Tests/osu.Game.Tests.csproj
+++ b/osu.Game.Tests/osu.Game.Tests.csproj
@@ -2,7 +2,7 @@
WinExe
- netcoreapp2.0;net471
+ netcoreapp2.1;net471
diff --git a/osu.Game/Beatmaps/BeatmapManager.cs b/osu.Game/Beatmaps/BeatmapManager.cs
index efc0279aa0..806bcc4132 100644
--- a/osu.Game/Beatmaps/BeatmapManager.cs
+++ b/osu.Game/Beatmaps/BeatmapManager.cs
@@ -170,7 +170,7 @@ namespace osu.Game.Beatmaps
{
if (error is OperationCanceledException) return;
- downloadNotification.State = ProgressNotificationState.Completed;
+ downloadNotification.State = ProgressNotificationState.Cancelled;
Logger.Error(error, "Beatmap download failed!");
currentDownloads.Remove(request);
};
diff --git a/osu.Game/Online/API/APIRequest.cs b/osu.Game/Online/API/APIRequest.cs
index 9af142b9e8..dfd181b98a 100644
--- a/osu.Game/Online/API/APIRequest.cs
+++ b/osu.Game/Online/API/APIRequest.cs
@@ -73,6 +73,7 @@ namespace osu.Game.Online.API
throw new TimeoutException(@"API request timeout hit");
WebRequest = CreateWebRequest();
+ WebRequest.Failed += Fail;
WebRequest.AllowRetryOnTimeout = false;
WebRequest.AddHeader("Authorization", $"Bearer {api.AccessToken}");
diff --git a/osu.Game/Overlays/BeatmapSet/Info.cs b/osu.Game/Overlays/BeatmapSet/Info.cs
index cd0b7386e8..53216ad666 100644
--- a/osu.Game/Overlays/BeatmapSet/Info.cs
+++ b/osu.Game/Overlays/BeatmapSet/Info.cs
@@ -21,7 +21,7 @@ namespace osu.Game.Overlays.BeatmapSet
private const float metadata_width = 225;
private const float spacing = 20;
- private readonly MetadataSection description, source, tags;
+ private readonly MetadataSection source, tags;
private readonly Box successRateBackground;
private readonly SuccessRate successRate;
@@ -83,7 +83,7 @@ namespace osu.Game.Overlays.BeatmapSet
Child = new Container
{
RelativeSizeAxes = Axes.Both,
- Child = description = new MetadataSection("Description"),
+ Child = new MetadataSection("Description"),
},
},
new Container
@@ -135,8 +135,6 @@ namespace osu.Game.Overlays.BeatmapSet
private void load(OsuColour colours)
{
successRateBackground.Colour = colours.GrayE;
- source.TextColour = description.TextColour = colours.Gray5;
- tags.TextColour = colours.BlueDark;
updateDisplay();
}
@@ -195,7 +193,7 @@ namespace osu.Game.Overlays.BeatmapSet
[BackgroundDependencyLoader]
private void load(OsuColour colours)
{
- header.Colour = colours.Gray5;
+ header.Colour = textFlow.Colour = colours.Gray5;
}
}
}
diff --git a/osu.Game/Overlays/KeyBinding/KeyBindingRow.cs b/osu.Game/Overlays/KeyBinding/KeyBindingRow.cs
index 7406a9ec4f..ffe1560627 100644
--- a/osu.Game/Overlays/KeyBinding/KeyBindingRow.cs
+++ b/osu.Game/Overlays/KeyBinding/KeyBindingRow.cs
@@ -180,7 +180,7 @@ namespace osu.Game.Overlays.KeyBinding
return true;
}
- protected override bool OnWheel(InputState state)
+ protected override bool OnScroll(InputState state)
{
if (HasFocus)
{
@@ -192,7 +192,7 @@ namespace osu.Game.Overlays.KeyBinding
}
}
- return base.OnWheel(state);
+ return base.OnScroll(state);
}
protected override bool OnKeyDown(InputState state, KeyDownEventArgs args)
diff --git a/osu.Game/Rulesets/RulesetStore.cs b/osu.Game/Rulesets/RulesetStore.cs
index 1847b63658..8d267f48e9 100644
--- a/osu.Game/Rulesets/RulesetStore.cs
+++ b/osu.Game/Rulesets/RulesetStore.cs
@@ -6,6 +6,7 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
+using osu.Framework.Logging;
using osu.Game.Database;
namespace osu.Game.Rulesets
@@ -114,8 +115,9 @@ namespace osu.Game.Rulesets
var assembly = Assembly.LoadFrom(file);
loaded_assemblies[assembly] = assembly.GetTypes().First(t => t.IsPublic && t.IsSubclassOf(typeof(Ruleset)));
}
- catch (Exception)
+ catch (Exception e)
{
+ Logger.Error(e, "Failed to load ruleset");
}
}
}
diff --git a/osu.Game/Screens/Edit/Editor.cs b/osu.Game/Screens/Edit/Editor.cs
index be08fffc77..b71d3aee18 100644
--- a/osu.Game/Screens/Edit/Editor.cs
+++ b/osu.Game/Screens/Edit/Editor.cs
@@ -182,9 +182,9 @@ namespace osu.Game.Screens.Edit
LoadComponentAsync(currentScreen, screenContainer.Add);
}
- protected override bool OnWheel(InputState state)
+ protected override bool OnScroll(InputState state)
{
- if (state.Mouse.WheelDelta > 0)
+ if (state.Mouse.ScrollDelta.X + state.Mouse.ScrollDelta.Y > 0)
clock.SeekBackward(true);
else
clock.SeekForward(true);
diff --git a/osu.Game/Screens/Edit/Screens/Compose/Timeline/ScrollingTimelineContainer.cs b/osu.Game/Screens/Edit/Screens/Compose/Timeline/ScrollingTimelineContainer.cs
index 83aa86ba61..2902e74e00 100644
--- a/osu.Game/Screens/Edit/Screens/Compose/Timeline/ScrollingTimelineContainer.cs
+++ b/osu.Game/Screens/Edit/Screens/Compose/Timeline/ScrollingTimelineContainer.cs
@@ -123,15 +123,15 @@ namespace osu.Game.Screens.Edit.Screens.Compose.Timeline
///
private float? localZoomTarget;
- protected override bool OnWheel(InputState state)
+ protected override bool OnScroll(InputState state)
{
if (!state.Keyboard.ControlPressed)
- return base.OnWheel(state);
+ return base.OnScroll(state);
relativeContentZoomTarget = Content.ToLocalSpace(state.Mouse.NativeState.Position).X / Content.DrawSize.X;
localZoomTarget = ToLocalSpace(state.Mouse.NativeState.Position).X;
- Zoom += state.Mouse.WheelDelta;
+ Zoom += state.Mouse.ScrollDelta.Y;
return true;
}
diff --git a/osu.Game/Screens/Loader.cs b/osu.Game/Screens/Loader.cs
index fb5c5ca84b..c3b3e747fd 100644
--- a/osu.Game/Screens/Loader.cs
+++ b/osu.Game/Screens/Loader.cs
@@ -1,7 +1,6 @@
// Copyright (c) 2007-2018 ppy Pty Ltd .
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
-using System;
using System.Collections.Generic;
using System.Linq;
using osu.Framework.Allocation;
@@ -30,43 +29,48 @@ namespace osu.Game.Screens
{
base.LogoArriving(logo, resuming);
+ logo.BeatMatching = false;
logo.Triangles = false;
logo.Origin = Anchor.BottomRight;
logo.Anchor = Anchor.BottomRight;
logo.Position = new Vector2(-40);
logo.Scale = new Vector2(0.2f);
- logo.FadeInFromZero(5000, Easing.OutQuint);
- }
-
- private OsuScreen loadScreen;
- private ShaderPrecompiler precompiler;
-
- protected override void OnEntering(Screen last)
- {
- base.OnEntering(last);
-
- LoadComponentAsync(precompiler = new ShaderPrecompiler(loadIfReady), Add);
- LoadComponentAsync(loadScreen = showDisclaimer ? (OsuScreen)new Disclaimer() : new Intro(), s => loadIfReady());
- }
-
- private void loadIfReady()
- {
- if (ChildScreen == loadScreen) return;
-
- if (loadScreen.LoadState != LoadState.Ready)
- return;
-
- if (!precompiler.FinishedCompiling)
- return;
-
- Push(loadScreen);
+ logo.Delay(500).FadeInFromZero(1000, Easing.OutQuint);
}
protected override void LogoSuspending(OsuLogo logo)
{
base.LogoSuspending(logo);
- logo.FadeOut(100);
+ logo.FadeOut(logo.Alpha * 400);
+ }
+
+ private OsuScreen loadableScreen;
+ private ShaderPrecompiler precompiler;
+
+ protected virtual OsuScreen CreateLoadableScreen() => showDisclaimer ? (OsuScreen)new Disclaimer() : new Intro();
+
+ protected virtual ShaderPrecompiler CreateShaderPrecompiler() => new ShaderPrecompiler();
+
+ protected override void OnEntering(Screen last)
+ {
+ base.OnEntering(last);
+
+ LoadComponentAsync(precompiler = CreateShaderPrecompiler(), Add);
+ LoadComponentAsync(loadableScreen = CreateLoadableScreen());
+
+ checkIfLoaded();
+ }
+
+ private void checkIfLoaded()
+ {
+ if (loadableScreen.LoadState != LoadState.Ready || !precompiler.FinishedCompiling)
+ {
+ Schedule(checkIfLoaded);
+ return;
+ }
+
+ Push(loadableScreen);
}
[BackgroundDependencyLoader]
@@ -80,16 +84,10 @@ namespace osu.Game.Screens
///
public class ShaderPrecompiler : Drawable
{
- private readonly Action onLoaded;
private readonly List loadTargets = new List();
public bool FinishedCompiling { get; private set; }
- public ShaderPrecompiler(Action onLoaded)
- {
- this.onLoaded = onLoaded;
- }
-
[BackgroundDependencyLoader]
private void load(ShaderManager manager)
{
@@ -103,16 +101,17 @@ namespace osu.Game.Screens
loadTargets.Add(manager.Load(VertexShaderDescriptor.TEXTURE_3, FragmentShaderDescriptor.TEXTURE));
}
+ protected virtual bool AllLoaded => loadTargets.All(s => s.Loaded);
+
protected override void Update()
{
base.Update();
// if our target is null we are done.
- if (loadTargets.All(s => s.Loaded))
+ if (AllLoaded)
{
FinishedCompiling = true;
Expire();
- onLoaded?.Invoke();
}
}
}
diff --git a/osu.Game/Screens/Menu/Intro.cs b/osu.Game/Screens/Menu/Intro.cs
index c174e2d470..5aca184d24 100644
--- a/osu.Game/Screens/Menu/Intro.cs
+++ b/osu.Game/Screens/Menu/Intro.cs
@@ -79,31 +79,6 @@ namespace osu.Game.Screens.Menu
seeya = audio.Sample.Get(@"seeya");
}
- protected override void OnEntering(Screen last)
- {
- base.OnEntering(last);
-
- Game.Beatmap.Value = beatmap;
-
- if (menuVoice)
- welcome.Play();
-
- Scheduler.AddDelayed(delegate
- {
- // Only start the current track if it is the menu music. A beatmap's track is started when entering the Main Manu.
- if (menuMusic)
- track.Start();
-
- LoadComponentAsync(mainMenu = new MainMenu());
-
- Scheduler.AddDelayed(delegate
- {
- DidLoadMenu = true;
- Push(mainMenu);
- }, delay_step_one);
- }, delay_step_two);
- }
-
private const double delay_step_one = 2300;
private const double delay_step_two = 600;
@@ -113,6 +88,29 @@ namespace osu.Game.Screens.Menu
{
base.LogoArriving(logo, resuming);
+ if (!resuming)
+ {
+ Game.Beatmap.Value = beatmap;
+
+ if (menuVoice)
+ welcome.Play();
+
+ Scheduler.AddDelayed(delegate
+ {
+ // Only start the current track if it is the menu music. A beatmap's track is started when entering the Main Manu.
+ if (menuMusic)
+ track.Start();
+
+ LoadComponentAsync(mainMenu = new MainMenu());
+
+ Scheduler.AddDelayed(delegate
+ {
+ DidLoadMenu = true;
+ Push(mainMenu);
+ }, delay_step_one);
+ }, delay_step_two);
+ }
+
logo.RelativePositionAxes = Axes.Both;
logo.Colour = Color4.White;
logo.Ripple = false;
diff --git a/osu.Game/Screens/Menu/MenuSideFlashes.cs b/osu.Game/Screens/Menu/MenuSideFlashes.cs
index fae3e72552..c321c98b24 100644
--- a/osu.Game/Screens/Menu/MenuSideFlashes.cs
+++ b/osu.Game/Screens/Menu/MenuSideFlashes.cs
@@ -24,8 +24,8 @@ namespace osu.Game.Screens.Menu
private readonly Bindable beatmap = new Bindable();
- private readonly Box leftBox;
- private readonly Box rightBox;
+ private Box leftBox;
+ private Box rightBox;
private const float amplitude_dead_zone = 0.25f;
private const float alpha_multiplier = (1 - amplitude_dead_zone) / 0.55f;
@@ -42,27 +42,6 @@ namespace osu.Game.Screens.Menu
RelativeSizeAxes = Axes.Both;
Anchor = Anchor.Centre;
Origin = Anchor.Centre;
- Children = new Drawable[]
- {
- leftBox = new Box
- {
- Anchor = Anchor.CentreLeft,
- Origin = Anchor.CentreLeft,
- RelativeSizeAxes = Axes.Y,
- Width = box_width,
- Alpha = 0,
- Blending = BlendingMode.Additive,
- },
- rightBox = new Box
- {
- Anchor = Anchor.CentreRight,
- Origin = Anchor.CentreRight,
- RelativeSizeAxes = Axes.Y,
- Width = box_width,
- Alpha = 0,
- Blending = BlendingMode.Additive,
- }
- };
}
[BackgroundDependencyLoader]
@@ -72,10 +51,34 @@ namespace osu.Game.Screens.Menu
// linear colour looks better in this case, so let's use it for now.
Color4 gradientDark = colours.Blue.Opacity(0).ToLinear();
- Color4 gradientLight = colours.Blue.Opacity(0.3f).ToLinear();
+ Color4 gradientLight = colours.Blue.Opacity(0.6f).ToLinear();
- leftBox.Colour = ColourInfo.GradientHorizontal(gradientLight, gradientDark);
- rightBox.Colour = ColourInfo.GradientHorizontal(gradientDark, gradientLight);
+ Children = new Drawable[]
+ {
+ leftBox = new Box
+ {
+ Anchor = Anchor.CentreLeft,
+ Origin = Anchor.CentreLeft,
+ RelativeSizeAxes = Axes.Y,
+ Width = box_width * 2,
+ // align off-screen to make sure our edges don't become visible during parallax.
+ X = -box_width,
+ Alpha = 0,
+ Blending = BlendingMode.Additive,
+ Colour = ColourInfo.GradientHorizontal(gradientLight, gradientDark)
+ },
+ rightBox = new Box
+ {
+ Anchor = Anchor.CentreRight,
+ Origin = Anchor.CentreRight,
+ RelativeSizeAxes = Axes.Y,
+ Width = box_width * 2,
+ X = box_width,
+ Alpha = 0,
+ Blending = BlendingMode.Additive,
+ Colour = ColourInfo.GradientHorizontal(gradientDark, gradientLight)
+ }
+ };
}
protected override void OnNewBeat(int beatIndex, TimingControlPoint timingPoint, EffectControlPoint effectPoint, TrackAmplitudes amplitudes)
diff --git a/osu.Game/Screens/Menu/OsuLogo.cs b/osu.Game/Screens/Menu/OsuLogo.cs
index 42a8dbd5da..16482b0e48 100644
--- a/osu.Game/Screens/Menu/OsuLogo.cs
+++ b/osu.Game/Screens/Menu/OsuLogo.cs
@@ -64,6 +64,8 @@ namespace osu.Game.Screens.Menu
set { colourAndTriangles.FadeTo(value ? 1 : 0, transition_length, Easing.OutQuint); }
}
+ public bool BeatMatching = true;
+
public override bool ReceiveMouseInputAt(Vector2 screenSpacePos) => logoContainer.ReceiveMouseInputAt(screenSpacePos);
public bool Ripple
@@ -264,6 +266,8 @@ namespace osu.Game.Screens.Menu
{
base.OnNewBeat(beatIndex, timingPoint, effectPoint, amplitudes);
+ if (!BeatMatching) return;
+
lastBeatIndex = beatIndex;
var beatLength = timingPoint.BeatLength;
diff --git a/osu.Game/Screens/OsuScreen.cs b/osu.Game/Screens/OsuScreen.cs
index db9807b9ab..7f68e5144b 100644
--- a/osu.Game/Screens/OsuScreen.cs
+++ b/osu.Game/Screens/OsuScreen.cs
@@ -225,6 +225,7 @@ namespace osu.Game.Screens
logo.Anchor = Anchor.TopLeft;
logo.Origin = Anchor.Centre;
logo.RelativePositionAxes = Axes.None;
+ logo.BeatMatching = true;
logo.Triangles = true;
logo.Ripple = true;
}
diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs
index 9985a24cab..c93e4b7b40 100644
--- a/osu.Game/Screens/Play/Player.cs
+++ b/osu.Game/Screens/Play/Player.cs
@@ -364,7 +364,7 @@ namespace osu.Game.Screens.Play
Background?.FadeTo(1f, fade_out_duration);
}
- protected override bool OnWheel(InputState state) => mouseWheelDisabled.Value && !pauseContainer.IsPaused;
+ protected override bool OnScroll(InputState state) => mouseWheelDisabled.Value && !pauseContainer.IsPaused;
private void initializeStoryboard(bool asyncLoad)
{
diff --git a/osu.Game/Screens/Play/PlayerSettings/PlayerSettingsGroup.cs b/osu.Game/Screens/Play/PlayerSettings/PlayerSettingsGroup.cs
index 0ffcdf94a6..cff3eca895 100644
--- a/osu.Game/Screens/Play/PlayerSettings/PlayerSettingsGroup.cs
+++ b/osu.Game/Screens/Play/PlayerSettings/PlayerSettingsGroup.cs
@@ -50,11 +50,11 @@ namespace osu.Game.Screens.Play.PlayerSettings
content.ResizeHeightTo(0, transition_duration, Easing.OutQuint);
}
- button.FadeColour(expanded ? buttonActiveColour : Color4.White, 200, Easing.OutQuint);
+ updateExpanded();
}
}
- private Color4 buttonActiveColour;
+ private Color4 expandedColour;
protected PlayerSettingsGroup()
{
@@ -130,9 +130,13 @@ namespace osu.Game.Screens.Play.PlayerSettings
[BackgroundDependencyLoader]
private void load(OsuColour colours)
{
- button.Colour = buttonActiveColour = colours.Yellow;
+ expandedColour = colours.Yellow;
+
+ updateExpanded();
}
+ private void updateExpanded() => button.FadeColour(expanded ? expandedColour : Color4.White, 200, Easing.InOutQuint);
+
protected override Container Content => content;
protected override bool OnHover(InputState state) => true;
diff --git a/osu.Game/Screens/Select/BeatmapDetails.cs b/osu.Game/Screens/Select/BeatmapDetails.cs
index ca36f94eda..f1bd2b945f 100644
--- a/osu.Game/Screens/Select/BeatmapDetails.cs
+++ b/osu.Game/Screens/Select/BeatmapDetails.cs
@@ -6,7 +6,6 @@ using OpenTK.Graphics;
using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
-using osu.Game.Graphics;
using osu.Game.Graphics.Sprites;
using osu.Game.Graphics.UserInterface;
using System.Linq;
@@ -120,14 +119,8 @@ namespace osu.Game.Screens.Select
Margin = new MarginPadding { Top = spacing * 2 },
Children = new[]
{
- description = new MetadataSection("Description")
- {
- TextColour = Color4.White.Opacity(0.75f),
- },
- source = new MetadataSection("Source")
- {
- TextColour = Color4.White.Opacity(0.75f),
- },
+ description = new MetadataSection("Description"),
+ source = new MetadataSection("Source"),
tags = new MetadataSection("Tags"),
},
},
@@ -164,10 +157,9 @@ namespace osu.Game.Screens.Select
}
[BackgroundDependencyLoader]
- private void load(OsuColour colours, APIAccess api)
+ private void load(APIAccess api)
{
this.api = api;
- tags.TextColour = colours.Yellow;
}
protected override void UpdateAfterChildren()
@@ -364,7 +356,7 @@ namespace osu.Game.Screens.Select
{
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
- Colour = textFlow.Colour,
+ Colour = Color4.White.Opacity(0.75f),
Text = text
}, loaded =>
{
@@ -375,12 +367,6 @@ namespace osu.Game.Screens.Select
this.FadeIn(transition_duration);
});
}
-
- public Color4 TextColour
- {
- get { return textFlow.Colour; }
- set { textFlow.Colour = value; }
- }
}
private class DimmedLoadingAnimation : VisibilityContainer
diff --git a/osu.Game/Screens/Select/BeatmapInfoWedge.cs b/osu.Game/Screens/Select/BeatmapInfoWedge.cs
index 97f6371cb2..7950018554 100644
--- a/osu.Game/Screens/Select/BeatmapInfoWedge.cs
+++ b/osu.Game/Screens/Select/BeatmapInfoWedge.cs
@@ -57,7 +57,7 @@ namespace osu.Game.Screens.Select
{
if (osuGame != null)
ruleset.BindTo(osuGame.Ruleset);
- ruleset.ValueChanged += updateRuleset;
+ ruleset.ValueChanged += _ => updateDisplay();
}
protected override bool BlockPassThroughMouse => false;
@@ -78,66 +78,76 @@ namespace osu.Game.Screens.Select
private WorkingBeatmap beatmap;
- public void UpdateBeatmap(WorkingBeatmap beatmap)
+ public WorkingBeatmap Beatmap
{
- this.beatmap = beatmap;
- loadBeatmap();
+ get => beatmap;
+ set
+ {
+ if (beatmap == value) return;
+
+ beatmap = value;
+ updateDisplay();
+ }
}
- private void updateRuleset(RulesetInfo ruleset) => loadBeatmap();
+ private BufferedWedgeInfo loadingInfo;
- private void loadBeatmap()
+ private void updateDisplay()
{
- void updateState()
+ void removeOldInfo()
{
State = beatmap == null ? Visibility.Hidden : Visibility.Visible;
Info?.FadeOut(250);
Info?.Expire();
+ Info = null;
}
if (beatmap == null)
{
- updateState();
+ removeOldInfo();
return;
}
- LoadComponentAsync(new BufferedWedgeInfo(beatmap, ruleset.Value)
+ LoadComponentAsync(loadingInfo = new BufferedWedgeInfo(beatmap, ruleset.Value)
{
Shear = -Shear,
- Depth = Info?.Depth + 1 ?? 0,
- }, newInfo =>
+ Depth = Info?.Depth + 1 ?? 0
+ }, loaded =>
{
- updateState();
- Add(Info = newInfo);
+ // ensure we are the most recent loaded wedge.
+ if (loaded != loadingInfo) return;
+
+ removeOldInfo();
+ Add(Info = loaded);
});
}
public class BufferedWedgeInfo : BufferedContainer
{
- private readonly WorkingBeatmap working;
public OsuSpriteText VersionLabel { get; private set; }
public OsuSpriteText TitleLabel { get; private set; }
public OsuSpriteText ArtistLabel { get; private set; }
public FillFlowContainer MapperContainer { get; private set; }
public FillFlowContainer InfoLabelContainer { get; private set; }
+
private UnicodeBindableString titleBinding;
private UnicodeBindableString artistBinding;
+ private readonly WorkingBeatmap beatmap;
private readonly RulesetInfo ruleset;
- public BufferedWedgeInfo(WorkingBeatmap working, RulesetInfo userRuleset)
+ public BufferedWedgeInfo(WorkingBeatmap beatmap, RulesetInfo userRuleset)
{
- this.working = working;
-
- ruleset = userRuleset ?? working.BeatmapInfo.Ruleset;
+ this.beatmap = beatmap;
+ ruleset = userRuleset ?? beatmap.BeatmapInfo.Ruleset;
}
[BackgroundDependencyLoader]
private void load(LocalisationEngine localisation)
{
- var beatmapInfo = working.BeatmapInfo;
- var metadata = beatmapInfo.Metadata ?? working.BeatmapSetInfo?.Metadata ?? new BeatmapMetadata();
+ var beatmapInfo = beatmap.BeatmapInfo;
+ var metadata = beatmapInfo.Metadata ?? beatmap.BeatmapSetInfo?.Metadata ?? new BeatmapMetadata();
PixelSnapping = true;
CacheDrawnFrameBuffer = true;
@@ -165,7 +175,7 @@ namespace osu.Game.Screens.Select
Children = new[]
{
// Zoomed-in and cropped beatmap background
- new BeatmapBackgroundSprite(working)
+ new BeatmapBackgroundSprite(beatmap)
{
RelativeSizeAxes = Axes.Both,
Anchor = Anchor.Centre,
@@ -248,27 +258,27 @@ namespace osu.Game.Screens.Select
private InfoLabel[] getInfoLabels()
{
- var beatmap = working.Beatmap;
+ var b = beatmap.Beatmap;
List labels = new List();
- if (beatmap?.HitObjects?.Any() == true)
+ if (b?.HitObjects?.Any() == true)
{
- HitObject lastObject = beatmap.HitObjects.LastOrDefault();
+ HitObject lastObject = b.HitObjects.LastOrDefault();
double endTime = (lastObject as IHasEndTime)?.EndTime ?? lastObject?.StartTime ?? 0;
labels.Add(new InfoLabel(new BeatmapStatistic
{
Name = "Length",
Icon = FontAwesome.fa_clock_o,
- Content = TimeSpan.FromMilliseconds(endTime - beatmap.HitObjects.First().StartTime).ToString(@"m\:ss"),
+ Content = TimeSpan.FromMilliseconds(endTime - b.HitObjects.First().StartTime).ToString(@"m\:ss"),
}));
labels.Add(new InfoLabel(new BeatmapStatistic
{
Name = "BPM",
Icon = FontAwesome.fa_circle,
- Content = getBPMRange(beatmap),
+ Content = getBPMRange(b),
}));
IBeatmap playableBeatmap;
@@ -276,12 +286,12 @@ namespace osu.Game.Screens.Select
try
{
// Try to get the beatmap with the user's ruleset
- playableBeatmap = working.GetPlayableBeatmap(ruleset);
+ playableBeatmap = beatmap.GetPlayableBeatmap(ruleset);
}
catch (BeatmapInvalidForRulesetException)
{
// Can't be converted to the user's ruleset, so use the beatmap's own ruleset
- playableBeatmap = working.GetPlayableBeatmap(working.BeatmapInfo.Ruleset);
+ playableBeatmap = beatmap.GetPlayableBeatmap(beatmap.BeatmapInfo.Ruleset);
}
labels.AddRange(playableBeatmap.GetStatistics().Select(s => new InfoLabel(s)));
diff --git a/osu.Game/Screens/Select/SongSelect.cs b/osu.Game/Screens/Select/SongSelect.cs
index e1271aebc4..41ba38cb0f 100644
--- a/osu.Game/Screens/Select/SongSelect.cs
+++ b/osu.Game/Screens/Select/SongSelect.cs
@@ -430,7 +430,7 @@ namespace osu.Game.Screens.Select
backgroundModeBeatmap.FadeTo(1, 250);
}
- beatmapInfoWedge.UpdateBeatmap(beatmap);
+ beatmapInfoWedge.Beatmap = beatmap;
}
private void ensurePlayingSelected(bool preview = false)
diff --git a/osu.Game/Tests/Visual/EditorClockTestCase.cs b/osu.Game/Tests/Visual/EditorClockTestCase.cs
index 85d3684530..1ce7023be0 100644
--- a/osu.Game/Tests/Visual/EditorClockTestCase.cs
+++ b/osu.Game/Tests/Visual/EditorClockTestCase.cs
@@ -59,9 +59,9 @@ namespace osu.Game.Tests.Visual
Clock.ProcessFrame();
}
- protected override bool OnWheel(InputState state)
+ protected override bool OnScroll(InputState state)
{
- if (state.Mouse.WheelDelta > 0)
+ if (state.Mouse.ScrollDelta.Y > 0)
Clock.SeekBackward(true);
else
Clock.SeekForward(true);