From 02a6d1bcb3f5096517a6ddfd7f3c62935d78d123 Mon Sep 17 00:00:00 2001 From: Jumar Macato Date: Wed, 7 Aug 2019 20:44:58 +0800 Subject: [PATCH] Make icons work; Define a ItemType to correctly define the navigation item type (file, folder, volume, etc). --- src/Avalonia.Dialogs/ManagedFileChooser.xaml | 6 +++ .../ManagedFileChooser.xaml.cs | 6 +-- .../ManagedFileChooserItemType.cs | 9 +++++ .../ManagedFileChooserItemViewModel.cs | 28 +++++++++----- .../ManagedFileChooserNavigationItem.cs | 1 + .../ManagedFileChooserSources.cs | 6 ++- .../ManagedFileChooserViewModel.cs | 37 ++++++++----------- 7 files changed, 58 insertions(+), 35 deletions(-) create mode 100644 src/Avalonia.Dialogs/ManagedFileChooserItemType.cs 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) {