diff --git a/src/Files.App/Helpers/LayoutPreferences/LayoutPreferences.cs b/src/Files.App/Helpers/LayoutPreferences/LayoutPreferences.cs index f3ab7be69d42..572ed982e2d6 100644 --- a/src/Files.App/Helpers/LayoutPreferences/LayoutPreferences.cs +++ b/src/Files.App/Helpers/LayoutPreferences/LayoutPreferences.cs @@ -28,8 +28,8 @@ public LayoutPreferences() this.LayoutMode = defaultLayout is FolderLayoutModes.Adaptive ? FolderLayoutModes.DetailsView : defaultLayout; this.GridViewSize = UserSettingsService.LayoutSettingsService.DefaultGridViewSize; - this.DirectorySortOption = UserSettingsService.LayoutSettingsService.DefaultDirectorySortOption; - this.DirectoryGroupOption = UserSettingsService.LayoutSettingsService.DefaultDirectoryGroupOption; + this.DirectorySortOption = UserSettingsService.FoldersSettingsService.DefaultSortOption; + this.DirectoryGroupOption = UserSettingsService.FoldersSettingsService.DefaultGroupOption; this.DirectorySortDirection = UserSettingsService.LayoutSettingsService.DefaultDirectorySortDirection; this.SortDirectoriesAlongsideFiles = UserSettingsService.LayoutSettingsService.DefaultSortDirectoriesAlongsideFiles; this.IsAdaptiveLayoutOverridden = defaultLayout is not FolderLayoutModes.Adaptive; diff --git a/src/Files.App/ServicesImplementation/Settings/FoldersSettingsService.cs b/src/Files.App/ServicesImplementation/Settings/FoldersSettingsService.cs index 804e0d6bc6c2..0f0b107f8b4d 100644 --- a/src/Files.App/ServicesImplementation/Settings/FoldersSettingsService.cs +++ b/src/Files.App/ServicesImplementation/Settings/FoldersSettingsService.cs @@ -207,6 +207,19 @@ public bool CalculateFolderSizes get => Get(false); set => Set(value); } + + public SortOption DefaultSortOption + { + get => (SortOption)Get((long)SortOption.Name); + set => Set((long)value); + } + + public GroupOption DefaultGroupOption + { + get => (GroupOption)Get((long)GroupOption.None); + set => Set((long)value); + } + protected override void RaiseOnSettingChangedEvent(object sender, SettingChangedEventArgs e) { switch (e.SettingName) diff --git a/src/Files.App/ServicesImplementation/Settings/LayoutSettingsService.cs b/src/Files.App/ServicesImplementation/Settings/LayoutSettingsService.cs index db36f66467d6..453205d1768d 100644 --- a/src/Files.App/ServicesImplementation/Settings/LayoutSettingsService.cs +++ b/src/Files.App/ServicesImplementation/Settings/LayoutSettingsService.cs @@ -24,22 +24,10 @@ public SortDirection DefaultDirectorySortDirection set => Set((long)value); } - public SortOption DefaultDirectorySortOption - { - get => (SortOption)Get((long)SortOption.Name); - set => Set((long)value); - } - public bool DefaultSortDirectoriesAlongsideFiles { get => Get(false); set => Set(value); } - - public GroupOption DefaultDirectoryGroupOption - { - get => (GroupOption)Get((long)GroupOption.None); - set => Set((long)value); - } } } diff --git a/src/Files.App/Strings/en-US/Resources.resw b/src/Files.App/Strings/en-US/Resources.resw index 547cc960e228..816edaa0f631 100644 --- a/src/Files.App/Strings/en-US/Resources.resw +++ b/src/Files.App/Strings/en-US/Resources.resw @@ -9,9 +9,7 @@ that is mostly human readable. The generation and parsing of the various data types are done through the TypeConverter classes associated with the data types. - Example: - ... ado.net/XML headers & schema ... text/microsoft-resx 2.0 @@ -26,7 +24,6 @@ [base64 mime encoded string representing a byte array form of the .NET Framework object] This is a comment - There are any number of "resheader" rows that contain simple name/value pairs. @@ -43,12 +40,10 @@ Note - application/x-microsoft.net.object.binary.base64 is the format that the ResXResourceWriter will generate, however the reader can read any of the formats listed below. - mimetype: application/x-microsoft.net.object.binary.base64 value : The object must be serialized with : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter : and then encoded with base64 encoding. - mimetype: application/x-microsoft.net.object.soap.base64 value : The object must be serialized with : System.Runtime.Serialization.Formatters.Soap.SoapFormatter @@ -2862,6 +2857,9 @@ Path + + Sorting and grouping + Archive @@ -2931,4 +2929,10 @@ Sync status column + + Group by + + + Sort by + \ No newline at end of file diff --git a/src/Files.App/ViewModels/FolderSettingsViewModel.cs b/src/Files.App/ViewModels/FolderSettingsViewModel.cs index aac54322382e..ef50c82cf2f8 100644 --- a/src/Files.App/ViewModels/FolderSettingsViewModel.cs +++ b/src/Files.App/ViewModels/FolderSettingsViewModel.cs @@ -312,19 +312,19 @@ public static void SetLayoutPreferencesForPath(string folderPath, LayoutPreferen { userSettingsService.FoldersSettingsService.DefaultLayoutMode = prefs.LayoutMode; userSettingsService.LayoutSettingsService.DefaultGridViewSize = prefs.GridViewSize; - // Do not save OriginalPath as global sort option (only works in recycle bin) + // Do not save options which only work in recycle bin or cloud folders as global if (prefs.DirectorySortOption != SortOption.OriginalFolder && prefs.DirectorySortOption != SortOption.DateDeleted && prefs.DirectorySortOption != SortOption.SyncStatus) { - userSettingsService.LayoutSettingsService.DefaultDirectorySortOption = prefs.DirectorySortOption; + userSettingsService.FoldersSettingsService.DefaultSortOption = prefs.DirectorySortOption; } if (prefs.DirectoryGroupOption != GroupOption.OriginalFolder && prefs.DirectoryGroupOption != GroupOption.DateDeleted && prefs.DirectoryGroupOption != GroupOption.FolderPath && prefs.DirectoryGroupOption != GroupOption.SyncStatus) { - userSettingsService.LayoutSettingsService.DefaultDirectoryGroupOption = prefs.DirectoryGroupOption; + userSettingsService.FoldersSettingsService.DefaultGroupOption = prefs.DirectoryGroupOption; } userSettingsService.LayoutSettingsService.DefaultDirectorySortDirection = prefs.DirectorySortDirection; userSettingsService.LayoutSettingsService.DefaultSortDirectoriesAlongsideFiles = prefs.SortDirectoriesAlongsideFiles; diff --git a/src/Files.App/ViewModels/ItemViewModel.cs b/src/Files.App/ViewModels/ItemViewModel.cs index 25b0255e6cf8..bee620a072ad 100644 --- a/src/Files.App/ViewModels/ItemViewModel.cs +++ b/src/Files.App/ViewModels/ItemViewModel.cs @@ -497,6 +497,8 @@ await dispatcherQueue.EnqueueAsync(() => RefreshItems(null); }); break; + case nameof(UserSettingsService.FoldersSettingsService.DefaultSortOption): + case nameof(UserSettingsService.FoldersSettingsService.DefaultGroupOption): case nameof(UserSettingsService.LayoutSettingsService.DefaultSortDirectoriesAlongsideFiles): case nameof(UserSettingsService.FoldersSettingsService.EnableOverridingFolderPreferences): await dispatcherQueue.EnqueueAsync(() => diff --git a/src/Files.App/ViewModels/SettingsViewModels/FoldersViewModel.cs b/src/Files.App/ViewModels/SettingsViewModels/FoldersViewModel.cs index e5e6f7185dad..936e7a513e6f 100644 --- a/src/Files.App/ViewModels/SettingsViewModels/FoldersViewModel.cs +++ b/src/Files.App/ViewModels/SettingsViewModels/FoldersViewModel.cs @@ -10,6 +10,11 @@ public class FoldersViewModel : ObservableObject { private IUserSettingsService UserSettingsService { get; } = Ioc.Default.GetRequiredService(); + + //FileTag combobox indexes (required to hide SyncStatus) + private readonly int FileTagSortingIndex = 5; + private readonly int FileTagGroupingIndex = 6; + // Commands public RelayCommand ResetLayoutPreferencesCommand { get; } public RelayCommand ShowResetLayoutPreferencesTipCommand { get; } @@ -20,6 +25,8 @@ public FoldersViewModel() ShowResetLayoutPreferencesTipCommand = new RelayCommand(() => IsResetLayoutPreferencesTipOpen = true); SelectedDefaultLayoutModeIndex = (int)DefaultLayoutMode; + SelectedDefaultSortingIndex = UserSettingsService.FoldersSettingsService.DefaultSortOption == SortOption.FileTag ? FileTagSortingIndex : (int)UserSettingsService.FoldersSettingsService.DefaultSortOption; + SelectedDefaultGroupingIndex = UserSettingsService.FoldersSettingsService.DefaultGroupOption == GroupOption.FileTag ? FileTagGroupingIndex : (int)UserSettingsService.FoldersSettingsService.DefaultGroupOption; } // Properties @@ -239,6 +246,34 @@ public bool CalculateFolderSizes } } + private int selectedDefaultSortingIndex; + public int SelectedDefaultSortingIndex + { + get => selectedDefaultSortingIndex; + set + { + if (SetProperty(ref selectedDefaultSortingIndex, value)) + { + OnPropertyChanged(nameof(SelectedDefaultSortingIndex)); + UserSettingsService.FoldersSettingsService.DefaultSortOption = value == FileTagSortingIndex ? SortOption.FileTag : (SortOption)value; + } + } + } + + private int selectedDefaultGroupingIndex; + public int SelectedDefaultGroupingIndex + { + get => selectedDefaultGroupingIndex; + set + { + if (SetProperty(ref selectedDefaultGroupingIndex, value)) + { + OnPropertyChanged(nameof(SelectedDefaultGroupingIndex)); + UserSettingsService.FoldersSettingsService.DefaultGroupOption = value == FileTagGroupingIndex ? GroupOption.FileTag : (GroupOption)value; + } + } + } + // Local methods public void ResetLayoutPreferences() diff --git a/src/Files.App/ViewModels/SettingsViewModels/PreferencesViewModel.cs b/src/Files.App/ViewModels/SettingsViewModels/PreferencesViewModel.cs index bed13a10439d..896b9917c664 100644 --- a/src/Files.App/ViewModels/SettingsViewModels/PreferencesViewModel.cs +++ b/src/Files.App/ViewModels/SettingsViewModels/PreferencesViewModel.cs @@ -511,7 +511,7 @@ public string Text { if (Path == "Home".GetLocalizedResource()) return "Home".GetLocalizedResource(); - return (Path == CommonPaths.RecycleBinPath) + return (Path == CommonPaths.RecycleBinPath) ? ApplicationData.Current.LocalSettings.Values.Get("RecycleBin_Title", "Recycle Bin") : Path; } diff --git a/src/Files.App/Views/SettingsPages/Folders.xaml b/src/Files.App/Views/SettingsPages/Folders.xaml index 7982e0c02f7d..9e175450eab9 100644 --- a/src/Files.App/Views/SettingsPages/Folders.xaml +++ b/src/Files.App/Views/SettingsPages/Folders.xaml @@ -120,6 +120,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Files.Backend/Services/Settings/IFoldersSettingsService.cs b/src/Files.Backend/Services/Settings/IFoldersSettingsService.cs index 665f4b04034f..5319e8f85d58 100644 --- a/src/Files.Backend/Services/Settings/IFoldersSettingsService.cs +++ b/src/Files.Backend/Services/Settings/IFoldersSettingsService.cs @@ -139,5 +139,15 @@ public interface IFoldersSettingsService : IBaseSettingsService, INotifyProperty /// Gets or sets a value indicating whether or not to show folder size. /// bool CalculateFolderSizes { get; set; } + + /// + /// Gets or sets a value indicating the default sorting option. + /// + SortOption DefaultSortOption { get; set; } + + /// + /// Gets or sets a value indicating the default grouping option. + /// + GroupOption DefaultGroupOption { get; set; } } } diff --git a/src/Files.Backend/Services/Settings/ILayoutSettingsService.cs b/src/Files.Backend/Services/Settings/ILayoutSettingsService.cs index d10a5b80213d..ae6b2b27d10a 100644 --- a/src/Files.Backend/Services/Settings/ILayoutSettingsService.cs +++ b/src/Files.Backend/Services/Settings/ILayoutSettingsService.cs @@ -7,13 +7,8 @@ public interface ILayoutSettingsService : IBaseSettingsService, INotifyPropertyC { int DefaultGridViewSize { get; set; } - // move to folder settings and add UI to settings pages SortDirection DefaultDirectorySortDirection { get; set; } - SortOption DefaultDirectorySortOption { get; set; } - bool DefaultSortDirectoriesAlongsideFiles { get; set; } - - GroupOption DefaultDirectoryGroupOption { get; set; } } } diff --git a/src/Files.Shared/Enums/SortOption.cs b/src/Files.Shared/Enums/SortOption.cs index f6f8bf6ebde5..46ed1760b73a 100644 --- a/src/Files.Shared/Enums/SortOption.cs +++ b/src/Files.Shared/Enums/SortOption.cs @@ -7,9 +7,9 @@ public enum SortOption : byte DateCreated, Size, FileType, - SyncStatus, + SyncStatus, // Cloud drive FileTag, - OriginalFolder, - DateDeleted + OriginalFolder, // Recycle bin + DateDeleted // Recycle bin } } \ No newline at end of file