Skip to content

Commit ec5c6e6

Browse files
authored
Feature: Show folder details when no items are selected (#12549)
1 parent eb05526 commit ec5c6e6

File tree

6 files changed

+80
-29
lines changed

6 files changed

+80
-29
lines changed

src/Files.App/Data/Models/ItemViewModel.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1365,8 +1365,6 @@ private async Task RapidAddItemsToCollection(string? path, LibraryItem? library
13651365
var stopwatch = new Stopwatch();
13661366
stopwatch.Start();
13671367

1368-
await GetDefaultItemIcons(folderSettings.GetIconSize());
1369-
13701368
if (FtpHelpers.IsFtpPath(path))
13711369
{
13721370
// Recycle bin and network are enumerated by the fulltrust process
@@ -1418,6 +1416,8 @@ private async Task RapidAddItemsToCollection(string? path, LibraryItem? library
14181416
}
14191417
}
14201418

1419+
await GetDefaultItemIcons(folderSettings.GetIconSize());
1420+
14211421
if (addFilesCTS.IsCancellationRequested)
14221422
{
14231423
addFilesCTS = new CancellationTokenSource();

src/Files.App/UserControls/Widgets/DrivesWidget.xaml.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,11 @@ public async Task LoadCardThumbnailAsync()
6161
public sealed partial class DrivesWidget : HomePageWidget, IWidgetItemModel, INotifyPropertyChanged
6262
{
6363
public IUserSettingsService userSettingsService { get; } = Ioc.Default.GetRequiredService<IUserSettingsService>();
64+
6465
private DrivesViewModel drivesViewModel = Ioc.Default.GetRequiredService<DrivesViewModel>();
66+
6567
private NetworkDrivesViewModel networkDrivesViewModel = Ioc.Default.GetRequiredService<NetworkDrivesViewModel>();
68+
6669
public delegate void DrivesWidgetInvokedEventHandler(object sender, DrivesWidgetInvokedEventArgs e);
6770

6871
public event DrivesWidgetInvokedEventHandler DrivesWidgetInvoked;

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

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Copyright (c) 2023 Files Community
22
// Licensed under the MIT License. See the LICENSE.
33

4+
using Files.App.Contexts;
45
using Files.App.UserControls.FilePreviews;
56
using Files.App.ViewModels.Previews;
67
using Files.Backend.Helpers;
@@ -19,6 +20,8 @@ public class PreviewPaneViewModel : ObservableObject, IDisposable
1920

2021
private readonly IPreviewPaneSettingsService previewSettingsService;
2122

23+
private readonly IContentPageContext contentPageContextService;
24+
2225
private CancellationTokenSource loadCancellationTokenSource;
2326

2427
private bool isEnabled;
@@ -68,7 +71,7 @@ public UIElement PreviewPaneContent
6871
set => SetProperty(ref previewPaneContent, value);
6972
}
7073

71-
public PreviewPaneViewModel(IUserSettingsService userSettings, IPreviewPaneSettingsService previewSettings)
74+
public PreviewPaneViewModel(IUserSettingsService userSettings, IPreviewPaneSettingsService previewSettings, IContentPageContext contentPageContextService = null)
7275
{
7376
userSettingsService = userSettings;
7477
previewSettingsService = previewSettings;
@@ -79,11 +82,13 @@ public PreviewPaneViewModel(IUserSettingsService userSettings, IPreviewPaneSetti
7982

8083
userSettingsService.OnSettingChangedEvent += UserSettingsService_OnSettingChangedEvent;
8184
previewSettingsService.PropertyChanged += PreviewSettingsService_OnPropertyChangedEvent;
85+
86+
this.contentPageContextService = contentPageContextService ?? Ioc.Default.GetRequiredService<IContentPageContext>();
8287
}
8388

8489
private async Task LoadPreviewControlAsync(CancellationToken token, bool downloadItem)
8590
{
86-
if (SelectedItem.IsHiddenItem)
91+
if (SelectedItem.IsHiddenItem && !SelectedItem.ItemPath.EndsWith("\\"))
8792
{
8893
PreviewPaneState = PreviewPaneStates.NoPreviewOrDetailsAvailable;
8994

@@ -279,8 +284,32 @@ public async Task UpdateSelectedItemPreview(bool downloadItem = false)
279284
}
280285
else
281286
{
282-
PreviewPaneContent = null;
283-
PreviewPaneState = PreviewPaneStates.NoItemSelected;
287+
SelectedItem?.FileDetails?.Clear();
288+
var currentFolder = contentPageContextService.Folder;
289+
290+
if (currentFolder is null)
291+
{
292+
PreviewPaneContent = null;
293+
PreviewPaneState = PreviewPaneStates.NoItemSelected;
294+
return;
295+
}
296+
297+
try
298+
{
299+
PreviewPaneState = PreviewPaneStates.LoadingPreview;
300+
loadCancellationTokenSource = new CancellationTokenSource();
301+
302+
SelectedItem = currentFolder;
303+
await LoadPreviewControlAsync(loadCancellationTokenSource.Token, downloadItem);
304+
}
305+
catch (Exception e)
306+
{
307+
Debug.WriteLine(e);
308+
loadCancellationTokenSource?.Cancel();
309+
310+
PreviewPaneContent = null;
311+
PreviewPaneState = PreviewPaneStates.NoPreviewOrDetailsAvailable;
312+
}
284313
}
285314
}
286315

src/Files.App/Views/LayoutModes/BaseLayout.cs

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -188,30 +188,17 @@ public string JumpString
188188
}
189189
}
190190

191+
protected bool LockPreviewPaneContent { get; set; }
192+
191193
private List<ListedItem>? selectedItems = new List<ListedItem>();
192194
public List<ListedItem>? SelectedItems
193195
{
194196
get => selectedItems;
195197
internal set
196198
{
197-
// Check if the new list is different then the old one
198-
//if (!(value?.All(x => selectedItems?.Contains(x) ?? false) ?? value == selectedItems))
199199
if (value != selectedItems)
200200
{
201-
if (value?.FirstOrDefault() != PreviewPaneViewModel.SelectedItem)
202-
{
203-
// Update preview pane properties
204-
PreviewPaneViewModel.IsItemSelected = value?.Count > 0;
205-
PreviewPaneViewModel.SelectedItem = value?.Count == 1 ? value.First() : null;
206-
207-
// Check if the preview pane is open before updating the model
208-
if (PreviewPaneViewModel.IsEnabled)
209-
{
210-
var isPaneEnabled = ((App.Window.Content as Frame)?.Content as MainPage)?.ShouldPreviewPaneBeActive ?? false;
211-
if (isPaneEnabled)
212-
PreviewPaneViewModel.UpdateSelectedItemPreview();
213-
}
214-
}
201+
UpdatePreviewPaneSelection(value);
215202

216203
selectedItems = value;
217204

@@ -483,15 +470,17 @@ public void SetSelectedItemsOnNavigation()
483470
navigationArguments.SelectItems is not null &&
484471
navigationArguments.SelectItems.Any())
485472
{
486-
List<ListedItem> liItemsToSelect = new();
487-
foreach (string item in navigationArguments.SelectItems)
488-
liItemsToSelect.Add(ParentShellPageInstance!.FilesystemViewModel.FilesAndFolders.Where((li) => li.ItemNameRaw == item).First());
473+
List<ListedItem> listedItemsToSelect = new();
474+
listedItemsToSelect.AddRange(ParentShellPageInstance!.FilesystemViewModel.FilesAndFolders.Where((li) => navigationArguments.SelectItems.Contains(li.ItemNameRaw)));
489475

490-
ItemManipulationModel.SetSelectedItems(liItemsToSelect);
476+
ItemManipulationModel.SetSelectedItems(listedItemsToSelect);
491477
ItemManipulationModel.FocusSelectedItems();
492478
}
493479
else if (navigationArguments is not null && navigationArguments.FocusOnNavigation)
494480
{
481+
if (SelectedItems?.Count == 0)
482+
UpdatePreviewPaneSelection(null);
483+
495484
// Set focus on layout specific file list control
496485
ItemManipulationModel.FocusFileList();
497486
}
@@ -844,14 +833,16 @@ private async Task AddShellMenuItemsAsync(List<ContextMenuFlyoutItemViewModel> s
844833
}
845834

846835
// Add items to main shell submenu
847-
mainShellMenuItems.Where(x => x.LoadSubMenuAction is not null).ForEach(async x => {
836+
mainShellMenuItems.Where(x => x.LoadSubMenuAction is not null).ForEach(async x =>
837+
{
848838
await x.LoadSubMenuAction();
849839

850840
ShellContextmenuHelper.AddItemsToMainMenu(mainItems, x);
851841
});
852842

853843
// Add items to overflow shell submenu
854-
overflowShellMenuItems.Where(x => x.LoadSubMenuAction is not null).ForEach(async x => {
844+
overflowShellMenuItems.Where(x => x.LoadSubMenuAction is not null).ForEach(async x =>
845+
{
855846
await x.LoadSubMenuAction();
856847

857848
ShellContextmenuHelper.AddItemsToOverflowMenu(overflowItem, x);
@@ -1371,6 +1362,27 @@ await DispatcherQueue.EnqueueOrInvokeAsync(() =>
13711362
}
13721363
}
13731364

1365+
protected void UpdatePreviewPaneSelection(List<ListedItem>? value)
1366+
{
1367+
if (LockPreviewPaneContent)
1368+
return;
1369+
1370+
if (value?.FirstOrDefault() != PreviewPaneViewModel.SelectedItem)
1371+
{
1372+
// Update preview pane properties
1373+
PreviewPaneViewModel.IsItemSelected = value?.Count > 0;
1374+
PreviewPaneViewModel.SelectedItem = value?.Count == 1 ? value.First() : null;
1375+
1376+
// Check if the preview pane is open before updating the model
1377+
if (PreviewPaneViewModel.IsEnabled)
1378+
{
1379+
var isPaneEnabled = ((App.Window.Content as Frame)?.Content as MainPage)?.ShouldPreviewPaneBeActive ?? false;
1380+
if (isPaneEnabled)
1381+
_ = PreviewPaneViewModel.UpdateSelectedItemPreview();
1382+
}
1383+
}
1384+
}
1385+
13741386
public class ContextMenuExtensions : DependencyObject
13751387
{
13761388
public static ItemsControl GetItemsControl(DependencyObject obj)

src/Files.App/Views/LayoutModes/ColumnViewBase.xaml.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -500,7 +500,9 @@ protected override void BaseFolderSettings_LayoutModeChangeRequested(object? sen
500500

501501
internal void ClearSelectionIndicator()
502502
{
503+
LockPreviewPaneContent = true;
503504
FileList.SelectedItem = null;
505+
LockPreviewPaneContent = false;
504506
}
505507
}
506508
}

src/Files.App/Views/LayoutModes/ColumnViewBrowser.xaml.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,12 @@ public void MoveFocusToNextBlade(int currentBladeIndex)
324324

325325
var activeBladeColumnViewBase = RetrieveBladeColumnViewBase(activeBlade);
326326
if (activeBladeColumnViewBase is not null)
327+
{
327328
activeBladeColumnViewBase.FileList.SelectedIndex = 0;
329+
var selectedItem = activeBladeColumnViewBase.FileList.Items.First() as ListedItem;
330+
if (selectedItem is not null)
331+
UpdatePreviewPaneSelection(new List<ListedItem>() { selectedItem });
332+
}
328333
}
329334

330335
private ColumnViewBase? RetrieveBladeColumnViewBase(BladeItem blade)
@@ -457,7 +462,7 @@ private void CloseUnnecessaryColumns(ColumnParam column)
457462
if (relativeIndex is -1)
458463
{
459464
// Get the index of the blade with the same path as the requested
460-
var blade = ColumnHost.ActiveBlades.FirstOrDefault(b =>
465+
var blade = ColumnHost.ActiveBlades.FirstOrDefault(b =>
461466
column.NavPathParam.Equals(((b.Content as Frame)?.Content as ColumnShellPage)?.FilesystemViewModel?.WorkingDirectory));
462467

463468
if (blade is not null)

0 commit comments

Comments
 (0)