mirror of
https://github.com/osukey/osukey.git
synced 2025-07-01 16:29:58 +09:00
Allow instantiation of skins
This commit is contained in:
@ -1,4 +1,4 @@
|
|||||||
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
@ -106,7 +106,7 @@ namespace osu.Game
|
|||||||
|
|
||||||
runMigrations();
|
runMigrations();
|
||||||
|
|
||||||
dependencies.Cache(SkinManager = new SkinManager(Host.Storage, contextFactory, Host));
|
dependencies.Cache(SkinManager = new SkinManager(Host.Storage, contextFactory, Host, Audio));
|
||||||
|
|
||||||
dependencies.Cache(API = new APIAccess
|
dependencies.Cache(API = new APIAccess
|
||||||
{
|
{
|
||||||
|
17
osu.Game/Skinning/DefaultSkin.cs
Normal file
17
osu.Game/Skinning/DefaultSkin.cs
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
using osu.Framework.Audio.Sample;
|
||||||
|
using osu.Framework.Graphics;
|
||||||
|
|
||||||
|
namespace osu.Game.Skinning
|
||||||
|
{
|
||||||
|
public class DefaultSkin : Skin
|
||||||
|
{
|
||||||
|
public DefaultSkin()
|
||||||
|
: base(SkinInfo.Default)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Drawable GetDrawableComponent(string componentName) => null;
|
||||||
|
|
||||||
|
public override SampleChannel GetSample(string sampleName) => null;
|
||||||
|
}
|
||||||
|
}
|
49
osu.Game/Skinning/LegacySkin.cs
Normal file
49
osu.Game/Skinning/LegacySkin.cs
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using osu.Framework.Audio;
|
||||||
|
using osu.Framework.Audio.Sample;
|
||||||
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Framework.Graphics.Sprites;
|
||||||
|
using osu.Framework.Graphics.Textures;
|
||||||
|
using osu.Framework.IO.Stores;
|
||||||
|
|
||||||
|
namespace osu.Game.Skinning
|
||||||
|
{
|
||||||
|
public class LegacySkin : Skin
|
||||||
|
{
|
||||||
|
private readonly TextureStore textures;
|
||||||
|
|
||||||
|
private readonly SampleManager samples;
|
||||||
|
|
||||||
|
public LegacySkin(SkinInfo skin, IResourceStore<byte[]> storage, AudioManager audioManager)
|
||||||
|
: base(skin)
|
||||||
|
{
|
||||||
|
var audioStore = new ResourceStore<byte[]>(storage);
|
||||||
|
|
||||||
|
samples = audioManager.GetSampleManager(audioStore);
|
||||||
|
textures = new TextureStore(new RawTextureLoaderStore(storage));
|
||||||
|
}
|
||||||
|
|
||||||
|
private string getPathForFile(string filename) =>
|
||||||
|
SkinInfo.Files.FirstOrDefault(f => string.Equals(Path.GetFileNameWithoutExtension(f.Filename), filename, StringComparison.InvariantCultureIgnoreCase))?.FileInfo.StoragePath;
|
||||||
|
|
||||||
|
public override Drawable GetDrawableComponent(string componentName)
|
||||||
|
{
|
||||||
|
var texture = textures.Get(getPathForFile(componentName.Split('/').Last()));
|
||||||
|
if (texture == null) return null;
|
||||||
|
|
||||||
|
return new Sprite
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
FillMode = FillMode.Fit,
|
||||||
|
Texture = texture,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public override SampleChannel GetSample(string sampleName) => samples.Get(getPathForFile(sampleName.Split('/').Last()));
|
||||||
|
}
|
||||||
|
}
|
22
osu.Game/Skinning/Skin.cs
Normal file
22
osu.Game/Skinning/Skin.cs
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using osu.Framework.Audio.Sample;
|
||||||
|
using osu.Framework.Graphics;
|
||||||
|
|
||||||
|
namespace osu.Game.Skinning
|
||||||
|
{
|
||||||
|
public abstract class Skin
|
||||||
|
{
|
||||||
|
public readonly SkinInfo SkinInfo;
|
||||||
|
|
||||||
|
public abstract Drawable GetDrawableComponent(string componentName);
|
||||||
|
|
||||||
|
public abstract SampleChannel GetSample(string sampleName);
|
||||||
|
|
||||||
|
protected Skin(SkinInfo skin)
|
||||||
|
{
|
||||||
|
SkinInfo = skin;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
@ -6,6 +6,7 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Linq.Expressions;
|
using System.Linq.Expressions;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using osu.Framework.Audio;
|
||||||
using osu.Framework.Configuration;
|
using osu.Framework.Configuration;
|
||||||
using osu.Framework.Platform;
|
using osu.Framework.Platform;
|
||||||
using osu.Game.Database;
|
using osu.Game.Database;
|
||||||
@ -15,6 +16,9 @@ namespace osu.Game.Skinning
|
|||||||
{
|
{
|
||||||
public class SkinManager : ArchiveModelManager<SkinInfo, SkinFileInfo>
|
public class SkinManager : ArchiveModelManager<SkinInfo, SkinFileInfo>
|
||||||
{
|
{
|
||||||
|
private readonly AudioManager audio;
|
||||||
|
|
||||||
|
public readonly Bindable<Skin> CurrentSkin = new Bindable<Skin>(new DefaultSkin());
|
||||||
public readonly Bindable<SkinInfo> CurrentSkinInfo = new Bindable<SkinInfo>(SkinInfo.Default) { Default = SkinInfo.Default };
|
public readonly Bindable<SkinInfo> CurrentSkinInfo = new Bindable<SkinInfo>(SkinInfo.Default) { Default = SkinInfo.Default };
|
||||||
|
|
||||||
public override string[] HandledExtensions => new[] { ".osk" };
|
public override string[] HandledExtensions => new[] { ".osk" };
|
||||||
@ -30,13 +34,37 @@ namespace osu.Game.Skinning
|
|||||||
return userSkins;
|
return userSkins;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override SkinInfo CreateModel(ArchiveReader archive) => new SkinInfo { Name = archive.Name };
|
protected override SkinInfo CreateModel(ArchiveReader archive) => new SkinInfo
|
||||||
|
{
|
||||||
|
Name = archive.Name
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Retrieve a <see cref="Skin"/> instance for the provided <see cref="SkinInfo"/>
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="skinInfo">The skin to lookup.</param>
|
||||||
|
/// <returns>A <see cref="Skin"/> instance correlating to the provided <see cref="SkinInfo"/>.</returns>
|
||||||
|
public Skin GetSkin(SkinInfo skinInfo)
|
||||||
|
{
|
||||||
|
if (skinInfo == SkinInfo.Default)
|
||||||
|
return new DefaultSkin();
|
||||||
|
|
||||||
|
return new LegacySkin(skinInfo, Files.Store, audio);
|
||||||
|
}
|
||||||
|
|
||||||
private SkinStore store;
|
private SkinStore store;
|
||||||
|
|
||||||
public SkinManager(Storage storage, DatabaseContextFactory contextFactory, IIpcHost importHost)
|
public SkinManager(Storage storage, DatabaseContextFactory contextFactory, IIpcHost importHost, AudioManager audio)
|
||||||
: base(storage, contextFactory, new SkinStore(contextFactory, storage), importHost)
|
: base(storage, contextFactory, new SkinStore(contextFactory, storage), importHost)
|
||||||
{
|
{
|
||||||
|
this.audio = audio;
|
||||||
|
|
||||||
|
CurrentSkinInfo.ValueChanged += info => { CurrentSkin.Value = GetSkin(info); };
|
||||||
|
CurrentSkin.ValueChanged += skin =>
|
||||||
|
{
|
||||||
|
if (skin.SkinInfo != CurrentSkinInfo.Value)
|
||||||
|
throw new InvalidOperationException($"Setting {nameof(CurrentSkin)}'s value directly is not supported. Use {nameof(CurrentSkinInfo)} isntead.");
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="14.0">
|
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="14.0">
|
||||||
<Import Project="..\osu.Game.props" />
|
<Import Project="..\osu.Game.props" />
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
@ -854,6 +854,9 @@
|
|||||||
<Compile Include="Screens\Tournament\Teams\DrawingsTeam.cs" />
|
<Compile Include="Screens\Tournament\Teams\DrawingsTeam.cs" />
|
||||||
<Compile Include="Screens\Tournament\Teams\ITeamList.cs" />
|
<Compile Include="Screens\Tournament\Teams\ITeamList.cs" />
|
||||||
<Compile Include="Screens\Tournament\Teams\StorageBackedTeamList.cs" />
|
<Compile Include="Screens\Tournament\Teams\StorageBackedTeamList.cs" />
|
||||||
|
<Compile Include="Skinning\DefaultSkin.cs" />
|
||||||
|
<Compile Include="Skinning\LegacySkin.cs" />
|
||||||
|
<Compile Include="Skinning\Skin.cs" />
|
||||||
<Compile Include="Skinning\SkinFileInfo.cs" />
|
<Compile Include="Skinning\SkinFileInfo.cs" />
|
||||||
<Compile Include="Skinning\SkinInfo.cs" />
|
<Compile Include="Skinning\SkinInfo.cs" />
|
||||||
<Compile Include="Skinning\SkinManager.cs" />
|
<Compile Include="Skinning\SkinManager.cs" />
|
||||||
|
Reference in New Issue
Block a user