Skip to content

Commit 4ef0adb

Browse files
authored
Code Quality: Removed WidgetsListControl (#13941)
1 parent 3024491 commit 4ef0adb

File tree

13 files changed

+782
-647
lines changed

13 files changed

+782
-647
lines changed

src/Files.App/Helpers/Application/AppLifecycleHelper.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ public static IHost ConfigureHost()
163163
.AddSingleton<NetworkDrivesViewModel>()
164164
.AddSingleton<StatusCenterViewModel>()
165165
.AddSingleton<AppearanceViewModel>()
166+
.AddTransient<HomeViewModel>()
166167
// Utilities
167168
.AddSingleton<QuickAccessManager>()
168169
.AddSingleton<StorageHistoryWrapper>()

src/Files.App/UserControls/Widgets/DrivesWidget.xaml.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public async Task LoadCardThumbnailAsync()
5858
public int CompareTo(DriveCardItem? other) => Item.Path.CompareTo(other?.Item?.Path);
5959
}
6060

61-
public sealed partial class DrivesWidget : HomePageWidget, IWidgetItemModel, INotifyPropertyChanged
61+
public sealed partial class DrivesWidget : HomePageWidget, IWidgetItem, INotifyPropertyChanged
6262
{
6363
public IUserSettingsService userSettingsService { get; } = Ioc.Default.GetRequiredService<IUserSettingsService>();
6464

src/Files.App/UserControls/Widgets/FileTagsWidget.xaml.cs

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

1616
namespace Files.App.UserControls.Widgets
1717
{
18-
public sealed partial class FileTagsWidget : HomePageWidget, IWidgetItemModel
18+
public sealed partial class FileTagsWidget : HomePageWidget, IWidgetItem
1919
{
2020
private readonly IUserSettingsService userSettingsService;
2121

src/Files.App/UserControls/Widgets/QuickAccessWidget.xaml.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ public async Task LoadCardThumbnailAsync()
8989
}
9090
}
9191

92-
public sealed partial class QuickAccessWidget : HomePageWidget, IWidgetItemModel, INotifyPropertyChanged
92+
public sealed partial class QuickAccessWidget : HomePageWidget, IWidgetItem, INotifyPropertyChanged
9393
{
9494
public IUserSettingsService userSettingsService { get; } = Ioc.Default.GetRequiredService<IUserSettingsService>();
9595

src/Files.App/UserControls/Widgets/RecentFilesWidget.xaml.cs

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

1616
namespace Files.App.UserControls.Widgets
1717
{
18-
public sealed partial class RecentFilesWidget : HomePageWidget, IWidgetItemModel, INotifyPropertyChanged
18+
public sealed partial class RecentFilesWidget : HomePageWidget, IWidgetItem, INotifyPropertyChanged
1919
{
2020
public delegate void RecentFilesOpenLocationInvokedEventHandler(object sender, PathNavigationEventArgs e);
2121

src/Files.App/UserControls/Widgets/WidgetsListControl.xaml

Lines changed: 0 additions & 510 deletions
This file was deleted.

src/Files.App/UserControls/Widgets/WidgetsListControl.xaml.cs

Lines changed: 0 additions & 26 deletions
This file was deleted.

src/Files.App/Utils/Widgets/WidgetsHelpers.cs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,12 @@
33

44
using Files.App.UserControls.Widgets;
55
using Files.App.ViewModels.Widgets;
6-
using Files.Core.Services.Settings;
7-
using System.Collections.Generic;
86

97
namespace Files.App.Helpers
108
{
119
public static class WidgetsHelpers
1210
{
13-
public static TWidget? TryGetWidget<TWidget>(IGeneralSettingsService generalSettingsService, WidgetsListControlViewModel widgetsViewModel, out bool shouldReload, TWidget? defaultValue = default) where TWidget : IWidgetItemModel, new()
11+
public static TWidget? TryGetWidget<TWidget>(IGeneralSettingsService generalSettingsService, HomeViewModel widgetsViewModel, out bool shouldReload, TWidget? defaultValue = default) where TWidget : IWidgetItem, new()
1412
{
1513
bool canAddWidget = widgetsViewModel.CanAddWidget(typeof(TWidget).Name);
1614
bool isWidgetSettingEnabled = TryGetIsWidgetSettingEnabled<TWidget>(generalSettingsService);
@@ -38,7 +36,7 @@ public static class WidgetsHelpers
3836
return (defaultValue);
3937
}
4038

41-
public static bool TryGetIsWidgetSettingEnabled<TWidget>(IGeneralSettingsService generalSettingsService) where TWidget : IWidgetItemModel
39+
public static bool TryGetIsWidgetSettingEnabled<TWidget>(IGeneralSettingsService generalSettingsService) where TWidget : IWidgetItem
4240
{
4341
if (typeof(TWidget) == typeof(QuickAccessWidget))
4442
{
@@ -57,8 +55,7 @@ public static bool TryGetIsWidgetSettingEnabled<TWidget>(IGeneralSettingsService
5755
return generalSettingsService.ShowRecentFilesWidget;
5856
}
5957

60-
// A custom widget it is - TWidget implements ICustomWidgetItemModel
61-
return typeof(ICustomWidgetItemModel).IsAssignableFrom(typeof(TWidget)); // Return true for custom widgets - they're always enabled
58+
return false;
6259
}
6360
}
64-
}
61+
}

src/Files.App/ViewModels/HomeViewModel.cs

Lines changed: 90 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,36 +9,112 @@ namespace Files.App.ViewModels
99
{
1010
public class HomeViewModel : ObservableObject, IDisposable
1111
{
12-
private readonly WidgetsListControlViewModel widgetsViewModel;
12+
public ObservableCollection<WidgetItem> WidgetItems { get; } = new();
1313

14-
private IShellPage associatedInstance;
14+
public ICommand HomePageLoadedCommand { get; }
1515

16-
public event EventHandler<RoutedEventArgs> YourHomeLoadedInvoked;
16+
public event EventHandler<RoutedEventArgs>? HomePageLoadedInvoked;
17+
public event EventHandler? WidgetListRefreshRequestedInvoked;
1718

18-
public ICommand YourHomeLoadedCommand { get; private set; }
19+
public HomeViewModel()
20+
{
21+
HomePageLoadedCommand = new RelayCommand<RoutedEventArgs>(ExecuteHomePageLoadedCommand);
22+
}
23+
24+
private void ExecuteHomePageLoadedCommand(RoutedEventArgs? e)
25+
{
26+
HomePageLoadedInvoked?.Invoke(this, e!);
27+
}
28+
29+
public void RefreshWidgetList()
30+
{
31+
for (int i = 0; i < WidgetItems.Count; i++)
32+
{
33+
if (!WidgetItems[i].WidgetItemModel.IsWidgetSettingEnabled)
34+
{
35+
RemoveWidgetAt(i);
36+
}
37+
}
38+
39+
WidgetListRefreshRequestedInvoked?.Invoke(this, EventArgs.Empty);
40+
}
41+
42+
public bool AddWidget(WidgetItem widgetModel)
43+
{
44+
return InsertWidget(widgetModel, WidgetItems.Count + 1);
45+
}
1946

20-
public HomeViewModel(WidgetsListControlViewModel widgetsViewModel, IShellPage associatedInstance)
47+
public bool InsertWidget(WidgetItem widgetModel, int atIndex)
2148
{
22-
this.widgetsViewModel = widgetsViewModel;
23-
this.associatedInstance = associatedInstance;
49+
// The widget must not be null and must implement IWidgetItemModel
50+
if (widgetModel.WidgetItemModel is not IWidgetItem widgetItemModel)
51+
{
52+
return false;
53+
}
2454

25-
// Create commands
26-
YourHomeLoadedCommand = new RelayCommand<RoutedEventArgs>(YourHomeLoaded);
55+
// Don't add existing ones!
56+
if (!CanAddWidget(widgetItemModel.WidgetName))
57+
{
58+
return false;
59+
}
60+
61+
if (atIndex > WidgetItems.Count)
62+
{
63+
WidgetItems.Add(widgetModel);
64+
}
65+
else
66+
{
67+
WidgetItems.Insert(atIndex, widgetModel);
68+
}
69+
70+
return true;
71+
}
72+
73+
public bool CanAddWidget(string widgetName)
74+
{
75+
return !(WidgetItems.Any((item) => item.WidgetItemModel.WidgetName == widgetName));
76+
}
77+
78+
public void RemoveWidgetAt(int index)
79+
{
80+
if (index < 0)
81+
{
82+
return;
83+
}
84+
85+
WidgetItems[index].Dispose();
86+
WidgetItems.RemoveAt(index);
2787
}
2888

29-
public void ChangeAppInstance(IShellPage associatedInstance)
89+
public void RemoveWidget<TWidget>() where TWidget : IWidgetItem
3090
{
31-
this.associatedInstance = associatedInstance;
91+
int indexToRemove = -1;
92+
93+
for (int i = 0; i < WidgetItems.Count; i++)
94+
{
95+
if (typeof(TWidget).IsAssignableFrom(WidgetItems[i].WidgetControl.GetType()))
96+
{
97+
// Found matching types
98+
indexToRemove = i;
99+
break;
100+
}
101+
}
102+
103+
RemoveWidgetAt(indexToRemove);
32104
}
33105

34-
private void YourHomeLoaded(RoutedEventArgs e)
106+
public void ReorderWidget(WidgetItem widgetModel, int place)
35107
{
36-
YourHomeLoadedInvoked?.Invoke(this, e);
108+
int widgetIndex = WidgetItems.IndexOf(widgetModel);
109+
WidgetItems.Move(widgetIndex, place);
37110
}
38111

39112
public void Dispose()
40113
{
41-
widgetsViewModel?.Dispose();
114+
for (int i = 0; i < WidgetItems.Count; i++)
115+
WidgetItems[i].Dispose();
116+
117+
WidgetItems.Clear();
42118
}
43119
}
44120
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// Copyright (c) 2023 Files Community
2+
// Licensed under the MIT License. See the LICENSE.
3+
4+
using Microsoft.UI.Xaml.Controls;
5+
6+
namespace Files.App.ViewModels.Widgets
7+
{
8+
public interface IWidgetItem : IDisposable
9+
{
10+
string WidgetName { get; }
11+
12+
string WidgetHeader { get; }
13+
14+
string AutomationProperties { get; }
15+
16+
bool IsWidgetSettingEnabled { get; }
17+
18+
bool ShowMenuFlyout { get; }
19+
20+
MenuFlyoutItem MenuFlyoutItem { get; }
21+
22+
Task RefreshWidgetAsync();
23+
}
24+
}

0 commit comments

Comments
 (0)