Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixed copying and cutting keyboard shortcuts #4207

Merged
merged 2 commits into from
Mar 21, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
153 changes: 153 additions & 0 deletions Files/Helpers/UIFilesystemHelpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,164 @@
using System.Threading.Tasks;
using Windows.ApplicationModel.DataTransfer;
using Windows.Storage;
using System.Collections.Generic;
using Windows.ApplicationModel.AppService;
using Windows.Foundation.Collections;
using System.Linq;

namespace Files.Helpers
{
public static class UIFilesystemHelpers
{
public static async void CutItem(IShellPage associatedInstance)
{
DataPackage dataPackage = new DataPackage
{
RequestedOperation = DataPackageOperation.Move
};
List<IStorageItem> items = new List<IStorageItem>();
FilesystemResult result = (FilesystemResult)false;

if (associatedInstance.SlimContentPage.IsItemSelected)
{
// First, reset DataGrid Rows that may be in "cut" command mode
associatedInstance.SlimContentPage.ResetItemOpacity();

foreach (ListedItem listedItem in associatedInstance.SlimContentPage.SelectedItems)
{
// Dim opacities accordingly
associatedInstance.SlimContentPage.SetItemOpacity(listedItem);

if (listedItem.PrimaryItemAttribute == StorageItemTypes.File)
{
result = await associatedInstance.FilesystemViewModel.GetFileFromPathAsync(listedItem.ItemPath)
.OnSuccess(t => items.Add(t));
if (!result)
{
break;
}
}
else
{
result = await associatedInstance.FilesystemViewModel.GetFolderFromPathAsync(listedItem.ItemPath)
.OnSuccess(t => items.Add(t));
if (!result)
{
break;
}
}
}
if (result.ErrorCode == FileSystemStatusCode.NotFound)
{
associatedInstance.SlimContentPage.ResetItemOpacity();
return;
}
else if (result.ErrorCode == FileSystemStatusCode.Unauthorized)
{
// Try again with fulltrust process
if (associatedInstance.ServiceConnection != null)
{
string filePaths = string.Join('|', associatedInstance.SlimContentPage.SelectedItems.Select(x => x.ItemPath));
AppServiceResponseStatus status = await associatedInstance.ServiceConnection.SendMessageAsync(new ValueSet()
{
{ "Arguments", "FileOperation" },
{ "fileop", "Clipboard" },
{ "filepath", filePaths },
{ "operation", (int)DataPackageOperation.Move }
});
if (status == AppServiceResponseStatus.Success)
{
return;
}
}
associatedInstance.SlimContentPage.ResetItemOpacity();
return;
}
}

if (!items.Any())
{
return;
}
dataPackage.SetStorageItems(items);
try
{
Clipboard.SetContent(dataPackage);
Clipboard.Flush();
}
catch
{
dataPackage = null;
}
}

public static async void CopyItem(IShellPage associatedInstance)
{
DataPackage dataPackage = new DataPackage()
{
RequestedOperation = DataPackageOperation.Copy
};
List<IStorageItem> items = new List<IStorageItem>();

string copySourcePath = associatedInstance.FilesystemViewModel.WorkingDirectory;
FilesystemResult result = (FilesystemResult)false;

if (associatedInstance.SlimContentPage.IsItemSelected)
{
foreach (ListedItem listedItem in associatedInstance.SlimContentPage.SelectedItems)
{
if (listedItem.PrimaryItemAttribute == StorageItemTypes.File)
{
result = await associatedInstance.FilesystemViewModel.GetFileFromPathAsync(listedItem.ItemPath)
.OnSuccess(t => items.Add(t));
if (!result)
{
break;
}
}
else
{
result = await associatedInstance.FilesystemViewModel.GetFolderFromPathAsync(listedItem.ItemPath)
.OnSuccess(t => items.Add(t));
if (!result)
{
break;
}
}
}
if (result.ErrorCode == FileSystemStatusCode.Unauthorized)
{
// Try again with fulltrust process
if (associatedInstance.ServiceConnection != null)
{
string filePaths = string.Join('|', associatedInstance.SlimContentPage.SelectedItems.Select(x => x.ItemPath));
await associatedInstance.ServiceConnection.SendMessageAsync(new ValueSet()
{
{ "Arguments", "FileOperation" },
{ "fileop", "Clipboard" },
{ "filepath", filePaths },
{ "operation", (int)DataPackageOperation.Copy }
});
}
return;
}
}

if (items?.Count > 0)
{
dataPackage.SetStorageItems(items);
try
{
Clipboard.SetContent(dataPackage);
Clipboard.Flush();
}
catch
{
dataPackage = null;
}
}
}

public static async Task PasteItemAsync(string destinationPath, IShellPage associatedInstance)
{
DataPackageView packageView = await FilesystemTasks.Wrap(() => Task.FromResult(Clipboard.GetContent()));
Expand Down
147 changes: 4 additions & 143 deletions Files/Interacts/BaseLayoutCommandImplementationModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -158,153 +158,14 @@ public virtual void QuickLook(RoutedEventArgs e)
QuickLookHelpers.ToggleQuickLook(associatedInstance);
}

public virtual async void CopyItem(RoutedEventArgs e)
public virtual void CopyItem(RoutedEventArgs e)
{
DataPackage dataPackage = new DataPackage()
{
RequestedOperation = DataPackageOperation.Copy
};
List<IStorageItem> items = new List<IStorageItem>();

string copySourcePath = associatedInstance.FilesystemViewModel.WorkingDirectory;
FilesystemResult result = (FilesystemResult)false;

if (SlimContentPage.IsItemSelected)
{
foreach (ListedItem listedItem in SlimContentPage.SelectedItems)
{
if (listedItem.PrimaryItemAttribute == StorageItemTypes.File)
{
result = await associatedInstance.FilesystemViewModel.GetFileFromPathAsync(listedItem.ItemPath)
.OnSuccess(t => items.Add(t));
if (!result)
{
break;
}
}
else
{
result = await associatedInstance.FilesystemViewModel.GetFolderFromPathAsync(listedItem.ItemPath)
.OnSuccess(t => items.Add(t));
if (!result)
{
break;
}
}
}
if (result.ErrorCode == FileSystemStatusCode.Unauthorized)
{
// Try again with fulltrust process
if (ServiceConnection != null)
{
string filePaths = string.Join('|', SlimContentPage.SelectedItems.Select(x => x.ItemPath));
await ServiceConnection.SendMessageAsync(new ValueSet()
{
{ "Arguments", "FileOperation" },
{ "fileop", "Clipboard" },
{ "filepath", filePaths },
{ "operation", (int)DataPackageOperation.Copy }
});
}
return;
}
}

if (items?.Count > 0)
{
dataPackage.SetStorageItems(items);
try
{
Clipboard.SetContent(dataPackage);
Clipboard.Flush();
}
catch
{
dataPackage = null;
}
}
UIFilesystemHelpers.CopyItem(associatedInstance);
}

public virtual async void CutItem(RoutedEventArgs e)
public virtual void CutItem(RoutedEventArgs e)
{
DataPackage dataPackage = new DataPackage
{
RequestedOperation = DataPackageOperation.Move
};
List<IStorageItem> items = new List<IStorageItem>();
FilesystemResult result = (FilesystemResult)false;

if (SlimContentPage.IsItemSelected)
{
// First, reset DataGrid Rows that may be in "cut" command mode
SlimContentPage.ResetItemOpacity();

foreach (ListedItem listedItem in SlimContentPage.SelectedItems)
{
// Dim opacities accordingly
SlimContentPage.SetItemOpacity(listedItem);

if (listedItem.PrimaryItemAttribute == StorageItemTypes.File)
{
result = await associatedInstance.FilesystemViewModel.GetFileFromPathAsync(listedItem.ItemPath)
.OnSuccess(t => items.Add(t));
if (!result)
{
break;
}
}
else
{
result = await associatedInstance.FilesystemViewModel.GetFolderFromPathAsync(listedItem.ItemPath)
.OnSuccess(t => items.Add(t));
if (!result)
{
break;
}
}
}
if (result.ErrorCode == FileSystemStatusCode.NotFound)
{
SlimContentPage.ResetItemOpacity();
return;
}
else if (result.ErrorCode == FileSystemStatusCode.Unauthorized)
{
// Try again with fulltrust process
if (ServiceConnection != null)
{
string filePaths = string.Join('|', SlimContentPage.SelectedItems.Select(x => x.ItemPath));
AppServiceResponseStatus status = await ServiceConnection.SendMessageAsync(new ValueSet()
{
{ "Arguments", "FileOperation" },
{ "fileop", "Clipboard" },
{ "filepath", filePaths },
{ "operation", (int)DataPackageOperation.Move }
});
if (status == AppServiceResponseStatus.Success)
{
return;
}
}
SlimContentPage.ResetItemOpacity();
return;
}
}

if (!items.Any())
{
return;
}
dataPackage.SetStorageItems(items);
try
{
Clipboard.SetContent(dataPackage);
Clipboard.Flush();
}
catch
{
dataPackage = null;
}
UIFilesystemHelpers.CutItem(associatedInstance);
}

public virtual async void RestoreItem(RoutedEventArgs e)
Expand Down
4 changes: 2 additions & 2 deletions Files/Views/ModernShellPage.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -980,7 +980,7 @@ await FilesystemHelpers.DeleteItemsAsync(
case (true, false, false, true, VirtualKey.C): // ctrl + c, copy
if (!NavigationToolbar.IsEditModeEnabled && !ContentPage.IsRenamingItem)
{
FilePropertiesHelpers.ShowProperties(this);
UIFilesystemHelpers.CopyItem(this);
}

break;
Expand All @@ -996,7 +996,7 @@ await FilesystemHelpers.DeleteItemsAsync(
case (true, false, false, true, VirtualKey.X): // ctrl + x, cut
if (!NavigationToolbar.IsEditModeEnabled && !ContentPage.IsRenamingItem)
{
FilePropertiesHelpers.ShowProperties(this);
UIFilesystemHelpers.CutItem(this);
}

break;
Expand Down