Implement resource searching and directory items.
This commit is contained in:
@@ -15,6 +15,8 @@ namespace Cryville.Crtr.Browsing {
|
|||||||
|
|
||||||
void Activate();
|
void Activate();
|
||||||
void Deactivate();
|
void Deactivate();
|
||||||
|
|
||||||
|
void ApplyFilter(string filter);
|
||||||
}
|
}
|
||||||
public interface IResourceManager<out T> : IResourceManager where T : IResourceMeta {
|
public interface IResourceManager<out T> : IResourceManager where T : IResourceMeta {
|
||||||
new T this[int index] { get; }
|
new T this[int index] { get; }
|
||||||
@@ -23,6 +25,7 @@ namespace Cryville.Crtr.Browsing {
|
|||||||
event Action DirectoryChanged;
|
event Action DirectoryChanged;
|
||||||
IList<string> CurrentDirectory { get; }
|
IList<string> CurrentDirectory { get; }
|
||||||
void ChangeDirectory(IEnumerable<string> dir);
|
void ChangeDirectory(IEnumerable<string> dir);
|
||||||
|
bool IsDirectory(int index);
|
||||||
void OpenDirectory(int index);
|
void OpenDirectory(int index);
|
||||||
void ReturnToDirectory(int index);
|
void ReturnToDirectory(int index);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,9 +17,11 @@ namespace Cryville.Crtr.Browsing {
|
|||||||
DirectoryInfo _cd;
|
DirectoryInfo _cd;
|
||||||
readonly FileSystemWatcher _watcher = new FileSystemWatcher();
|
readonly FileSystemWatcher _watcher = new FileSystemWatcher();
|
||||||
DirectoryInfo[] _items = new DirectoryInfo[0];
|
DirectoryInfo[] _items = new DirectoryInfo[0];
|
||||||
|
DirectoryInfo[] _filteredItems = new DirectoryInfo[0];
|
||||||
|
string _filter = string.Empty;
|
||||||
readonly List<string> _dirParts = new List<string>();
|
readonly List<string> _dirParts = new List<string>();
|
||||||
public IList<string> CurrentDirectory { get { return _dirParts.AsReadOnly(); } }
|
public IList<string> CurrentDirectory { get { return _dirParts.AsReadOnly(); } }
|
||||||
public int Count { get { return _items.Length; } }
|
public int Count { get { return _filteredItems.Length; } }
|
||||||
|
|
||||||
static bool _init;
|
static bool _init;
|
||||||
|
|
||||||
@@ -56,7 +58,7 @@ namespace Cryville.Crtr.Browsing {
|
|||||||
|
|
||||||
void ReloadFiles() {
|
void ReloadFiles() {
|
||||||
_items = _cd.GetDirectories();
|
_items = _cd.GetDirectories();
|
||||||
ItemChanged?.Invoke();
|
ApplyFilter();
|
||||||
}
|
}
|
||||||
void OnDirectoryChange() {
|
void OnDirectoryChange() {
|
||||||
string path = Path.Combine(_rootPath, "charts", string.Join(Path.DirectorySeparatorChar, _dirParts));
|
string path = Path.Combine(_rootPath, "charts", string.Join(Path.DirectorySeparatorChar, _dirParts));
|
||||||
@@ -71,8 +73,9 @@ namespace Cryville.Crtr.Browsing {
|
|||||||
foreach (string dirPart in dir) _dirParts.Add(dirPart);
|
foreach (string dirPart in dir) _dirParts.Add(dirPart);
|
||||||
OnDirectoryChange();
|
OnDirectoryChange();
|
||||||
}
|
}
|
||||||
public void OpenDirectory(int id) {
|
public bool IsDirectory(int index) { return false; }
|
||||||
_dirParts.Add(_items[id].Name);
|
public void OpenDirectory(int index) {
|
||||||
|
_dirParts.Add(_filteredItems[index].Name);
|
||||||
OnDirectoryChange();
|
OnDirectoryChange();
|
||||||
}
|
}
|
||||||
public void ReturnToDirectory(int index) {
|
public void ReturnToDirectory(int index) {
|
||||||
@@ -80,9 +83,22 @@ namespace Cryville.Crtr.Browsing {
|
|||||||
OnDirectoryChange();
|
OnDirectoryChange();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void ApplyFilter(string filter) {
|
||||||
|
_filter = filter;
|
||||||
|
ApplyFilter();
|
||||||
|
}
|
||||||
|
void ApplyFilter() {
|
||||||
|
IEnumerable<DirectoryInfo> items = _items;
|
||||||
|
foreach (var keyword in _filter.Split(' ', StringSplitOptions.RemoveEmptyEntries)) {
|
||||||
|
items = items.Where(i => i.Name.Contains(keyword, StringComparison.CurrentCultureIgnoreCase));
|
||||||
|
}
|
||||||
|
_filteredItems = items.ToArray();
|
||||||
|
ItemChanged?.Invoke();
|
||||||
|
}
|
||||||
|
|
||||||
public ChartDetail this[int index] {
|
public ChartDetail this[int index] {
|
||||||
get {
|
get {
|
||||||
var item = _items[index];
|
var item = _filteredItems[index];
|
||||||
ChartMeta meta = null;
|
ChartMeta meta = null;
|
||||||
AsyncDelivery<Texture2D> cover = null;
|
AsyncDelivery<Texture2D> cover = null;
|
||||||
var metaFile = new FileInfo(Path.Combine(item.FullName, ".umgc"));
|
var metaFile = new FileInfo(Path.Combine(item.FullName, ".umgc"));
|
||||||
@@ -108,19 +124,19 @@ namespace Cryville.Crtr.Browsing {
|
|||||||
}
|
}
|
||||||
IResourceMeta IResourceManager.this[int index] { get { return this[index]; } }
|
IResourceMeta IResourceManager.this[int index] { get { return this[index]; } }
|
||||||
|
|
||||||
public Uri GetItemUri(int id) {
|
public Uri GetItemUri(int index) {
|
||||||
var item = _items[id];
|
var item = _filteredItems[index];
|
||||||
var meta = new ChartMeta();
|
var meta = new ChartMeta();
|
||||||
var metaFile = new FileInfo(Path.Combine(item.FullName, ".umgc"));
|
var metaFile = new FileInfo(Path.Combine(item.FullName, ".umgc"));
|
||||||
using (var reader = new StreamReader(metaFile.FullName)) {
|
using (var reader = new StreamReader(metaFile.FullName)) {
|
||||||
meta = JsonConvert.DeserializeObject<ChartMeta>(reader.ReadToEnd());
|
meta = JsonConvert.DeserializeObject<ChartMeta>(reader.ReadToEnd());
|
||||||
}
|
}
|
||||||
return new Uri(PlatformConfig.FileProtocolPrefix + Path.Combine(_items[id].FullName, string.Format("{0}.json", meta.data)));
|
return new Uri(PlatformConfig.FileProtocolPrefix + Path.Combine(_filteredItems[index].FullName, string.Format("{0}.json", meta.data)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool IsReadOnly { get { return false; } }
|
public bool IsReadOnly { get { return false; } }
|
||||||
public void RemoveAt(int index) {
|
public void RemoveAt(int index) {
|
||||||
_items[index].Delete(true);
|
_filteredItems[index].Delete(true);
|
||||||
}
|
}
|
||||||
public bool ImportFrom(Uri uri) {
|
public bool ImportFrom(Uri uri) {
|
||||||
if (!uri.IsFile) throw new NotSupportedException();
|
if (!uri.IsFile) throw new NotSupportedException();
|
||||||
|
|||||||
@@ -99,18 +99,34 @@ namespace Cryville.Crtr.Browsing.UI {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public override void OnItemClicked(int id) {
|
public override void OnItemClicked(int id) {
|
||||||
foreach (var item in _selectedItems) _items[item].OnDeselect();
|
if (_manager.IsDirectory(id)) {
|
||||||
_selectedItems.Clear();
|
_manager.OpenDirectory(id);
|
||||||
_items[id].OnSelect();
|
}
|
||||||
_selectedItems.Add(id);
|
else {
|
||||||
var res = _manager[id];
|
foreach (var item in _selectedItems) _items[item].OnDeselect();
|
||||||
m_detailPanel.Load(res);
|
_selectedItems.Clear();
|
||||||
m_actionBar.Load(this, Master.Actions.GetActions(res.GetType()).Except(_importActionArray));
|
_items[id].OnSelect();
|
||||||
|
_selectedItems.Add(id);
|
||||||
|
var res = _manager[id];
|
||||||
|
m_detailPanel.Load(res);
|
||||||
|
m_actionBar.Load(this, Master.Actions.GetActions(res.GetType()).Except(_importActionArray));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnPathClicked(int index) {
|
public void OnPathClicked(int index) {
|
||||||
_manager.ReturnToDirectory(index);
|
_manager.ReturnToDirectory(index);
|
||||||
}
|
}
|
||||||
|
public void OnHomeClicked() {
|
||||||
|
_manager.ChangeDirectory(Enumerable.Empty<string>());
|
||||||
|
}
|
||||||
|
public void OnParentClicked() {
|
||||||
|
var depth = _manager.CurrentDirectory.Count;
|
||||||
|
if (depth <= 0) return;
|
||||||
|
_manager.ReturnToDirectory(_manager.CurrentDirectory.Count - 2);
|
||||||
|
}
|
||||||
|
public void OnSearch(string value) {
|
||||||
|
_manager.ApplyFilter(value);
|
||||||
|
}
|
||||||
|
|
||||||
public void OnDeleteClicked() {
|
public void OnDeleteClicked() {
|
||||||
if (_selectedItems.Count == 0) {
|
if (_selectedItems.Count == 0) {
|
||||||
|
|||||||
Reference in New Issue
Block a user