mirror of
https://github.com/ppy/osu.git
synced 2025-01-12 17:23:22 +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:
parent
4cac87e933
commit
7318ff3f98
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user