From 85bbe4382741e4bc1beb97a0748c6a4c212dd3ad Mon Sep 17 00:00:00 2001 From: PopSlime Date: Mon, 25 Dec 2023 14:26:27 +0800 Subject: [PATCH] Implement use skin action. --- .../Crtr/Browsing/Actions/OpenConfigAction.cs | 15 +++++++-- .../Crtr/Browsing/Actions/UseSkinAction.cs | 33 +++++++++++++++++++ .../Browsing/Actions/UseSkinAction.cs.meta | 11 +++++++ Assets/Cryville/Crtr/Browsing/ISkinDetail.cs | 6 ++++ .../Crtr/Browsing/ISkinDetail.cs.meta | 11 +++++++ .../Crtr/Browsing/Legacy/LegacySkinDetail.cs | 10 +++--- .../Legacy/LegacySkinResourceManager.cs | 2 +- .../Crtr/Browsing/UI/ResourceBrowserMaster.cs | 4 +++ .../Crtr/Browsing/UI/RulesetConfigBrowser.cs | 33 +++++++++++++------ 9 files changed, 108 insertions(+), 17 deletions(-) create mode 100644 Assets/Cryville/Crtr/Browsing/Actions/UseSkinAction.cs create mode 100644 Assets/Cryville/Crtr/Browsing/Actions/UseSkinAction.cs.meta create mode 100644 Assets/Cryville/Crtr/Browsing/ISkinDetail.cs create mode 100644 Assets/Cryville/Crtr/Browsing/ISkinDetail.cs.meta diff --git a/Assets/Cryville/Crtr/Browsing/Actions/OpenConfigAction.cs b/Assets/Cryville/Crtr/Browsing/Actions/OpenConfigAction.cs index cf6f806..a71be15 100644 --- a/Assets/Cryville/Crtr/Browsing/Actions/OpenConfigAction.cs +++ b/Assets/Cryville/Crtr/Browsing/Actions/OpenConfigAction.cs @@ -1,4 +1,5 @@ using Cryville.Crtr.Browsing.UI; +using Cryville.Crtr.Config; using Cryville.Crtr.UI; using System; using System.Collections.Generic; @@ -16,14 +17,23 @@ namespace Cryville.Crtr.Browsing.Actions { return true; } public override void Invoke(Uri uri, IChartDetail resource) { + Invoke(resource.RulesetId); + } + + public static bool HasTab(string ruleset) { + int tabId; + var master = ResourceBrowserMaster.Instance; + if (master == null) return false; + return _rulesetTabs.TryGetValue(ruleset, out tabId) && master.HasTab(tabId); + } + public static void Invoke(string ruleset, Action overrides = null) { var master = ResourceBrowserMaster.Instance; - var ruleset = resource.RulesetId; int tabId; if (_rulesetTabs.TryGetValue(ruleset, out tabId) && master.TryOpenTab(tabId)) return; var browser = Object.Instantiate(master.m_configBrowserPrefab).GetComponent(); try { - browser.Load(ruleset); + browser.Load(ruleset, overrides); } catch (Exception ex) { Dialog.Show(null, ex.Message); @@ -32,6 +42,7 @@ namespace Cryville.Crtr.Browsing.Actions { return; } _rulesetTabs[ruleset] = master.AddAndOpenTab(string.Format("Config: {0}", ruleset), browser); + browser.InitAction(); } } } diff --git a/Assets/Cryville/Crtr/Browsing/Actions/UseSkinAction.cs b/Assets/Cryville/Crtr/Browsing/Actions/UseSkinAction.cs new file mode 100644 index 0000000..5064548 --- /dev/null +++ b/Assets/Cryville/Crtr/Browsing/Actions/UseSkinAction.cs @@ -0,0 +1,33 @@ +using Cryville.Crtr.Browsing.UI; +using System; + +namespace Cryville.Crtr.Browsing.Actions { + internal class UseSkinAction : ResourceAction { + readonly RulesetConfigBrowser _destination; + public UseSkinAction() : this(null) { } + public UseSkinAction(RulesetConfigBrowser destination) { + _destination = destination; + } + + public override string Name { get { return "Use"; } } + + public override int Priority { get { return -100; } } + + public override bool CanInvoke(Uri uri, ISkinDetail resource) { + if (_destination == null) { + return !OpenConfigAction.HasTab(resource.RulesetId); + } + return _destination.RulesetName == resource.RulesetId; + } + + public override void Invoke(Uri uri, ISkinDetail resource) { + if (_destination == null) { + OpenConfigAction.Invoke(resource.RulesetId, config => config.generic.Skin = resource.Name); + } + else { + _destination.SetSkin(resource.Name); + OpenConfigAction.Invoke(resource.RulesetId, null); + } + } + } +} diff --git a/Assets/Cryville/Crtr/Browsing/Actions/UseSkinAction.cs.meta b/Assets/Cryville/Crtr/Browsing/Actions/UseSkinAction.cs.meta new file mode 100644 index 0000000..7bd66d2 --- /dev/null +++ b/Assets/Cryville/Crtr/Browsing/Actions/UseSkinAction.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ac898133ecfdb3f42bdade958381cd1a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Crtr/Browsing/ISkinDetail.cs b/Assets/Cryville/Crtr/Browsing/ISkinDetail.cs new file mode 100644 index 0000000..7ae7a30 --- /dev/null +++ b/Assets/Cryville/Crtr/Browsing/ISkinDetail.cs @@ -0,0 +1,6 @@ +namespace Cryville.Crtr.Browsing { + internal interface ISkinDetail : IResourceMeta { + string RulesetId { get; } + string Name { get; } + } +} diff --git a/Assets/Cryville/Crtr/Browsing/ISkinDetail.cs.meta b/Assets/Cryville/Crtr/Browsing/ISkinDetail.cs.meta new file mode 100644 index 0000000..fc04238 --- /dev/null +++ b/Assets/Cryville/Crtr/Browsing/ISkinDetail.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 38d9ea3c71d485a44ba9d335ddf95d67 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Crtr/Browsing/Legacy/LegacySkinDetail.cs b/Assets/Cryville/Crtr/Browsing/Legacy/LegacySkinDetail.cs index 584b666..01e7faf 100644 --- a/Assets/Cryville/Crtr/Browsing/Legacy/LegacySkinDetail.cs +++ b/Assets/Cryville/Crtr/Browsing/Legacy/LegacySkinDetail.cs @@ -2,15 +2,17 @@ using Cryville.Crtr.Skin; using System.Collections.Generic; namespace Cryville.Crtr.Browsing.Legacy { - internal class LegacySkinDetail : IResourceMeta { - public string Name { get; internal set; } + internal class LegacySkinDetail : ISkinDetail { + public string RulesetId { get { return Meta.ruleset; } } + public string Name { get { return Meta == null ? OverrideName : Meta.name; } } + public string OverrideName { get; internal set; } public SkinDefinition Meta { get; internal set; } public IEnumerable Properties { get { if (Meta == null) { - if (Name != null) - yield return new MetaProperty("Name", Name); + if (OverrideName != null) + yield return new MetaProperty("Name", OverrideName); yield break; } yield return new MetaProperty("Name", Meta.name); diff --git a/Assets/Cryville/Crtr/Browsing/Legacy/LegacySkinResourceManager.cs b/Assets/Cryville/Crtr/Browsing/Legacy/LegacySkinResourceManager.cs index 3bcdd08..36e3141 100644 --- a/Assets/Cryville/Crtr/Browsing/Legacy/LegacySkinResourceManager.cs +++ b/Assets/Cryville/Crtr/Browsing/Legacy/LegacySkinResourceManager.cs @@ -21,7 +21,7 @@ namespace Cryville.Crtr.Browsing.Legacy { return new LegacySkinDetail { Meta = meta }; } else - return new LegacySkinDetail { Name = dir.Name }; + return new LegacySkinDetail { OverrideName = dir.Name }; } } } diff --git a/Assets/Cryville/Crtr/Browsing/UI/ResourceBrowserMaster.cs b/Assets/Cryville/Crtr/Browsing/UI/ResourceBrowserMaster.cs index 2a62fa7..976be09 100644 --- a/Assets/Cryville/Crtr/Browsing/UI/ResourceBrowserMaster.cs +++ b/Assets/Cryville/Crtr/Browsing/UI/ResourceBrowserMaster.cs @@ -33,6 +33,7 @@ namespace Cryville.Crtr.Browsing.UI { Actions.Changed += OnActionsChanged; Actions.Register(new PlayChartAction()); Actions.Register(new OpenConfigAction()); + Actions.Register(new UseSkinAction()); OnTabClicked(AddPathedBrowserTab("Local Charts", new LegacyChartResourceManager(Settings.Default.GameDataPath))); AddPathedBrowserTab("Local Skins", new LegacySkinResourceManager(Settings.Default.GameDataPath)); @@ -67,6 +68,9 @@ namespace Cryville.Crtr.Browsing.UI { OnTabClicked(tab); return tab.GetHashCode(); } + public bool HasTab(int id) { + return _tabMap.ContainsKey(id); + } public bool TryOpenTab(int id) { BrowserTab tab; if (_tabMap.TryGetValue(id, out tab)) { diff --git a/Assets/Cryville/Crtr/Browsing/UI/RulesetConfigBrowser.cs b/Assets/Cryville/Crtr/Browsing/UI/RulesetConfigBrowser.cs index bd75bb7..79490af 100644 --- a/Assets/Cryville/Crtr/Browsing/UI/RulesetConfigBrowser.cs +++ b/Assets/Cryville/Crtr/Browsing/UI/RulesetConfigBrowser.cs @@ -22,14 +22,15 @@ namespace Cryville.Crtr.Browsing.UI { [SerializeField] InputConfigPanel m_inputConfigPanel; - public RulesetDefinition ruleset; + RulesetDefinition _ruleset; RulesetConfig _rscfg; - string _rulesetName; + public string RulesetName { get; private set; } + UseSkinAction _useSkinAction; bool _loaded; - public void Load(string rulesetName) { - _rulesetName = rulesetName; + public void Load(string rulesetName, Action overrides = null) { + RulesetName = rulesetName; FileInfo file = new FileInfo(Path.Combine( Game.GameDataPath, "rulesets", rulesetName, ".umgr" )); @@ -38,11 +39,11 @@ namespace Cryville.Crtr.Browsing.UI { } DirectoryInfo dir = file.Directory; using (StreamReader reader = new StreamReader(file.FullName, Encoding.UTF8)) { - ruleset = JsonConvert.DeserializeObject(reader.ReadToEnd(), new JsonSerializerSettings() { + _ruleset = JsonConvert.DeserializeObject(reader.ReadToEnd(), new JsonSerializerSettings() { MissingMemberHandling = MissingMemberHandling.Error }); - if (ruleset.format != RulesetDefinition.CURRENT_FORMAT) throw new FormatException("Invalid ruleset file version"); - ruleset.LoadPdt(dir); + if (_ruleset.format != RulesetDefinition.CURRENT_FORMAT) throw new FormatException("Invalid ruleset file version"); + _ruleset.LoadPdt(dir); } FileInfo cfgfile = new FileInfo(Path.Combine( Game.GameDataPath, "config", "rulesets", rulesetName + ".json" @@ -59,12 +60,24 @@ namespace Cryville.Crtr.Browsing.UI { } } + overrides?.Invoke(_rscfg); + m_genericConfigPanel.Adapter = new DefaultPropertyMasterAdapter(_rscfg.generic); - m_rulesetConfigPanel.Adapter = new RulesetConfigPropertyMasterAdapter(ruleset.Root.configs, _rscfg.configs); - m_inputConfigPanel.Load(ruleset.Root, _rscfg); + m_rulesetConfigPanel.Adapter = new RulesetConfigPropertyMasterAdapter(_ruleset.Root.configs, _rscfg.configs); + m_inputConfigPanel.Load(_ruleset.Root, _rscfg); _loaded = true; } + public void InitAction() { + Master.Actions.Register(_useSkinAction = new UseSkinAction(this)); + } + void OnDestroy() { + Master.Actions.Unregister(_useSkinAction); + } + + public void SetSkin(string skin) { + _rscfg.generic.Skin = skin; + } public void SwitchCategory(GameObject cat) { foreach (Transform c in m_content) { @@ -77,7 +90,7 @@ namespace Cryville.Crtr.Browsing.UI { if (_loaded) { m_inputConfigPanel.SaveTo(_rscfg.inputs); FileInfo cfgFile = new FileInfo(Path.Combine( - Game.GameDataPath, "config", "rulesets", _rulesetName + ".json" + Game.GameDataPath, "config", "rulesets", RulesetName + ".json" )); using (StreamWriter cfgWriter = new StreamWriter(cfgFile.FullName, false, Encoding.UTF8)) { cfgWriter.Write(JsonConvert.SerializeObject(_rscfg, Game.GlobalJsonSerializerSettings));