aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/FSE/Modules/Tango.FSE.PPCConsole/ViewModels/FileSystemViewVM.cs
diff options
context:
space:
mode:
authorAvi Levkovich <avi@twine-s.com>2020-03-25 17:43:49 +0200
committerAvi Levkovich <avi@twine-s.com>2020-03-25 17:43:49 +0200
commitd29da53d6f71f45749c0ede5b4cd7281ed3a270e (patch)
treefd83afc7771c0f4f19c581e1cf407bcf7c14818b /Software/Visual_Studio/FSE/Modules/Tango.FSE.PPCConsole/ViewModels/FileSystemViewVM.cs
parent0208e9f1800c044ec3bd002b7aa7fd00621c81be (diff)
downloadTango-d29da53d6f71f45749c0ede5b4cd7281ed3a270e.tar.gz
Tango-d29da53d6f71f45749c0ede5b4cd7281ed3a270e.zip
merge
Diffstat (limited to 'Software/Visual_Studio/FSE/Modules/Tango.FSE.PPCConsole/ViewModels/FileSystemViewVM.cs')
-rw-r--r--Software/Visual_Studio/FSE/Modules/Tango.FSE.PPCConsole/ViewModels/FileSystemViewVM.cs243
1 files changed, 243 insertions, 0 deletions
diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.PPCConsole/ViewModels/FileSystemViewVM.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.PPCConsole/ViewModels/FileSystemViewVM.cs
new file mode 100644
index 000000000..cba25303e
--- /dev/null
+++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.PPCConsole/ViewModels/FileSystemViewVM.cs
@@ -0,0 +1,243 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Input;
+using Tango.Core.Commands;
+using Tango.FileSystem;
+using Tango.FSE.Common;
+using Tango.FSE.Common.Connection;
+using Tango.FSE.Common.FileSystem;
+using static Tango.SharedUI.Controls.NavigationControl;
+
+namespace Tango.FSE.PPCConsole.ViewModels
+{
+ public class FileSystemViewVM : FSEViewModel, INavigationViewModel
+ {
+ private FileSystemItem _currentItem;
+ public FileSystemItem CurrentItem
+ {
+ get { return _currentItem; }
+ set { _currentItem = value; RaisePropertyChangedAuto(); OnCurrentItemChanged(); }
+ }
+
+ private String _currentPath;
+ public String CurrentPath
+ {
+ get { return _currentPath; }
+ set { _currentPath = value; RaisePropertyChangedAuto(); }
+ }
+
+ private List<DriveItem> _drives;
+ public List<DriveItem> Drives
+ {
+ get { return _drives; }
+ set { _drives = value; RaisePropertyChangedAuto(); }
+ }
+
+ public ObservableCollection<FileSystemItem> SelectedItems { get; set; }
+ public ObservableCollection<FileSystemHandler> FileSystemHandlers { get; set; }
+
+ public RelayCommand NavigateCommand { get; set; }
+ public RelayCommand<FileSystemItem> OpenItemCommand { get; set; }
+ public RelayCommand BackCommand { get; set; }
+ public RelayCommand<String> NavigateSpecialFolderCommand { get; set; }
+ public RelayCommand<String> NavigateToFolderCommand { get; set; }
+ public RelayCommand<IList<FileSystemItem>> DeleteCommand { get; set; }
+ public RelayCommand<List<FileSystemItem>> DropCommand { get; set; }
+ public RelayCommand<List<DragItem>> DragCommand { get; set; }
+ public RelayCommand<FileSystemHandler> DeleteFileSystemHandlerCommand { get; set; }
+ public RelayCommand<FileSystemHandler> OpenFileSystemHandlerDestinationCommand { get; set; }
+ public RelayCommand<FileSystemHandler> RetryFailedFileSystemHandlerCommand { get; set; }
+
+
+ public FileSystemViewVM()
+ {
+ SelectedItems = new ObservableCollection<FileSystemItem>();
+ FileSystemHandlers = new ObservableCollection<FileSystemHandler>();
+ NavigateCommand = new RelayCommand(NavigateToCurrentPath);
+ OpenItemCommand = new RelayCommand<FileSystemItem>(OpenFileSystemItem);
+ BackCommand = new RelayCommand(NavigateBack, () => !(CurrentItem is FolderItem) || !(CurrentItem as FolderItem).IsRoot);
+ NavigateSpecialFolderCommand = new RelayCommand<string>(NavigateToSpecialFolder);
+ NavigateToFolderCommand = new RelayCommand<string>(async (x) => await Navigate(x));
+ DeleteCommand = new RelayCommand<IList<FileSystemItem>>(DeleteSelectedItems);
+ DragCommand = new RelayCommand<List<DragItem>>(OnItemsDraggedOut);
+ DeleteFileSystemHandlerCommand = new RelayCommand<FileSystemHandler>(DeleteFileSystemHandler);
+ OpenFileSystemHandlerDestinationCommand = new RelayCommand<FileSystemHandler>(OpenFileSystemHandlerDestination);
+ RetryFailedFileSystemHandlerCommand = new RelayCommand<FileSystemHandler>(RetryFailedFileSystemHandler);
+ }
+
+ private async void NavigateBack()
+ {
+ if (CurrentItem.Path.Length == 3)
+ {
+ await Navigate(null);
+ }
+ else
+ {
+ String parent = Path.GetDirectoryName(CurrentItem.Path);
+ await Navigate(parent);
+ }
+ }
+
+ public override void OnApplicationStarted()
+ {
+ base.OnApplicationStarted();
+ MachineProvider.MachineConnected += MachineProvider_MachineConnected;
+ }
+
+ public override void OnApplicationReady()
+ {
+ base.OnApplicationReady();
+ }
+
+ private async void MachineProvider_MachineConnected(object sender, MachineConnectedEventArgs e)
+ {
+ await Navigate(null);
+ }
+
+ private async void NavigateToCurrentPath()
+ {
+ await Navigate(CurrentPath);
+ }
+
+ private async void OpenFileSystemItem(FileSystemItem item)
+ {
+ if (item == null) return;
+
+ if (item.Type == FileSystemItemType.Folder || item.Type == FileSystemItemType.Drive)
+ {
+ await Navigate(item.Path);
+ }
+ else if (item.Type == FileSystemItemType.File)
+ {
+ //TODO: Download/Open file?...
+ }
+ }
+
+ private async void DeleteSelectedItems(IList<FileSystemItem> items)
+ {
+ if (items != null && items.Count > 0)
+ {
+ if (await NotificationProvider.ShowWarningQuestion("Are you sure you want to delete the selected files/folders?", "DELETE"))
+ {
+ //TODO: Delete items
+ }
+ }
+ }
+
+ private async void OnItemsDraggedOut(List<DragItem> items)
+ {
+ foreach (var item in items.Where(x => x.FileSystemItem.Type != FileSystemItemType.Drive))
+ {
+ Debug.WriteLine($"Dropped out: {item.FileSystemItem.Name} => {item.Destination}");
+ var handler = await FileSystemProvider.Download(item.FileSystemItem, item.Destination);
+ FileSystemHandlers.Insert(0, handler);
+ }
+ }
+
+ private async void DeleteFileSystemHandler(FileSystemHandler handler)
+ {
+ if (handler.Status != FileSystemHandlerStatus.Completed && handler.Status != FileSystemHandlerStatus.Failed)
+ {
+ if (await NotificationProvider.ShowWarningQuestion($"This item is currently {handler.Status}. Do you wish to abort and delete this item?"))
+ {
+ try
+ {
+ handler.Abort();
+ }
+ catch { }
+
+ FileSystemHandlers.Remove(handler);
+ }
+ }
+ else
+ {
+ FileSystemHandlers.Remove(handler);
+ }
+ }
+
+ private void OpenFileSystemHandlerDestination(FileSystemHandler handler)
+ {
+ String destination = String.Empty;
+
+ if (File.Exists(handler.Destination) || Directory.Exists(handler.Destination))
+ {
+ destination = handler.Destination;
+ Process.Start("explorer.exe", string.Format("/select,\"{0}\"", destination));
+ }
+ else
+ {
+ destination = Path.GetDirectoryName(handler.Destination);
+ Process.Start("explorer.exe", destination);
+ }
+ }
+
+ private async void RetryFailedFileSystemHandler(FileSystemHandler handler)
+ {
+ if (handler.Status == FileSystemHandlerStatus.Failed)
+ {
+ var newHandler = await FileSystemProvider.Download(handler.FileSystemItem, Path.GetDirectoryName(handler.Destination));
+ FileSystemHandlers.Replace(handler, newHandler);
+ }
+ }
+
+ private async void NavigateToSpecialFolder(string folder)
+ {
+ Environment.SpecialFolder specialFolder = (Environment.SpecialFolder)Enum.Parse(typeof(Environment.SpecialFolder), folder);
+ await Navigate(null, specialFolder);
+ }
+
+ private async Task Navigate(String path, Environment.SpecialFolder? specialFolder = null)
+ {
+ try
+ {
+ IsFree = false;
+
+ Mouse.OverrideCursor = Cursors.AppStarting;
+
+ if (path != null)
+ {
+ CurrentItem = await FileSystemProvider.GetFolder(path) as FileSystemItem;
+ }
+ else if (specialFolder != null)
+ {
+ CurrentItem = await FileSystemProvider.GetSpecialFolder(specialFolder.Value) as FileSystemItem;
+ }
+ else
+ {
+ CurrentItem = await FileSystemProvider.GetThisPC() as FileSystemItem;
+ try
+ {
+ Drives = (CurrentItem as IFileSystemContainer).Items.Cast<DriveItem>().ToList();
+ }
+ catch (Exception ex)
+ {
+ LogManager.Log(ex, "Error setting file system drives menu.");
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ IsFree = true;
+ Mouse.OverrideCursor = null;
+ await NotificationProvider.ShowError($"Error navigating to the specified path.\n{ex.FlattenMessage()}");
+ }
+ finally
+ {
+ IsFree = true;
+ Mouse.OverrideCursor = null;
+ }
+ }
+
+ private void OnCurrentItemChanged()
+ {
+ CurrentPath = CurrentItem.Path;
+ InvalidateRelayCommands();
+ }
+ }
+}