Skip to content

Commit c0b17f3

Browse files
authored
Use database to store layout preferences (#9437)
1 parent 12aa6eb commit c0b17f3

File tree

15 files changed

+478
-282
lines changed

15 files changed

+478
-282
lines changed

src/Files.Shared/FileTagsDb.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,15 @@ public void SetTags(string filePath, ulong? frn, string[]? tags)
3131
if (tags != null && tags.Any())
3232
{
3333
// Insert new tagged file (Id will be auto-incremented)
34-
var newTag = new TaggedFile
34+
var newTag = new TaggedFile()
3535
{
3636
FilePath = filePath,
3737
Frn = frn,
3838
Tags = tags
3939
};
4040
col.Insert(newTag);
41+
col.EnsureIndex(x => x.Frn);
42+
col.EnsureIndex(x => x.FilePath);
4143
}
4244
}
4345
else
@@ -60,6 +62,7 @@ public void SetTags(string filePath, ulong? frn, string[]? tags)
6062
{
6163
// Get a collection (or create, if doesn't exist)
6264
var col = db.GetCollection<TaggedFile>(TaggedFiles);
65+
6366
if (filePath != null)
6467
{
6568
var tmp = col.FindOne(x => x.FilePath == filePath);
@@ -189,8 +192,8 @@ public class TaggedFile
189192
{
190193
[BsonId] public int Id { get; set; }
191194
public ulong? Frn { get; set; }
192-
public string FilePath { get; set; } = null!;
193-
public string[] Tags { get; set; } = null!;
195+
public string FilePath { get; set; } = string.Empty;
196+
public string[] Tags { get; set; } = Array.Empty<string>();
194197
}
195198
}
196199
}

src/Files.Uwp/BaseLayout.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -380,11 +380,10 @@ protected virtual void BaseFolderSettings_LayoutModeChangeRequested(object sende
380380
{
381381
if (ParentShellPageInstance.SlimContentPage != null)
382382
{
383-
var layoutType = FolderSettings.GetLayoutType(ParentShellPageInstance.FilesystemViewModel.WorkingDirectory, false);
383+
var layoutType = FolderSettings.GetLayoutType(ParentShellPageInstance.FilesystemViewModel.WorkingDirectory);
384384

385385
if (layoutType != ParentShellPageInstance.CurrentPageType)
386386
{
387-
FolderSettings.IsLayoutModeChanging = true;
388387
ParentShellPageInstance.NavigateWithArguments(layoutType, new NavigationArguments()
389388
{
390389
NavPathParam = navigationArguments.NavPathParam,

src/Files.Uwp/EventArguments/LayoutPreferenceEventArgs.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using static Files.Uwp.ViewModels.FolderSettingsViewModel;
1+
using Files.Uwp.Helpers.LayoutPreferences;
22

33
namespace Files.Uwp.EventArguments
44
{

src/Files.Uwp/Files.Uwp.csproj

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,8 @@
246246
<Compile Include="Helpers\StorageSenseHelper.cs" />
247247
<Compile Include="Helpers\WindowDecorationsHelper.cs" />
248248
<Compile Include="Helpers\UniversalLogWriter.cs" />
249+
<Compile Include="Helpers\LayoutPreferences\LayoutPreferences.cs" />
250+
<Compile Include="Helpers\LayoutPreferences\LayoutPrefsDb.cs" />
249251
<Compile Include="Filesystem\FolderHelpers.cs" />
250252
<Compile Include="Filesystem\LibraryLocationItem.cs" />
251253
<Compile Include="Filesystem\LibraryManager.cs" />
@@ -1693,4 +1695,4 @@
16931695
<Target Name="AfterBuild">
16941696
</Target>
16951697
-->
1696-
</Project>
1698+
</Project>

src/Files.Uwp/Filesystem/StorageEnumerators/UniversalStorageEnumerator.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ public static class UniversalStorageEnumerator
2020
public static async Task<List<ListedItem>> ListEntries(
2121
BaseStorageFolder rootFolder,
2222
StorageFolderWithPath currentStorageFolder,
23-
Type sourcePageType,
2423
CancellationToken cancellationToken,
2524
int countLimit,
2625
Func<List<ListedItem>, Task> intermediateAction,

src/Files.Uwp/Helpers/AdaptiveLayoutHelpers.cs

Lines changed: 16 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@
55
using System;
66
using System.Linq;
77
using Windows.Storage;
8+
using System.Collections.Generic;
9+
using Files.Uwp.Filesystem;
810

911
namespace Files.Uwp.Helpers
1012
{
1113
public static class AdaptiveLayoutHelpers
1214
{
13-
public static bool PredictLayoutMode(FolderSettingsViewModel folderSettings, ItemViewModel filesystemViewModel)
15+
public static bool PredictLayoutMode(FolderSettingsViewModel folderSettings, string path, IList<ListedItem> filesAndFolders)
1416
{
1517
IUserSettingsService userSettingsService = Ioc.Default.GetService<IUserSettingsService>();
1618

@@ -24,8 +26,6 @@ public static bool PredictLayoutMode(FolderSettingsViewModel folderSettings, Ite
2426

2527
bool desktopIniFound = false;
2628

27-
string path = filesystemViewModel?.WorkingDirectory;
28-
2929
if (string.IsNullOrWhiteSpace(path))
3030
{
3131
return false;
@@ -46,39 +46,15 @@ public static bool PredictLayoutMode(FolderSettingsViewModel folderSettings, Ite
4646
var folderTypeKey = viewModeSection.Keys.FirstOrDefault(s => "FolderType".Equals(s.KeyName, StringComparison.OrdinalIgnoreCase));
4747
if (folderTypeKey != null)
4848
{
49-
switch (folderTypeKey.Value)
49+
var setLayout = (folderTypeKey.Value) switch
5050
{
51-
case "Documents":
52-
{
53-
layoutDetails();
54-
break;
55-
}
56-
57-
case "Pictures":
58-
{
59-
layoutGridView();
60-
break;
61-
}
62-
63-
case "Music":
64-
{
65-
layoutDetails();
66-
break;
67-
}
68-
69-
case "Videos":
70-
{
71-
layoutGridView();
72-
break;
73-
}
74-
75-
default:
76-
{
77-
layoutDetails();
78-
break;
79-
}
80-
}
81-
51+
"Documents" => layoutDetails,
52+
"Pictures" => layoutGridView,
53+
"Music" => layoutDetails,
54+
"Videos" => layoutGridView,
55+
_ => layoutDetails
56+
};
57+
setLayout();
8258
desktopIniFound = true;
8359
}
8460
}
@@ -89,12 +65,12 @@ public static bool PredictLayoutMode(FolderSettingsViewModel folderSettings, Ite
8965
{
9066
return true;
9167
}
92-
if (filesystemViewModel.FilesAndFolders.Count == 0)
68+
if (filesAndFolders.Count == 0)
9369
{
9470
return false;
9571
}
9672

97-
int allItemsCount = filesystemViewModel.FilesAndFolders.Count;
73+
int allItemsCount = filesAndFolders.Count;
9874

9975
int mediaCount;
10076
int imagesCount;
@@ -106,15 +82,15 @@ public static bool PredictLayoutMode(FolderSettingsViewModel folderSettings, Ite
10682
float foldersPercentage;
10783
float miscFilesPercentage;
10884

109-
mediaCount = filesystemViewModel.FilesAndFolders.Where((item) =>
85+
mediaCount = filesAndFolders.Where((item) =>
11086
{
11187
return !string.IsNullOrEmpty(item.FileExtension) && MediaPreviewViewModel.ContainsExtension(item.FileExtension.ToLowerInvariant());
11288
}).Count();
113-
imagesCount = filesystemViewModel.FilesAndFolders.Where((item) =>
89+
imagesCount = filesAndFolders.Where((item) =>
11490
{
11591
return !string.IsNullOrEmpty(item.FileExtension) && ImagePreviewViewModel.ContainsExtension(item.FileExtension.ToLowerInvariant());
11692
}).Count();
117-
foldersCount = filesystemViewModel.FilesAndFolders.Where((item) => item.PrimaryItemAttribute == StorageItemTypes.Folder).Count();
93+
foldersCount = filesAndFolders.Where((item) => item.PrimaryItemAttribute == StorageItemTypes.Folder).Count();
11894
miscFilesCount = allItemsCount - (mediaCount + imagesCount + foldersCount);
11995

12096
mediaPercentage = (float)((float)mediaCount / (float)allItemsCount) * 100.0f;
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
using CommunityToolkit.Mvvm.DependencyInjection;
2+
using Files.Backend.Services.Settings;
3+
using Files.Shared.Enums;
4+
using Files.Uwp.ViewModels;
5+
6+
namespace Files.Uwp.Helpers.LayoutPreferences
7+
{
8+
public class LayoutPreferences
9+
{
10+
private IUserSettingsService UserSettingsService { get; } = Ioc.Default.GetService<IUserSettingsService>();
11+
12+
public SortOption DirectorySortOption;
13+
public SortDirection DirectorySortDirection;
14+
public bool SortDirectoriesAlongsideFiles;
15+
public GroupOption DirectoryGroupOption;
16+
public FolderLayoutModes LayoutMode;
17+
public int GridViewSize;
18+
public bool IsAdaptiveLayoutOverridden;
19+
20+
public ColumnsViewModel ColumnsViewModel;
21+
22+
[LiteDB.BsonIgnore]
23+
public static LayoutPreferences DefaultLayoutPreferences => new LayoutPreferences();
24+
25+
public LayoutPreferences()
26+
{
27+
this.LayoutMode = UserSettingsService.LayoutSettingsService.DefaultLayoutMode;
28+
this.GridViewSize = UserSettingsService.LayoutSettingsService.DefaultGridViewSize;
29+
this.DirectorySortOption = UserSettingsService.LayoutSettingsService.DefaultDirectorySortOption;
30+
this.DirectoryGroupOption = UserSettingsService.LayoutSettingsService.DefaultDirectoryGroupOption;
31+
this.DirectorySortDirection = UserSettingsService.LayoutSettingsService.DefaultDirectorySortDirection;
32+
this.SortDirectoriesAlongsideFiles = UserSettingsService.LayoutSettingsService.DefaultSortDirectoriesAlongsideFiles;
33+
this.IsAdaptiveLayoutOverridden = false;
34+
35+
this.ColumnsViewModel = new ColumnsViewModel();
36+
this.ColumnsViewModel.DateCreatedColumn.UserCollapsed = !UserSettingsService.LayoutSettingsService.ShowDateCreatedColumn;
37+
this.ColumnsViewModel.DateModifiedColumn.UserCollapsed = !UserSettingsService.LayoutSettingsService.ShowDateColumn;
38+
this.ColumnsViewModel.ItemTypeColumn.UserCollapsed = !UserSettingsService.LayoutSettingsService.ShowTypeColumn;
39+
this.ColumnsViewModel.SizeColumn.UserCollapsed = !UserSettingsService.LayoutSettingsService.ShowSizeColumn;
40+
this.ColumnsViewModel.TagColumn.UserCollapsed = !UserSettingsService.LayoutSettingsService.ShowFileTagColumn;
41+
}
42+
43+
public override bool Equals(object obj)
44+
{
45+
if (obj == null)
46+
{
47+
return false;
48+
}
49+
if (obj == this)
50+
{
51+
return true;
52+
}
53+
if (obj is LayoutPreferences prefs)
54+
{
55+
return (
56+
prefs.LayoutMode == this.LayoutMode &&
57+
prefs.GridViewSize == this.GridViewSize &&
58+
prefs.DirectorySortOption == this.DirectorySortOption &&
59+
prefs.DirectorySortDirection == this.DirectorySortDirection &&
60+
prefs.SortDirectoriesAlongsideFiles == this.SortDirectoriesAlongsideFiles &&
61+
prefs.IsAdaptiveLayoutOverridden == this.IsAdaptiveLayoutOverridden &&
62+
prefs.ColumnsViewModel.Equals(this.ColumnsViewModel));
63+
}
64+
return base.Equals(obj);
65+
}
66+
67+
public override int GetHashCode()
68+
{
69+
var hashCode = LayoutMode.GetHashCode();
70+
hashCode = (hashCode * 397) ^ GridViewSize.GetHashCode();
71+
hashCode = (hashCode * 397) ^ DirectorySortOption.GetHashCode();
72+
hashCode = (hashCode * 397) ^ DirectorySortDirection.GetHashCode();
73+
hashCode = (hashCode * 397) ^ SortDirectoriesAlongsideFiles.GetHashCode();
74+
hashCode = (hashCode * 397) ^ IsAdaptiveLayoutOverridden.GetHashCode();
75+
hashCode = (hashCode * 397) ^ ColumnsViewModel.GetHashCode();
76+
return hashCode;
77+
}
78+
}
79+
}

0 commit comments

Comments
 (0)