using Cryville.Common.Unity; 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] ScrollableItemGrid m_itemContainer; [SerializeField] DetailPanel m_detailPanel; [SerializeField] GameObject m_actionBar; IPathedResourceManager _manager; IResourceAction _importAction; readonly HashSet _selectedItems = new HashSet(); readonly Dictionary _items = new Dictionary(); [Obsolete] FileDialog _dialog; protected virtual void Start() { m_itemContainer.LoadItem = LoadItem; InitDialog(); } 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 manager) { if (_manager != null) { UnregisterManager(); } Init(master); _manager = manager; _manager.ItemChanged += OnItemChanged; _manager.DirectoryChanged += OnDirectoryChanged; Master.Actions.Register(_importAction = new ImportResourceAction(_manager)); OnItemChanged(); OnDirectoryChanged(); } bool _itemChanged; void OnItemChanged() { _itemChanged = true; } void OnDirectoryChanged() { } void Update() { if (_itemChanged) { _itemChanged = false; _selectedItems.Clear(); _items.Clear(); m_itemContainer.ItemCount = _manager.Count; } } private bool LoadItem(int id, GameObject obj) { var bi = obj.GetComponent(); _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); } [Obsolete] public void OnAddButtonClicked() { _dialog.Show(); } [Obsolete] private void OnAddDialogClosed() { if (_dialog.FileName == null) return; if (ResourceManager.ImportItemFrom(new Uri(_dialog.FileName))) { Popup.Create("Import succeeded"); } else { Popup.Create("Import failed"); } } } }