1
0
mirror of https://github.com/ppy/osu.git synced 2025-01-12 13:33:52 +08:00

Refactor KeyBindingStore to clean up any excess bindings for individual actions

While this isn't strictly required (outside of rulesets, potentially),
I think it's best that we keep these counts in a sane state.

Right now, it will remove any excess. Arguably, in the case an entry is
found with too many, we should wipe all entries and re-populate the
defaults. Interested in opinions on that before merging. See
https://github.com/ppy/osu/discussions/15925 for an example where wiping
may be the more appropriate behaviour.
This commit is contained in:
Dean Herbert 2021-12-13 15:26:49 +09:00
parent 4cac87e933
commit 7318ff3f98

View File

@ -81,20 +81,37 @@ namespace osu.Game.Input
// compare counts in database vs defaults for each action type. // compare counts in database vs defaults for each action type.
foreach (var defaultsForAction in defaults.GroupBy(k => k.Action)) foreach (var defaultsForAction in defaults.GroupBy(k => k.Action))
{ {
// avoid performing redundant queries when the database is empty and needs to be re-filled. IEnumerable<RealmKeyBinding> existing = existingBindings.Where(k =>
int existingCount = existingBindings.Count(k => k.RulesetName == rulesetName && k.Variant == variant && k.ActionInt == (int)defaultsForAction.Key); k.RulesetName == rulesetName
&& k.Variant == variant
&& k.ActionInt == (int)defaultsForAction.Key);
if (defaultsForAction.Count() <= existingCount) int defaultsCount = defaultsForAction.Count();
continue; int existingCount = existing.Count();
// insert any defaults which are missing. if (defaultsCount > existingCount)
realm.Add(defaultsForAction.Skip(existingCount).Select(k => new RealmKeyBinding
{ {
KeyCombinationString = k.KeyCombination.ToString(), // insert any defaults which are missing.
ActionInt = (int)k.Action, realm.Add(defaultsForAction.Skip(existingCount).Select(k => new RealmKeyBinding
RulesetName = rulesetName, {
Variant = variant KeyCombinationString = k.KeyCombination.ToString(),
})); ActionInt = (int)k.Action,
RulesetName = rulesetName,
Variant = variant
}));
}
else if (defaultsCount < existingCount)
{
// generally this shouldn't happen, but if the user has more key bindings for an action than we expect,
// remove the last entries until the count matches for sanity.
foreach (var k in existing.TakeLast(existingCount - defaultsCount).ToArray())
{
realm.Remove(k);
// Remove from the local flattened/cached list so future lookups don't query now deleted rows.
existingBindings.Remove(k);
}
}
} }
} }