From 0190b275559f9109f6756599401afec9db9d3b24 Mon Sep 17 00:00:00 2001 From: Marco Gavelli Date: Sun, 22 May 2022 21:07:48 +0200 Subject: [PATCH 1/5] Refresh recent files and drives windgets from toolbar --- src/Files.Uwp/Helpers/WidgetsHelpers.cs | 24 ------------------- .../Widgets/BundlesWidget.xaml.cs | 6 +++++ .../UserControls/Widgets/DrivesWidget.xaml.cs | 10 ++++++-- .../UserControls/Widgets/FolderWidget.xaml.cs | 11 +++++++-- .../Widgets/RecentFilesWidget.xaml.cs | 10 ++++++-- .../ViewModels/Pages/YourHomeViewModel.cs | 5 ++++ .../ViewModels/Widgets/IWidgetItemModel.cs | 3 +++ src/Files.Uwp/Views/ColumnShellPage.xaml.cs | 5 ++-- src/Files.Uwp/Views/ModernShellPage.xaml.cs | 5 ++-- src/Files.Uwp/Views/WidgetsPage.xaml.cs | 18 +++++++++++++- 10 files changed, 60 insertions(+), 37 deletions(-) diff --git a/src/Files.Uwp/Helpers/WidgetsHelpers.cs b/src/Files.Uwp/Helpers/WidgetsHelpers.cs index f3ed5472f284..c4e38cc20ad5 100644 --- a/src/Files.Uwp/Helpers/WidgetsHelpers.cs +++ b/src/Files.Uwp/Helpers/WidgetsHelpers.cs @@ -1,12 +1,7 @@ using Files.Backend.Services.Settings; -using Files.Uwp.Filesystem; -using Files.Uwp.UserControls.Widgets; using Files.Uwp.UserControls.Widgets; using Files.Uwp.ViewModels.Widgets; using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using System.Threading.Tasks; namespace Files.Uwp.Helpers { @@ -67,24 +62,5 @@ public static bool TryGetIsWidgetSettingEnabled(IWidgetsSettingsService return false; } - - public static class WidgetCards - { - /// - /// Loads an icon for each IWidgetCardItem included - /// - /// The type of IWidgetCardItem in the collection - /// The type of the INavigationControlItem backing every card item - /// A collection of widget card items to load thumbnails for - /// - public static async Task LoadCardIcons(IList cardItems) - where T : IWidgetCardItem - { - foreach (T cardItem in cardItems.ToList()) // ToList() is necessary - { - await cardItem.LoadCardThumbnailAsync(); - } - } - } } } \ No newline at end of file diff --git a/src/Files.Uwp/UserControls/Widgets/BundlesWidget.xaml.cs b/src/Files.Uwp/UserControls/Widgets/BundlesWidget.xaml.cs index af4e221868de..ff84e7709303 100644 --- a/src/Files.Uwp/UserControls/Widgets/BundlesWidget.xaml.cs +++ b/src/Files.Uwp/UserControls/Widgets/BundlesWidget.xaml.cs @@ -5,6 +5,7 @@ using Microsoft.Toolkit.Uwp; using System; using Windows.UI.Xaml.Controls; +using System.Threading.Tasks; // The User Control item template is documented at https://go.microsoft.com/fwlink/?LinkId=234236 @@ -35,6 +36,11 @@ public BundlesWidget() this.ViewModel = new BundlesViewModel(); } + public Task RefreshWidget() + { + return Task.CompletedTask; + } + #region IDisposable public void Dispose() diff --git a/src/Files.Uwp/UserControls/Widgets/DrivesWidget.xaml.cs b/src/Files.Uwp/UserControls/Widgets/DrivesWidget.xaml.cs index 47ebe15fe7f3..931228503d04 100644 --- a/src/Files.Uwp/UserControls/Widgets/DrivesWidget.xaml.cs +++ b/src/Files.Uwp/UserControls/Widgets/DrivesWidget.xaml.cs @@ -1,7 +1,6 @@ using Files.Uwp.DataModels.NavigationControlItems; using Files.Uwp.Helpers; using Files.Backend.Services.Settings; -using Files.Uwp.ViewModels; using Files.Uwp.ViewModels.Widgets; using CommunityToolkit.Mvvm.DependencyInjection; using Microsoft.Toolkit.Uwp; @@ -20,7 +19,6 @@ using CommunityToolkit.Mvvm.ComponentModel; using Windows.UI.Xaml.Media.Imaging; using Windows.ApplicationModel.Core; -using Files.Uwp.UserControls.Widgets; using System.Collections.Specialized; namespace Files.Uwp.UserControls.Widgets @@ -286,6 +284,14 @@ private async Task CheckEmptyDrive(string drivePath) return false; } + public async Task RefreshWidget() + { + foreach (var item in ItemsAdded) + { + await item.Item.UpdatePropertiesAsync(); + } + } + public void Dispose() { diff --git a/src/Files.Uwp/UserControls/Widgets/FolderWidget.xaml.cs b/src/Files.Uwp/UserControls/Widgets/FolderWidget.xaml.cs index ca7be815f159..8b17294cf474 100644 --- a/src/Files.Uwp/UserControls/Widgets/FolderWidget.xaml.cs +++ b/src/Files.Uwp/UserControls/Widgets/FolderWidget.xaml.cs @@ -21,7 +21,6 @@ using Windows.UI.Xaml.Input; using Windows.UI.Xaml.Media.Imaging; using Files.Uwp.DataModels.NavigationControlItems; -using Files.Uwp.UserControls.Widgets; namespace Files.Uwp.UserControls.Widgets { @@ -183,7 +182,10 @@ private async void FolderWidget_Loaded(object sender, RoutedEventArgs e) SelectCommand = LibraryCardCommand }); - await WidgetsHelpers.WidgetCards.LoadCardIcons(ItemsAdded); + foreach (var cardItem in ItemsAdded.ToList()) // ToList() is necessary + { + await cardItem.LoadCardThumbnailAsync(); + } ItemsAdded.EndBulkOperation(); } @@ -266,6 +268,11 @@ private async Task OpenLibraryCard(FolderCardItem item) LibraryCardInvoked?.Invoke(this, new LibraryCardInvokedEventArgs { Path = item.Path }); } + public Task RefreshWidget() + { + return Task.CompletedTask; + } + public void Dispose() { diff --git a/src/Files.Uwp/UserControls/Widgets/RecentFilesWidget.xaml.cs b/src/Files.Uwp/UserControls/Widgets/RecentFilesWidget.xaml.cs index 3a811877ca7a..4211bd0b0acd 100644 --- a/src/Files.Uwp/UserControls/Widgets/RecentFilesWidget.xaml.cs +++ b/src/Files.Uwp/UserControls/Widgets/RecentFilesWidget.xaml.cs @@ -49,7 +49,7 @@ public RecentFilesWidget() recentItemsCollection.Clear(); - PopulateRecentsList(); + _ = PopulateRecentsList(); } private void OpenFileLocation_Click(object sender, RoutedEventArgs e) @@ -68,7 +68,7 @@ private void OpenFileLocation_Click(object sender, RoutedEventArgs e) } } - private async void PopulateRecentsList() + private async Task PopulateRecentsList() { Empty.Visibility = Visibility.Collapsed; @@ -222,6 +222,12 @@ private void ClearRecentItems_Click(object sender, RoutedEventArgs e) Empty.Visibility = Visibility.Visible; } + public async Task RefreshWidget() + { + recentItemsCollection.Clear(); + await PopulateRecentsList(); + } + public void Dispose() { } diff --git a/src/Files.Uwp/ViewModels/Pages/YourHomeViewModel.cs b/src/Files.Uwp/ViewModels/Pages/YourHomeViewModel.cs index ed79bc812ea1..cb229e543b41 100644 --- a/src/Files.Uwp/ViewModels/Pages/YourHomeViewModel.cs +++ b/src/Files.Uwp/ViewModels/Pages/YourHomeViewModel.cs @@ -79,6 +79,11 @@ public void Dispose() widgetsViewModel?.Dispose(); } + internal void RefreshWidgets() + { + throw new NotImplementedException(); + } + #endregion IDisposable } } \ No newline at end of file diff --git a/src/Files.Uwp/ViewModels/Widgets/IWidgetItemModel.cs b/src/Files.Uwp/ViewModels/Widgets/IWidgetItemModel.cs index a6b1914a5144..513da040e88d 100644 --- a/src/Files.Uwp/ViewModels/Widgets/IWidgetItemModel.cs +++ b/src/Files.Uwp/ViewModels/Widgets/IWidgetItemModel.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; namespace Files.Uwp.ViewModels.Widgets { @@ -11,5 +12,7 @@ public interface IWidgetItemModel : IDisposable string AutomationProperties { get; } bool IsWidgetSettingEnabled { get; } + + Task RefreshWidget(); } } \ No newline at end of file diff --git a/src/Files.Uwp/Views/ColumnShellPage.xaml.cs b/src/Files.Uwp/Views/ColumnShellPage.xaml.cs index a8c4cbc20e8d..abac4a135114 100644 --- a/src/Files.Uwp/Views/ColumnShellPage.xaml.cs +++ b/src/Files.Uwp/Views/ColumnShellPage.xaml.cs @@ -801,10 +801,9 @@ public async void Refresh_Click() }; await FilesystemViewModel.SearchAsync(searchInstance); } - else + else if (CurrentPageType != typeof(WidgetsPage)) { - var ContentOwnedViewModelInstance = FilesystemViewModel; - ContentOwnedViewModelInstance?.RefreshItems(null); + FilesystemViewModel?.RefreshItems(null); } } diff --git a/src/Files.Uwp/Views/ModernShellPage.xaml.cs b/src/Files.Uwp/Views/ModernShellPage.xaml.cs index 6e6978ee398c..328d700f148e 100644 --- a/src/Files.Uwp/Views/ModernShellPage.xaml.cs +++ b/src/Files.Uwp/Views/ModernShellPage.xaml.cs @@ -875,10 +875,9 @@ public async void Refresh_Click() }; await FilesystemViewModel.SearchAsync(searchInstance); } - else + else if (CurrentPageType != typeof(WidgetsPage)) { - var ContentOwnedViewModelInstance = FilesystemViewModel; - ContentOwnedViewModelInstance?.RefreshItems(null); + FilesystemViewModel?.RefreshItems(null); } } diff --git a/src/Files.Uwp/Views/WidgetsPage.xaml.cs b/src/Files.Uwp/Views/WidgetsPage.xaml.cs index c970f01e48ad..78b2c5455f22 100644 --- a/src/Files.Uwp/Views/WidgetsPage.xaml.cs +++ b/src/Files.Uwp/Views/WidgetsPage.xaml.cs @@ -3,6 +3,7 @@ using Files.Uwp.Filesystem; using Files.Uwp.Helpers; using Files.Backend.Services.Settings; +using Files.Shared.Extensions; using Files.Uwp.UserControls.Widgets; using Files.Uwp.ViewModels; using Files.Uwp.ViewModels.Pages; @@ -220,11 +221,14 @@ protected override async void OnNavigatedTo(NavigationEventArgs eventArgs) AppInstance.InstanceViewModel.IsPageTypeFtp = false; AppInstance.InstanceViewModel.IsPageTypeZipFolder = false; AppInstance.InstanceViewModel.IsPageTypeLibrary = false; - AppInstance.ToolbarViewModel.CanRefresh = false; + AppInstance.ToolbarViewModel.CanRefresh = true; AppInstance.ToolbarViewModel.CanGoBack = AppInstance.CanNavigateBackward; AppInstance.ToolbarViewModel.CanGoForward = AppInstance.CanNavigateForward; AppInstance.ToolbarViewModel.CanNavigateToParent = false; + AppInstance.ToolbarViewModel.RefreshRequested -= ToolbarViewModel_RefreshRequested; + AppInstance.ToolbarViewModel.RefreshRequested += ToolbarViewModel_RefreshRequested; + // Set path of working directory empty await AppInstance.FilesystemViewModel.SetWorkingDirectoryAsync("Home".GetLocalized()); @@ -240,12 +244,24 @@ protected override async void OnNavigatedTo(NavigationEventArgs eventArgs) AppInstance.ToolbarViewModel.PathComponents.Add(item); } + protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) + { + base.OnNavigatingFrom(e); + AppInstance.ToolbarViewModel.RefreshRequested -= ToolbarViewModel_RefreshRequested; + } + + private void ToolbarViewModel_RefreshRequested(object sender, EventArgs e) + { + Widgets.ViewModel.Widgets.ForEach(w => w.WidgetItemModel.RefreshWidget()); + } + #region IDisposable public void Dispose() { ViewModel.YourHomeLoadedInvoked -= ViewModel_YourHomeLoadedInvoked; Widgets.ViewModel.WidgetListRefreshRequestedInvoked -= ViewModel_WidgetListRefreshRequestedInvoked; + AppInstance.ToolbarViewModel.RefreshRequested -= ToolbarViewModel_RefreshRequested; ViewModel?.Dispose(); } From 9465c610d236fd315f316c934abce635fb65ff59 Mon Sep 17 00:00:00 2001 From: Marco Gavelli Date: Sun, 22 May 2022 21:13:44 +0200 Subject: [PATCH 2/5] Fix refresh button getting disabled --- src/Files.Uwp/Views/ColumnShellPage.xaml.cs | 4 ++-- src/Files.Uwp/Views/ModernShellPage.xaml.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Files.Uwp/Views/ColumnShellPage.xaml.cs b/src/Files.Uwp/Views/ColumnShellPage.xaml.cs index abac4a135114..b5d67e218da4 100644 --- a/src/Files.Uwp/Views/ColumnShellPage.xaml.cs +++ b/src/Files.Uwp/Views/ColumnShellPage.xaml.cs @@ -788,10 +788,9 @@ private async void KeyboardAccelerator_Invoked(KeyboardAccelerator sender, Keybo public async void Refresh_Click() { - ToolbarViewModel.CanRefresh = false; - if (InstanceViewModel.IsPageTypeSearchResults) { + ToolbarViewModel.CanRefresh = false; var searchInstance = new FolderSearch { Query = InstanceViewModel.CurrentSearchQuery, @@ -803,6 +802,7 @@ public async void Refresh_Click() } else if (CurrentPageType != typeof(WidgetsPage)) { + ToolbarViewModel.CanRefresh = false; FilesystemViewModel?.RefreshItems(null); } } diff --git a/src/Files.Uwp/Views/ModernShellPage.xaml.cs b/src/Files.Uwp/Views/ModernShellPage.xaml.cs index 328d700f148e..673ff350cec9 100644 --- a/src/Files.Uwp/Views/ModernShellPage.xaml.cs +++ b/src/Files.Uwp/Views/ModernShellPage.xaml.cs @@ -862,10 +862,9 @@ private async void KeyboardAccelerator_Invoked(KeyboardAccelerator sender, Keybo public async void Refresh_Click() { - ToolbarViewModel.CanRefresh = false; - if (InstanceViewModel.IsPageTypeSearchResults) { + ToolbarViewModel.CanRefresh = false; var searchInstance = new FolderSearch { Query = InstanceViewModel.CurrentSearchQuery, @@ -877,6 +876,7 @@ public async void Refresh_Click() } else if (CurrentPageType != typeof(WidgetsPage)) { + ToolbarViewModel.CanRefresh = false; FilesystemViewModel?.RefreshItems(null); } } From 825f36c4003fdec0113a5e657d267cebaaf67546 Mon Sep 17 00:00:00 2001 From: Marco Gavelli Date: Sun, 22 May 2022 21:16:07 +0200 Subject: [PATCH 3/5] Disable refresh button while updating --- src/Files.Uwp/Views/WidgetsPage.xaml.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Files.Uwp/Views/WidgetsPage.xaml.cs b/src/Files.Uwp/Views/WidgetsPage.xaml.cs index 78b2c5455f22..f3a9c4956461 100644 --- a/src/Files.Uwp/Views/WidgetsPage.xaml.cs +++ b/src/Files.Uwp/Views/WidgetsPage.xaml.cs @@ -3,7 +3,6 @@ using Files.Uwp.Filesystem; using Files.Uwp.Helpers; using Files.Backend.Services.Settings; -using Files.Shared.Extensions; using Files.Uwp.UserControls.Widgets; using Files.Uwp.ViewModels; using Files.Uwp.ViewModels.Pages; @@ -15,6 +14,7 @@ using System.Runtime.InteropServices; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Navigation; +using System.Threading.Tasks; namespace Files.Uwp.Views { @@ -250,9 +250,11 @@ protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) AppInstance.ToolbarViewModel.RefreshRequested -= ToolbarViewModel_RefreshRequested; } - private void ToolbarViewModel_RefreshRequested(object sender, EventArgs e) + private async void ToolbarViewModel_RefreshRequested(object sender, EventArgs e) { - Widgets.ViewModel.Widgets.ForEach(w => w.WidgetItemModel.RefreshWidget()); + AppInstance.ToolbarViewModel.CanRefresh = false; + await Task.WhenAll(Widgets.ViewModel.Widgets.Select(w => w.WidgetItemModel.RefreshWidget())); + AppInstance.ToolbarViewModel.CanRefresh = true; } #region IDisposable From 4445f359f400e5739f13e9c04d2d4ef4557504cf Mon Sep 17 00:00:00 2001 From: Marco Gavelli Date: Sun, 22 May 2022 21:19:26 +0200 Subject: [PATCH 4/5] Revert extra change --- src/Files.Uwp/ViewModels/Pages/YourHomeViewModel.cs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/Files.Uwp/ViewModels/Pages/YourHomeViewModel.cs b/src/Files.Uwp/ViewModels/Pages/YourHomeViewModel.cs index cb229e543b41..ed79bc812ea1 100644 --- a/src/Files.Uwp/ViewModels/Pages/YourHomeViewModel.cs +++ b/src/Files.Uwp/ViewModels/Pages/YourHomeViewModel.cs @@ -79,11 +79,6 @@ public void Dispose() widgetsViewModel?.Dispose(); } - internal void RefreshWidgets() - { - throw new NotImplementedException(); - } - #endregion IDisposable } } \ No newline at end of file From 87e755dd3cb66a07c5f9573cfd13426405fb85e0 Mon Sep 17 00:00:00 2001 From: Marco Gavelli Date: Sun, 22 May 2022 22:56:06 +0200 Subject: [PATCH 5/5] Fix accessiblity issue on Refresh button --- src/Files.Uwp/UserControls/AddressToolbar.xaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Files.Uwp/UserControls/AddressToolbar.xaml b/src/Files.Uwp/UserControls/AddressToolbar.xaml index 037dad3be01e..926260980dd4 100644 --- a/src/Files.Uwp/UserControls/AddressToolbar.xaml +++ b/src/Files.Uwp/UserControls/AddressToolbar.xaml @@ -411,7 +411,7 @@ Height="32" x:FieldModifier="public" AccessKey="R" - AutomationProperties.Name="{helpers:ResourceString Name=NavRefreshButton/AutomationProperties/Name}" + AutomationProperties.Name="{helpers:ResourceString Name=NavResfreshButton/AutomationProperties/Name}" Background="Transparent" Command="{x:Bind ViewModel.RefreshClickCommand, Mode=OneWay}" IsEnabled="{x:Bind ViewModel.CanRefresh, Mode=OneWay}"