diff --git a/src/Files.App/DataModels/NavigationControlItems/LocationItem.cs b/src/Files.App/DataModels/NavigationControlItems/LocationItem.cs index 2ad2908b9cee..d08d0849b50a 100644 --- a/src/Files.App/DataModels/NavigationControlItems/LocationItem.cs +++ b/src/Files.App/DataModels/NavigationControlItems/LocationItem.cs @@ -56,6 +56,8 @@ public bool IsExpanded public bool IsInvalid { get; set; } = false; + public bool IsPinned => App.QuickAccessManager.Model.FavoriteItems.Contains(path); + public SectionType Section { get; set; } public ContextMenuOptions MenuOptions { get; set; } diff --git a/src/Files.App/DataModels/SidebarPinnedModel.cs b/src/Files.App/DataModels/SidebarPinnedModel.cs index 3694ecf4e95c..a707da12502c 100644 --- a/src/Files.App/DataModels/SidebarPinnedModel.cs +++ b/src/Files.App/DataModels/SidebarPinnedModel.cs @@ -75,12 +75,7 @@ public int IndexOfItem(INavigationControlItem locationItem) } } - /// - /// Adds the item (from a path) to the navigation sidebar - /// - /// The path which to save - /// Task - public async Task AddItemToSidebarAsync(string path) + public async Task CreateLocationItemFromPathAsync(string path) { var item = await FilesystemTasks.Wrap(() => DrivesManager.GetRootFromPathAsync(path)); var res = await FilesystemTasks.Wrap(() => StorageFileExtensions.DangerousGetFolderFromPathAsync(path, item)); @@ -130,6 +125,18 @@ public async Task AddItemToSidebarAsync(string path) Debug.WriteLine($"Pinned item was invalid {res.ErrorCode}, item: {path}"); } + return locationItem; + } + + /// + /// Adds the item (from a path) to the navigation sidebar + /// + /// The path which to save + /// Task + public async Task AddItemToSidebarAsync(string path) + { + var locationItem = await CreateLocationItemFromPathAsync(path); + AddLocationItemToSidebar(locationItem); } diff --git a/src/Files.App/Filesystem/QuickAccessManager.cs b/src/Files.App/Filesystem/QuickAccessManager.cs index 543a01e4608e..d1a54d00bcb7 100644 --- a/src/Files.App/Filesystem/QuickAccessManager.cs +++ b/src/Files.App/Filesystem/QuickAccessManager.cs @@ -1,6 +1,7 @@ using CommunityToolkit.Mvvm.DependencyInjection; using Files.App.DataModels; using Files.App.ServicesImplementation; +using Files.App.UserControls.Widgets; using Files.Shared.Extensions; using System; using System.Collections.Generic; @@ -16,7 +17,11 @@ namespace Files.App.Filesystem public sealed class QuickAccessManager { public FileSystemWatcher? PinnedItemsWatcher; + public event FileSystemEventHandler? PinnedItemsModified; + + public EventHandler? UpdateQuickAccessWidget; + public IQuickAccessService QuickAccessService { get; } = Ioc.Default.GetRequiredService(); public SidebarPinnedModel Model; diff --git a/src/Files.App/Helpers/WidgetsHelpers.cs b/src/Files.App/Helpers/WidgetsHelpers.cs index 60a13691c0ef..6b2a40a75f29 100644 --- a/src/Files.App/Helpers/WidgetsHelpers.cs +++ b/src/Files.App/Helpers/WidgetsHelpers.cs @@ -37,9 +37,9 @@ public static class WidgetsHelpers public static bool TryGetIsWidgetSettingEnabled(IPreferencesSettingsService preferencesSettingsService) where TWidget : IWidgetItemModel { - if (typeof(TWidget) == typeof(FolderWidget)) + if (typeof(TWidget) == typeof(QuickAccessWidget)) { - return preferencesSettingsService.ShowFoldersWidget; + return preferencesSettingsService.ShowQuickAccessWidget; } if (typeof(TWidget) == typeof(DrivesWidget)) { diff --git a/src/Files.App/ServicesImplementation/QuickAccessService.cs b/src/Files.App/ServicesImplementation/QuickAccessService.cs index 5b9e48ecda4a..9b9b42e11d3a 100644 --- a/src/Files.App/ServicesImplementation/QuickAccessService.cs +++ b/src/Files.App/ServicesImplementation/QuickAccessService.cs @@ -1,8 +1,13 @@ -using Files.App.Shell; +using Files.App.DataModels.NavigationControlItems; +using Files.App.Filesystem; +using Files.App.Shell; +using Files.App.UserControls.Widgets; +using Files.Shared; using Files.Shared.Extensions; using System; using System.Collections.Generic; using System.Linq; +using System.Security.Permissions; using System.Threading.Tasks; namespace Files.App.ServicesImplementation @@ -10,19 +15,19 @@ namespace Files.App.ServicesImplementation internal class QuickAccessService : IQuickAccessService { private readonly static string guid = "::{679f85cb-0220-4080-b29b-5540cc05aab6}"; - - public async Task> GetPinnedFoldersAsync() + + public async Task> GetPinnedFoldersAsync(bool getRecentItems = false) { var sidebarItems = (await Win32Shell.GetShellFolderAsync(guid, "Enumerate", 0, 10000)).Enumerate .Where(link => link.IsFolder) .Select(link => link.FilePath).ToList(); - if (sidebarItems.Count > 4) // Avoid first opening crash #11139 + if (sidebarItems.Count > 4 && !getRecentItems) // Avoid first opening crash #11139 sidebarItems.RemoveRange(sidebarItems.Count - 4, 4); // 4 is the number of recent items shown in explorer sidebar return sidebarItems; } - + public async Task PinToSidebar(string folderPath) => await PinToSidebar(new[] { folderPath }); @@ -30,8 +35,10 @@ public async Task PinToSidebar(string[] folderPaths) { await ContextMenu.InvokeVerb("pintohome", folderPaths); await App.QuickAccessManager.Model.LoadAsync(); + + App.QuickAccessManager.UpdateQuickAccessWidget?.Invoke(this, new ModifyQuickAccessEventArgs(folderPaths, true)); } - + public async Task UnpinFromSidebar(string folderPath) => await UnpinFromSidebar(new[] { folderPath }); @@ -48,6 +55,8 @@ await SafetyExtensions.IgnoreExceptions(async () => { }); await App.QuickAccessManager.Model.LoadAsync(); + + App.QuickAccessManager.UpdateQuickAccessWidget?.Invoke(this, new ModifyQuickAccessEventArgs(folderPaths, false)); } } } diff --git a/src/Files.App/ServicesImplementation/Settings/PreferencesSettingsService.cs b/src/Files.App/ServicesImplementation/Settings/PreferencesSettingsService.cs index 50b78ecfff26..54612ddd3a86 100644 --- a/src/Files.App/ServicesImplementation/Settings/PreferencesSettingsService.cs +++ b/src/Files.App/ServicesImplementation/Settings/PreferencesSettingsService.cs @@ -81,7 +81,7 @@ public bool AlwaysOpenDualPaneInNewTab set => Set(value); } - public bool ShowFoldersWidget + public bool ShowQuickAccessWidget { get => Get(true); set => Set(value); @@ -194,7 +194,7 @@ protected override void RaiseOnSettingChangedEvent(object sender, SettingChanged case nameof(AlwaysOpenNewInstance): case nameof(IsDualPaneEnabled): case nameof(AlwaysOpenDualPaneInNewTab): - case nameof(ShowFoldersWidget): + case nameof(ShowQuickAccessWidget): case nameof(ShowRecentFilesWidget): case nameof(ShowDrivesWidget): case nameof(ShowBundlesWidget): diff --git a/src/Files.App/Strings/en-US/Resources.resw b/src/Files.App/Strings/en-US/Resources.resw index 64bae7e48b8a..1764cda41b9a 100644 --- a/src/Files.App/Strings/en-US/Resources.resw +++ b/src/Files.App/Strings/en-US/Resources.resw @@ -2289,9 +2289,6 @@ Drives Widget - - Folders Widget - Recent Files Widget @@ -2900,6 +2897,9 @@ Display the edit tags flyout + + + Quick access Enter your credentials to connect to: {0} diff --git a/src/Files.App/UserControls/Widgets/FolderWidget.xaml b/src/Files.App/UserControls/Widgets/QuickAccessWidget.xaml similarity index 78% rename from src/Files.App/UserControls/Widgets/FolderWidget.xaml rename to src/Files.App/UserControls/Widgets/QuickAccessWidget.xaml index 7da6d737f348..7faeb5718242 100644 --- a/src/Files.App/UserControls/Widgets/FolderWidget.xaml +++ b/src/Files.App/UserControls/Widgets/QuickAccessWidget.xaml @@ -1,5 +1,5 @@  + + + + + + + + + + @@ -85,7 +104,6 @@ - + { private BitmapImage thumbnail; @@ -56,18 +74,20 @@ public BitmapImage Thumbnail public string Path { get; set; } public ICommand SelectCommand { get; set; } public string Text { get; set; } + public bool IsPinned { get; set; } - public FolderCardItem(LocationItem item = null, string text = null) : this(text) + public FolderCardItem(LocationItem item = null, string text = null, bool isPinned = true) : this(text, isPinned) { Item = item; } - public FolderCardItem(string text) + public FolderCardItem(string text, bool isPinned) { if (!string.IsNullOrWhiteSpace(text)) { Text = text; AutomationProperties = Text; + IsPinned = isPinned; } } @@ -84,43 +104,45 @@ public async Task LoadCardThumbnailAsync() } } - public sealed partial class FolderWidget : UserControl, IWidgetItemModel, INotifyPropertyChanged + public sealed partial class QuickAccessWidget : UserControl, IWidgetItemModel, INotifyPropertyChanged { private IUserSettingsService UserSettingsService { get; } = Ioc.Default.GetRequiredService(); + private readonly IQuickAccessService QuickAccessService = Ioc.Default.GetRequiredService(); + public ObservableCollection ItemsAdded = new(); private bool showMultiPaneControls; - public FolderWidget() + public QuickAccessWidget() { InitializeComponent(); - LibraryCardCommand = new AsyncRelayCommand(OpenLibraryCard); + QuickAccessCardCommand = new AsyncRelayCommand(OpenCard); - Loaded += FolderWidget_Loaded; - Unloaded += FolderWidget_Unloaded; + Loaded += QuickAccessWidget_Loaded; + Unloaded += QuickAccessWidget_Unloaded; } - public delegate void LibraryCardInvokedEventHandler(object sender, LibraryCardInvokedEventArgs e); + public delegate void LibraryCardInvokedEventHandler(object sender, QuickAccessCardInvokedEventArgs e); - public delegate void LibraryCardNewPaneInvokedEventHandler(object sender, LibraryCardInvokedEventArgs e); + public delegate void LibraryCardNewPaneInvokedEventHandler(object sender, QuickAccessCardInvokedEventArgs e); - public delegate void LibraryCardPropertiesInvokedEventHandler(object sender, LibraryCardEventArgs e); + public delegate void LibraryCardPropertiesInvokedEventHandler(object sender, QuickAccessCardEventArgs e); - public event LibraryCardInvokedEventHandler LibraryCardInvoked; + public event LibraryCardInvokedEventHandler CardInvoked; - public event LibraryCardNewPaneInvokedEventHandler LibraryCardNewPaneInvoked; + public event LibraryCardNewPaneInvokedEventHandler CardNewPaneInvoked; - public event LibraryCardPropertiesInvokedEventHandler LibraryCardPropertiesInvoked; + public event LibraryCardPropertiesInvokedEventHandler CardPropertiesInvoked; - public event EventHandler FolderWidgethowMultiPaneControlsInvoked; + public event EventHandler QuickAccessWidgetShowMultiPaneControlsInvoked; public event PropertyChangedEventHandler PropertyChanged; - public bool IsWidgetSettingEnabled => UserSettingsService.PreferencesSettingsService.ShowFoldersWidget; + public bool IsWidgetSettingEnabled => UserSettingsService.PreferencesSettingsService.ShowQuickAccessWidget; - public ICommand LibraryCardCommand { get; } + public ICommand QuickAccessCardCommand { get; } public ICommand ShowCreateNewLibraryDialogCommand { get; } = new RelayCommand(LibraryManager.ShowCreateNewLibraryDialog); @@ -130,7 +152,7 @@ public bool ShowMultiPaneControls { get { - FolderWidgethowMultiPaneControlsInvoked?.Invoke(this, EventArgs.Empty); + QuickAccessWidgetShowMultiPaneControlsInvoked?.Invoke(this, EventArgs.Empty); return showMultiPaneControls; } @@ -144,54 +166,69 @@ public bool ShowMultiPaneControls } } - public string WidgetName => nameof(FolderWidget); + public string WidgetName => nameof(QuickAccessWidget); - public string AutomationProperties => "FolderWidgetAutomationProperties/Name".GetLocalizedResource(); + public string AutomationProperties => "QuickAccess".GetLocalizedResource(); - public string WidgetHeader => "Folders".GetLocalizedResource(); + public string WidgetHeader => "QuickAccess".GetLocalizedResource(); - private async void FolderWidget_Loaded(object sender, RoutedEventArgs e) + private async void ModifyItem(object? sender, ModifyQuickAccessEventArgs? e) { - Loaded -= FolderWidget_Loaded; + if (e is null) + return; - ItemsAdded.Add(new FolderCardItem("Desktop".GetLocalizedResource()) - { - Path = UserDataPaths.GetDefault().Desktop, - SelectCommand = LibraryCardCommand - }); - ItemsAdded.Add(new FolderCardItem("Documents".GetLocalizedResource()) + if (e.Add) { - Path = UserDataPaths.GetDefault().Documents, - SelectCommand = LibraryCardCommand - }); - ItemsAdded.Add(new FolderCardItem("Downloads".GetLocalizedResource()) - { - Path = UserDataPaths.GetDefault().Downloads, - SelectCommand = LibraryCardCommand - }); - ItemsAdded.Add(new FolderCardItem("Music".GetLocalizedResource()) - { - Path = UserDataPaths.GetDefault().Music, - SelectCommand = LibraryCardCommand - }); - ItemsAdded.Add(new FolderCardItem("Pictures".GetLocalizedResource()) - { - Path = UserDataPaths.GetDefault().Pictures, - SelectCommand = LibraryCardCommand - }); - ItemsAdded.Add(new FolderCardItem("Videos".GetLocalizedResource()) + var locationItems = new List(); + foreach (var item in e.Paths) + locationItems.Add(await App.QuickAccessManager.Model.CreateLocationItemFromPathAsync(item)); + + foreach (var item in locationItems) + ItemsAdded.Insert(e.Pin ? ItemsAdded.Count - 4 : ItemsAdded.Count, new FolderCardItem(Path.GetFileName(item.Text), e.Pin) // Add just after the Recent Folders + { + Path = item.Path, + SelectCommand = QuickAccessCardCommand + }); + + var cardLoadTasks = ItemsAdded.Select(cardItem => cardItem.LoadCardThumbnailAsync()); + await Task.WhenAll(cardLoadTasks); + } + else + foreach (var itemToRemove in ItemsAdded.Where(x => e.Paths.Contains(x.Path)).ToList()) + ItemsAdded.Remove(itemToRemove); + } + + private async void QuickAccessWidget_Loaded(object sender, RoutedEventArgs e) + { + Loaded -= QuickAccessWidget_Loaded; + + var itemsToAdd = await QuickAccessService.GetPinnedFoldersAsync(true); + + var locationItems = new List(); + foreach (var item in itemsToAdd) + locationItems.Add(await App.QuickAccessManager.Model.CreateLocationItemFromPathAsync(item)); + + int idx = 0; + foreach (var item in locationItems) { - Path = UserDataPaths.GetDefault().Videos, - SelectCommand = LibraryCardCommand - }); + ItemsAdded.Add(new FolderCardItem(item, Path.GetFileName(item.Text), idx < locationItems.Count - 4) + { + Path = item.Path, + SelectCommand = QuickAccessCardCommand + }); + idx++; + } + + App.QuickAccessManager.UpdateQuickAccessWidget += ModifyItem; var cardLoadTasks = ItemsAdded.Select(cardItem => cardItem.LoadCardThumbnailAsync()); await Task.WhenAll(cardLoadTasks); } - private void FolderWidget_Unloaded(object sender, RoutedEventArgs e) + private void QuickAccessWidget_Unloaded(object sender, RoutedEventArgs e) { - Unloaded -= FolderWidget_Unloaded; + Unloaded -= QuickAccessWidget_Unloaded; + App.QuickAccessManager.UpdateQuickAccessWidget += ModifyItem; } private void MenuFlyout_Opening(object sender, object e) @@ -199,9 +236,15 @@ private void MenuFlyout_Opening(object sender, object e) var newPaneMenuItem = (sender as MenuFlyout).Items.SingleOrDefault(x => x.Name == "OpenInNewPane"); // eg. an empty library doesn't have OpenInNewPane context menu item if (newPaneMenuItem is not null) - { newPaneMenuItem.Visibility = ShowMultiPaneControls ? Visibility.Visible : Visibility.Collapsed; - } + + var pinToFavoritesItem = (sender as MenuFlyout).Items.SingleOrDefault(x => x.Name == "PinToFavorites"); + if (pinToFavoritesItem is not null) + pinToFavoritesItem.Visibility = (pinToFavoritesItem.DataContext as FolderCardItem).IsPinned ? Visibility.Collapsed : Visibility.Visible; + + var unpinFromFavoritesItem = (sender as MenuFlyout).Items.SingleOrDefault(x => x.Name == "UnpinFromFavorites"); + if (unpinFromFavoritesItem is not null) + unpinFromFavoritesItem.Visibility = (unpinFromFavoritesItem.DataContext as FolderCardItem).IsPinned ? Visibility.Visible : Visibility.Collapsed; } private void NotifyPropertyChanged([CallerMemberName] string propertyName = "") @@ -212,7 +255,7 @@ private void NotifyPropertyChanged([CallerMemberName] string propertyName = "") private void OpenInNewPane_Click(object sender, RoutedEventArgs e) { var item = ((MenuFlyoutItem)sender).DataContext as FolderCardItem; - LibraryCardNewPaneInvoked?.Invoke(this, new LibraryCardInvokedEventArgs { Path = item.Path }); + CardNewPaneInvoked?.Invoke(this, new QuickAccessCardInvokedEventArgs { Path = item.Path }); } private async void OpenInNewTab_Click(object sender, RoutedEventArgs e) @@ -236,24 +279,44 @@ private async void OpenInNewWindow_Click(object sender, RoutedEventArgs e) await NavigationHelpers.OpenPathInNewWindowAsync(item.Path); } - private void OpenLibraryProperties_Click(object sender, RoutedEventArgs e) + private void OpenProperties_Click(object sender, RoutedEventArgs e) { var presenter = DependencyObjectHelpers.FindParent((MenuFlyoutItem)sender); var flyoutParent = presenter?.Parent as Popup; var propertiesItem = ((MenuFlyoutItem)sender).DataContext as FolderCardItem; - if (propertiesItem is null || !propertiesItem.IsLibrary || flyoutParent is null) + if (propertiesItem is null || flyoutParent is null) return; EventHandler flyoutClosed = null!; flyoutClosed = (s, e) => { flyoutParent.Closed -= flyoutClosed; - LibraryCardPropertiesInvoked?.Invoke(this, new LibraryCardEventArgs { Library = (propertiesItem.Item as LibraryLocationItem)! }); + CardPropertiesInvoked?.Invoke(this, new QuickAccessCardEventArgs { Item = propertiesItem.Item }); }; flyoutParent.Closed += flyoutClosed; } - private Task OpenLibraryCard(FolderCardItem item) + private async void PinToFavorites_Click(object sender, RoutedEventArgs e) + { + var item = ((MenuFlyoutItem)sender).DataContext as FolderCardItem; + await QuickAccessService.PinToSidebar(item.Path); + ModifyItem(this, new ModifyQuickAccessEventArgs(new[] { item.Path }, false)); + var items = await QuickAccessService.GetPinnedFoldersAsync(true); + items.RemoveRange(0, items.Count - 4); + var recentItem = items.Where(x => !ItemsAdded.Select(y => y.Path).Contains(x)).FirstOrDefault(); + ModifyItem(this, new ModifyQuickAccessEventArgs(new[] { recentItem }, true) + { + Pin = false + }); + } + + private void UnpinFromFavorites_Click(object sender, RoutedEventArgs e) + { + var item = ((MenuFlyoutItem)sender).DataContext as FolderCardItem; + _ = QuickAccessService.UnpinFromSidebar(item.Path); + } + + private Task OpenCard(FolderCardItem item) { if (string.IsNullOrEmpty(item.Path)) { @@ -271,7 +334,7 @@ private Task OpenLibraryCard(FolderCardItem item) return NavigationHelpers.OpenPathInNewTab(item.Path); } - LibraryCardInvoked?.Invoke(this, new LibraryCardInvokedEventArgs { Path = item.Path }); + CardInvoked?.Invoke(this, new QuickAccessCardInvokedEventArgs { Path = item.Path }); return Task.CompletedTask; } diff --git a/src/Files.App/ViewModels/SettingsViewModels/PreferencesViewModel.cs b/src/Files.App/ViewModels/SettingsViewModels/PreferencesViewModel.cs index d1876846a6bf..964384825e53 100644 --- a/src/Files.App/ViewModels/SettingsViewModels/PreferencesViewModel.cs +++ b/src/Files.App/ViewModels/SettingsViewModels/PreferencesViewModel.cs @@ -460,13 +460,13 @@ public bool SearchUnindexedItems } } - public bool ShowFoldersWidget + public bool ShowQuickAccessWidget { - get => UserSettingsService.PreferencesSettingsService.ShowFoldersWidget; + get => UserSettingsService.PreferencesSettingsService.ShowQuickAccessWidget; set { - if (value != UserSettingsService.PreferencesSettingsService.ShowFoldersWidget) - UserSettingsService.PreferencesSettingsService.ShowFoldersWidget = value; + if (value != UserSettingsService.PreferencesSettingsService.ShowQuickAccessWidget) + UserSettingsService.PreferencesSettingsService.ShowQuickAccessWidget = value; } } diff --git a/src/Files.App/ViewModels/ToolbarViewModel.cs b/src/Files.App/ViewModels/ToolbarViewModel.cs index 6d6234d5394a..1a1a6cdb8fff 100644 --- a/src/Files.App/ViewModels/ToolbarViewModel.cs +++ b/src/Files.App/ViewModels/ToolbarViewModel.cs @@ -436,11 +436,16 @@ public async Task CheckForReleaseNotesAsync() IsReleaseNotesVisible = true; } + public void RefreshWidgets() + { + RefreshWidgetsRequested?.Invoke(this, EventArgs.Empty); + } + private void UserSettingsService_OnSettingChangedEvent(object? sender, SettingChangedEventArgs e) { switch (e.SettingName) { - case nameof(UserSettingsService.PreferencesSettingsService.ShowFoldersWidget): // ToDo: Move this to the widget page, it doesn't belong here. + case nameof(UserSettingsService.PreferencesSettingsService.ShowQuickAccessWidget): // ToDo: Move this to the widget page, it doesn't belong here. case nameof(UserSettingsService.PreferencesSettingsService.ShowDrivesWidget): case nameof(UserSettingsService.PreferencesSettingsService.ShowBundlesWidget): case nameof(UserSettingsService.PreferencesSettingsService.ShowFileTagsWidget): diff --git a/src/Files.App/Views/SettingsPages/Preferences.xaml b/src/Files.App/Views/SettingsPages/Preferences.xaml index 1d9baf4c5d9f..d0c9c1b7d9ef 100644 --- a/src/Files.App/Views/SettingsPages/Preferences.xaml +++ b/src/Files.App/Views/SettingsPages/Preferences.xaml @@ -225,10 +225,10 @@ - + diff --git a/src/Files.App/Views/WidgetsPage.xaml.cs b/src/Files.App/Views/WidgetsPage.xaml.cs index bf214225f215..d32c43006014 100644 --- a/src/Files.App/Views/WidgetsPage.xaml.cs +++ b/src/Files.App/Views/WidgetsPage.xaml.cs @@ -1,4 +1,5 @@ using CommunityToolkit.Mvvm.DependencyInjection; +using Files.App.DataModels.NavigationControlItems; using Files.App.Dialogs; using Files.App.Extensions; using Files.App.Filesystem; @@ -14,6 +15,7 @@ using System.Linq; using System.Runtime.InteropServices; using System.Threading.Tasks; +using Windows.Storage; namespace Files.App.Views { @@ -24,7 +26,7 @@ public sealed partial class WidgetsPage : Page, IDisposable private IShellPage AppInstance = null; public FolderSettingsViewModel FolderSettings => AppInstance?.InstanceViewModel.FolderSettings; - private FolderWidget folderWidget; + private QuickAccessWidget quickAccessWidget; private DrivesWidget drivesWidget; private BundlesWidget bundlesWidget; private FileTagsWidget fileTagsWidget; @@ -58,26 +60,26 @@ private void ViewModel_WidgetListRefreshRequestedInvoked(object? sender, EventAr ReloadWidgets(); } - private void ReloadWidgets() + public void ReloadWidgets() { - folderWidget = WidgetsHelpers.TryGetWidget(UserSettingsService.PreferencesSettingsService, Widgets.ViewModel, out bool shouldReloadFolderWidget, folderWidget); + quickAccessWidget = WidgetsHelpers.TryGetWidget(UserSettingsService.PreferencesSettingsService, Widgets.ViewModel, out bool shouldReloadQuickAccessWidget, quickAccessWidget); drivesWidget = WidgetsHelpers.TryGetWidget(UserSettingsService.PreferencesSettingsService, Widgets.ViewModel, out bool shouldReloadDrivesWidget, drivesWidget); bundlesWidget = WidgetsHelpers.TryGetWidget(UserSettingsService.PreferencesSettingsService, Widgets.ViewModel, out bool shouldReloadBundles, bundlesWidget); fileTagsWidget = WidgetsHelpers.TryGetWidget(UserSettingsService.PreferencesSettingsService, Widgets.ViewModel, out bool shouldReloadFileTags, fileTagsWidget); recentFilesWidget = WidgetsHelpers.TryGetWidget(UserSettingsService.PreferencesSettingsService, Widgets.ViewModel, out bool shouldReloadRecentFiles, recentFilesWidget); - if (shouldReloadFolderWidget && folderWidget is not null) + if (shouldReloadQuickAccessWidget && quickAccessWidget is not null) { - Widgets.ViewModel.InsertWidget(new(folderWidget, (value) => UserSettingsService.PreferencesSettingsService.FoldersWidgetExpanded = value, () => UserSettingsService.PreferencesSettingsService.FoldersWidgetExpanded), 0); - - folderWidget.LibraryCardInvoked -= FolderWidget_LibraryCardInvoked; - folderWidget.LibraryCardNewPaneInvoked -= FolderWidget_LibraryCardNewPaneInvoked; - folderWidget.LibraryCardPropertiesInvoked -= FolderWidget_LibraryCardPropertiesInvoked; - folderWidget.FolderWidgethowMultiPaneControlsInvoked -= FolderWidget_FolderWidgethowMultiPaneControlsInvoked; - folderWidget.LibraryCardInvoked += FolderWidget_LibraryCardInvoked; - folderWidget.LibraryCardNewPaneInvoked += FolderWidget_LibraryCardNewPaneInvoked; - folderWidget.LibraryCardPropertiesInvoked += FolderWidget_LibraryCardPropertiesInvoked; - folderWidget.FolderWidgethowMultiPaneControlsInvoked += FolderWidget_FolderWidgethowMultiPaneControlsInvoked; + Widgets.ViewModel.InsertWidget(new(quickAccessWidget, (value) => UserSettingsService.PreferencesSettingsService.FoldersWidgetExpanded = value, () => UserSettingsService.PreferencesSettingsService.FoldersWidgetExpanded), 0); + + quickAccessWidget.CardInvoked -= QuickAccessWidget_CardInvoked; + quickAccessWidget.CardNewPaneInvoked -= QuickAccessWidget_CardNewPaneInvoked; + quickAccessWidget.CardPropertiesInvoked -= QuickAccessWidget_CardPropertiesInvoked; + quickAccessWidget.QuickAccessWidgetShowMultiPaneControlsInvoked -= QuickAccessWidget_QuickAccessWidgetShowMultiPaneControlsInvoked; + quickAccessWidget.CardInvoked += QuickAccessWidget_CardInvoked; + quickAccessWidget.CardNewPaneInvoked += QuickAccessWidget_CardNewPaneInvoked; + quickAccessWidget.CardPropertiesInvoked += QuickAccessWidget_CardPropertiesInvoked; + quickAccessWidget.QuickAccessWidgetShowMultiPaneControlsInvoked += QuickAccessWidget_QuickAccessWidgetShowMultiPaneControlsInvoked; } if (shouldReloadDrivesWidget && drivesWidget is not null) { @@ -118,11 +120,11 @@ private void ViewModel_YourHomeLoadedInvoked(object? sender, Microsoft.UI.Xaml.R ReloadWidgets(); } - private void FolderWidget_FolderWidgethowMultiPaneControlsInvoked(object sender, EventArgs e) + private void QuickAccessWidget_QuickAccessWidgetShowMultiPaneControlsInvoked(object sender, EventArgs e) { - FolderWidget FolderWidget = (FolderWidget)sender; + QuickAccessWidget QuickAccessWidget = (QuickAccessWidget)sender; - FolderWidget.ShowMultiPaneControls = AppInstance.PaneHolder?.IsMultiPaneEnabled ?? false; + QuickAccessWidget.ShowMultiPaneControls = AppInstance.PaneHolder?.IsMultiPaneEnabled ?? false; } // WINUI3 @@ -175,7 +177,7 @@ private void RecentFilesWidget_RecentFilesOpenLocationInvoked(object sender, Use }); } - private void FolderWidget_LibraryCardInvoked(object sender, LibraryCardInvokedEventArgs e) + private void QuickAccessWidget_CardInvoked(object sender, QuickAccessCardInvokedEventArgs e) { AppInstance.NavigateWithArguments(FolderSettings.GetLayoutType(e.Path), new NavigationArguments() { @@ -184,14 +186,21 @@ private void FolderWidget_LibraryCardInvoked(object sender, LibraryCardInvokedEv AppInstance.InstanceViewModel.IsPageTypeNotHome = true; // show controls that were hidden on the home page } - private void FolderWidget_LibraryCardNewPaneInvoked(object sender, LibraryCardInvokedEventArgs e) + private void QuickAccessWidget_CardNewPaneInvoked(object sender, QuickAccessCardInvokedEventArgs e) { AppInstance.PaneHolder?.OpenPathInNewPane(e.Path); } - private async void FolderWidget_LibraryCardPropertiesInvoked(object sender, LibraryCardEventArgs e) + private async void QuickAccessWidget_CardPropertiesInvoked(object sender, QuickAccessCardEventArgs e) { - await FilePropertiesHelpers.OpenPropertiesWindowAsync(new LibraryItem(e.Library), AppInstance); + ListedItem listedItem = new(null!) + { + ItemPath = e.Item.Path, + ItemNameRaw = e.Item.Text, + PrimaryItemAttribute = StorageItemTypes.Folder, + ItemType = "Folder".GetLocalizedResource(), + }; + await FilePropertiesHelpers.OpenPropertiesWindowAsync(listedItem, AppInstance); } private void DrivesWidget_DrivesWidgetNewPaneInvoked(object sender, DrivesWidget.DrivesWidgetInvokedEventArgs e) diff --git a/src/Files.Backend/Services/IQuickAccessService.cs b/src/Files.Backend/Services/IQuickAccessService.cs index cf94e2d731d7..7ca080cbae22 100644 --- a/src/Files.Backend/Services/IQuickAccessService.cs +++ b/src/Files.Backend/Services/IQuickAccessService.cs @@ -9,7 +9,7 @@ public interface IQuickAccessService /// Gets the list of quick access items /// /// - Task> GetPinnedFoldersAsync(); + Task> GetPinnedFoldersAsync(bool getRecentItems = false); /// /// Pins a folder to the quick access list diff --git a/src/Files.Backend/Services/Settings/IPreferencesSettingsService.cs b/src/Files.Backend/Services/Settings/IPreferencesSettingsService.cs index a48cec4636dd..33db2d9015a6 100644 --- a/src/Files.Backend/Services/Settings/IPreferencesSettingsService.cs +++ b/src/Files.Backend/Services/Settings/IPreferencesSettingsService.cs @@ -62,9 +62,9 @@ public interface IPreferencesSettingsService : IBaseSettingsService, INotifyProp bool AlwaysOpenDualPaneInNewTab { get; set; } /// - /// Gets or sets a value indicating whether or not to display the folders widget. + /// Gets or sets a value indicating whether or not to display the quick access widget. /// - bool ShowFoldersWidget { get; set; } + bool ShowQuickAccessWidget { get; set; } /// /// Gets or sets a value indicating whether or not to display the recent files widget.