From 425d4aa7661ec131640fca29545de791ea496b81 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 22 Mar 2018 18:10:28 +0900 Subject: [PATCH] Add ability to lookup arbitrary SkinConfiguration values --- osu.Game/Skinning/ISkinSource.cs | 4 ++++ .../Skinning/LocalSkinOverrideContainer.cs | 20 +++++++++++++++++++ osu.Game/Skinning/Skin.cs | 8 +++++++- osu.Game/Skinning/SkinManager.cs | 6 +++++- 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/osu.Game/Skinning/ISkinSource.cs b/osu.Game/Skinning/ISkinSource.cs index 5292ff3cb5..ae2909327e 100644 --- a/osu.Game/Skinning/ISkinSource.cs +++ b/osu.Game/Skinning/ISkinSource.cs @@ -23,5 +23,9 @@ namespace osu.Game.Skinning SampleChannel GetSample(string sampleName); Color4? GetColour(string colourName); + + TValue GetConfiguration(Func query) where TConfiguration : SkinConfiguration where TValue : class; + + TValue? GetConfiguration(Func query) where TConfiguration : SkinConfiguration where TValue : struct; } } diff --git a/osu.Game/Skinning/LocalSkinOverrideContainer.cs b/osu.Game/Skinning/LocalSkinOverrideContainer.cs index cebdc85955..8181ec0ea1 100644 --- a/osu.Game/Skinning/LocalSkinOverrideContainer.cs +++ b/osu.Game/Skinning/LocalSkinOverrideContainer.cs @@ -23,6 +23,26 @@ namespace osu.Game.Skinning public Color4? GetColour(string colourName) => source.GetColour(colourName) ?? fallbackSource?.GetColour(colourName); + public TValue? GetConfiguration(Func query) where TConfiguration : SkinConfiguration where TValue : struct + { + TValue? val = null; + var conf = (source as Skin)?.Configuration as TConfiguration; + if (conf != null) + val = query?.Invoke(conf); + + return val ?? fallbackSource?.GetConfiguration(query); + } + + public TValue GetConfiguration(Func query) where TConfiguration : SkinConfiguration where TValue : class + { + TValue val = null; + var conf = (source as Skin)?.Configuration as TConfiguration; + if (conf != null) + val = query?.Invoke(conf); + + return val ?? fallbackSource?.GetConfiguration(query); + } + private readonly ISkinSource source; private ISkinSource fallbackSource; diff --git a/osu.Game/Skinning/Skin.cs b/osu.Game/Skinning/Skin.cs index 6d5196e1e7..1c175ea4e9 100644 --- a/osu.Game/Skinning/Skin.cs +++ b/osu.Game/Skinning/Skin.cs @@ -34,7 +34,7 @@ namespace osu.Game.Skinning { case "Combo": int index = int.Parse(namespaces[2]); - return Configuration.ComboColours.Count == 0 ? (Color4?)null : Configuration.ComboColours[index % Configuration.ComboColours.Count]; + return GetConfiguration(s => s.ComboColours.Count == 0 ? (Color4?)null : Configuration.ComboColours[index % Configuration.ComboColours.Count]); } break; @@ -43,6 +43,12 @@ namespace osu.Game.Skinning return null; } + public TValue GetConfiguration(Func query) where TConfiguration : SkinConfiguration where TValue : class + => Configuration is TConfiguration conf ? query?.Invoke(conf) : null; + + public TValue? GetConfiguration(Func query) where TConfiguration : SkinConfiguration where TValue : struct + => Configuration is TConfiguration conf ? query?.Invoke(conf) : null; + protected Skin(SkinInfo skin) { SkinInfo = skin; diff --git a/osu.Game/Skinning/SkinManager.cs b/osu.Game/Skinning/SkinManager.cs index 654260daca..ba6f5b4774 100644 --- a/osu.Game/Skinning/SkinManager.cs +++ b/osu.Game/Skinning/SkinManager.cs @@ -119,10 +119,14 @@ namespace osu.Game.Skinning public Drawable GetDrawableComponent(string componentName) => CurrentSkin.Value.GetDrawableComponent(componentName); - public Texture GetTexture(string componentName)=> CurrentSkin.Value.GetTexture(componentName); + public Texture GetTexture(string componentName) => CurrentSkin.Value.GetTexture(componentName); public SampleChannel GetSample(string sampleName) => CurrentSkin.Value.GetSample(sampleName); public Color4? GetColour(string colourName) => CurrentSkin.Value.GetColour(colourName); + + public TValue GetConfiguration(Func query) where TConfiguration : SkinConfiguration where TValue : class => CurrentSkin.Value.GetConfiguration(query); + + public TValue? GetConfiguration(Func query) where TConfiguration : SkinConfiguration where TValue : struct => CurrentSkin.Value.GetConfiguration(query); } }