Skip to content

Code Quality: Removed PinnedFoldersManager & QuickAccessManager #15201

New issue

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

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

Already on GitHub? Sign in to your account

Closed
15 changes: 6 additions & 9 deletions src/Files.App/Actions/Sidebar/PinFolderToSidebarAction.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ namespace Files.App.Actions
{
internal sealed class PinFolderToSidebarAction : ObservableObject, IAction
{
private readonly IContentPageContext context;
private readonly IQuickAccessService service;
private IContentPageContext context { get; } = Ioc.Default.GetRequiredService<IContentPageContext>();
private IWindowsQuickAccessService QuickAccessService { get; } = Ioc.Default.GetRequiredService<IWindowsQuickAccessService>();

public string Label
=> "PinFolderToSidebar".GetLocalizedResource();
Expand All @@ -24,11 +24,8 @@ public bool IsExecutable

public PinFolderToSidebarAction()
{
context = Ioc.Default.GetRequiredService<IContentPageContext>();
service = Ioc.Default.GetRequiredService<IQuickAccessService>();

context.PropertyChanged += Context_PropertyChanged;
App.QuickAccessManager.UpdateQuickAccessWidget += QuickAccessManager_DataChanged;
QuickAccessService.PinnedItemsChanged += QuickAccessManager_DataChanged;
}

public async Task ExecuteAsync()
Expand All @@ -37,17 +34,17 @@ public async Task ExecuteAsync()
{
var items = context.SelectedItems.Select(x => x.ItemPath).ToArray();

await service.PinToSidebarAsync(items);
await QuickAccessService.PinFolderAsync(items);
}
else if (context.Folder is not null)
{
await service.PinToSidebarAsync(context.Folder.ItemPath);
await QuickAccessService.PinFolderAsync([context.Folder.ItemPath]);
}
}

private bool GetIsExecutable()
{
string[] pinnedFolders = [.. App.QuickAccessManager.Model.PinnedFolders];
string[] pinnedFolders = [.. QuickAccessService.PinnedFolderPaths];

return context.HasSelection
? context.SelectedItems.All(IsPinnable)
Expand Down
17 changes: 7 additions & 10 deletions src/Files.App/Actions/Sidebar/UnpinFolderToSidebarAction.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ namespace Files.App.Actions
{
internal sealed class UnpinFolderFromSidebarAction : ObservableObject, IAction
{
private readonly IContentPageContext context;
private readonly IQuickAccessService service;
private IContentPageContext context { get; } = Ioc.Default.GetRequiredService<IContentPageContext>();
private IWindowsQuickAccessService QuickAccessService { get; } = Ioc.Default.GetRequiredService<IWindowsQuickAccessService>();

public string Label
=> "UnpinFolderFromSidebar".GetLocalizedResource();
Expand All @@ -22,29 +22,26 @@ public bool IsExecutable

public UnpinFolderFromSidebarAction()
{
context = Ioc.Default.GetRequiredService<IContentPageContext>();
service = Ioc.Default.GetRequiredService<IQuickAccessService>();

context.PropertyChanged += Context_PropertyChanged;
App.QuickAccessManager.UpdateQuickAccessWidget += QuickAccessManager_DataChanged;
QuickAccessService.PinnedItemsChanged += QuickAccessService_DataChanged;
}

public async Task ExecuteAsync()
{
if (context.HasSelection)
{
var items = context.SelectedItems.Select(x => x.ItemPath).ToArray();
await service.UnpinFromSidebarAsync(items);
await QuickAccessService.UnpinFolderAsync(items);
}
else if (context.Folder is not null)
{
await service.UnpinFromSidebarAsync(context.Folder.ItemPath);
await QuickAccessService.UnpinFolderAsync([context.Folder.ItemPath]);
}
}

private bool GetIsExecutable()
{
string[] pinnedFolders = [.. App.QuickAccessManager.Model.PinnedFolders];
string[] pinnedFolders = [.. QuickAccessService.PinnedFolderPaths];

return context.HasSelection
? context.SelectedItems.All(IsPinned)
Expand All @@ -67,7 +64,7 @@ private void Context_PropertyChanged(object? sender, PropertyChangedEventArgs e)
}
}

private void QuickAccessManager_DataChanged(object? sender, ModifyQuickAccessEventArgs e)
private void QuickAccessService_DataChanged(object? sender, ModifyQuickAccessEventArgs e)
{
OnPropertyChanged(nameof(IsExecutable));
}
Expand Down
2 changes: 0 additions & 2 deletions src/Files.App/App.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ public static CommandBarFlyout? LastOpenedFlyout
}

// TODO: Replace with DI
public static QuickAccessManager QuickAccessManager { get; private set; } = null!;
public static StorageHistoryWrapper HistoryWrapper { get; private set; } = null!;
public static FileTagsManager FileTagsManager { get; private set; } = null!;
public static RecentItems RecentItemsManager { get; private set; } = null!;
Expand Down Expand Up @@ -112,7 +111,6 @@ async Task ActivateAsync()
}

// TODO: Replace with DI
QuickAccessManager = Ioc.Default.GetRequiredService<QuickAccessManager>();
HistoryWrapper = Ioc.Default.GetRequiredService<StorageHistoryWrapper>();
FileTagsManager = Ioc.Default.GetRequiredService<FileTagsManager>();
RecentItemsManager = Ioc.Default.GetRequiredService<RecentItems>();
Expand Down
5 changes: 5 additions & 0 deletions src/Files.App/Constants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,11 @@ public static class Actions
public const int MaxSelectedItems = 5;
}

public static class CLID
{
public static readonly string QuickAccess = "::{679f85cb-0220-4080-b29b-5540cc05aab6}";
}

public static class UserEnvironmentPaths
{
public static readonly string DesktopPath = Windows.Storage.UserDataPaths.GetDefault().Desktop;
Expand Down
4 changes: 2 additions & 2 deletions src/Files.App/Data/Contexts/SideBar/SideBarContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ namespace Files.App.Data.Contexts
/// <inheritdoc cref="ISidebarContext"/>
internal sealed class SidebarContext : ObservableObject, ISidebarContext
{
private readonly PinnedFoldersManager favoriteModel = App.QuickAccessManager.Model;
public IWindowsQuickAccessService QuickAccessService { get; } = Ioc.Default.GetRequiredService<IWindowsQuickAccessService>();

private int PinnedFolderItemIndex =>
IsItemRightClicked
? favoriteModel.IndexOfItem(_RightClickedItem!)
? QuickAccessService.IndexOf(_RightClickedItem!.Path)
: -1;

private INavigationControlItem? _RightClickedItem = null;
Expand Down
56 changes: 0 additions & 56 deletions src/Files.App/Data/Contracts/IQuickAccessService.cs

This file was deleted.

90 changes: 90 additions & 0 deletions src/Files.App/Data/Contracts/IWindowsQuickAccessService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
// Copyright (c) 2024 Files Community
// Licensed under the MIT License. See the LICENSE.

using System.Collections.Specialized;

namespace Files.App.Data.Contracts
{
/// <summary>
/// Provides service to manage the QuickAccess shell folder for Windows.
/// </summary>
public interface IWindowsQuickAccessService
{
/// <summary>
/// Gets invoked when the pinned folder collection has been changed.
/// </summary>
event EventHandler<NotifyCollectionChangedEventArgs>? DataChanged;

/// <summary>
/// Gets invoked when pinned items have changed.
/// </summary>
event EventHandler<ModifyQuickAccessEventArgs>? PinnedItemsChanged;

/// <summary>
/// Gets all pinned folder paths.
/// </summary>
List<string> PinnedFolderPaths { get; }

/// <summary>
/// Gets all pinned folder items.
/// </summary>
IReadOnlyList<INavigationControlItem> PinnedFolderItems { get; }

/// <summary>
/// Initializes Quick Access item list.
/// </summary>
/// <returns></returns>
Task InitializeAsync();

/// <summary>
/// Gets the list of Quick Access items.
/// </summary>
/// <returns></returns>
Task<IEnumerable<ShellFileItem>> GetFoldersAsync();

/// <summary>
/// Pins folders to the Quick Access list.
/// </summary>
/// <param name="folderPaths">The array of folders to pin.</param>
/// <returns></returns>
Task PinFolderAsync(string[] folderPaths, bool invokeQuickAccessChangedEvent = true);

/// <summary>
/// Unpins folders from the Quick Access list.
/// </summary>
/// <param name="folderPaths">The array of folders to unpin.</param>
/// <returns></returns>
Task UnpinFolderAsync(string[] folderPaths, bool invokeQuickAccessChangedEvent = true);

/// <summary>
/// Checks if a folder is pinned to the Quick Access list.
/// </summary>
/// <param name="folderPath">The path of the folder.</param>
/// <returns>true if the item is pinned.</returns>
bool IsPinnedFolder(string folderPath);

/// <summary>
/// Refreshes Quick Access pinned items.
/// </summary>
/// <param name="folderPaths">The array of paths to pin.</param>
/// <returns></returns>
Task RefreshPinnedFolders(string[] folderPaths);

/// <summary>
/// Fetches items from File Explorer.
/// </summary>
Task UpdatePinnedFolders();

/// <summary>
/// Syncs all pinned items with File Explorer.
/// </summary>
Task SyncPinnedItemsAsync();

/// <summary>
/// Returns the index of the location item in Sidebar.
/// </summary>
/// <param name="path">The path to look up.</param>
/// <returns>Index of the item.</returns>
int IndexOf(string path);
}
}
4 changes: 3 additions & 1 deletion src/Files.App/Data/Items/DriveItem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ namespace Files.App.Data.Items
{
public sealed class DriveItem : ObservableObject, INavigationControlItem, ILocatableFolder
{
private IWindowsQuickAccessService QuickAccessService { get; } = Ioc.Default.GetRequiredService<IWindowsQuickAccessService>();

private BitmapImage icon;
public BitmapImage Icon
{
Expand Down Expand Up @@ -48,7 +50,7 @@ public bool IsNetwork
=> Type == DriveType.Network;

public bool IsPinned
=> App.QuickAccessManager.Model.PinnedFolders.Contains(path);
=> QuickAccessService.PinnedFolderPaths.Contains(path);

public string MaxSpaceText
=> MaxSpace.ToSizeString();
Expand Down
13 changes: 6 additions & 7 deletions src/Files.App/Data/Items/ListedItem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,12 @@ namespace Files.App.Utils
{
public class ListedItem : ObservableObject, IGroupableItem
{
protected static IUserSettingsService UserSettingsService { get; } = Ioc.Default.GetRequiredService<IUserSettingsService>();
protected IUserSettingsService UserSettingsService { get; } = Ioc.Default.GetRequiredService<IUserSettingsService>();
protected IStartMenuService StartMenuService { get; } = Ioc.Default.GetRequiredService<IStartMenuService>();
protected IFileTagsSettingsService fileTagsSettingsService { get; } = Ioc.Default.GetRequiredService<IFileTagsSettingsService>();
protected IDateTimeFormatter dateTimeFormatter { get; } = Ioc.Default.GetRequiredService<IDateTimeFormatter>();
protected IWindowsQuickAccessService QuickAccessService { get; } = Ioc.Default.GetRequiredService<IWindowsQuickAccessService>();

protected static IStartMenuService StartMenuService { get; } = Ioc.Default.GetRequiredService<IStartMenuService>();

protected static readonly IFileTagsSettingsService fileTagsSettingsService = Ioc.Default.GetRequiredService<IFileTagsSettingsService>();

protected static readonly IDateTimeFormatter dateTimeFormatter = Ioc.Default.GetRequiredService<IDateTimeFormatter>();

public bool IsHiddenItem { get; set; } = false;

Expand Down Expand Up @@ -376,7 +375,7 @@ public override string ToString()
public bool IsGitItem => this is GitItem;
public virtual bool IsExecutable => FileExtensionHelpers.IsExecutableFile(ItemPath);
public virtual bool IsScriptFile => FileExtensionHelpers.IsScriptFile(ItemPath);
public bool IsPinned => App.QuickAccessManager.Model.PinnedFolders.Contains(itemPath);
public bool IsPinned => QuickAccessService.PinnedFolderPaths.Contains(itemPath);
public bool IsDriveRoot => ItemPath == PathNormalization.GetPathRoot(ItemPath);
public bool IsElevationRequired { get; set; }

Expand Down
Loading
Loading