diff --git a/osu.Game/Skinning/RulesetSkinProvidingContainer.cs b/osu.Game/Skinning/RulesetSkinProvidingContainer.cs
index bbaeee98d8..54d366b2f4 100644
--- a/osu.Game/Skinning/RulesetSkinProvidingContainer.cs
+++ b/osu.Game/Skinning/RulesetSkinProvidingContainer.cs
@@ -7,18 +7,26 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Game.Beatmaps;
using osu.Game.Rulesets;
+using osu.Game.Rulesets.UI;
namespace osu.Game.Skinning
{
///
- /// A type of that provides access to the beatmap skin and user skin,
- /// with each legacy skin source transformed with the ruleset's legacy skin transformer.
+ /// A type of specialized for and other gameplay-related components.
+ /// Providing access to the skin sources and the beatmap skin each surrounded with the ruleset legacy skin transformer.
+ /// While also limiting lookups from falling back to any parent s out of this container.
///
public class RulesetSkinProvidingContainer : SkinProvidingContainer
{
protected readonly Ruleset Ruleset;
protected readonly IBeatmap Beatmap;
+ ///
+ /// This container already re-exposes all skin sources in a ruleset-usable form.
+ /// Therefore disallow falling back to any parent any further.
+ ///
+ protected override bool AllowFallingBackToParent => false;
+
protected override Container Content { get; }
public RulesetSkinProvidingContainer(Ruleset ruleset, IBeatmap beatmap, [CanBeNull] ISkin beatmapSkin)
@@ -42,12 +50,7 @@ namespace osu.Game.Skinning
private void load()
{
UpdateSkins();
- }
-
- protected override void OnSourceChanged()
- {
- UpdateSkins();
- base.OnSourceChanged();
+ skinManager.SourceChanged += UpdateSkins;
}
protected virtual void UpdateSkins()
@@ -83,5 +86,13 @@ namespace osu.Game.Skinning
return legacySkin;
}
+
+ protected override void Dispose(bool isDisposing)
+ {
+ base.Dispose(isDisposing);
+
+ if (skinManager != null)
+ skinManager.SourceChanged -= UpdateSkins;
+ }
}
}