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();