Skip to content

Improves MultiPanes #8321

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Feb 21, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/Files/App.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ sealed partial class App : Application
public static StorageHistoryWrapper HistoryWrapper = new StorageHistoryWrapper();
public static SettingsViewModel AppSettings { get; private set; }
public static MainViewModel MainViewModel { get; private set; }
public static PaneViewModel PaneViewModel { get; private set; }
public static PreviewPaneViewModel PreviewPaneViewModel { get; private set; }
public static JumpListManager JumpList { get; private set; }
public static SidebarPinnedController SidebarPinnedController { get; private set; }
Expand Down Expand Up @@ -132,6 +133,7 @@ private static async Task EnsureSettingsAndConfigurationAreBootstrapped()

JumpList ??= new JumpListManager();
MainViewModel ??= new MainViewModel();
PaneViewModel ??= new PaneViewModel();
PreviewPaneViewModel ??= new PreviewPaneViewModel();
LibraryManager ??= new LibraryManager();
DrivesManager ??= new DrivesManager();
Expand Down Expand Up @@ -532,6 +534,7 @@ await Common.Extensions.IgnoreExceptions(async () =>
}

DrivesManager?.Dispose();
PaneViewModel?.Dispose();
PreviewPaneViewModel?.Dispose();

// Try to maintain clipboard data after app close
Expand Down
16 changes: 8 additions & 8 deletions src/Files/BaseLayout.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ public abstract class BaseLayout : Page, IBaseLayout, INotifyPropertyChanged

public CurrentInstanceViewModel InstanceViewModel => ParentShellPageInstance.InstanceViewModel;

public PreviewPaneViewModel PreviewPaneViewModel => App.PreviewPaneViewModel;
public IPaneViewModel PaneViewModel => App.PaneViewModel;

public MainViewModel MainViewModel => App.MainViewModel;
public DirectoryPropertiesViewModel DirectoryPropertiesViewModel { get; }
Expand Down Expand Up @@ -224,22 +224,22 @@ internal set
// update preview pane properties
if (value?.Count == 1)
{
PreviewPaneViewModel.IsItemSelected = true;
PreviewPaneViewModel.SelectedItem = value.First();
App.PreviewPaneViewModel.IsItemSelected = true;
App.PreviewPaneViewModel.SelectedItem = value.First();
}
else
{
PreviewPaneViewModel.IsItemSelected = value?.Count > 0;
PreviewPaneViewModel.SelectedItem = null;
App.PreviewPaneViewModel.IsItemSelected = value?.Count > 0;
App.PreviewPaneViewModel.SelectedItem = null;
}

// check if the preview pane is open before updating the model
if (PreviewPaneViewModel.IsPaneSelected)
if (PaneViewModel.IsPreviewSelected)
{
bool isPaneEnabled = ((Window.Current.Content as Frame)?.Content as MainPage)?.IsPaneEnabled ?? false;
if (isPaneEnabled)
{
PreviewPaneViewModel.UpdateSelectedItemPreview();
App.PreviewPaneViewModel.UpdateSelectedItemPreview();
}
}
}
Expand Down Expand Up @@ -1105,7 +1105,7 @@ protected void UninitializeDrag(UIElement element)

public virtual void Dispose()
{
PreviewPaneViewModel?.Dispose();
PaneViewModel?.Dispose();
UnhookBaseEvents();
}

Expand Down
10 changes: 6 additions & 4 deletions src/Files/Files.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,8 @@
<Compile Include="UserControls\InnerNavigationToolbar.xaml.cs">
<DependentUpon>InnerNavigationToolbar.xaml</DependentUpon>
</Compile>
<Compile Include="UserControls\PaneControl.xaml.cs">
<Compile Include="UserControls\Pane\Pane.cs" />
<Compile Include="UserControls\Pane\PaneControl.xaml.cs">
<DependentUpon>PaneControl.xaml</DependentUpon>
</Compile>
<Compile Include="UserControls\PathBreadcrumb.xaml.cs">
Expand Down Expand Up @@ -374,6 +375,7 @@
</Compile>
<Compile Include="ViewModels\Dialogs\DecompressArchiveDialogViewModel.cs" />
<Compile Include="ViewModels\NavToolbarViewModel.cs" />
<Compile Include="ViewModels\PaneViewModel.cs" />
<Compile Include="ViewModels\Previews\ArchivePreviewViewModel.cs" />
<Compile Include="ViewModels\Previews\CodePreviewViewModel.cs" />
<Compile Include="ViewModels\Properties\CompatibilityProperties.cs" />
Expand Down Expand Up @@ -407,7 +409,7 @@
<Compile Include="ViewModels\Previews\ShortcutPreviewViewModel.cs" />
<Compile Include="ViewModels\Previews\TextPreviewViewModel.cs" />
<Compile Include="ViewModels\Properties\FileProperty.cs" />
<Compile Include="UserControls\PreviewPane.xaml.cs">
<Compile Include="UserControls\Pane\PreviewPane.xaml.cs">
<DependentUpon>PreviewPane.xaml</DependentUpon>
</Compile>
<Compile Include="UserControls\FilePreviews\ImagePreview.xaml.cs">
Expand Down Expand Up @@ -1247,7 +1249,7 @@
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="UserControls\PaneControl.xaml">
<Page Include="UserControls\Pane\PaneControl.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
Expand Down Expand Up @@ -1279,7 +1281,7 @@
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="UserControls\PreviewPane.xaml">
<Page Include="UserControls\Pane\PreviewPane.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
Expand Down
2 changes: 1 addition & 1 deletion src/Files/IBaseLayout.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public interface IBaseLayout : IDisposable

ItemManipulationModel ItemManipulationModel { get; }

PreviewPaneViewModel PreviewPaneViewModel { get; }
IPaneViewModel PaneViewModel { get; }

public SelectedItemsPropertiesViewModel SelectedItemsPropertiesViewModel { get; }
public DirectoryPropertiesViewModel DirectoryPropertiesViewModel { get; }
Expand Down
4 changes: 2 additions & 2 deletions src/Files/Interacts/BaseLayoutCommandImplementationModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -806,14 +806,14 @@ public async void RotateImageLeft()
{
await BitmapHelper.Rotate(PathNormalization.NormalizePath(SlimContentPage?.SelectedItems.First().ItemPath), BitmapRotation.Clockwise270Degrees);
SlimContentPage?.ItemManipulationModel.RefreshItemsThumbnail();
SlimContentPage?.PreviewPaneViewModel.UpdateSelectedItemPreview();
App.PreviewPaneViewModel.UpdateSelectedItemPreview();
}

public async void RotateImageRight()
{
await BitmapHelper.Rotate(PathNormalization.NormalizePath(SlimContentPage?.SelectedItems.First().ItemPath), BitmapRotation.Clockwise90Degrees);
SlimContentPage?.ItemManipulationModel.RefreshItemsThumbnail();
SlimContentPage?.PreviewPaneViewModel.UpdateSelectedItemPreview();
App.PreviewPaneViewModel.UpdateSelectedItemPreview();
}

public async void InstallFont()
Expand Down
2 changes: 1 addition & 1 deletion src/Files/UserControls/InnerNavigationToolbar.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -813,7 +813,7 @@
MinWidth="40"
AccessKey="P"
AutomationProperties.Name="Toggle preview pane"
IsChecked="{x:Bind PreviewPaneViewModel.IsPaneSelected, Mode=TwoWay}"
IsChecked="{x:Bind MainViewModel.PaneViewModel.IsPreviewSelected, Mode=TwoWay}"
IsEnabled="{x:Bind ShowPreviewPaneButton, Mode=OneWay}"
Label="Preview"
LabelPosition="Collapsed"
Expand Down
1 change: 0 additions & 1 deletion src/Files/UserControls/InnerNavigationToolbar.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ public InnerNavigationToolbar()
Ioc.Default.GetService<IUserSettingsService>();

public MainViewModel MainViewModel => App.MainViewModel;
public PreviewPaneViewModel PreviewPaneViewModel => App.PreviewPaneViewModel;

public NavToolbarViewModel ViewModel
{
Expand Down
16 changes: 16 additions & 0 deletions src/Files/UserControls/Pane/Pane.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
namespace Files.UserControls
{
public interface IPane
{
PanePositions Position { get; }

void UpdatePosition(double panelWidth, double panelHeight);
}

public enum PanePositions : ushort
{
None,
Right,
Bottom,
}
}
11 changes: 11 additions & 0 deletions src/Files/UserControls/Pane/PaneControl.xaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<UserControl
x:Class="Files.UserControls.PaneControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
d:DesignWidth="400" d:DesignHeight="300" mc:Ignorable="d">

<Grid x:Name="Panel" />

</UserControl>
72 changes: 72 additions & 0 deletions src/Files/UserControls/Pane/PaneControl.xaml.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
using Files.Enums;
using Files.Services;
using Microsoft.Toolkit.Mvvm.DependencyInjection;
using System.ComponentModel;
using Windows.UI.Xaml.Controls;

namespace Files.UserControls
{
public sealed partial class PaneControl : UserControl, IPane
{
public PanePositions Position { get; private set; } = PanePositions.None;

private IPaneSettingsService PaneService { get; } = Ioc.Default.GetService<IPaneSettingsService>();

private PaneContents content;
private Control pane;

public PaneControl()
{
InitializeComponent();

PaneService.PropertyChanged += PaneService_PropertyChanged;
Update();
}

public void UpdatePosition(double panelWidth, double panelHeight)
{
if (pane is IPane p)
{
p.UpdatePosition(panelWidth, panelHeight);
Position = p.Position;
}
if (pane is not null)
{
MinWidth = pane.MinWidth;
MaxWidth = pane.MaxWidth;
MinHeight = pane.MinHeight;
MaxHeight = pane.MaxHeight;
}
}

private void PaneService_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName is nameof(IPaneSettingsService.Content))
{
Update();
}
}

private void Update()
{
var newContent = PaneService.Content;
if (content != newContent)
{
content = newContent;
pane = GetPane(content);

Panel.Children.Clear();
if (pane is not null)
{
Panel.Children.Add(pane);
}
}
}

private static Control GetPane(PaneContents content) => content switch
{
PaneContents.Preview => new PreviewPane(),
_ => null,
};
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<UserControl
x:Name="Root" MinWidth="90"
x:Name="Root" x:Uid="SelectedFilePreviewPane"
x:Class="Files.UserControls.PreviewPane"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Expand All @@ -8,8 +8,9 @@
xmlns:muxc="using:Microsoft.UI.Xaml.Controls"
xmlns:properties="using:Files.ViewModels.Properties"
xmlns:triggers="using:Microsoft.Toolkit.Uwp.UI.Triggers"
Unloaded="UserControl_Unloaded" SizeChanged="Root_SizeChanged"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
Loading="Root_Loading" Unloaded="Root_Unloaded" SizeChanged="Root_SizeChanged"
MinWidth="90" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
AutomationProperties.Name="Selected file preview pane"
d:DesignWidth="400" d:DesignHeight="300" mc:Ignorable="d">

<UserControl.Resources>
Expand Down Expand Up @@ -37,10 +38,10 @@
<MenuFlyout>
<ToggleMenuFlyoutItem x:Uid="PreviewPaneShowPreviewOnly" Text="Show preview only"
IsChecked="{x:Bind PaneSettingsService.ShowPreviewOnly, Mode=TwoWay}"
Command="{x:Bind Model.ShowPreviewOnlyInvoked, Mode=OneWay}" />
Command="{x:Bind ViewModel.ShowPreviewOnlyInvoked, Mode=OneWay}" />
<MenuFlyoutItem x:Uid="PreviewPaneLoadCloudItemButton" HorizontalAlignment="Stretch"
Text="Load full preview" Tapped="MenuFlyoutItem_Tapped"
Visibility="{x:Bind Model.ShowCloudItemButton, Mode=OneWay}"
Visibility="{x:Bind ViewModel.ShowCloudItemButton, Mode=OneWay}"
ToolTipService.ToolTip="Downloads the item from the cloud and loads the preview" />
</MenuFlyout>
</Grid.ContextFlyout>
Expand All @@ -52,7 +53,7 @@
TextWrapping="WrapWholeWords" Text="{x:Bind GetLocalized('NoItemSelected')}" />
<ContentPresenter x:Name="PreviewControlPresenter"
HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"
Content="{x:Bind Model.PreviewPaneContent, Mode=OneWay}" Visibility="Collapsed" />
Content="{x:Bind ViewModel.PreviewPaneContent, Mode=OneWay}" Visibility="Collapsed" />
<muxc:ProgressRing x:Name="PreviewLoadingIndicator" IsIndeterminate="True" Visibility="Collapsed" />
</Grid>

Expand All @@ -65,12 +66,12 @@
<StackPanel Orientation="Vertical">
<StackPanel x:Name="DetailsListHeader" Orientation="Vertical" Margin="8,8,8,0" Spacing="5" Visibility="Collapsed">
<TextBlock FontSize="20" FontWeight="Bold" HorizontalTextAlignment="Center" IsTextSelectionEnabled="True"
TextWrapping="Wrap" TextAlignment="Center" Text="{x:Bind Model.SelectedItem.ItemName, Mode=OneWay}" />
TextWrapping="Wrap" TextAlignment="Center" Text="{x:Bind ViewModel.SelectedItem.ItemName, Mode=OneWay}" />
<TextBlock HorizontalAlignment="Stretch" FontSize="18" HorizontalTextAlignment="Center" IsTextSelectionEnabled="True"
TextWrapping="Wrap" TextAlignment="Center" Text="{x:Bind Model.SelectedItem.ItemType, Mode=OneWay}" />
TextWrapping="Wrap" TextAlignment="Center" Text="{x:Bind ViewModel.SelectedItem.ItemType, Mode=OneWay}" />
</StackPanel>
<ItemsControl x:Name="FileDetailsRepeater" Margin="8" Visibility="Collapsed"
ItemsSource="{x:Bind Model.SelectedItem.FileDetails, Mode=OneWay}">
ItemsSource="{x:Bind ViewModel.SelectedItem.FileDetails, Mode=OneWay}">
<ItemsControl.ItemContainerTransitions>
<TransitionCollection>
<EntranceThemeTransition IsStaggeringEnabled="False" />
Expand Down Expand Up @@ -124,13 +125,13 @@
<VisualStateGroup>
<VisualState x:Name="NoItemSelected">
<VisualState.StateTriggers>
<triggers:IsEqualStateTrigger Value="{x:Bind Model.PreviewPaneState, Mode=OneWay}" To="0" />
<triggers:IsNullOrEmptyStateTrigger Value="{x:Bind Model, Mode=OneWay}" />
<triggers:IsEqualStateTrigger Value="{x:Bind ViewModel.PreviewPaneState, Mode=OneWay}" To="0" />
<triggers:IsNullOrEmptyStateTrigger Value="{x:Bind ViewModel, Mode=OneWay}" />
</VisualState.StateTriggers>
</VisualState>
<VisualState x:Name="NoPreviewAvailable">
<VisualState.StateTriggers>
<triggers:IsEqualStateTrigger Value="{x:Bind Model.PreviewPaneState, Mode=OneWay}" To="1" />
<triggers:IsEqualStateTrigger Value="{x:Bind ViewModel.PreviewPaneState, Mode=OneWay}" To="1" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="PreviewErrorText.Visibility" Value="Visible" />
Expand All @@ -143,7 +144,7 @@
</VisualState>
<VisualState x:Name="NoPreviewOrDetailsAvailable">
<VisualState.StateTriggers>
<triggers:IsEqualStateTrigger Value="{x:Bind Model.PreviewPaneState, Mode=OneWay}" To="2" />
<triggers:IsEqualStateTrigger Value="{x:Bind ViewModel.PreviewPaneState, Mode=OneWay}" To="2" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="PreviewErrorText.Visibility" Value="Visible" />
Expand All @@ -156,7 +157,7 @@
</VisualState>
<VisualState x:Name="PreviewAndDetailsAvailable">
<VisualState.StateTriggers>
<triggers:IsEqualStateTrigger Value="{x:Bind Model.PreviewPaneState, Mode=OneWay}" To="3" />
<triggers:IsEqualStateTrigger Value="{x:Bind ViewModel.PreviewPaneState, Mode=OneWay}" To="3" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="PreviewErrorText.Visibility" Value="Collapsed" />
Expand All @@ -168,7 +169,7 @@
</VisualState>
<VisualState x:Name="LoadingPreview">
<VisualState.StateTriggers>
<triggers:IsEqualStateTrigger Value="{x:Bind Model.PreviewPaneState, Mode=OneWay}" To="4" />
<triggers:IsEqualStateTrigger Value="{x:Bind ViewModel.PreviewPaneState, Mode=OneWay}" To="4" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="PreviewErrorText.Visibility" Value="Collapsed" />
Expand Down
Loading