diff --git a/src/Files.App/Actions/Display/GroupAction.cs b/src/Files.App/Actions/Display/GroupAction.cs index e0bf7d3e1930..734287b45ca3 100644 --- a/src/Files.App/Actions/Display/GroupAction.cs +++ b/src/Files.App/Actions/Display/GroupAction.cs @@ -177,6 +177,7 @@ public GroupByAction() public Task ExecuteAsync(object? parameter = null) { DisplayContext.GroupOption = GroupOption; + LayoutHelpers.UpdateOpenTabsPreferences(); return Task.CompletedTask; } @@ -377,6 +378,7 @@ public Task ExecuteAsync(object? parameter = null) { DisplayContext.GroupOption = GroupOption; DisplayContext.GroupByDateUnit = GroupByDateUnit; + LayoutHelpers.UpdateOpenTabsPreferences(); return Task.CompletedTask; } @@ -425,6 +427,7 @@ public GroupAscendingAction() public Task ExecuteAsync(object? parameter = null) { context.GroupDirection = SortDirection.Ascending; + LayoutHelpers.UpdateOpenTabsPreferences(); return Task.CompletedTask; } @@ -469,6 +472,7 @@ public GroupDescendingAction() public Task ExecuteAsync(object? parameter = null) { context.GroupDirection = SortDirection.Descending; + LayoutHelpers.UpdateOpenTabsPreferences(); return Task.CompletedTask; } @@ -505,6 +509,7 @@ public ToggleGroupDirectionAction() public Task ExecuteAsync(object? parameter = null) { context.GroupDirection = context.SortDirection is SortDirection.Descending ? SortDirection.Ascending : SortDirection.Descending; + LayoutHelpers.UpdateOpenTabsPreferences(); return Task.CompletedTask; } @@ -536,6 +541,7 @@ public GroupByYearAction() public Task ExecuteAsync(object? parameter = null) { context.GroupByDateUnit = GroupByDateUnit.Year; + LayoutHelpers.UpdateOpenTabsPreferences(); return Task.CompletedTask; } @@ -580,6 +586,7 @@ public GroupByMonthAction() public Task ExecuteAsync(object? parameter = null) { context.GroupByDateUnit = GroupByDateUnit.Month; + LayoutHelpers.UpdateOpenTabsPreferences(); return Task.CompletedTask; } @@ -621,6 +628,7 @@ public Task ExecuteAsync(object? parameter = null) GroupByDateUnit.Month => GroupByDateUnit.Day, _ => GroupByDateUnit.Year }; + LayoutHelpers.UpdateOpenTabsPreferences(); return Task.CompletedTask; } diff --git a/src/Files.App/Actions/Display/SortAction.cs b/src/Files.App/Actions/Display/SortAction.cs index 4c5b9742259e..1e78176035c9 100644 --- a/src/Files.App/Actions/Display/SortAction.cs +++ b/src/Files.App/Actions/Display/SortAction.cs @@ -165,6 +165,7 @@ public SortByAction() public Task ExecuteAsync(object? parameter = null) { displayContext.SortOption = SortOption; + LayoutHelpers.UpdateOpenTabsPreferences(); return Task.CompletedTask; } @@ -207,6 +208,7 @@ public SortAscendingAction() public Task ExecuteAsync(object? parameter = null) { context.SortDirection = SortDirection.Ascending; + LayoutHelpers.UpdateOpenTabsPreferences(); return Task.CompletedTask; } @@ -241,6 +243,7 @@ public SortDescendingAction() public Task ExecuteAsync(object? parameter = null) { context.SortDirection = SortDirection.Descending; + LayoutHelpers.UpdateOpenTabsPreferences(); return Task.CompletedTask; } @@ -274,6 +277,8 @@ context.SortDirection is SortDirection.Descending ? SortDirection.Ascending : SortDirection.Descending; + LayoutHelpers.UpdateOpenTabsPreferences(); + return Task.CompletedTask; } } diff --git a/src/Files.App/Actions/Display/SortFilesAndFoldersTogetherAction.cs b/src/Files.App/Actions/Display/SortFilesAndFoldersTogetherAction.cs index e91ea79c8bc4..49f0311aa0d4 100644 --- a/src/Files.App/Actions/Display/SortFilesAndFoldersTogetherAction.cs +++ b/src/Files.App/Actions/Display/SortFilesAndFoldersTogetherAction.cs @@ -26,6 +26,7 @@ public SortFilesAndFoldersTogetherAction() public Task ExecuteAsync(object? parameter = null) { context.SortDirectoriesAlongsideFiles = true; + LayoutHelpers.UpdateOpenTabsPreferences(); return Task.CompletedTask; } diff --git a/src/Files.App/Actions/Display/SortFilesFirstAction.cs b/src/Files.App/Actions/Display/SortFilesFirstAction.cs index 8db1fc77c1fd..b7169e250aef 100644 --- a/src/Files.App/Actions/Display/SortFilesFirstAction.cs +++ b/src/Files.App/Actions/Display/SortFilesFirstAction.cs @@ -27,6 +27,7 @@ public Task ExecuteAsync(object? parameter = null) { context.SortFilesFirst = true; context.SortDirectoriesAlongsideFiles = false; + LayoutHelpers.UpdateOpenTabsPreferences(); return Task.CompletedTask; } diff --git a/src/Files.App/Actions/Display/SortFoldersFirstAction.cs b/src/Files.App/Actions/Display/SortFoldersFirstAction.cs index d1aaaaf587c1..95b815515c22 100644 --- a/src/Files.App/Actions/Display/SortFoldersFirstAction.cs +++ b/src/Files.App/Actions/Display/SortFoldersFirstAction.cs @@ -27,6 +27,7 @@ public Task ExecuteAsync(object? parameter = null) { context.SortFilesFirst = false; context.SortDirectoriesAlongsideFiles = false; + LayoutHelpers.UpdateOpenTabsPreferences(); return Task.CompletedTask; } diff --git a/src/Files.App/Data/Contracts/IShellPanesPage.cs b/src/Files.App/Data/Contracts/IShellPanesPage.cs index 9eb40f0971fc..afeace482ef9 100644 --- a/src/Files.App/Data/Contracts/IShellPanesPage.cs +++ b/src/Files.App/Data/Contracts/IShellPanesPage.cs @@ -58,5 +58,11 @@ public interface IShellPanesPage : IDisposable, INotifyPropertyChanged /// Focuses the other pane. /// public void FocusOtherPane(); + + /// + /// Gets open panes. + /// + /// An enumerable containing open panes. + public IEnumerable GetPanes(); } } diff --git a/src/Files.App/Helpers/Layout/LayoutHelpers.cs b/src/Files.App/Helpers/Layout/LayoutHelpers.cs new file mode 100644 index 000000000000..500d553df43b --- /dev/null +++ b/src/Files.App/Helpers/Layout/LayoutHelpers.cs @@ -0,0 +1,48 @@ +// Copyright (c) Files Community +// Licensed under the MIT License. + +namespace Files.App.Helpers +{ + static class LayoutHelpers + { + public static void UpdateOpenTabsPreferences() + { + // Services + var multitaskingContext = Ioc.Default.GetRequiredService(); + var layoutSettingsService = Ioc.Default.GetRequiredService(); + + // Get all tab instances and active path + var tabs = multitaskingContext.Control?.GetAllTabInstances(); + var activePath = (multitaskingContext.CurrentTabItem?.TabItemContent as ShellPanesPage)?.ActivePane?.TabBarItemParameter?.NavigationParameter as string; + + // Return if required data is missing + if (tabs is null || activePath is null) + return; + + for (int i = 0; i < tabs.Count; i++) + { + var isNotCurrentTab = i != multitaskingContext.CurrentTabIndex; + var shPage = tabs[i] as ShellPanesPage; + + if (shPage is not null) + { + foreach (var pane in shPage.GetPanes()) + { + var path = pane.ShellViewModel?.CurrentFolder?.ItemPath; + + // Skip panes without a valid path + if (path is null) + continue; + + // Check if we need to update preferences for this pane + if ((isNotCurrentTab || pane != shPage.ActivePane) && + (layoutSettingsService.SyncFolderPreferencesAcrossDirectories || + path.Equals(activePath, StringComparison.OrdinalIgnoreCase))) + if (pane.SlimContentPage is BaseLayoutPage page) + page.FolderSettings?.ReloadGroupAndSortPreferences(path); + } + } + } + } + } +} diff --git a/src/Files.App/Helpers/Layout/LayoutPreferencesManager.cs b/src/Files.App/Helpers/Layout/LayoutPreferencesManager.cs index 7f17895d5c85..90e6a1a1808b 100644 --- a/src/Files.App/Helpers/Layout/LayoutPreferencesManager.cs +++ b/src/Files.App/Helpers/Layout/LayoutPreferencesManager.cs @@ -265,6 +265,24 @@ public Type GetLayoutType(string path, bool changeLayoutMode = true) }; } + public void ReloadGroupAndSortPreferences(string? path) + { + if (string.IsNullOrWhiteSpace(path)) + return; + + var preferencesItem = GetLayoutPreferencesForPath(path); + if (preferencesItem is null) + return; + + DirectorySortOption = preferencesItem.DirectorySortOption; + DirectorySortDirection = preferencesItem.DirectorySortDirection; + DirectoryGroupOption = preferencesItem.DirectoryGroupOption; + DirectoryGroupByDateUnit = preferencesItem.DirectoryGroupByDateUnit; + DirectoryGroupDirection = preferencesItem.DirectoryGroupDirection; + SortDirectoriesAlongsideFiles = preferencesItem.SortDirectoriesAlongsideFiles; + SortFilesFirst = preferencesItem.SortFilesFirst; + } + public bool IsPathUsingDefaultLayout(string? path) { return UserSettingsService.LayoutSettingsService.SyncFolderPreferencesAcrossDirectories || diff --git a/src/Files.App/Views/ShellPanesPage.xaml.cs b/src/Files.App/Views/ShellPanesPage.xaml.cs index 7298d6d1c5ad..d0f26eeb5b36 100644 --- a/src/Files.App/Views/ShellPanesPage.xaml.cs +++ b/src/Files.App/Views/ShellPanesPage.xaml.cs @@ -356,6 +356,12 @@ public void FocusOtherPane() GetPane(0)?.Focus(FocusState.Programmatic); } + /// + public IEnumerable GetPanes() + { + return RootGrid.Children.Where(x => RootGrid.Children.IndexOf(x) % 2 == 0).Cast(); + } + // Private methods private ModernShellPage? GetPane(int index = -1) @@ -372,11 +378,6 @@ private int GetPaneCount() return (RootGrid.Children.Count + 1) / 2; } - private IEnumerable GetPanes() - { - return RootGrid.Children.Where(x => RootGrid.Children.IndexOf(x) % 2 == 0).Cast(); - } - private IEnumerable GetSizers() { return RootGrid.Children.Where(x => RootGrid.Children.IndexOf(x) % 2 == 1).Cast();