using Cryville.Common.Unity; using Cryville.Crtr.Browsing.Actions; 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 _tabs = new Dictionary(); 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()); OnTabClicked(AddPathedBrowserTab("Local", new LegacyResourceManager(Settings.Default.GameDataPath))); AddPathedBrowserTab("Files", new FileSystemResourceManager()); AddTab("Settings", m_settingsBrowser, _tabs.Count, false); } BrowserTab AddPathedBrowserTab(string name, IPathedResourceManager manager) { var browser = 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) { browser.Init(this); 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); return tab; } public void AddAndOpenTab(string name, ResourceBrowser browser) { browser.transform.SetParent(m_browserContainer, false); OnTabClicked(AddTab(name, browser, _currentTab.transform.GetSiblingIndex() + 1, true)); } 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); if (_currentTab == tab) _currentTab = null; } void OnActionsChanged() { foreach (var tab in _tabs) { tab.Value.OnActionsChanged(); } } public bool Back() { return true; // TODO } } }