diff --git a/Files/BaseLayout.cs b/Files/BaseLayout.cs index 4bbc9287df2d..e88922bfe3bc 100644 --- a/Files/BaseLayout.cs +++ b/Files/BaseLayout.cs @@ -1,40 +1,26 @@ -using Files.Common; -using Files.DataModels; -using Files.Dialogs; -using Files.EventArguments; +using Files.EventArguments; using Files.Extensions; using Files.Filesystem; using Files.Helpers; using Files.Helpers.ContextFlyouts; using Files.Interacts; -using Files.UserControls; using Files.ViewModels; using Files.Views; -using Microsoft.Toolkit.Mvvm.Input; using Microsoft.Toolkit.Uwp; using Microsoft.Toolkit.Uwp.UI; -using Newtonsoft.Json; using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; -using System.IO; using System.Linq; using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using Windows.ApplicationModel.AppService; using Windows.ApplicationModel.DataTransfer; -using Windows.Foundation; -using Windows.Foundation.Collections; using Windows.Storage; using Windows.System; using Windows.UI.Core; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; -using Windows.UI.Xaml.Controls.Primitives; -using Windows.UI.Xaml.Input; -using Windows.UI.Xaml.Media.Imaging; using Windows.UI.Xaml.Navigation; using static Files.Helpers.PathNormalization; @@ -130,8 +116,8 @@ public string JumpString if (jumpedToItem != null) { - SetSelectedItemOnUi(jumpedToItem); - ScrollIntoView(jumpedToItem); + ItemManipulationModel.SetSelectedItem(jumpedToItem); + ItemManipulationModel.ScrollIntoView(jumpedToItem); } // Restart the timer @@ -196,7 +182,7 @@ internal set } } NotifyPropertyChanged(nameof(SelectedItems)); - SetDragModeForItems(); + ItemManipulationModel.SetDragModeForItems(); } } } @@ -207,6 +193,10 @@ internal set public BaseLayout() { + ItemManipulationModel = new ItemManipulationModel(); + + HookEvents(); + jumpTimer = new DispatcherTimer(); jumpTimer.Interval = TimeSpan.FromSeconds(0.8); jumpTimer.Tick += JumpTimer_Tick; @@ -226,6 +216,12 @@ public BaseLayout() dragOverTimer = DispatcherQueue.GetForCurrentThread().CreateTimer(); } + protected abstract void HookEvents(); + + protected abstract void UnhookEvents(); + + public ItemManipulationModel ItemManipulationModel { get; private set; } + private void JumpTimer_Tick(object sender, object e) { jumpString = string.Empty; @@ -234,54 +230,8 @@ private void JumpTimer_Tick(object sender, object e) protected abstract void InitializeCommandsViewModel(); - public abstract void FocusFileList(); - - public abstract void SelectAllItems(); - - public virtual void InvertSelection() - { - List newSelectedItems = GetAllItems() - .Cast() - .Except(SelectedItems) - .ToList(); - - SetSelectedItemsOnUi(newSelectedItems); - } - - public abstract void ClearSelection(); - - public abstract void SetDragModeForItems(); - - public abstract void ScrollIntoView(ListedItem item); - - protected abstract void AddSelectedItem(ListedItem item); - protected abstract IEnumerable GetAllItems(); - public virtual void SetSelectedItemOnUi(ListedItem selectedItem) - { - ClearSelection(); - AddSelectedItem(selectedItem); - } - - public virtual void SetSelectedItemsOnUi(List selectedItems) - { - ClearSelection(); - AddSelectedItemsOnUi(selectedItems); - } - - public virtual void AddSelectedItemsOnUi(List selectedItems) - { - foreach (ListedItem selectedItem in selectedItems) - { - AddSelectedItem(selectedItem); - } - } - - public abstract void FocusSelectedItems(); - - public abstract void StartRenameItem(); - public virtual void ResetItemOpacity() { IEnumerable items = GetAllItems(); @@ -294,7 +244,7 @@ public virtual void ResetItemOpacity() { if (listedItem.IsHiddenItem) { - listedItem.Opacity = 0.4; + listedItem.Opacity = Constants.UI.DimItemOpacity; } else { @@ -303,11 +253,6 @@ public virtual void ResetItemOpacity() } } - public virtual void SetItemOpacity(ListedItem item) - { - item.Opacity = 0.4; - } - protected abstract ListedItem GetItemFromElement(object element); private void FolderSettings_LayoutModeChangeRequested(object sender, LayoutModeEventArgs e) @@ -407,7 +352,7 @@ protected override async void OnNavigatedTo(NavigationEventArgs eventArgs) FolderSettings.IsLayoutModeChanging = false; - FocusFileList(); // Set focus on layout specific file list control + ItemManipulationModel.FocusFileList(); // Set focus on layout specific file list control try { @@ -419,7 +364,7 @@ protected override async void OnNavigatedTo(NavigationEventArgs eventArgs) liItemsToSelect.Add(ParentShellPageInstance.FilesystemViewModel.FilesAndFolders.Where((li) => li.ItemName == item).First()); } - SetSelectedItemsOnUi(liItemsToSelect); + ItemManipulationModel.SetSelectedItems(liItemsToSelect); } } catch (Exception e) @@ -549,7 +494,7 @@ protected async void Item_DragOver(object sender, DragEventArgs e) item = gvi.Content as ListedItem; } - SetSelectedItemOnUi(item); + ItemManipulationModel.SetSelectedItem(item); if (dragOverItem != item) { @@ -661,10 +606,5 @@ protected void UninitializeDrag(UIElement element) public readonly VirtualKey MinusKey = (VirtualKey)189; public abstract void Dispose(); - - public void RefreshItems() - { - ParentShellPageInstance.Refresh_Click(); - } } } \ No newline at end of file diff --git a/Files/Constants.cs b/Files/Constants.cs index ca4f2593875d..b12ddda8f41f 100644 --- a/Files/Constants.cs +++ b/Files/Constants.cs @@ -2,6 +2,11 @@ { public static class Constants { + public static class UI + { + public const float DimItemOpacity = 0.4f; + } + public static class Browser { public static class GridViewBrowser diff --git a/Files/Files.csproj b/Files/Files.csproj index 42bff2240c41..eabb24bb8c15 100644 --- a/Files/Files.csproj +++ b/Files/Files.csproj @@ -228,6 +228,7 @@ + RestartControl.xaml diff --git a/Files/Filesystem/FilesystemOperations/FilesystemOperations.cs b/Files/Filesystem/FilesystemOperations/FilesystemOperations.cs index a8ad7ab77667..569903220905 100644 --- a/Files/Filesystem/FilesystemOperations/FilesystemOperations.cs +++ b/Files/Filesystem/FilesystemOperations/FilesystemOperations.cs @@ -3,6 +3,7 @@ using Files.Extensions; using Files.Filesystem.FilesystemHistory; using Files.Helpers; +using Files.Interacts; using Microsoft.Toolkit.Uwp; using Microsoft.Toolkit.Uwp.Helpers; using System; @@ -32,6 +33,8 @@ public class FilesystemOperations : IFilesystemOperations private IShellPage associatedInstance; + private ItemManipulationModel itemManipulationModel => associatedInstance.SlimContentPage?.ItemManipulationModel; + private RecycleBinHelpers recycleBinHelpers; #endregion Private Members @@ -249,8 +252,8 @@ await Windows.ApplicationModel.Core.CoreApplication.MainView.DispatcherQueue.Enq if (copiedListedItems.Count > 0) { - associatedInstance.SlimContentPage.AddSelectedItemsOnUi(copiedListedItems); - associatedInstance.SlimContentPage.FocusSelectedItems(); + itemManipulationModel.AddSelectedItems(copiedListedItems); + itemManipulationModel.FocusSelectedItems(); } }, Windows.System.DispatcherQueuePriority.Low); } @@ -432,8 +435,8 @@ await Windows.ApplicationModel.Core.CoreApplication.MainView.DispatcherQueue.Enq if (movedListedItems.Count > 0) { - associatedInstance.SlimContentPage.AddSelectedItemsOnUi(movedListedItems); - associatedInstance.SlimContentPage.FocusSelectedItems(); + itemManipulationModel.AddSelectedItems(movedListedItems); + itemManipulationModel.FocusSelectedItems(); } }, Windows.System.DispatcherQueuePriority.Low); } diff --git a/Files/Filesystem/FilesystemOperations/Helpers/FilesystemHelpers.cs b/Files/Filesystem/FilesystemOperations/Helpers/FilesystemHelpers.cs index 24b6f518ba7e..09080e04395b 100644 --- a/Files/Filesystem/FilesystemOperations/Helpers/FilesystemHelpers.cs +++ b/Files/Filesystem/FilesystemOperations/Helpers/FilesystemHelpers.cs @@ -4,6 +4,7 @@ using Files.Extensions; using Files.Filesystem.FilesystemHistory; using Files.Helpers; +using Files.Interacts; using Files.UserControls; using Files.ViewModels.Dialogs; using Microsoft.Toolkit.Uwp; @@ -32,6 +33,8 @@ public class FilesystemHelpers : IFilesystemHelpers private IFilesystemOperations filesystemOperations; + private ItemManipulationModel itemManipulationModel => associatedInstance.SlimContentPage?.ItemManipulationModel; + private RecycleBinHelpers recycleBinHelpers; private readonly CancellationToken cancellationToken; @@ -59,8 +62,8 @@ public FilesystemHelpers(IShellPage associatedInstance, CancellationToken cancel { this.associatedInstance = associatedInstance; this.cancellationToken = cancellationToken; - filesystemOperations = new FilesystemOperations(this.associatedInstance); - recycleBinHelpers = new RecycleBinHelpers(this.associatedInstance); + this.filesystemOperations = new FilesystemOperations(this.associatedInstance); + this.recycleBinHelpers = new RecycleBinHelpers(this.associatedInstance); } #endregion Constructor @@ -448,7 +451,7 @@ public async Task CopyItemsAsync(IEnumerable IStorageHistory history; List rawStorageHistory = new List(); - associatedInstance.SlimContentPage.ClearSelection(); + itemManipulationModel.ClearSelection(); float progress; for (int i = 0; i < source.Count(); i++) { @@ -519,7 +522,7 @@ public async Task CopyItemAsync(IStorageItemWithPath source, strin var sw = new Stopwatch(); sw.Start(); - associatedInstance.SlimContentPage.ClearSelection(); + itemManipulationModel.ClearSelection(); IStorageHistory history = null; if (collisions.First() != FileNameConflictResolveOptionType.Skip) @@ -650,7 +653,7 @@ public async Task MoveItemsAsync(IEnumerable IStorageHistory history; var rawStorageHistory = new List(); - associatedInstance.SlimContentPage.ClearSelection(); + itemManipulationModel.ClearSelection(); float progress; for (int i = 0; i < source.Count(); i++) { @@ -727,7 +730,7 @@ public async Task MoveItemAsync(IStorageItemWithPath source, strin var sw = new Stopwatch(); sw.Start(); - associatedInstance.SlimContentPage.ClearSelection(); + itemManipulationModel.ClearSelection(); IStorageHistory history = null; diff --git a/Files/Filesystem/Search/FolderSearch.cs b/Files/Filesystem/Search/FolderSearch.cs index dff05651780b..e9bcc19efdb3 100644 --- a/Files/Filesystem/Search/FolderSearch.cs +++ b/Files/Filesystem/Search/FolderSearch.cs @@ -92,7 +92,7 @@ await Task.Run(() => ItemPropertiesInitialized = false, // Load thumbnail FileExtension = itemFileExtension, ItemType = itemType, - Opacity = isHidden ? 0.4 : 1 + Opacity = isHidden ? Constants.UI.DimItemOpacity : 1 }); } else if (((FileAttributes)findData.dwFileAttributes & FileAttributes.Directory) == FileAttributes.Directory) @@ -109,7 +109,7 @@ await Task.Run(() => LoadUnknownTypeGlyph = false, LoadFolderGlyph = true, ItemPropertiesInitialized = true, - Opacity = isHidden ? 0.4 : 1 + Opacity = isHidden ? Constants.UI.DimItemOpacity : 1 }); } } diff --git a/Files/Filesystem/StorageEnumerators/Win32StorageEnumerator.cs b/Files/Filesystem/StorageEnumerators/Win32StorageEnumerator.cs index 55a5d970fe90..51c72e131677 100644 --- a/Files/Filesystem/StorageEnumerators/Win32StorageEnumerator.cs +++ b/Files/Filesystem/StorageEnumerators/Win32StorageEnumerator.cs @@ -143,7 +143,7 @@ CancellationToken cancellationToken if (isHidden) { - opacity = 0.4; + opacity = Constants.UI.DimItemOpacity; } return new ListedItem(null, dateReturnFormat) @@ -272,7 +272,7 @@ CancellationToken cancellationToken if (isHidden) { - opacity = 0.4; + opacity = Constants.UI.DimItemOpacity; } return new ShortcutItem(null, dateReturnFormat) @@ -319,7 +319,7 @@ CancellationToken cancellationToken if (isHidden) { - opacity = 0.4; + opacity = Constants.UI.DimItemOpacity; } return new ListedItem(null, dateReturnFormat) diff --git a/Files/Filesystem/StorageHistory/StorageHistoryOperations.cs b/Files/Filesystem/StorageHistory/StorageHistoryOperations.cs index ccd0b2bff313..1212624ccac7 100644 --- a/Files/Filesystem/StorageHistory/StorageHistoryOperations.cs +++ b/Files/Filesystem/StorageHistory/StorageHistoryOperations.cs @@ -1,5 +1,6 @@ using Files.Enums; using Files.Helpers; +using Files.Interacts; using System; using System.Collections.Generic; using System.Diagnostics; @@ -32,7 +33,7 @@ public StorageHistoryOperations(IShellPage associatedInstance, CancellationToken this.associatedInstance = associatedInstance; this.cancellationToken = cancellationToken; filesystemOperations = new FilesystemOperations(associatedInstance); - filesystemHelpers = new FilesystemHelpers(associatedInstance, cancellationToken); + filesystemHelpers = this.associatedInstance.FilesystemHelpers; } #endregion Constructor diff --git a/Files/Helpers/UIFilesystemHelpers.cs b/Files/Helpers/UIFilesystemHelpers.cs index 782e8dbb3111..06f3a26dbae8 100644 --- a/Files/Helpers/UIFilesystemHelpers.cs +++ b/Files/Helpers/UIFilesystemHelpers.cs @@ -11,6 +11,7 @@ using Windows.ApplicationModel.AppService; using Windows.Foundation.Collections; using System.Linq; +using Files.Interacts; namespace Files.Helpers { @@ -28,12 +29,12 @@ public static async void CutItem(IShellPage associatedInstance) if (associatedInstance.SlimContentPage.IsItemSelected) { // First, reset DataGrid Rows that may be in "cut" command mode - associatedInstance.SlimContentPage.ResetItemOpacity(); + associatedInstance.SlimContentPage.ItemManipulationModel.RefreshItemsOpacity(); foreach (ListedItem listedItem in associatedInstance.SlimContentPage.SelectedItems) { // Dim opacities accordingly - associatedInstance.SlimContentPage.SetItemOpacity(listedItem); + listedItem.Opacity = Constants.UI.DimItemOpacity; if (listedItem.PrimaryItemAttribute == StorageItemTypes.File) { @@ -56,7 +57,7 @@ public static async void CutItem(IShellPage associatedInstance) } if (result.ErrorCode == FileSystemStatusCode.NotFound) { - associatedInstance.SlimContentPage.ResetItemOpacity(); + associatedInstance.SlimContentPage.ItemManipulationModel.RefreshItemsOpacity(); return; } else if (result.ErrorCode == FileSystemStatusCode.Unauthorized) @@ -77,7 +78,7 @@ public static async void CutItem(IShellPage associatedInstance) return; } } - associatedInstance.SlimContentPage.ResetItemOpacity(); + associatedInstance.SlimContentPage.ItemManipulationModel.RefreshItemsOpacity(); return; } } @@ -171,7 +172,7 @@ public static async Task PasteItemAsync(string destinationPath, IShellPage assoc if (packageView != null) { await associatedInstance.FilesystemHelpers.PerformOperationTypeAsync(packageView.RequestedOperation, packageView, destinationPath, false, true); - associatedInstance.SlimContentPage.ResetItemOpacity(); + associatedInstance.SlimContentPage.ItemManipulationModel.RefreshItemsOpacity(); } } @@ -265,10 +266,10 @@ public static async void CreateFileFromDialogResultType(AddItemType itemType, Sh /// /// /// - public static void SetHiddenAttributeItem(ListedItem item, bool isHidden, IBaseLayout slimContentPage) + public static void SetHiddenAttributeItem(ListedItem item, bool isHidden, ItemManipulationModel itemManipulationModel) { item.IsHiddenItem = isHidden; - slimContentPage.ResetItemOpacity(); + itemManipulationModel.RefreshItemsOpacity(); } } } diff --git a/Files/IBaseLayout.cs b/Files/IBaseLayout.cs index 6ef7051591f5..9f0597f05b52 100644 --- a/Files/IBaseLayout.cs +++ b/Files/IBaseLayout.cs @@ -1,4 +1,5 @@ using Files.Filesystem; +using Files.Interacts; using System; using System.Collections.Generic; @@ -14,29 +15,6 @@ public interface IBaseLayout : IDisposable public ListedItem SelectedItem { get; } - void SetItemOpacity(ListedItem item); // TODO: Add opactiy value here - - void ResetItemOpacity(); - - void ClearSelection(); - - void SelectAllItems(); - - void InvertSelection(); - - void SetDragModeForItems(); - - void ScrollIntoView(ListedItem item); - - void SetSelectedItemOnUi(ListedItem item); - - void SetSelectedItemsOnUi(List selectedItems); - - void AddSelectedItemsOnUi(List selectedItems); - - void FocusSelectedItems(); - - void StartRenameItem(); - void RefreshItems(); + ItemManipulationModel ItemManipulationModel { get; } } } \ No newline at end of file diff --git a/Files/Interacts/BaseLayoutCommandImplementationModel.cs b/Files/Interacts/BaseLayoutCommandImplementationModel.cs index fc68c9052520..c02b5b9d9255 100644 --- a/Files/Interacts/BaseLayoutCommandImplementationModel.cs +++ b/Files/Interacts/BaseLayoutCommandImplementationModel.cs @@ -42,13 +42,16 @@ public class BaseLayoutCommandImplementationModel : IBaseLayoutCommandImplementa private readonly IShellPage associatedInstance; + private readonly ItemManipulationModel itemManipulationModel; + #endregion Private Members #region Constructor - public BaseLayoutCommandImplementationModel(IShellPage associatedInstance) + public BaseLayoutCommandImplementationModel(IShellPage associatedInstance, ItemManipulationModel itemManipulationModel) { this.associatedInstance = associatedInstance; + this.itemManipulationModel = itemManipulationModel; } #endregion Constructor @@ -66,7 +69,7 @@ public void Dispose() public virtual void RenameItem(RoutedEventArgs e) { - SlimContentPage.StartRenameItem(); + itemManipulationModel.StartRenameItem(); } public virtual async void CreateShortcut(RoutedEventArgs e) @@ -464,7 +467,7 @@ public virtual async void DragEnter(DragEventArgs e) { var deferral = e.GetDeferral(); - SlimContentPage.ClearSelection(); + itemManipulationModel.ClearSelection(); if (e.DataView.Contains(StandardDataFormats.StorageItems)) { e.Handled = true; @@ -532,7 +535,7 @@ public virtual async void Drop(DragEventArgs e) public virtual void RefreshItems(RoutedEventArgs e) { - SlimContentPage.RefreshItems(); + associatedInstance.Refresh_Click(); } public void SearchUnindexedItems(RoutedEventArgs e) diff --git a/Files/Interacts/ItemManipulationModel.cs b/Files/Interacts/ItemManipulationModel.cs new file mode 100644 index 000000000000..2129b983c22a --- /dev/null +++ b/Files/Interacts/ItemManipulationModel.cs @@ -0,0 +1,91 @@ +using Files.EventArguments; +using Files.Filesystem; +using System; +using System.Collections.Generic; + +namespace Files.Interacts +{ + public class ItemManipulationModel + { + public event EventHandler FocusFileListInvoked; + public event EventHandler SelectAllItemsInvoked; + public event EventHandler ClearSelectionInvoked; + public event EventHandler InvertSelectionInvoked; + public event EventHandler AddSelectedItemInvoked; + public event EventHandler FocusSelectedItemsInvoked; + public event EventHandler StartRenameItemInvoked; + public event EventHandler ScrollIntoViewInvoked; + public event EventHandler SetDragModeForItemsInvoked; + public event EventHandler RefreshItemsOpacityInvoked; + + public void FocusFileList() + { + FocusFileListInvoked?.Invoke(this, EventArgs.Empty); + } + + public void SelectAllItems() + { + SelectAllItemsInvoked?.Invoke(this, EventArgs.Empty); + } + + public void ClearSelection() + { + ClearSelectionInvoked?.Invoke(this, EventArgs.Empty); + } + + public void InvertSelection() + { + InvertSelectionInvoked?.Invoke(this, EventArgs.Empty); + } + + public void AddSelectedItem(ListedItem item) + { + AddSelectedItemInvoked?.Invoke(this, item); + } + + public void AddSelectedItems(List items) + { + foreach (ListedItem item in items) + { + AddSelectedItem(item); + } + } + + public void SetSelectedItem(ListedItem item) + { + ClearSelection(); + AddSelectedItem(item); + } + + public void SetSelectedItems(List items) + { + ClearSelection(); + AddSelectedItems(items); + } + + public void FocusSelectedItems() + { + FocusSelectedItemsInvoked?.Invoke(this, EventArgs.Empty); + } + + public void StartRenameItem() + { + StartRenameItemInvoked?.Invoke(this, EventArgs.Empty); + } + + public void ScrollIntoView(ListedItem item) + { + ScrollIntoViewInvoked?.Invoke(this, item); + } + + public void SetDragModeForItems() + { + SetDragModeForItemsInvoked?.Invoke(this, EventArgs.Empty); + } + + public void RefreshItemsOpacity() + { + RefreshItemsOpacityInvoked?.Invoke(this, EventArgs.Empty); + } + } +} diff --git a/Files/ViewModels/ItemViewModel.cs b/Files/ViewModels/ItemViewModel.cs index d1ad13fc62c7..4863fc67b24c 100644 --- a/Files/ViewModels/ItemViewModel.cs +++ b/Files/ViewModels/ItemViewModel.cs @@ -1260,7 +1260,7 @@ await DialogDisplayHelper.ShowDialogAsync( if (isHidden) { - opacity = 0.4; + opacity = Constants.UI.DimItemOpacity; } var currentFolder = library ?? new ListedItem(null, returnformat) diff --git a/Files/Views/ColumnShellPage.xaml.cs b/Files/Views/ColumnShellPage.xaml.cs index 04d3ed23faff..2405c4227d86 100644 --- a/Files/Views/ColumnShellPage.xaml.cs +++ b/Files/Views/ColumnShellPage.xaml.cs @@ -77,7 +77,7 @@ public bool IsCurrentInstance isCurrentInstance = value; if (isCurrentInstance) { - ContentPage?.FocusFileList(); + ContentPage?.ItemManipulationModel.FocusFileList(); } else { @@ -124,11 +124,11 @@ public bool IsPageMainPane } } - public ICommand SelectAllContentPageItemsCommand => new RelayCommand(() => SlimContentPage?.SelectAllItems()); + public ICommand SelectAllContentPageItemsCommand => new RelayCommand(() => SlimContentPage?.ItemManipulationModel.SelectAllItems()); - public ICommand InvertContentPageSelctionCommand => new RelayCommand(() => SlimContentPage?.InvertSelection()); + public ICommand InvertContentPageSelctionCommand => new RelayCommand(() => SlimContentPage?.ItemManipulationModel.InvertSelection()); - public ICommand ClearContentPageSelectionCommand => new RelayCommand(() => SlimContentPage?.ClearSelection()); + public ICommand ClearContentPageSelectionCommand => new RelayCommand(() => SlimContentPage?.ItemManipulationModel.ClearSelection()); public ICommand PasteItemsFromClipboardCommand => new RelayCommand(async () => await UIFilesystemHelpers.PasteItemAsync(FilesystemViewModel.WorkingDirectory, this)); @@ -992,7 +992,7 @@ await FilesystemHelpers.DeleteItemsAsync( case (true, false, false, true, VirtualKey.A): // ctrl + a, select all if (!NavigationToolbar.IsEditModeEnabled && !ContentPage.IsRenamingItem) { - this.SlimContentPage.SelectAllItems(); + this.SlimContentPage.ItemManipulationModel.SelectAllItems(); } break; @@ -1048,7 +1048,7 @@ await FilesystemHelpers.DeleteItemsAsync( { if (ContentPage.IsItemSelected) { - ContentPage.StartRenameItem(); + ContentPage.ItemManipulationModel.StartRenameItem(); } } break; @@ -1180,8 +1180,8 @@ private void FilesystemViewModel_ItemLoadStatusChanged(object sender, ItemLoadSt if (itemToSelect != null && ContentPage != null) { - ContentPage.SetSelectedItemOnUi(itemToSelect); - ContentPage.ScrollIntoView(itemToSelect); + ContentPage.ItemManipulationModel.SetSelectedItem(itemToSelect); + ContentPage.ItemManipulationModel.ScrollIntoView(itemToSelect); } } } diff --git a/Files/Views/LayoutModes/ColumnViewBase.xaml.cs b/Files/Views/LayoutModes/ColumnViewBase.xaml.cs index 7ba4f3773037..3a7691f9589f 100644 --- a/Files/Views/LayoutModes/ColumnViewBase.xaml.cs +++ b/Files/Views/LayoutModes/ColumnViewBase.xaml.cs @@ -45,6 +45,120 @@ public ColumnViewBase() : base() var selectionRectangle = RectangleSelection.Create(FileList, SelectionRectangle, FileList_SelectionChanged); tapDebounceTimer = DispatcherQueue.GetForCurrentThread().CreateTimer(); } + + protected override void HookEvents() + { + UnhookEvents(); + ItemManipulationModel.FocusFileListInvoked += ItemManipulationModel_FocusFileListInvoked; + ItemManipulationModel.SelectAllItemsInvoked += ItemManipulationModel_SelectAllItemsInvoked; + ItemManipulationModel.ClearSelectionInvoked += ItemManipulationModel_ClearSelectionInvoked; + ItemManipulationModel.InvertSelectionInvoked += ItemManipulationModel_InvertSelectionInvoked; + ItemManipulationModel.AddSelectedItemInvoked += ItemManipulationModel_AddSelectedItemInvoked; + ItemManipulationModel.FocusSelectedItemsInvoked += ItemManipulationModel_FocusSelectedItemsInvoked; + ItemManipulationModel.StartRenameItemInvoked += ItemManipulationModel_StartRenameItemInvoked; + ItemManipulationModel.ScrollIntoViewInvoked += ItemManipulationModel_ScrollIntoViewInvoked; + ItemManipulationModel.SetDragModeForItemsInvoked += ItemManipulationModel_SetDragModeForItemsInvoked; + ItemManipulationModel.RefreshItemsOpacityInvoked += ItemManipulationModel_RefreshItemsOpacityInvoked; + } + + private void ItemManipulationModel_RefreshItemsOpacityInvoked(object sender, EventArgs e) + { + foreach (ListedItem listedItem in (IEnumerable)FileList.ItemsSource) + { + if (listedItem.IsHiddenItem) + { + listedItem.Opacity = Constants.UI.DimItemOpacity; + } + else + { + listedItem.Opacity = 1; + } + } + } + + private void ItemManipulationModel_SetDragModeForItemsInvoked(object sender, EventArgs e) + { + if (!InstanceViewModel.IsPageTypeSearchResults) + { + foreach (ListedItem listedItem in FileList.Items.ToList()) + { + if (FileList.ContainerFromItem(listedItem) is ListViewItem listViewItem) + { + listViewItem.CanDrag = listViewItem.IsSelected; + } + } + } + } + + private void ItemManipulationModel_ScrollIntoViewInvoked(object sender, ListedItem e) + { + try + { + FileList.ScrollIntoView(e, ScrollIntoViewAlignment.Default); + } + catch (Exception) + { + // Catch error where row index could not be found + } + } + + private void ItemManipulationModel_StartRenameItemInvoked(object sender, EventArgs e) + { + StartRenameItem(); + } + + private void ItemManipulationModel_FocusSelectedItemsInvoked(object sender, EventArgs e) + { + FileList.ScrollIntoView(FileList.Items.Last()); + } + + private void ItemManipulationModel_AddSelectedItemInvoked(object sender, ListedItem e) + { + FileList?.SelectedItems.Add(e); + } + + private void ItemManipulationModel_InvertSelectionInvoked(object sender, EventArgs e) + { + List newSelectedItems = GetAllItems() + .Cast() + .Except(SelectedItems) + .ToList(); + + ItemManipulationModel.SetSelectedItems(newSelectedItems); + } + + private void ItemManipulationModel_ClearSelectionInvoked(object sender, EventArgs e) + { + FileList.SelectedItems.Clear(); + } + + private void ItemManipulationModel_SelectAllItemsInvoked(object sender, EventArgs e) + { + SelectAllMethod.Invoke(FileList, null); + } + + private void ItemManipulationModel_FocusFileListInvoked(object sender, EventArgs e) + { + FileList.Focus(FocusState.Programmatic); + } + + protected override void UnhookEvents() + { + if (ItemManipulationModel != null) + { + ItemManipulationModel.FocusFileListInvoked -= ItemManipulationModel_FocusFileListInvoked; + ItemManipulationModel.SelectAllItemsInvoked -= ItemManipulationModel_SelectAllItemsInvoked; + ItemManipulationModel.ClearSelectionInvoked -= ItemManipulationModel_ClearSelectionInvoked; + ItemManipulationModel.InvertSelectionInvoked -= ItemManipulationModel_InvertSelectionInvoked; + ItemManipulationModel.AddSelectedItemInvoked -= ItemManipulationModel_AddSelectedItemInvoked; + ItemManipulationModel.FocusSelectedItemsInvoked -= ItemManipulationModel_FocusSelectedItemsInvoked; + ItemManipulationModel.StartRenameItemInvoked -= ItemManipulationModel_StartRenameItemInvoked; + ItemManipulationModel.ScrollIntoViewInvoked -= ItemManipulationModel_ScrollIntoViewInvoked; + ItemManipulationModel.SetDragModeForItemsInvoked -= ItemManipulationModel_SetDragModeForItemsInvoked; + ItemManipulationModel.RefreshItemsOpacityInvoked -= ItemManipulationModel_RefreshItemsOpacityInvoked; + } + } + private void ListViewTextBoxItemName_TextChanged(object sender, TextChangedEventArgs e) { var textBox = sender as TextBox; @@ -91,7 +205,7 @@ protected override void OnNavigatedTo(NavigationEventArgs eventArgs) protected override void InitializeCommandsViewModel() { - CommandsViewModel = new BaseLayoutCommandsViewModel(new BaseLayoutCommandImplementationModel(ParentShellPageInstance)); + CommandsViewModel = new BaseLayoutCommandsViewModel(new BaseLayoutCommandImplementationModel(ParentShellPageInstance, ItemManipulationModel)); } protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) @@ -120,16 +234,6 @@ private void FolderSettings_LayoutModeChangeRequested(object sender, LayoutModeE } - public override void SelectAllItems() - { - SelectAllMethod.Invoke(FileList, null); - } - - public override void FocusFileList() - { - FileList.Focus(FocusState.Programmatic); - } - protected override IEnumerable GetAllItems() { return (IEnumerable)FileList.ItemsSource; @@ -137,78 +241,7 @@ protected override IEnumerable GetAllItems() private static readonly MethodInfo SelectAllMethod = typeof(ListView) .GetMethod("SelectAll", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Instance); - protected override void AddSelectedItem(ListedItem item) - { - FileList?.SelectedItems.Add(item); - } - - public override void InvertSelection() - { - List newSelectedItems = GetAllItems() - .Cast() - .Except(SelectedItems) - .ToList(); - - SetSelectedItemsOnUi(newSelectedItems); - } - - public override void ClearSelection() - { - FileList.SelectedItems.Clear(); - } - - public override void SetDragModeForItems() - { - if (!InstanceViewModel.IsPageTypeSearchResults) - { - foreach (ListedItem listedItem in FileList.Items.ToList()) - { - if (FileList.ContainerFromItem(listedItem) is ListViewItem listViewItem) - { - listViewItem.CanDrag = listViewItem.IsSelected; - } - } - } - } - - public override void ScrollIntoView(ListedItem item) - { - try - { - FileList.ScrollIntoView(item, ScrollIntoViewAlignment.Default); - } - catch (Exception) - { - // Catch error where row index could not be found - } - } - - public override void SetSelectedItemOnUi(ListedItem selectedItem) - { - ClearSelection(); - AddSelectedItem(selectedItem); - } - - public override void SetSelectedItemsOnUi(List selectedItems) - { - ClearSelection(); - AddSelectedItemsOnUi(selectedItems); - } - - public override void AddSelectedItemsOnUi(List selectedItems) - { - foreach (ListedItem selectedItem in selectedItems) - { - AddSelectedItem(selectedItem); - } - } - - public override void FocusSelectedItems() - { - FileList.ScrollIntoView(FileList.Items.Last()); - } - - public override void StartRenameItem() + private void StartRenameItem() { renamingItem = FileList.SelectedItem as ListedItem; int extensionLength = renamingItem.FileExtension?.Length ?? 0; @@ -296,11 +329,6 @@ public override void ResetItemOpacity() // throw new NotImplementedException(); } - public override void SetItemOpacity(ListedItem item) - { - // throw new NotImplementedException(); - } - protected override ListedItem GetItemFromElement(object element) { return (element as ListViewItem).DataContext as ListedItem; @@ -310,7 +338,7 @@ protected override ListedItem GetItemFromElement(object element) public override void Dispose() { - Debugger.Break(); // Not Implemented + UnhookEvents(); CommandsViewModel?.Dispose(); } @@ -359,7 +387,7 @@ private void HandleRightClick(object sender, RightTappedRoutedEventArgs e) } // The following code is only reachable when a user RightTapped an unselected row - SetSelectedItemOnUi(objectPressed); + ItemManipulationModel.SetSelectedItem(objectPressed); } private void FileList_PreviewKeyDown(object sender, KeyRoutedEventArgs e) @@ -466,7 +494,7 @@ private void HandleRightClick(object sender, HoldingRoutedEventArgs e) } // The following code is only reachable when a user RightTapped an unselected row - SetSelectedItemOnUi(objectPressed); + ItemManipulationModel.SetSelectedItem(objectPressed); } private async void FileList_ItemClick(object sender, ItemClickEventArgs e) @@ -518,7 +546,7 @@ private void StackPanel_RightTapped(object sender, RightTappedRoutedEventArgs e) return; } // The following code is only reachable when a user RightTapped an unselected row - SetSelectedItemOnUi(FileList.ItemFromContainer(parentContainer) as ListedItem); + ItemManipulationModel.SetSelectedItem(FileList.ItemFromContainer(parentContainer) as ListedItem); } private void FileListListItem_PointerPressed(object sender, PointerRoutedEventArgs e) { diff --git a/Files/Views/LayoutModes/ColumnViewBrowser.xaml.cs b/Files/Views/LayoutModes/ColumnViewBrowser.xaml.cs index 0cb92bacd413..32ce9f30528c 100644 --- a/Files/Views/LayoutModes/ColumnViewBrowser.xaml.cs +++ b/Files/Views/LayoutModes/ColumnViewBrowser.xaml.cs @@ -62,6 +62,119 @@ public ColumnViewBrowser() : base() tapDebounceTimer = DispatcherQueue.GetForCurrentThread().CreateTimer(); } + protected override void HookEvents() + { + UnhookEvents(); + ItemManipulationModel.FocusFileListInvoked += ItemManipulationModel_FocusFileListInvoked; + ItemManipulationModel.SelectAllItemsInvoked += ItemManipulationModel_SelectAllItemsInvoked; + ItemManipulationModel.ClearSelectionInvoked += ItemManipulationModel_ClearSelectionInvoked; + ItemManipulationModel.InvertSelectionInvoked += ItemManipulationModel_InvertSelectionInvoked; + ItemManipulationModel.AddSelectedItemInvoked += ItemManipulationModel_AddSelectedItemInvoked; + ItemManipulationModel.FocusSelectedItemsInvoked += ItemManipulationModel_FocusSelectedItemsInvoked; + ItemManipulationModel.StartRenameItemInvoked += ItemManipulationModel_StartRenameItemInvoked; + ItemManipulationModel.ScrollIntoViewInvoked += ItemManipulationModel_ScrollIntoViewInvoked; + ItemManipulationModel.SetDragModeForItemsInvoked += ItemManipulationModel_SetDragModeForItemsInvoked; + ItemManipulationModel.RefreshItemsOpacityInvoked += ItemManipulationModel_RefreshItemsOpacityInvoked; + } + + private void ItemManipulationModel_RefreshItemsOpacityInvoked(object sender, EventArgs e) + { + foreach (ListedItem listedItem in (IEnumerable)FileList.ItemsSource) + { + if (listedItem.IsHiddenItem) + { + listedItem.Opacity = Constants.UI.DimItemOpacity; + } + else + { + listedItem.Opacity = 1; + } + } + } + + private void ItemManipulationModel_SetDragModeForItemsInvoked(object sender, EventArgs e) + { + if (!InstanceViewModel.IsPageTypeSearchResults) + { + foreach (ListedItem listedItem in FileList.Items.ToList()) + { + if (FileList.ContainerFromItem(listedItem) is ListViewItem listViewItem) + { + listViewItem.CanDrag = listViewItem.IsSelected; + } + } + } + } + + private void ItemManipulationModel_ScrollIntoViewInvoked(object sender, ListedItem e) + { + try + { + FileList.ScrollIntoView(e, ScrollIntoViewAlignment.Default); + } + catch (Exception) + { + // Catch error where row index could not be found + } + } + + private void ItemManipulationModel_StartRenameItemInvoked(object sender, EventArgs e) + { + StartRenameItem(); + } + + private void ItemManipulationModel_FocusSelectedItemsInvoked(object sender, EventArgs e) + { + FileList.ScrollIntoView(FileList.Items.Last()); + } + + private void ItemManipulationModel_AddSelectedItemInvoked(object sender, ListedItem e) + { + FileList?.SelectedItems.Add(e); + } + + private void ItemManipulationModel_InvertSelectionInvoked(object sender, EventArgs e) + { + List newSelectedItems = GetAllItems() + .Cast() + .Except(SelectedItems) + .ToList(); + + ItemManipulationModel.SetSelectedItems(newSelectedItems); + } + + private void ItemManipulationModel_ClearSelectionInvoked(object sender, EventArgs e) + { + FileList.SelectedItems.Clear(); + } + + private void ItemManipulationModel_SelectAllItemsInvoked(object sender, EventArgs e) + { + SelectAllMethod.Invoke(FileList, null); + } + + private void ItemManipulationModel_FocusFileListInvoked(object sender, EventArgs e) + { + FileList.Focus(FocusState.Programmatic); + } + + protected override void UnhookEvents() + { + if (ItemManipulationModel != null) + { + ItemManipulationModel.FocusFileListInvoked -= ItemManipulationModel_FocusFileListInvoked; + ItemManipulationModel.SelectAllItemsInvoked -= ItemManipulationModel_SelectAllItemsInvoked; + ItemManipulationModel.ClearSelectionInvoked -= ItemManipulationModel_ClearSelectionInvoked; + ItemManipulationModel.InvertSelectionInvoked -= ItemManipulationModel_InvertSelectionInvoked; + ItemManipulationModel.AddSelectedItemInvoked -= ItemManipulationModel_AddSelectedItemInvoked; + ItemManipulationModel.FocusSelectedItemsInvoked -= ItemManipulationModel_FocusSelectedItemsInvoked; + ItemManipulationModel.StartRenameItemInvoked -= ItemManipulationModel_StartRenameItemInvoked; + ItemManipulationModel.ScrollIntoViewInvoked -= ItemManipulationModel_ScrollIntoViewInvoked; + ItemManipulationModel.SetDragModeForItemsInvoked -= ItemManipulationModel_SetDragModeForItemsInvoked; + ItemManipulationModel.RefreshItemsOpacityInvoked -= ItemManipulationModel_RefreshItemsOpacityInvoked; + } + } + private void ColumnViewBase_DismissColumn(object sender, EventArgs e) { DismissOtherBlades(sender as ListView); @@ -164,7 +277,7 @@ protected override void OnNavigatedTo(NavigationEventArgs eventArgs) protected override void InitializeCommandsViewModel() { - CommandsViewModel = new BaseLayoutCommandsViewModel(new BaseLayoutCommandImplementationModel(ParentShellPageInstance)); + CommandsViewModel = new BaseLayoutCommandsViewModel(new BaseLayoutCommandImplementationModel(ParentShellPageInstance, ItemManipulationModel)); } protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) @@ -193,16 +306,6 @@ private void FolderSettings_LayoutModeChangeRequested(object sender, LayoutModeE } - public override void SelectAllItems() - { - SelectAllMethod.Invoke(FileList, null); - } - - public override void FocusFileList() - { - FileList.Focus(FocusState.Programmatic); - } - protected override IEnumerable GetAllItems() { return (IEnumerable)FileList.ItemsSource; @@ -210,78 +313,7 @@ protected override IEnumerable GetAllItems() private static readonly MethodInfo SelectAllMethod = typeof(ListView) .GetMethod("SelectAll", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Instance); - protected override void AddSelectedItem(ListedItem item) - { - FileList?.SelectedItems.Add(item); - } - - public override void InvertSelection() - { - List newSelectedItems = GetAllItems() - .Cast() - .Except(SelectedItems) - .ToList(); - - SetSelectedItemsOnUi(newSelectedItems); - } - - public override void ClearSelection() - { - FileList.SelectedItems.Clear(); - } - - public override void SetDragModeForItems() - { - if (!InstanceViewModel.IsPageTypeSearchResults) - { - foreach (ListedItem listedItem in FileList.Items.ToList()) - { - if (FileList.ContainerFromItem(listedItem) is ListViewItem listViewItem) - { - listViewItem.CanDrag = listViewItem.IsSelected; - } - } - } - } - - public override void ScrollIntoView(ListedItem item) - { - try - { - FileList.ScrollIntoView(item, ScrollIntoViewAlignment.Default); - } - catch (Exception) - { - // Catch error where row index could not be found - } - } - - public override void SetSelectedItemOnUi(ListedItem selectedItem) - { - ClearSelection(); - AddSelectedItem(selectedItem); - } - - public override void SetSelectedItemsOnUi(List selectedItems) - { - ClearSelection(); - AddSelectedItemsOnUi(selectedItems); - } - - public override void AddSelectedItemsOnUi(List selectedItems) - { - foreach (ListedItem selectedItem in selectedItems) - { - AddSelectedItem(selectedItem); - } - } - - public override void FocusSelectedItems() - { - FileList.ScrollIntoView(FileList.Items.Last()); - } - - public override void StartRenameItem() + private void StartRenameItem() { renamingItem = FileList.SelectedItem as ListedItem; int extensionLength = renamingItem.FileExtension?.Length ?? 0; @@ -368,11 +400,6 @@ public override void ResetItemOpacity() // throw new NotImplementedException(); } - public override void SetItemOpacity(ListedItem item) - { - // throw new NotImplementedException(); - } - protected override ListedItem GetItemFromElement(object element) { return (element as ListViewItem).DataContext as ListedItem; @@ -382,7 +409,7 @@ protected override ListedItem GetItemFromElement(object element) public override void Dispose() { - Debugger.Break(); // Not Implemented + UnhookEvents(); CommandsViewModel?.Dispose(); } @@ -426,7 +453,7 @@ private void HandleRightClick(object sender, RightTappedRoutedEventArgs e) } // The following code is only reachable when a user RightTapped an unselected row - SetSelectedItemOnUi(objectPressed); + ItemManipulationModel.SetSelectedItem(objectPressed); } private void FileList_PreviewKeyDown(object sender, KeyRoutedEventArgs e) @@ -560,7 +587,7 @@ private void HandleRightClick(object sender, HoldingRoutedEventArgs e) } // The following code is only reachable when a user RightTapped an unselected row - SetSelectedItemOnUi(objectPressed); + ItemManipulationModel.SetSelectedItem(objectPressed); } private void DismissOtherBlades(ListView listView) @@ -700,7 +727,7 @@ private void StackPanel_RightTapped(object sender, RightTappedRoutedEventArgs e) return; } // The following code is only reachable when a user RightTapped an unselected row - SetSelectedItemOnUi(FileList.ItemFromContainer(parentContainer) as ListedItem); + ItemManipulationModel.SetSelectedItem(FileList.ItemFromContainer(parentContainer) as ListedItem); } private void FileListListItem_PointerPressed(object sender, PointerRoutedEventArgs e) { diff --git a/Files/Views/LayoutModes/GenericFileBrowser.xaml.cs b/Files/Views/LayoutModes/GenericFileBrowser.xaml.cs index f5e218ab0fff..e8915b1ca7a8 100644 --- a/Files/Views/LayoutModes/GenericFileBrowser.xaml.cs +++ b/Files/Views/LayoutModes/GenericFileBrowser.xaml.cs @@ -102,9 +102,139 @@ public GenericFileBrowser() tapDebounceTimer = DispatcherQueue.GetForCurrentThread().CreateTimer(); } + protected override void HookEvents() + { + UnhookEvents(); + ItemManipulationModel.FocusFileListInvoked += ItemManipulationModel_FocusFileListInvoked; + ItemManipulationModel.SelectAllItemsInvoked += ItemManipulationModel_SelectAllItemsInvoked; + ItemManipulationModel.ClearSelectionInvoked += ItemManipulationModel_ClearSelectionInvoked; + ItemManipulationModel.InvertSelectionInvoked += ItemManipulationModel_InvertSelectionInvoked; + ItemManipulationModel.AddSelectedItemInvoked += ItemManipulationModel_AddSelectedItemInvoked; + ItemManipulationModel.FocusSelectedItemsInvoked += ItemManipulationModel_FocusSelectedItemsInvoked; + ItemManipulationModel.StartRenameItemInvoked += ItemManipulationModel_StartRenameItemInvoked; + ItemManipulationModel.ScrollIntoViewInvoked += ItemManipulationModel_ScrollIntoViewInvoked; + ItemManipulationModel.SetDragModeForItemsInvoked += ItemManipulationModel_SetDragModeForItemsInvoked; + ItemManipulationModel.RefreshItemsOpacityInvoked += ItemManipulationModel_RefreshItemsOpacityInvoked; + } + + private void ItemManipulationModel_RefreshItemsOpacityInvoked(object sender, EventArgs e) + { + foreach (ListedItem listedItem in (IEnumerable)AllView.ItemsSource) + { + if (listedItem.IsHiddenItem) + { + listedItem.Opacity = Constants.UI.DimItemOpacity; + } + else + { + listedItem.Opacity = 1; + } + } + } + + private void ItemManipulationModel_SetDragModeForItemsInvoked(object sender, EventArgs e) + { + if (IsItemSelected && !InstanceViewModel.IsPageTypeSearchResults) + { + var rows = new List(); + DependencyObjectHelpers.FindChildren(rows, AllView); + + foreach (DataGridRow row in rows) + { + row.CanDrag = SelectedItems.Contains(row.DataContext); + } + } + } + + private void ItemManipulationModel_ScrollIntoViewInvoked(object sender, ListedItem e) + { + try + { + AllView.ScrollIntoView(e, null); + } + catch (Exception) + { + // Catch error where row index could not be found + } + } + + private void ItemManipulationModel_StartRenameItemInvoked(object sender, EventArgs e) + { + try + { + if (IsItemSelected) + { + AllView.CurrentColumn = AllView.Columns[1]; + AllView.BeginEdit(); + } + } + catch (InvalidOperationException) + { + // System.InvalidOperationException: There is no current row. Operation cannot be completed. + } + } + + private void ItemManipulationModel_FocusSelectedItemsInvoked(object sender, EventArgs e) + { + if(SelectedItems.Any()) + { + AllView.ScrollIntoView(SelectedItems.Last(), null); + } + } + + private void ItemManipulationModel_AddSelectedItemInvoked(object sender, ListedItem e) + { + if (((IList)AllView?.ItemsSource)?.Contains(e) ?? false) + { + AllView.SelectedItems.Add(e); + } + } + + private void ItemManipulationModel_InvertSelectionInvoked(object sender, EventArgs e) + { + List newSelectedItems = GetAllItems() + .Cast() + .Except(SelectedItems) + .ToList(); + + ItemManipulationModel.SetSelectedItems(newSelectedItems); + } + + private void ItemManipulationModel_ClearSelectionInvoked(object sender, EventArgs e) + { + AllView.SelectedItems.Clear(); + } + + private void ItemManipulationModel_SelectAllItemsInvoked(object sender, EventArgs e) + { + SelectAllMethod.Invoke(AllView, null); + } + + private void ItemManipulationModel_FocusFileListInvoked(object sender, EventArgs e) + { + AllView.Focus(FocusState.Programmatic); + } + + protected override void UnhookEvents() + { + if (ItemManipulationModel != null) + { + ItemManipulationModel.FocusFileListInvoked -= ItemManipulationModel_FocusFileListInvoked; + ItemManipulationModel.SelectAllItemsInvoked -= ItemManipulationModel_SelectAllItemsInvoked; + ItemManipulationModel.ClearSelectionInvoked -= ItemManipulationModel_ClearSelectionInvoked; + ItemManipulationModel.InvertSelectionInvoked -= ItemManipulationModel_InvertSelectionInvoked; + ItemManipulationModel.AddSelectedItemInvoked -= ItemManipulationModel_AddSelectedItemInvoked; + ItemManipulationModel.FocusSelectedItemsInvoked -= ItemManipulationModel_FocusSelectedItemsInvoked; + ItemManipulationModel.StartRenameItemInvoked -= ItemManipulationModel_StartRenameItemInvoked; + ItemManipulationModel.ScrollIntoViewInvoked -= ItemManipulationModel_ScrollIntoViewInvoked; + ItemManipulationModel.SetDragModeForItemsInvoked -= ItemManipulationModel_SetDragModeForItemsInvoked; + ItemManipulationModel.RefreshItemsOpacityInvoked -= ItemManipulationModel_RefreshItemsOpacityInvoked; + } + } + protected override void InitializeCommandsViewModel() { - CommandsViewModel = new BaseLayoutCommandsViewModel(new BaseLayoutCommandImplementationModel(ParentShellPageInstance)); + CommandsViewModel = new BaseLayoutCommandsViewModel(new BaseLayoutCommandImplementationModel(ParentShellPageInstance, ItemManipulationModel)); } private void SelectionRectangle_SelectionStarted(object sender, EventArgs e) @@ -177,84 +307,11 @@ private void AppSettings_ThemeModeChanged(object sender, EventArgs e) RequestedTheme = ThemeHelper.RootTheme; } - protected override void AddSelectedItem(ListedItem item) - { - if (((IList)AllView?.ItemsSource)?.Contains(item) ?? false) - { - AllView.SelectedItems.Add(item); - } - } - protected override IEnumerable GetAllItems() { return AllView.ItemsSource; } - public override void SelectAllItems() - { - SelectAllMethod.Invoke(AllView, null); - } - - public override void ClearSelection() - { - AllView.SelectedItems.Clear(); - } - - public override void SetDragModeForItems() - { - if (IsItemSelected && !InstanceViewModel.IsPageTypeSearchResults) - { - var rows = new List(); - DependencyObjectHelpers.FindChildren(rows, AllView); - - foreach (DataGridRow row in rows) - { - row.CanDrag = SelectedItems.Contains(row.DataContext); - } - } - } - - public override void ScrollIntoView(ListedItem item) - { - try - { - AllView.ScrollIntoView(item, null); - } - catch (Exception) - { - // Catch error where row index could not be found - } - } - - public override void FocusFileList() - { - AllView.Focus(FocusState.Programmatic); - } - - public override void FocusSelectedItems() - { - if (SelectedItems.Any()) - { - AllView.ScrollIntoView(SelectedItems.Last(), null); - } - } - - public override void StartRenameItem() - { - try - { - if (IsItemSelected) - { - AllView.CurrentColumn = AllView.Columns[1]; - AllView.BeginEdit(); - } - } - catch (InvalidOperationException) - { - // System.InvalidOperationException: There is no current row. Operation cannot be completed. - } - } - private void ViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == "DirectorySortOption") @@ -541,7 +598,7 @@ private void HandleRightClick(object sender, RoutedEventArgs e) { if (!SelectedItems.Contains(objectPressed)) { - SetSelectedItemOnUi(objectPressed); + ItemManipulationModel.SetSelectedItem(objectPressed); } } } @@ -649,7 +706,7 @@ private void AllView_DoubleTapped(object sender, DoubleTappedRoutedEventArgs e) public override void Dispose() { - Debugger.Break(); // Not Implemented + UnhookEvents(); CommandsViewModel?.Dispose(); } diff --git a/Files/Views/LayoutModes/GridViewBrowser.xaml.cs b/Files/Views/LayoutModes/GridViewBrowser.xaml.cs index a5f7f46a8796..e3e21d293ebd 100644 --- a/Files/Views/LayoutModes/GridViewBrowser.xaml.cs +++ b/Files/Views/LayoutModes/GridViewBrowser.xaml.cs @@ -38,9 +38,121 @@ public GridViewBrowser() selectionRectangle.SelectionEnded += SelectionRectangle_SelectionEnded; } + protected override void HookEvents() + { + UnhookEvents(); + ItemManipulationModel.FocusFileListInvoked += ItemManipulationModel_FocusFileListInvoked; + ItemManipulationModel.SelectAllItemsInvoked += ItemManipulationModel_SelectAllItemsInvoked; + ItemManipulationModel.ClearSelectionInvoked += ItemManipulationModel_ClearSelectionInvoked; + ItemManipulationModel.InvertSelectionInvoked += ItemManipulationModel_InvertSelectionInvoked; + ItemManipulationModel.AddSelectedItemInvoked += ItemManipulationModel_AddSelectedItemInvoked; + ItemManipulationModel.FocusSelectedItemsInvoked += ItemManipulationModel_FocusSelectedItemsInvoked; + ItemManipulationModel.StartRenameItemInvoked += ItemManipulationModel_StartRenameItemInvoked; + ItemManipulationModel.ScrollIntoViewInvoked += ItemManipulationModel_ScrollIntoViewInvoked; + ItemManipulationModel.SetDragModeForItemsInvoked += ItemManipulationModel_SetDragModeForItemsInvoked; + ItemManipulationModel.RefreshItemsOpacityInvoked += ItemManipulationModel_RefreshItemsOpacityInvoked; + } + + private void ItemManipulationModel_RefreshItemsOpacityInvoked(object sender, EventArgs e) + { + foreach (ListedItem listedItem in (IEnumerable)FileList.ItemsSource) + { + if (listedItem.IsHiddenItem) + { + listedItem.Opacity = Constants.UI.DimItemOpacity; + } + else + { + listedItem.Opacity = 1; + } + } + } + + private void ItemManipulationModel_SetDragModeForItemsInvoked(object sender, EventArgs e) + { + if (!InstanceViewModel.IsPageTypeSearchResults) + { + foreach (ListedItem listedItem in FileList.Items.ToList()) + { + if (FileList.ContainerFromItem(listedItem) is GridViewItem gridViewItem) + { + gridViewItem.CanDrag = gridViewItem.IsSelected; + } + } + } + } + + private void ItemManipulationModel_ScrollIntoViewInvoked(object sender, ListedItem e) + { + FileList.ScrollIntoView(e); + } + + private void ItemManipulationModel_StartRenameItemInvoked(object sender, EventArgs e) + { + StartRenameItem(); + } + + private void ItemManipulationModel_FocusSelectedItemsInvoked(object sender, EventArgs e) + { + if (SelectedItems.Any()) + { + FileList.ScrollIntoView(SelectedItems.Last()); + } + } + + private void ItemManipulationModel_AddSelectedItemInvoked(object sender, ListedItem e) + { + if (FileList?.Items.Contains(e) ?? false) + { + FileList.SelectedItems.Add(e); + } + } + + private void ItemManipulationModel_InvertSelectionInvoked(object sender, EventArgs e) + { + List newSelectedItems = GetAllItems() + .Cast() + .Except(SelectedItems) + .ToList(); + + ItemManipulationModel.SetSelectedItems(newSelectedItems); + } + + private void ItemManipulationModel_ClearSelectionInvoked(object sender, EventArgs e) + { + FileList.SelectedItems.Clear(); + } + + private void ItemManipulationModel_SelectAllItemsInvoked(object sender, EventArgs e) + { + FileList.SelectAll(); + } + + private void ItemManipulationModel_FocusFileListInvoked(object sender, EventArgs e) + { + FileList.Focus(FocusState.Programmatic); + } + + protected override void UnhookEvents() + { + if (ItemManipulationModel != null) + { + ItemManipulationModel.FocusFileListInvoked -= ItemManipulationModel_FocusFileListInvoked; + ItemManipulationModel.SelectAllItemsInvoked -= ItemManipulationModel_SelectAllItemsInvoked; + ItemManipulationModel.ClearSelectionInvoked -= ItemManipulationModel_ClearSelectionInvoked; + ItemManipulationModel.InvertSelectionInvoked -= ItemManipulationModel_InvertSelectionInvoked; + ItemManipulationModel.AddSelectedItemInvoked -= ItemManipulationModel_AddSelectedItemInvoked; + ItemManipulationModel.FocusSelectedItemsInvoked -= ItemManipulationModel_FocusSelectedItemsInvoked; + ItemManipulationModel.StartRenameItemInvoked -= ItemManipulationModel_StartRenameItemInvoked; + ItemManipulationModel.ScrollIntoViewInvoked -= ItemManipulationModel_ScrollIntoViewInvoked; + ItemManipulationModel.SetDragModeForItemsInvoked -= ItemManipulationModel_SetDragModeForItemsInvoked; + ItemManipulationModel.RefreshItemsOpacityInvoked -= ItemManipulationModel_RefreshItemsOpacityInvoked; + } + } + protected override void InitializeCommandsViewModel() { - CommandsViewModel = new BaseLayoutCommandsViewModel(new BaseLayoutCommandImplementationModel(ParentShellPageInstance)); + CommandsViewModel = new BaseLayoutCommandsViewModel(new BaseLayoutCommandImplementationModel(ParentShellPageInstance, ItemManipulationModel)); } protected override void OnNavigatedTo(NavigationEventArgs eventArgs) @@ -86,11 +198,6 @@ private async void SelectionRectangle_SelectionEnded(object sender, EventArgs e) FileList.Focus(FocusState.Programmatic); } - public override void FocusFileList() - { - FileList.Focus(FocusState.Programmatic); - } - private void FolderSettings_LayoutModeChangeRequested(object sender, LayoutModeEventArgs e) { if (FolderSettings.LayoutMode == FolderLayoutModes.GridView || FolderSettings.LayoutMode == FolderLayoutModes.TilesView) @@ -121,62 +228,17 @@ private void SetItemTemplate() } } - protected override void AddSelectedItem(ListedItem item) - { - if (FileList?.Items.Contains(item) ?? false) - { - FileList.SelectedItems.Add(item); - } - } - protected override IEnumerable GetAllItems() { return FileList.Items; } - public override void SelectAllItems() - { - FileList.SelectAll(); - } - - public override void ClearSelection() - { - FileList.SelectedItems.Clear(); - } - - public override void SetDragModeForItems() - { - if (!InstanceViewModel.IsPageTypeSearchResults) - { - foreach (ListedItem listedItem in FileList.Items.ToList()) - { - if (FileList.ContainerFromItem(listedItem) is GridViewItem gridViewItem) - { - gridViewItem.CanDrag = gridViewItem.IsSelected; - } - } - } - } - - public override void ScrollIntoView(ListedItem item) - { - FileList.ScrollIntoView(item); - } - - public override void FocusSelectedItems() - { - if (SelectedItems.Any()) - { - FileList.ScrollIntoView(SelectedItems.Last()); - } - } - private void StackPanel_RightTapped(object sender, RightTappedRoutedEventArgs e) { var parentContainer = DependencyObjectHelpers.FindParent(e.OriginalSource as DependencyObject); if (!parentContainer.IsSelected) { - SetSelectedItemOnUi(FileList.ItemFromContainer(parentContainer) as ListedItem); + ItemManipulationModel.SetSelectedItem(FileList.ItemFromContainer(parentContainer) as ListedItem); } } @@ -187,7 +249,7 @@ private void FileList_SelectionChanged(object sender, SelectionChangedEventArgs private ListedItem renamingItem; - public override void StartRenameItem() + private void StartRenameItem() { renamingItem = SelectedItem; int extensionLength = renamingItem.FileExtension?.Length ?? 0; @@ -487,7 +549,7 @@ private void FileList_DoubleTapped(object sender, DoubleTappedRoutedEventArgs e) public override void Dispose() { - Debugger.Break(); // Not Implemented + UnhookEvents(); CommandsViewModel?.Dispose(); } diff --git a/Files/Views/ModernShellPage.xaml.cs b/Files/Views/ModernShellPage.xaml.cs index 8cf856c4cd75..cebe0591e23f 100644 --- a/Files/Views/ModernShellPage.xaml.cs +++ b/Files/Views/ModernShellPage.xaml.cs @@ -73,7 +73,7 @@ public bool IsCurrentInstance isCurrentInstance = value; if (isCurrentInstance) { - ContentPage?.FocusFileList(); + ContentPage?.ItemManipulationModel.FocusFileList(); } else { @@ -120,11 +120,11 @@ public bool IsPageMainPane } } - public ICommand SelectAllContentPageItemsCommand => new RelayCommand(() => SlimContentPage?.SelectAllItems()); + public ICommand SelectAllContentPageItemsCommand => new RelayCommand(() => SlimContentPage?.ItemManipulationModel.SelectAllItems()); - public ICommand InvertContentPageSelctionCommand => new RelayCommand(() => SlimContentPage?.InvertSelection()); + public ICommand InvertContentPageSelctionCommand => new RelayCommand(() => SlimContentPage?.ItemManipulationModel.InvertSelection()); - public ICommand ClearContentPageSelectionCommand => new RelayCommand(() => SlimContentPage?.ClearSelection()); + public ICommand ClearContentPageSelectionCommand => new RelayCommand(() => SlimContentPage?.ItemManipulationModel.ClearSelection()); public ICommand PasteItemsFromClipboardCommand => new RelayCommand(async () => await UIFilesystemHelpers.PasteItemAsync(FilesystemViewModel.WorkingDirectory, this)); @@ -1006,7 +1006,7 @@ await FilesystemHelpers.DeleteItemsAsync( case (true, false, false, true, VirtualKey.A): // ctrl + a, select all if (!NavigationToolbar.IsEditModeEnabled && !ContentPage.IsRenamingItem) { - this.SlimContentPage.SelectAllItems(); + this.SlimContentPage.ItemManipulationModel.SelectAllItems(); } break; @@ -1061,7 +1061,7 @@ await FilesystemHelpers.DeleteItemsAsync( { if (ContentPage.IsItemSelected) { - ContentPage.StartRenameItem(); + ContentPage.ItemManipulationModel.StartRenameItem(); } } break; @@ -1251,8 +1251,8 @@ private void FilesystemViewModel_ItemLoadStatusChanged(object sender, ItemLoadSt if (itemToSelect != null && ContentPage != null) { - ContentPage.SetSelectedItemOnUi(itemToSelect); - ContentPage.ScrollIntoView(itemToSelect); + ContentPage.ItemManipulationModel.SetSelectedItem(itemToSelect); + ContentPage.ItemManipulationModel.ScrollIntoView(itemToSelect); } } } diff --git a/Files/Views/Pages/PropertiesGeneral.xaml.cs b/Files/Views/Pages/PropertiesGeneral.xaml.cs index e9d350514b34..79716dbef399 100644 --- a/Files/Views/Pages/PropertiesGeneral.xaml.cs +++ b/Files/Views/Pages/PropertiesGeneral.xaml.cs @@ -79,13 +79,13 @@ await CoreApplication.MainView.DispatcherQueue.EnqueueAsync(() => UIFilesystemHe // Handle each file independently foreach (var fileOrFolder in combinedProps.List) { - await CoreApplication.MainView.DispatcherQueue.EnqueueAsync(() => UIFilesystemHelpers.SetHiddenAttributeItem(fileOrFolder, ViewModel.IsHidden, AppInstance.SlimContentPage)); + await CoreApplication.MainView.DispatcherQueue.EnqueueAsync(() => UIFilesystemHelpers.SetHiddenAttributeItem(fileOrFolder, ViewModel.IsHidden, AppInstance.SlimContentPage.ItemManipulationModel)); } } else { // Handle the visibility attribute for a single file - await CoreApplication.MainView.DispatcherQueue.EnqueueAsync(() => UIFilesystemHelpers.SetHiddenAttributeItem(item, ViewModel.IsHidden, AppInstance.SlimContentPage)); + await CoreApplication.MainView.DispatcherQueue.EnqueueAsync(() => UIFilesystemHelpers.SetHiddenAttributeItem(item, ViewModel.IsHidden, AppInstance.SlimContentPage.ItemManipulationModel)); } } }