Skip to content

Commit 217a382

Browse files
authored
Fix: Fixed crash when reordering sidebar favorites (#13599)
1 parent 9372972 commit 217a382

File tree

2 files changed

+44
-19
lines changed

2 files changed

+44
-19
lines changed

src/Files.App/Services/QuickAccessService.cs

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,27 +17,25 @@ public async Task<IEnumerable<ShellFileItem>> GetPinnedFoldersAsync()
1717
return result;
1818
}
1919

20-
public Task PinToSidebarAsync(string folderPath)
21-
{
22-
return PinToSidebarAsync(new[] { folderPath });
23-
}
24-
25-
public async Task PinToSidebarAsync(string[] folderPaths)
20+
public Task PinToSidebarAsync(string folderPath) => PinToSidebarAsync(new[] { folderPath });
21+
22+
public Task PinToSidebarAsync(string[] folderPaths) => PinToSidebarAsync(folderPaths, true);
23+
24+
private async Task PinToSidebarAsync(string[] folderPaths, bool doUpdateQuickAccessWidget)
2625
{
2726
foreach (string folderPath in folderPaths)
2827
await ContextMenu.InvokeVerb("pintohome", new[] {folderPath});
2928

3029
await App.QuickAccessManager.Model.LoadAsync();
31-
32-
App.QuickAccessManager.UpdateQuickAccessWidget?.Invoke(this, new ModifyQuickAccessEventArgs(folderPaths, true));
30+
if (doUpdateQuickAccessWidget)
31+
App.QuickAccessManager.UpdateQuickAccessWidget?.Invoke(this, new ModifyQuickAccessEventArgs(folderPaths, true));
3332
}
3433

35-
public Task UnpinFromSidebarAsync(string folderPath)
36-
{
37-
return UnpinFromSidebarAsync(new[] { folderPath });
38-
}
39-
40-
public async Task UnpinFromSidebarAsync(string[] folderPaths)
34+
public Task UnpinFromSidebarAsync(string folderPath) => UnpinFromSidebarAsync(new[] { folderPath });
35+
36+
public Task UnpinFromSidebarAsync(string[] folderPaths) => UnpinFromSidebarAsync(folderPaths, true);
37+
38+
private async Task UnpinFromSidebarAsync(string[] folderPaths, bool doUpdateQuickAccessWidget)
4139
{
4240
Type? shellAppType = Type.GetTypeFromProgID("Shell.Application");
4341
object? shell = Activator.CreateInstance(shellAppType);
@@ -76,8 +74,8 @@ await SafetyExtensions.IgnoreExceptions(async () =>
7674
}
7775

7876
await App.QuickAccessManager.Model.LoadAsync();
79-
80-
App.QuickAccessManager.UpdateQuickAccessWidget?.Invoke(this, new ModifyQuickAccessEventArgs(folderPaths, false));
77+
if (doUpdateQuickAccessWidget)
78+
App.QuickAccessManager.UpdateQuickAccessWidget?.Invoke(this, new ModifyQuickAccessEventArgs(folderPaths, false));
8179
}
8280

8381
public bool IsItemPinned(string folderPath)
@@ -93,11 +91,15 @@ public async Task SaveAsync(string[] items)
9391
App.QuickAccessManager.PinnedItemsWatcher.EnableRaisingEvents = false;
9492

9593
// Unpin every item that is below this index and then pin them all in order
96-
await UnpinFromSidebarAsync(Array.Empty<string>());
94+
await UnpinFromSidebarAsync(Array.Empty<string>(), false);
9795

98-
await PinToSidebarAsync(items);
96+
await PinToSidebarAsync(items, false);
9997
App.QuickAccessManager.PinnedItemsWatcher.EnableRaisingEvents = true;
100-
await App.QuickAccessManager.Model.LoadAsync();
98+
99+
App.QuickAccessManager.UpdateQuickAccessWidget?.Invoke(this, new ModifyQuickAccessEventArgs(items, true)
100+
{
101+
Reorder = true
102+
});
101103
}
102104
}
103105
}

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public class ModifyQuickAccessEventArgs : EventArgs
3131
public bool Add;
3232
public bool Pin = true;
3333
public bool Reset = false;
34+
public bool Reorder = false;
3435

3536
public ModifyQuickAccessEventArgs(string[] paths, bool add)
3637
{
@@ -261,6 +262,28 @@ await DispatcherQueue.EnqueueOrInvokeAsync(async () =>
261262

262263
return;
263264
}
265+
if (e.Reorder)
266+
{
267+
// Remove pinned items
268+
foreach (var itemToRemove in ItemsAdded.Where(x => x.IsPinned).ToList())
269+
ItemsAdded.Remove(itemToRemove);
270+
271+
// Add pinned items in the new order
272+
foreach (var itemToAdd in e.Paths)
273+
{
274+
var item = await App.QuickAccessManager.Model.CreateLocationItemFromPathAsync(itemToAdd);
275+
var lastIndex = ItemsAdded.IndexOf(ItemsAdded.FirstOrDefault(x => !x.IsPinned));
276+
if (ItemsAdded.Any(x => x.Path == itemToAdd))
277+
continue;
278+
279+
ItemsAdded.Insert(lastIndex >= 0 ? lastIndex : ItemsAdded.Count, new FolderCardItem(item, Path.GetFileName(item.Text), true)
280+
{
281+
Path = item.Path,
282+
});
283+
}
284+
285+
return;
286+
}
264287
if (e.Add)
265288
{
266289
foreach (var itemToAdd in e.Paths)

0 commit comments

Comments
 (0)