Skip to content

Commit d066cb8

Browse files
authored
Overhaul for widgets codebase (#4448)
1 parent ce2b9a2 commit d066cb8

16 files changed

+359
-72
lines changed

Files/Files.csproj

+14-3
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@
221221
<Compile Include="Helpers\NavigationHelpers.cs" />
222222
<Compile Include="Helpers\UIHelpers.cs" />
223223
<Compile Include="Helpers\WallpaperHelpers.cs" />
224+
<Compile Include="Helpers\WidgetsHelpers.cs" />
224225
<Compile Include="Helpers\Win32Helpers.cs" />
225226
<Compile Include="UserControls\RestartControl.xaml.cs">
226227
<DependentUpon>RestartControl.xaml</DependentUpon>
@@ -291,11 +292,14 @@
291292
<Compile Include="UserControls\Widgets\Bundles.xaml.cs">
292293
<DependentUpon>Bundles.xaml</DependentUpon>
293294
</Compile>
295+
<Compile Include="UserControls\Widgets\WidgetsListControl.xaml.cs">
296+
<DependentUpon>WidgetsListControl.xaml</DependentUpon>
297+
</Compile>
294298
<Compile Include="ViewModels\AdaptiveSidebarViewModel.cs" />
295299
<Compile Include="ViewModels\BaseJsonSettingsViewModel.cs" />
296-
<Compile Include="ViewModels\Bundles\BundleContainerViewModel.cs" />
297-
<Compile Include="ViewModels\Bundles\BundleItemViewModel.cs" />
298-
<Compile Include="ViewModels\Bundles\BundlesViewModel.cs" />
300+
<Compile Include="ViewModels\Widgets\Bundles\BundleContainerViewModel.cs" />
301+
<Compile Include="ViewModels\Widgets\Bundles\BundleItemViewModel.cs" />
302+
<Compile Include="ViewModels\Widgets\Bundles\BundlesViewModel.cs" />
299303
<Compile Include="ViewModels\Dialogs\DynamicDialogViewModel.cs" />
300304
<Compile Include="ViewModels\FolderSettingsViewModel.cs" />
301305
<Compile Include="ViewModels\MainPageViewModel.cs" />
@@ -456,6 +460,9 @@
456460
<Compile Include="ViewModels\SettingsViewModels\OnStartupViewModel.cs" />
457461
<Compile Include="ViewModels\SettingsViewModels\PreferencesViewModel.cs" />
458462
<Compile Include="ViewModels\SettingsViewModels\WidgetsViewModel.cs" />
463+
<Compile Include="ViewModels\Widgets\ICustomWidgetItemModel.cs" />
464+
<Compile Include="ViewModels\Widgets\IWidgetItemModel.cs" />
465+
<Compile Include="ViewModels\Widgets\WidgetsListControlViewModel.cs" />
459466
<Compile Include="Views\ColumnParam.cs" />
460467
<Compile Include="Views\ColumnShellPage.xaml.cs">
461468
<DependentUpon>ColumnShellPage.xaml</DependentUpon>
@@ -917,6 +924,10 @@
917924
<Generator>MSBuild:Compile</Generator>
918925
<SubType>Designer</SubType>
919926
</Page>
927+
<Page Include="UserControls\Widgets\WidgetsListControl.xaml">
928+
<SubType>Designer</SubType>
929+
<Generator>MSBuild:Compile</Generator>
930+
</Page>
920931
<Page Include="Views\ColumnShellPage.xaml">
921932
<SubType>Designer</SubType>
922933
<Generator>MSBuild:Compile</Generator>

Files/Helpers/WidgetsHelpers.cs

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
using Files.UserControls.Widgets;
2+
using Files.ViewModels.Widgets;
3+
4+
namespace Files.Helpers
5+
{
6+
public static class WidgetsHelpers
7+
{
8+
public static TWidget TryGetWidget<TWidget>(WidgetsListControlViewModel widgetsViewModel, TWidget defaultValue = default(TWidget)) where TWidget : IWidgetItemModel, new()
9+
{
10+
bool canAddWidget = widgetsViewModel.CanAddWidget(typeof(TWidget).Name);
11+
bool isWidgetSettingEnabled = TryGetIsWidgetSettingEnabled<TWidget>();
12+
13+
if (canAddWidget && isWidgetSettingEnabled)
14+
{
15+
return new TWidget();
16+
}
17+
else if (!canAddWidget && !isWidgetSettingEnabled) // The widgets exists but the setting has been disabled for it
18+
{
19+
// Remove the widget
20+
widgetsViewModel.RemoveWidget<TWidget>();
21+
return default(TWidget);
22+
}
23+
24+
return defaultValue;
25+
}
26+
27+
public static bool TryGetIsWidgetSettingEnabled<TWidget>() where TWidget : IWidgetItemModel
28+
{
29+
if (typeof(TWidget) == typeof(LibraryCards))
30+
{
31+
return App.AppSettings.ShowLibraryCardsWidget;
32+
}
33+
if (typeof(TWidget) == typeof(DrivesWidget))
34+
{
35+
return App.AppSettings.ShowDrivesWidget;
36+
}
37+
if (typeof(TWidget) == typeof(Bundles))
38+
{
39+
return App.AppSettings.ShowBundlesWidget;
40+
}
41+
if (typeof(TWidget) == typeof(RecentFiles))
42+
{
43+
return App.AppSettings.ShowRecentFilesWidget;
44+
}
45+
// A custom widget it is - TWidget implements ICustomWidgetItemModel
46+
if (typeof(ICustomWidgetItemModel).IsAssignableFrom(typeof(TWidget)))
47+
{
48+
// Return true for custom widgets - they're always enabled
49+
return true;
50+
}
51+
52+
return false;
53+
}
54+
}
55+
}

Files/UserControls/Widgets/Bundles.xaml.cs

+6-3
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,22 @@
1-
using Files.ViewModels.Bundles;
2-
using System;
1+
using System;
32
using Windows.UI.Xaml.Controls;
3+
using Files.ViewModels.Widgets.Bundles;
4+
using Files.ViewModels.Widgets;
45

56
// The User Control item template is documented at https://go.microsoft.com/fwlink/?LinkId=234236
67

78
namespace Files.UserControls.Widgets
89
{
9-
public sealed partial class Bundles : UserControl, IDisposable
10+
public sealed partial class Bundles : UserControl, IWidgetItemModel, IDisposable
1011
{
1112
public BundlesViewModel ViewModel
1213
{
1314
get => (BundlesViewModel)DataContext;
1415
private set => DataContext = value;
1516
}
1617

18+
public string WidgetName => nameof(Bundles);
19+
1720
public Bundles()
1821
{
1922
this.InitializeComponent();

Files/UserControls/Widgets/DrivesWidget.xaml.cs

+11-12
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22
using Files.Helpers;
33
using Files.Interacts;
44
using Files.ViewModels;
5+
using Files.ViewModels.Widgets;
56
using System;
67
using System.Collections.ObjectModel;
78
using System.ComponentModel;
9+
using System.Diagnostics;
810
using System.Linq;
911
using System.Numerics;
1012
using System.Runtime.CompilerServices;
@@ -16,7 +18,7 @@
1618

1719
namespace Files.UserControls.Widgets
1820
{
19-
public sealed partial class DrivesWidget : UserControl, INotifyPropertyChanged
21+
public sealed partial class DrivesWidget : UserControl, IWidgetItemModel, INotifyPropertyChanged
2022
{
2123
public SettingsViewModel AppSettings => App.AppSettings;
2224

@@ -47,6 +49,8 @@ public IShellPage AppInstance
4749
}
4850
}
4951

52+
public string WidgetName => nameof(DrivesWidget);
53+
5054
public DrivesWidget()
5155
{
5256
InitializeComponent();
@@ -115,19 +119,9 @@ private void GridScaleNormal(object sender, Windows.UI.Xaml.Input.PointerRoutedE
115119
visual.Scale = new Vector3(1);
116120
}
117121

118-
private bool showMultiPaneControls;
119-
120122
public bool ShowMultiPaneControls
121123
{
122-
get => showMultiPaneControls;
123-
set
124-
{
125-
if (value != showMultiPaneControls)
126-
{
127-
showMultiPaneControls = value;
128-
NotifyPropertyChanged(nameof(ShowMultiPaneControls));
129-
}
130-
}
124+
get => AppInstance.IsMultiPaneEnabled && AppInstance.IsPageMainPane;
131125
}
132126

133127
private void OpenInNewPane_Click(object sender, RoutedEventArgs e)
@@ -175,5 +169,10 @@ private async void GoToStorageSense_Click(object sender, RoutedEventArgs e)
175169
{
176170
await Launcher.LaunchUriAsync(new Uri("ms-settings:storagesense"));
177171
}
172+
173+
public void Dispose()
174+
{
175+
Debugger.Break();
176+
}
178177
}
179178
}

Files/UserControls/Widgets/LibraryCards.xaml.cs

+18-2
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@
55
using Files.Interacts;
66
using Files.ViewModels;
77
using Files.ViewModels.Dialogs;
8+
using Files.ViewModels.Widgets;
89
using Microsoft.Toolkit.Mvvm.Input;
910
using Microsoft.Toolkit.Uwp;
1011
using System;
1112
using System.Collections.Specialized;
1213
using System.ComponentModel;
14+
using System.Diagnostics;
1315
using System.Linq;
1416
using System.Numerics;
1517
using System.Runtime.CompilerServices;
@@ -21,7 +23,7 @@
2123

2224
namespace Files.UserControls.Widgets
2325
{
24-
public sealed partial class LibraryCards : UserControl, INotifyPropertyChanged
26+
public sealed partial class LibraryCards : UserControl, IWidgetItemModel, INotifyPropertyChanged
2527
{
2628
public SettingsViewModel AppSettings => App.AppSettings;
2729

@@ -41,10 +43,14 @@ public sealed partial class LibraryCards : UserControl, INotifyPropertyChanged
4143

4244
public event LibraryCardDeleteInvokedEventHandler LibraryCardDeleteInvoked;
4345

46+
public event EventHandler LibraryCardShowMultiPaneControlsInvoked;
47+
4448
public event PropertyChangedEventHandler PropertyChanged;
4549

4650
public BulkConcurrentObservableCollection<LibraryCardItem> ItemsAdded = new BulkConcurrentObservableCollection<LibraryCardItem>();
4751

52+
public string WidgetName => nameof(LibraryCards);
53+
4854
public RelayCommand<LibraryCardItem> LibraryCardClicked => new RelayCommand<LibraryCardItem>(item =>
4955
{
5056
if (string.IsNullOrEmpty(item.Path))
@@ -154,7 +160,12 @@ private void GridScaleNormal(object sender, Windows.UI.Xaml.Input.PointerRoutedE
154160

155161
public bool ShowMultiPaneControls
156162
{
157-
get => showMultiPaneControls;
163+
get
164+
{
165+
LibraryCardShowMultiPaneControlsInvoked?.Invoke(this, EventArgs.Empty);
166+
167+
return showMultiPaneControls;
168+
}
158169
set
159170
{
160171
if (value != showMultiPaneControls)
@@ -296,6 +307,11 @@ private async void DeleteLibrary_Click(object sender, RoutedEventArgs e)
296307
await dialog.ShowAsync();
297308
}
298309
}
310+
311+
public void Dispose()
312+
{
313+
Debugger.Break();
314+
}
299315
}
300316

301317
public class LibraryCardInvokedEventArgs : EventArgs

Files/UserControls/Widgets/RecentFiles.xaml.cs

+10-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
using Files.Enums;
22
using Files.Filesystem;
33
using Files.ViewModels;
4+
using Files.ViewModels.Widgets;
45
using System;
56
using System.Collections.ObjectModel;
67
using System.ComponentModel;
8+
using System.Diagnostics;
79
using System.IO;
810
using System.Runtime.CompilerServices;
911
using System.Threading.Tasks;
@@ -15,7 +17,7 @@
1517

1618
namespace Files.UserControls.Widgets
1719
{
18-
public sealed partial class RecentFiles : UserControl
20+
public sealed partial class RecentFiles : UserControl, IWidgetItemModel
1921
{
2022
public delegate void RecentFilesOpenLocationInvokedEventHandler(object sender, PathNavigationEventArgs e);
2123

@@ -29,6 +31,8 @@ public sealed partial class RecentFiles : UserControl
2931
private EmptyRecentsText Empty { get; set; } = new EmptyRecentsText();
3032
public SettingsViewModel AppSettings => App.AppSettings;
3133

34+
public string WidgetName => nameof(RecentFiles);
35+
3236
public RecentFiles()
3337
{
3438
InitializeComponent();
@@ -206,6 +210,11 @@ private void ClearRecentItems_Click(object sender, RoutedEventArgs e)
206210
mru.Clear();
207211
Empty.Visibility = Visibility.Visible;
208212
}
213+
214+
public void Dispose()
215+
{
216+
Debugger.Break();
217+
}
209218
}
210219

211220
public class RecentItem
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<UserControl
2+
x:Class="Files.UserControls.Widgets.WidgetsListControl"
3+
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
4+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
5+
xmlns:local="using:Files.UserControls.Widgets"
6+
xmlns:vm="using:Files.ViewModels.Widgets"
7+
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
8+
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
9+
mc:Ignorable="d"
10+
d:DesignHeight="300"
11+
d:DesignWidth="400">
12+
13+
<Border>
14+
<Grid>
15+
<ListView
16+
SelectionMode="None"
17+
ItemsSource="{x:Bind ViewModel.Widgets, Mode=OneWay}">
18+
19+
<!-- Remove Reveal Highlight Effect -->
20+
<ListView.ItemContainerStyle>
21+
<Style TargetType="ListViewItem">
22+
<!-- Spacing -->
23+
<Setter Property="Margin" Value="0,0,0,24" />
24+
<Setter Property="Template">
25+
<Setter.Value>
26+
<ControlTemplate TargetType="ListViewItem">
27+
<ListViewItemPresenter
28+
x:Name="Root"
29+
HorizontalContentAlignment="Stretch"
30+
VerticalContentAlignment="Stretch"
31+
RevealBackground="{ThemeResource GridViewItemRevealBackground}"
32+
RevealBorderBrush="{ThemeResource GridViewItemRevealBorderBrush}"
33+
RevealBorderThickness="0" />
34+
</ControlTemplate>
35+
</Setter.Value>
36+
</Setter>
37+
</Style>
38+
</ListView.ItemContainerStyle>
39+
</ListView>
40+
</Grid>
41+
</Border>
42+
</UserControl>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using Windows.UI.Xaml.Controls;
2+
using Files.ViewModels.Widgets;
3+
using System;
4+
5+
// The User Control item template is documented at https://go.microsoft.com/fwlink/?LinkId=234236
6+
7+
namespace Files.UserControls.Widgets
8+
{
9+
public sealed partial class WidgetsListControl : UserControl, IDisposable
10+
{
11+
public WidgetsListControlViewModel ViewModel
12+
{
13+
get => (WidgetsListControlViewModel)DataContext;
14+
set => DataContext = value;
15+
}
16+
17+
public WidgetsListControl()
18+
{
19+
this.InitializeComponent();
20+
21+
this.ViewModel = new WidgetsListControlViewModel();
22+
}
23+
24+
public void Dispose()
25+
{
26+
ViewModel?.Dispose();
27+
}
28+
}
29+
}

Files/ViewModels/Bundles/BundleContainerViewModel.cs Files/ViewModels/Widgets/Bundles/BundleContainerViewModel.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
using Windows.UI.Xaml;
2020
using Windows.UI.Xaml.Controls;
2121

22-
namespace Files.ViewModels.Bundles
22+
namespace Files.ViewModels.Widgets.Bundles
2323
{
2424
/// <summary>
2525
/// Bundle's contents view model

Files/ViewModels/Bundles/BundleItemViewModel.cs Files/ViewModels/Widgets/Bundles/BundleItemViewModel.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
using Windows.UI.Xaml.Media;
1717
using Windows.UI.Xaml.Media.Imaging;
1818

19-
namespace Files.ViewModels.Bundles
19+
namespace Files.ViewModels.Widgets.Bundles
2020
{
2121
public class BundleItemViewModel : ObservableObject, IDisposable
2222
{

Files/ViewModels/Bundles/BundlesViewModel.cs Files/ViewModels/Widgets/Bundles/BundlesViewModel.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
using Windows.UI.Xaml.Controls;
2222
using Windows.UI.Xaml.Input;
2323

24-
namespace Files.ViewModels.Bundles
24+
namespace Files.ViewModels.Widgets.Bundles
2525
{
2626
/// <summary>
2727
/// Bundles list View Model

0 commit comments

Comments
 (0)