diff --git a/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs b/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs index 868f4b143c..7af675cc6a 100644 --- a/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs +++ b/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs @@ -161,11 +161,19 @@ namespace osu.Game.Rulesets.Mania.UI judgements.Scale = Scale; } + private Bindable scrollTime; + [BackgroundDependencyLoader] private void load(OsuColour colours, ManiaConfigManager maniaConfig) { maniaConfig.BindWith(ManiaSetting.ScrollTime, VisibleTimeRange); + // Todo: The following two lines shouldn't be required, but is an effect of not having config databased + // 1. ValueChanged is run prior to values being propagated + // 2. We want the config to be saved ASAP, in-case a new ManiaPlayfield is instantiated + scrollTime = maniaConfig.GetBindable(ManiaSetting.ScrollTime); + scrollTime.ValueChanged += v => maniaConfig.Save(); + normalColumnColours = new List { colours.RedDark, diff --git a/osu.Game/Overlays/OnScreenDisplay.cs b/osu.Game/Overlays/OnScreenDisplay.cs index cc47f3bfa0..b9d0213aa6 100644 --- a/osu.Game/Overlays/OnScreenDisplay.cs +++ b/osu.Game/Overlays/OnScreenDisplay.cs @@ -118,16 +118,16 @@ namespace osu.Game.Overlays [BackgroundDependencyLoader] private void load(FrameworkConfigManager frameworkConfig) { - Register(frameworkConfig); + Register(this, frameworkConfig); } - private readonly Dictionary trackedConfigManagers = new Dictionary(); + private readonly Dictionary<(IDisposable, IConfigManager), TrackedSettings> trackedConfigManagers = new Dictionary<(IDisposable, IConfigManager), TrackedSettings>(); - public void Register(ITrackableConfigManager configManager) + public void Register(IDisposable source, ITrackableConfigManager configManager) { if (configManager == null) throw new ArgumentNullException(nameof(configManager)); - if (trackedConfigManagers.ContainsKey(configManager)) + if (trackedConfigManagers.ContainsKey((source, configManager))) return; var trackedSettings = configManager.CreateTrackedSettings(); @@ -138,20 +138,20 @@ namespace osu.Game.Overlays trackedSettings.SettingChanged += display; - trackedConfigManagers.Add(configManager, trackedSettings); + trackedConfigManagers.Add((source, configManager), trackedSettings); } - public void Unregister(ITrackableConfigManager configManager) + public void Unregister(IDisposable source, ITrackableConfigManager configManager) { if (configManager == null) throw new ArgumentNullException(nameof(configManager)); - if (!trackedConfigManagers.TryGetValue(configManager, out var existing)) + if (!trackedConfigManagers.TryGetValue((source, configManager), out var existing)) return; existing.Unload(); existing.SettingChanged -= display; - trackedConfigManagers.Remove(configManager); + trackedConfigManagers.Remove((source, configManager)); } private void display(SettingDescription description) diff --git a/osu.Game/Rulesets/Configuration/IRulesetConfigManager.cs b/osu.Game/Rulesets/Configuration/IRulesetConfigManager.cs index 8d386242a9..56eac730b0 100644 --- a/osu.Game/Rulesets/Configuration/IRulesetConfigManager.cs +++ b/osu.Game/Rulesets/Configuration/IRulesetConfigManager.cs @@ -1,12 +1,11 @@ // Copyright (c) 2007-2018 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE -using osu.Framework.Configuration; using osu.Framework.Configuration.Tracking; namespace osu.Game.Rulesets.Configuration { - public interface IRulesetConfigManager : ITrackableConfigManager, IConfigManager + public interface IRulesetConfigManager : ITrackableConfigManager { } } diff --git a/osu.Game/Rulesets/UI/RulesetContainer.cs b/osu.Game/Rulesets/UI/RulesetContainer.cs index 5d1c57a7a5..d4cfb3a3b3 100644 --- a/osu.Game/Rulesets/UI/RulesetContainer.cs +++ b/osu.Game/Rulesets/UI/RulesetContainer.cs @@ -68,6 +68,7 @@ namespace osu.Game.Rulesets.UI protected readonly Ruleset Ruleset; private IRulesetConfigManager rulesetConfig; + private OnScreenDisplay onScreenDisplay; private DependencyContainer dependencies; @@ -89,23 +90,17 @@ namespace osu.Game.Rulesets.UI [BackgroundDependencyLoader] private void load(Storage storage, OnScreenDisplay onScreenDisplay) { - rulesetConfig = getConfig(storage); + this.onScreenDisplay = onScreenDisplay; + + rulesetConfig = CreateConfig(Ruleset, storage); if (rulesetConfig != null) { dependencies.Cache(rulesetConfig); - onScreenDisplay?.Register(rulesetConfig); + onScreenDisplay?.Register(this, rulesetConfig); } } - private static readonly Dictionary config_cache = new Dictionary(); - private IRulesetConfigManager getConfig(Storage storage) - { - if (config_cache.TryGetValue(GetType(), out var existing)) - return existing; - return config_cache[GetType()] = CreateConfig(Ruleset, storage); - } - public abstract ScoreProcessor CreateScoreProcessor(); /// @@ -148,7 +143,12 @@ namespace osu.Game.Rulesets.UI protected override void Dispose(bool isDisposing) { base.Dispose(isDisposing); - rulesetConfig.Save(); + + if (rulesetConfig != null) + { + onScreenDisplay?.Unregister(this, rulesetConfig); + rulesetConfig = null; + } } }