diff --git a/Directory.Build.props b/Directory.Build.props
index 9735c78913..838851b712 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -18,10 +18,14 @@
+
+ true
+ $(NoWarn);CS1591
+
- NU1701
+ $(NoWarn);NU1701
ppy Pty Ltd
diff --git a/osu.Android.props b/osu.Android.props
index 6fab2e7868..0f0e82d56a 100644
--- a/osu.Android.props
+++ b/osu.Android.props
@@ -10,12 +10,14 @@
Off
True
Xamarin.Android.Net.AndroidClientHandler
- v9.0
+ v10.0
false
true
armeabi-v7a;x86;arm64-v8a
true
cjk,mideast,other,rare,west
+ System.Net.Http.HttpClientHandler
+ legacy
SdkOnly
prompt
@@ -53,6 +55,6 @@
-
+
diff --git a/osu.Android/Properties/AndroidManifest.xml b/osu.Android/Properties/AndroidManifest.xml
index acd21f9587..770eaf2222 100644
--- a/osu.Android/Properties/AndroidManifest.xml
+++ b/osu.Android/Properties/AndroidManifest.xml
@@ -1,6 +1,6 @@
-
+
diff --git a/osu.Game.Rulesets.Catch.Tests.Android/Properties/AndroidManifest.xml b/osu.Game.Rulesets.Catch.Tests.Android/Properties/AndroidManifest.xml
index db95e18f13..0fa3b7730d 100644
--- a/osu.Game.Rulesets.Catch.Tests.Android/Properties/AndroidManifest.xml
+++ b/osu.Game.Rulesets.Catch.Tests.Android/Properties/AndroidManifest.xml
@@ -1,5 +1,5 @@
-
+
\ No newline at end of file
diff --git a/osu.Game.Rulesets.Catch/Beatmaps/CatchBeatmapProcessor.cs b/osu.Game.Rulesets.Catch/Beatmaps/CatchBeatmapProcessor.cs
index 58bf811fac..db52fbac1b 100644
--- a/osu.Game.Rulesets.Catch/Beatmaps/CatchBeatmapProcessor.cs
+++ b/osu.Game.Rulesets.Catch/Beatmaps/CatchBeatmapProcessor.cs
@@ -8,7 +8,6 @@ using osu.Game.Beatmaps;
using osu.Game.Rulesets.Catch.Objects;
using osu.Game.Rulesets.Catch.UI;
using osu.Game.Rulesets.Objects.Types;
-using osuTK;
using osu.Game.Rulesets.Catch.MathUtils;
using osu.Game.Rulesets.Mods;
@@ -78,7 +77,7 @@ namespace osu.Game.Rulesets.Catch.Beatmaps
catchObject.XOffset = 0;
if (catchObject is TinyDroplet)
- catchObject.XOffset = MathHelper.Clamp(rng.Next(-20, 20) / CatchPlayfield.BASE_WIDTH, -catchObject.X, 1 - catchObject.X);
+ catchObject.XOffset = Math.Clamp(rng.Next(-20, 20) / CatchPlayfield.BASE_WIDTH, -catchObject.X, 1 - catchObject.X);
else if (catchObject is Droplet)
rng.Next(); // osu!stable retrieved a random droplet rotation
}
@@ -230,7 +229,7 @@ namespace osu.Game.Rulesets.Catch.Beatmaps
else
{
currentObject.DistanceToHyperDash = distanceToHyper;
- lastExcess = MathHelper.Clamp(distanceToHyper, 0, halfCatcherWidth);
+ lastExcess = Math.Clamp(distanceToHyper, 0, halfCatcherWidth);
}
lastDirection = thisDirection;
diff --git a/osu.Game.Rulesets.Catch/Difficulty/CatchPerformanceCalculator.cs b/osu.Game.Rulesets.Catch/Difficulty/CatchPerformanceCalculator.cs
index 5a640f6d1a..a7f0d358ed 100644
--- a/osu.Game.Rulesets.Catch/Difficulty/CatchPerformanceCalculator.cs
+++ b/osu.Game.Rulesets.Catch/Difficulty/CatchPerformanceCalculator.cs
@@ -10,7 +10,6 @@ using osu.Game.Rulesets.Mods;
using osu.Game.Rulesets.Scoring;
using osu.Game.Scoring;
using osu.Game.Scoring.Legacy;
-using osuTK;
namespace osu.Game.Rulesets.Catch.Difficulty
{
@@ -96,7 +95,7 @@ namespace osu.Game.Rulesets.Catch.Difficulty
return value;
}
- private float accuracy() => totalHits() == 0 ? 0 : MathHelper.Clamp((float)totalSuccessfulHits() / totalHits(), 0f, 1f);
+ private float accuracy() => totalHits() == 0 ? 0 : Math.Clamp((float)totalSuccessfulHits() / totalHits(), 0f, 1f);
private int totalHits() => tinyTicksHit + ticksHit + fruitsHit + misses + tinyTicksMissed;
private int totalSuccessfulHits() => tinyTicksHit + ticksHit + fruitsHit;
private int totalComboHits() => misses + ticksHit + fruitsHit;
diff --git a/osu.Game.Rulesets.Catch/Difficulty/Skills/Movement.cs b/osu.Game.Rulesets.Catch/Difficulty/Skills/Movement.cs
index d146153294..7cd569035b 100644
--- a/osu.Game.Rulesets.Catch/Difficulty/Skills/Movement.cs
+++ b/osu.Game.Rulesets.Catch/Difficulty/Skills/Movement.cs
@@ -6,7 +6,6 @@ using osu.Game.Rulesets.Catch.Difficulty.Preprocessing;
using osu.Game.Rulesets.Catch.UI;
using osu.Game.Rulesets.Difficulty.Preprocessing;
using osu.Game.Rulesets.Difficulty.Skills;
-using osuTK;
namespace osu.Game.Rulesets.Catch.Difficulty.Skills
{
@@ -31,7 +30,7 @@ namespace osu.Game.Rulesets.Catch.Difficulty.Skills
if (lastPlayerPosition == null)
lastPlayerPosition = catchCurrent.LastNormalizedPosition;
- float playerPosition = MathHelper.Clamp(
+ float playerPosition = Math.Clamp(
lastPlayerPosition.Value,
catchCurrent.NormalizedPosition - (normalized_hitobject_radius - absolute_player_positioning_error),
catchCurrent.NormalizedPosition + (normalized_hitobject_radius - absolute_player_positioning_error)
diff --git a/osu.Game.Rulesets.Catch/Objects/Drawable/DrawableFruit.cs b/osu.Game.Rulesets.Catch/Objects/Drawable/DrawableFruit.cs
index 1af77b75fc..eae652573b 100644
--- a/osu.Game.Rulesets.Catch/Objects/Drawable/DrawableFruit.cs
+++ b/osu.Game.Rulesets.Catch/Objects/Drawable/DrawableFruit.cs
@@ -278,7 +278,7 @@ namespace osu.Game.Rulesets.Catch.Objects.Drawable
{
base.Update();
- border.Alpha = (float)MathHelper.Clamp((HitObject.StartTime - Time.Current) / 500, 0, 1);
+ border.Alpha = (float)Math.Clamp((HitObject.StartTime - Time.Current) / 500, 0, 1);
}
private Color4 colourForRepresentation(FruitVisualRepresentation representation)
diff --git a/osu.Game.Rulesets.Catch/UI/CatcherArea.cs b/osu.Game.Rulesets.Catch/UI/CatcherArea.cs
index 56c8b33e02..d330add1c4 100644
--- a/osu.Game.Rulesets.Catch/UI/CatcherArea.cs
+++ b/osu.Game.Rulesets.Catch/UI/CatcherArea.cs
@@ -235,7 +235,7 @@ namespace osu.Game.Rulesets.Catch.UI
fruit.Y -= RNG.NextSingle() * diff;
}
- fruit.X = MathHelper.Clamp(fruit.X, -CATCHER_SIZE / 2, CATCHER_SIZE / 2);
+ fruit.X = Math.Clamp(fruit.X, -CATCHER_SIZE / 2, CATCHER_SIZE / 2);
caughtFruit.Add(fruit);
}
@@ -378,7 +378,7 @@ namespace osu.Game.Rulesets.Catch.UI
double speed = BASE_SPEED * dashModifier * hyperDashModifier;
Scale = new Vector2(Math.Abs(Scale.X) * direction, Scale.Y);
- X = (float)MathHelper.Clamp(X + direction * Clock.ElapsedFrameTime * speed, 0, 1);
+ X = (float)Math.Clamp(X + direction * Clock.ElapsedFrameTime * speed, 0, 1);
// Correct overshooting.
if ((hyperDashDirection > 0 && hyperDashTargetPosition < X) ||
diff --git a/osu.Game.Rulesets.Catch/osu.Game.Rulesets.Catch.csproj b/osu.Game.Rulesets.Catch/osu.Game.Rulesets.Catch.csproj
index f24cf1def9..b19affbf9f 100644
--- a/osu.Game.Rulesets.Catch/osu.Game.Rulesets.Catch.csproj
+++ b/osu.Game.Rulesets.Catch/osu.Game.Rulesets.Catch.csproj
@@ -1,6 +1,6 @@
- netstandard2.0
+ netstandard2.1
Library
true
catch the fruit. to the beat.
diff --git a/osu.Game.Rulesets.Mania.Tests.Android/Properties/AndroidManifest.xml b/osu.Game.Rulesets.Mania.Tests.Android/Properties/AndroidManifest.xml
index e6728c801d..de7935b2ef 100644
--- a/osu.Game.Rulesets.Mania.Tests.Android/Properties/AndroidManifest.xml
+++ b/osu.Game.Rulesets.Mania.Tests.Android/Properties/AndroidManifest.xml
@@ -1,5 +1,5 @@
-
+
\ No newline at end of file
diff --git a/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/PatternGenerator.cs b/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/PatternGenerator.cs
index fba52dfc32..b9984a8b90 100644
--- a/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/PatternGenerator.cs
+++ b/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/PatternGenerator.cs
@@ -7,7 +7,6 @@ using JetBrains.Annotations;
using osu.Game.Beatmaps;
using osu.Game.Rulesets.Mania.MathUtils;
using osu.Game.Rulesets.Objects;
-using osuTK;
namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
{
@@ -54,11 +53,11 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
if (allowSpecial && TotalColumns == 8)
{
const float local_x_divisor = 512f / 7;
- return MathHelper.Clamp((int)Math.Floor(position / local_x_divisor), 0, 6) + 1;
+ return Math.Clamp((int)Math.Floor(position / local_x_divisor), 0, 6) + 1;
}
float localXDivisor = 512f / TotalColumns;
- return MathHelper.Clamp((int)Math.Floor(position / localXDivisor), 0, TotalColumns - 1);
+ return Math.Clamp((int)Math.Floor(position / localXDivisor), 0, TotalColumns - 1);
}
///
@@ -113,7 +112,7 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
drainTime = 10000;
BeatmapDifficulty difficulty = OriginalBeatmap.BeatmapInfo.BaseDifficulty;
- conversionDifficulty = ((difficulty.DrainRate + MathHelper.Clamp(difficulty.ApproachRate, 4, 7)) / 1.5 + (double)OriginalBeatmap.HitObjects.Count / drainTime * 9f) / 38f * 5f / 1.15;
+ conversionDifficulty = ((difficulty.DrainRate + Math.Clamp(difficulty.ApproachRate, 4, 7)) / 1.5 + (double)OriginalBeatmap.HitObjects.Count / drainTime * 9f) / 38f * 5f / 1.15;
conversionDifficulty = Math.Min(conversionDifficulty.Value, 12);
return conversionDifficulty.Value;
@@ -139,7 +138,7 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
/// A function to retrieve the next column. If null, a randomisation scheme will be used.
/// A function to perform additional validation checks to determine if a column is a valid candidate for a .
/// The minimum column index. If null, is used.
- /// The maximum column index. If null, is used.
+ /// The maximum column index. If null, TotalColumns is used.
/// A list of patterns for which the validity of a column should be checked against.
/// A column is not a valid candidate if a occupies the same column in any of the patterns.
/// A column which has passed the check and for which there are no
@@ -184,7 +183,7 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
/// Returns a random column index in the range [, ).
///
/// The minimum column index. If null, is used.
- /// The maximum column index. If null, is used.
+ /// The maximum column index. If null, is used.
protected int GetRandomColumn(int? lowerBound = null, int? upperBound = null) => Random.Next(lowerBound ?? RandomStart, upperBound ?? TotalColumns);
///
diff --git a/osu.Game.Rulesets.Mania/Edit/ManiaSelectionHandler.cs b/osu.Game.Rulesets.Mania/Edit/ManiaSelectionHandler.cs
index 9cdf045b5b..53f7e30dfd 100644
--- a/osu.Game.Rulesets.Mania/Edit/ManiaSelectionHandler.cs
+++ b/osu.Game.Rulesets.Mania/Edit/ManiaSelectionHandler.cs
@@ -1,6 +1,7 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using System;
using System.Linq;
using osu.Framework.Allocation;
using osu.Framework.Timing;
@@ -9,7 +10,6 @@ using osu.Game.Rulesets.Mania.Objects;
using osu.Game.Rulesets.UI;
using osu.Game.Rulesets.UI.Scrolling;
using osu.Game.Screens.Edit.Compose.Components;
-using osuTK;
namespace osu.Game.Rulesets.Mania.Edit
{
@@ -119,7 +119,7 @@ namespace osu.Game.Rulesets.Mania.Edit
maxColumn = obj.Column;
}
- columnDelta = MathHelper.Clamp(columnDelta, -minColumn, composer.TotalColumns - 1 - maxColumn);
+ columnDelta = Math.Clamp(columnDelta, -minColumn, composer.TotalColumns - 1 - maxColumn);
foreach (var obj in SelectedHitObjects.OfType())
obj.Column += columnDelta;
diff --git a/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj b/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj
index 0af200d19b..07ef1022ae 100644
--- a/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj
+++ b/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj
@@ -1,6 +1,6 @@
- netstandard2.0
+ netstandard2.1
Library
true
smash the keys. to the beat.
diff --git a/osu.Game.Rulesets.Osu.Tests.Android/Properties/AndroidManifest.xml b/osu.Game.Rulesets.Osu.Tests.Android/Properties/AndroidManifest.xml
index aad907b241..3ce17ccc27 100644
--- a/osu.Game.Rulesets.Osu.Tests.Android/Properties/AndroidManifest.xml
+++ b/osu.Game.Rulesets.Osu.Tests.Android/Properties/AndroidManifest.xml
@@ -1,5 +1,5 @@
-
+
\ No newline at end of file
diff --git a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointPiece.cs b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointPiece.cs
index 155e814596..0ccf020300 100644
--- a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointPiece.cs
+++ b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointPiece.cs
@@ -14,12 +14,13 @@ using osu.Game.Rulesets.Edit;
using osu.Game.Rulesets.Osu.Objects;
using osuTK;
using osuTK.Graphics;
+using osuTK.Input;
namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components
{
public class PathControlPointPiece : BlueprintPiece
{
- public Action RequestSelection;
+ public Action RequestSelection;
public Action ControlPointsChanged;
public readonly BindableBool IsSelected = new BindableBool();
@@ -129,10 +130,19 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components
protected override bool OnMouseDown(MouseDownEvent e)
{
- if (RequestSelection != null)
+ if (RequestSelection == null)
+ return false;
+
+ switch (e.Button)
{
- RequestSelection.Invoke(Index);
- return true;
+ case MouseButton.Left:
+ RequestSelection.Invoke(Index, e);
+ return true;
+
+ case MouseButton.Right:
+ if (!IsSelected.Value)
+ RequestSelection.Invoke(Index, e);
+ return false; // Allow context menu to show
}
return false;
@@ -142,7 +152,7 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components
protected override bool OnClick(ClickEvent e) => RequestSelection != null;
- protected override bool OnDragStart(DragStartEvent e) => true;
+ protected override bool OnDragStart(DragStartEvent e) => e.Button == MouseButton.Left;
protected override bool OnDrag(DragEvent e)
{
diff --git a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointVisualiser.cs b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointVisualiser.cs
index 6962736157..2bcce99c89 100644
--- a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointVisualiser.cs
+++ b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointVisualiser.cs
@@ -3,19 +3,25 @@
using System;
using System.Collections.Generic;
+using System.Linq;
+using Humanizer;
using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
+using osu.Framework.Graphics.Cursor;
+using osu.Framework.Graphics.UserInterface;
using osu.Framework.Input;
using osu.Framework.Input.Bindings;
using osu.Framework.Input.Events;
+using osu.Game.Graphics.UserInterface;
using osu.Game.Rulesets.Osu.Objects;
using osu.Game.Screens.Edit.Compose;
using osuTK;
+using osuTK.Input;
namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components
{
- public class PathControlPointVisualiser : CompositeDrawable, IKeyBindingHandler
+ public class PathControlPointVisualiser : CompositeDrawable, IKeyBindingHandler, IHasContextMenu
{
public Action ControlPointsChanged;
@@ -73,9 +79,22 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components
return false;
}
- private void selectPiece(int index)
+ public bool OnPressed(PlatformAction action)
{
- if (inputManager.CurrentState.Keyboard.ControlPressed)
+ switch (action.ActionMethod)
+ {
+ case PlatformActionMethod.Delete:
+ return deleteSelected();
+ }
+
+ return false;
+ }
+
+ public bool OnReleased(PlatformAction action) => action.ActionMethod == PlatformActionMethod.Delete;
+
+ private void selectPiece(int index, MouseButtonEvent e)
+ {
+ if (e.Button == MouseButton.Left && inputManager.CurrentState.Keyboard.ControlPressed)
Pieces[index].IsSelected.Toggle();
else
{
@@ -84,50 +103,60 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components
}
}
- public bool OnPressed(PlatformAction action)
+ private bool deleteSelected()
{
- switch (action.ActionMethod)
+ var newControlPoints = new List();
+
+ foreach (var piece in Pieces)
{
- case PlatformActionMethod.Delete:
- var newControlPoints = new List();
-
- foreach (var piece in Pieces)
- {
- if (!piece.IsSelected.Value)
- newControlPoints.Add(slider.Path.ControlPoints[piece.Index]);
- }
-
- // Ensure that there are any points to be deleted
- if (newControlPoints.Count == slider.Path.ControlPoints.Length)
- return false;
-
- // If there are 0 remaining control points, treat the slider as being deleted
- if (newControlPoints.Count == 0)
- {
- placementHandler?.Delete(slider);
- return true;
- }
-
- // Make control points relative
- Vector2 first = newControlPoints[0];
- for (int i = 0; i < newControlPoints.Count; i++)
- newControlPoints[i] = newControlPoints[i] - first;
-
- // The slider's position defines the position of the first control point, and all further control points are relative to that point
- slider.Position = slider.Position + first;
-
- // Since pieces are re-used, they will not point to the deleted control points while remaining selected
- foreach (var piece in Pieces)
- piece.IsSelected.Value = false;
-
- ControlPointsChanged?.Invoke(newControlPoints.ToArray());
-
- return true;
+ if (!piece.IsSelected.Value)
+ newControlPoints.Add(slider.Path.ControlPoints[piece.Index]);
}
- return false;
+ // Ensure that there are any points to be deleted
+ if (newControlPoints.Count == slider.Path.ControlPoints.Length)
+ return false;
+
+ // If there are 0 remaining control points, treat the slider as being deleted
+ if (newControlPoints.Count == 0)
+ {
+ placementHandler?.Delete(slider);
+ return true;
+ }
+
+ // Make control points relative
+ Vector2 first = newControlPoints[0];
+ for (int i = 0; i < newControlPoints.Count; i++)
+ newControlPoints[i] = newControlPoints[i] - first;
+
+ // The slider's position defines the position of the first control point, and all further control points are relative to that point
+ slider.Position = slider.Position + first;
+
+ // Since pieces are re-used, they will not point to the deleted control points while remaining selected
+ foreach (var piece in Pieces)
+ piece.IsSelected.Value = false;
+
+ ControlPointsChanged?.Invoke(newControlPoints.ToArray());
+ return true;
}
- public bool OnReleased(PlatformAction action) => action.ActionMethod == PlatformActionMethod.Delete;
+ public MenuItem[] ContextMenuItems
+ {
+ get
+ {
+ if (!Pieces.Any(p => p.IsHovered))
+ return null;
+
+ int selectedPoints = Pieces.Count(p => p.IsSelected.Value);
+
+ if (selectedPoints == 0)
+ return null;
+
+ return new MenuItem[]
+ {
+ new OsuMenuItem($"Delete {"control point".ToQuantity(selectedPoints)}", MenuItemType.Destructive, () => deleteSelected())
+ };
+ }
+ }
}
}
diff --git a/osu.Game.Rulesets.Osu/Mods/OsuModBlinds.cs b/osu.Game.Rulesets.Osu/Mods/OsuModBlinds.cs
index 1eb37f8119..63110b2797 100644
--- a/osu.Game.Rulesets.Osu/Mods/OsuModBlinds.cs
+++ b/osu.Game.Rulesets.Osu/Mods/OsuModBlinds.cs
@@ -1,6 +1,7 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using System;
using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
@@ -13,7 +14,6 @@ using osu.Game.Rulesets.Osu.Objects;
using osu.Game.Rulesets.Scoring;
using osu.Game.Rulesets.UI;
using osu.Game.Scoring;
-using osuTK;
using osuTK.Graphics;
namespace osu.Game.Rulesets.Osu.Mods
@@ -120,7 +120,7 @@ namespace osu.Game.Rulesets.Osu.Mods
};
}
- private float calculateGap(float value) => MathHelper.Clamp(value, 0, target_clamp) * targetBreakMultiplier;
+ private float calculateGap(float value) => Math.Clamp(value, 0, target_clamp) * targetBreakMultiplier;
// lagrange polinominal for (0,0) (0.6,0.4) (1,1) should make a good curve
private static float applyAdjustmentCurve(float value) => 0.6f * value * value + 0.4f * value;
diff --git a/osu.Game.Rulesets.Osu/Mods/OsuModFlashlight.cs b/osu.Game.Rulesets.Osu/Mods/OsuModFlashlight.cs
index 7fa3dbe07e..778c2f7d43 100644
--- a/osu.Game.Rulesets.Osu/Mods/OsuModFlashlight.cs
+++ b/osu.Game.Rulesets.Osu/Mods/OsuModFlashlight.cs
@@ -1,6 +1,7 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using System;
using System.Collections.Generic;
using System.Linq;
using osu.Framework.Bindables;
@@ -55,7 +56,7 @@ namespace osu.Game.Rulesets.Osu.Mods
var destination = e.MousePosition;
FlashlightPosition = Interpolation.ValueAt(
- MathHelper.Clamp(Clock.ElapsedFrameTime, 0, follow_delay), position, destination, 0, follow_delay, Easing.Out);
+ Math.Clamp(Clock.ElapsedFrameTime, 0, follow_delay), position, destination, 0, follow_delay, Easing.Out);
return base.OnMouseMove(e);
}
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableRepeatPoint.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableRepeatPoint.cs
index 84d2a4af9b..122975d55e 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableRepeatPoint.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableRepeatPoint.cs
@@ -132,7 +132,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
else
{
// If we're already snaking, interpolate to smooth out sharp curves (linear sliders, mainly).
- Rotation = Interpolation.ValueAt(MathHelper.Clamp(Clock.ElapsedFrameTime, 0, 100), Rotation, aimRotation, 0, 50, Easing.OutQuint);
+ Rotation = Interpolation.ValueAt(Math.Clamp(Clock.ElapsedFrameTime, 0, 100), Rotation, aimRotation, 0, 50, Easing.OutQuint);
}
}
}
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs
index 433d29f2e4..69189758a6 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs
@@ -1,6 +1,7 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using System;
using osuTK;
using osu.Framework.Graphics;
using osu.Game.Rulesets.Objects.Drawables;
@@ -165,7 +166,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
Tracking.Value = Ball.Tracking;
- double completionProgress = MathHelper.Clamp((Time.Current - slider.StartTime) / slider.Duration, 0, 1);
+ double completionProgress = Math.Clamp((Time.Current - slider.StartTime) / slider.Duration, 0, 1);
Ball.UpdateProgress(completionProgress);
Body.UpdateProgress(completionProgress);
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderHead.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderHead.cs
index 66b6f0f9ac..a10c66d1df 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderHead.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderHead.cs
@@ -37,7 +37,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
{
base.Update();
- double completionProgress = MathHelper.Clamp((Time.Current - slider.StartTime) / slider.Duration, 0, 1);
+ double completionProgress = Math.Clamp((Time.Current - slider.StartTime) / slider.Duration, 0, 1);
//todo: we probably want to reconsider this before adding scoring, but it looks and feels nice.
if (!IsHit)
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
index d1b9ee6cb4..1261d3d19a 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
@@ -1,6 +1,7 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using System;
using System.Linq;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
@@ -136,7 +137,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
positionBindable.BindTo(HitObject.PositionBindable);
}
- public float Progress => MathHelper.Clamp(Disc.RotationAbsolute / 360 / Spinner.SpinsRequired, 0, 1);
+ public float Progress => Math.Clamp(Disc.RotationAbsolute / 360 / Spinner.SpinsRequired, 0, 1);
protected override void CheckForResult(bool userTriggered, double timeOffset)
{
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SnakingSliderBody.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SnakingSliderBody.cs
index 70a1bad4a3..f2150280b3 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SnakingSliderBody.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SnakingSliderBody.cs
@@ -69,7 +69,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Pieces
var spanProgress = slider.ProgressAt(completionProgress);
double start = 0;
- double end = SnakingIn.Value ? MathHelper.Clamp((Time.Current - (slider.StartTime - slider.TimePreempt)) / (slider.TimePreempt / 3), 0, 1) : 1;
+ double end = SnakingIn.Value ? Math.Clamp((Time.Current - (slider.StartTime - slider.TimePreempt)) / (slider.TimePreempt / 3), 0, 1) : 1;
if (span >= slider.SpanCount() - 1)
{
diff --git a/osu.Game.Rulesets.Osu/osu.Game.Rulesets.Osu.csproj b/osu.Game.Rulesets.Osu/osu.Game.Rulesets.Osu.csproj
index fb3fe8808d..bffeaabb55 100644
--- a/osu.Game.Rulesets.Osu/osu.Game.Rulesets.Osu.csproj
+++ b/osu.Game.Rulesets.Osu/osu.Game.Rulesets.Osu.csproj
@@ -1,6 +1,6 @@
- netstandard2.0
+ netstandard2.1
Library
true
click the circles. to the beat.
diff --git a/osu.Game.Rulesets.Taiko.Tests.Android/Properties/AndroidManifest.xml b/osu.Game.Rulesets.Taiko.Tests.Android/Properties/AndroidManifest.xml
index cd4b74aa16..d9de0fde4e 100644
--- a/osu.Game.Rulesets.Taiko.Tests.Android/Properties/AndroidManifest.xml
+++ b/osu.Game.Rulesets.Taiko.Tests.Android/Properties/AndroidManifest.xml
@@ -1,5 +1,5 @@
-
+
\ No newline at end of file
diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs
index cc0d6829ba..338fd9e20f 100644
--- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs
+++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs
@@ -1,12 +1,12 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using System;
using System.Linq;
using osu.Framework.Allocation;
using osu.Framework.MathUtils;
using osu.Game.Graphics;
using osu.Game.Rulesets.Objects.Drawables;
-using osuTK;
using osuTK.Graphics;
using osu.Game.Rulesets.Taiko.Objects.Drawables.Pieces;
using osu.Framework.Graphics;
@@ -98,7 +98,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
else
rollingHits--;
- rollingHits = MathHelper.Clamp(rollingHits, 0, rolling_hits_for_engaged_colour);
+ rollingHits = Math.Clamp(rollingHits, 0, rolling_hits_for_engaged_colour);
Color4 newColour = Interpolation.ValueAt((float)rollingHits / rolling_hits_for_engaged_colour, colourIdle, colourEngaged, 0, 1);
MainPiece.FadeAccent(newColour, 100);
diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs
index 9c9dfc5f9e..fa39819199 100644
--- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs
+++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs
@@ -10,7 +10,6 @@ using osu.Framework.Graphics.Containers;
using osu.Game.Graphics;
using osu.Game.Rulesets.Objects.Drawables;
using osu.Game.Rulesets.Taiko.Objects.Drawables.Pieces;
-using osuTK;
using osuTK.Graphics;
using osu.Framework.Graphics.Shapes;
using osu.Game.Rulesets.Objects;
@@ -179,7 +178,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
var completion = (float)numHits / HitObject.RequiredHits;
expandingRing
- .FadeTo(expandingRing.Alpha + MathHelper.Clamp(completion / 16, 0.1f, 0.6f), 50)
+ .FadeTo(expandingRing.Alpha + Math.Clamp(completion / 16, 0.1f, 0.6f), 50)
.Then()
.FadeTo(completion / 8, 2000, Easing.OutQuint);
diff --git a/osu.Game.Rulesets.Taiko/UI/TaikoPlayfieldAdjustmentContainer.cs b/osu.Game.Rulesets.Taiko/UI/TaikoPlayfieldAdjustmentContainer.cs
index 84464b199e..980f5ea340 100644
--- a/osu.Game.Rulesets.Taiko/UI/TaikoPlayfieldAdjustmentContainer.cs
+++ b/osu.Game.Rulesets.Taiko/UI/TaikoPlayfieldAdjustmentContainer.cs
@@ -1,6 +1,7 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using System;
using osu.Framework.Graphics;
using osu.Game.Rulesets.UI;
using osuTK;
@@ -22,7 +23,7 @@ namespace osu.Game.Rulesets.Taiko.UI
{
base.Update();
- float aspectAdjust = MathHelper.Clamp(Parent.ChildSize.X / Parent.ChildSize.Y, 0.4f, 4) / default_aspect;
+ float aspectAdjust = Math.Clamp(Parent.ChildSize.X / Parent.ChildSize.Y, 0.4f, 4) / default_aspect;
Size = new Vector2(1, default_relative_height * aspectAdjust);
}
}
diff --git a/osu.Game.Rulesets.Taiko/osu.Game.Rulesets.Taiko.csproj b/osu.Game.Rulesets.Taiko/osu.Game.Rulesets.Taiko.csproj
index 0a2b189c3a..ebed8c6d7c 100644
--- a/osu.Game.Rulesets.Taiko/osu.Game.Rulesets.Taiko.csproj
+++ b/osu.Game.Rulesets.Taiko/osu.Game.Rulesets.Taiko.csproj
@@ -1,6 +1,6 @@
- netstandard2.0
+ netstandard2.1
Library
true
bash the drum. to the beat.
diff --git a/osu.Game.Tests.Android/Properties/AndroidManifest.xml b/osu.Game.Tests.Android/Properties/AndroidManifest.xml
index bb996dc5ca..4a63f0c357 100644
--- a/osu.Game.Tests.Android/Properties/AndroidManifest.xml
+++ b/osu.Game.Tests.Android/Properties/AndroidManifest.xml
@@ -1,5 +1,5 @@
-
+
\ No newline at end of file
diff --git a/osu.Game.Tests/Visual/Components/TestScenePreviewTrackManager.cs b/osu.Game.Tests/Visual/Components/TestScenePreviewTrackManager.cs
index 3a9fce90cd..d76905dab8 100644
--- a/osu.Game.Tests/Visual/Components/TestScenePreviewTrackManager.cs
+++ b/osu.Game.Tests/Visual/Components/TestScenePreviewTrackManager.cs
@@ -3,6 +3,7 @@
using NUnit.Framework;
using osu.Framework.Allocation;
+using osu.Framework.Audio;
using osu.Framework.Audio.Track;
using osu.Framework.Graphics.Containers;
using osu.Game.Audio;
@@ -13,7 +14,9 @@ namespace osu.Game.Tests.Visual.Components
{
public class TestScenePreviewTrackManager : OsuTestScene, IPreviewTrackOwner
{
- private readonly PreviewTrackManager trackManager = new TestPreviewTrackManager();
+ private readonly TestPreviewTrackManager trackManager = new TestPreviewTrackManager();
+
+ private AudioManager audio;
protected override IReadOnlyDependencyContainer CreateChildDependencies(IReadOnlyDependencyContainer parent)
{
@@ -24,8 +27,10 @@ namespace osu.Game.Tests.Visual.Components
}
[BackgroundDependencyLoader]
- private void load()
+ private void load(AudioManager audio)
{
+ this.audio = audio;
+
Add(trackManager);
}
@@ -108,6 +113,60 @@ namespace osu.Game.Tests.Visual.Components
AddAssert("track stopped", () => !track.IsRunning);
}
+ ///
+ /// Ensures that changes correctly.
+ ///
+ [Test]
+ public void TestCurrentTrackChanges()
+ {
+ PreviewTrack track = null;
+ TestTrackOwner owner = null;
+
+ AddStep("get track", () => Add(owner = new TestTrackOwner(track = getTrack())));
+ AddUntilStep("wait loaded", () => track.IsLoaded);
+ AddStep("start track", () => track.Start());
+ AddAssert("current is track", () => trackManager.CurrentTrack == track);
+ AddStep("pause manager updates", () => trackManager.AllowUpdate = false);
+ AddStep("stop any playing", () => trackManager.StopAnyPlaying(owner));
+ AddAssert("current not changed", () => trackManager.CurrentTrack == track);
+ AddStep("resume manager updates", () => trackManager.AllowUpdate = true);
+ AddAssert("current is null", () => trackManager.CurrentTrack == null);
+ }
+
+ ///
+ /// Ensures that mutes game-wide audio tracks correctly.
+ ///
+ [TestCase(false)]
+ [TestCase(true)]
+ public void TestEnsureMutingCorrectly(bool stopAnyPlaying)
+ {
+ PreviewTrack track = null;
+ TestTrackOwner owner = null;
+
+ AddStep("ensure volume not zero", () =>
+ {
+ if (audio.Volume.Value == 0)
+ audio.Volume.Value = 1;
+
+ if (audio.VolumeTrack.Value == 0)
+ audio.VolumeTrack.Value = 1;
+ });
+
+ AddAssert("game not muted", () => audio.Tracks.AggregateVolume.Value != 0);
+
+ AddStep("get track", () => Add(owner = new TestTrackOwner(track = getTrack())));
+ AddUntilStep("wait loaded", () => track.IsLoaded);
+ AddStep("start track", () => track.Start());
+ AddAssert("game is muted", () => audio.Tracks.AggregateVolume.Value == 0);
+
+ if (stopAnyPlaying)
+ AddStep("stop any playing", () => trackManager.StopAnyPlaying(owner));
+ else
+ AddStep("stop track", () => track.Stop());
+
+ AddAssert("game not muted", () => audio.Tracks.AggregateVolume.Value != 0);
+ }
+
private TestPreviewTrack getTrack() => (TestPreviewTrack)trackManager.Get(null);
private TestPreviewTrack getOwnedTrack()
@@ -144,8 +203,20 @@ namespace osu.Game.Tests.Visual.Components
public class TestPreviewTrackManager : PreviewTrackManager
{
+ public bool AllowUpdate = true;
+
+ public new PreviewTrack CurrentTrack => base.CurrentTrack;
+
protected override TrackManagerPreviewTrack CreatePreviewTrack(BeatmapSetInfo beatmapSetInfo, ITrackStore trackStore) => new TestPreviewTrack(beatmapSetInfo, trackStore);
+ public override bool UpdateSubTree()
+ {
+ if (!AllowUpdate)
+ return true;
+
+ return base.UpdateSubTree();
+ }
+
public class TestPreviewTrack : TrackManagerPreviewTrack
{
private readonly ITrackStore trackManager;
diff --git a/osu.Game.Tests/Visual/Online/TestSceneLeaderboardModSelector.cs b/osu.Game.Tests/Visual/Online/TestSceneLeaderboardModSelector.cs
index c0c18c2583..ebe233a5f4 100644
--- a/osu.Game.Tests/Visual/Online/TestSceneLeaderboardModSelector.cs
+++ b/osu.Game.Tests/Visual/Online/TestSceneLeaderboardModSelector.cs
@@ -12,6 +12,8 @@ using osu.Game.Rulesets.Catch;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Extensions.IEnumerableExtensions;
+using osu.Framework.Bindables;
+using osu.Game.Rulesets;
namespace osu.Game.Tests.Visual.Online
{
@@ -26,6 +28,7 @@ namespace osu.Game.Tests.Visual.Online
{
LeaderboardModSelector modSelector;
FillFlowContainer selectedMods;
+ var ruleset = new Bindable();
Add(selectedMods = new FillFlowContainer
{
@@ -37,6 +40,7 @@ namespace osu.Game.Tests.Visual.Online
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
+ Ruleset = { BindTarget = ruleset }
});
modSelector.SelectedMods.ItemsAdded += mods =>
@@ -62,12 +66,12 @@ namespace osu.Game.Tests.Visual.Online
});
};
- AddStep("osu ruleset", () => modSelector.Ruleset = new OsuRuleset().RulesetInfo);
- AddStep("mania ruleset", () => modSelector.Ruleset = new ManiaRuleset().RulesetInfo);
- AddStep("taiko ruleset", () => modSelector.Ruleset = new TaikoRuleset().RulesetInfo);
- AddStep("catch ruleset", () => modSelector.Ruleset = new CatchRuleset().RulesetInfo);
+ AddStep("osu ruleset", () => ruleset.Value = new OsuRuleset().RulesetInfo);
+ AddStep("mania ruleset", () => ruleset.Value = new ManiaRuleset().RulesetInfo);
+ AddStep("taiko ruleset", () => ruleset.Value = new TaikoRuleset().RulesetInfo);
+ AddStep("catch ruleset", () => ruleset.Value = new CatchRuleset().RulesetInfo);
AddStep("Deselect all", () => modSelector.DeselectAll());
- AddStep("null ruleset", () => modSelector.Ruleset = null);
+ AddStep("null ruleset", () => ruleset.Value = null);
}
}
}
diff --git a/osu.Game.Tests/Visual/Online/TestSceneNewsOverlay.cs b/osu.Game.Tests/Visual/Online/TestSceneNewsOverlay.cs
new file mode 100644
index 0000000000..546f6ac182
--- /dev/null
+++ b/osu.Game.Tests/Visual/Online/TestSceneNewsOverlay.cs
@@ -0,0 +1,23 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using osu.Game.Overlays;
+
+namespace osu.Game.Tests.Visual.Online
+{
+ public class TestSceneNewsOverlay : OsuTestScene
+ {
+ private NewsOverlay news;
+
+ protected override void LoadComplete()
+ {
+ base.LoadComplete();
+ Add(news = new NewsOverlay());
+ AddStep(@"Show", news.Show);
+ AddStep(@"Hide", news.Hide);
+
+ AddStep(@"Show front page", () => news.ShowFrontPage());
+ AddStep(@"Custom article", () => news.Current.Value = "Test Article 101");
+ }
+ }
+}
diff --git a/osu.Game.Tests/Visual/Online/TestSceneTotalCommentsCounter.cs b/osu.Game.Tests/Visual/Online/TestSceneTotalCommentsCounter.cs
new file mode 100644
index 0000000000..4702d24125
--- /dev/null
+++ b/osu.Game.Tests/Visual/Online/TestSceneTotalCommentsCounter.cs
@@ -0,0 +1,36 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using System;
+using System.Collections.Generic;
+using osu.Framework.Graphics;
+using osu.Framework.Bindables;
+using osu.Game.Overlays.Comments;
+using osu.Framework.MathUtils;
+
+namespace osu.Game.Tests.Visual.Online
+{
+ public class TestSceneTotalCommentsCounter : OsuTestScene
+ {
+ public override IReadOnlyList RequiredTypes => new[]
+ {
+ typeof(TotalCommentsCounter),
+ };
+
+ public TestSceneTotalCommentsCounter()
+ {
+ var count = new BindableInt();
+
+ Add(new TotalCommentsCounter
+ {
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ Current = { BindTarget = count }
+ });
+
+ AddStep(@"Set 100", () => count.Value = 100);
+ AddStep(@"Set 0", () => count.Value = 0);
+ AddStep(@"Set random", () => count.Value = RNG.Next(0, int.MaxValue));
+ }
+ }
+}
diff --git a/osu.Game.Tests/Visual/SongSelect/TestScenePlaySongSelect.cs b/osu.Game.Tests/Visual/SongSelect/TestScenePlaySongSelect.cs
index 794d135b06..a4b8d1a24a 100644
--- a/osu.Game.Tests/Visual/SongSelect/TestScenePlaySongSelect.cs
+++ b/osu.Game.Tests/Visual/SongSelect/TestScenePlaySongSelect.cs
@@ -57,23 +57,6 @@ namespace osu.Game.Tests.Visual.SongSelect
typeof(DrawableCarouselBeatmapSet),
};
- private class TestSongSelect : PlaySongSelect
- {
- public Action StartRequested;
-
- public new Bindable Ruleset => base.Ruleset;
-
- public WorkingBeatmap CurrentBeatmap => Beatmap.Value;
- public WorkingBeatmap CurrentBeatmapDetailsBeatmap => BeatmapDetails.Beatmap;
- public new BeatmapCarousel Carousel => base.Carousel;
-
- protected override bool OnStart()
- {
- StartRequested?.Invoke();
- return base.OnStart();
- }
- }
-
private TestSongSelect songSelect;
[BackgroundDependencyLoader]
@@ -101,6 +84,17 @@ namespace osu.Game.Tests.Visual.SongSelect
manager?.Delete(manager.GetAllUsableBeatmapSets());
});
+ [Test]
+ public void TestSingleFilterOnEnter()
+ {
+ addRulesetImportStep(0);
+ addRulesetImportStep(0);
+
+ createSongSelect();
+
+ AddAssert("filter count is 1", () => songSelect.FilterCount == 1);
+ }
+
[Test]
public void TestAudioResuming()
{
@@ -242,6 +236,22 @@ namespace osu.Game.Tests.Visual.SongSelect
void onRulesetChange(ValueChangedEvent e) => rulesetChangeIndex = actionIndex++;
}
+ [Test]
+ public void TestModsRetainedBetweenSongSelect()
+ {
+ AddAssert("empty mods", () => !Mods.Value.Any());
+
+ createSongSelect();
+
+ addRulesetImportStep(0);
+
+ changeMods(new OsuModHardRock());
+
+ createSongSelect();
+
+ AddAssert("mods retained", () => Mods.Value.Any());
+ }
+
[Test]
public void TestStartAfterUnMatchingFilterDoesNotStart()
{
@@ -357,5 +367,30 @@ namespace osu.Game.Tests.Visual.SongSelect
base.Dispose(isDisposing);
rulesets?.Dispose();
}
+
+ private class TestSongSelect : PlaySongSelect
+ {
+ public Action StartRequested;
+
+ public new Bindable Ruleset => base.Ruleset;
+
+ public WorkingBeatmap CurrentBeatmap => Beatmap.Value;
+ public WorkingBeatmap CurrentBeatmapDetailsBeatmap => BeatmapDetails.Beatmap;
+ public new BeatmapCarousel Carousel => base.Carousel;
+
+ protected override bool OnStart()
+ {
+ StartRequested?.Invoke();
+ return base.OnStart();
+ }
+
+ public int FilterCount;
+
+ protected override void ApplyFilterToCarousel(FilterCriteria criteria)
+ {
+ FilterCount++;
+ base.ApplyFilterToCarousel(criteria);
+ }
+ }
}
}
diff --git a/osu.Game.Tests/Visual/TestSceneOsuGame.cs b/osu.Game.Tests/Visual/TestSceneOsuGame.cs
index 36cd49d839..e495b2a95a 100644
--- a/osu.Game.Tests/Visual/TestSceneOsuGame.cs
+++ b/osu.Game.Tests/Visual/TestSceneOsuGame.cs
@@ -42,7 +42,7 @@ namespace osu.Game.Tests.Visual
private IReadOnlyList requiredGameDependencies => new[]
{
typeof(OsuGame),
- typeof(RavenLogger),
+ typeof(SentryLogger),
typeof(OsuLogo),
typeof(IdleTracker),
typeof(OnScreenDisplay),
diff --git a/osu.Game.Tournament/Screens/Ladder/LadderDragContainer.cs b/osu.Game.Tournament/Screens/Ladder/LadderDragContainer.cs
index f613ce5f46..724612ebce 100644
--- a/osu.Game.Tournament/Screens/Ladder/LadderDragContainer.cs
+++ b/osu.Game.Tournament/Screens/Ladder/LadderDragContainer.cs
@@ -1,6 +1,7 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using System;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Primitives;
@@ -32,7 +33,7 @@ namespace osu.Game.Tournament.Screens.Ladder
protected override bool OnScroll(ScrollEvent e)
{
- var newScale = MathHelper.Clamp(scale + e.ScrollDelta.Y / 15 * scale, min_scale, max_scale);
+ var newScale = Math.Clamp(scale + e.ScrollDelta.Y / 15 * scale, min_scale, max_scale);
this.MoveTo(target = target - e.MousePosition * (newScale - scale), 2000, Easing.OutQuint);
this.ScaleTo(scale = newScale, 2000, Easing.OutQuint);
diff --git a/osu.Game.Tournament/osu.Game.Tournament.csproj b/osu.Game.Tournament/osu.Game.Tournament.csproj
index f5306facaf..8e881fdd9c 100644
--- a/osu.Game.Tournament/osu.Game.Tournament.csproj
+++ b/osu.Game.Tournament/osu.Game.Tournament.csproj
@@ -1,6 +1,6 @@
- netstandard2.0
+ netstandard2.1
Library
true
tools for tournaments.
diff --git a/osu.Game/Audio/PreviewTrackManager.cs b/osu.Game/Audio/PreviewTrackManager.cs
index 72b33c4073..6f0b62543d 100644
--- a/osu.Game/Audio/PreviewTrackManager.cs
+++ b/osu.Game/Audio/PreviewTrackManager.cs
@@ -22,7 +22,7 @@ namespace osu.Game.Audio
private AudioManager audio;
private PreviewTrackStore trackStore;
- private TrackManagerPreviewTrack current;
+ protected TrackManagerPreviewTrack CurrentTrack;
[BackgroundDependencyLoader]
private void load(AudioManager audio)
@@ -48,17 +48,17 @@ namespace osu.Game.Audio
track.Started += () => Schedule(() =>
{
- current?.Stop();
- current = track;
+ CurrentTrack?.Stop();
+ CurrentTrack = track;
audio.Tracks.AddAdjustment(AdjustableProperty.Volume, muteBindable);
});
track.Stopped += () => Schedule(() =>
{
- if (current != track)
+ if (CurrentTrack != track)
return;
- current = null;
+ CurrentTrack = null;
audio.Tracks.RemoveAdjustment(AdjustableProperty.Volume, muteBindable);
});
@@ -76,11 +76,11 @@ namespace osu.Game.Audio
/// The which may be the owner of the .
public void StopAnyPlaying(IPreviewTrackOwner source)
{
- if (current == null || current.Owner != source)
+ if (CurrentTrack == null || CurrentTrack.Owner != source)
return;
- current.Stop();
- current = null;
+ CurrentTrack.Stop();
+ // CurrentTrack should not be set to null here as it will result in incorrect handling in the track.Stopped callback above.
}
///
diff --git a/osu.Game/Beatmaps/BeatmapDifficulty.cs b/osu.Game/Beatmaps/BeatmapDifficulty.cs
index 8727431e0e..c56fec67aa 100644
--- a/osu.Game/Beatmaps/BeatmapDifficulty.cs
+++ b/osu.Game/Beatmaps/BeatmapDifficulty.cs
@@ -56,10 +56,22 @@ namespace osu.Game.Beatmaps
/// Maps a difficulty value [0, 10] to a two-piece linear range of values.
///
/// The difficulty value to be mapped.
- /// The values that define the two linear ranges.
- /// Minimum of the resulting range which will be achieved by a difficulty value of 0.
- /// Midpoint of the resulting range which will be achieved by a difficulty value of 5.
- /// Maximum of the resulting range which will be achieved by a difficulty value of 10.
+ /// The values that define the two linear ranges.
+ ///
+ /// -
+ /// od0
+ /// Minimum of the resulting range which will be achieved by a difficulty value of 0.
+ ///
+ /// -
+ /// od5
+ /// Midpoint of the resulting range which will be achieved by a difficulty value of 5.
+ ///
+ /// -
+ /// od10
+ /// Maximum of the resulting range which will be achieved by a difficulty value of 10.
+ ///
+ ///
+ ///
/// Value to which the difficulty value maps in the specified range.
public static double DifficultyRange(double difficulty, (double od0, double od5, double od10) range)
=> DifficultyRange(difficulty, range.od0, range.od5, range.od10);
diff --git a/osu.Game/Beatmaps/ControlPoints/ControlPointInfo.cs b/osu.Game/Beatmaps/ControlPoints/ControlPointInfo.cs
index c3e2b469ae..ce2783004c 100644
--- a/osu.Game/Beatmaps/ControlPoints/ControlPointInfo.cs
+++ b/osu.Game/Beatmaps/ControlPoints/ControlPointInfo.cs
@@ -218,7 +218,7 @@ namespace osu.Game.Beatmaps.ControlPoints
}
///
- /// Check whether should be added.
+ /// Check whether should be added.
///
/// The time to find the timing control point at.
/// A point to be added.
diff --git a/osu.Game/Beatmaps/Formats/Decoder.cs b/osu.Game/Beatmaps/Formats/Decoder.cs
index 40c329eb7e..45122f6312 100644
--- a/osu.Game/Beatmaps/Formats/Decoder.cs
+++ b/osu.Game/Beatmaps/Formats/Decoder.cs
@@ -93,7 +93,7 @@ namespace osu.Game.Beatmaps.Formats
///
/// Registers a fallback decoder instantiation function.
/// The fallback will be returned if the first non-empty line of the decoded stream does not match any known magic.
- /// Calling this method will overwrite any existing global fallback registration for type - use with caution.
+ /// Calling this method will overwrite any existing global fallback registration for type - use with caution.
///
/// Type of object being decoded.
/// A function that constructs the fallback.
diff --git a/osu.Game/Configuration/BackgroundSource.cs b/osu.Game/Configuration/BackgroundSource.cs
new file mode 100644
index 0000000000..5726e96eb1
--- /dev/null
+++ b/osu.Game/Configuration/BackgroundSource.cs
@@ -0,0 +1,11 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+namespace osu.Game.Configuration
+{
+ public enum BackgroundSource
+ {
+ Skin,
+ Beatmap
+ }
+}
diff --git a/osu.Game/Configuration/OsuConfigManager.cs b/osu.Game/Configuration/OsuConfigManager.cs
index c0ce08ba08..b71463841a 100644
--- a/osu.Game/Configuration/OsuConfigManager.cs
+++ b/osu.Game/Configuration/OsuConfigManager.cs
@@ -117,6 +117,8 @@ namespace osu.Game.Configuration
Set(OsuSetting.UIHoldActivationDelay, 200f, 0f, 500f, 50f);
Set(OsuSetting.IntroSequence, IntroSequence.Triangles);
+
+ Set(OsuSetting.MenuBackgroundSource, BackgroundSource.Skin);
}
public OsuConfigManager(Storage storage)
@@ -186,6 +188,7 @@ namespace osu.Game.Configuration
UIScale,
IntroSequence,
UIHoldActivationDelay,
- HitLighting
+ HitLighting,
+ MenuBackgroundSource
}
}
diff --git a/osu.Game/Database/ArchiveModelManager.cs b/osu.Game/Database/ArchiveModelManager.cs
index 8fa4eaf267..7cce2fb92f 100644
--- a/osu.Game/Database/ArchiveModelManager.cs
+++ b/osu.Game/Database/ArchiveModelManager.cs
@@ -54,13 +54,13 @@ namespace osu.Game.Database
public Action PostNotification { protected get; set; }
///
- /// Fired when a new becomes available in the database.
+ /// Fired when a new becomes available in the database.
/// This is not guaranteed to run on the update thread.
///
public event Action ItemAdded;
///
- /// Fired when a is removed from the database.
+ /// Fired when a is removed from the database.
/// This is not guaranteed to run on the update thread.
///
public event Action ItemRemoved;
@@ -95,7 +95,7 @@ namespace osu.Game.Database
}
///
- /// Import one or more items from filesystem .
+ /// Import one or more items from filesystem .
/// This will post notifications tracking progress.
///
/// One or more archive locations on disk.
@@ -173,7 +173,7 @@ namespace osu.Game.Database
}
///
- /// Import one from the filesystem and delete the file on success.
+ /// Import one from the filesystem and delete the file on success.
///
/// The archive location on disk.
/// An optional cancellation token.
@@ -275,7 +275,7 @@ namespace osu.Game.Database
}
///
- /// Import an item from a .
+ /// Import an item from a .
///
/// The model to be imported.
/// An optional archive to use for model population.
@@ -589,7 +589,7 @@ namespace osu.Game.Database
protected TModel CheckForExisting(TModel model) => model.Hash == null ? null : ModelStore.ConsumableItems.FirstOrDefault(b => b.Hash == model.Hash);
///
- /// After an existing is found during an import process, the default behaviour is to restore the existing
+ /// After an existing is found during an import process, the default behaviour is to restore the existing
/// item and skip the import. This method allows changing that behaviour.
///
/// The existing model.
diff --git a/osu.Game/Database/DownloadableArchiveModelManager.cs b/osu.Game/Database/DownloadableArchiveModelManager.cs
index a81dff3475..0b7d63f469 100644
--- a/osu.Game/Database/DownloadableArchiveModelManager.cs
+++ b/osu.Game/Database/DownloadableArchiveModelManager.cs
@@ -41,17 +41,17 @@ namespace osu.Game.Database
}
///
- /// Creates the download request for this .
+ /// Creates the download request for this .
///
- /// The to be downloaded.
+ /// The to be downloaded.
/// Whether this download should be optimised for slow connections. Generally means extras are not included in the download bundle.
/// The request object.
protected abstract ArchiveDownloadRequest CreateDownloadRequest(TModel model, bool minimiseDownloadSize);
///
- /// Begin a download for the requested .
+ /// Begin a download for the requested .
///
- /// The to be downloaded.
+ /// The to be downloaded.
/// Whether this download should be optimised for slow connections. Generally means extras are not included in the download bundle.
/// Whether the download was started.
public bool Download(TModel model, bool minimiseDownloadSize = false)
@@ -131,9 +131,9 @@ namespace osu.Game.Database
///
/// Performs implementation specific comparisons to determine whether a given model is present in the local store.
///
- /// The whose existence needs to be checked.
+ /// The whose existence needs to be checked.
/// The usable items present in the store.
- /// Whether the exists.
+ /// Whether the exists.
protected abstract bool CheckLocalAvailability(TModel model, IQueryable items);
public ArchiveDownloadRequest GetExistingDownload(TModel model) => currentDownloads.Find(r => r.Model.Equals(model));
diff --git a/osu.Game/Database/IModelDownloader.cs b/osu.Game/Database/IModelDownloader.cs
index f6f4b0aa42..17f1ccab06 100644
--- a/osu.Game/Database/IModelDownloader.cs
+++ b/osu.Game/Database/IModelDownloader.cs
@@ -14,34 +14,34 @@ namespace osu.Game.Database
where TModel : class
{
///
- /// Fired when a download begins.
+ /// Fired when a download begins.
///
event Action> DownloadBegan;
///
- /// Fired when a download is interrupted, either due to user cancellation or failure.
+ /// Fired when a download is interrupted, either due to user cancellation or failure.
///
event Action> DownloadFailed;
///
- /// Checks whether a given is already available in the local store.
+ /// Checks whether a given is already available in the local store.
///
- /// The whose existence needs to be checked.
- /// Whether the exists.
+ /// The whose existence needs to be checked.
+ /// Whether the exists.
bool IsAvailableLocally(TModel model);
///
- /// Begin a download for the requested .
+ /// Begin a download for the requested .
///
- /// The to be downloaded.
+ /// The to be downloaded.
/// Whether this download should be optimised for slow connections. Generally means extras are not included in the download bundle..
/// Whether the download was started.
bool Download(TModel model, bool minimiseDownloadSize);
///
- /// Gets an existing download request if it exists.
+ /// Gets an existing download request if it exists.
///
- /// The whose request is wanted.
+ /// The whose request is wanted.
/// The object if it exists, otherwise null.
ArchiveDownloadRequest GetExistingDownload(TModel model);
}
diff --git a/osu.Game/Database/IModelManager.cs b/osu.Game/Database/IModelManager.cs
index 884814cb38..1bdbbb48e6 100644
--- a/osu.Game/Database/IModelManager.cs
+++ b/osu.Game/Database/IModelManager.cs
@@ -6,7 +6,7 @@ using System;
namespace osu.Game.Database
{
///
- /// Represents a model manager that publishes events when s are added or removed.
+ /// Represents a model manager that publishes events when s are added or removed.
///
/// The model type.
public interface IModelManager
diff --git a/osu.Game/Database/MutableDatabaseBackedStore.cs b/osu.Game/Database/MutableDatabaseBackedStore.cs
index 39a48b5be6..4ca1eef989 100644
--- a/osu.Game/Database/MutableDatabaseBackedStore.cs
+++ b/osu.Game/Database/MutableDatabaseBackedStore.cs
@@ -30,7 +30,7 @@ namespace osu.Game.Database
public IQueryable ConsumableItems => AddIncludesForConsumption(ContextFactory.Get().Set());
///
- /// Add a to the database.
+ /// Add a to the database.
///
/// The item to add.
public void Add(T item)
@@ -45,7 +45,7 @@ namespace osu.Game.Database
}
///
- /// Update a in the database.
+ /// Update a in the database.
///
/// The item to update.
public void Update(T item)
@@ -58,7 +58,7 @@ namespace osu.Game.Database
}
///
- /// Delete a from the database.
+ /// Delete a from the database.
///
/// The item to delete.
public bool Delete(T item)
@@ -77,7 +77,7 @@ namespace osu.Game.Database
}
///
- /// Restore a from a deleted state.
+ /// Restore a from a deleted state.
///
/// The item to undelete.
public bool Undelete(T item)
diff --git a/osu.Game/Graphics/Backgrounds/BeatmapBackground.cs b/osu.Game/Graphics/Backgrounds/BeatmapBackground.cs
new file mode 100644
index 0000000000..387e189dc4
--- /dev/null
+++ b/osu.Game/Graphics/Backgrounds/BeatmapBackground.cs
@@ -0,0 +1,28 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using osu.Framework.Allocation;
+using osu.Framework.Graphics.Textures;
+using osu.Game.Beatmaps;
+
+namespace osu.Game.Graphics.Backgrounds
+{
+ public class BeatmapBackground : Background
+ {
+ public readonly WorkingBeatmap Beatmap;
+
+ private readonly string fallbackTextureName;
+
+ public BeatmapBackground(WorkingBeatmap beatmap, string fallbackTextureName = @"Backgrounds/bg1")
+ {
+ Beatmap = beatmap;
+ this.fallbackTextureName = fallbackTextureName;
+ }
+
+ [BackgroundDependencyLoader]
+ private void load(TextureStore textures)
+ {
+ Sprite.Texture = Beatmap?.Background ?? textures.Get(fallbackTextureName);
+ }
+ }
+}
diff --git a/osu.Game/Graphics/Containers/ParallaxContainer.cs b/osu.Game/Graphics/Containers/ParallaxContainer.cs
index 86f922e4b8..bf743b90ed 100644
--- a/osu.Game/Graphics/Containers/ParallaxContainer.cs
+++ b/osu.Game/Graphics/Containers/ParallaxContainer.cs
@@ -1,6 +1,7 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using System;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics;
using osu.Framework.Input;
@@ -48,7 +49,7 @@ namespace osu.Game.Graphics.Containers
if (!parallaxEnabled.Value)
{
content.MoveTo(Vector2.Zero, firstUpdate ? 0 : 1000, Easing.OutQuint);
- content.Scale = new Vector2(1 + System.Math.Abs(ParallaxAmount));
+ content.Scale = new Vector2(1 + Math.Abs(ParallaxAmount));
}
};
}
@@ -71,10 +72,10 @@ namespace osu.Game.Graphics.Containers
const float parallax_duration = 100;
- double elapsed = MathHelper.Clamp(Clock.ElapsedFrameTime, 0, parallax_duration);
+ double elapsed = Math.Clamp(Clock.ElapsedFrameTime, 0, parallax_duration);
content.Position = Interpolation.ValueAt(elapsed, content.Position, offset, 0, parallax_duration, Easing.OutQuint);
- content.Scale = Interpolation.ValueAt(elapsed, content.Scale, new Vector2(1 + System.Math.Abs(ParallaxAmount)), 0, 1000, Easing.OutQuint);
+ content.Scale = Interpolation.ValueAt(elapsed, content.Scale, new Vector2(1 + Math.Abs(ParallaxAmount)), 0, 1000, Easing.OutQuint);
}
firstUpdate = false;
diff --git a/osu.Game/Graphics/Sprites/OsuSpriteText.cs b/osu.Game/Graphics/Sprites/OsuSpriteText.cs
index ed771bb03f..cd988c347b 100644
--- a/osu.Game/Graphics/Sprites/OsuSpriteText.cs
+++ b/osu.Game/Graphics/Sprites/OsuSpriteText.cs
@@ -19,7 +19,7 @@ namespace osu.Game.Graphics.Sprites
public static class OsuSpriteTextTransformExtensions
{
///
- /// Sets to a new value after a duration.
+ /// Sets Text to a new value after a duration.
///
/// A to which further transforms can be added.
public static TransformSequence TransformTextTo(this T spriteText, string newText, double duration = 0, Easing easing = Easing.None)
@@ -27,7 +27,7 @@ namespace osu.Game.Graphics.Sprites
=> spriteText.TransformTo(nameof(OsuSpriteText.Text), newText, duration, easing);
///
- /// Sets to a new value after a duration.
+ /// Sets Text to a new value after a duration.
///
/// A to which further transforms can be added.
public static TransformSequence TransformTextTo(this TransformSequence t, string newText, double duration = 0, Easing easing = Easing.None)
diff --git a/osu.Game/Graphics/UserInterface/Bar.cs b/osu.Game/Graphics/UserInterface/Bar.cs
index f8d5955503..0be928cf83 100644
--- a/osu.Game/Graphics/UserInterface/Bar.cs
+++ b/osu.Game/Graphics/UserInterface/Bar.cs
@@ -1,12 +1,12 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using System;
using osuTK;
using osuTK.Graphics;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
-using System;
namespace osu.Game.Graphics.UserInterface
{
@@ -29,7 +29,7 @@ namespace osu.Game.Graphics.UserInterface
get => length;
set
{
- length = MathHelper.Clamp(value, 0, 1);
+ length = Math.Clamp(value, 0, 1);
updateBarLength();
}
}
diff --git a/osu.Game/Graphics/UserInterface/IconButton.cs b/osu.Game/Graphics/UserInterface/IconButton.cs
index 27427581fd..d7e5666545 100644
--- a/osu.Game/Graphics/UserInterface/IconButton.cs
+++ b/osu.Game/Graphics/UserInterface/IconButton.cs
@@ -16,7 +16,7 @@ namespace osu.Game.Graphics.UserInterface
private Color4? iconColour;
///
- /// The icon colour. This does not affect .
+ /// The icon colour. This does not affect Colour.
///
public Color4 IconColour
{
@@ -49,7 +49,7 @@ namespace osu.Game.Graphics.UserInterface
}
///
- /// The icon scale. This does not affect .
+ /// The icon scale. This does not affect Scale.
///
public Vector2 IconScale
{
diff --git a/osu.Game/Graphics/UserInterface/OsuSliderBar.cs b/osu.Game/Graphics/UserInterface/OsuSliderBar.cs
index 11aba80d76..7412224f6c 100644
--- a/osu.Game/Graphics/UserInterface/OsuSliderBar.cs
+++ b/osu.Game/Graphics/UserInterface/OsuSliderBar.cs
@@ -175,9 +175,9 @@ namespace osu.Game.Graphics.UserInterface
protected override void UpdateAfterChildren()
{
base.UpdateAfterChildren();
- leftBox.Scale = new Vector2(MathHelper.Clamp(
+ leftBox.Scale = new Vector2(Math.Clamp(
Nub.DrawPosition.X - Nub.DrawWidth / 2, 0, DrawWidth), 1);
- rightBox.Scale = new Vector2(MathHelper.Clamp(
+ rightBox.Scale = new Vector2(Math.Clamp(
DrawWidth - Nub.DrawPosition.X - Nub.DrawWidth / 2, 0, DrawWidth), 1);
}
diff --git a/osu.Game/Graphics/UserInterface/OsuTabControl.cs b/osu.Game/Graphics/UserInterface/OsuTabControl.cs
index 5d1bdc62e9..064cba6adf 100644
--- a/osu.Game/Graphics/UserInterface/OsuTabControl.cs
+++ b/osu.Game/Graphics/UserInterface/OsuTabControl.cs
@@ -32,7 +32,7 @@ namespace osu.Game.Graphics.UserInterface
protected virtual float StripHeight() => 1;
///
- /// Whether entries should be automatically populated if is an type.
+ /// Whether entries should be automatically populated if is an type.
///
protected virtual bool AddEnumEntriesAutomatically => true;
@@ -99,7 +99,7 @@ namespace osu.Game.Graphics.UserInterface
// dont bother calculating if the strip is invisible
if (strip.Colour.MaxAlpha > 0)
- strip.Width = Interpolation.ValueAt(MathHelper.Clamp(Clock.ElapsedFrameTime, 0, 1000), strip.Width, StripWidth(), 0, 500, Easing.OutQuint);
+ strip.Width = Interpolation.ValueAt(Math.Clamp(Clock.ElapsedFrameTime, 0, 1000), strip.Width, StripWidth(), 0, 500, Easing.OutQuint);
}
public class OsuTabItem : TabItem, IHasAccentColour
diff --git a/osu.Game/Input/Bindings/DatabasedKeyBindingContainer.cs b/osu.Game/Input/Bindings/DatabasedKeyBindingContainer.cs
index f34b8f14b0..ea274284ac 100644
--- a/osu.Game/Input/Bindings/DatabasedKeyBindingContainer.cs
+++ b/osu.Game/Input/Bindings/DatabasedKeyBindingContainer.cs
@@ -30,7 +30,7 @@ namespace osu.Game.Input.Bindings
///
/// A reference to identify the current . Used to lookup mappings. Null for global mappings.
/// An optional variant for the specified . Used when a ruleset has more than one possible keyboard layouts.
- /// Specify how to deal with multiple matches of s and s.
+ /// Specify how to deal with multiple matches of s and s.
public DatabasedKeyBindingContainer(RulesetInfo ruleset = null, int? variant = null, SimultaneousBindingMode simultaneousMode = SimultaneousBindingMode.None)
: base(simultaneousMode)
{
diff --git a/osu.Game/Online/API/APIAccess.cs b/osu.Game/Online/API/APIAccess.cs
index d722c7a98a..b6127027cc 100644
--- a/osu.Game/Online/API/APIAccess.cs
+++ b/osu.Game/Online/API/APIAccess.cs
@@ -227,7 +227,7 @@ namespace osu.Game.Online.API
{
try
{
- return JObject.Parse(req.ResponseString).SelectToken("form_error", true).ToObject();
+ return JObject.Parse(req.GetResponseString()).SelectToken("form_error", true).ToObject();
}
catch
{
diff --git a/osu.Game/Online/API/APIRequest.cs b/osu.Game/Online/API/APIRequest.cs
index ea0d50511f..53b23f5922 100644
--- a/osu.Game/Online/API/APIRequest.cs
+++ b/osu.Game/Online/API/APIRequest.cs
@@ -113,7 +113,7 @@ namespace osu.Game.Online.API
cancelled = true;
WebRequest?.Abort();
- string responseString = WebRequest?.ResponseString;
+ string responseString = WebRequest?.GetResponseString();
if (!string.IsNullOrEmpty(responseString))
{
diff --git a/osu.Game/Online/DownloadTrackingComposite.cs b/osu.Game/Online/DownloadTrackingComposite.cs
index 7bfdc7ff69..dcec17788a 100644
--- a/osu.Game/Online/DownloadTrackingComposite.cs
+++ b/osu.Game/Online/DownloadTrackingComposite.cs
@@ -11,7 +11,7 @@ using osu.Game.Online.API;
namespace osu.Game.Online
{
///
- /// A component which tracks a through potential download/import/deletion.
+ /// A component which tracks a through potential download/import/deletion.
///
public abstract class DownloadTrackingComposite : CompositeDrawable
where TModel : class, IEquatable
@@ -22,7 +22,7 @@ namespace osu.Game.Online
private TModelManager manager;
///
- /// Holds the current download state of the , whether is has already been downloaded, is in progress, or is not downloaded.
+ /// Holds the current download state of the , whether is has already been downloaded, is in progress, or is not downloaded.
///
protected readonly Bindable State = new Bindable();
diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs
index 328c964976..e978df404f 100644
--- a/osu.Game/OsuGame.cs
+++ b/osu.Game/OsuGame.cs
@@ -71,7 +71,7 @@ namespace osu.Game
[Cached]
private readonly ScreenshotManager screenshotManager = new ScreenshotManager();
- protected RavenLogger RavenLogger;
+ protected SentryLogger SentryLogger;
public virtual Storage GetStorageForStableInstall() => null;
@@ -110,7 +110,7 @@ namespace osu.Game
forwardLoggedErrorsToNotifications();
- RavenLogger = new RavenLogger(this);
+ SentryLogger = new SentryLogger(this);
}
private void updateBlockingOverlayFade() =>
@@ -166,7 +166,7 @@ namespace osu.Game
dependencies.CacheAs(this);
- dependencies.Cache(RavenLogger);
+ dependencies.Cache(SentryLogger);
dependencies.Cache(osuLogo = new OsuLogo { Alpha = 0 });
@@ -486,7 +486,7 @@ namespace osu.Game
protected override void Dispose(bool isDisposing)
{
base.Dispose(isDisposing);
- RavenLogger.Dispose();
+ SentryLogger.Dispose();
}
protected override void LoadComplete()
@@ -925,6 +925,8 @@ namespace osu.Game
{
OverlayActivationMode.Value = newOsuScreen.InitialOverlayActivationMode;
+ musicController.AllowRateAdjustments = newOsuScreen.AllowRateAdjustments;
+
if (newOsuScreen.HideOverlaysOnEnter)
CloseAllOverlays();
else
diff --git a/osu.Game/Overlays/BeatmapSet/LeaderboardModSelector.cs b/osu.Game/Overlays/BeatmapSet/LeaderboardModSelector.cs
index e62a754e92..60fd520681 100644
--- a/osu.Game/Overlays/BeatmapSet/LeaderboardModSelector.cs
+++ b/osu.Game/Overlays/BeatmapSet/LeaderboardModSelector.cs
@@ -20,34 +20,7 @@ namespace osu.Game.Overlays.BeatmapSet
public class LeaderboardModSelector : CompositeDrawable
{
public readonly BindableList SelectedMods = new BindableList();
-
- private RulesetInfo ruleset;
-
- public RulesetInfo Ruleset
- {
- get => ruleset;
- set
- {
- if (ruleset?.Equals(value) ?? false)
- {
- DeselectAll();
- return;
- }
-
- ruleset = value;
-
- SelectedMods.Clear();
- modsContainer.Clear();
-
- if (ruleset == null)
- return;
-
- modsContainer.Add(new ModButton(new ModNoMod()));
- modsContainer.AddRange(ruleset.CreateInstance().GetAllMods().Where(m => m.Ranked).Select(m => new ModButton(m)));
-
- modsContainer.ForEach(button => button.OnSelectionChanged = selectionChanged);
- }
- }
+ public readonly Bindable Ruleset = new Bindable();
private readonly FillFlowContainer modsContainer;
@@ -64,6 +37,38 @@ namespace osu.Game.Overlays.BeatmapSet
};
}
+ protected override void LoadComplete()
+ {
+ base.LoadComplete();
+ Ruleset.BindValueChanged(onRulesetChanged, true);
+ }
+
+ private void onRulesetChanged(ValueChangedEvent ruleset)
+ {
+ SelectedMods.Clear();
+ modsContainer.Clear();
+
+ if (ruleset.NewValue == null)
+ return;
+
+ modsContainer.Add(new ModButton(new ModNoMod()));
+ modsContainer.AddRange(ruleset.NewValue.CreateInstance().GetAllMods().Where(m => m.Ranked).Select(m => new ModButton(m)));
+
+ modsContainer.ForEach(button => button.OnSelectionChanged = selectionChanged);
+ }
+
+ protected override bool OnHover(HoverEvent e)
+ {
+ updateHighlighted();
+ return base.OnHover(e);
+ }
+
+ protected override void OnHoverLost(HoverLostEvent e)
+ {
+ base.OnHoverLost(e);
+ updateHighlighted();
+ }
+
private void selectionChanged(Mod mod, bool selected)
{
if (selected)
@@ -71,43 +76,30 @@ namespace osu.Game.Overlays.BeatmapSet
else
SelectedMods.Remove(mod);
- if (!SelectedMods.Any() && !IsHovered)
- highlightAll();
+ updateHighlighted();
}
- protected override bool OnHover(HoverEvent e)
+ private void updateHighlighted()
{
- if (!SelectedMods.Any())
- modsContainer.Children.Where(button => !button.IsHovered).ForEach(button => button.Highlighted.Value = false);
+ if (SelectedMods.Any())
+ return;
- return base.OnHover(e);
- }
-
- protected override void OnHoverLost(HoverLostEvent e)
- {
- base.OnHoverLost(e);
-
- if (!SelectedMods.Any())
- highlightAll();
+ modsContainer.Children.Where(button => !button.IsHovered).ForEach(button => button.Highlighted.Value = !IsHovered);
}
public void DeselectAll() => modsContainer.ForEach(mod => mod.Selected.Value = false);
- private void highlightAll() => modsContainer.ForEach(mod => mod.Highlighted.Value = true);
-
private class ModButton : ModIcon
{
- private const float mod_scale = 0.4f;
private const int duration = 200;
- public readonly BindableBool Selected = new BindableBool();
+ public readonly BindableBool Highlighted = new BindableBool();
public Action OnSelectionChanged;
public ModButton(Mod mod)
: base(mod)
{
- Scale = new Vector2(mod_scale);
- Highlighted.Value = true;
+ Scale = new Vector2(0.4f);
Add(new HoverClickSounds());
}
@@ -115,11 +107,19 @@ namespace osu.Game.Overlays.BeatmapSet
{
base.LoadComplete();
+ Highlighted.BindValueChanged(highlighted =>
+ {
+ if (Selected.Value)
+ return;
+
+ this.FadeColour(highlighted.NewValue ? Color4.White : Color4.DimGray, duration, Easing.OutQuint);
+ }, true);
+
Selected.BindValueChanged(selected =>
{
- updateState();
OnSelectionChanged?.Invoke(Mod, selected.NewValue);
- });
+ Highlighted.TriggerChange();
+ }, true);
}
protected override bool OnClick(ClickEvent e)
@@ -130,20 +130,15 @@ namespace osu.Game.Overlays.BeatmapSet
protected override bool OnHover(HoverEvent e)
{
- updateState();
+ Highlighted.Value = true;
return false;
}
protected override void OnHoverLost(HoverLostEvent e)
{
base.OnHoverLost(e);
- updateState();
+ Highlighted.Value = false;
}
-
- private void updateState() => Highlighted.Value = IsHovered || Selected.Value;
-
- protected override void OnHighlightedChanged(ValueChangedEvent highlighted) =>
- this.FadeColour(highlighted.NewValue ? Color4.White : Color4.Gray, duration, Easing.OutQuint);
}
}
}
diff --git a/osu.Game/Overlays/BeatmapSet/Scores/ScoresContainer.cs b/osu.Game/Overlays/BeatmapSet/Scores/ScoresContainer.cs
index bdcf536e39..3e3f823368 100644
--- a/osu.Game/Overlays/BeatmapSet/Scores/ScoresContainer.cs
+++ b/osu.Game/Overlays/BeatmapSet/Scores/ScoresContainer.cs
@@ -107,7 +107,10 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
{
Current = { BindTarget = scope }
},
- modSelector = new LeaderboardModSelector()
+ modSelector = new LeaderboardModSelector
+ {
+ Ruleset = { BindTarget = ruleset }
+ }
}
},
new Container
@@ -187,7 +190,13 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
private void onBeatmapChanged(ValueChangedEvent beatmap)
{
- ruleset.Value = modSelector.Ruleset = beatmap.NewValue?.Ruleset;
+ var beatmapRuleset = beatmap.NewValue?.Ruleset;
+
+ if (ruleset.Value?.Equals(beatmapRuleset) ?? false)
+ modSelector.DeselectAll();
+ else
+ ruleset.Value = beatmapRuleset;
+
scope.Value = BeatmapLeaderboardScope.Global;
}
diff --git a/osu.Game/Overlays/Chat/Tabs/ChannelTabControl.cs b/osu.Game/Overlays/Chat/Tabs/ChannelTabControl.cs
index 8b88d81b88..583db460f4 100644
--- a/osu.Game/Overlays/Chat/Tabs/ChannelTabControl.cs
+++ b/osu.Game/Overlays/Chat/Tabs/ChannelTabControl.cs
@@ -99,7 +99,7 @@ namespace osu.Game.Overlays.Chat.Tabs
private void tabCloseRequested(TabItem tab)
{
int totalTabs = TabContainer.Count - 1; // account for selectorTab
- int currentIndex = MathHelper.Clamp(TabContainer.IndexOf(tab), 1, totalTabs);
+ int currentIndex = Math.Clamp(TabContainer.IndexOf(tab), 1, totalTabs);
if (tab == SelectedTab && totalTabs > 1)
// Select the tab after tab-to-be-removed's index, or the tab before if current == last
diff --git a/osu.Game/Overlays/Comments/TotalCommentsCounter.cs b/osu.Game/Overlays/Comments/TotalCommentsCounter.cs
new file mode 100644
index 0000000000..c71ca762e1
--- /dev/null
+++ b/osu.Game/Overlays/Comments/TotalCommentsCounter.cs
@@ -0,0 +1,80 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using osu.Framework.Graphics.Containers;
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Shapes;
+using osu.Game.Graphics;
+using osu.Framework.Graphics.Sprites;
+using osuTK;
+using osu.Framework.Allocation;
+using osu.Framework.Bindables;
+
+namespace osu.Game.Overlays.Comments
+{
+ public class TotalCommentsCounter : CompositeDrawable
+ {
+ public readonly BindableInt Current = new BindableInt();
+
+ private readonly SpriteText counter;
+
+ public TotalCommentsCounter()
+ {
+ RelativeSizeAxes = Axes.X;
+ Height = 50;
+ AddInternal(new FillFlowContainer
+ {
+ Anchor = Anchor.CentreLeft,
+ Origin = Anchor.CentreLeft,
+ AutoSizeAxes = Axes.Both,
+ Direction = FillDirection.Horizontal,
+ Margin = new MarginPadding { Left = 50 },
+ Spacing = new Vector2(5, 0),
+ Children = new Drawable[]
+ {
+ new SpriteText
+ {
+ Anchor = Anchor.CentreLeft,
+ Origin = Anchor.CentreLeft,
+ Font = OsuFont.GetFont(size: 20, italics: true),
+ Text = @"Comments"
+ },
+ new CircularContainer
+ {
+ Anchor = Anchor.CentreLeft,
+ Origin = Anchor.CentreLeft,
+ AutoSizeAxes = Axes.Both,
+ Masking = true,
+ Children = new Drawable[]
+ {
+ new Box
+ {
+ RelativeSizeAxes = Axes.Both,
+ Colour = OsuColour.Gray(0.05f)
+ },
+ counter = new SpriteText
+ {
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ Margin = new MarginPadding { Horizontal = 10, Vertical = 5 },
+ Font = OsuFont.GetFont(size: 14, weight: FontWeight.Bold)
+ }
+ },
+ }
+ }
+ });
+ }
+
+ [BackgroundDependencyLoader]
+ private void load(OsuColour colours)
+ {
+ counter.Colour = colours.BlueLighter;
+ }
+
+ protected override void LoadComplete()
+ {
+ Current.BindValueChanged(value => counter.Text = value.NewValue.ToString("N0"), true);
+ base.LoadComplete();
+ }
+ }
+}
diff --git a/osu.Game/Overlays/Dialog/PopupDialog.cs b/osu.Game/Overlays/Dialog/PopupDialog.cs
index cff887865a..13eb677263 100644
--- a/osu.Game/Overlays/Dialog/PopupDialog.cs
+++ b/osu.Game/Overlays/Dialog/PopupDialog.cs
@@ -241,7 +241,7 @@ namespace osu.Game.Overlays.Dialog
protected override void PopOut()
{
- if (!actionInvoked)
+ if (!actionInvoked && content.IsPresent)
// In the case a user did not choose an action before a hide was triggered, press the last button.
// This is presumed to always be a sane default "cancel" action.
buttonsContainer.Last().Click();
diff --git a/osu.Game/Overlays/Mods/ModButton.cs b/osu.Game/Overlays/Mods/ModButton.cs
index 8252020e9b..c6b4787ff1 100644
--- a/osu.Game/Overlays/Mods/ModButton.cs
+++ b/osu.Game/Overlays/Mods/ModButton.cs
@@ -96,7 +96,7 @@ namespace osu.Game.Overlays.Mods
}
}
- foregroundIcon.Highlighted.Value = Selected;
+ foregroundIcon.Selected.Value = Selected;
SelectionChanged?.Invoke(SelectedMod);
return true;
diff --git a/osu.Game/Overlays/Music/PlaylistList.cs b/osu.Game/Overlays/Music/PlaylistList.cs
index e3acd31626..83528298b1 100644
--- a/osu.Game/Overlays/Music/PlaylistList.cs
+++ b/osu.Game/Overlays/Music/PlaylistList.cs
@@ -217,7 +217,7 @@ namespace osu.Game.Overlays.Music
break;
}
- dstIndex = MathHelper.Clamp(dstIndex, 0, items.Count - 1);
+ dstIndex = Math.Clamp(dstIndex, 0, items.Count - 1);
if (srcIndex == dstIndex)
return;
diff --git a/osu.Game/Overlays/MusicController.cs b/osu.Game/Overlays/MusicController.cs
index 9ec0364420..5e0a67c2f7 100644
--- a/osu.Game/Overlays/MusicController.cs
+++ b/osu.Game/Overlays/MusicController.cs
@@ -233,6 +233,24 @@ namespace osu.Game.Overlays
queuedDirection = null;
}
+ private bool allowRateAdjustments;
+
+ ///
+ /// Whether mod rate adjustments are allowed to be applied.
+ ///
+ public bool AllowRateAdjustments
+ {
+ get => allowRateAdjustments;
+ set
+ {
+ if (allowRateAdjustments == value)
+ return;
+
+ allowRateAdjustments = value;
+ ResetTrackAdjustments();
+ }
+ }
+
public void ResetTrackAdjustments()
{
var track = current?.Track;
@@ -241,8 +259,11 @@ namespace osu.Game.Overlays
track.ResetSpeedAdjustments();
- foreach (var mod in mods.Value.OfType())
- mod.ApplyToClock(track);
+ if (allowRateAdjustments)
+ {
+ foreach (var mod in mods.Value.OfType())
+ mod.ApplyToClock(track);
+ }
}
protected override void Dispose(bool isDisposing)
diff --git a/osu.Game/Overlays/News/NewsContent.cs b/osu.Game/Overlays/News/NewsContent.cs
new file mode 100644
index 0000000000..5ff210f9f5
--- /dev/null
+++ b/osu.Game/Overlays/News/NewsContent.cs
@@ -0,0 +1,19 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Containers;
+
+namespace osu.Game.Overlays.News
+{
+ public abstract class NewsContent : FillFlowContainer
+ {
+ protected NewsContent()
+ {
+ RelativeSizeAxes = Axes.X;
+ AutoSizeAxes = Axes.Y;
+ Direction = FillDirection.Vertical;
+ Padding = new MarginPadding { Bottom = 100, Top = 20, Horizontal = 50 };
+ }
+ }
+}
diff --git a/osu.Game/Overlays/News/NewsHeader.cs b/osu.Game/Overlays/News/NewsHeader.cs
new file mode 100644
index 0000000000..27620ab523
--- /dev/null
+++ b/osu.Game/Overlays/News/NewsHeader.cs
@@ -0,0 +1,109 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using osu.Framework.Allocation;
+using osu.Framework.Bindables;
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Containers;
+using osu.Framework.Graphics.Sprites;
+using osu.Framework.Graphics.Textures;
+using osu.Game.Graphics;
+using osu.Game.Graphics.UserInterface;
+using System;
+
+namespace osu.Game.Overlays.News
+{
+ public class NewsHeader : OverlayHeader
+ {
+ private const string front_page_string = "Front Page";
+
+ private NewsHeaderTitle title;
+
+ public readonly Bindable Current = new Bindable(null);
+
+ public Action ShowFrontPage;
+
+ public NewsHeader()
+ {
+ TabControl.AddItem(front_page_string);
+
+ TabControl.Current.ValueChanged += e =>
+ {
+ if (e.NewValue == front_page_string)
+ ShowFrontPage?.Invoke();
+ };
+
+ Current.ValueChanged += showArticle;
+ }
+
+ [BackgroundDependencyLoader]
+ private void load(OsuColour colour)
+ {
+ TabControl.AccentColour = colour.Violet;
+ }
+
+ private void showArticle(ValueChangedEvent e)
+ {
+ if (e.OldValue != null)
+ TabControl.RemoveItem(e.OldValue);
+
+ if (e.NewValue != null)
+ {
+ TabControl.AddItem(e.NewValue);
+ TabControl.Current.Value = e.NewValue;
+
+ title.IsReadingArticle = true;
+ }
+ else
+ {
+ TabControl.Current.Value = front_page_string;
+ title.IsReadingArticle = false;
+ }
+ }
+
+ protected override Drawable CreateBackground() => new NewsHeaderBackground();
+
+ protected override Drawable CreateContent() => new Container();
+
+ protected override ScreenTitle CreateTitle() => title = new NewsHeaderTitle();
+
+ private class NewsHeaderBackground : Sprite
+ {
+ public NewsHeaderBackground()
+ {
+ RelativeSizeAxes = Axes.Both;
+ FillMode = FillMode.Fill;
+ }
+
+ [BackgroundDependencyLoader]
+ private void load(TextureStore textures)
+ {
+ Texture = textures.Get(@"Headers/news");
+ }
+ }
+
+ private class NewsHeaderTitle : ScreenTitle
+ {
+ private const string article_string = "Article";
+
+ public bool IsReadingArticle
+ {
+ set => Section = value ? article_string : front_page_string;
+ }
+
+ public NewsHeaderTitle()
+ {
+ Title = "News";
+ IsReadingArticle = false;
+ }
+
+ protected override Drawable CreateIcon() => new ScreenTitleTextureIcon(@"Icons/news");
+
+ [BackgroundDependencyLoader]
+ private void load(OsuColour colours)
+ {
+ AccentColour = colours.Violet;
+ }
+ }
+ }
+}
diff --git a/osu.Game/Overlays/NewsOverlay.cs b/osu.Game/Overlays/NewsOverlay.cs
new file mode 100644
index 0000000000..aadca8883e
--- /dev/null
+++ b/osu.Game/Overlays/NewsOverlay.cs
@@ -0,0 +1,68 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using osu.Framework.Allocation;
+using osu.Framework.Bindables;
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Containers;
+using osu.Framework.Graphics.Shapes;
+using osu.Game.Graphics;
+using osu.Game.Graphics.Containers;
+using osu.Game.Overlays.News;
+
+namespace osu.Game.Overlays
+{
+ public class NewsOverlay : FullscreenOverlay
+ {
+ private NewsHeader header;
+
+ //ReSharper disable NotAccessedField.Local
+ private Container content;
+
+ public readonly Bindable Current = new Bindable(null);
+
+ [BackgroundDependencyLoader]
+ private void load(OsuColour colours)
+ {
+ Children = new Drawable[]
+ {
+ new Box
+ {
+ RelativeSizeAxes = Axes.Both,
+ Colour = colours.PurpleDarkAlternative
+ },
+ new OsuScrollContainer
+ {
+ RelativeSizeAxes = Axes.Both,
+ Child = new FillFlowContainer
+ {
+ RelativeSizeAxes = Axes.X,
+ AutoSizeAxes = Axes.Y,
+ Direction = FillDirection.Vertical,
+ Children = new Drawable[]
+ {
+ header = new NewsHeader
+ {
+ ShowFrontPage = ShowFrontPage
+ },
+ content = new Container
+ {
+ RelativeSizeAxes = Axes.X,
+ AutoSizeAxes = Axes.Y,
+ }
+ },
+ },
+ },
+ };
+
+ header.Current.BindTo(Current);
+ Current.TriggerChange();
+ }
+
+ public void ShowFrontPage()
+ {
+ Current.Value = null;
+ Show();
+ }
+ }
+}
diff --git a/osu.Game/Overlays/OnScreenDisplay.cs b/osu.Game/Overlays/OnScreenDisplay.cs
index a92320945e..e6708093c4 100644
--- a/osu.Game/Overlays/OnScreenDisplay.cs
+++ b/osu.Game/Overlays/OnScreenDisplay.cs
@@ -86,7 +86,7 @@ namespace osu.Game.Overlays
/// The object that registered the to be tracked.
/// The that is being tracked.
/// If is null.
- /// If is not being tracked from the same .
+ /// If is not being tracked from the same .
public void StopTracking(object source, ITrackableConfigManager configManager)
{
if (configManager == null) throw new ArgumentNullException(nameof(configManager));
diff --git a/osu.Game/Overlays/Profile/Header/Components/SupporterIcon.cs b/osu.Game/Overlays/Profile/Header/Components/SupporterIcon.cs
index fa60a37ddb..d581e2750c 100644
--- a/osu.Game/Overlays/Profile/Header/Components/SupporterIcon.cs
+++ b/osu.Game/Overlays/Profile/Header/Components/SupporterIcon.cs
@@ -1,6 +1,7 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using System;
using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
@@ -8,7 +9,6 @@ using osu.Framework.Graphics.Cursor;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.Sprites;
using osu.Game.Graphics;
-using osuTK;
namespace osu.Game.Overlays.Profile.Header.Components
{
@@ -24,7 +24,7 @@ namespace osu.Game.Overlays.Profile.Header.Components
{
set
{
- int count = MathHelper.Clamp(value, 0, 3);
+ int count = Math.Clamp(value, 0, 3);
if (count == 0)
{
diff --git a/osu.Game/Overlays/Settings/Sections/Audio/AudioDevicesSettings.cs b/osu.Game/Overlays/Settings/Sections/Audio/AudioDevicesSettings.cs
index 2c25808170..0612f028bc 100644
--- a/osu.Game/Overlays/Settings/Sections/Audio/AudioDevicesSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/Audio/AudioDevicesSettings.cs
@@ -60,7 +60,10 @@ namespace osu.Game.Overlays.Settings.Sections.Audio
Children = new Drawable[]
{
- dropdown = new AudioDeviceSettingsDropdown()
+ dropdown = new AudioDeviceSettingsDropdown
+ {
+ Keywords = new[] { "speaker", "headphone", "output" }
+ }
};
updateItems();
diff --git a/osu.Game/Overlays/Settings/Sections/Audio/MainMenuSettings.cs b/osu.Game/Overlays/Settings/Sections/Audio/MainMenuSettings.cs
index 5ccdc952ba..a303f93b34 100644
--- a/osu.Game/Overlays/Settings/Sections/Audio/MainMenuSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/Audio/MainMenuSettings.cs
@@ -34,6 +34,12 @@ namespace osu.Game.Overlays.Settings.Sections.Audio
Bindable = config.GetBindable(OsuSetting.IntroSequence),
Items = Enum.GetValues(typeof(IntroSequence)).Cast()
},
+ new SettingsDropdown
+ {
+ LabelText = "Background source",
+ Bindable = config.GetBindable(OsuSetting.MenuBackgroundSource),
+ Items = Enum.GetValues(typeof(BackgroundSource)).Cast()
+ }
};
}
}
diff --git a/osu.Game/Overlays/Settings/Sections/AudioSection.cs b/osu.Game/Overlays/Settings/Sections/AudioSection.cs
index 7ca313a751..b18488b616 100644
--- a/osu.Game/Overlays/Settings/Sections/AudioSection.cs
+++ b/osu.Game/Overlays/Settings/Sections/AudioSection.cs
@@ -1,6 +1,8 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using System.Collections.Generic;
+using System.Linq;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Sprites;
using osu.Game.Overlays.Settings.Sections.Audio;
@@ -10,6 +12,9 @@ namespace osu.Game.Overlays.Settings.Sections
public class AudioSection : SettingsSection
{
public override string Header => "Audio";
+
+ public override IEnumerable FilterTerms => base.FilterTerms.Concat(new[] { "sound" });
+
public override IconUsage Icon => FontAwesome.Solid.VolumeUp;
public AudioSection()
diff --git a/osu.Game/Overlays/Settings/Sections/Gameplay/GeneralSettings.cs b/osu.Game/Overlays/Settings/Sections/Gameplay/GeneralSettings.cs
index 520a8852b3..f4aa9a0144 100644
--- a/osu.Game/Overlays/Settings/Sections/Gameplay/GeneralSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/Gameplay/GeneralSettings.cs
@@ -38,6 +38,7 @@ namespace osu.Game.Overlays.Settings.Sections.Gameplay
{
LabelText = "Show health display even when you can't fail",
Bindable = config.GetBindable(OsuSetting.ShowHealthDisplayWhenCantFail),
+ Keywords = new[] { "hp", "bar" }
},
new SettingsCheckbox
{
diff --git a/osu.Game/Overlays/Settings/Sections/Gameplay/ModsSettings.cs b/osu.Game/Overlays/Settings/Sections/Gameplay/ModsSettings.cs
index 2c6b2663c6..0babb98066 100644
--- a/osu.Game/Overlays/Settings/Sections/Gameplay/ModsSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/Gameplay/ModsSettings.cs
@@ -1,6 +1,8 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using System.Collections.Generic;
+using System.Linq;
using osu.Framework.Allocation;
using osu.Game.Configuration;
@@ -10,6 +12,8 @@ namespace osu.Game.Overlays.Settings.Sections.Gameplay
{
protected override string Header => "Mods";
+ public override IEnumerable FilterTerms => base.FilterTerms.Concat(new[] { "mod" });
+
[BackgroundDependencyLoader]
private void load(OsuConfigManager config)
{
@@ -18,7 +22,7 @@ namespace osu.Game.Overlays.Settings.Sections.Gameplay
new SettingsCheckbox
{
LabelText = "Increase visibility of first object when visual impairment mods are enabled",
- Bindable = config.GetBindable(OsuSetting.IncreaseFirstObjectVisibility)
+ Bindable = config.GetBindable(OsuSetting.IncreaseFirstObjectVisibility),
},
};
}
diff --git a/osu.Game/Overlays/Settings/Sections/Gameplay/SongSelectSettings.cs b/osu.Game/Overlays/Settings/Sections/Gameplay/SongSelectSettings.cs
index 3e2272dba6..a5f56ae76e 100644
--- a/osu.Game/Overlays/Settings/Sections/Gameplay/SongSelectSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/Gameplay/SongSelectSettings.cs
@@ -31,13 +31,15 @@ namespace osu.Game.Overlays.Settings.Sections.Gameplay
{
LabelText = "Display beatmaps from",
Bindable = config.GetBindable(OsuSetting.DisplayStarsMinimum),
- KeyboardStep = 0.1f
+ KeyboardStep = 0.1f,
+ Keywords = new[] { "star", "difficulty" }
},
new SettingsSlider
{
LabelText = "up to",
Bindable = config.GetBindable(OsuSetting.DisplayStarsMaximum),
- KeyboardStep = 0.1f
+ KeyboardStep = 0.1f,
+ Keywords = new[] { "star", "difficulty" }
},
new SettingsEnumDropdown
{
diff --git a/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs b/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs
index f4de4c0c41..02b9edd975 100644
--- a/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs
@@ -75,12 +75,14 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics
LabelText = "UI Scaling",
TransferValueOnCommit = true,
Bindable = osuConfig.GetBindable(OsuSetting.UIScale),
- KeyboardStep = 0.01f
+ KeyboardStep = 0.01f,
+ Keywords = new[] { "scale", "letterbox" },
},
new SettingsEnumDropdown
{
LabelText = "Screen Scaling",
Bindable = osuConfig.GetBindable(OsuSetting.Scaling),
+ Keywords = new[] { "scale", "letterbox" },
},
scalingSettings = new FillFlowContainer>
{
diff --git a/osu.Game/Overlays/Settings/SettingsItem.cs b/osu.Game/Overlays/Settings/SettingsItem.cs
index d48c0b6b66..8863e43cca 100644
--- a/osu.Game/Overlays/Settings/SettingsItem.cs
+++ b/osu.Game/Overlays/Settings/SettingsItem.cs
@@ -76,7 +76,9 @@ namespace osu.Game.Overlays.Settings
}
}
- public virtual IEnumerable FilterTerms => new[] { LabelText };
+ public virtual IEnumerable FilterTerms => Keywords == null ? new[] { LabelText } : new List(Keywords) { LabelText }.ToArray();
+
+ public IEnumerable Keywords { get; set; }
public bool MatchingFilter
{
diff --git a/osu.Game/Overlays/Settings/SettingsSection.cs b/osu.Game/Overlays/Settings/SettingsSection.cs
index c878a9fc65..be3696029e 100644
--- a/osu.Game/Overlays/Settings/SettingsSection.cs
+++ b/osu.Game/Overlays/Settings/SettingsSection.cs
@@ -24,7 +24,7 @@ namespace osu.Game.Overlays.Settings
public abstract string Header { get; }
public IEnumerable FilterableChildren => Children.OfType();
- public IEnumerable FilterTerms => new[] { Header };
+ public virtual IEnumerable FilterTerms => new[] { Header };
private const int header_size = 26;
private const int header_margin = 25;
diff --git a/osu.Game/Overlays/Settings/SettingsSubsection.cs b/osu.Game/Overlays/Settings/SettingsSubsection.cs
index c9c763e8d4..9b3b2f570c 100644
--- a/osu.Game/Overlays/Settings/SettingsSubsection.cs
+++ b/osu.Game/Overlays/Settings/SettingsSubsection.cs
@@ -21,7 +21,7 @@ namespace osu.Game.Overlays.Settings
protected abstract string Header { get; }
public IEnumerable FilterableChildren => Children.OfType();
- public IEnumerable FilterTerms => new[] { Header };
+ public virtual IEnumerable FilterTerms => new[] { Header };
public bool MatchingFilter
{
diff --git a/osu.Game/Rulesets/Mods/ModTimeRamp.cs b/osu.Game/Rulesets/Mods/ModTimeRamp.cs
index 9edf57ad00..f217512965 100644
--- a/osu.Game/Rulesets/Mods/ModTimeRamp.cs
+++ b/osu.Game/Rulesets/Mods/ModTimeRamp.cs
@@ -9,7 +9,6 @@ using osu.Game.Beatmaps;
using osu.Game.Rulesets.UI;
using osu.Game.Rulesets.Objects;
using osu.Game.Rulesets.Objects.Types;
-using osuTK;
namespace osu.Game.Rulesets.Mods
{
@@ -59,7 +58,7 @@ namespace osu.Game.Rulesets.Mods
/// The amount of adjustment to apply (from 0..1).
private void applyAdjustment(double amount)
{
- double adjust = 1 + (Math.Sign(FinalRateAdjustment) * MathHelper.Clamp(amount, 0, 1) * Math.Abs(FinalRateAdjustment));
+ double adjust = 1 + (Math.Sign(FinalRateAdjustment) * Math.Clamp(amount, 0, 1) * Math.Abs(FinalRateAdjustment));
switch (clock)
{
diff --git a/osu.Game/Rulesets/Objects/SliderEventGenerator.cs b/osu.Game/Rulesets/Objects/SliderEventGenerator.cs
index 0d8796b4cb..e9ee3833b7 100644
--- a/osu.Game/Rulesets/Objects/SliderEventGenerator.cs
+++ b/osu.Game/Rulesets/Objects/SliderEventGenerator.cs
@@ -4,7 +4,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
-using osuTK;
namespace osu.Game.Rulesets.Objects
{
@@ -18,7 +17,7 @@ namespace osu.Game.Rulesets.Objects
const double max_length = 100000;
var length = Math.Min(max_length, totalDistance);
- tickDistance = MathHelper.Clamp(tickDistance, 0, length);
+ tickDistance = Math.Clamp(tickDistance, 0, length);
var minDistanceFromEnd = velocity * 10;
diff --git a/osu.Game/Rulesets/Objects/SliderPath.cs b/osu.Game/Rulesets/Objects/SliderPath.cs
index 7763b0eaaf..e8ef16e825 100644
--- a/osu.Game/Rulesets/Objects/SliderPath.cs
+++ b/osu.Game/Rulesets/Objects/SliderPath.cs
@@ -246,7 +246,7 @@ namespace osu.Game.Rulesets.Objects
private double progressToDistance(double progress)
{
- return MathHelper.Clamp(progress, 0, 1) * Distance;
+ return Math.Clamp(progress, 0, 1) * Distance;
}
private Vector2 interpolateVertices(int i, double d)
diff --git a/osu.Game/Rulesets/Replays/FramedReplayInputHandler.cs b/osu.Game/Rulesets/Replays/FramedReplayInputHandler.cs
index 4c011388fa..7e17396fde 100644
--- a/osu.Game/Rulesets/Replays/FramedReplayInputHandler.cs
+++ b/osu.Game/Rulesets/Replays/FramedReplayInputHandler.cs
@@ -7,7 +7,6 @@ using JetBrains.Annotations;
using osu.Framework.Input.StateChanges;
using osu.Game.Input.Handlers;
using osu.Game.Replays;
-using osuTK;
namespace osu.Game.Rulesets.Replays
{
@@ -52,7 +51,7 @@ namespace osu.Game.Rulesets.Replays
private int? currentFrameIndex;
- private int nextFrameIndex => currentFrameIndex.HasValue ? MathHelper.Clamp(currentFrameIndex.Value + (currentDirection > 0 ? 1 : -1), 0, Frames.Count - 1) : 0;
+ private int nextFrameIndex => currentFrameIndex.HasValue ? Math.Clamp(currentFrameIndex.Value + (currentDirection > 0 ? 1 : -1), 0, Frames.Count - 1) : 0;
protected FramedReplayInputHandler(Replay replay)
{
diff --git a/osu.Game/Rulesets/UI/DrawableRuleset.cs b/osu.Game/Rulesets/UI/DrawableRuleset.cs
index d1749d33c0..e0aeff8330 100644
--- a/osu.Game/Rulesets/UI/DrawableRuleset.cs
+++ b/osu.Game/Rulesets/UI/DrawableRuleset.cs
@@ -246,9 +246,9 @@ namespace osu.Game.Rulesets.UI
}
///
- /// Creates and adds the visual representation of a to this .
+ /// Creates and adds the visual representation of a to this .
///
- /// The to add the visual representation for.
+ /// The to add the visual representation for.
private void addHitObject(TObject hitObject)
{
var drawableObject = CreateDrawableRepresentation(hitObject);
@@ -517,6 +517,12 @@ namespace osu.Game.Rulesets.UI
public BindableDouble Frequency => throw new NotImplementedException();
+ public IBindable AggregateVolume => throw new NotImplementedException();
+
+ public IBindable AggregateBalance => throw new NotImplementedException();
+
+ public IBindable AggregateFrequency => throw new NotImplementedException();
+
public int PlaybackConcurrency
{
get => throw new NotImplementedException();
diff --git a/osu.Game/Rulesets/UI/ModIcon.cs b/osu.Game/Rulesets/UI/ModIcon.cs
index 19211e0c80..c22120d6e0 100644
--- a/osu.Game/Rulesets/UI/ModIcon.cs
+++ b/osu.Game/Rulesets/UI/ModIcon.cs
@@ -17,7 +17,7 @@ namespace osu.Game.Rulesets.UI
{
public class ModIcon : Container, IHasTooltip
{
- public readonly BindableBool Highlighted = new BindableBool();
+ public readonly BindableBool Selected = new BindableBool();
private readonly SpriteIcon modIcon;
private readonly SpriteIcon background;
@@ -114,12 +114,7 @@ namespace osu.Game.Rulesets.UI
protected override void LoadComplete()
{
base.LoadComplete();
- Highlighted.BindValueChanged(OnHighlightedChanged, true);
- }
-
- protected virtual void OnHighlightedChanged(ValueChangedEvent highlighted)
- {
- background.Colour = highlighted.NewValue ? highlightedColour : backgroundColour;
+ Selected.BindValueChanged(selected => background.Colour = selected.NewValue ? highlightedColour : backgroundColour, true);
}
}
}
diff --git a/osu.Game/Rulesets/UI/Scrolling/Algorithms/IScrollAlgorithm.cs b/osu.Game/Rulesets/UI/Scrolling/Algorithms/IScrollAlgorithm.cs
index b7a5eedc22..5f053975c7 100644
--- a/osu.Game/Rulesets/UI/Scrolling/Algorithms/IScrollAlgorithm.cs
+++ b/osu.Game/Rulesets/UI/Scrolling/Algorithms/IScrollAlgorithm.cs
@@ -13,7 +13,7 @@ namespace osu.Game.Rulesets.UI.Scrolling.Algorithms
///
/// The point in time.
/// The amount of visible time.
- /// The time at which enters .
+ /// The time at which enters .
double GetDisplayStartTime(double time, double timeRange);
///
@@ -22,7 +22,7 @@ namespace osu.Game.Rulesets.UI.Scrolling.Algorithms
/// The start time.
/// The end time.
/// The amount of visible time.
- /// The absolute spatial length through .
+ /// The absolute spatial length through .
/// The absolute spatial length.
float GetLength(double startTime, double endTime, double timeRange, float scrollLength);
@@ -32,7 +32,7 @@ namespace osu.Game.Rulesets.UI.Scrolling.Algorithms
/// The time to compute the spatial position of.
/// The current time.
/// The amount of visible time.
- /// The absolute spatial length through .
+ /// The absolute spatial length through .
/// The absolute spatial position.
float PositionAt(double time, double currentTime, double timeRange, float scrollLength);
@@ -42,7 +42,7 @@ namespace osu.Game.Rulesets.UI.Scrolling.Algorithms
/// The absolute spatial position.
/// The current time.
/// The amount of visible time.
- /// The absolute spatial length through .
+ /// The absolute spatial length through .
/// The time at which == .
double TimeAt(float position, double currentTime, double timeRange, float scrollLength);
diff --git a/osu.Game/Rulesets/UI/Scrolling/Algorithms/OverlappingScrollAlgorithm.cs b/osu.Game/Rulesets/UI/Scrolling/Algorithms/OverlappingScrollAlgorithm.cs
index 5316585493..fe22a86fad 100644
--- a/osu.Game/Rulesets/UI/Scrolling/Algorithms/OverlappingScrollAlgorithm.cs
+++ b/osu.Game/Rulesets/UI/Scrolling/Algorithms/OverlappingScrollAlgorithm.cs
@@ -1,9 +1,9 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using System;
using osu.Framework.Lists;
using osu.Game.Rulesets.Timing;
-using osuTK;
namespace osu.Game.Rulesets.UI.Scrolling.Algorithms
{
@@ -59,7 +59,7 @@ namespace osu.Game.Rulesets.UI.Scrolling.Algorithms
}
}
- i = MathHelper.Clamp(i, 0, controlPoints.Count - 1);
+ i = Math.Clamp(i, 0, controlPoints.Count - 1);
return controlPoints[i].StartTime + (position - pos) * timeRange / controlPoints[i].Multiplier / scrollLength;
}
diff --git a/osu.Game/Scoring/ScoreInfo.cs b/osu.Game/Scoring/ScoreInfo.cs
index d3c37bd4f4..f7bac82e74 100644
--- a/osu.Game/Scoring/ScoreInfo.cs
+++ b/osu.Game/Scoring/ScoreInfo.cs
@@ -183,6 +183,10 @@ namespace osu.Game.Scoring
public override string ToString() => $"{User} playing {Beatmap}";
- public bool Equals(ScoreInfo other) => other?.OnlineScoreID == OnlineScoreID;
+ public bool Equals(ScoreInfo other) =>
+ other != null
+ && other.OnlineScoreID == OnlineScoreID
+ && other.BeatmapInfoID == BeatmapInfoID
+ && other.Hash == Hash;
}
}
diff --git a/osu.Game/Scoring/ScoreManager.cs b/osu.Game/Scoring/ScoreManager.cs
index 8475158c78..3279af05b6 100644
--- a/osu.Game/Scoring/ScoreManager.cs
+++ b/osu.Game/Scoring/ScoreManager.cs
@@ -69,6 +69,6 @@ namespace osu.Game.Scoring
protected override ArchiveDownloadRequest CreateDownloadRequest(ScoreInfo score, bool minimiseDownload) => new DownloadReplayRequest(score);
- protected override bool CheckLocalAvailability(ScoreInfo model, IQueryable items) => items.Any(s => s.OnlineScoreID == model.OnlineScoreID && s.Files.Any());
+ protected override bool CheckLocalAvailability(ScoreInfo model, IQueryable items) => items.Any(s => s.Equals(model) && s.Files.Any());
}
}
diff --git a/osu.Game/Screens/Backgrounds/BackgroundScreenBeatmap.cs b/osu.Game/Screens/Backgrounds/BackgroundScreenBeatmap.cs
index 2730b0b90d..3de0ab191c 100644
--- a/osu.Game/Screens/Backgrounds/BackgroundScreenBeatmap.cs
+++ b/osu.Game/Screens/Backgrounds/BackgroundScreenBeatmap.cs
@@ -6,7 +6,6 @@ using System.Threading;
using osu.Framework.Allocation;
using osu.Framework.Bindables;
using osu.Framework.Graphics;
-using osu.Framework.Graphics.Textures;
using osu.Game.Beatmaps;
using osu.Game.Configuration;
using osu.Game.Graphics.Backgrounds;
@@ -107,22 +106,6 @@ namespace osu.Game.Screens.Backgrounds
return base.Equals(other) && beatmap == otherBeatmapBackground.Beatmap;
}
- protected class BeatmapBackground : Background
- {
- public readonly WorkingBeatmap Beatmap;
-
- public BeatmapBackground(WorkingBeatmap beatmap)
- {
- Beatmap = beatmap;
- }
-
- [BackgroundDependencyLoader]
- private void load(TextureStore textures)
- {
- Sprite.Texture = Beatmap?.Background ?? textures.Get(@"Backgrounds/bg1");
- }
- }
-
public class DimmableBackground : UserDimContainer
{
///
diff --git a/osu.Game/Screens/Backgrounds/BackgroundScreenDefault.cs b/osu.Game/Screens/Backgrounds/BackgroundScreenDefault.cs
index 2d7fe6a6a3..095985e9d1 100644
--- a/osu.Game/Screens/Backgrounds/BackgroundScreenDefault.cs
+++ b/osu.Game/Screens/Backgrounds/BackgroundScreenDefault.cs
@@ -6,6 +6,8 @@ using osu.Framework.Bindables;
using osu.Framework.Graphics;
using osu.Framework.MathUtils;
using osu.Framework.Threading;
+using osu.Game.Beatmaps;
+using osu.Game.Configuration;
using osu.Game.Graphics.Backgrounds;
using osu.Game.Online.API;
using osu.Game.Skinning;
@@ -24,6 +26,10 @@ namespace osu.Game.Screens.Backgrounds
private Bindable user;
private Bindable skin;
+ private Bindable mode;
+
+ [Resolved]
+ private IBindable beatmap { get; set; }
public BackgroundScreenDefault(bool animateOnEnter = true)
: base(animateOnEnter)
@@ -31,13 +37,16 @@ namespace osu.Game.Screens.Backgrounds
}
[BackgroundDependencyLoader]
- private void load(IAPIProvider api, SkinManager skinManager)
+ private void load(IAPIProvider api, SkinManager skinManager, OsuConfigManager config)
{
user = api.LocalUser.GetBoundCopy();
skin = skinManager.CurrentSkin.GetBoundCopy();
+ mode = config.GetBindable(OsuSetting.MenuBackgroundSource);
user.ValueChanged += _ => Next();
skin.ValueChanged += _ => Next();
+ mode.ValueChanged += _ => Next();
+ beatmap.ValueChanged += _ => Next();
currentDisplay = RNG.Next(0, background_count);
@@ -66,7 +75,18 @@ namespace osu.Game.Screens.Backgrounds
Background newBackground;
if (user.Value?.IsSupporter ?? false)
- newBackground = new SkinnedBackground(skin.Value, backgroundName);
+ {
+ switch (mode.Value)
+ {
+ case BackgroundSource.Beatmap:
+ newBackground = new BeatmapBackground(beatmap.Value, backgroundName);
+ break;
+
+ default:
+ newBackground = new SkinnedBackground(skin.Value, backgroundName);
+ break;
+ }
+ }
else
newBackground = new Background(backgroundName);
diff --git a/osu.Game/Screens/Edit/Components/Timelines/Summary/Parts/MarkerPart.cs b/osu.Game/Screens/Edit/Components/Timelines/Summary/Parts/MarkerPart.cs
index 07d307f293..79ada40a89 100644
--- a/osu.Game/Screens/Edit/Components/Timelines/Summary/Parts/MarkerPart.cs
+++ b/osu.Game/Screens/Edit/Components/Timelines/Summary/Parts/MarkerPart.cs
@@ -1,6 +1,7 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using System;
using osuTK;
using osu.Framework.Allocation;
using osu.Framework.Graphics;
@@ -59,7 +60,7 @@ namespace osu.Game.Screens.Edit.Components.Timelines.Summary.Parts
if (Beatmap.Value == null)
return;
- float markerPos = MathHelper.Clamp(ToLocalSpace(screenPosition).X, 0, DrawWidth);
+ float markerPos = Math.Clamp(ToLocalSpace(screenPosition).X, 0, DrawWidth);
adjustableClock.Seek(markerPos / DrawWidth * Beatmap.Value.Track.Length);
});
}
diff --git a/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs b/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs
index 2be4ca684a..195bc663f1 100644
--- a/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs
+++ b/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs
@@ -313,14 +313,15 @@ namespace osu.Game.Screens.Edit.Compose.Components
/// Attempts to select any hovered blueprints.
///
/// The input event that triggered this selection.
- private void beginClickSelection(UIEvent e)
+ private void beginClickSelection(MouseButtonEvent e)
{
Debug.Assert(!clickSelectionBegan);
- // If a select blueprint is already hovered, disallow changes in selection.
- // Exception is made when holding control, as deselection should still be allowed.
- if (!e.CurrentState.Keyboard.ControlPressed &&
- selectionHandler.SelectedBlueprints.Any(s => s.IsHovered))
+ // Deselections are only allowed for control + left clicks
+ bool allowDeselection = e.ControlPressed && e.Button == MouseButton.Left;
+
+ // Todo: This is probably incorrectly disallowing multiple selections on stacked objects
+ if (!allowDeselection && selectionHandler.SelectedBlueprints.Any(s => s.IsHovered))
return;
foreach (SelectionBlueprint blueprint in selectionBlueprints.AliveBlueprints)
diff --git a/osu.Game/Screens/Edit/Compose/Components/CircularDistanceSnapGrid.cs b/osu.Game/Screens/Edit/Compose/Components/CircularDistanceSnapGrid.cs
index 0f2bae6305..fc7d51db4b 100644
--- a/osu.Game/Screens/Edit/Compose/Components/CircularDistanceSnapGrid.cs
+++ b/osu.Game/Screens/Edit/Compose/Components/CircularDistanceSnapGrid.cs
@@ -75,7 +75,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
float distance = direction.Length;
float radius = DistanceSpacing;
- int radialCount = MathHelper.Clamp((int)Math.Round(distance / radius), 1, MaxIntervals);
+ int radialCount = Math.Clamp((int)Math.Round(distance / radius), 1, MaxIntervals);
Vector2 normalisedDirection = direction * new Vector2(1f / distance);
Vector2 snappedPosition = CentrePosition + normalisedDirection * radialCount * radius;
diff --git a/osu.Game/Screens/Edit/Compose/Components/Timeline/ZoomableScrollContainer.cs b/osu.Game/Screens/Edit/Compose/Components/Timeline/ZoomableScrollContainer.cs
index cffb6bedf3..54922fec5e 100644
--- a/osu.Game/Screens/Edit/Compose/Components/Timeline/ZoomableScrollContainer.cs
+++ b/osu.Game/Screens/Edit/Compose/Components/Timeline/ZoomableScrollContainer.cs
@@ -84,7 +84,7 @@ namespace osu.Game.Screens.Edit.Compose.Components.Timeline
get => zoomTarget;
set
{
- value = MathHelper.Clamp(value, MinZoom, MaxZoom);
+ value = Math.Clamp(value, MinZoom, MaxZoom);
if (IsLoaded)
setZoomTarget(value, ToSpaceOfOtherDrawable(new Vector2(DrawWidth / 2, 0), zoomedContent).X);
@@ -117,7 +117,7 @@ namespace osu.Game.Screens.Edit.Compose.Components.Timeline
private void setZoomTarget(float newZoom, float focusPoint)
{
- zoomTarget = MathHelper.Clamp(newZoom, MinZoom, MaxZoom);
+ zoomTarget = Math.Clamp(newZoom, MinZoom, MaxZoom);
transformZoomTo(zoomTarget, focusPoint, ZoomDuration, ZoomEasing);
}
diff --git a/osu.Game/Screens/Edit/EditorClock.cs b/osu.Game/Screens/Edit/EditorClock.cs
index bd2db4ae2b..93a5f19121 100644
--- a/osu.Game/Screens/Edit/EditorClock.cs
+++ b/osu.Game/Screens/Edit/EditorClock.cs
@@ -7,7 +7,6 @@ using osu.Framework.MathUtils;
using osu.Framework.Timing;
using osu.Game.Beatmaps;
using osu.Game.Beatmaps.ControlPoints;
-using osuTK;
namespace osu.Game.Screens.Edit
{
@@ -125,7 +124,7 @@ namespace osu.Game.Screens.Edit
seekTime = nextTimingPoint.Time;
// Ensure the sought point is within the boundaries
- seekTime = MathHelper.Clamp(seekTime, 0, TrackLength);
+ seekTime = Math.Clamp(seekTime, 0, TrackLength);
Seek(seekTime);
}
}
diff --git a/osu.Game/Screens/IOsuScreen.cs b/osu.Game/Screens/IOsuScreen.cs
index 9fc907c2a4..22fe0ad816 100644
--- a/osu.Game/Screens/IOsuScreen.cs
+++ b/osu.Game/Screens/IOsuScreen.cs
@@ -51,5 +51,10 @@ namespace osu.Game.Screens
Bindable Beatmap { get; }
Bindable Ruleset { get; }
+
+ ///
+ /// Whether mod rate adjustments are allowed to be applied.
+ ///
+ bool AllowRateAdjustments { get; }
}
}
diff --git a/osu.Game/Screens/Menu/Button.cs b/osu.Game/Screens/Menu/Button.cs
index ffeadb96c7..fac6b69e1f 100644
--- a/osu.Game/Screens/Menu/Button.cs
+++ b/osu.Game/Screens/Menu/Button.cs
@@ -236,7 +236,7 @@ namespace osu.Game.Screens.Menu
protected override void Update()
{
- iconText.Alpha = MathHelper.Clamp((box.Scale.X - 0.5f) / 0.3f, 0, 1);
+ iconText.Alpha = Math.Clamp((box.Scale.X - 0.5f) / 0.3f, 0, 1);
base.Update();
}
diff --git a/osu.Game/Screens/Menu/MainMenu.cs b/osu.Game/Screens/Menu/MainMenu.cs
index c195ed6cb6..231115d1e1 100644
--- a/osu.Game/Screens/Menu/MainMenu.cs
+++ b/osu.Game/Screens/Menu/MainMenu.cs
@@ -10,7 +10,6 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Platform;
using osu.Framework.Screens;
-using osu.Game.Beatmaps;
using osu.Game.Configuration;
using osu.Game.Graphics;
using osu.Game.Graphics.Containers;
@@ -37,6 +36,8 @@ namespace osu.Game.Screens.Menu
public override bool AllowExternalScreenChange => true;
+ public override bool AllowRateAdjustments => false;
+
private Screen songSelect;
private MenuSideFlashes sideFlashes;
@@ -168,8 +169,6 @@ namespace osu.Game.Screens.Menu
track.Start();
}
}
-
- Beatmap.ValueChanged += beatmap_ValueChanged;
}
private bool exitConfirmed;
@@ -218,14 +217,6 @@ namespace osu.Game.Screens.Menu
seq.OnAbort(_ => buttons.SetOsuLogo(null));
}
- private void beatmap_ValueChanged(ValueChangedEvent e)
- {
- if (!this.IsCurrentScreen())
- return;
-
- ((BackgroundScreenDefault)Background).Next();
- }
-
public override void OnSuspending(IScreen next)
{
base.OnSuspending(next);
diff --git a/osu.Game/Screens/Multi/Lounge/Components/DrawableRoom.cs b/osu.Game/Screens/Multi/Lounge/Components/DrawableRoom.cs
index 6ec8f2bfe5..f6cbe300f3 100644
--- a/osu.Game/Screens/Multi/Lounge/Components/DrawableRoom.cs
+++ b/osu.Game/Screens/Multi/Lounge/Components/DrawableRoom.cs
@@ -74,7 +74,9 @@ namespace osu.Game.Screens.Multi.Lounge.Components
set
{
matchingFilter = value;
- this.FadeTo(MatchingFilter ? 1 : 0, 200);
+
+ if (IsLoaded)
+ this.FadeTo(MatchingFilter ? 1 : 0, 200);
}
}
@@ -203,7 +205,11 @@ namespace osu.Game.Screens.Multi.Lounge.Components
protected override void LoadComplete()
{
base.LoadComplete();
- this.FadeInFromZero(transition_duration);
+
+ if (matchingFilter)
+ this.FadeInFromZero(transition_duration);
+ else
+ Alpha = 0;
}
private class RoomName : OsuSpriteText
diff --git a/osu.Game/Screens/Multi/Lounge/Components/FilterControl.cs b/osu.Game/Screens/Multi/Lounge/Components/FilterControl.cs
index d0d983bbff..29d41132a7 100644
--- a/osu.Game/Screens/Multi/Lounge/Components/FilterControl.cs
+++ b/osu.Game/Screens/Multi/Lounge/Components/FilterControl.cs
@@ -4,6 +4,7 @@
using System.ComponentModel;
using osu.Framework.Allocation;
using osu.Framework.Bindables;
+using osu.Framework.Threading;
using osu.Game.Graphics;
using osu.Game.Overlays.SearchableList;
using osuTK.Graphics;
@@ -37,12 +38,22 @@ namespace osu.Game.Screens.Multi.Lounge.Components
{
base.LoadComplete();
- Search.Current.BindValueChanged(_ => updateFilter());
+ Search.Current.BindValueChanged(_ => scheduleUpdateFilter());
Tabs.Current.BindValueChanged(_ => updateFilter(), true);
}
+ private ScheduledDelegate scheduledFilterUpdate;
+
+ private void scheduleUpdateFilter()
+ {
+ scheduledFilterUpdate?.Cancel();
+ scheduledFilterUpdate = Scheduler.AddDelayed(updateFilter, 200);
+ }
+
private void updateFilter()
{
+ scheduledFilterUpdate?.Cancel();
+
filter.Value = new FilterCriteria
{
SearchString = Search.Current.Value ?? string.Empty,
diff --git a/osu.Game/Screens/Multi/Lounge/Components/RoomsContainer.cs b/osu.Game/Screens/Multi/Lounge/Components/RoomsContainer.cs
index 99a6de0064..607b081653 100644
--- a/osu.Game/Screens/Multi/Lounge/Components/RoomsContainer.cs
+++ b/osu.Game/Screens/Multi/Lounge/Components/RoomsContainer.cs
@@ -24,6 +24,9 @@ namespace osu.Game.Screens.Multi.Lounge.Components
private readonly FillFlowContainer roomFlow;
public IReadOnlyList Rooms => roomFlow;
+ [Resolved(CanBeNull = true)]
+ private Bindable filter { get; set; }
+
[Resolved]
private Bindable currentRoom { get; set; }
@@ -57,7 +60,10 @@ namespace osu.Game.Screens.Multi.Lounge.Components
addRooms(rooms);
}
- private FilterCriteria currentFilter;
+ protected override void LoadComplete()
+ {
+ filter?.BindValueChanged(f => Filter(f.NewValue), true);
+ }
public void Filter(FilterCriteria criteria)
{
@@ -74,15 +80,13 @@ namespace osu.Game.Screens.Multi.Lounge.Components
{
default:
case SecondaryFilter.Public:
- r.MatchingFilter = r.Room.Availability.Value == RoomAvailability.Public;
+ matchingFilter &= r.Room.Availability.Value == RoomAvailability.Public;
break;
}
r.MatchingFilter = matchingFilter;
}
});
-
- currentFilter = criteria;
}
private void addRooms(IEnumerable rooms)
@@ -90,7 +94,8 @@ namespace osu.Game.Screens.Multi.Lounge.Components
foreach (var r in rooms)
roomFlow.Add(new DrawableRoom(r) { Action = () => selectRoom(r) });
- Filter(currentFilter);
+ if (filter != null)
+ Filter(filter.Value);
}
private void removeRooms(IEnumerable rooms)
diff --git a/osu.Game/Screens/OsuScreen.cs b/osu.Game/Screens/OsuScreen.cs
index 328631ff9c..94165fe4b7 100644
--- a/osu.Game/Screens/OsuScreen.cs
+++ b/osu.Game/Screens/OsuScreen.cs
@@ -91,6 +91,8 @@ namespace osu.Game.Screens
public Bindable Ruleset { get; private set; }
+ public virtual bool AllowRateAdjustments => true;
+
public Bindable> Mods { get; private set; }
protected override IReadOnlyDependencyContainer CreateChildDependencies(IReadOnlyDependencyContainer parent)
diff --git a/osu.Game/Screens/Play/HUD/HoldForMenuButton.cs b/osu.Game/Screens/Play/HUD/HoldForMenuButton.cs
index 968b83e68c..640224c057 100644
--- a/osu.Game/Screens/Play/HUD/HoldForMenuButton.cs
+++ b/osu.Game/Screens/Play/HUD/HoldForMenuButton.cs
@@ -102,8 +102,8 @@ namespace osu.Game.Screens.Play.HUD
else
{
Alpha = Interpolation.ValueAt(
- MathHelper.Clamp(Clock.ElapsedFrameTime, 0, 200),
- Alpha, MathHelper.Clamp(1 - positionalAdjust, 0.04f, 1), 0, 200, Easing.OutQuint);
+ Math.Clamp(Clock.ElapsedFrameTime, 0, 200),
+ Alpha, Math.Clamp(1 - positionalAdjust, 0.04f, 1), 0, 200, Easing.OutQuint);
}
}
diff --git a/osu.Game/Screens/Play/SongProgressBar.cs b/osu.Game/Screens/Play/SongProgressBar.cs
index 33c7595b37..cdf495e257 100644
--- a/osu.Game/Screens/Play/SongProgressBar.cs
+++ b/osu.Game/Screens/Play/SongProgressBar.cs
@@ -116,7 +116,7 @@ namespace osu.Game.Screens.Play
{
base.Update();
- float newX = (float)Interpolation.Lerp(handleBase.X, NormalizedValue * UsableWidth, MathHelper.Clamp(Time.Elapsed / 40, 0, 1));
+ float newX = (float)Interpolation.Lerp(handleBase.X, NormalizedValue * UsableWidth, Math.Clamp(Time.Elapsed / 40, 0, 1));
fill.Width = newX;
handleBase.X = newX;
diff --git a/osu.Game/Screens/Play/SquareGraph.cs b/osu.Game/Screens/Play/SquareGraph.cs
index 05f6128ac2..715ba3c065 100644
--- a/osu.Game/Screens/Play/SquareGraph.cs
+++ b/osu.Game/Screens/Play/SquareGraph.cs
@@ -256,7 +256,7 @@ namespace osu.Game.Screens.Play
{
Color4 colour = State == ColumnState.Lit ? LitColour : DimmedColour;
- int countFilled = (int)MathHelper.Clamp(filled * drawableRows.Count, 0, drawableRows.Count);
+ int countFilled = (int)Math.Clamp(filled * drawableRows.Count, 0, drawableRows.Count);
for (int i = 0; i < drawableRows.Count; i++)
drawableRows[i].Colour = i < countFilled ? colour : EmptyColour;
diff --git a/osu.Game/Screens/ScreenWhiteBox.cs b/osu.Game/Screens/ScreenWhiteBox.cs
index e4971221c4..3d8fd5dad7 100644
--- a/osu.Game/Screens/ScreenWhiteBox.cs
+++ b/osu.Game/Screens/ScreenWhiteBox.cs
@@ -87,9 +87,9 @@ namespace osu.Game.Screens
private static Color4 getColourFor(object type)
{
int hash = type.GetHashCode();
- byte r = (byte)MathHelper.Clamp(((hash & 0xFF0000) >> 16) * 0.8f, 20, 255);
- byte g = (byte)MathHelper.Clamp(((hash & 0x00FF00) >> 8) * 0.8f, 20, 255);
- byte b = (byte)MathHelper.Clamp((hash & 0x0000FF) * 0.8f, 20, 255);
+ byte r = (byte)Math.Clamp(((hash & 0xFF0000) >> 16) * 0.8f, 20, 255);
+ byte g = (byte)Math.Clamp(((hash & 0x00FF00) >> 8) * 0.8f, 20, 255);
+ byte b = (byte)Math.Clamp((hash & 0x0000FF) * 0.8f, 20, 255);
return new Color4(r, g, b, 255);
}
diff --git a/osu.Game/Screens/Select/BeatmapCarousel.cs b/osu.Game/Screens/Select/BeatmapCarousel.cs
index c3436ffd45..538656a5fa 100644
--- a/osu.Game/Screens/Select/BeatmapCarousel.cs
+++ b/osu.Game/Screens/Select/BeatmapCarousel.cs
@@ -351,7 +351,7 @@ namespace osu.Game.Screens.Select
///
/// Half the height of the visible content.
///
- /// This is different from the height of , since
+ /// This is different from the height of .displayableContent, since
/// the beatmap carousel bleeds into the and the
///
///
@@ -452,9 +452,6 @@ namespace osu.Game.Screens.Select
if (!itemsCache.IsValid)
updateItems();
- if (!scrollPositionCache.IsValid)
- updateScrollPosition();
-
// Remove all items that should no longer be on-screen
scrollableContent.RemoveAll(p => p.Y < visibleUpperBound - p.DrawHeight || p.Y > visibleBottomBound || !p.IsPresent);
@@ -519,6 +516,14 @@ namespace osu.Game.Screens.Select
updateItem(p);
}
+ protected override void UpdateAfterChildren()
+ {
+ base.UpdateAfterChildren();
+
+ if (!scrollPositionCache.IsValid)
+ updateScrollPosition();
+ }
+
protected override void Dispose(bool isDisposing)
{
base.Dispose(isDisposing);
@@ -637,8 +642,11 @@ namespace osu.Game.Screens.Select
private void updateScrollPosition()
{
- if (scrollTarget != null) scroll.ScrollTo(scrollTarget.Value);
- scrollPositionCache.Validate();
+ if (scrollTarget != null)
+ {
+ scroll.ScrollTo(scrollTarget.Value);
+ scrollPositionCache.Validate();
+ }
}
///
@@ -677,7 +685,7 @@ namespace osu.Game.Screens.Select
// We are applying a multiplicative alpha (which is internally done by nesting an
// additional container and setting that container's alpha) such that we can
// layer transformations on top, with a similar reasoning to the previous comment.
- p.SetMultiplicativeAlpha(MathHelper.Clamp(1.75f - 1.5f * dist, 0, 1));
+ p.SetMultiplicativeAlpha(Math.Clamp(1.75f - 1.5f * dist, 0, 1));
}
private class CarouselRoot : CarouselGroupEagerSelect
diff --git a/osu.Game/Screens/Select/Details/FailRetryGraph.cs b/osu.Game/Screens/Select/Details/FailRetryGraph.cs
index 34297d89a4..121f8efe5a 100644
--- a/osu.Game/Screens/Select/Details/FailRetryGraph.cs
+++ b/osu.Game/Screens/Select/Details/FailRetryGraph.cs
@@ -1,7 +1,7 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
-using osuTK;
+using System;
using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
@@ -35,7 +35,7 @@ namespace osu.Game.Screens.Select.Details
retryGraph.MaxValue = maxValue;
failGraph.Values = fails.Select(f => (float)f);
- retryGraph.Values = retries.Zip(fails, (retry, fail) => retry + MathHelper.Clamp(fail, 0, maxValue));
+ retryGraph.Values = retries.Zip(fails, (retry, fail) => retry + Math.Clamp(fail, 0, maxValue));
}
}
diff --git a/osu.Game/Screens/Select/SongSelect.cs b/osu.Game/Screens/Select/SongSelect.cs
index 12ae395cea..a52edb70db 100644
--- a/osu.Game/Screens/Select/SongSelect.cs
+++ b/osu.Game/Screens/Select/SongSelect.cs
@@ -46,52 +46,54 @@ namespace osu.Game.Screens.Select
protected const float BACKGROUND_BLUR = 20;
private const float left_area_padding = 20;
- public readonly FilterControl FilterControl;
+ public FilterControl FilterControl { get; private set; }
protected virtual bool ShowFooter => true;
///
/// Can be null if is false.
///
- protected readonly BeatmapOptionsOverlay BeatmapOptions;
+ protected BeatmapOptionsOverlay BeatmapOptions { get; private set; }
///
/// Can be null if is false.
///
- protected readonly Footer Footer;
+ protected Footer Footer { get; private set; }
///
/// Contains any panel which is triggered by a footer button.
/// Helps keep them located beneath the footer itself.
///
- protected readonly Container FooterPanels;
+ protected Container FooterPanels { get; private set; }
protected override BackgroundScreen CreateBackground() => new BackgroundScreenBeatmap(Beatmap.Value);
- protected readonly BeatmapCarousel Carousel;
- private readonly BeatmapInfoWedge beatmapInfoWedge;
+ protected BeatmapCarousel Carousel { get; private set; }
+
+ private BeatmapInfoWedge beatmapInfoWedge;
private DialogOverlay dialogOverlay;
private BeatmapManager beatmaps;
- protected readonly ModSelectOverlay ModSelect;
+ protected ModSelectOverlay ModSelect { get; private set; }
+
+ protected SampleChannel SampleConfirm { get; private set; }
- protected SampleChannel SampleConfirm;
private SampleChannel sampleChangeDifficulty;
private SampleChannel sampleChangeBeatmap;
- protected readonly BeatmapDetailArea BeatmapDetails;
+ protected BeatmapDetailArea BeatmapDetails { get; private set; }
private readonly Bindable decoupledRuleset = new Bindable();
[Resolved(canBeNull: true)]
private MusicController music { get; set; }
- [Cached]
- [Cached(Type = typeof(IBindable>))]
- private readonly Bindable> mods = new Bindable>(Array.Empty()); // Bound to the game's mods, but is not reset on exiting
-
- protected SongSelect()
+ [BackgroundDependencyLoader(true)]
+ private void load(BeatmapManager beatmaps, AudioManager audio, DialogOverlay dialog, OsuColour colours, SkinManager skins, ScoreManager scores)
{
+ // initial value transfer is required for FilterControl (it uses our re-cached bindables in its async load for the initial filter).
+ transferRulesetValue();
+
AddRangeInternal(new Drawable[]
{
new ParallaxContainer
@@ -165,7 +167,7 @@ namespace osu.Game.Screens.Select
{
RelativeSizeAxes = Axes.X,
Height = FilterControl.HEIGHT,
- FilterChanged = c => Carousel.Filter(c),
+ FilterChanged = ApplyFilterToCarousel,
Background = { Width = 2 },
},
}
@@ -215,14 +217,10 @@ namespace osu.Game.Screens.Select
}
BeatmapDetails.Leaderboard.ScoreSelected += score => this.Push(new SoloResults(score));
- }
- [BackgroundDependencyLoader(true)]
- private void load(BeatmapManager beatmaps, AudioManager audio, DialogOverlay dialog, OsuColour colours, SkinManager skins, ScoreManager scores)
- {
if (Footer != null)
{
- Footer.AddButton(new FooterButtonMods { Current = mods }, ModSelect);
+ Footer.AddButton(new FooterButtonMods { Current = Mods }, ModSelect);
Footer.AddButton(new FooterButtonRandom { Action = triggerRandom });
Footer.AddButton(new FooterButtonOptions(), BeatmapOptions);
@@ -262,11 +260,10 @@ namespace osu.Game.Screens.Select
}
}
- protected override void LoadComplete()
+ protected virtual void ApplyFilterToCarousel(FilterCriteria criteria)
{
- base.LoadComplete();
-
- mods.BindTo(Mods);
+ if (this.IsCurrentScreen())
+ Carousel.Filter(criteria);
}
private DependencyContainer dependencies;
@@ -390,7 +387,7 @@ namespace osu.Game.Screens.Select
{
Logger.Log($"ruleset changed from \"{decoupledRuleset.Value}\" to \"{ruleset}\"");
- mods.Value = Array.Empty();
+ Mods.Value = Array.Empty();
decoupledRuleset.Value = ruleset;
// force a filter before attempting to change the beatmap.
@@ -440,6 +437,8 @@ namespace osu.Game.Screens.Select
{
base.OnEntering(last);
+ Carousel.Filter(FilterControl.CreateCriteria(), false);
+
this.FadeInFromZero(250);
FilterControl.Activate();
}
@@ -538,9 +537,6 @@ namespace osu.Game.Screens.Select
if (Beatmap.Value.Track != null)
Beatmap.Value.Track.Looping = false;
- mods.UnbindAll();
- Mods.Value = Array.Empty();
-
return false;
}
@@ -638,7 +634,7 @@ namespace osu.Game.Screens.Select
return;
// manual binding to parent ruleset to allow for delayed load in the incoming direction.
- rulesetNoDebounce = decoupledRuleset.Value = Ruleset.Value;
+ transferRulesetValue();
Ruleset.ValueChanged += r => updateSelectedRuleset(r.NewValue);
decoupledRuleset.ValueChanged += r => Ruleset.Value = r.NewValue;
@@ -650,6 +646,11 @@ namespace osu.Game.Screens.Select
boundLocalBindables = true;
}
+ private void transferRulesetValue()
+ {
+ rulesetNoDebounce = decoupledRuleset.Value = Ruleset.Value;
+ }
+
private void delete(BeatmapSetInfo beatmap)
{
if (beatmap == null || beatmap.ID <= 0) return;
diff --git a/osu.Game/Screens/StartupScreen.cs b/osu.Game/Screens/StartupScreen.cs
index 797f185a37..c3e36c8e9d 100644
--- a/osu.Game/Screens/StartupScreen.cs
+++ b/osu.Game/Screens/StartupScreen.cs
@@ -16,6 +16,8 @@ namespace osu.Game.Screens
public override bool CursorVisible => false;
+ public override bool AllowRateAdjustments => false;
+
public override OverlayActivation InitialOverlayActivationMode => OverlayActivation.Disabled;
}
}
diff --git a/osu.Game/Tests/Visual/OsuTestScene.cs b/osu.Game/Tests/Visual/OsuTestScene.cs
index 345fff90aa..13e08c7d22 100644
--- a/osu.Game/Tests/Visual/OsuTestScene.cs
+++ b/osu.Game/Tests/Visual/OsuTestScene.cs
@@ -22,7 +22,6 @@ using osu.Game.Online.API;
using osu.Game.Rulesets;
using osu.Game.Rulesets.Mods;
using osu.Game.Tests.Beatmaps;
-using osuTK;
namespace osu.Game.Tests.Visual
{
@@ -250,7 +249,7 @@ namespace osu.Game.Tests.Visual
public override bool Seek(double seek)
{
- offset = MathHelper.Clamp(seek, 0, Length);
+ offset = Math.Clamp(seek, 0, Length);
lastReferenceTime = null;
return offset == seek;
diff --git a/osu.Game/Utils/RavenLogger.cs b/osu.Game/Utils/SentryLogger.cs
similarity index 72%
rename from osu.Game/Utils/RavenLogger.cs
rename to osu.Game/Utils/SentryLogger.cs
index 16178e63bd..981251784e 100644
--- a/osu.Game/Utils/RavenLogger.cs
+++ b/osu.Game/Utils/SentryLogger.cs
@@ -2,31 +2,34 @@
// See the LICENCE file in the repository root for full licence text.
using System;
-using System.Collections.Generic;
using System.IO;
using System.Net;
-using System.Threading.Tasks;
using osu.Framework.Logging;
-using SharpRaven;
-using SharpRaven.Data;
+using Sentry;
namespace osu.Game.Utils
{
///
/// Report errors to sentry.
///
- public class RavenLogger : IDisposable
+ public class SentryLogger : IDisposable
{
- private readonly RavenClient raven = new RavenClient("https://5e342cd55f294edebdc9ad604d28bbd3@sentry.io/1255255");
+ private SentryClient sentry;
+ private Scope sentryScope;
- private readonly List tasks = new List();
-
- public RavenLogger(OsuGame game)
+ public SentryLogger(OsuGame game)
{
- raven.Release = game.Version;
-
if (!game.IsDeployedBuild) return;
+ var options = new SentryOptions
+ {
+ Dsn = new Dsn("https://5e342cd55f294edebdc9ad604d28bbd3@sentry.io/1255255"),
+ Release = game.Version
+ };
+
+ sentry = new SentryClient(options);
+ sentryScope = new Scope(options);
+
Exception lastException = null;
Logger.NewEntry += entry =>
@@ -46,10 +49,10 @@ namespace osu.Game.Utils
return;
lastException = exception;
- queuePendingTask(raven.CaptureAsync(new SentryEvent(exception) { Message = entry.Message }));
+ sentry.CaptureEvent(new SentryEvent(exception) { Message = entry.Message }, sentryScope);
}
else
- raven.AddTrail(new Breadcrumb(entry.Target.ToString(), BreadcrumbType.Navigation) { Message = entry.Message });
+ sentryScope.AddBreadcrumb(DateTimeOffset.Now, entry.Message, entry.Target.ToString(), "navigation");
};
}
@@ -81,19 +84,9 @@ namespace osu.Game.Utils
return true;
}
- private void queuePendingTask(Task task)
- {
- lock (tasks) tasks.Add(task);
- task.ContinueWith(_ =>
- {
- lock (tasks)
- tasks.Remove(task);
- });
- }
-
#region Disposal
- ~RavenLogger()
+ ~SentryLogger()
{
Dispose(false);
}
@@ -112,7 +105,9 @@ namespace osu.Game.Utils
return;
isDisposed = true;
- lock (tasks) Task.WaitAll(tasks.ToArray(), 5000);
+ sentry?.Dispose();
+ sentry = null;
+ sentryScope = null;
}
#endregion
diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj
index af60da3e70..28ef7d3d92 100644
--- a/osu.Game/osu.Game.csproj
+++ b/osu.Game/osu.Game.csproj
@@ -1,6 +1,6 @@
- netstandard2.0
+ netstandard2.1
Library
true
@@ -21,10 +21,10 @@
-
+
+
-
diff --git a/osu.iOS.props b/osu.iOS.props
index 8124357312..364b0b2c78 100644
--- a/osu.iOS.props
+++ b/osu.iOS.props
@@ -73,6 +73,19 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+