Files
crtr/Assets/Cryville/Crtr/Browsing/UI/PathedResourceBrowser.cs
2023-11-23 00:57:22 +08:00

126 lines
3.3 KiB
C#

using Cryville.Common.Unity.UI;
using Cryville.Crtr.Browsing.Actions;
using Cryville.Crtr.UI;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
namespace Cryville.Crtr.Browsing.UI {
public class PathedResourceBrowser : ResourceBrowser {
[SerializeField]
Button[] m_writeTools;
[SerializeField]
TextMeshProUGUI m_pathText;
[SerializeField]
ScrollableItemGrid m_itemContainer;
[SerializeField]
DetailPanel m_detailPanel;
[SerializeField]
GameObject m_actionBar;
IPathedResourceManager<ChartDetail> _manager;
IResourceAction _importAction;
readonly HashSet<int> _selectedItems = new HashSet<int>();
readonly Dictionary<int, BrowserItem> _items = new Dictionary<int, BrowserItem>();
protected virtual void Start() {
m_itemContainer.LoadItem = LoadItem;
}
void OnDestroy() {
UnregisterManager();
}
void UnregisterManager() {
Master.Actions.Unregister(_importAction);
_manager.ItemChanged -= OnItemChanged;
_manager.DirectoryChanged -= OnDirectoryChanged;
}
void OnEnable() {
_manager.Activate();
}
void OnDisable() {
_manager.Deactivate();
}
public void Init(ResourceBrowserMaster master, IPathedResourceManager<ChartDetail> manager) {
if (_manager != null) {
UnregisterManager();
}
Init(master);
_manager = manager;
_manager.ItemChanged += OnItemChanged;
_manager.DirectoryChanged += OnDirectoryChanged;
Master.Actions.Register(_importAction = new ImportResourceAction(_manager));
foreach (var tool in m_writeTools) tool.interactable = !_manager.IsReadOnly;
OnItemChanged();
OnDirectoryChanged();
}
bool _itemChanged;
void OnItemChanged() {
_itemChanged = true;
}
void OnDirectoryChanged() {
if (_manager.CurrentDirectory.Count == 0) m_pathText.text = "(Home)";
else m_pathText.text = string.Join(Path.DirectorySeparatorChar, _manager.CurrentDirectory);
}
void Update() {
if (_itemChanged) {
_itemChanged = false;
_selectedItems.Clear();
_items.Clear();
m_itemContainer.ItemCount = _manager.Count;
m_detailPanel.Clear();
}
}
private bool LoadItem(int id, GameObject obj) {
var bi = obj.GetComponent<BrowserItem>();
_items[id] = bi;
try {
var item = _manager[id];
bi.Load(id, item, _selectedItems.Contains(id));
}
catch (Exception) {
bi.Load(id, default(ChartDetail), _selectedItems.Contains(id));
}
return true;
}
public virtual void OnDirectoryItemClicked(int id) {
_manager.OpenDirectory(id);
}
public void OnObjectItemClicked(int id) {
foreach (var item in _selectedItems) _items[item].OnDeselect();
_selectedItems.Clear();
_items[id].OnSelect();
_selectedItems.Add(id);
m_detailPanel.Load(_manager[id]);
m_actionBar.SetActive(true);
}
public void OnPathClicked(int index) {
_manager.ReturnToDirectory(index);
}
public void OnDeleteClicked() {
if (_selectedItems.Count == 0) {
Popup.Create("No item is selected.");
return;
}
Dialog.Show(DeleteSelectedItems, "Are you sure to delete the selected item(s)?", "Yes", "No");
}
void DeleteSelectedItems(int result) {
if (result != 0) return;
foreach (var item in _selectedItems.OrderByDescending(i => i)) _manager.RemoveAt(item);
}
}
}