Skip to content

Commit c322d86

Browse files
Feature: Display drive information in Details Pane
1 parent 37f679b commit c322d86

File tree

5 files changed

+181
-11
lines changed

5 files changed

+181
-11
lines changed

src/Files.App/Data/Enums/PreviewPaneStates.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ public enum PreviewPaneStates
3131
/// <summary>
3232
/// Loading preview status.
3333
/// </summary>
34-
LoadingPreview
34+
LoadingPreview,
35+
36+
/// <summary>
37+
/// Drive preview and details available status.
38+
/// </summary>
39+
DrivePreviewAndDetailsAvailable,
3540
}
3641
}

src/Files.App/Data/Items/DriveItem.cs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
// Licensed under the MIT License. See the LICENSE.
33

44
using Files.App.Controls;
5-
using Files.App.Storage.Storables;
65
using Microsoft.UI.Xaml;
76
using Microsoft.UI.Xaml.Controls;
87
using Microsoft.UI.Xaml.Media.Imaging;
@@ -116,15 +115,27 @@ public bool ShowDriveDetails
116115
private DriveType type;
117116
public DriveType Type
118117
{
119-
get => type; set
118+
get => type;
119+
set
120120
{
121121
type = value;
122122

123123
if (value is DriveType.Network or DriveType.CloudDrive)
124124
ToolTip = Text;
125+
126+
OnPropertyChanged(nameof(TypeText));
125127
}
126128
}
127129

130+
public string TypeText => string.Format("DriveType{0}", Type).GetLocalizedResource();
131+
132+
private string filesystem = string.Empty;
133+
public string Filesystem
134+
{
135+
get => filesystem;
136+
set => SetProperty(ref filesystem, value);
137+
}
138+
128139
private string text;
129140
public string Text
130141
{
@@ -267,7 +278,7 @@ public async Task UpdatePropertiesAsync()
267278
{
268279
try
269280
{
270-
var properties = await Root.Properties.RetrievePropertiesAsync(["System.FreeSpace", "System.Capacity"])
281+
var properties = await Root.Properties.RetrievePropertiesAsync(["System.FreeSpace", "System.Capacity", "System.Volume.FileSystem"])
271282
.AsTask().WithTimeoutAsync(TimeSpan.FromSeconds(5));
272283

273284
if (properties is not null && properties["System.Capacity"] is not null && properties["System.FreeSpace"] is not null)
@@ -287,12 +298,18 @@ public async Task UpdatePropertiesAsync()
287298
MaxSpace = SpaceUsed = FreeSpace = ByteSize.FromBytes(0);
288299
}
289300

301+
if (properties is not null && properties["System.Volume.FileSystem"] is not null)
302+
Filesystem = (string)properties["System.Volume.FileSystem"];
303+
else
304+
Filesystem = string.Empty;
305+
290306
OnPropertyChanged(nameof(ShowDriveDetails));
291307
}
292308
catch (Exception)
293309
{
294310
SpaceText = "Unknown".GetLocalizedResource();
295311
MaxSpace = SpaceUsed = FreeSpace = ByteSize.FromBytes(0);
312+
Filesystem = string.Empty;
296313

297314
OnPropertyChanged(nameof(ShowDriveDetails));
298315
}

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

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,112 @@
238238
TextAlignment="Center"
239239
TextWrapping="Wrap"
240240
Visibility="Collapsed" />
241+
242+
<!-- Drive Details -->
243+
<StackPanel
244+
x:Name="DriveFormatAndType"
245+
Margin="12,12,12,24"
246+
HorizontalAlignment="Center"
247+
Orientation="Horizontal"
248+
Spacing="8"
249+
Visibility="Collapsed">
250+
<TextBlock
251+
x:Name="DriveFormatTextBox"
252+
HorizontalAlignment="Center"
253+
FontFamily="{ThemeResource ContentControlThemeFontFamily}"
254+
FontSize="14"
255+
IsTextSelectionEnabled="True"
256+
Text="{x:Bind ViewModel.SelectedDriveItem.Filesystem, Mode=OneWay}"
257+
TextAlignment="Center"
258+
TextWrapping="Wrap" />
259+
<TextBlock
260+
x:Name="DriveTypeTextBox"
261+
HorizontalAlignment="Center"
262+
FontFamily="{ThemeResource ContentControlThemeFontFamily}"
263+
FontSize="14"
264+
Foreground="{ThemeResource TextFillColorTertiaryBrush}"
265+
IsTextSelectionEnabled="True"
266+
Text="{x:Bind ViewModel.SelectedDriveItem.TypeText, Mode=OneWay}"
267+
TextAlignment="Center"
268+
TextWrapping="Wrap" />
269+
</StackPanel>
270+
271+
<TextBlock
272+
x:Name="UsedSpaceTextBox"
273+
HorizontalAlignment="Center"
274+
FontFamily="{ThemeResource ContentControlThemeFontFamily}"
275+
FontSize="20"
276+
FontWeight="Bold"
277+
Foreground="{ThemeResource SystemAccentColor}"
278+
IsTextSelectionEnabled="True"
279+
Text="{x:Bind ViewModel.SelectedDriveItem.UsedSpaceText, Mode=OneWay}"
280+
TextAlignment="Center"
281+
TextWrapping="Wrap"
282+
Visibility="Collapsed" />
283+
<ProgressBar
284+
x:Name="DriveSpaceProgressBar"
285+
Margin="12,12,12,8"
286+
HorizontalAlignment="Stretch"
287+
Visibility="Collapsed"
288+
Value="{x:Bind ViewModel.SelectedDriveItem.PercentageUsed, Mode=OneWay}" />
289+
<Grid
290+
x:Name="DriveSpaceGrid"
291+
Margin="12,0,12,24"
292+
Visibility="Collapsed">
293+
<Grid.RowDefinitions>
294+
<RowDefinition />
295+
<RowDefinition />
296+
</Grid.RowDefinitions>
297+
298+
<Grid.ColumnDefinitions>
299+
<ColumnDefinition Width="Auto" />
300+
<ColumnDefinition />
301+
<ColumnDefinition Width="Auto" />
302+
</Grid.ColumnDefinitions>
303+
304+
<TextBlock
305+
x:Name="AvailableSpaceTextBox"
306+
FontFamily="{ThemeResource ContentControlThemeFontFamily}"
307+
FontSize="14"
308+
FontWeight="Bold"
309+
IsTextSelectionEnabled="True"
310+
Text="{x:Bind ViewModel.SelectedDriveItem.FreeSpaceText, Mode=OneWay}"
311+
TextAlignment="Left"
312+
TextWrapping="Wrap" />
313+
<TextBlock
314+
x:Name="TotalDriveSpaceTextBox"
315+
Grid.Column="2"
316+
FontSize="14"
317+
IsTextSelectionEnabled="True"
318+
Style="{StaticResource Local.FileDetailsHeaderTextBlockStyle}"
319+
Text="{x:Bind ViewModel.SelectedDriveItem.MaxSpaceText, Mode=OneWay}"
320+
TextAlignment="Right"
321+
TextWrapping="Wrap" />
322+
<TextBlock
323+
x:Name="AvailableSpaceLabel"
324+
Grid.Row="1"
325+
HorizontalAlignment="Left"
326+
FontFamily="{ThemeResource ContentControlThemeFontFamily}"
327+
FontSize="14"
328+
FontWeight="Bold"
329+
IsTextSelectionEnabled="True"
330+
Text="Available"
331+
TextAlignment="Left"
332+
TextWrapping="Wrap" />
333+
<TextBlock
334+
x:Name="TotalDriveSpaceLabel"
335+
Grid.Row="1"
336+
Grid.Column="2"
337+
HorizontalAlignment="Right"
338+
FontFamily="{ThemeResource ContentControlThemeFontFamily}"
339+
FontSize="14"
340+
Foreground="{ThemeResource TextFillColorTertiaryBrush}"
341+
IsTextSelectionEnabled="True"
342+
Text="Total"
343+
TextAlignment="Right"
344+
TextWrapping="Wrap" />
345+
</Grid>
346+
241347
<ItemsControl
242348
x:Name="FileDetailsRepeater"
243349
Margin="12,12,12,0"
@@ -467,6 +573,23 @@
467573
<Setter Target="PreviewLoadingIndicator.Visibility" Value="Visible" />
468574
</VisualState.Setters>
469575
</VisualState>
576+
<VisualState x:Name="DrivePreviewAndDetailsAvailable">
577+
<VisualState.StateTriggers>
578+
<triggers:IsEqualStateTrigger Value="{x:Bind ViewModel.PreviewPaneState, Mode=OneWay}" To="5" />
579+
</VisualState.StateTriggers>
580+
<VisualState.Setters>
581+
<Setter Target="PreviewErrorText.Visibility" Value="Collapsed" />
582+
<Setter Target="FileDetailsRepeater.Visibility" Value="Collapsed" />
583+
<Setter Target="DetailsTagsList.Visibility" Value="Collapsed" />
584+
<Setter Target="DetailsOpenProperties.Visibility" Value="Visible" />
585+
<Setter Target="PreviewControlPresenter.Visibility" Value="Visible" />
586+
<Setter Target="DetailsListHeader.Visibility" Value="Visible" />
587+
<Setter Target="DriveFormatAndType.Visibility" Value="Visible" />
588+
<Setter Target="UsedSpaceTextBox.Visibility" Value="Visible" />
589+
<Setter Target="DriveSpaceProgressBar.Visibility" Value="Visible" />
590+
<Setter Target="DriveSpaceGrid.Visibility" Value="Visible" />
591+
</VisualState.Setters>
592+
</VisualState>
470593
</VisualStateGroup>
471594
<VisualStateGroup>
472595
<VisualState>

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

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ namespace Files.App.ViewModels.UserControls
1414
public sealed class InfoPaneViewModel : ObservableObject, IDisposable
1515
{
1616
private IInfoPaneSettingsService infoPaneSettingsService { get; } = Ioc.Default.GetRequiredService<IInfoPaneSettingsService>();
17-
private IGeneralSettingsService generalSettingsService { get; } = Ioc.Default.GetRequiredService<IGeneralSettingsService>();
1817
private IContentPageContext contentPageContext { get; } = Ioc.Default.GetRequiredService<IContentPageContext>();
18+
private DrivesViewModel drivesViewModel { get; } = Ioc.Default.GetRequiredService<DrivesViewModel>();
1919

2020
private CancellationTokenSource loadCancellationTokenSource;
2121

@@ -50,6 +50,7 @@ public ListedItem? SelectedItem
5050
if (SetProperty(ref selectedItem, value))
5151
{
5252
UpdateTagsItems();
53+
SetDriveItem();
5354
OnPropertyChanged(nameof(LoadTagsList));
5455

5556
if (value is not null)
@@ -58,6 +59,19 @@ public ListedItem? SelectedItem
5859
}
5960
}
6061

62+
/// <summary>
63+
/// Current selected drive if any.
64+
/// </summary>
65+
private DriveItem? selectedDriveItem;
66+
public DriveItem? SelectedDriveItem
67+
{
68+
get => selectedDriveItem;
69+
set
70+
{
71+
SetProperty(ref selectedDriveItem, value);
72+
}
73+
}
74+
6175
/// <summary>
6276
/// Enum indicating whether to show the details or preview tab
6377
/// </summary>
@@ -177,7 +191,7 @@ private async Task LoadPreviewControlAsync(CancellationToken token, bool downloa
177191
if (control is not null)
178192
{
179193
PreviewPaneContent = control;
180-
PreviewPaneState = PreviewPaneStates.PreviewAndDetailsAvailable;
194+
PreviewPaneState = SelectedItem.IsDriveRoot ? PreviewPaneStates.DrivePreviewAndDetailsAvailable : PreviewPaneStates.PreviewAndDetailsAvailable;
181195
return;
182196
}
183197

@@ -190,7 +204,7 @@ private async Task LoadPreviewControlAsync(CancellationToken token, bool downloa
190204
return;
191205

192206
PreviewPaneContent = control;
193-
PreviewPaneState = PreviewPaneStates.PreviewAndDetailsAvailable;
207+
PreviewPaneState = SelectedItem.IsDriveRoot ? PreviewPaneStates.DrivePreviewAndDetailsAvailable : PreviewPaneStates.PreviewAndDetailsAvailable;
194208
}
195209

196210
private async Task<UserControl> GetBuiltInPreviewControlAsync(ListedItem item, bool downloadItem)
@@ -449,7 +463,7 @@ private async Task LoadBasicPreviewAsync()
449463
await basicModel.LoadAsync();
450464

451465
PreviewPaneContent = new BasicPreview(basicModel);
452-
PreviewPaneState = PreviewPaneStates.PreviewAndDetailsAvailable;
466+
PreviewPaneState = SelectedItem.IsDriveRoot ? PreviewPaneStates.DrivePreviewAndDetailsAvailable : PreviewPaneStates.PreviewAndDetailsAvailable;
453467
}
454468
catch (Exception ex)
455469
{
@@ -474,6 +488,17 @@ private void UpdateTagsItems()
474488
Items.Add(new FlyoutItem(new Files.App.UserControls.Menus.FileTagsContextMenu(new List<ListedItem>() { SelectedItem })));
475489
}
476490

491+
private void SetDriveItem()
492+
{
493+
if (!(selectedItem?.IsDriveRoot ?? false))
494+
{
495+
selectedDriveItem = null;
496+
return;
497+
}
498+
499+
SelectedDriveItem = drivesViewModel.Drives.FirstOrDefault(drive => drive.Path == selectedItem.ItemPath) as DriveItem;
500+
}
501+
477502
public void Dispose()
478503
{
479504

src/Files.App/ViewModels/UserControls/Previews/FolderPreviewViewModel.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,11 @@
44
using Files.App.ViewModels.Properties;
55
using Microsoft.UI.Xaml.Media.Imaging;
66
using System.IO;
7-
using Windows.Storage.FileProperties;
87

98
namespace Files.App.ViewModels.Previews
109
{
1110
public sealed class FolderPreviewViewModel
1211
{
13-
private static readonly IDateTimeFormatter dateTimeFormatter = Ioc.Default.GetRequiredService<IDateTimeFormatter>();
14-
1512
public ListedItem Item { get; }
1613

1714
public BitmapImage Thumbnail { get; set; } = new();
@@ -39,6 +36,9 @@ private async Task LoadPreviewAndDetailsAsync()
3936
if (result is not null)
4037
Thumbnail = await result.ToBitmapAsync();
4138

39+
if (Item.IsDriveRoot)
40+
return;
41+
4242
var info = await Folder.GetBasicPropertiesAsync();
4343

4444
Item.FileDetails =

0 commit comments

Comments
 (0)