Skip to content

Commit d079525

Browse files
Feature: Update the Drives Widget & Tags Widget when refreshing the Home Page (#16732)
1 parent 1d4246a commit d079525

File tree

8 files changed

+59
-42
lines changed

8 files changed

+59
-42
lines changed

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

-2
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,6 @@ public interface IAddressToolbarViewModel
4040

4141
public event ItemDraggedOverPathItemEventHandler ItemDraggedOverPathItem;
4242

43-
public event EventHandler RefreshRequested;
44-
4543
public event EventHandler RefreshWidgetsRequested;
4644

4745
public void SwitchSearchBoxVisibility();

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

+2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ public sealed partial class WidgetFileTagsContainerItem : ObservableObject, IAsy
2121

2222
public ObservableCollection<WidgetFileTagCardItem> Tags { get; }
2323

24+
public string Uid => _tagUid;
25+
2426
private string? _Color;
2527
public string? Color
2628
{

src/Files.App/ViewModels/HomeViewModel.cs

+5
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,11 @@ public void RefreshWidgetList()
115115
ReloadWidgets();
116116
}
117117

118+
public Task RefreshWidgetProperties()
119+
{
120+
return Task.WhenAll(WidgetItems.Select(w => w.WidgetItemModel.RefreshWidgetAsync()));
121+
}
122+
118123
private bool InsertWidget(WidgetContainerItem widgetModel, int atIndex)
119124
{
120125
// The widget must not be null and must implement IWidgetItemModel

src/Files.App/ViewModels/UserControls/AddressToolbarViewModel.cs

-11
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,6 @@ public sealed class AddressToolbarViewModel : ObservableObject, IAddressToolbarV
5858

5959
public event PathBoxItemDroppedEventHandler? PathBoxItemDropped;
6060

61-
public event EventHandler? RefreshRequested;
62-
6361
public event EventHandler? RefreshWidgetsRequested;
6462

6563
public ObservableCollection<PathBoxItem> PathComponents { get; } = [];
@@ -201,8 +199,6 @@ public Style LayoutThemedIcon
201199

202200
public AddressToolbarViewModel()
203201
{
204-
RefreshClickCommand = new RelayCommand<RoutedEventArgs>(e => RefreshRequested?.Invoke(this, EventArgs.Empty));
205-
206202
dispatcherQueue = DispatcherQueue.GetForCurrentThread();
207203
dragOverTimer = dispatcherQueue.CreateTimer();
208204

@@ -230,11 +226,6 @@ private async void UpdateService_OnPropertyChanged(object? sender, PropertyChang
230226
IsUpdating = UpdateService.IsUpdating;
231227
}
232228

233-
public void RefreshWidgets()
234-
{
235-
RefreshWidgetsRequested?.Invoke(this, EventArgs.Empty);
236-
}
237-
238229
private void UserSettingsService_OnSettingChangedEvent(object? sender, SettingChangedEventArgs e)
239230
{
240231
switch (e.SettingName)
@@ -449,8 +440,6 @@ public string PathControlDisplayText
449440
set => SetProperty(ref pathControlDisplayText, value);
450441
}
451442

452-
public ICommand RefreshClickCommand { get; }
453-
454443
public void PathItemSeparator_DataContextChanged(FrameworkElement sender, DataContextChangedEventArgs args)
455444
{
456445
var pathSeparatorIcon = sender as FontIcon;

src/Files.App/ViewModels/UserControls/Widgets/BaseWidgetViewModel.cs

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public abstract class BaseWidgetViewModel : ObservableObject
2424
protected IHomePageContext HomePageContext { get; } = Ioc.Default.GetRequiredService<IHomePageContext>();
2525
protected IContentPageContext ContentPageContext { get; } = Ioc.Default.GetRequiredService<IContentPageContext>();
2626
protected IFileTagsService FileTagsService { get; } = Ioc.Default.GetRequiredService<IFileTagsService>();
27+
protected IFileTagsSettingsService FileTagsSettingsService { get; } = Ioc.Default.GetRequiredService<IFileTagsSettingsService>();
2728
protected DrivesViewModel DrivesViewModel { get; } = Ioc.Default.GetRequiredService<DrivesViewModel>();
2829
protected INetworkService NetworkService { get; } = Ioc.Default.GetRequiredService<INetworkService>();
2930
protected ICommandManager CommandManager { get; } = Ioc.Default.GetRequiredService<ICommandManager>();

src/Files.App/ViewModels/UserControls/Widgets/FileTagsWidgetViewModel.cs

+43-9
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ namespace Files.App.ViewModels.UserControls.Widgets
1212
/// </summary>
1313
public sealed partial class FileTagsWidgetViewModel : BaseWidgetViewModel, IWidgetViewModel
1414
{
15+
private CancellationTokenSource _updateCTS;
16+
1517
// Properties
1618

1719
public ObservableCollection<WidgetFileTagsContainerItem> Containers { get; } = [];
@@ -34,6 +36,8 @@ public FileTagsWidgetViewModel()
3436
{
3537
_ = InitializeWidget();
3638

39+
FileTagsSettingsService.OnTagsUpdated += FileTagsSettingsService_OnTagsUpdated;
40+
3741
PinToSidebarCommand = new AsyncRelayCommand<WidgetCardItem>(ExecutePinToSidebarCommand);
3842
UnpinFromSidebarCommand = new AsyncRelayCommand<WidgetCardItem>(ExecuteUnpinFromSidebarCommand);
3943
OpenFileLocationCommand = new RelayCommand<WidgetCardItem>(ExecuteOpenFileLocationCommand);
@@ -46,20 +50,44 @@ public async Task InitializeWidget()
4650
{
4751
await foreach (var item in FileTagsService.GetTagsAsync())
4852
{
49-
var container = new WidgetFileTagsContainerItem(item.Uid)
50-
{
51-
Name = item.Name,
52-
Color = item.Color
53-
};
53+
CreateTagContainerItem(item);
54+
}
55+
}
56+
57+
public async Task RefreshWidgetAsync()
58+
{
59+
_updateCTS?.Cancel();
60+
_updateCTS = new CancellationTokenSource();
61+
await foreach (var item in FileTagsService.GetTagsAsync())
62+
{
63+
if (_updateCTS.IsCancellationRequested)
64+
break;
5465

55-
Containers.Add(container);
56-
_ = container.InitAsync();
66+
var matchingItem = Containers.First(c => c.Uid == item.Uid);
67+
if (matchingItem is null)
68+
{
69+
CreateTagContainerItem(item);
70+
}
71+
else
72+
{
73+
matchingItem.Name = item.Name;
74+
matchingItem.Color = item.Color;
75+
matchingItem.Tags.Clear();
76+
_ = matchingItem.InitAsync(_updateCTS.Token);
77+
}
5778
}
5879
}
5980

60-
public Task RefreshWidgetAsync()
81+
private void CreateTagContainerItem(TagViewModel tag)
6182
{
62-
return Task.CompletedTask;
83+
var container = new WidgetFileTagsContainerItem(tag.Uid)
84+
{
85+
Name = tag.Name,
86+
Color = tag.Color
87+
};
88+
89+
Containers.Add(container);
90+
_ = container.InitAsync();
6391
}
6492

6593
public override List<ContextMenuFlyoutItemViewModel> GetItemMenuItems(WidgetCardItem item, bool isPinned, bool isFolder = false)
@@ -189,10 +217,16 @@ private void ExecuteOpenFileLocationCommand(WidgetCardItem? item)
189217
});
190218
}
191219

220+
private async void FileTagsSettingsService_OnTagsUpdated(object? sender, EventArgs e)
221+
{
222+
await RefreshWidgetAsync();
223+
}
224+
192225
// Disposer
193226

194227
public void Dispose()
195228
{
229+
FileTagsSettingsService.OnTagsUpdated -= FileTagsSettingsService_OnTagsUpdated;
196230
}
197231
}
198232
}

src/Files.App/Views/HomePage.xaml.cs

+2-13
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,6 @@ protected override async void OnNavigatedTo(NavigationEventArgs e)
4747
AppInstance.ToolbarViewModel.CanGoForward = AppInstance.CanNavigateForward;
4848
AppInstance.ToolbarViewModel.CanNavigateToParent = false;
4949

50-
AppInstance.ToolbarViewModel.RefreshRequested -= ToolbarViewModel_RefreshRequested;
51-
AppInstance.ToolbarViewModel.RefreshRequested += ToolbarViewModel_RefreshRequested;
52-
5350
// Set path of working directory empty
5451
await AppInstance.ShellViewModel.SetWorkingDirectoryAsync("Home");
5552
AppInstance.ShellViewModel.CheckForBackgroundImage();
@@ -74,6 +71,8 @@ protected override async void OnNavigatedTo(NavigationEventArgs e)
7471

7572
AppInstance.ToolbarViewModel.PathComponents.Add(item);
7673

74+
await ViewModel.RefreshWidgetProperties();
75+
7776
base.OnNavigatedTo(e);
7877
}
7978

@@ -82,20 +81,10 @@ protected override void OnNavigatedFrom(NavigationEventArgs e)
8281
Dispose();
8382
}
8483

85-
private async void ToolbarViewModel_RefreshRequested(object? sender, EventArgs e)
86-
{
87-
AppInstance.ToolbarViewModel.CanRefresh = false;
88-
89-
await Task.WhenAll(ViewModel.WidgetItems.Select(w => w.WidgetItemModel.RefreshWidgetAsync()));
90-
91-
AppInstance.ToolbarViewModel.CanRefresh = true;
92-
}
93-
9484
// Disposer
9585

9686
public void Dispose()
9787
{
98-
AppInstance.ToolbarViewModel.RefreshRequested -= ToolbarViewModel_RefreshRequested;
9988
ViewModel?.Dispose();
10089
}
10190
}

src/Files.App/Views/Shells/BaseShellPage.cs

+6-7
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,6 @@ public BaseShellPage(CurrentInstanceViewModel instanceViewModel)
185185
ToolbarViewModel.AddressBarTextEntered += ShellPage_AddressBarTextEntered;
186186
ToolbarViewModel.PathBoxItemDropped += ShellPage_PathBoxItemDropped;
187187

188-
ToolbarViewModel.RefreshRequested += ShellPage_RefreshRequested;
189188
ToolbarViewModel.EditModeEnabled += NavigationToolbar_EditModeEnabled;
190189
ToolbarViewModel.ItemDraggedOverPathItem += ShellPage_NavigationRequested;
191190
ToolbarViewModel.PathBoxQuerySubmitted += NavigationToolbar_QuerySubmitted;
@@ -379,11 +378,6 @@ protected async void ShellPage_TextChanged(ISearchBoxViewModel sender, SearchBox
379378
}
380379
}
381380

382-
protected async void ShellPage_RefreshRequested(object sender, EventArgs e)
383-
{
384-
await Refresh_Click();
385-
}
386-
387381
protected void AppSettings_SortDirectionPreferenceUpdated(object sender, SortDirection e)
388382
{
389383
ShellViewModel?.UpdateSortDirectionStatusAsync();
@@ -562,6 +556,12 @@ public async Task Refresh_Click()
562556
ToolbarViewModel.CanRefresh = false;
563557
ShellViewModel?.RefreshItems(null);
564558
}
559+
else if (ItemDisplay.Content is HomePage homePage)
560+
{
561+
ToolbarViewModel.CanRefresh = false;
562+
await homePage.ViewModel.RefreshWidgetProperties();
563+
ToolbarViewModel.CanRefresh = true;
564+
}
565565
}
566566

567567
public virtual void Back_Click()
@@ -831,7 +831,6 @@ public virtual void Dispose()
831831
ToolbarViewModel.ToolbarPathItemLoaded -= ShellPage_ToolbarPathItemLoaded;
832832
ToolbarViewModel.AddressBarTextEntered -= ShellPage_AddressBarTextEntered;
833833
ToolbarViewModel.PathBoxItemDropped -= ShellPage_PathBoxItemDropped;
834-
ToolbarViewModel.RefreshRequested -= ShellPage_RefreshRequested;
835834
ToolbarViewModel.EditModeEnabled -= NavigationToolbar_EditModeEnabled;
836835
ToolbarViewModel.ItemDraggedOverPathItem -= ShellPage_NavigationRequested;
837836
ToolbarViewModel.PathBoxQuerySubmitted -= NavigationToolbar_QuerySubmitted;

0 commit comments

Comments
 (0)