diff --git a/Assets/Cryville/Crtr/Browsing/Actions/ActionManager.cs b/Assets/Cryville/Crtr/Browsing/Actions/ActionManager.cs index a49d977..19e5912 100644 --- a/Assets/Cryville/Crtr/Browsing/Actions/ActionManager.cs +++ b/Assets/Cryville/Crtr/Browsing/Actions/ActionManager.cs @@ -45,17 +45,21 @@ namespace Cryville.Crtr.Browsing.Actions { Unregister(typeof(T), action); } - public IEnumerable GetActions(Type type) { + public IEnumerable GetActions(Uri uri, IResourceMeta res) { + return GetActions(uri, res, res.GetType()); + } + IEnumerable GetActions(Uri uri, IResourceMeta res, Type type) { if (type == null) return Enumerable.Empty(); List actions; - if (!_actions.TryGetValue(type, out actions)) { - actions = new List(); - } - IEnumerable result = actions; + IEnumerable result; + if (_actions.TryGetValue(type, out actions)) + result = actions.Where(i => i.CanInvoke(uri, res)); + else + result = Enumerable.Empty(); if (type != typeof(object)) result = result - .Concat(GetActions(type.BaseType)) - .Concat(type.GetInterfaces().SelectMany(i => GetActions(i))); + .Concat(GetActions(uri, res, type.BaseType)) + .Concat(type.GetInterfaces().SelectMany(i => GetActions(uri, res, i))); return result; } } diff --git a/Assets/Cryville/Crtr/Browsing/Actions/IResourceAction.cs b/Assets/Cryville/Crtr/Browsing/Actions/IResourceAction.cs index cbc13cb..4aa69a2 100644 --- a/Assets/Cryville/Crtr/Browsing/Actions/IResourceAction.cs +++ b/Assets/Cryville/Crtr/Browsing/Actions/IResourceAction.cs @@ -4,9 +4,12 @@ namespace Cryville.Crtr.Browsing.Actions { public interface IResourceAction { string Name { get; } int Priority { get; } + + bool CanInvoke(Uri uri, IResourceMeta resource); void Invoke(Uri uri, IResourceMeta resource); } public interface IResourceAction : IResourceAction where T : IResourceMeta { + bool CanInvoke(Uri uri, T resource); void Invoke(Uri uri, T resource); } } diff --git a/Assets/Cryville/Crtr/Browsing/Actions/ImportResourceAction.cs b/Assets/Cryville/Crtr/Browsing/Actions/ImportResourceAction.cs index 71bbd31..8e4264a 100644 --- a/Assets/Cryville/Crtr/Browsing/Actions/ImportResourceAction.cs +++ b/Assets/Cryville/Crtr/Browsing/Actions/ImportResourceAction.cs @@ -11,6 +11,9 @@ namespace Cryville.Crtr.Browsing.Actions { public string Name { get { return "Import"; } } public int Priority { get { return 0; } } + public bool CanInvoke(Uri uri, IResourceMeta resource) { + throw new NotImplementedException(); + } public void Invoke(Uri uri, IResourceMeta resource) { if (_destination.ImportFrom(uri)) Popup.Create("Import succeeded"); diff --git a/Assets/Cryville/Crtr/Browsing/Actions/OpenConfigAction.cs b/Assets/Cryville/Crtr/Browsing/Actions/OpenConfigAction.cs index b81acd4..cf6f806 100644 --- a/Assets/Cryville/Crtr/Browsing/Actions/OpenConfigAction.cs +++ b/Assets/Cryville/Crtr/Browsing/Actions/OpenConfigAction.cs @@ -12,6 +12,9 @@ namespace Cryville.Crtr.Browsing.Actions { static readonly Dictionary _rulesetTabs = new Dictionary(); + public override bool CanInvoke(Uri uri, IChartDetail resource) { + return true; + } public override void Invoke(Uri uri, IChartDetail resource) { var master = ResourceBrowserMaster.Instance; var ruleset = resource.RulesetId; diff --git a/Assets/Cryville/Crtr/Browsing/Actions/PlayChartAction.cs b/Assets/Cryville/Crtr/Browsing/Actions/PlayChartAction.cs index 87dc8a0..f078bd0 100644 --- a/Assets/Cryville/Crtr/Browsing/Actions/PlayChartAction.cs +++ b/Assets/Cryville/Crtr/Browsing/Actions/PlayChartAction.cs @@ -8,6 +8,9 @@ namespace Cryville.Crtr.Browsing.Actions { public override string Name { get { return "Play"; } } public override int Priority { get { return -100; } } + public override bool CanInvoke(Uri uri, IChartDetail resource) { + return true; + } public override void Invoke(Uri uri, IChartDetail resource) { Settings.Default.LoadRuleset = Path.Combine(resource.RulesetId, ".umgr"); Settings.Default.LoadRulesetConfig = resource.RulesetId + ".json"; diff --git a/Assets/Cryville/Crtr/Browsing/Actions/ResourceAction.cs b/Assets/Cryville/Crtr/Browsing/Actions/ResourceAction.cs index 286a791..3a29476 100644 --- a/Assets/Cryville/Crtr/Browsing/Actions/ResourceAction.cs +++ b/Assets/Cryville/Crtr/Browsing/Actions/ResourceAction.cs @@ -4,6 +4,14 @@ namespace Cryville.Crtr.Browsing.Actions { public abstract class ResourceAction : IResourceAction where T : IResourceMeta { public abstract string Name { get; } public abstract int Priority { get; } + + public abstract bool CanInvoke(Uri uri, T resource); + public bool CanInvoke(Uri uri, IResourceMeta resource) { + if (resource == null) throw new ArgumentNullException("resource"); + if (!(resource is T)) throw new ArgumentException("Mismatched resource type."); + return CanInvoke(uri, (T)resource); + } + public abstract void Invoke(Uri uri, T resource); public void Invoke(Uri uri, IResourceMeta resource) { if (resource == null) throw new ArgumentNullException("resource"); diff --git a/Assets/Cryville/Crtr/Browsing/UI/PathedResourceBrowser.cs b/Assets/Cryville/Crtr/Browsing/UI/PathedResourceBrowser.cs index 4b96c55..33e2e6f 100644 --- a/Assets/Cryville/Crtr/Browsing/UI/PathedResourceBrowser.cs +++ b/Assets/Cryville/Crtr/Browsing/UI/PathedResourceBrowser.cs @@ -122,7 +122,7 @@ namespace Cryville.Crtr.Browsing.UI { var res = _manager[id]; m_detailPanel.Load(res); if (_selectedItems.Count == 1) { - LoadActions(res); + LoadActions(_manager.GetItemUri(id), res); } } catch (Exception ex) { @@ -133,11 +133,12 @@ namespace Cryville.Crtr.Browsing.UI { internal override void OnActionsChanged() { if (_destroyed) return; if (_selectedItems.Count == 1) { - LoadActions(_manager[_selectedItems.Single()]); + int id = _selectedItems.Single(); + LoadActions(_manager.GetItemUri(id), _manager[id]); } } - void LoadActions(IResourceMeta res) { - m_actionBar.Load(this, Master.Actions.GetActions(res.GetType()).Except(_importActionArray)); + void LoadActions(Uri uri, IResourceMeta res) { + m_actionBar.Load(this, Master.Actions.GetActions(uri, res).Except(_importActionArray)); } public void OnPathClicked(int index) {