118 lines
3.6 KiB
C#
118 lines
3.6 KiB
C#
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<ResourceBrowserMaster> {
|
|
[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<int, BrowserTab> _tabMap = new();
|
|
readonly Dictionary<BrowserTab, ResourceBrowser> _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<IResourceMeta> manager) {
|
|
var browser = InitBrowser(Instantiate(m_pathedBrowserPrefab, m_browserContainer, false).GetComponent<PathedResourceBrowser>());
|
|
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<BrowserTab>();
|
|
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>(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
|
|
}
|
|
}
|
|
}
|