Skip to content

Code Quality: Refactor preview/info pane phase 1 #13895

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 6 commits into from
Nov 15, 2023
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
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ internal abstract class BaseRotateAction : ObservableObject, IAction
{
private readonly IContentPageContext context;

private readonly PreviewPaneViewModel _previewPaneViewModel;
private readonly InfoPaneViewModel _infoPaneViewModel;

public abstract string Label { get; }

Expand All @@ -26,7 +26,7 @@ internal abstract class BaseRotateAction : ObservableObject, IAction
public BaseRotateAction()
{
context = Ioc.Default.GetRequiredService<IContentPageContext>();
_previewPaneViewModel = Ioc.Default.GetRequiredService<PreviewPaneViewModel>();
_infoPaneViewModel = Ioc.Default.GetRequiredService<InfoPaneViewModel>();

context.PropertyChanged += Context_PropertyChanged;
}
Expand All @@ -38,7 +38,7 @@ public async Task ExecuteAsync()

context.ShellPage?.SlimContentPage?.ItemManipulationModel?.RefreshItemsThumbnail();

await _previewPaneViewModel.UpdateSelectedItemPreviewAsync();
await _infoPaneViewModel.UpdateSelectedItemPreviewAsync();
}

private bool IsContextPageTypeAdaptedToCommand()
Expand Down
10 changes: 5 additions & 5 deletions src/Files.App/Actions/Show/ToggleDetailsPaneAction.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ namespace Files.App.Actions
{
internal class ToggleDetailsPaneAction : ObservableObject, IToggleAction
{
private readonly PreviewPaneViewModel viewModel;
private readonly IPreviewPaneSettingsService previewSettingsService = Ioc.Default.GetRequiredService<IPreviewPaneSettingsService>();
private readonly InfoPaneViewModel viewModel;
private readonly IInfoPaneSettingsService infoPaneSettingsService = Ioc.Default.GetRequiredService<IInfoPaneSettingsService>();

public string Label
=> "ToggleDetailsPane".GetLocalizedResource();
Expand All @@ -25,21 +25,21 @@ public bool IsOn

public ToggleDetailsPaneAction()
{
viewModel = Ioc.Default.GetRequiredService<PreviewPaneViewModel>();
viewModel = Ioc.Default.GetRequiredService<InfoPaneViewModel>();
viewModel.PropertyChanged += ViewModel_PropertyChanged;
}

public Task ExecuteAsync()
{
viewModel.IsEnabled = true;
previewSettingsService.ShowPreviewOnly = false;
infoPaneSettingsService.SelectedTab = InfoPaneTabs.Details;

return Task.CompletedTask;
}

private void ViewModel_PropertyChanged(object? sender, PropertyChangedEventArgs e)
{
if (e.PropertyName is nameof(PreviewPaneViewModel.IsEnabled))
if (e.PropertyName is nameof(InfoPaneViewModel.IsEnabled))
OnPropertyChanged(nameof(IsOn));
}
}
Expand Down
9 changes: 6 additions & 3 deletions src/Files.App/Actions/Show/ToggleInfoPaneAction.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ namespace Files.App.Actions
{
internal class ToggleInfoPaneAction : ObservableObject, IToggleAction
{
private readonly PreviewPaneViewModel viewModel;
private readonly InfoPaneViewModel viewModel;

public string Label
=> "ToggleInfoPane".GetLocalizedResource();
Expand All @@ -16,12 +16,15 @@ public string Description
public RichGlyph Glyph
=> new(opacityStyle: "ColorIconRightPane");

public HotKey HotKey
=> new(Keys.I, KeyModifiers.MenuCtrl);

public bool IsOn
=> viewModel.IsEnabled;

public ToggleInfoPaneAction()
{
viewModel = Ioc.Default.GetRequiredService<PreviewPaneViewModel>();
viewModel = Ioc.Default.GetRequiredService<InfoPaneViewModel>();
viewModel.PropertyChanged += ViewModel_PropertyChanged;
}

Expand All @@ -34,7 +37,7 @@ public Task ExecuteAsync()

private void ViewModel_PropertyChanged(object? sender, PropertyChangedEventArgs e)
{
if (e.PropertyName is nameof(PreviewPaneViewModel.IsEnabled))
if (e.PropertyName is nameof(InfoPaneViewModel.IsEnabled))
OnPropertyChanged(nameof(IsOn));
}
}
Expand Down
10 changes: 5 additions & 5 deletions src/Files.App/Actions/Show/TogglePreviewPaneAction.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ namespace Files.App.Actions
{
internal class TogglePreviewPaneAction : ObservableObject, IToggleAction
{
private readonly PreviewPaneViewModel viewModel;
private readonly IPreviewPaneSettingsService previewSettingsService = Ioc.Default.GetRequiredService<IPreviewPaneSettingsService>();
private readonly InfoPaneViewModel viewModel;
private readonly IInfoPaneSettingsService infoPaneSettingsService = Ioc.Default.GetRequiredService<IInfoPaneSettingsService>();

public string Label
=> "TogglePreviewPane".GetLocalizedResource();
Expand All @@ -25,21 +25,21 @@ public bool IsOn

public TogglePreviewPaneAction()
{
viewModel = Ioc.Default.GetRequiredService<PreviewPaneViewModel>();
viewModel = Ioc.Default.GetRequiredService<InfoPaneViewModel>();
viewModel.PropertyChanged += ViewModel_PropertyChanged;
}

public Task ExecuteAsync()
{
viewModel.IsEnabled = true;
previewSettingsService.ShowPreviewOnly = true;
infoPaneSettingsService.SelectedTab = InfoPaneTabs.Preview;

return Task.CompletedTask;
}

private void ViewModel_PropertyChanged(object? sender, PropertyChangedEventArgs e)
{
if (e.PropertyName is nameof(PreviewPaneViewModel.IsEnabled))
if (e.PropertyName is nameof(InfoPaneViewModel.IsEnabled))
OnPropertyChanged(nameof(IsOn));
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/Files.App/App.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ private IHost ConfigureHost()
.AddSingleton<IGeneralSettingsService, GeneralSettingsService>(sp => new GeneralSettingsService((sp.GetService<IUserSettingsService>() as UserSettingsService).GetSharingContext()))
.AddSingleton<IFoldersSettingsService, FoldersSettingsService>(sp => new FoldersSettingsService((sp.GetService<IUserSettingsService>() as UserSettingsService).GetSharingContext()))
.AddSingleton<IApplicationSettingsService, ApplicationSettingsService>(sp => new ApplicationSettingsService((sp.GetService<IUserSettingsService>() as UserSettingsService).GetSharingContext()))
.AddSingleton<IPreviewPaneSettingsService, PreviewPaneSettingsService>(sp => new PreviewPaneSettingsService((sp.GetService<IUserSettingsService>() as UserSettingsService).GetSharingContext()))
.AddSingleton<IInfoPaneSettingsService, InfoPaneSettingsService>(sp => new InfoPaneSettingsService((sp.GetService<IUserSettingsService>() as UserSettingsService).GetSharingContext()))
.AddSingleton<ILayoutSettingsService, LayoutSettingsService>(sp => new LayoutSettingsService((sp.GetService<IUserSettingsService>() as UserSettingsService).GetSharingContext()))
.AddSingleton<IAppSettingsService, AppSettingsService>(sp => new AppSettingsService((sp.GetService<IUserSettingsService>() as UserSettingsService).GetSharingContext()))
.AddSingleton<IFileTagsSettingsService, FileTagsSettingsService>()
Expand Down Expand Up @@ -137,7 +137,7 @@ private IHost ConfigureHost()
.AddSingleton<INetworkDrivesService, NetworkDrivesService>()
.AddSingleton<IStartMenuService, StartMenuService>()
.AddSingleton<MainPageViewModel>()
.AddSingleton<PreviewPaneViewModel>()
.AddSingleton<InfoPaneViewModel>()
.AddSingleton<SidebarViewModel>()
.AddSingleton<SettingsViewModel>()
.AddSingleton<DrivesViewModel>()
Expand Down
23 changes: 23 additions & 0 deletions src/Files.App/Converters/EnumToBoolConverter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// Copyright (c) 2023 Files Community
// Licensed under the MIT License. See the LICENSE.

using Microsoft.UI.Xaml.Data;

namespace Files.App.Converters
{
internal sealed class EnumToBoolConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
if (value == null)
return false;

return value.ToString() == parameter.ToString();
}

public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotImplementedException();
}
}
}
1 change: 1 addition & 0 deletions src/Files.App/Data/Commands/Manager/ICommandManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ public interface ICommandManager : IEnumerable<IRichCommand>
IRichCommand ToggleShowHiddenItems { get; }
IRichCommand ToggleShowFileExtensions { get; }
IRichCommand TogglePreviewPane { get; }
IRichCommand ToggleDetailsPane { get; }
IRichCommand ToggleInfoPane { get; }

IRichCommand CopyItem { get; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

namespace Files.App.Services.Settings
{
internal sealed class PreviewPaneSettingsService : BaseObservableJsonSettings, IPreviewPaneSettingsService
internal sealed class InfoPaneSettingsService : BaseObservableJsonSettings, IInfoPaneSettingsService
{
public bool IsEnabled
{
Expand All @@ -34,20 +34,20 @@ public double MediaVolume
set => Set(Math.Max(0d, Math.Min(value, 1d)));
}

public bool ShowPreviewOnly
public InfoPaneTabs SelectedTab
{
get => Get(false);
get => Get(InfoPaneTabs.Details);
set => Set(value);
}

public PreviewPaneSettingsService(ISettingsSharingContext settingsSharingContext)
public InfoPaneSettingsService(ISettingsSharingContext settingsSharingContext)
{
RegisterSettingsContext(settingsSharingContext);
}

protected override void RaiseOnSettingChangedEvent(object sender, SettingChangedEventArgs e)
{
if (e.SettingName is nameof(ShowPreviewOnly))
if (e.SettingName is nameof(SelectedTab))
{
Analytics.TrackEvent($"Set {e.SettingName} to {e.NewValue}");
}
Expand Down
6 changes: 3 additions & 3 deletions src/Files.App/Services/Settings/UserSettingsService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,10 @@ public IAppearanceSettingsService AppearanceSettingsService
get => GetSettingsService(ref _AppearanceSettingsService);
}

private IPreviewPaneSettingsService _PreviewPaneSettingsService;
public IPreviewPaneSettingsService PreviewPaneSettingsService
private IInfoPaneSettingsService _InfoPaneSettingsService;
public IInfoPaneSettingsService InfoPaneSettingsService
{
get => GetSettingsService(ref _PreviewPaneSettingsService);
get => GetSettingsService(ref _InfoPaneSettingsService);
}

private ILayoutSettingsService _LayoutSettingsService;
Expand Down
12 changes: 6 additions & 6 deletions src/Files.App/Strings/en-US/Resources.resw
Original file line number Diff line number Diff line change
Expand Up @@ -1056,11 +1056,14 @@
<data name="ToggleDetailsPane" xml:space="preserve">
<value>Toggle the details pane</value>
</data>
<data name="ToggleDetailsPaneDescription" xml:space="preserve">
<value>Toggle the details pane to view basic file properties</value>
</data>
<data name="ToggleInfoPane" xml:space="preserve">
<value>Toggle the details/preview pane</value>
<value>Toggle the info pane</value>
</data>
<data name="ToggleInfoPaneDescription" xml:space="preserve">
<value>Toggles the details/preview pane</value>
<value>Toggle the info pane to view the detail\preview panes</value>
</data>
<data name="DetailsPanePreviewNotAvaliableText" xml:space="preserve">
<value>No preview available</value>
Expand Down Expand Up @@ -2404,10 +2407,7 @@
<value>Toggle whether to show file extensions</value>
</data>
<data name="TogglePreviewPaneDescription" xml:space="preserve">
<value>Toggle whether to show preview pane</value>
</data>
<data name="ToggleDetailsPaneDescription" xml:space="preserve">
<value>Toggle the details pane</value>
<value>Toggle the preview pane to view file previews</value>
</data>
<data name="ToggleSidebarDescription" xml:space="preserve">
<value>Toggle whether to show sidebar</value>
Expand Down
6 changes: 3 additions & 3 deletions src/Files.App/UserControls/FilePreviews/MediaPreview.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,16 +26,16 @@ public MediaPreview(MediaPreviewViewModel model)

private void PlayerContext_Loaded(object sender, RoutedEventArgs e)
{
PlayerContext.MediaPlayer.Volume = UserSettingsService.PreviewPaneSettingsService.MediaVolume;
PlayerContext.MediaPlayer.Volume = UserSettingsService.InfoPaneSettingsService.MediaVolume;
PlayerContext.MediaPlayer.VolumeChanged += MediaPlayer_VolumeChanged;
ViewModel.TogglePlaybackRequested += TogglePlaybackRequestInvoked;
}

private void MediaPlayer_VolumeChanged(MediaPlayer sender, object args)
{
if (sender.Volume != UserSettingsService.PreviewPaneSettingsService.MediaVolume)
if (sender.Volume != UserSettingsService.InfoPaneSettingsService.MediaVolume)
{
UserSettingsService.PreviewPaneSettingsService.MediaVolume = sender.Volume;
UserSettingsService.InfoPaneSettingsService.MediaVolume = sender.Volume;
}
}

Expand Down
3 changes: 0 additions & 3 deletions src/Files.App/UserControls/InnerNavigationToolbar.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ public sealed partial class InnerNavigationToolbar : UserControl
public InnerNavigationToolbar()
{
InitializeComponent();
PreviewPaneViewModel = Ioc.Default.GetRequiredService<PreviewPaneViewModel>();
}

public IUserSettingsService UserSettingsService { get; } = Ioc.Default.GetRequiredService<IUserSettingsService>();
Expand All @@ -28,8 +27,6 @@ public InnerNavigationToolbar()

public AppModel AppModel => App.AppModel;

public readonly PreviewPaneViewModel PreviewPaneViewModel;

public ToolbarViewModel ViewModel
{
get => (ToolbarViewModel)GetValue(ViewModelProperty);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
<!-- Copyright (c) 2023 Files Community. Licensed under the MIT License. See the LICENSE. -->
<UserControl
x:Class="Files.App.UserControls.PreviewPane"
x:Class="Files.App.UserControls.InfoPane"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="using:CommunityToolkit.WinUI.UI.Controls"
xmlns:converters="using:CommunityToolkit.WinUI.UI.Converters"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:helpers="using:Files.App.Helpers"
xmlns:items="using:Files.App.Data.Items"
xmlns:local="using:Files.App.Converters"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:properties="using:Files.App.ViewModels.Properties"
xmlns:triggers="using:CommunityToolkit.WinUI.UI.Triggers"
Expand All @@ -31,6 +32,7 @@

<ResourceDictionary>
<converters:BoolNegationConverter x:Key="BoolNegationConverter" />
<local:EnumToBoolConverter x:Key="EnumToBoolConverter" />

<Style x:Key="Local.RadioButtonStyle" TargetType="RadioButton">
<Setter Property="Foreground" Value="{ThemeResource TextFillColorSecondaryBrush}" />
Expand Down Expand Up @@ -166,13 +168,15 @@
Orientation="Horizontal">
<!-- Details -->
<RadioButton
Command="{x:Bind Commands.ToggleDetailsPane, Mode=OneWay}"
Content="{helpers:ResourceString Name=Details}"
IsChecked="{x:Bind PaneSettingsService.ShowPreviewOnly, Mode=TwoWay, Converter={StaticResource BoolNegationConverter}}"
IsChecked="{x:Bind ViewModel.SelectedTab, Converter={StaticResource EnumToBoolConverter}, ConverterParameter=Details, Mode=OneWay}"
Style="{StaticResource Local.RadioButtonStyle}" />
<!-- Preview -->
<RadioButton
Command="{x:Bind Commands.TogglePreviewPane, Mode=OneWay}"
Content="{helpers:ResourceString Name=Preview}"
IsChecked="{x:Bind PaneSettingsService.ShowPreviewOnly, Mode=TwoWay}"
IsChecked="{x:Bind ViewModel.SelectedTab, Converter={StaticResource EnumToBoolConverter}, ConverterParameter=Preview, Mode=OneWay}"
Style="{StaticResource Local.RadioButtonStyle}" />
</StackPanel>

Expand Down Expand Up @@ -465,7 +469,7 @@
<VisualStateGroup>
<VisualState>
<VisualState.StateTriggers>
<triggers:IsEqualStateTrigger Value="{x:Bind PaneSettingsService.ShowPreviewOnly, Mode=OneWay}" To="False" />
<triggers:IsEqualStateTrigger Value="{x:Bind ViewModel.SelectedTab, Mode=OneWay}" To="Details" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="RootPropertiesScrollViewer.Visibility" Value="Visible" />
Expand All @@ -475,7 +479,7 @@
</VisualState>
<VisualState>
<VisualState.StateTriggers>
<triggers:IsEqualStateTrigger Value="{x:Bind PaneSettingsService.ShowPreviewOnly, Mode=OneWay}" To="True" />
<triggers:IsEqualStateTrigger Value="{x:Bind ViewModel.SelectedTab, Mode=OneWay}" To="Preview" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="RootPropertiesScrollViewer.Visibility" Value="Collapsed" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,24 +14,24 @@ public enum PreviewPanePositions : ushort
Bottom,
}

public sealed partial class PreviewPane : UserControl
public sealed partial class InfoPane : UserControl
{
public PreviewPanePositions Position { get; private set; } = PreviewPanePositions.None;

private readonly IPreviewPaneSettingsService PaneSettingsService;
private readonly IInfoPaneSettingsService PaneSettingsService;

private readonly ICommandManager Commands;

public PreviewPaneViewModel ViewModel { get; private set; }
public InfoPaneViewModel ViewModel { get; private set; }

private ObservableContext Context { get; } = new();

public PreviewPane()
public InfoPane()
{
InitializeComponent();
PaneSettingsService = Ioc.Default.GetRequiredService<IPreviewPaneSettingsService>();
PaneSettingsService = Ioc.Default.GetRequiredService<IInfoPaneSettingsService>();
Commands = Ioc.Default.GetRequiredService<ICommandManager>();
ViewModel = Ioc.Default.GetRequiredService<PreviewPaneViewModel>();
ViewModel = Ioc.Default.GetRequiredService<InfoPaneViewModel>();
}

public void UpdatePosition(double panelWidth, double panelHeight)
Expand Down
2 changes: 1 addition & 1 deletion src/Files.App/ViewModels/Previews/BasePreviewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ public virtual async Task LoadAsync()
await Task.Run(async () =>
{
DetailsFromPreview = await LoadPreviewAndDetailsAsync();
if (!userSettingsService.PreviewPaneSettingsService.ShowPreviewOnly)
if (userSettingsService.InfoPaneSettingsService.SelectedTab == InfoPaneTabs.Details)
{
// Add the details from the preview function, then the system file properties
DetailsFromPreview?.ForEach(i => detailsFull.Add(i));
Expand Down
Loading