Prevents duplicate ruleset config tabs.

This commit is contained in:
2023-12-02 00:28:07 +08:00
parent c4e15fbbfd
commit 01b162883d
2 changed files with 25 additions and 4 deletions

View File

@@ -1,6 +1,7 @@
using Cryville.Crtr.Browsing.UI; using Cryville.Crtr.Browsing.UI;
using Cryville.Crtr.UI; using Cryville.Crtr.UI;
using System; using System;
using System.Collections.Generic;
using Object = UnityEngine.Object; using Object = UnityEngine.Object;
namespace Cryville.Crtr.Browsing.Actions { namespace Cryville.Crtr.Browsing.Actions {
@@ -9,18 +10,25 @@ namespace Cryville.Crtr.Browsing.Actions {
public override int Priority { get { return -50; } } public override int Priority { get { return -50; } }
static Dictionary<string, int> _rulesetTabs = new Dictionary<string, int>();
public override void Invoke(Uri uri, ChartDetail resource) { public override void Invoke(Uri uri, ChartDetail resource) {
var master = ResourceBrowserMaster.Instance; 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<RulesetConfigBrowser>(); var browser = Object.Instantiate(master.m_configBrowserPrefab).GetComponent<RulesetConfigBrowser>();
try { try {
browser.Load(resource.Meta.ruleset); browser.Load(ruleset);
} }
catch (Exception ex) { catch (Exception ex) {
Dialog.Show(null, ex.Message); Dialog.Show(null, ex.Message);
Game.MainLogger.Log(4, "Config", "An error occurred while loading the config: {0}", ex); Game.MainLogger.Log(4, "Config", "An error occurred while loading the config: {0}", ex);
Object.Destroy(browser.gameObject);
return; return;
} }
master.AddAndOpenTab(string.Format("Config: {0}", resource.Meta.ruleset), browser); _rulesetTabs[ruleset] = master.AddAndOpenTab(string.Format("Config: {0}", ruleset), browser);
} }
} }
} }

View File

@@ -20,6 +20,7 @@ namespace Cryville.Crtr.Browsing.UI {
internal GameObject m_configBrowserPrefab; internal GameObject m_configBrowserPrefab;
BrowserTab _currentTab; BrowserTab _currentTab;
readonly Dictionary<int, BrowserTab> _tabMap = new Dictionary<int, BrowserTab>();
readonly Dictionary<BrowserTab, ResourceBrowser> _tabs = new Dictionary<BrowserTab, ResourceBrowser>(); readonly Dictionary<BrowserTab, ResourceBrowser> _tabs = new Dictionary<BrowserTab, ResourceBrowser>();
public ActionManager Actions { get; private set; } public ActionManager Actions { get; private set; }
@@ -52,14 +53,25 @@ namespace Cryville.Crtr.Browsing.UI {
tab.Closed += OnTabClosed; tab.Closed += OnTabClosed;
browser.gameObject.SetActive(false); browser.gameObject.SetActive(false);
_tabs.Add(tab, browser); _tabs.Add(tab, browser);
_tabMap.Add(tab.GetHashCode(), tab);
return tab; return tab;
} }
T InitBrowser<T>(T browser) where T : ResourceBrowser { browser.Init(this); return browser; } T InitBrowser<T>(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); InitBrowser(browser);
browser.transform.SetParent(m_browserContainer, false); 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) { void OnTabClicked(BrowserTab tab) {
@@ -78,6 +90,7 @@ namespace Cryville.Crtr.Browsing.UI {
Destroy(tab.gameObject); Destroy(tab.gameObject);
Destroy(_tabs[tab].gameObject); Destroy(_tabs[tab].gameObject);
_tabs.Remove(tab); _tabs.Remove(tab);
_tabMap.Remove(tab.GetHashCode());
if (_currentTab == tab) _currentTab = null; if (_currentTab == tab) _currentTab = null;
} }