Skip to content

Commit 3fcea26

Browse files
authored
Implement folder setting to sort directories and files together and add option to toolbar sort flyout (#9098)
1 parent 62bb145 commit 3fcea26

File tree

11 files changed

+112
-17
lines changed

11 files changed

+112
-17
lines changed

Files.sln

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
Microsoft Visual Studio Solution File, Format Version 12.00
32
# Visual Studio Version 16
43
VisualStudioVersion = 16.0.31911.196

src/Files.Backend/Services/Settings/ILayoutSettingsService.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ public interface ILayoutSettingsService : IBaseSettingsService, INotifyPropertyC
3838

3939
SortOption DefaultDirectorySortOption { get; set; }
4040

41+
bool DefaultSortDirectoriesAlongsideFiles { get; set; }
42+
4143
GroupOption DefaultDirectoryGroupOption { get; set; }
4244
}
4345
}

src/Files.Backend/Services/Settings/IPreferencesSettingsService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public interface IPreferencesSettingsService : IBaseSettingsService, INotifyProp
3939
/// Gets or sets a value indicating whether or not to display dot files.
4040
/// </summary>
4141
bool ShowDotFiles{ get; set; }
42-
42+
4343
/// <summary>
4444
/// Gets or sets a value indicating whether or not files should be sorted together with folders.
4545
/// </summary>

src/Files.Uwp/Helpers/ItemListDisplayHelpers/SortingHelper.cs

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using Files.Shared.Enums;
22
using Files.Uwp.Filesystem;
3-
using Files.Backend.Services.Settings;
43
using CommunityToolkit.Mvvm.DependencyInjection;
54
using System;
65
using System.Collections.Generic;
@@ -30,7 +29,7 @@ public static Func<ListedItem, object> GetSortFunc(SortOption directorySortOptio
3029
};
3130
}
3231

33-
public static IEnumerable<ListedItem> OrderFileList(List<ListedItem> filesAndFolders, SortOption directorySortOption, SortDirection directorySortDirection)
32+
public static IEnumerable<ListedItem> OrderFileList(List<ListedItem> filesAndFolders, SortOption directorySortOption, SortDirection directorySortDirection, bool sortDirectoriesAlongsideFiles)
3433
{
3534
var orderFunc = GetSortFunc(directorySortOption);
3635
var naturalStringComparer = NaturalStringComparer.GetForProcessor();
@@ -40,13 +39,11 @@ public static IEnumerable<ListedItem> OrderFileList(List<ListedItem> filesAndFol
4039
static bool folderThenFileAsync(ListedItem listedItem) => (listedItem.PrimaryItemAttribute == StorageItemTypes.File || listedItem.IsShortcutItem || listedItem.IsZipItem);
4140
IOrderedEnumerable<ListedItem> ordered;
4241

43-
IUserSettingsService userSettingsService = Ioc.Default.GetService<IUserSettingsService>();
44-
4542
if (directorySortDirection == SortDirection.Ascending)
4643
{
4744
if (directorySortOption == SortOption.Name)
4845
{
49-
if (userSettingsService.PreferencesSettingsService.ListAndSortDirectoriesAlongsideFiles)
46+
if (sortDirectoriesAlongsideFiles)
5047
{
5148
ordered = filesAndFolders.OrderBy(orderFunc, naturalStringComparer);
5249
}
@@ -57,7 +54,7 @@ public static IEnumerable<ListedItem> OrderFileList(List<ListedItem> filesAndFol
5754
}
5855
else if (directorySortOption == SortOption.FileTag)
5956
{
60-
if (userSettingsService.PreferencesSettingsService.ListAndSortDirectoriesAlongsideFiles)
57+
if (sortDirectoriesAlongsideFiles)
6158
{
6259
ordered = filesAndFolders.OrderBy(x => string.IsNullOrEmpty(orderFunc(x) as string)).ThenBy(orderFunc);
6360
}
@@ -68,7 +65,7 @@ public static IEnumerable<ListedItem> OrderFileList(List<ListedItem> filesAndFol
6865
}
6966
else
7067
{
71-
if (userSettingsService.PreferencesSettingsService.ListAndSortDirectoriesAlongsideFiles)
68+
if (sortDirectoriesAlongsideFiles)
7269
{
7370
ordered = filesAndFolders.OrderBy(orderFunc);
7471
}
@@ -82,7 +79,7 @@ public static IEnumerable<ListedItem> OrderFileList(List<ListedItem> filesAndFol
8279
{
8380
if (directorySortOption == SortOption.Name)
8481
{
85-
if (userSettingsService.PreferencesSettingsService.ListAndSortDirectoriesAlongsideFiles)
82+
if (sortDirectoriesAlongsideFiles)
8683
{
8784
ordered = filesAndFolders.OrderByDescending(orderFunc, naturalStringComparer);
8885
}
@@ -93,7 +90,7 @@ public static IEnumerable<ListedItem> OrderFileList(List<ListedItem> filesAndFol
9390
}
9491
else if (directorySortOption == SortOption.FileTag)
9592
{
96-
if (userSettingsService.PreferencesSettingsService.ListAndSortDirectoriesAlongsideFiles)
93+
if (sortDirectoriesAlongsideFiles)
9794
{
9895
ordered = filesAndFolders.OrderBy(x => string.IsNullOrEmpty(orderFunc(x) as string)).ThenByDescending(orderFunc);
9996
}
@@ -104,7 +101,7 @@ public static IEnumerable<ListedItem> OrderFileList(List<ListedItem> filesAndFol
104101
}
105102
else
106103
{
107-
if (userSettingsService.PreferencesSettingsService.ListAndSortDirectoriesAlongsideFiles)
104+
if (sortDirectoriesAlongsideFiles)
108105
{
109106
ordered = filesAndFolders.OrderByDescending(orderFunc);
110107
}

src/Files.Uwp/ServicesImplementation/Settings/LayoutSettingsService.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,14 @@ namespace Files.Uwp.ServicesImplementation.Settings
66
{
77
internal sealed class LayoutSettingsService : BaseObservableJsonSettings, ILayoutSettingsService
88
{
9+
private readonly IUserSettingsService userSettingsService;
10+
911
public LayoutSettingsService(ISettingsSharingContext settingsSharingContext)
1012
{
1113
// Register root
1214
RegisterSettingsContext(settingsSharingContext);
15+
16+
userSettingsService = settingsSharingContext as IUserSettingsService;
1317
}
1418

1519
public bool ShowDateColumn
@@ -65,6 +69,12 @@ public SortOption DefaultDirectorySortOption
6569
get => (SortOption)Get((long)SortOption.Name);
6670
set => Set((long)value);
6771
}
72+
73+
public bool DefaultSortDirectoriesAlongsideFiles
74+
{
75+
get => Get(userSettingsService.PreferencesSettingsService.ListAndSortDirectoriesAlongsideFiles);
76+
set => Set(value);
77+
}
6878

6979
public GroupOption DefaultDirectoryGroupOption
7080
{

src/Files.Uwp/UserControls/InnerNavigationToolbar.xaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,8 @@
507507
<MenuFlyoutSeparator />
508508
<ToggleMenuFlyoutItem IsChecked="{x:Bind ViewModel.IsSortedAscending, Mode=TwoWay}" Text="{helpers:ResourceString Name=Ascending}" />
509509
<ToggleMenuFlyoutItem IsChecked="{x:Bind ViewModel.IsSortedDescending, Mode=TwoWay}" Text="{helpers:ResourceString Name=Descending}" />
510+
<MenuFlyoutSeparator />
511+
<ToggleMenuFlyoutItem IsChecked="{x:Bind ViewModel.AreDirectoriesSortedAlongsideFiles, Mode=TwoWay}" Text="{helpers:ResourceString Name=SettingsListAndSortDirectoriesAlongsideFiles}" />
510512
</MenuFlyout>
511513
</AppBarButton.Flyout>
512514
</AppBarButton>

src/Files.Uwp/ViewModels/FolderSettingsViewModel.cs

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,8 @@ public int GridViewSize
276276
public event EventHandler<GroupOption> GroupOptionPreferenceUpdated;
277277

278278
public event EventHandler<SortDirection> SortDirectionPreferenceUpdated;
279+
280+
public event EventHandler<bool> SortDirectoriesAlongsideFilesPreferenceUpdated;
279281

280282
public SortOption DirectorySortOption
281283
{
@@ -318,6 +320,28 @@ public SortDirection DirectorySortDirection
318320
}
319321
}
320322

323+
public bool SortDirectoriesAlongsideFiles
324+
{
325+
get
326+
{
327+
return UserSettingsService.PreferencesSettingsService.AreLayoutPreferencesPerFolder ?
328+
LayoutPreference.SortDirectoriesAlongsideFiles :
329+
UserSettingsService.PreferencesSettingsService.ListAndSortDirectoriesAlongsideFiles;
330+
}
331+
set
332+
{
333+
if (SetProperty(ref LayoutPreference.SortDirectoriesAlongsideFiles, value, nameof(SortDirectoriesAlongsideFiles)))
334+
{
335+
LayoutPreferencesUpdateRequired?.Invoke(this, new LayoutPreferenceEventArgs(LayoutPreference));
336+
SortDirectoriesAlongsideFilesPreferenceUpdated?.Invoke(this, SortDirectoriesAlongsideFiles);
337+
if (!UserSettingsService.PreferencesSettingsService.AreLayoutPreferencesPerFolder)
338+
{
339+
UserSettingsService.PreferencesSettingsService.ListAndSortDirectoriesAlongsideFiles = value;
340+
}
341+
}
342+
}
343+
}
344+
321345
public ColumnsViewModel ColumnsViewModel
322346
{
323347
get => LayoutPreference.ColumnsViewModel;
@@ -371,6 +395,7 @@ public void UpdateLayoutPreferencesForPath(string folderPath, LayoutPreferences
371395
UserSettingsService.LayoutSettingsService.DefaultDirectoryGroupOption = prefs.DirectoryGroupOption;
372396
}
373397
UserSettingsService.LayoutSettingsService.DefaultDirectorySortDirection = prefs.DirectorySortDirection;
398+
UserSettingsService.LayoutSettingsService.DefaultSortDirectoriesAlongsideFiles = prefs.SortDirectoriesAlongsideFiles;
374399
UserSettingsService.LayoutSettingsService.ShowDateColumn = !prefs.ColumnsViewModel.DateModifiedColumn.UserCollapsed;
375400
UserSettingsService.LayoutSettingsService.ShowDateCreatedColumn = !prefs.ColumnsViewModel.DateCreatedColumn.UserCollapsed;
376401
UserSettingsService.LayoutSettingsService.ShowTypeColumn = !prefs.ColumnsViewModel.ItemTypeColumn.UserCollapsed;
@@ -426,6 +451,7 @@ private static LayoutPreferences ReadLayoutPreferencesFromSettings(string folder
426451
GridViewSize = userSettingsService.LayoutSettingsService.DefaultGridViewSize,
427452
DirectorySortOption = userSettingsService.LayoutSettingsService.DefaultDirectorySortOption,
428453
DirectorySortDirection = userSettingsService.LayoutSettingsService.DefaultDirectorySortDirection,
454+
SortDirectoriesAlongsideFiles = userSettingsService.LayoutSettingsService.DefaultSortDirectoriesAlongsideFiles,
429455
ColumnsViewModel = new ColumnsViewModel(),
430456
DirectoryGroupOption = GroupOption.DateCreated,
431457
};
@@ -439,6 +465,7 @@ private static LayoutPreferences ReadLayoutPreferencesFromSettings(string folder
439465
GridViewSize = userSettingsService.LayoutSettingsService.DefaultGridViewSize,
440466
DirectorySortOption = userSettingsService.LayoutSettingsService.DefaultDirectorySortOption,
441467
DirectorySortDirection = userSettingsService.LayoutSettingsService.DefaultDirectorySortDirection,
468+
SortDirectoriesAlongsideFiles = userSettingsService.LayoutSettingsService.DefaultSortDirectoriesAlongsideFiles,
442469
ColumnsViewModel = new ColumnsViewModel(),
443470
DirectoryGroupOption = GroupOption.FolderPath,
444471
};
@@ -479,6 +506,7 @@ private set
479506
OnPropertyChanged(nameof(DirectoryGroupOption));
480507
OnPropertyChanged(nameof(DirectorySortOption));
481508
OnPropertyChanged(nameof(DirectorySortDirection));
509+
OnPropertyChanged(nameof(SortDirectoriesAlongsideFiles));
482510
}
483511
}
484512
}
@@ -489,6 +517,7 @@ public class LayoutPreferences
489517

490518
public SortOption DirectorySortOption;
491519
public SortDirection DirectorySortDirection;
520+
public bool SortDirectoriesAlongsideFiles;
492521
public GroupOption DirectoryGroupOption;
493522
public FolderLayoutModes LayoutMode;
494523
public int GridViewSize;
@@ -506,6 +535,7 @@ public LayoutPreferences()
506535
this.DirectorySortOption = UserSettingsService.LayoutSettingsService.DefaultDirectorySortOption;
507536
this.DirectoryGroupOption = UserSettingsService.LayoutSettingsService.DefaultDirectoryGroupOption;
508537
this.DirectorySortDirection = UserSettingsService.LayoutSettingsService.DefaultDirectorySortDirection;
538+
this.SortDirectoriesAlongsideFiles = UserSettingsService.LayoutSettingsService.DefaultSortDirectoriesAlongsideFiles;
509539

510540
this.ColumnsViewModel = new ColumnsViewModel();
511541
this.ColumnsViewModel.DateCreatedColumn.UserCollapsed = !UserSettingsService.LayoutSettingsService.ShowDateCreatedColumn;
@@ -525,7 +555,8 @@ public static LayoutPreferences FromCompositeValue(ApplicationDataCompositeValue
525555
GridViewSize = (int)compositeValue[nameof(GridViewSize)],
526556
DirectorySortOption = (SortOption)(int)compositeValue[nameof(DirectorySortOption)],
527557
DirectorySortDirection = (SortDirection)(int)compositeValue[nameof(DirectorySortDirection)],
528-
IsAdaptiveLayoutOverridden = compositeValue[nameof(IsAdaptiveLayoutOverridden)] is bool val ? val : false,
558+
SortDirectoriesAlongsideFiles = compositeValue[nameof(SortDirectoriesAlongsideFiles)] is bool val ? val : false,
559+
IsAdaptiveLayoutOverridden = compositeValue[nameof(IsAdaptiveLayoutOverridden)] is bool val2 ? val2 : false,
529560
};
530561

531562
if (compositeValue.TryGetValue(nameof(DirectoryGroupOption), out var gpOption))
@@ -556,7 +587,8 @@ public ApplicationDataCompositeValue ToCompositeValue()
556587
{ nameof(DirectorySortOption), (int)this.DirectorySortOption },
557588
{ nameof(DirectoryGroupOption), (int)this.DirectoryGroupOption },
558589
{ nameof(DirectorySortDirection), (int)this.DirectorySortDirection },
559-
{ nameof(IsAdaptiveLayoutOverridden), (bool)this.IsAdaptiveLayoutOverridden },
590+
{ nameof(SortDirectoriesAlongsideFiles), this.SortDirectoriesAlongsideFiles },
591+
{ nameof(IsAdaptiveLayoutOverridden), this.IsAdaptiveLayoutOverridden },
560592
{ nameof(ColumnsViewModel), JsonConvert.SerializeObject(this.ColumnsViewModel) }
561593
};
562594
}
@@ -578,6 +610,7 @@ public override bool Equals(object obj)
578610
prefs.GridViewSize == this.GridViewSize &&
579611
prefs.DirectorySortOption == this.DirectorySortOption &&
580612
prefs.DirectorySortDirection == this.DirectorySortDirection &&
613+
prefs.SortDirectoriesAlongsideFiles == this.SortDirectoriesAlongsideFiles &&
581614
prefs.IsAdaptiveLayoutOverridden == this.IsAdaptiveLayoutOverridden &&
582615
prefs.ColumnsViewModel == this.ColumnsViewModel);
583616
}

src/Files.Uwp/ViewModels/ItemViewModel.cs

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,13 @@ public async void UpdateSortDirectionStatus()
216216
await ApplyFilesAndFoldersChangesAsync();
217217
}
218218

219+
public async void UpdateSortDirectoriesAlongsideFiles()
220+
{
221+
OnPropertyChanged(nameof(AreDirectoriesSortedAlongsideFiles));
222+
await OrderFilesAndFoldersAsync();
223+
await ApplyFilesAndFoldersChangesAsync();
224+
}
225+
219226
public bool IsSortedByName
220227
{
221228
get => folderSettings.DirectorySortOption == SortOption.Name;
@@ -355,6 +362,16 @@ public bool IsSortedDescending
355362
}
356363
}
357364

365+
public bool AreDirectoriesSortedAlongsideFiles
366+
{
367+
get => folderSettings.SortDirectoriesAlongsideFiles;
368+
set
369+
{
370+
folderSettings.SortDirectoriesAlongsideFiles = value;
371+
OnPropertyChanged(nameof(AreDirectoriesSortedAlongsideFiles));
372+
}
373+
}
374+
358375
public ItemViewModel(FolderSettingsViewModel folderSettingsViewModel)
359376
{
360377
folderSettings = folderSettingsViewModel;
@@ -436,11 +453,17 @@ private async void UserSettingsService_OnSettingChangedEvent(object sender, Sett
436453
case nameof(UserSettingsService.PreferencesSettingsService.AreHiddenItemsVisible):
437454
case nameof(UserSettingsService.PreferencesSettingsService.AreSystemItemsHidden):
438455
case nameof(UserSettingsService.PreferencesSettingsService.ShowDotFiles):
456+
case nameof(UserSettingsService.PreferencesSettingsService.ListAndSortDirectoriesAlongsideFiles):
457+
case nameof(UserSettingsService.PreferencesSettingsService.AreLayoutPreferencesPerFolder):
439458
case nameof(UserSettingsService.PreferencesSettingsService.AreFileTagsEnabled):
440459
case nameof(UserSettingsService.PreferencesSettingsService.ShowFolderSize):
441460
await dispatcherQueue.EnqueueAsync(() =>
442461
{
443462
shouldDisplayThumbnails = UserSettingsService.PreferencesSettingsService.ShowThumbnails;
463+
if (!UserSettingsService.PreferencesSettingsService.AreLayoutPreferencesPerFolder)
464+
{
465+
folderSettings.SortDirectoriesAlongsideFiles = UserSettingsService.PreferencesSettingsService.ListAndSortDirectoriesAlongsideFiles;
466+
}
444467
if (WorkingDirectory != "Home".GetLocalized())
445468
{
446469
RefreshItems(null);
@@ -576,7 +599,7 @@ await dispatcherQueue.EnqueueAsync(() =>
576599
var group = FilesAndFolders.GroupedCollection?.FirstOrDefault(x => x.Model.Key == key);
577600
if (group != null)
578601
{
579-
group.OrderOne(list => SortingHelper.OrderFileList(list, folderSettings.DirectorySortOption, folderSettings.DirectorySortDirection), item);
602+
group.OrderOne(list => SortingHelper.OrderFileList(list, folderSettings.DirectorySortOption, folderSettings.DirectorySortDirection, folderSettings.SortDirectoriesAlongsideFiles), item);
580603
}
581604
}
582605
UpdateEmptyTextType();
@@ -738,7 +761,7 @@ void OrderEntries()
738761
return;
739762
}
740763

741-
filesAndFolders = SortingHelper.OrderFileList(filesAndFolders, folderSettings.DirectorySortOption, folderSettings.DirectorySortDirection).ToList();
764+
filesAndFolders = SortingHelper.OrderFileList(filesAndFolders, folderSettings.DirectorySortOption, folderSettings.DirectorySortDirection, folderSettings.SortDirectoriesAlongsideFiles).ToList();
742765
}
743766

744767
if (NativeWinApiHelper.IsHasThreadAccessPropertyPresent && dispatcherQueue.HasThreadAccess)
@@ -766,7 +789,7 @@ private void OrderGroups(CancellationToken token = default)
766789
return;
767790
}
768791

769-
gp.Order(list => SortingHelper.OrderFileList(list, folderSettings.DirectorySortOption, folderSettings.DirectorySortDirection));
792+
gp.Order(list => SortingHelper.OrderFileList(list, folderSettings.DirectorySortOption, folderSettings.DirectorySortDirection, folderSettings.SortDirectoriesAlongsideFiles));
770793
}
771794
if (!FilesAndFolders.GroupedCollection.IsSorted)
772795
{

0 commit comments

Comments
 (0)