Skip to content

Commit 22553a5

Browse files
0x5bfahishitetsu
andauthored
Code Quality: Use view models in Widgets (#14926)
Co-authored-by: hishitetsu <[email protected]>
1 parent f72456a commit 22553a5

40 files changed

+1333
-1801
lines changed

src/Files.App/Data/Contexts/HomePage/HomePageContext.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
namespace Files.App.Data.Contexts
99
{
10-
internal sealed class HomePageContext : ObservableObject, IHomePageContext
10+
public sealed class HomePageContext : ObservableObject, IHomePageContext
1111
{
1212
private static readonly ImmutableList<WidgetFileTagCardItem> emptyTaggedItems = Enumerable.Empty<WidgetFileTagCardItem>().ToImmutableList();
1313

@@ -29,7 +29,7 @@ public IReadOnlyList<WidgetFileTagCardItem> SelectedTaggedItems
2929
public HomePageContext()
3030
{
3131
BaseWidgetViewModel.RightClickedItemChanged += HomePageWidget_RightClickedItemChanged;
32-
FileTagsWidget.SelectedTaggedItemsChanged += FileTagsWidget_SelectedTaggedItemsChanged;
32+
FileTagsWidgetViewModel.SelectedTaggedItemsChanged += FileTagsWidget_SelectedTaggedItemsChanged;
3333
}
3434

3535
private void FileTagsWidget_SelectedTaggedItemsChanged(object? sender, IEnumerable<WidgetFileTagCardItem> e)

src/Files.App/Data/Contexts/HomePage/IHomePageContext.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
namespace Files.App.Data.Contexts
77
{
8-
internal interface IHomePageContext
8+
public interface IHomePageContext
99
{
1010
/// <summary>
1111
/// The last right clicked item

src/Files.App/Data/Contracts/IFileTagsService.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
// Copyright (c) 2024 Files Community
22
// Licensed under the MIT License. See the LICENSE.
33

4-
using Files.App.ViewModels.FileTags;
54
using Files.Core.Storage.LocatableStorage;
65

76
namespace Files.App.Data.Contracts

src/Files.App/Data/Contracts/IWidgetViewModel.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public interface IWidgetViewModel : IDisposable
1717

1818
bool ShowMenuFlyout { get; }
1919

20-
MenuFlyoutItem MenuFlyoutItem { get; }
20+
MenuFlyoutItem? MenuFlyoutItem { get; }
2121

2222
Task RefreshWidgetAsync();
2323
}

src/Files.App/Data/EventArguments/QuickAccessCardEventArgs.cs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,6 @@
33

44
namespace Files.App.Data.EventArguments
55
{
6-
public sealed class QuickAccessCardEventArgs : EventArgs
7-
{
8-
public LocationItem? Item { get; set; }
9-
}
10-
11-
public sealed class QuickAccessCardInvokedEventArgs : EventArgs
12-
{
13-
public string? Path { get; set; }
14-
}
15-
166
public sealed class ModifyQuickAccessEventArgs : EventArgs
177
{
188
public string[]? Paths { get; set; }

src/Files.App/Data/Factories/ShellContextFlyoutHelper.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -341,10 +341,14 @@ x.Tag is Win32ContextMenuItem menuItem &&
341341
OpacityIconStyle = "ColorIconOpenWith",
342342
};
343343
var (_, openWithItems) = ContextFlyoutModelToElementHelper.GetAppBarItemsFromModel([openWithItem]);
344+
var index = 0;
344345
var placeholder = itemContextMenuFlyout.SecondaryCommands.FirstOrDefault(x => Equals((x as AppBarButton)?.Tag, "OpenWithPlaceholder")) as AppBarButton;
345346
if (placeholder is not null)
347+
{
346348
placeholder.Visibility = Visibility.Collapsed;
347-
itemContextMenuFlyout.SecondaryCommands.Insert(0, openWithItems.FirstOrDefault());
349+
index = itemContextMenuFlyout.SecondaryCommands.IndexOf(placeholder);
350+
}
351+
itemContextMenuFlyout.SecondaryCommands.Insert(index, openWithItems.FirstOrDefault());
348352
}
349353

350354
// Add items to sendto dropdown
@@ -353,10 +357,14 @@ x.Tag is Win32ContextMenuItem menuItem &&
353357
await sendToItem.LoadSubMenuAction();
354358

355359
var (_, sendToItems) = ContextFlyoutModelToElementHelper.GetAppBarItemsFromModel([sendToItem]);
360+
var index = 1;
356361
var placeholder = itemContextMenuFlyout.SecondaryCommands.FirstOrDefault(x => Equals((x as AppBarButton)?.Tag, "SendToPlaceholder")) as AppBarButton;
357362
if (placeholder is not null)
363+
{
358364
placeholder.Visibility = Visibility.Collapsed;
359-
itemContextMenuFlyout.SecondaryCommands.Insert(1, sendToItems.FirstOrDefault());
365+
index = itemContextMenuFlyout.SecondaryCommands.IndexOf(placeholder);
366+
}
367+
itemContextMenuFlyout.SecondaryCommands.Insert(index, sendToItems.FirstOrDefault());
360368
}
361369

362370
// Add items to shell submenu

src/Files.App/Data/Items/WidgetContainerItem.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,12 @@ public sealed class WidgetContainerItem : ObservableObject, IDisposable
1717

1818
// Properties
1919

20+
public IWidgetViewModel _WidgetItemModel;
2021
public IWidgetViewModel WidgetItemModel
21-
=> WidgetControl as IWidgetViewModel;
22+
{
23+
get => _WidgetItemModel;
24+
set => SetProperty(ref _WidgetItemModel, value);
25+
}
2226

2327
public string WidgetAutomationProperties
2428
=> WidgetItemModel.AutomationProperties;
@@ -48,11 +52,12 @@ public bool IsExpanded
4852

4953
// Constructor
5054

51-
public WidgetContainerItem(object widgetControl, Action<bool> expanderValueChangedCallback, Func<bool> expanderValueRequestedCallback)
55+
public WidgetContainerItem(object widgetControl, IWidgetViewModel widgetItemModel, Action<bool> expanderValueChangedCallback, Func<bool> expanderValueRequestedCallback)
5256
{
5357
_expanderValueChangedCallback = expanderValueChangedCallback;
5458
_expanderValueRequestedCallback = expanderValueRequestedCallback;
5559

60+
WidgetItemModel = widgetItemModel;
5661
WidgetControl = widgetControl;
5762
}
5863

src/Files.App/Data/Items/WidgetFileTagCardItem.cs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@ namespace Files.App.Data.Items
99
{
1010
public sealed partial class WidgetFileTagCardItem : WidgetCardItem
1111
{
12+
// Dependency injections
13+
14+
private IContentPageContext ContentPageContext { get; } = Ioc.Default.GetRequiredService<IContentPageContext>();
15+
1216
// Fields
1317

1418
private readonly IStorable _associatedStorable;
1519

16-
// A workaround for lack of MVVM-compliant navigation support.
17-
// This workaround must be kept until further refactor of navigation code is completed.
18-
private readonly Func<string, Task> _openAction;
19-
2020
// Properties
2121

2222
public bool IsFolder
@@ -47,10 +47,9 @@ public override string Path
4747

4848
public ICommand ClickCommand { get; }
4949

50-
public WidgetFileTagCardItem(IStorable associatedStorable, Func<string, Task> openAction, IImage? icon)
50+
public WidgetFileTagCardItem(IStorable associatedStorable, IImage? icon)
5151
{
5252
_associatedStorable = associatedStorable;
53-
_openAction = openAction;
5453
_Icon = icon;
5554
_Name = associatedStorable.Name;
5655
_Path = associatedStorable.TryGetPath();
@@ -61,7 +60,7 @@ public WidgetFileTagCardItem(IStorable associatedStorable, Func<string, Task> op
6160

6261
private Task ClickAsync()
6362
{
64-
return _openAction(_associatedStorable.Id);
63+
return NavigationHelpers.OpenPath(_associatedStorable.Id, ContentPageContext.ShellPage!);
6564
}
6665
}
6766
}

src/Files.App/Data/Items/WidgetFileTagsContainerItem.cs

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,10 @@ public sealed partial class WidgetFileTagsContainerItem : ObservableObject, IAsy
1313
private readonly IFileTagsService FileTagsService = Ioc.Default.GetRequiredService<IFileTagsService>();
1414
private readonly IImageService ImageService = Ioc.Default.GetRequiredService<IImageService>();
1515
private readonly ICommandManager Commands = Ioc.Default.GetRequiredService<ICommandManager>();
16+
private IContentPageContext ContentPageContext { get; } = Ioc.Default.GetRequiredService<IContentPageContext>();
1617

1718
private readonly string _tagUid;
1819

19-
private readonly Func<string, Task> _openAction;
20-
2120
// Properties
2221

2322
public ObservableCollection<WidgetFileTagCardItem> Tags { get; }
@@ -46,11 +45,10 @@ public string? Name
4645
public ICommand ViewMoreCommand { get; }
4746
public ICommand OpenAllCommand { get; }
4847

49-
public WidgetFileTagsContainerItem(string tagUid, Func<string, Task> openAction)
48+
public WidgetFileTagsContainerItem(string tagUid)
5049
{
5150
_tagUid = tagUid;
52-
_openAction = openAction;
53-
Tags = [];
51+
Tags = new();
5452

5553
ViewMoreCommand = new AsyncRelayCommand(ViewMore);
5654
OpenAllCommand = new AsyncRelayCommand(OpenAll);
@@ -59,21 +57,21 @@ public WidgetFileTagsContainerItem(string tagUid, Func<string, Task> openAction)
5957
/// <inheritdoc/>
6058
public async Task InitAsync(CancellationToken cancellationToken = default)
6159
{
62-
await foreach (var item in FileTagsService.GetItemsForTagAsync(_tagUid, cancellationToken))
60+
await foreach (var item in FileTagsService.GetItemsForTagAsync(_tagUid))
6361
{
64-
var icon = await ImageService.GetIconAsync(item.Storable, cancellationToken);
65-
Tags.Add(new(item.Storable, _openAction, icon));
62+
var icon = await ImageService.GetIconAsync(item.Storable, default);
63+
Tags.Add(new(item.Storable, icon));
6664
}
6765
}
6866

69-
private Task ViewMore()
67+
private Task<bool> ViewMore()
7068
{
71-
return _openAction($"tag:{Name}");
69+
return NavigationHelpers.OpenPath($"tag:{Name}", ContentPageContext.ShellPage!);
7270
}
7371

7472
private Task OpenAll()
7573
{
76-
SelectedTagChanged?.Invoke(this, new SelectedTagChangedEventArgs(Tags.Select(tag => (tag.Path, tag.IsFolder))));
74+
SelectedTagChanged?.Invoke(this, new(Tags.Select(tag => (tag.Path, tag.IsFolder))));
7775

7876
return Commands.OpenAllTaggedItems.ExecuteAsync();
7977
}

src/Files.App/ViewModels/FileTags/ListedTagViewModel.cs renamed to src/Files.App/Data/Models/ListedTagViewModel.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Copyright (c) 2024 Files Community
22
// Licensed under the MIT License. See the LICENSE.
33

4-
namespace Files.App.ViewModels.FileTags
4+
namespace Files.App.Data.Models
55
{
66
public sealed class ListedTagViewModel : ObservableObject
77
{

0 commit comments

Comments
 (0)