using Cryville.Common.Unity; using Cryville.Crtr.Browsing.Actions; using Cryville.Crtr.Browsing.Legacy; using System.Collections.Generic; using UnityEngine; namespace Cryville.Crtr.Browsing.UI { public class ResourceBrowserMaster : SingletonBehaviour { [SerializeField] Transform m_tabContainer; [SerializeField] GameObject m_tabPrefab; [SerializeField] Transform m_browserContainer; [SerializeField] SettingsBrowser m_settingsBrowser; [SerializeField] internal GameObject m_pathedBrowserPrefab; [SerializeField] internal GameObject m_configBrowserPrefab; BrowserTab _currentTab; readonly Dictionary _tabMap = new(); readonly Dictionary _tabs = new(); public ActionManager Actions { get; private set; } protected override void Awake() { base.Awake(); Actions = new ActionManager(); Actions.Changed += OnActionsChanged; Actions.Register(new PlayChartAction()); Actions.Register(new OpenConfigAction()); Actions.Register(new UseSkinAction()); var legacyStore = new LegacyResourceStore(Settings.Default.GameDataPath); OnTabClicked(AddPathedBrowserTab("Local Charts", new LegacyChartResourceManager(legacyStore))); AddPathedBrowserTab("Local Skins", new LegacySkinResourceManager(legacyStore)); AddPathedBrowserTab("Files", new FileSystemResourceManager()); AddTab("Settings", InitBrowser(m_settingsBrowser), _tabs.Count, false); } protected override void OnDestroy() { base.OnDestroy(); Actions.Changed -= OnActionsChanged; } BrowserTab AddPathedBrowserTab(string name, IPathedResourceManager manager) { var browser = InitBrowser(Instantiate(m_pathedBrowserPrefab, m_browserContainer, false).GetComponent()); browser.Init(manager); return AddTab(name, browser, _tabs.Count, false); } BrowserTab AddTab(string name, ResourceBrowser browser, int index, bool closable) { var tab = Instantiate(m_tabPrefab, m_tabContainer, false).GetComponent(); tab.transform.SetSiblingIndex(index); tab.Icon = browser.Icon; tab.Text = name; tab.Closable = closable; tab.Clicked += OnTabClicked; 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 int AddAndOpenTab(string name, ResourceBrowser browser) { InitBrowser(browser); browser.transform.SetParent(m_browserContainer, false); var tab = AddTab(name, browser, _currentTab.transform.GetSiblingIndex() + 1, true); OnTabClicked(tab); return tab.GetHashCode(); } public bool HasTab(int id) { return _tabMap.ContainsKey(id); } public bool TryOpenTab(int id) { if (_tabMap.TryGetValue(id, out BrowserTab tab)) { OnTabClicked(tab); return true; } return false; } void OnTabClicked(BrowserTab tab) { if (tab == _currentTab) return; if (_currentTab != null) { _currentTab.Selected = false; _tabs[_currentTab].gameObject.SetActive(false); } _currentTab = tab; if (_currentTab != null) { _currentTab.Selected = true; _tabs[_currentTab].gameObject.SetActive(true); } } void OnTabClosed(BrowserTab tab) { Destroy(tab.gameObject); Destroy(_tabs[tab].gameObject); _tabs.Remove(tab); _tabMap.Remove(tab.GetHashCode()); if (_currentTab == tab) _currentTab = null; } void OnActionsChanged() { foreach (var tab in _tabs) { tab.Value.OnActionsChanged(); } } public bool Back() { return true; // TODO } } }