Skip to content

Commit d701493

Browse files
authored
Feature: Added an action to toggle dual pane mode (#17401)
1 parent 4783fc7 commit d701493

File tree

7 files changed

+73
-0
lines changed

7 files changed

+73
-0
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// Copyright (c) Files Community
2+
// Licensed under the MIT License.
3+
4+
namespace Files.App.Actions
5+
{
6+
internal sealed partial class ToggleDualPaneAction : ObservableObject, IToggleAction
7+
{
8+
private readonly IContentPageContext ContentPageContext = Ioc.Default.GetRequiredService<IContentPageContext>();
9+
private readonly IGeneralSettingsService generalSettingsService = Ioc.Default.GetRequiredService<IGeneralSettingsService>();
10+
11+
public string Label
12+
=> Strings.ToggleDualPane.GetLocalizedResource();
13+
14+
public string Description
15+
=> Strings.ToggleDualPaneDescription.GetLocalizedResource();
16+
17+
public bool IsOn
18+
=> ContentPageContext.IsMultiPaneActive;
19+
20+
public ToggleDualPaneAction()
21+
{
22+
ContentPageContext.PropertyChanged += ContentPageContext_PropertyChanged;
23+
}
24+
25+
public Task ExecuteAsync(object? parameter = null)
26+
{
27+
if (IsOn)
28+
ContentPageContext.ShellPage?.PaneHolder.CloseOtherPane();
29+
else
30+
ContentPageContext.ShellPage?.PaneHolder.OpenSecondaryPane(arrangement: generalSettingsService.ShellPaneArrangementOption);
31+
32+
return Task.CompletedTask;
33+
}
34+
35+
private void ContentPageContext_PropertyChanged(object? sender, PropertyChangedEventArgs e)
36+
{
37+
switch (e.PropertyName)
38+
{
39+
case nameof(IContentPageContext.ShellPage):
40+
case nameof(IContentPageContext.IsMultiPaneActive):
41+
OnPropertyChanged(nameof(IsOn));
42+
break;
43+
}
44+
}
45+
}
46+
}

src/Files.App/Data/Commands/Manager/CommandCodes.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public enum CommandCodes
2828
ToggleToolbar,
2929
ToggleShelfPane,
3030
ToggleFilterHeader,
31+
ToggleDualPane,
3132

3233
// File System
3334
CopyItem,

src/Files.App/Data/Commands/Manager/CommandManager.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ public IRichCommand this[HotKey hotKey]
5959
public IRichCommand ToggleToolbar => commands[CommandCodes.ToggleToolbar];
6060
public IRichCommand ToggleShelfPane => commands[CommandCodes.ToggleShelfPane];
6161
public IRichCommand ToggleFilterHeader => commands[CommandCodes.ToggleFilterHeader];
62+
public IRichCommand ToggleDualPane => commands[CommandCodes.ToggleDualPane];
6263
public IRichCommand SelectAll => commands[CommandCodes.SelectAll];
6364
public IRichCommand InvertSelection => commands[CommandCodes.InvertSelection];
6465
public IRichCommand ClearSelection => commands[CommandCodes.ClearSelection];
@@ -266,6 +267,7 @@ public IEnumerator<IRichCommand> GetEnumerator() =>
266267
[CommandCodes.ToggleToolbar] = new ToggleToolbarAction(),
267268
[CommandCodes.ToggleShelfPane] = new ToggleShelfPaneAction(),
268269
[CommandCodes.ToggleFilterHeader] = new ToggleFilterHeaderAction(),
270+
[CommandCodes.ToggleDualPane] = new ToggleDualPaneAction(),
269271
[CommandCodes.SelectAll] = new SelectAllAction(),
270272
[CommandCodes.InvertSelection] = new InvertSelectionAction(),
271273
[CommandCodes.ClearSelection] = new ClearSelectionAction(),

src/Files.App/Data/Commands/Manager/ICommandManager.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public interface ICommandManager : IEnumerable<IRichCommand>
3333
IRichCommand ToggleToolbar { get; }
3434
IRichCommand ToggleShelfPane { get; }
3535
IRichCommand ToggleFilterHeader { get; }
36+
IRichCommand ToggleDualPane { get; }
3637

3738
IRichCommand CopyItem { get; }
3839
IRichCommand CopyItemPath { get; }

src/Files.App/Data/Contracts/IShellPanesPage.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,11 @@ public interface IShellPanesPage : IDisposable, INotifyPropertyChanged
5454
/// </summary>
5555
public void CloseActivePane();
5656

57+
/// <summary>
58+
/// Closes the non active/focused pane.
59+
/// </summary>
60+
public void CloseOtherPane();
61+
5762
/// <summary>
5863
/// Focuses the other pane.
5964
/// </summary>

src/Files.App/Strings/en-US/Resources.resw

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1106,6 +1106,12 @@
11061106
<data name="ToggleFilterHeaderDescription" xml:space="preserve">
11071107
<value>Toggle visibility of the filter header</value>
11081108
</data>
1109+
<data name="ToggleDualPane" xml:space="preserve">
1110+
<value>Toggle dual pane</value>
1111+
</data>
1112+
<data name="ToggleDualPaneDescription" xml:space="preserve">
1113+
<value>Toggle dual pane mode</value>
1114+
</data>
11091115
<data name="DetailsPanePreviewNotAvaliableText" xml:space="preserve">
11101116
<value>No preview available</value>
11111117
</data>

src/Files.App/Views/ShellPanesPage.xaml.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,18 @@ ShellPaneArrangement is ShellPaneArrangement.Vertical
336336
}
337337
}
338338

339+
/// <inheritdoc/>
340+
public void CloseOtherPane()
341+
{
342+
if (!IsMultiPaneActive)
343+
return;
344+
345+
if (ActivePane == (IShellPage)GetPane(0)!)
346+
RemovePane(1);
347+
else
348+
RemovePane(0);
349+
}
350+
339351
/// <inheritdoc/>
340352
public void CloseActivePane()
341353
{

0 commit comments

Comments
 (0)