From 3f22c0a311abfc79bf32104a0b99c44fa30412c8 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 24 Jun 2019 14:39:20 +0900 Subject: [PATCH 1/4] Add SkinnableSprite implementation --- osu.Game/Skinning/SkinnableDrawable.cs | 26 +++++++++++++++++++------- osu.Game/Skinning/SkinnableSprite.cs | 25 +++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 7 deletions(-) create mode 100644 osu.Game/Skinning/SkinnableSprite.cs diff --git a/osu.Game/Skinning/SkinnableDrawable.cs b/osu.Game/Skinning/SkinnableDrawable.cs index 3ca58dc625..dcbb63435a 100644 --- a/osu.Game/Skinning/SkinnableDrawable.cs +++ b/osu.Game/Skinning/SkinnableDrawable.cs @@ -23,6 +23,8 @@ namespace osu.Game.Skinning /// protected Drawable Drawable { get; private set; } + protected virtual T CreateDefault(string name) => createDefault(name); + private readonly Func createDefault; private readonly string componentName; @@ -37,34 +39,44 @@ namespace osu.Game.Skinning /// A conditional to decide whether to allow fallback to the default implementation if a skinned element is not present. /// Whether a user-skin drawable should be limited to the size of our parent. public SkinnableDrawable(string name, Func defaultImplementation, Func allowFallback = null, bool restrictSize = true) + : this(name, allowFallback, restrictSize) + { + createDefault = defaultImplementation; + } + + protected SkinnableDrawable(string name, Func allowFallback = null, bool restrictSize = true) : base(allowFallback) { componentName = name; - createDefault = defaultImplementation; this.restrictSize = restrictSize; RelativeSizeAxes = Axes.Both; } + protected virtual bool ApplySizeToDefault => false; + protected override void SkinChanged(ISkinSource skin, bool allowFallback) { Drawable = skin.GetDrawableComponent(componentName); + bool isDefault = false; + + if (Drawable == null && allowFallback) + { + Drawable = CreateDefault(componentName); + isDefault = true; + } + if (Drawable != null) { - if (restrictSize) + if (restrictSize && (!isDefault || ApplySizeToDefault)) { Drawable.RelativeSizeAxes = Axes.Both; Drawable.Size = Vector2.One; Drawable.Scale = Vector2.One; Drawable.FillMode = FillMode.Fit; } - } - else if (allowFallback) - Drawable = createDefault(componentName); - if (Drawable != null) - { Drawable.Origin = Anchor.Centre; Drawable.Anchor = Anchor.Centre; diff --git a/osu.Game/Skinning/SkinnableSprite.cs b/osu.Game/Skinning/SkinnableSprite.cs new file mode 100644 index 0000000000..72b5740bd6 --- /dev/null +++ b/osu.Game/Skinning/SkinnableSprite.cs @@ -0,0 +1,25 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System; +using osu.Framework.Allocation; +using osu.Framework.Graphics.Sprites; +using osu.Framework.Graphics.Textures; + +namespace osu.Game.Skinning +{ + public class SkinnableSprite : SkinnableDrawable + { + protected override bool ApplySizeToDefault => true; + + protected override Sprite CreateDefault(string name) => new Sprite { Texture = textures.Get(name) }; + + [Resolved] + private TextureStore textures { get; set; } + + public SkinnableSprite(string name, Func allowFallback = null, bool restrictSize = true) + : base(name, allowFallback, restrictSize) + { + } + } +} From aca9289d89df4c0984a0416ad689cff0ddff6f16 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 24 Jun 2019 15:17:56 +0900 Subject: [PATCH 2/4] Use SkinnableSprite for approach circle --- .../Objects/Drawables/Pieces/ApproachCircle.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/ApproachCircle.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/ApproachCircle.cs index 8ee065aaea..9981585f9e 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/ApproachCircle.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/ApproachCircle.cs @@ -4,7 +4,6 @@ using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.Textures; using osu.Game.Skinning; @@ -25,7 +24,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Pieces [BackgroundDependencyLoader] private void load(TextureStore textures) { - Child = new SkinnableDrawable("Play/osu/approachcircle", name => new Sprite { Texture = textures.Get(name) }); + Child = new SkinnableSprite("Play/osu/approachcircle"); } } } From 9593e66a968d075066512f2a5540d2cfe6b37cc5 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 24 Jun 2019 15:25:01 +0900 Subject: [PATCH 3/4] Add some more xmldoc --- osu.Game/Skinning/SkinnableDrawable.cs | 13 ++++++++++--- osu.Game/Skinning/SkinnableSprite.cs | 5 ++++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/osu.Game/Skinning/SkinnableDrawable.cs b/osu.Game/Skinning/SkinnableDrawable.cs index dcbb63435a..0a7c398990 100644 --- a/osu.Game/Skinning/SkinnableDrawable.cs +++ b/osu.Game/Skinning/SkinnableDrawable.cs @@ -15,6 +15,10 @@ namespace osu.Game.Skinning } } + /// + /// A drawable which can be skinned via an . + /// + /// The type of drawable. public class SkinnableDrawable : SkinReloadableDrawable where T : Drawable { @@ -32,7 +36,7 @@ namespace osu.Game.Skinning private readonly bool restrictSize; /// - /// + /// Create a new skinnable drawable. /// /// The namespace-complete resource name for this skinnable element. /// A function to create the default skin implementation of this element. @@ -53,7 +57,10 @@ namespace osu.Game.Skinning RelativeSizeAxes = Axes.Both; } - protected virtual bool ApplySizeToDefault => false; + /// + /// Whether to apply size restrictions (specified via ) to the default implementation. + /// + protected virtual bool ApplySizeRestrictionsToDefault => false; protected override void SkinChanged(ISkinSource skin, bool allowFallback) { @@ -69,7 +76,7 @@ namespace osu.Game.Skinning if (Drawable != null) { - if (restrictSize && (!isDefault || ApplySizeToDefault)) + if (restrictSize && (!isDefault || ApplySizeRestrictionsToDefault)) { Drawable.RelativeSizeAxes = Axes.Both; Drawable.Size = Vector2.One; diff --git a/osu.Game/Skinning/SkinnableSprite.cs b/osu.Game/Skinning/SkinnableSprite.cs index 72b5740bd6..9771f4cc19 100644 --- a/osu.Game/Skinning/SkinnableSprite.cs +++ b/osu.Game/Skinning/SkinnableSprite.cs @@ -8,9 +8,12 @@ using osu.Framework.Graphics.Textures; namespace osu.Game.Skinning { + /// + /// A skinnable element which uses a stable sprite and can therefore share implementation logic. + /// public class SkinnableSprite : SkinnableDrawable { - protected override bool ApplySizeToDefault => true; + protected override bool ApplySizeRestrictionsToDefault => true; protected override Sprite CreateDefault(string name) => new Sprite { Texture = textures.Get(name) }; From 06eaba766b93261b0ecdbc5732202ec40955247a Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 24 Jun 2019 15:27:46 +0900 Subject: [PATCH 4/4] Move method below ctor --- osu.Game/Skinning/SkinnableDrawable.cs | 8 ++++---- osu.Game/Skinning/SkinnableSprite.cs | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/osu.Game/Skinning/SkinnableDrawable.cs b/osu.Game/Skinning/SkinnableDrawable.cs index 0a7c398990..995cb15136 100644 --- a/osu.Game/Skinning/SkinnableDrawable.cs +++ b/osu.Game/Skinning/SkinnableDrawable.cs @@ -27,10 +27,6 @@ namespace osu.Game.Skinning /// protected Drawable Drawable { get; private set; } - protected virtual T CreateDefault(string name) => createDefault(name); - - private readonly Func createDefault; - private readonly string componentName; private readonly bool restrictSize; @@ -57,6 +53,10 @@ namespace osu.Game.Skinning RelativeSizeAxes = Axes.Both; } + private readonly Func createDefault; + + protected virtual T CreateDefault(string name) => createDefault(name); + /// /// Whether to apply size restrictions (specified via ) to the default implementation. /// diff --git a/osu.Game/Skinning/SkinnableSprite.cs b/osu.Game/Skinning/SkinnableSprite.cs index 9771f4cc19..ceb1ed0f70 100644 --- a/osu.Game/Skinning/SkinnableSprite.cs +++ b/osu.Game/Skinning/SkinnableSprite.cs @@ -15,8 +15,6 @@ namespace osu.Game.Skinning { protected override bool ApplySizeRestrictionsToDefault => true; - protected override Sprite CreateDefault(string name) => new Sprite { Texture = textures.Get(name) }; - [Resolved] private TextureStore textures { get; set; } @@ -24,5 +22,7 @@ namespace osu.Game.Skinning : base(name, allowFallback, restrictSize) { } + + protected override Sprite CreateDefault(string name) => new Sprite { Texture = textures.Get(name) }; } }