Skip to content

Commit f5c9710

Browse files
authored
JsonController: Optimize SidebarPinned and Terminal models loading (#1332)
1 parent 5ace4f2 commit f5c9710

File tree

14 files changed

+242
-165
lines changed

14 files changed

+242
-165
lines changed

Files/App.xaml.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
using Files.CommandLine;
2+
using Files.Controllers;
23
using Files.Controls;
3-
using Files.DataModels;
44
using Files.Filesystem;
55
using Files.Interacts;
66
using Files.View_Models;
@@ -55,7 +55,7 @@ public static IShellPage CurrentInstance
5555
public static ObservableCollection<WSLDistroItem> linuxDistroItems = new ObservableCollection<WSLDistroItem>();
5656
public static SettingsViewModel AppSettings { get; set; }
5757
public static InteractionViewModel InteractionViewModel { get; set; }
58-
public static SidebarPinnedModel SidebarPinned { get; set; }
58+
public static SidebarPinnedController SidebarPinnedController { get; set; }
5959

6060
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
6161

@@ -174,7 +174,7 @@ public static void UnpinItem_Click(object sender, RoutedEventArgs e)
174174
}
175175
else
176176
{
177-
SidebarPinned.RemoveItem(rightClickedItem.Path.ToString());
177+
SidebarPinnedController.Model.RemoveItem(rightClickedItem.Path.ToString());
178178
}
179179
}
180180

Files/Controllers/IJson.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
namespace Files.Controllers
2+
{
3+
interface IJson
4+
{
5+
string JsonFileName { get; }
6+
7+
void Init();
8+
9+
void SaveModel();
10+
}
11+
}
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
using Files.DataModels;
2+
using Newtonsoft.Json;
3+
using System;
4+
using System.Diagnostics;
5+
using System.IO;
6+
using System.Threading.Tasks;
7+
using Windows.Storage;
8+
9+
namespace Files.Controllers
10+
{
11+
public class SidebarPinnedController : IJson
12+
{
13+
private StorageFolder Folder { get; set; }
14+
15+
private StorageFile JsonFile { get; set; }
16+
17+
public SidebarPinnedModel Model { get; set; } = new SidebarPinnedModel();
18+
19+
public string JsonFileName { get; } = "PinnedItems.json";
20+
21+
public SidebarPinnedController()
22+
{
23+
Init();
24+
}
25+
26+
private async Task Load()
27+
{
28+
Folder = ApplicationData.Current.LocalCacheFolder;
29+
30+
try
31+
{
32+
JsonFile = await Folder.GetFileAsync(JsonFileName);
33+
}
34+
catch (FileNotFoundException)
35+
{
36+
try
37+
{
38+
var oldPinnedItemsFile = await Folder.GetFileAsync("PinnedItems.txt");
39+
var oldPinnedItems = await FileIO.ReadLinesAsync(oldPinnedItemsFile);
40+
await oldPinnedItemsFile.DeleteAsync();
41+
42+
foreach (var line in oldPinnedItems)
43+
{
44+
if (!Model.Items.Contains(line))
45+
{
46+
Model.Items.Add(line);
47+
}
48+
}
49+
}
50+
catch (FileNotFoundException)
51+
{
52+
Model.AddDefaultItems();
53+
}
54+
55+
JsonFile = await Folder.CreateFileAsync(JsonFileName, CreationCollisionOption.ReplaceExisting);
56+
await FileIO.WriteTextAsync(JsonFile, JsonConvert.SerializeObject(Model, Formatting.Indented));
57+
}
58+
59+
try
60+
{
61+
Model = JsonConvert.DeserializeObject<SidebarPinnedModel>(await FileIO.ReadTextAsync(JsonFile));
62+
if (Model == null)
63+
{
64+
Model = new SidebarPinnedModel();
65+
throw new Exception($"{JsonFileName} is empty, regenerating...");
66+
}
67+
}
68+
catch (Exception)
69+
{
70+
await JsonFile.DeleteAsync();
71+
Model.AddDefaultItems();
72+
Model.Save();
73+
}
74+
75+
Model.AddAllItemsToSidebar();
76+
}
77+
78+
public async void Init()
79+
{
80+
await Load();
81+
}
82+
83+
public void SaveModel()
84+
{
85+
using (var file = File.CreateText(ApplicationData.Current.LocalCacheFolder.Path + Path.DirectorySeparatorChar + JsonFileName))
86+
{
87+
JsonSerializer serializer = new JsonSerializer();
88+
serializer.Formatting = Formatting.Indented;
89+
serializer.Serialize(file, Model);
90+
}
91+
}
92+
}
93+
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
using Files.DataModels;
2+
using Newtonsoft.Json;
3+
using System;
4+
using System.IO;
5+
using System.Threading.Tasks;
6+
using Windows.Storage;
7+
8+
namespace Files.Controllers
9+
{
10+
public class TerminalController : IJson
11+
{
12+
private string defaultTerminalPath = "ms-appx:///Assets/terminal/terminal.json";
13+
14+
private StorageFile JsonFile { get; set; }
15+
16+
private StorageFolder Folder { get; set; }
17+
18+
public TerminalFileModel Model { get; set; }
19+
20+
public string JsonFileName { get; } = "terminal.json";
21+
22+
public TerminalController()
23+
{
24+
Init();
25+
}
26+
27+
private async Task Load()
28+
{
29+
Folder = await ApplicationData.Current.LocalFolder.CreateFolderAsync("settings", CreationCollisionOption.OpenIfExists);
30+
try
31+
{
32+
JsonFile = await Folder.GetFileAsync(JsonFileName);
33+
}
34+
catch (FileNotFoundException)
35+
{
36+
var defaultFile = StorageFile.GetFileFromApplicationUriAsync(new Uri(defaultTerminalPath));
37+
38+
JsonFile = await Folder.CreateFileAsync(JsonFileName);
39+
await FileIO.WriteBufferAsync(JsonFile, await FileIO.ReadBufferAsync(await defaultFile));
40+
}
41+
42+
var content = await FileIO.ReadTextAsync(JsonFile);
43+
44+
try
45+
{
46+
Model = JsonConvert.DeserializeObject<TerminalFileModel>(content);
47+
if (Model == null)
48+
{
49+
Model = new TerminalFileModel();
50+
throw new JsonSerializationException($"{JsonFileName} is empty, regenerating...");
51+
}
52+
}
53+
catch (JsonSerializationException)
54+
{
55+
var defaultFile = StorageFile.GetFileFromApplicationUriAsync(new Uri(defaultTerminalPath));
56+
57+
JsonFile = await Folder.CreateFileAsync(JsonFileName, CreationCollisionOption.ReplaceExisting);
58+
await FileIO.WriteBufferAsync(JsonFile, await FileIO.ReadBufferAsync(await defaultFile));
59+
var defaultContent = await FileIO.ReadTextAsync(JsonFile);
60+
Model = JsonConvert.DeserializeObject<TerminalFileModel>(defaultContent);
61+
}
62+
}
63+
64+
public async void Init()
65+
{
66+
await Load();
67+
await GetInstalledTerminals();
68+
}
69+
70+
public async Task GetInstalledTerminals()
71+
{
72+
var windowsTerminal = new Terminal()
73+
{
74+
Name = "Windows Terminal",
75+
Path = "wt.exe",
76+
Arguments = "-d .",
77+
Icon = ""
78+
};
79+
80+
var fluentTerminal = new Terminal()
81+
{
82+
Name = "Fluent Terminal",
83+
Path = "flute.exe",
84+
Arguments = "",
85+
Icon = ""
86+
};
87+
88+
bool isWindowsTerminalAddedOrRemoved = await Model.AddOrRemoveTerminal(windowsTerminal, "Microsoft.WindowsTerminal_8wekyb3d8bbwe");
89+
bool isFluentTerminalAddedOrRemoved = await Model.AddOrRemoveTerminal(fluentTerminal, "53621FSApps.FluentTerminal_87x1pks76srcp");
90+
if (isWindowsTerminalAddedOrRemoved || isFluentTerminalAddedOrRemoved)
91+
{
92+
SaveModel();
93+
}
94+
}
95+
96+
public void SaveModel()
97+
{
98+
using (var file = File.CreateText(Folder.Path + Path.DirectorySeparatorChar + JsonFileName))
99+
{
100+
JsonSerializer serializer = new JsonSerializer();
101+
serializer.Formatting = Formatting.Indented;
102+
serializer.Serialize(file, Model);
103+
}
104+
}
105+
}
106+
}

Files/DataModels/SidebarPinnedModel.cs

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@ public class SidebarPinnedModel
1616
[JsonIgnore]
1717
public SettingsViewModel AppSettings => App.AppSettings;
1818

19-
public static readonly string JsonFileName = "PinnedItems.json";
20-
2119
[JsonProperty("items")]
2220
public List<string> Items { get; set; } = new List<string>();
2321

@@ -56,23 +54,15 @@ public void RemoveItem(string item)
5654
}
5755
}
5856

59-
public void Save()
60-
{
61-
using (var file = File.CreateText(ApplicationData.Current.LocalCacheFolder.Path + Path.DirectorySeparatorChar + JsonFileName))
62-
{
63-
JsonSerializer serializer = new JsonSerializer();
64-
serializer.Formatting = Formatting.Indented;
65-
serializer.Serialize(file, this);
66-
}
67-
}
57+
public void Save() => App.SidebarPinnedController.SaveModel();
6858

6959
public async Task AddItemToSidebar(string path)
7060
{
7161
try
7262
{
7363
var item = await DrivesManager.GetRootFromPath(path);
7464
StorageFolder folder = await StorageFileExtensions.GetFolderFromPathAsync(path, item);
75-
int insertIndex = App.sideBarItems.IndexOf(App.sideBarItems.Last(x => x.ItemType == NavigationControlItemType.Location
65+
int insertIndex = App.sideBarItems.IndexOf(App.sideBarItems.Last(x => x.ItemType == NavigationControlItemType.Location
7666
&& !x.Path.Equals(App.AppSettings.RecycleBinPath))) + 1;
7767
var locationItem = new LocationItem
7868
{

Files/DataModels/TerminalModel.cs renamed to Files/DataModels/Terminal.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace Files.DataModels
44
{
5-
public class TerminalModel
5+
public class Terminal
66
{
77
[JsonProperty("name")]
88
public string Name { get; set; }

Files/DataModels/TerminalFileModel.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ public class TerminalFileModel
1616
public string DefaultTerminalPath { get; set; }
1717

1818
[JsonProperty("terminals")]
19-
public List<TerminalModel> Terminals { get; set; } = new List<TerminalModel>();
19+
public List<Terminal> Terminals { get; set; } = new List<Terminal>();
2020

21-
public TerminalModel GetDefaultTerminal()
21+
public Terminal GetDefaultTerminal()
2222
{
23-
TerminalModel terminal = Terminals.FirstOrDefault(x => x.Path.Equals(DefaultTerminalPath, StringComparison.OrdinalIgnoreCase));
23+
Terminal terminal = Terminals.FirstOrDefault(x => x.Path.Equals(DefaultTerminalPath, StringComparison.OrdinalIgnoreCase));
2424
if (terminal != null)
2525
{
2626
return terminal;
@@ -38,7 +38,7 @@ public void ResetToDefaultTerminal()
3838
DefaultTerminalPath = "cmd.exe";
3939
}
4040

41-
public async Task<bool> AddOrRemoveTerminal(TerminalModel terminal, string packageName)
41+
public async Task<bool> AddOrRemoveTerminal(Terminal terminal, string packageName)
4242
{
4343
bool isChanged = false;
4444
bool isInstalled = await PackageHelper.IsAppInstalledAsync(packageName);

Files/Files.csproj

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,8 +154,11 @@
154154
<Compile Include="CommandLine\ParsedCommand.cs" />
155155
<Compile Include="CommandLine\ParsedCommands.cs" />
156156
<Compile Include="CommandLine\ParsedCommandType.cs" />
157+
<Compile Include="Controllers\IJson.cs" />
158+
<Compile Include="Controllers\SidebarPinnedController.cs" />
157159
<Compile Include="Converters\StorageDeleteOptionToBooleanConverter.cs" />
158160
<Compile Include="DataModels\SidebarPinnedModel.cs" />
161+
<Compile Include="Controllers\TerminalController.cs" />
159162
<Compile Include="Dialogs\BitlockerDialog.xaml.cs">
160163
<DependentUpon>BitlockerDialog.xaml</DependentUpon>
161164
</Compile>
@@ -190,7 +193,7 @@
190193
<DependentUpon>SidebarControl.xaml</DependentUpon>
191194
</Compile>
192195
<Compile Include="DataModels\TerminalFileModel.cs" />
193-
<Compile Include="DataModels\TerminalModel.cs" />
196+
<Compile Include="DataModels\Terminal.cs" />
194197
<Compile Include="Dialogs\AddItemDialog.xaml.cs">
195198
<DependentUpon>AddItemDialog.xaml</DependentUpon>
196199
</Compile>

Files/Interacts/Interaction.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ public async void OpenPathInNewWindow(string path)
138138

139139
public async void OpenDirectoryInTerminal(object sender, RoutedEventArgs e)
140140
{
141-
var terminal = AppSettings.TerminalsModel.GetDefaultTerminal();
141+
var terminal = AppSettings.TerminalController.Model.GetDefaultTerminal();
142142

143143
if (App.Connection != null)
144144
{
@@ -159,7 +159,7 @@ public void PinItem_Click(object sender, RoutedEventArgs e)
159159
{
160160
foreach (ListedItem listedItem in CurrentInstance.ContentPage.SelectedItems)
161161
{
162-
App.SidebarPinned.AddItem(listedItem.ItemPath);
162+
App.SidebarPinnedController.Model.AddItem(listedItem.ItemPath);
163163
}
164164
}
165165
}
@@ -564,7 +564,7 @@ public void ShowFolderPropertiesButton_Click(object sender, RoutedEventArgs e)
564564

565565
public void PinDirectoryToSidebar(object sender, RoutedEventArgs e)
566566
{
567-
App.SidebarPinned.AddItem(CurrentInstance.FilesystemViewModel.WorkingDirectory);
567+
App.SidebarPinnedController.Model.AddItem(CurrentInstance.FilesystemViewModel.WorkingDirectory);
568568
}
569569

570570
private async void Manager_DataRequested(DataTransferManager sender, DataRequestedEventArgs args)

Files/UserControls/ModernNavigationToolbar.xaml.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ public async void CheckPathInput(ItemViewModel instance, string CurrentInput)
253253
catch (Exception ex) // Not a file or not accessible
254254
{
255255
// Launch terminal application if possible
256-
foreach (var item in AppSettings.TerminalsModel.Terminals)
256+
foreach (var item in AppSettings.TerminalController.Model.Terminals)
257257
{
258258
if (item.Path.Equals(CurrentInput, StringComparison.OrdinalIgnoreCase) || item.Path.Equals(CurrentInput + ".exe", StringComparison.OrdinalIgnoreCase))
259259
{

0 commit comments

Comments
 (0)