Skip to content

Commit 9a2dacf

Browse files
Fix: Fixed issues with grouping by tags (#16740)
1 parent ed318ca commit 9a2dacf

File tree

6 files changed

+85
-2
lines changed

6 files changed

+85
-2
lines changed

src/Files.App/UserControls/Menus/FileTagsContextMenu.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@ public sealed class FileTagsContextMenu : MenuFlyout
1414
private IFileTagsSettingsService FileTagsSettingsService { get; } =
1515
Ioc.Default.GetService<IFileTagsSettingsService>();
1616

17+
/// <summary>
18+
/// Event fired when an item's tags are updated (added/removed).
19+
/// Used to refresh groups in ShellViewModel.
20+
/// </summary>
21+
public event EventHandler? TagsChanged;
22+
1723
public IEnumerable<ListedItem> SelectedItems { get; }
1824

1925
public FileTagsContextMenu(IEnumerable<ListedItem> selectedItems)
@@ -81,6 +87,7 @@ private void RemoveFileTag(IEnumerable<ListedItem> selectedListedItems, TagViewM
8187
selectedItem.FileTags = tagList;
8288
}
8389
}
90+
TagsChanged?.Invoke(this, EventArgs.Empty);
8491
}
8592

8693
private void AddFileTag(IEnumerable<ListedItem> selectedListedItems, TagViewModel added)
@@ -93,6 +100,7 @@ private void AddFileTag(IEnumerable<ListedItem> selectedListedItems, TagViewMode
93100
selectedItem.FileTags = [.. existingTags, added.Uid];
94101
}
95102
}
103+
TagsChanged?.Invoke(this, EventArgs.Empty);
96104
}
97105
}
98106
}

src/Files.App/ViewModels/ShellViewModel.cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ public GitProperties EnabledGitProperties
146146
private CancellationTokenSource loadPropsCTS;
147147
private CancellationTokenSource watcherCTS;
148148
private CancellationTokenSource searchCTS;
149+
private CancellationTokenSource updateTagGroupCTS;
149150

150151
public event EventHandler DirectoryInfoUpdated;
151152

@@ -1315,9 +1316,41 @@ await SafetyExtensions.IgnoreExceptions(() =>
13151316
finally
13161317
{
13171318
itemLoadQueue.TryRemove(item.ItemPath, out _);
1319+
await RefreshTagGroups();
13181320
}
13191321
}
13201322

1323+
public async Task RefreshTagGroups()
1324+
{
1325+
if (FilesAndFolders.IsGrouped &&
1326+
folderSettings.DirectoryGroupOption is GroupOption.FileTag &&
1327+
itemLoadQueue.IsEmpty())
1328+
{
1329+
updateTagGroupCTS?.Cancel();
1330+
updateTagGroupCTS = new();
1331+
1332+
await GroupOptionsUpdatedAsync(updateTagGroupCTS.Token);
1333+
}
1334+
}
1335+
1336+
public Task UpdateItemsTags(Dictionary<string, string[]> newTags)
1337+
{
1338+
return dispatcherQueue.EnqueueOrInvokeAsync(() =>
1339+
{
1340+
int count = newTags.Count;
1341+
foreach(var item in FilesAndFolders)
1342+
{
1343+
if (newTags.TryGetValue(item.ItemPath, out var tags))
1344+
{
1345+
item.FileTags = tags;
1346+
if (--count == 0)
1347+
break;
1348+
}
1349+
}
1350+
},
1351+
Microsoft.UI.Dispatching.DispatcherQueuePriority.Low);
1352+
}
1353+
13211354
private bool CheckElevationRights(ListedItem item)
13221355
{
13231356
if (item.SyncStatusUI.LoadSyncStatus)

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,23 @@ private void UpdateTagsItems()
485485

486486
SelectedItem?.FileTagsUI?.ForEach(tag => Items.Add(new TagItem(tag)));
487487

488-
Items.Add(new FlyoutItem(new Files.App.UserControls.Menus.FileTagsContextMenu(new List<ListedItem>() { SelectedItem })));
488+
var contextMenu = new Files.App.UserControls.Menus.FileTagsContextMenu(new List<ListedItem>() { SelectedItem });
489+
contextMenu.Closed += HandleClosed;
490+
contextMenu.TagsChanged += RequireTagGroupsUpdate;
491+
492+
Items.Add(new FlyoutItem(contextMenu));
493+
494+
async void RequireTagGroupsUpdate(object? sender, EventArgs e)
495+
{
496+
if (contentPageContext.ShellPage is not null)
497+
await contentPageContext.ShellPage.ShellViewModel.RefreshTagGroups();
498+
}
499+
500+
void HandleClosed(object? sender, object e)
501+
{
502+
contextMenu.TagsChanged -= RequireTagGroupsUpdate;
503+
contextMenu.Closed -= HandleClosed;
504+
}
489505
}
490506

491507
private void SetDriveItem()

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1267,6 +1267,7 @@ private async Task HandleTagItemDroppedAsync(FileTagItem fileTagItem, ItemDroppe
12671267
{
12681268
var storageItems = await Utils.Storage.FilesystemHelpers.GetDraggedStorageItems(args.DroppedItem);
12691269
var dbInstance = FileTagsHelper.GetDbInstance();
1270+
var pathToTags = new Dictionary<string, string[]>();
12701271
foreach (var item in storageItems.Where(x => !string.IsNullOrEmpty(x.Path)))
12711272
{
12721273
var filesTags = FileTagsHelper.ReadFileTag(item.Path);
@@ -1276,8 +1277,15 @@ private async Task HandleTagItemDroppedAsync(FileTagItem fileTagItem, ItemDroppe
12761277
var fileFRN = await FileTagsHelper.GetFileFRN(item.Item);
12771278
dbInstance.SetTags(item.Path, fileFRN, filesTags);
12781279
FileTagsHelper.WriteFileTag(item.Path, filesTags);
1280+
pathToTags[item.Path] = filesTags;
12791281
}
12801282
}
1283+
1284+
if (paneHolder.ActivePane is not null)
1285+
{
1286+
await paneHolder.ActivePane.ShellViewModel.UpdateItemsTags(pathToTags);
1287+
await paneHolder.ActivePane.ShellViewModel.RefreshTagGroups();
1288+
}
12811289
}
12821290

12831291
private static DragEventArgs CompleteDragEventArgs(DragEventArgs e, string captionText, DataPackageOperation operationType)

src/Files.App/Views/Layouts/BaseLayoutPage.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -764,6 +764,21 @@ private void AddNewFileTagsToMenu(CommandBarFlyout contextMenu)
764764
},
765765
Flyout = fileTagsContextMenu
766766
});
767+
768+
fileTagsContextMenu.TagsChanged += RequireTagGroupsUpdate;
769+
fileTagsContextMenu.Closed += HandleClosed;
770+
771+
async void RequireTagGroupsUpdate(object? sender, EventArgs e)
772+
{
773+
if (ParentShellPageInstance is not null)
774+
await ParentShellPageInstance.ShellViewModel.RefreshTagGroups();
775+
}
776+
777+
void HandleClosed(object? sender, object e)
778+
{
779+
fileTagsContextMenu.TagsChanged -= RequireTagGroupsUpdate;
780+
fileTagsContextMenu.Closed -= HandleClosed;
781+
}
767782
}
768783

769784
private async Task AddShellMenuItemsAsync(List<ContextMenuFlyoutItemViewModel> shellMenuItems, CommandBarFlyout contextMenuFlyout, bool shiftPressed)

src/Files.App/Views/Layouts/DetailsLayoutPage.xaml.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -938,7 +938,7 @@ private void FileTag_PointerExited(object sender, PointerRoutedEventArgs e)
938938
VisualStateManager.GoToState((UserControl)sender, "Normal", true);
939939
}
940940

941-
private void RemoveTagIcon_Tapped(object sender, TappedRoutedEventArgs e)
941+
private async void RemoveTagIcon_Tapped(object sender, TappedRoutedEventArgs e)
942942
{
943943
var parent = (sender as FontIcon)?.Parent as StackPanel;
944944
var tagName = (parent?.Children[TAG_TEXT_BLOCK] as TextBlock)?.Text;
@@ -953,6 +953,9 @@ private void RemoveTagIcon_Tapped(object sender, TappedRoutedEventArgs e)
953953
item.FileTags = item.FileTags
954954
.Except([tagId])
955955
.ToArray();
956+
957+
if (ParentShellPageInstance is not null)
958+
await ParentShellPageInstance.ShellViewModel.RefreshTagGroups();
956959
}
957960

958961
e.Handled = true;

0 commit comments

Comments
 (0)