Skip to content

Commit cefbdb5

Browse files
authored
Add recently opened directories to the taskbar jumplist (#1331)
1 parent 5a8f9f1 commit cefbdb5

22 files changed

+189
-2
lines changed

Files/App.xaml.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using Files.Filesystem;
55
using Files.Interacts;
66
using Files.View_Models;
7+
using Files.Helpers;
78
using Microsoft.AppCenter;
89
using Microsoft.AppCenter.Analytics;
910
using Microsoft.AppCenter.Crashes;
@@ -56,8 +57,8 @@ public static IShellPage CurrentInstance
5657
public static ObservableCollection<WSLDistroItem> linuxDistroItems = new ObservableCollection<WSLDistroItem>();
5758
public static SettingsViewModel AppSettings { get; set; }
5859
public static InteractionViewModel InteractionViewModel { get; set; }
60+
public static JumpListManager JumpList { get; } = new JumpListManager();
5961
public static SidebarPinnedController SidebarPinnedController { get; set; }
60-
6162
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
6263

6364
public App()

Files/Assets/FolderIcon.png

1.12 KB
Loading

Files/Files.csproj

+2
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@
175175
<Compile Include="Helpers\DialogDisplayHelper.cs" />
176176
<Compile Include="Helpers\DispatcherHelper.cs" />
177177
<Compile Include="Helpers\ItemsDataTemplateSelector.cs" />
178+
<Compile Include="Helpers\JumpListManager.cs" />
178179
<Compile Include="Helpers\NativeDirectoryChangesHelper.cs" />
179180
<Compile Include="Helpers\NativeFindStorageItemHelper.cs" />
180181
<Compile Include="Helpers\NaturalStringComparer.cs" />
@@ -304,6 +305,7 @@
304305
<Content Include="Assets\Files UWP Beta Icon.png" />
305306
<Content Include="Assets\Files UWP Icon.png" />
306307
<Content Include="Assets\FilesHome.png" />
308+
<Content Include="Assets\FolderIcon.png" />
307309
<Content Include="Assets\FolderIcon.svg" />
308310
<Content Include="Assets\FolderIconLarge.svg" />
309311
<Content Include="Assets\LargeTile.scale-100.png" />

Files/Helpers/JumpListManager.cs

+114
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.IO;
4+
using System.Linq;
5+
using System.Threading.Tasks;
6+
using Windows.UI.StartScreen;
7+
using Windows.Storage;
8+
using Files.Common;
9+
10+
namespace Files.Helpers
11+
{
12+
public sealed class JumpListManager
13+
{
14+
private JumpList _instance = null;
15+
private List<string> JumpListItemPaths { get; set; }
16+
public JumpListManager()
17+
{
18+
Initialize();
19+
}
20+
21+
private async void Initialize()
22+
{
23+
if (JumpList.IsSupported())
24+
{
25+
_instance = await JumpList.LoadCurrentAsync();
26+
27+
// Disable automatic jumplist. It doesn't work with Files UWP.
28+
_instance.SystemGroupKind = JumpListSystemGroupKind.None;
29+
JumpListItemPaths = _instance.Items.Select(item => item.Arguments).ToList();
30+
}
31+
}
32+
33+
public async void AddFolderToJumpList(string path)
34+
{
35+
await AddFolder(path);
36+
await _instance?.SaveAsync();
37+
}
38+
39+
private Task AddFolder(string path)
40+
{
41+
if (!JumpListItemPaths.Contains(path) && _instance != null)
42+
{
43+
string displayName;
44+
if (path.Equals(App.AppSettings.DesktopPath, StringComparison.OrdinalIgnoreCase))
45+
{
46+
displayName = "ms-resource:///Resources/SidebarDesktop";
47+
}
48+
else if (path.Equals(App.AppSettings.DownloadsPath, StringComparison.OrdinalIgnoreCase))
49+
{
50+
displayName = "ms-resource:///Resources/SidebarDownloads";
51+
}
52+
else if (path.Equals(App.AppSettings.DocumentsPath, StringComparison.OrdinalIgnoreCase))
53+
{
54+
displayName = "ms-resource:///Resources/SidebarDocuments";
55+
}
56+
else if (path.Equals(App.AppSettings.PicturesPath, StringComparison.OrdinalIgnoreCase))
57+
{
58+
displayName = "ms-resource:///Resources/SidebarPictures";
59+
}
60+
else if (path.Equals(App.AppSettings.MusicPath, StringComparison.OrdinalIgnoreCase))
61+
{
62+
displayName = "ms-resource:///Resources/SidebarMusic";
63+
}
64+
else if (path.Equals(App.AppSettings.VideosPath, StringComparison.OrdinalIgnoreCase))
65+
{
66+
displayName = "ms-resource:///Resources/SidebarVideos";
67+
}
68+
else if (path.Equals(App.AppSettings.RecycleBinPath, StringComparison.OrdinalIgnoreCase))
69+
{
70+
var localSettings = ApplicationData.Current.LocalSettings;
71+
displayName = localSettings.Values.Get("RecycleBin_Title", "Recycle Bin");
72+
}
73+
else
74+
{
75+
displayName = Path.GetFileName(path);
76+
}
77+
78+
var jumplistItem = JumpListItem.CreateWithArguments(path, displayName);
79+
jumplistItem.Description = jumplistItem.Arguments;
80+
jumplistItem.GroupName = "ms-resource:///Resources/JumpListRecentGroupHeader";
81+
jumplistItem.Logo = new Uri("ms-appx:///Assets/FolderIcon.png");
82+
_instance.Items.Add(jumplistItem);
83+
JumpListItemPaths.Add(path);
84+
}
85+
86+
return Task.CompletedTask;
87+
}
88+
89+
public async void RemoveFolder(string path)
90+
{
91+
if (JumpListItemPaths.Contains(path))
92+
{
93+
JumpListItemPaths.Remove(path);
94+
await UpdateAsync();
95+
}
96+
}
97+
98+
private async Task UpdateAsync()
99+
{
100+
if (_instance != null)
101+
{
102+
// Clear all items to avoid localization issues
103+
_instance?.Items.Clear();
104+
105+
foreach (string path in JumpListItemPaths)
106+
{
107+
await AddFolder(path);
108+
}
109+
110+
await _instance.SaveAsync();
111+
}
112+
}
113+
}
114+
}

Files/Interacts/Interaction.cs

+7
Original file line numberDiff line numberDiff line change
@@ -800,6 +800,8 @@ public async Task<bool> RenameFileItem(ListedItem item, string oldName, string n
800800
var folder = await ItemViewModel.GetFolderFromPathAsync(item.ItemPath);
801801

802802
await folder.RenameAsync(newName, NameCollisionOption.GenerateUniqueName);
803+
804+
App.JumpList.RemoveFolder(folder.Path);
803805
}
804806
else
805807
{
@@ -815,6 +817,8 @@ public async Task<bool> RenameFileItem(ListedItem item, string oldName, string n
815817
var folder = await ItemViewModel.GetFolderFromPathAsync(item.ItemPath);
816818

817819
await folder.RenameAsync(newName, NameCollisionOption.ReplaceExisting);
820+
821+
App.JumpList.RemoveFolder(folder.Path);
818822
}
819823
else
820824
{
@@ -888,6 +892,9 @@ public async Task<StorageFolder> MoveDirectoryAsync(StorageFolder SourceFolder,
888892
{
889893
await MoveDirectoryAsync(folderinSourceDir, DestinationFolder, folderinSourceDir.Name);
890894
}
895+
896+
App.JumpList.RemoveFolder(SourceFolder.Path);
897+
891898
return createdRoot;
892899
}
893900

Files/MultilingualResources/Files.de-DE.xlf

+4
Original file line numberDiff line numberDiff line change
@@ -961,6 +961,10 @@
961961
<source>File system:</source>
962962
<target state="needs-review-translation" state-qualifier="tm-suggestion">Dateisystem:</target>
963963
</trans-unit>
964+
<trans-unit id="JumpListRecentGroupHeader" translate="yes" xml:space="preserve">
965+
<source>Recent</source>
966+
<target state="new">Recent</target>
967+
</trans-unit>
964968
<trans-unit id="SettingsPreferencesAppLanguage.Text" translate="yes" xml:space="preserve">
965969
<source>App Language</source>
966970
<target state="new">App Language</target>

Files/MultilingualResources/Files.es-ES.xlf

+4
Original file line numberDiff line numberDiff line change
@@ -954,6 +954,10 @@
954954
<source>Moving files to Recycle Bin</source>
955955
<target state="translated">Moviendo archivos a la papelera de reciclaje</target>
956956
</trans-unit>
957+
<trans-unit id="JumpListRecentGroupHeader" translate="yes" xml:space="preserve">
958+
<source>Recent</source>
959+
<target state="new">Recent</target>
960+
</trans-unit>
957961
<trans-unit id="SettingsPreferencesAppLanguage.Text" translate="yes" xml:space="preserve">
958962
<source>App Language</source>
959963
<target state="new">App Language</target>

Files/MultilingualResources/Files.fr-FR.xlf

+4
Original file line numberDiff line numberDiff line change
@@ -957,6 +957,10 @@
957957
<source>File system:</source>
958958
<target state="needs-review-translation" state-qualifier="tm-suggestion">Système de fichiers</target>
959959
</trans-unit>
960+
<trans-unit id="JumpListRecentGroupHeader" translate="yes" xml:space="preserve">
961+
<source>Recent</source>
962+
<target state="new">Recent</target>
963+
</trans-unit>
960964
<trans-unit id="SettingsPreferencesAppLanguage.Text" translate="yes" xml:space="preserve">
961965
<source>App Language</source>
962966
<target state="new">App Language</target>

Files/MultilingualResources/Files.he-IL.xlf

+4
Original file line numberDiff line numberDiff line change
@@ -954,6 +954,10 @@
954954
<source>File system:</source>
955955
<target state="translated" state-qualifier="tm-suggestion">מערכת קבצים:</target>
956956
</trans-unit>
957+
<trans-unit id="JumpListRecentGroupHeader" translate="yes" xml:space="preserve">
958+
<source>Recent</source>
959+
<target state="new">Recent</target>
960+
</trans-unit>
957961
<trans-unit id="SettingsPreferencesAppLanguage.Text" translate="yes" xml:space="preserve">
958962
<source>App Language</source>
959963
<target state="new">App Language</target>

Files/MultilingualResources/Files.it-IT.xlf

+5
Original file line numberDiff line numberDiff line change
@@ -962,6 +962,11 @@
962962
<source>Moving files to Recycle Bin</source>
963963
<target state="new">Moving files to Recycle Bin</target>
964964
</trans-unit>
965+
966+
<trans-unit id="JumpListRecentGroupHeader" translate="yes" xml:space="preserve">
967+
<source>Recent</source>
968+
<target state="new">Recent</target>
969+
</trans-unit>
965970
<trans-unit id="SettingsPreferencesAppLanguage.Text" translate="yes" xml:space="preserve">
966971
<source>App Language</source>
967972
<target state="new">App Language</target>

Files/MultilingualResources/Files.ja-JP.xlf

+4
Original file line numberDiff line numberDiff line change
@@ -955,6 +955,10 @@
955955
<source>File system:</source>
956956
<target state="needs-review-translation" state-qualifier="tm-suggestion">ファイル システム</target>
957957
</trans-unit>
958+
<trans-unit id="JumpListRecentGroupHeader" translate="yes" xml:space="preserve">
959+
<source>Recent</source>
960+
<target state="new">Recent</target>
961+
</trans-unit>
958962
<trans-unit id="SettingsPreferencesAppLanguage.Text" translate="yes" xml:space="preserve">
959963
<source>App Language</source>
960964
<target state="new">App Language</target>

Files/MultilingualResources/Files.nl-NL.xlf

+4
Original file line numberDiff line numberDiff line change
@@ -957,6 +957,10 @@
957957
<source>File system:</source>
958958
<target state="needs-review-translation" state-qualifier="tm-suggestion">Bestandssysteem</target>
959959
</trans-unit>
960+
<trans-unit id="JumpListRecentGroupHeader" translate="yes" xml:space="preserve">
961+
<source>Recent</source>
962+
<target state="new">Recent</target>
963+
</trans-unit>
960964
<trans-unit id="SettingsPreferencesAppLanguage.Text" translate="yes" xml:space="preserve">
961965
<source>App Language</source>
962966
<target state="new">App Language</target>

Files/MultilingualResources/Files.pl-PL.xlf

+4
Original file line numberDiff line numberDiff line change
@@ -957,6 +957,10 @@
957957
<source>File system:</source>
958958
<target state="needs-review-translation" state-qualifier="tm-suggestion">System plików</target>
959959
</trans-unit>
960+
<trans-unit id="JumpListRecentGroupHeader" translate="yes" xml:space="preserve">
961+
<source>Recent</source>
962+
<target state="new">Recent</target>
963+
</trans-unit>
960964
<trans-unit id="SettingsPreferencesAppLanguage.Text" translate="yes" xml:space="preserve">
961965
<source>App Language</source>
962966
<target state="new">App Language</target>

Files/MultilingualResources/Files.pt-BR.xlf

+4
Original file line numberDiff line numberDiff line change
@@ -966,6 +966,10 @@
966966
<source>Status</source>
967967
<target state="new">Status</target>
968968
</trans-unit>
969+
<trans-unit id="JumpListRecentGroupHeader" translate="yes" xml:space="preserve">
970+
<source>Recent</source>
971+
<target state="new">Recent</target>
972+
</trans-unit>
969973
</group>
970974
</body>
971975
</file>

Files/MultilingualResources/Files.ru-RU.xlf

+4
Original file line numberDiff line numberDiff line change
@@ -954,6 +954,10 @@
954954
<source>Moving files to Recycle Bin</source>
955955
<target state="translated">Перемещение файлов в Корзину</target>
956956
</trans-unit>
957+
<trans-unit id="JumpListRecentGroupHeader" translate="yes" xml:space="preserve">
958+
<source>Recent</source>
959+
<target state="new">Recent</target>
960+
</trans-unit>
957961
<trans-unit id="SettingsPreferencesAppLanguage.Text" translate="yes" xml:space="preserve">
958962
<source>App Language</source>
959963
<target state="new">App Language</target>

Files/MultilingualResources/Files.ta.xlf

+4
Original file line numberDiff line numberDiff line change
@@ -960,6 +960,10 @@
960960
<source>File system:</source>
961961
<target state="needs-review-translation" state-qualifier="tm-suggestion">கோப்பு முறைமை:</target>
962962
</trans-unit>
963+
<trans-unit id="JumpListRecentGroupHeader" translate="yes" xml:space="preserve">
964+
<source>Recent</source>
965+
<target state="new">Recent</target>
966+
</trans-unit>
963967
<trans-unit id="SettingsPreferencesAppLanguage.Text" translate="yes" xml:space="preserve">
964968
<source>App Language</source>
965969
<target state="new">App Language</target>

Files/MultilingualResources/Files.tr-TR.xlf

+4
Original file line numberDiff line numberDiff line change
@@ -957,6 +957,10 @@
957957
<source>Moving files to Recycle Bin</source>
958958
<target state="new">Moving files to Recycle Bin</target>
959959
</trans-unit>
960+
<trans-unit id="JumpListRecentGroupHeader" translate="yes" xml:space="preserve">
961+
<source>Recent</source>
962+
<target state="new">Recent</target>
963+
</trans-unit>
960964
<trans-unit id="SettingsPreferencesAppLanguage.Text" translate="yes" xml:space="preserve">
961965
<source>App Language</source>
962966
<target state="new">App Language</target>

Files/MultilingualResources/Files.uk-UA.xlf

+4
Original file line numberDiff line numberDiff line change
@@ -954,6 +954,10 @@
954954
<source>File system:</source>
955955
<target state="translated">Файлова система:</target>
956956
</trans-unit>
957+
<trans-unit id="JumpListRecentGroupHeader" translate="yes" xml:space="preserve">
958+
<source>Recent</source>
959+
<target state="new">Recent</target>
960+
</trans-unit>
957961
<trans-unit id="SettingsPreferencesAppLanguage.Text" translate="yes" xml:space="preserve">
958962
<source>App Language</source>
959963
<target state="new">App Language</target>

Files/MultilingualResources/Files.zh-Hans.xlf

+4
Original file line numberDiff line numberDiff line change
@@ -954,6 +954,10 @@
954954
<source>File system:</source>
955955
<target state="translated">文件系统:</target>
956956
</trans-unit>
957+
<trans-unit id="JumpListRecentGroupHeader" translate="yes" xml:space="preserve">
958+
<source>Recent</source>
959+
<target state="new">Recent</target>
960+
</trans-unit>
957961
<trans-unit id="SettingsPreferencesAppLanguage.Text" translate="yes" xml:space="preserve">
958962
<source>App Language</source>
959963
<target state="new">App Language</target>

Files/Strings/en-US/Resources.resw

+3
Original file line numberDiff line numberDiff line change
@@ -828,6 +828,9 @@
828828
<data name="PropertiesDriveFileSystem.Text" xml:space="preserve">
829829
<value>File system:</value>
830830
</data>
831+
<data name="JumpListRecentGroupHeader" xml:space="preserve">
832+
<value>Recent</value>
833+
</data>
831834
<data name="SettingsPreferencesAppLanguage.Text" xml:space="preserve">
832835
<value>App Language</value>
833836
</data>

Files/View Models/ItemViewModel.cs

+3
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ public async Task SetWorkingDirectory(string value)
7474
return;
7575
}
7676

77+
App.JumpList.AddFolderToJumpList(value);
78+
7779
INavigationControlItem item = null;
7880
List<INavigationControlItem> sidebarItems = App.sideBarItems.Where(x => !string.IsNullOrWhiteSpace(x.Path)).ToList();
7981

@@ -1199,6 +1201,7 @@ await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPrio
11991201
{
12001202
IsFolderEmptyTextDisplayed = true;
12011203
}
1204+
App.JumpList.RemoveFolder(item.ItemPath);
12021205

12031206
UpdateDirectoryInfo();
12041207
});

Files/View Models/SettingsViewModel.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -663,4 +663,4 @@ public TValue Get<TValue>(TValue defaultValue, [CallerMemberName] string propert
663663

664664
private delegate bool TryParseDelegate<TValue>(string inValue, out TValue parsedValue);
665665
}
666-
}
666+
}

0 commit comments

Comments
 (0)