From 89291e8197e5dff0f19b23d6941d20010bdd4b22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Thu, 12 Oct 2023 14:51:19 +0200 Subject: [PATCH] Refactor key binding panel leveraging new helper methods --- .../Input/GlobalKeyBindingsSection.cs | 96 +++---------------- .../Input/GlobalKeyBindingsSubsection.cs | 36 +++++++ .../Sections/Input/KeyBindingPanel.cs | 5 +- .../Sections/Input/KeyBindingsSubsection.cs | 38 ++++---- .../Sections/Input/RulesetBindingsSection.cs | 5 + .../Input/VariantBindingsSubsection.cs | 26 ++++- 6 files changed, 98 insertions(+), 108 deletions(-) create mode 100644 osu.Game/Overlays/Settings/Sections/Input/GlobalKeyBindingsSubsection.cs diff --git a/osu.Game/Overlays/Settings/Sections/Input/GlobalKeyBindingsSection.cs b/osu.Game/Overlays/Settings/Sections/Input/GlobalKeyBindingsSection.cs index c1e7cf160f75..5a05d7890581 100644 --- a/osu.Game/Overlays/Settings/Sections/Input/GlobalKeyBindingsSection.cs +++ b/osu.Game/Overlays/Settings/Sections/Input/GlobalKeyBindingsSection.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 osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Sprites; using osu.Framework.Localisation; @@ -18,92 +19,19 @@ public partial class GlobalKeyBindingsSection : SettingsSection public override LocalisableString Header => InputSettingsStrings.GlobalKeyBindingHeader; - public GlobalKeyBindingsSection(GlobalActionContainer manager) + [BackgroundDependencyLoader] + private void load() { - Add(new DefaultBindingsSubsection(manager)); - Add(new OverlayBindingsSubsection(manager)); - Add(new AudioControlKeyBindingsSubsection(manager)); - Add(new SongSelectKeyBindingSubsection(manager)); - Add(new InGameKeyBindingsSubsection(manager)); - Add(new ReplayKeyBindingsSubsection(manager)); - Add(new EditorKeyBindingsSubsection(manager)); - } - - private partial class DefaultBindingsSubsection : KeyBindingsSubsection - { - protected override LocalisableString Header => string.Empty; - - public DefaultBindingsSubsection(GlobalActionContainer manager) - : base(null) - { - Defaults = GlobalActionContainer.GlobalKeyBindings; - } - } - - private partial class OverlayBindingsSubsection : KeyBindingsSubsection - { - protected override LocalisableString Header => InputSettingsStrings.OverlaysSection; - - public OverlayBindingsSubsection(GlobalActionContainer manager) - : base(null) - { - Defaults = GlobalActionContainer.OverlayKeyBindings; - } - } - - private partial class SongSelectKeyBindingSubsection : KeyBindingsSubsection - { - protected override LocalisableString Header => InputSettingsStrings.SongSelectSection; - - public SongSelectKeyBindingSubsection(GlobalActionContainer manager) - : base(null) - { - Defaults = GlobalActionContainer.SongSelectKeyBindings; - } - } - - private partial class InGameKeyBindingsSubsection : KeyBindingsSubsection - { - protected override LocalisableString Header => InputSettingsStrings.InGameSection; - - public InGameKeyBindingsSubsection(GlobalActionContainer manager) - : base(null) - { - Defaults = GlobalActionContainer.InGameKeyBindings; - } - } - - private partial class ReplayKeyBindingsSubsection : KeyBindingsSubsection - { - protected override LocalisableString Header => InputSettingsStrings.ReplaySection; - - public ReplayKeyBindingsSubsection(GlobalActionContainer manager) - : base(null) - { - Defaults = GlobalActionContainer.ReplayKeyBindings; - } - } - - private partial class AudioControlKeyBindingsSubsection : KeyBindingsSubsection - { - protected override LocalisableString Header => InputSettingsStrings.AudioSection; - - public AudioControlKeyBindingsSubsection(GlobalActionContainer manager) - : base(null) - { - Defaults = GlobalActionContainer.AudioControlKeyBindings; - } - } - - private partial class EditorKeyBindingsSubsection : KeyBindingsSubsection - { - protected override LocalisableString Header => InputSettingsStrings.EditorSection; - - public EditorKeyBindingsSubsection(GlobalActionContainer manager) - : base(null) + AddRange(new[] { - Defaults = GlobalActionContainer.EditorKeyBindings; - } + new GlobalKeyBindingsSubsection(string.Empty, GlobalActionCategory.General), + new GlobalKeyBindingsSubsection(InputSettingsStrings.OverlaysSection, GlobalActionCategory.Overlays), + new GlobalKeyBindingsSubsection(InputSettingsStrings.AudioSection, GlobalActionCategory.AudioControl), + new GlobalKeyBindingsSubsection(InputSettingsStrings.SongSelectSection, GlobalActionCategory.SongSelect), + new GlobalKeyBindingsSubsection(InputSettingsStrings.InGameSection, GlobalActionCategory.InGame), + new GlobalKeyBindingsSubsection(InputSettingsStrings.ReplaySection, GlobalActionCategory.Replay), + new GlobalKeyBindingsSubsection(InputSettingsStrings.EditorSection, GlobalActionCategory.Editor), + }); } } } diff --git a/osu.Game/Overlays/Settings/Sections/Input/GlobalKeyBindingsSubsection.cs b/osu.Game/Overlays/Settings/Sections/Input/GlobalKeyBindingsSubsection.cs new file mode 100644 index 000000000000..2e42e46330f2 --- /dev/null +++ b/osu.Game/Overlays/Settings/Sections/Input/GlobalKeyBindingsSubsection.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.Collections.Generic; +using System.Linq; +using osu.Framework.Localisation; +using osu.Game.Database; +using osu.Game.Input.Bindings; +using Realms; + +namespace osu.Game.Overlays.Settings.Sections.Input +{ + public partial class GlobalKeyBindingsSubsection : KeyBindingsSubsection + { + protected override LocalisableString Header { get; } + + private readonly GlobalActionCategory category; + + public GlobalKeyBindingsSubsection(LocalisableString header, GlobalActionCategory category) + { + Header = header; + this.category = category; + Defaults = GlobalActionContainer.GetDefaultBindingsFor(category); + } + + protected override IEnumerable GetKeyBindings(Realm realm) + { + var bindings = realm.All() + .Where(b => b.RulesetName == null && b.Variant == null) + .Detach(); + + var actionsInSection = GlobalActionContainer.GetGlobalActionsFor(category).Cast().ToHashSet(); + return bindings.Where(kb => actionsInSection.Contains(kb.ActionInt)); + } + } +} diff --git a/osu.Game/Overlays/Settings/Sections/Input/KeyBindingPanel.cs b/osu.Game/Overlays/Settings/Sections/Input/KeyBindingPanel.cs index 7296003c7f33..4c5610a15e13 100644 --- a/osu.Game/Overlays/Settings/Sections/Input/KeyBindingPanel.cs +++ b/osu.Game/Overlays/Settings/Sections/Input/KeyBindingPanel.cs @@ -3,7 +3,6 @@ using osu.Framework.Allocation; using osu.Framework.Graphics; -using osu.Game.Input.Bindings; using osu.Game.Localisation; using osu.Game.Rulesets; @@ -14,9 +13,9 @@ public partial class KeyBindingPanel : SettingsSubPanel protected override Drawable CreateHeader() => new SettingsHeader(InputSettingsStrings.KeyBindingPanelHeader, InputSettingsStrings.KeyBindingPanelDescription); [BackgroundDependencyLoader(permitNulls: true)] - private void load(RulesetStore rulesets, GlobalActionContainer global) + private void load(RulesetStore rulesets) { - AddSection(new GlobalKeyBindingsSection(global)); + AddSection(new GlobalKeyBindingsSection()); foreach (var ruleset in rulesets.AvailableRulesets) AddSection(new RulesetBindingsSection(ruleset)); diff --git a/osu.Game/Overlays/Settings/Sections/Input/KeyBindingsSubsection.cs b/osu.Game/Overlays/Settings/Sections/Input/KeyBindingsSubsection.cs index 8285204bb3fd..c254e06bcbf8 100644 --- a/osu.Game/Overlays/Settings/Sections/Input/KeyBindingsSubsection.cs +++ b/osu.Game/Overlays/Settings/Sections/Input/KeyBindingsSubsection.cs @@ -11,9 +11,9 @@ using osu.Framework.Localisation; using osu.Game.Database; using osu.Game.Input.Bindings; -using osu.Game.Rulesets; using osu.Game.Localisation; using osuTK; +using Realms; namespace osu.Game.Overlays.Settings.Sections.Input { @@ -27,37 +27,25 @@ public abstract partial class KeyBindingsSubsection : SettingsSubsection protected IEnumerable Defaults { get; init; } = Array.Empty(); - public RulesetInfo? Ruleset { get; protected set; } - - private readonly int? variant; - - protected KeyBindingsSubsection(int? variant) + protected KeyBindingsSubsection() { - this.variant = variant; - FlowContent.Spacing = new Vector2(0, 3); } [BackgroundDependencyLoader] private void load(RealmAccess realm) { - string? rulesetName = Ruleset?.ShortName; - - var bindings = realm.Run(r => r.All() - .Where(b => b.RulesetName == rulesetName && b.Variant == variant) - .Detach()); + var bindings = realm.Run(r => GetKeyBindings(r).Detach()); foreach (var defaultGroup in Defaults.GroupBy(d => d.Action)) { int intKey = (int)defaultGroup.Key; // one row per valid action. - Add(new KeyBindingRow(defaultGroup.Key, bindings.Where(b => b.ActionInt.Equals(intKey)).ToList()) - { - AllowMainMouseButtons = Ruleset != null, - Defaults = defaultGroup.Select(d => d.KeyCombination), - BindingUpdated = onBindingUpdated - }); + Add(CreateKeyBindingRow( + defaultGroup.Key, + bindings.Where(b => b.ActionInt.Equals(intKey)).ToList(), + defaultGroup)); } Add(new ResetButton @@ -66,7 +54,17 @@ private void load(RealmAccess realm) }); } - private void onBindingUpdated(KeyBindingRow sender) + protected abstract IEnumerable GetKeyBindings(Realm realm); + + protected virtual KeyBindingRow CreateKeyBindingRow(object action, IEnumerable keyBindings, IEnumerable defaults) + => new KeyBindingRow(action, keyBindings.ToList()) + { + AllowMainMouseButtons = false, + Defaults = defaults.Select(d => d.KeyCombination), + BindingUpdated = OnBindingUpdated + }; + + protected void OnBindingUpdated(KeyBindingRow sender) { if (AutoAdvanceTarget) { diff --git a/osu.Game/Overlays/Settings/Sections/Input/RulesetBindingsSection.cs b/osu.Game/Overlays/Settings/Sections/Input/RulesetBindingsSection.cs index 3b5002b423cf..f3265920164d 100644 --- a/osu.Game/Overlays/Settings/Sections/Input/RulesetBindingsSection.cs +++ b/osu.Game/Overlays/Settings/Sections/Input/RulesetBindingsSection.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 osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Localisation; using osu.Game.Rulesets; @@ -18,7 +19,11 @@ public partial class RulesetBindingsSection : SettingsSection public RulesetBindingsSection(RulesetInfo ruleset) { this.ruleset = ruleset; + } + [BackgroundDependencyLoader] + private void load() + { var r = ruleset.CreateInstance(); foreach (int variant in r.AvailableVariants) diff --git a/osu.Game/Overlays/Settings/Sections/Input/VariantBindingsSubsection.cs b/osu.Game/Overlays/Settings/Sections/Input/VariantBindingsSubsection.cs index d00de7f549e0..2b26ac1f12f5 100644 --- a/osu.Game/Overlays/Settings/Sections/Input/VariantBindingsSubsection.cs +++ b/osu.Game/Overlays/Settings/Sections/Input/VariantBindingsSubsection.cs @@ -1,8 +1,13 @@ // 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.Input.Bindings; using osu.Framework.Localisation; +using osu.Game.Input.Bindings; using osu.Game.Rulesets; +using Realms; namespace osu.Game.Overlays.Settings.Sections.Input { @@ -12,15 +17,34 @@ public partial class VariantBindingsSubsection : KeyBindingsSubsection protected override LocalisableString Header { get; } + public RulesetInfo Ruleset { get; } + private readonly int variant; + public VariantBindingsSubsection(RulesetInfo ruleset, int variant) - : base(variant) { Ruleset = ruleset; + this.variant = variant; var rulesetInstance = ruleset.CreateInstance(); Header = rulesetInstance.GetVariantName(variant); Defaults = rulesetInstance.GetDefaultKeyBindings(variant); } + + protected override IEnumerable GetKeyBindings(Realm realm) + { + string rulesetName = Ruleset.ShortName; + + return realm.All() + .Where(b => b.RulesetName == rulesetName && b.Variant == variant); + } + + protected override KeyBindingRow CreateKeyBindingRow(object action, IEnumerable keyBindings, IEnumerable defaults) + => new KeyBindingRow(action, keyBindings.ToList()) + { + AllowMainMouseButtons = true, + Defaults = defaults.Select(d => d.KeyCombination), + BindingUpdated = OnBindingUpdated + }; } }