diff --git a/osu.Game.Tests/Database/TestRealmKeyBindingStore.cs b/osu.Game.Tests/Database/TestRealmKeyBindingStore.cs
index 691c55c601..426593f5de 100644
--- a/osu.Game.Tests/Database/TestRealmKeyBindingStore.cs
+++ b/osu.Game.Tests/Database/TestRealmKeyBindingStore.cs
@@ -62,7 +62,12 @@ namespace osu.Game.Tests.Database
Assert.That(((IKeyBinding)backBinding).KeyCombination.Keys, Is.EquivalentTo(new[] { InputKey.Escape }));
- keyBindingStore.Update(backBinding, binding => binding.KeyCombination = new KeyCombination(InputKey.BackSpace));
+ var binding = backBinding;
+
+ realmContextFactory.Context.Write(() =>
+ {
+ ((IKeyBinding)binding).KeyCombination = new KeyCombination(InputKey.BackSpace);
+ });
Assert.That(((IKeyBinding)backBinding).KeyCombination.Keys, Is.EquivalentTo(new[] { InputKey.BackSpace }));
diff --git a/osu.Game/Input/RealmKeyBindingStore.cs b/osu.Game/Input/RealmKeyBindingStore.cs
index dd487af9bc..478f4792f8 100644
--- a/osu.Game/Input/RealmKeyBindingStore.cs
+++ b/osu.Game/Input/RealmKeyBindingStore.cs
@@ -59,32 +59,6 @@ namespace osu.Game.Input
}
}
- ///
- /// Update the database mapping for the provided key binding.
- ///
- /// The key binding to update. Can be detached from the database.
- /// The modification to apply to the key binding.
- public void Update(IHasGuidPrimaryKey keyBinding, Action modification)
- {
- // the incoming instance could already be a live access object.
- Live? realmBinding = keyBinding as Live;
-
- using (var realm = RealmFactory.GetForWrite())
- {
- if (realmBinding == null)
- {
- // the incoming instance could be a raw realm object.
- if (!(keyBinding is RealmKeyBinding rkb))
- // if neither of the above cases succeeded, retrieve a realm object for further processing.
- rkb = realm.Context.Find(keyBinding.ID);
-
- realmBinding = new Live(rkb, RealmFactory);
- }
-
- realmBinding.PerformUpdate(modification);
- }
- }
-
private void insertDefaults(IEnumerable defaults, int? rulesetId = null, int? variant = null)
{
using (var usage = RealmFactory.GetForWrite())
diff --git a/osu.Game/Overlays/KeyBinding/KeyBindingRow.cs b/osu.Game/Overlays/KeyBinding/KeyBindingRow.cs
index 0a065c9dbc..f73d92f5c2 100644
--- a/osu.Game/Overlays/KeyBinding/KeyBindingRow.cs
+++ b/osu.Game/Overlays/KeyBinding/KeyBindingRow.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.Allocation;
@@ -16,7 +17,7 @@ using osu.Game.Database;
using osu.Game.Graphics;
using osu.Game.Graphics.Sprites;
using osu.Game.Graphics.UserInterface;
-using osu.Game.Input;
+using osu.Game.Input.Bindings;
using osuTK;
using osuTK.Graphics;
using osuTK.Input;
@@ -26,7 +27,7 @@ namespace osu.Game.Overlays.KeyBinding
public class KeyBindingRow : Container, IFilterable
{
private readonly object action;
- private readonly IEnumerable bindings;
+ private readonly IEnumerable bindings;
private const float transition_time = 150;
@@ -52,9 +53,9 @@ namespace osu.Game.Overlays.KeyBinding
private FillFlowContainer cancelAndClearButtons;
private FillFlowContainer buttons;
- public IEnumerable FilterTerms => bindings.Select(b => b.KeyCombination.ReadableString()).Prepend((string)text.Text);
+ public IEnumerable FilterTerms => bindings.Select(b => ((IKeyBinding)b).KeyCombination.ReadableString()).Prepend((string)text.Text);
- public KeyBindingRow(object action, IEnumerable bindings)
+ public KeyBindingRow(object action, List bindings)
{
this.action = action;
this.bindings = bindings;
@@ -67,7 +68,7 @@ namespace osu.Game.Overlays.KeyBinding
}
[Resolved]
- private RealmKeyBindingStore store { get; set; }
+ private RealmContextFactory realmFactory { get; set; }
[BackgroundDependencyLoader]
private void load(OsuColour colours)
@@ -127,7 +128,12 @@ namespace osu.Game.Overlays.KeyBinding
{
var button = buttons[i++];
button.UpdateKeyCombination(d);
- store.Update((IHasGuidPrimaryKey)button.KeyBinding, k => k.KeyCombination = button.KeyBinding.KeyCombination);
+
+ using (var write = realmFactory.GetForWrite())
+ {
+ var binding = write.Context.Find(((IHasGuidPrimaryKey)button.KeyBinding).ID);
+ binding.KeyCombination = button.KeyBinding.KeyCombination;
+ }
}
}
@@ -286,7 +292,11 @@ namespace osu.Game.Overlays.KeyBinding
{
if (bindTarget != null)
{
- store.Update((IHasGuidPrimaryKey)bindTarget.KeyBinding, k => k.KeyCombination = bindTarget.KeyBinding.KeyCombination);
+ using (var write = realmFactory.GetForWrite())
+ {
+ var binding = write.Context.Find(((IHasGuidPrimaryKey)bindTarget.KeyBinding).ID);
+ binding.KeyCombination = bindTarget.KeyBinding.KeyCombination;
+ }
bindTarget.IsBinding = false;
Schedule(() =>
@@ -360,7 +370,7 @@ namespace osu.Game.Overlays.KeyBinding
public class KeyButton : Container
{
- public readonly IKeyBinding KeyBinding;
+ public readonly RealmKeyBinding KeyBinding;
private readonly Box box;
public readonly OsuSpriteText Text;
@@ -382,8 +392,11 @@ namespace osu.Game.Overlays.KeyBinding
}
}
- public KeyButton(IKeyBinding keyBinding)
+ public KeyButton(RealmKeyBinding keyBinding)
{
+ if (keyBinding.IsManaged)
+ throw new ArgumentException("Key binding should not be attached as we make temporary changes", nameof(keyBinding));
+
KeyBinding = keyBinding;
Margin = new MarginPadding(padding);
@@ -416,7 +429,7 @@ namespace osu.Game.Overlays.KeyBinding
Margin = new MarginPadding(5),
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
- Text = keyBinding.KeyCombination.ReadableString(),
+ Text = ((IKeyBinding)keyBinding).KeyCombination.ReadableString(),
},
};
}
@@ -455,8 +468,10 @@ namespace osu.Game.Overlays.KeyBinding
public void UpdateKeyCombination(KeyCombination newCombination)
{
- KeyBinding.KeyCombination = newCombination;
- Text.Text = KeyBinding.KeyCombination.ReadableString();
+ var keyBinding = (IKeyBinding)KeyBinding;
+
+ keyBinding.KeyCombination = newCombination;
+ Text.Text = keyBinding.KeyCombination.ReadableString();
}
}
}
diff --git a/osu.Game/Overlays/KeyBinding/KeyBindingsSubsection.cs b/osu.Game/Overlays/KeyBinding/KeyBindingsSubsection.cs
index 0f95d07da8..a23f22cf57 100644
--- a/osu.Game/Overlays/KeyBinding/KeyBindingsSubsection.cs
+++ b/osu.Game/Overlays/KeyBinding/KeyBindingsSubsection.cs
@@ -46,7 +46,7 @@ namespace osu.Game.Overlays.KeyBinding
int intKey = (int)defaultGroup.Key;
// one row per valid action.
- Add(new KeyBindingRow(defaultGroup.Key, bindings.Where(b => b.Action.Equals(intKey)))
+ Add(new KeyBindingRow(defaultGroup.Key, bindings.Where(b => b.Action.Equals(intKey)).ToList())
{
AllowMainMouseButtons = Ruleset != null,
Defaults = defaultGroup.Select(d => d.KeyCombination)