diff --git a/src/Avalonia.Dialogs/ManagedFileChooser.xaml b/src/Avalonia.Dialogs/ManagedFileChooser.xaml
index 19c9bb5455..af0c91e7bd 100644
--- a/src/Avalonia.Dialogs/ManagedFileChooser.xaml
+++ b/src/Avalonia.Dialogs/ManagedFileChooser.xaml
@@ -27,6 +27,12 @@
+
+
+
+
+
+
diff --git a/src/Avalonia.Dialogs/ManagedFileChooser.xaml.cs b/src/Avalonia.Dialogs/ManagedFileChooser.xaml.cs
index 1ee974b4d5..b967b40c0d 100644
--- a/src/Avalonia.Dialogs/ManagedFileChooser.xaml.cs
+++ b/src/Avalonia.Dialogs/ManagedFileChooser.xaml.cs
@@ -37,13 +37,13 @@ namespace Avalonia.Dialogs
var isQuickLink = _quickLinksRoot.IsLogicalParentOf(e.Source as Control);
if (e.ClickCount == 2 || isQuickLink)
{
- if (model.IsDirectory)
+ if (model.ItemType == ManagedFileChooserItemType.File)
{
- Model?.Navigate(model.Path);
+ Model?.SelectSingleFile(model);
}
else
{
- Model?.SelectSingleFile(model);
+ Model?.Navigate(model.Path);
}
e.Handled = true;
diff --git a/src/Avalonia.Dialogs/ManagedFileChooserItemType.cs b/src/Avalonia.Dialogs/ManagedFileChooserItemType.cs
new file mode 100644
index 0000000000..835e64a59a
--- /dev/null
+++ b/src/Avalonia.Dialogs/ManagedFileChooserItemType.cs
@@ -0,0 +1,9 @@
+namespace Avalonia.Dialogs
+{
+ public enum ManagedFileChooserItemType
+ {
+ File,
+ Folder,
+ Volume
+ }
+}
diff --git a/src/Avalonia.Dialogs/ManagedFileChooserItemViewModel.cs b/src/Avalonia.Dialogs/ManagedFileChooserItemViewModel.cs
index 573390067b..2801930028 100644
--- a/src/Avalonia.Dialogs/ManagedFileChooserItemViewModel.cs
+++ b/src/Avalonia.Dialogs/ManagedFileChooserItemViewModel.cs
@@ -6,10 +6,10 @@ namespace Avalonia.Dialogs
{
private string _displayName;
private string _path;
- private bool _isDirectory;
- private DateTime _modified;
+ private DateTime _modified;
private string _type;
private long _size;
+ private ManagedFileChooserItemType _itemType;
public string DisplayName
{
@@ -41,27 +41,35 @@ namespace Avalonia.Dialogs
set => this.RaiseAndSetIfChanged(ref _size, value);
}
- public string IconKey => IsDirectory ? "Icon_Folder" : "Icon_File";
+ public ManagedFileChooserItemType ItemType
+ {
+ get => _itemType;
+ set => this.RaiseAndSetIfChanged(ref _itemType, value);
+ }
- public bool IsDirectory
+ public string IconKey
{
- get => _isDirectory;
- set
+ get
{
- if (this.RaiseAndSetIfChanged(ref _isDirectory, value))
+ switch (ItemType)
{
- this.RaisePropertyChanged(nameof(IconKey));
+ case ManagedFileChooserItemType.Folder:
+ return "Icon_Folder";
+ case ManagedFileChooserItemType.Volume:
+ return "Icon_Volume";
+ default:
+ return "Icon_File";
}
}
}
-
+
public ManagedFileChooserItemViewModel()
{
}
public ManagedFileChooserItemViewModel(ManagedFileChooserNavigationItem item)
{
- IsDirectory = true;
+ ItemType = item.ItemType;
Path = item.Path;
DisplayName = item.DisplayName;
}
diff --git a/src/Avalonia.Dialogs/ManagedFileChooserNavigationItem.cs b/src/Avalonia.Dialogs/ManagedFileChooserNavigationItem.cs
index f85773c10f..8dac14bf8b 100644
--- a/src/Avalonia.Dialogs/ManagedFileChooserNavigationItem.cs
+++ b/src/Avalonia.Dialogs/ManagedFileChooserNavigationItem.cs
@@ -4,5 +4,6 @@
{
public string DisplayName { get; set; }
public string Path { get; set; }
+ public ManagedFileChooserItemType ItemType { get; set; }
}
}
diff --git a/src/Avalonia.Dialogs/ManagedFileChooserSources.cs b/src/Avalonia.Dialogs/ManagedFileChooserSources.cs
index 0e1c2b775a..7d2698463d 100644
--- a/src/Avalonia.Dialogs/ManagedFileChooserSources.cs
+++ b/src/Avalonia.Dialogs/ManagedFileChooserSources.cs
@@ -43,6 +43,7 @@ namespace Avalonia.Dialogs
.Where(Directory.Exists)
.Select(d => new ManagedFileChooserNavigationItem
{
+ ItemType = ManagedFileChooserItemType.Folder,
Path = d,
DisplayName = Path.GetFileName(d)
}).ToArray();
@@ -54,6 +55,7 @@ namespace Avalonia.Dialogs
{
return DriveInfo.GetDrives().Select(d => new ManagedFileChooserNavigationItem
{
+ ItemType = ManagedFileChooserItemType.Volume,
DisplayName = d.Name,
Path = d.RootDirectory.FullName
}).ToArray();
@@ -64,6 +66,7 @@ namespace Avalonia.Dialogs
return paths.Select(x => new ManagedFileChooserNavigationItem
{
+ ItemType = ManagedFileChooserItemType.Volume,
DisplayName = Path.GetFileName(x),
Path = x
}).ToArray();
@@ -82,6 +85,7 @@ namespace Avalonia.Dialogs
{
return new ManagedFileChooserNavigationItem
{
+ ItemType = ManagedFileChooserItemType.Volume,
DisplayName = "File System",
Path = "/"
};
@@ -92,7 +96,7 @@ namespace Avalonia.Dialogs
return new ManagedFileChooserNavigationItem
{
-
+ ItemType = ManagedFileChooserItemType.Volume,
DisplayName = dNameEmpty ? $"{ByteSizeHelper.ToString(x.DriveSizeBytes)} Volume"
: x.DriveLabel,
Path = x.MountPath
diff --git a/src/Avalonia.Dialogs/ManagedFileChooserViewModel.cs b/src/Avalonia.Dialogs/ManagedFileChooserViewModel.cs
index ff731f1ddc..93b9b14535 100644
--- a/src/Avalonia.Dialogs/ManagedFileChooserViewModel.cs
+++ b/src/Avalonia.Dialogs/ManagedFileChooserViewModel.cs
@@ -37,7 +37,6 @@ namespace Avalonia.Dialogs
private bool _savingFile;
private bool _scheduledSelectionValidation;
private string _defaultExtension;
- private CompositeDisposable _disposables;
public string Location
{
@@ -96,33 +95,28 @@ namespace Avalonia.Dialogs
}
}
- private void RefreshQuickLinks()
+ private void RefreshQuickLinks(object _ = null)
{
- var quickSources = AvaloniaLocator.Current.GetService()
- ?? new ManagedFileChooserSources();
+ var quickSources = AvaloniaLocator.Current
+ .GetService()
+ ?? new ManagedFileChooserSources();
QuickLinks.Clear();
-
QuickLinks.AddRange(quickSources.GetAllItems().Select(i => new ManagedFileChooserItemViewModel(i)));
}
public ManagedFileChooserViewModel(FileSystemDialog dialog)
{
- _disposables = new CompositeDisposable();
-
- var drivesInfoSrv = AvaloniaLocator.Current.GetService()
- .MountedDrives;
+ var drivesInfoSrv = AvaloniaLocator.Current
+ .GetService()
+ .MountedDrives;
var sub1 = Observable.FromEventPattern(drivesInfoSrv, nameof(drivesInfoSrv.CollectionChanged))
- .Subscribe((_) =>
- {
- Dispatcher.UIThread.InvokeAsync(RefreshQuickLinks);
- });
-
- _disposables.Add(sub1);
+ .ObserveOn(AvaloniaScheduler.Instance)
+ .Subscribe(RefreshQuickLinks);
- CancelRequested += delegate { _disposables.Dispose(); };
- CompleteRequested += delegate { _disposables.Dispose(); };
+ CompleteRequested += delegate { sub1?.Dispose(); };
+ CancelRequested += delegate { sub1?.Dispose(); };
RefreshQuickLinks();
@@ -200,7 +194,7 @@ namespace Avalonia.Dialogs
}
else
{
- var invalidItems = SelectedItems.Where(i => i.IsDirectory).ToList();
+ var invalidItems = SelectedItems.Where(i => i.ItemType == ManagedFileChooserItemType.Folder).ToList();
foreach (var item in invalidItems)
{
SelectedItems.Remove(item);
@@ -283,17 +277,18 @@ namespace Avalonia.Dialogs
{
DisplayName = info.Name,
Path = info.FullName,
- IsDirectory = info is DirectoryInfo,
Type = info is FileInfo ? info.Extension : "File Folder",
+ ItemType = info is FileInfo ? ManagedFileChooserItemType.File
+ : ManagedFileChooserItemType.Folder,
Size = info is FileInfo f ? f.Length : 0,
Modified = info.LastWriteTime
})
- .OrderByDescending(x => x.IsDirectory)
+ .OrderByDescending(x => x.ItemType == ManagedFileChooserItemType.Folder)
.ThenBy(x => x.DisplayName, StringComparer.InvariantCultureIgnoreCase));
if (initialSelectionName != null)
{
- var sel = Items.FirstOrDefault(i => !i.IsDirectory && i.DisplayName == initialSelectionName);
+ var sel = Items.FirstOrDefault(i => i.ItemType == ManagedFileChooserItemType.File && i.DisplayName == initialSelectionName);
if (sel != null)
{