diff --git a/osu.Game.Rulesets.Mania/Edit/Blueprints/HoldNotePlacementBlueprint.cs b/osu.Game.Rulesets.Mania/Edit/Blueprints/HoldNotePlacementBlueprint.cs
index b3dd392202..c63e30e98a 100644
--- a/osu.Game.Rulesets.Mania/Edit/Blueprints/HoldNotePlacementBlueprint.cs
+++ b/osu.Game.Rulesets.Mania/Edit/Blueprints/HoldNotePlacementBlueprint.cs
@@ -7,6 +7,7 @@ using osu.Framework.Input.Events;
using osu.Game.Rulesets.Mania.Edit.Blueprints.Components;
using osu.Game.Rulesets.Mania.Objects;
using osuTK;
+using osuTK.Input;
namespace osu.Game.Rulesets.Mania.Edit.Blueprints
{
@@ -49,6 +50,9 @@ namespace osu.Game.Rulesets.Mania.Edit.Blueprints
protected override void OnMouseUp(MouseUpEvent e)
{
+ if (e.Button != MouseButton.Left)
+ return;
+
base.OnMouseUp(e);
EndPlacement(true);
}
diff --git a/osu.Game.Rulesets.Mania/Edit/Blueprints/ManiaPlacementBlueprint.cs b/osu.Game.Rulesets.Mania/Edit/Blueprints/ManiaPlacementBlueprint.cs
index 400abb6380..3fb03d642f 100644
--- a/osu.Game.Rulesets.Mania/Edit/Blueprints/ManiaPlacementBlueprint.cs
+++ b/osu.Game.Rulesets.Mania/Edit/Blueprints/ManiaPlacementBlueprint.cs
@@ -11,6 +11,7 @@ using osu.Game.Rulesets.Mania.Objects.Drawables.Pieces;
using osu.Game.Rulesets.Mania.UI;
using osu.Game.Rulesets.UI.Scrolling;
using osuTK;
+using osuTK.Input;
namespace osu.Game.Rulesets.Mania.Edit.Blueprints
{
@@ -46,6 +47,9 @@ namespace osu.Game.Rulesets.Mania.Edit.Blueprints
protected override bool OnMouseDown(MouseDownEvent e)
{
+ if (e.Button != MouseButton.Left)
+ return false;
+
if (Column == null)
return base.OnMouseDown(e);
diff --git a/osu.Game.Rulesets.Mania/Edit/Blueprints/NotePlacementBlueprint.cs b/osu.Game.Rulesets.Mania/Edit/Blueprints/NotePlacementBlueprint.cs
index 2b7b383dbe..a4c0791253 100644
--- a/osu.Game.Rulesets.Mania/Edit/Blueprints/NotePlacementBlueprint.cs
+++ b/osu.Game.Rulesets.Mania/Edit/Blueprints/NotePlacementBlueprint.cs
@@ -5,6 +5,7 @@ using osu.Framework.Graphics;
using osu.Framework.Input.Events;
using osu.Game.Rulesets.Mania.Edit.Blueprints.Components;
using osu.Game.Rulesets.Mania.Objects;
+using osuTK.Input;
namespace osu.Game.Rulesets.Mania.Edit.Blueprints
{
@@ -30,6 +31,9 @@ namespace osu.Game.Rulesets.Mania.Edit.Blueprints
protected override bool OnMouseDown(MouseDownEvent e)
{
+ if (e.Button != MouseButton.Left)
+ return false;
+
base.OnMouseDown(e);
// Place the note immediately.
diff --git a/osu.Game/IO/Serialization/Converters/TypedListConverter.cs b/osu.Game/IO/Serialization/Converters/TypedListConverter.cs
index 64f1ebeb1a..f98fa05821 100644
--- a/osu.Game/IO/Serialization/Converters/TypedListConverter.cs
+++ b/osu.Game/IO/Serialization/Converters/TypedListConverter.cs
@@ -9,12 +9,12 @@ using Newtonsoft.Json.Linq;
namespace osu.Game.IO.Serialization.Converters
{
///
- /// A type of that serializes a alongside
+ /// A type of that serializes an alongside
/// a lookup table for the types contained. The lookup table is used in deserialization to
/// reconstruct the objects with their original types.
///
- /// The type of objects contained in the this attribute is attached to.
- public class TypedListConverter : JsonConverter
+ /// The type of objects contained in the this attribute is attached to.
+ public class TypedListConverter : JsonConverter>
{
private readonly bool requiresTypeVersion;
@@ -36,9 +36,7 @@ namespace osu.Game.IO.Serialization.Converters
this.requiresTypeVersion = requiresTypeVersion;
}
- public override bool CanConvert(Type objectType) => objectType == typeof(List);
-
- public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
+ public override IReadOnlyList ReadJson(JsonReader reader, Type objectType, IReadOnlyList existingValue, bool hasExistingValue, JsonSerializer serializer)
{
var list = new List();
@@ -59,14 +57,12 @@ namespace osu.Game.IO.Serialization.Converters
return list;
}
- public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
+ public override void WriteJson(JsonWriter writer, IReadOnlyList value, JsonSerializer serializer)
{
- var list = (IEnumerable)value;
-
var lookupTable = new List();
var objects = new List();
- foreach (var item in list)
+ foreach (var item in value)
{
var type = item.GetType();
var assemblyName = type.Assembly.GetName();
diff --git a/osu.Game/IO/Serialization/Converters/Vector2Converter.cs b/osu.Game/IO/Serialization/Converters/Vector2Converter.cs
index bf5edeef94..46447b607b 100644
--- a/osu.Game/IO/Serialization/Converters/Vector2Converter.cs
+++ b/osu.Game/IO/Serialization/Converters/Vector2Converter.cs
@@ -11,26 +11,22 @@ namespace osu.Game.IO.Serialization.Converters
///
/// A type of that serializes only the X and Y coordinates of a .
///
- public class Vector2Converter : JsonConverter
+ public class Vector2Converter : JsonConverter
{
- public override bool CanConvert(Type objectType) => objectType == typeof(Vector2);
-
- public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
+ public override Vector2 ReadJson(JsonReader reader, Type objectType, Vector2 existingValue, bool hasExistingValue, JsonSerializer serializer)
{
var obj = JObject.Load(reader);
return new Vector2((float)obj["x"], (float)obj["y"]);
}
- public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
+ public override void WriteJson(JsonWriter writer, Vector2 value, JsonSerializer serializer)
{
- var vector = (Vector2)value;
-
writer.WriteStartObject();
writer.WritePropertyName("x");
- writer.WriteValue(vector.X);
+ writer.WriteValue(value.X);
writer.WritePropertyName("y");
- writer.WriteValue(vector.Y);
+ writer.WriteValue(value.Y);
writer.WriteEndObject();
}
diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs
index 3caffb6db5..7ecd7851d7 100644
--- a/osu.Game/OsuGame.cs
+++ b/osu.Game/OsuGame.cs
@@ -91,7 +91,7 @@ namespace osu.Game
protected BackButton BackButton;
- protected SettingsPanel Settings;
+ protected SettingsOverlay Settings;
private VolumeOverlay volume;
private OsuLogo osuLogo;
@@ -767,13 +767,20 @@ namespace osu.Game
private Task asyncLoadStream;
- private T loadComponentSingleFile(T d, Action add, bool cache = false)
+ ///
+ /// Queues loading the provided component in sequential fashion.
+ /// This operation is limited to a single thread to avoid saturating all cores.
+ ///
+ /// The component to load.
+ /// An action to invoke on load completion (generally to add the component to the hierarchy).
+ /// Whether to cache the component as type into the game dependencies before any scheduling.
+ private T loadComponentSingleFile(T component, Action loadCompleteAction, bool cache = false)
where T : Drawable
{
if (cache)
- dependencies.Cache(d);
+ dependencies.CacheAs(component);
- if (d is OverlayContainer overlay)
+ if (component is OverlayContainer overlay)
overlays.Add(overlay);
// schedule is here to ensure that all component loads are done after LoadComplete is run (and thus all dependencies are cached).
@@ -791,12 +798,12 @@ namespace osu.Game
try
{
- Logger.Log($"Loading {d}...", level: LogLevel.Debug);
+ Logger.Log($"Loading {component}...", level: LogLevel.Debug);
// Since this is running in a separate thread, it is possible for OsuGame to be disposed after LoadComponentAsync has been called
// throwing an exception. To avoid this, the call is scheduled on the update thread, which does not run if IsDisposed = true
Task task = null;
- var del = new ScheduledDelegate(() => task = LoadComponentAsync(d, add));
+ var del = new ScheduledDelegate(() => task = LoadComponentAsync(component, loadCompleteAction));
Scheduler.Add(del);
// The delegate won't complete if OsuGame has been disposed in the meantime
@@ -811,7 +818,7 @@ namespace osu.Game
await task;
- Logger.Log($"Loaded {d}!", level: LogLevel.Debug);
+ Logger.Log($"Loaded {component}!", level: LogLevel.Debug);
}
catch (OperationCanceledException)
{
@@ -819,7 +826,7 @@ namespace osu.Game
});
});
- return d;
+ return component;
}
protected override bool OnScroll(ScrollEvent e)