Skip to content

Commit 0cd6cc3

Browse files
authored
Code Quality: Refactor InfoPane selection (#14095)
1 parent 9bc78d7 commit 0cd6cc3

File tree

8 files changed

+46
-69
lines changed

8 files changed

+46
-69
lines changed

src/Files.App/UserControls/Pane/InfoPane.xaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
d:DesignHeight="300"
2121
d:DesignWidth="400"
2222
AutomationProperties.Name="{helpers:ResourceString Name=SelectedFilePreviewPane/AutomationProperties/Name}"
23-
Loaded="Root_Loaded"
2423
SizeChanged="Root_SizeChanged"
2524
Unloaded="Root_Unloaded"
2625
mc:Ignorable="d">

src/Files.App/UserControls/Pane/InfoPane.xaml.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,6 @@ public void UpdatePosition(double panelWidth, double panelHeight)
5252

5353
private string GetLocalizedResource(string resName) => resName.GetLocalizedResource();
5454

55-
private void Root_Loaded(object sender, RoutedEventArgs e)
56-
=> ViewModel?.UpdateSelectedItemPreviewAsync();
57-
5855
private void Root_Unloaded(object sender, RoutedEventArgs e)
5956
{
6057
PreviewControlPresenter.Content = null;

src/Files.App/ViewModels/UserControls/InfoPaneViewModel.cs

Lines changed: 46 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,13 @@ namespace Files.App.ViewModels.UserControls
1313
public class InfoPaneViewModel : ObservableObject, IDisposable
1414
{
1515
private IInfoPaneSettingsService infoPaneSettingsService { get; } = Ioc.Default.GetRequiredService<IInfoPaneSettingsService>();
16-
17-
private readonly IContentPageContext contentPageContextService;
16+
private IContentPageContext contentPageContext { get; } = Ioc.Default.GetRequiredService<IContentPageContext>();
1817

1918
private CancellationTokenSource loadCancellationTokenSource;
2019

20+
/// <summary>
21+
/// Value indicating if the info pane is on/off
22+
/// </summary>
2123
private bool isEnabled;
2224
public bool IsEnabled
2325
{
@@ -30,13 +32,10 @@ public bool IsEnabled
3032
}
3133
}
3234

33-
private bool isItemSelected;
34-
public bool IsItemSelected
35-
{
36-
get => isItemSelected;
37-
set => SetProperty(ref isItemSelected, value);
38-
}
39-
35+
/// <summary>
36+
/// Current selected item in the file list.
37+
/// TODO see about removing this and accessing it from the page context instead
38+
/// </summary>
4039
private ListedItem selectedItem;
4140
public ListedItem SelectedItem
4241
{
@@ -57,6 +56,9 @@ public ListedItem SelectedItem
5756
}
5857
}
5958

59+
/// <summary>
60+
/// Enum indicating whether to show the details or preview tab
61+
/// </summary>
6062
public InfoPaneTabs SelectedTab
6163
{
6264
get => infoPaneSettingsService.SelectedTab;
@@ -69,6 +71,9 @@ public InfoPaneTabs SelectedTab
6971
}
7072
}
7173

74+
/// <summary>
75+
/// Enum indicating if details/preview are available
76+
/// </summary>
7277
private PreviewPaneStates previewPaneState;
7378
public PreviewPaneStates PreviewPaneState
7479
{
@@ -80,6 +85,9 @@ public PreviewPaneStates PreviewPaneState
8085
}
8186
}
8287

88+
/// <summary>
89+
/// Value indicating if the download cloud files option should be displayed
90+
/// </summary>
8391
private bool showCloudItemButton;
8492
public bool ShowCloudItemButton
8593
{
@@ -101,13 +109,31 @@ PreviewPaneState is PreviewPaneStates.NoPreviewAvailable ||
101109

102110
public ObservableCollection<TagsListItem> Items { get; } = new();
103111

104-
public InfoPaneViewModel(IContentPageContext contentPageContextService = null)
112+
public InfoPaneViewModel()
105113
{
106114
infoPaneSettingsService.PropertyChanged += PreviewSettingsService_OnPropertyChangedEvent;
115+
contentPageContext.PropertyChanged += ContentPageContext_PropertyChanged;
107116

108117
IsEnabled = infoPaneSettingsService.IsEnabled;
118+
}
109119

110-
this.contentPageContextService = contentPageContextService ?? Ioc.Default.GetRequiredService<IContentPageContext>();
120+
private void ContentPageContext_PropertyChanged(object? sender, PropertyChangedEventArgs e)
121+
{
122+
switch (e.PropertyName)
123+
{
124+
case nameof(IContentPageContext.Folder):
125+
case nameof(IContentPageContext.SelectedItem):
126+
127+
if (contentPageContext.SelectedItems.Count == 1)
128+
SelectedItem = contentPageContext.SelectedItems.First();
129+
else
130+
SelectedItem = null;
131+
132+
var shouldUpdatePreview = ((MainWindow.Instance.Content as Frame)?.Content as MainPage)?.ShouldPreviewPaneBeActive;
133+
if (shouldUpdatePreview == true)
134+
_ = UpdateSelectedItemPreviewAsync();
135+
break;
136+
}
111137
}
112138

113139
private async Task LoadPreviewControlAsync(CancellationToken token, bool downloadItem)
@@ -148,7 +174,7 @@ private async Task<UserControl> GetBuiltInPreviewControlAsync(ListedItem item, b
148174
{
149175
ShowCloudItemButton = false;
150176

151-
if (SelectedItem.IsRecycleBinItem)
177+
if (item.IsRecycleBinItem)
152178
{
153179
if (item.PrimaryItemAttribute == StorageItemTypes.Folder && !item.IsArchive)
154180
{
@@ -159,7 +185,7 @@ private async Task<UserControl> GetBuiltInPreviewControlAsync(ListedItem item, b
159185
}
160186
else
161187
{
162-
var model = new BasicPreviewViewModel(SelectedItem);
188+
var model = new BasicPreviewViewModel(item);
163189
await model.LoadAsync();
164190

165191
return new BasicPreview(model);
@@ -168,7 +194,7 @@ private async Task<UserControl> GetBuiltInPreviewControlAsync(ListedItem item, b
168194

169195
if (item.IsShortcut)
170196
{
171-
var model = new ShortcutPreviewViewModel(SelectedItem);
197+
var model = new ShortcutPreviewViewModel(item);
172198
await model.LoadAsync();
173199

174200
return new BasicPreview(model);
@@ -187,7 +213,7 @@ private async Task<UserControl> GetBuiltInPreviewControlAsync(ListedItem item, b
187213
var model = new FolderPreviewViewModel(item);
188214
await model.LoadAsync();
189215

190-
if (!isItemSelected)
216+
if (contentPageContext.SelectedItems.Count == 0)
191217
item.FileTags ??= FileTagsHelper.ReadFileTag(item.ItemPath);
192218

193219
return new FolderPreview(model);
@@ -206,7 +232,7 @@ private async Task<UserControl> GetBuiltInPreviewControlAsync(ListedItem item, b
206232
var ext = item.FileExtension.ToLowerInvariant();
207233

208234
if (!item.IsFtpItem &&
209-
contentPageContextService.PageType != ContentPageTypes.ZipFolder &&
235+
contentPageContext.PageType != ContentPageTypes.ZipFolder &&
210236
(FileExtensionHelpers.IsAudioFile(ext) || FileExtensionHelpers.IsVideoFile(ext)))
211237
{
212238
var model = new MediaPreviewViewModel(item);
@@ -291,7 +317,7 @@ private async Task<UserControl> GetBuiltInPreviewControlAsync(ListedItem item, b
291317
public async Task UpdateSelectedItemPreviewAsync(bool downloadItem = false)
292318
{
293319
loadCancellationTokenSource?.Cancel();
294-
if (SelectedItem is not null && IsItemSelected)
320+
if (SelectedItem is not null && contentPageContext.SelectedItems.Count == 1)
295321
{
296322
SelectedItem?.FileDetails?.Clear();
297323

@@ -328,15 +354,15 @@ public async Task UpdateSelectedItemPreviewAsync(bool downloadItem = false)
328354
PreviewPaneState = PreviewPaneStates.NoPreviewOrDetailsAvailable;
329355
}
330356
}
331-
else if (IsItemSelected)
357+
else if (contentPageContext.SelectedItems.Count > 0)
332358
{
333359
PreviewPaneContent = null;
334360
PreviewPaneState = PreviewPaneStates.NoPreviewOrDetailsAvailable;
335361
}
336362
else
337363
{
338364
SelectedItem?.FileDetails?.Clear();
339-
var currentFolder = contentPageContextService.Folder;
365+
var currentFolder = contentPageContext.Folder;
340366

341367
if (currentFolder is null)
342368
{
@@ -388,6 +414,7 @@ private async void PreviewSettingsService_OnPropertyChangedEvent(object? sender,
388414
if (isEnabled != newEnablingStatus)
389415
{
390416
isEnabled = newEnablingStatus;
417+
_ = UpdateSelectedItemPreviewAsync();
391418
OnPropertyChanged(nameof(IsEnabled));
392419
}
393420
}

src/Files.App/Views/Layouts/BaseLayoutPage.cs

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -225,8 +225,6 @@ internal set
225225
{
226226
if (value != selectedItems)
227227
{
228-
UpdatePreviewPaneSelection(value);
229-
230228
selectedItems = value;
231229

232230
if (selectedItems?.Count == 0 || selectedItems?[0] is null)
@@ -507,9 +505,6 @@ navigationArguments.SelectItems is not null &&
507505
}
508506
else if (navigationArguments is not null && navigationArguments.FocusOnNavigation)
509507
{
510-
if (SelectedItems?.Count == 0)
511-
UpdatePreviewPaneSelection(null);
512-
513508
// Set focus on layout specific file list control
514509
ItemManipulationModel.FocusFileList();
515510
}
@@ -1429,32 +1424,6 @@ await DispatcherQueue.EnqueueOrInvokeAsync(() =>
14291424
}
14301425
}
14311426

1432-
public void ReloadPreviewPane()
1433-
{
1434-
UpdatePreviewPaneSelection(SelectedItems);
1435-
}
1436-
1437-
protected void UpdatePreviewPaneSelection(List<ListedItem>? value)
1438-
{
1439-
if (LockPreviewPaneContent)
1440-
return;
1441-
1442-
if (value?.FirstOrDefault() != InfoPaneViewModel.SelectedItem)
1443-
{
1444-
// Update preview pane properties
1445-
InfoPaneViewModel.IsItemSelected = value?.Count > 0;
1446-
InfoPaneViewModel.SelectedItem = value?.Count == 1 ? value.First() : null;
1447-
1448-
// Check if the preview pane is open before updating the model
1449-
if (InfoPaneViewModel.IsEnabled && !App.AppModel.IsMainWindowClosed)
1450-
{
1451-
var isPaneEnabled = ((MainWindow.Instance.Content as Frame)?.Content as MainPage)?.ShouldPreviewPaneBeActive ?? false;
1452-
if (isPaneEnabled)
1453-
_ = InfoPaneViewModel.UpdateSelectedItemPreviewAsync();
1454-
}
1455-
}
1456-
}
1457-
14581427
public class ContextMenuExtensions : DependencyObject
14591428
{
14601429
public static ItemsControl GetItemsControl(DependencyObject obj)

src/Files.App/Views/Layouts/ColumnsLayoutPage.xaml.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -331,9 +331,6 @@ public void MoveFocusToNextBlade(int currentBladeIndex)
331331
if (activeBladeColumnViewBase is not null)
332332
{
333333
activeBladeColumnViewBase.FileList.SelectedIndex = 0;
334-
var selectedItem = activeBladeColumnViewBase.FileList.Items.FirstOrDefault() as ListedItem;
335-
if (selectedItem is not null)
336-
UpdatePreviewPaneSelection(new List<ListedItem>() { selectedItem });
337334
}
338335
}
339336

src/Files.App/Views/Layouts/IBaseLayoutPage.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,5 @@ public interface IBaseLayoutPage : IDisposable
3636
CommandBarFlyout ItemContextMenuFlyout { get; set; }
3737

3838
CommandBarFlyout BaseContextMenuFlyout { get; set; }
39-
40-
void ReloadPreviewPane();
4139
}
4240
}

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,8 +189,6 @@ public void MultitaskingControl_CurrentInstanceChanged(object? sender, CurrentIn
189189

190190
e.CurrentInstance.ContentChanged -= TabItemContent_ContentChanged;
191191
e.CurrentInstance.ContentChanged += TabItemContent_ContentChanged;
192-
193-
SidebarAdaptiveViewModel.PaneHolder?.ActivePaneOrColumn.SlimContentPage?.ReloadPreviewPane();
194192
}
195193

196194
private void PaneHolder_PropertyChanged(object? sender, PropertyChangedEventArgs e)

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

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -352,15 +352,7 @@ private async void Pane_GotFocus(object sender, RoutedEventArgs e)
352352

353353
var activePane = isLeftPane ? PaneLeft : PaneRight;
354354
if (ActivePane != activePane)
355-
{
356355
ActivePane = activePane;
357-
358-
if (ActivePane?.SlimContentPage is IBaseLayoutPage page && !page.IsItemSelected)
359-
{
360-
page.InfoPaneViewModel.IsItemSelected = false;
361-
await page.InfoPaneViewModel.UpdateSelectedItemPreviewAsync();
362-
}
363-
}
364356
}
365357

366358
private void Pane_RightTapped(object sender, RoutedEventArgs e)

0 commit comments

Comments
 (0)