diff --git a/Assets/Cryville/Crtr/Browsing/Actions/OpenConfigAction.cs b/Assets/Cryville/Crtr/Browsing/Actions/OpenConfigAction.cs index ed3b76b..28f6083 100644 --- a/Assets/Cryville/Crtr/Browsing/Actions/OpenConfigAction.cs +++ b/Assets/Cryville/Crtr/Browsing/Actions/OpenConfigAction.cs @@ -1,6 +1,7 @@ using Cryville.Crtr.Browsing.UI; using Cryville.Crtr.UI; using System; +using System.Collections.Generic; using Object = UnityEngine.Object; namespace Cryville.Crtr.Browsing.Actions { @@ -9,18 +10,25 @@ namespace Cryville.Crtr.Browsing.Actions { public override int Priority { get { return -50; } } + static Dictionary _rulesetTabs = new Dictionary(); + public override void Invoke(Uri uri, ChartDetail resource) { var master = ResourceBrowserMaster.Instance; + var ruleset = resource.Meta.ruleset; + int tabId; + if (_rulesetTabs.TryGetValue(ruleset, out tabId) && master.TryOpenTab(tabId)) + return; var browser = Object.Instantiate(master.m_configBrowserPrefab).GetComponent(); try { - browser.Load(resource.Meta.ruleset); + browser.Load(ruleset); } catch (Exception ex) { Dialog.Show(null, ex.Message); Game.MainLogger.Log(4, "Config", "An error occurred while loading the config: {0}", ex); + Object.Destroy(browser.gameObject); return; } - master.AddAndOpenTab(string.Format("Config: {0}", resource.Meta.ruleset), browser); + _rulesetTabs[ruleset] = master.AddAndOpenTab(string.Format("Config: {0}", ruleset), browser); } } } diff --git a/Assets/Cryville/Crtr/Browsing/UI/ResourceBrowserMaster.cs b/Assets/Cryville/Crtr/Browsing/UI/ResourceBrowserMaster.cs index 52bc8c7..2bbd7bc 100644 --- a/Assets/Cryville/Crtr/Browsing/UI/ResourceBrowserMaster.cs +++ b/Assets/Cryville/Crtr/Browsing/UI/ResourceBrowserMaster.cs @@ -20,6 +20,7 @@ namespace Cryville.Crtr.Browsing.UI { internal GameObject m_configBrowserPrefab; BrowserTab _currentTab; + readonly Dictionary _tabMap = new Dictionary(); readonly Dictionary _tabs = new Dictionary(); public ActionManager Actions { get; private set; } @@ -52,14 +53,25 @@ namespace Cryville.Crtr.Browsing.UI { tab.Closed += OnTabClosed; browser.gameObject.SetActive(false); _tabs.Add(tab, browser); + _tabMap.Add(tab.GetHashCode(), tab); return tab; } T InitBrowser(T browser) where T : ResourceBrowser { browser.Init(this); return browser; } - public void AddAndOpenTab(string name, ResourceBrowser browser) { + public int AddAndOpenTab(string name, ResourceBrowser browser) { InitBrowser(browser); browser.transform.SetParent(m_browserContainer, false); - OnTabClicked(AddTab(name, browser, _currentTab.transform.GetSiblingIndex() + 1, true)); + var tab = AddTab(name, browser, _currentTab.transform.GetSiblingIndex() + 1, true); + OnTabClicked(tab); + return tab.GetHashCode(); + } + public bool TryOpenTab(int id) { + BrowserTab tab; + if (_tabMap.TryGetValue(id, out tab)) { + OnTabClicked(tab); + return true; + } + return false; } void OnTabClicked(BrowserTab tab) { @@ -78,6 +90,7 @@ namespace Cryville.Crtr.Browsing.UI { Destroy(tab.gameObject); Destroy(_tabs[tab].gameObject); _tabs.Remove(tab); + _tabMap.Remove(tab.GetHashCode()); if (_currentTab == tab) _currentTab = null; }