Browse Source

Make icons work; Define a ItemType to correctly define the navigation item type (file, folder, volume, etc).

pull/2777/head
Jumar Macato 7 years ago
parent
commit
02a6d1bcb3
No known key found for this signature in database GPG Key ID: B19884DAC3A5BF3F
  1. 6
      src/Avalonia.Dialogs/ManagedFileChooser.xaml
  2. 6
      src/Avalonia.Dialogs/ManagedFileChooser.xaml.cs
  3. 9
      src/Avalonia.Dialogs/ManagedFileChooserItemType.cs
  4. 28
      src/Avalonia.Dialogs/ManagedFileChooserItemViewModel.cs
  5. 1
      src/Avalonia.Dialogs/ManagedFileChooserNavigationItem.cs
  6. 6
      src/Avalonia.Dialogs/ManagedFileChooserSources.cs
  7. 37
      src/Avalonia.Dialogs/ManagedFileChooserViewModel.cs

6
src/Avalonia.Dialogs/ManagedFileChooser.xaml

@ -27,6 +27,12 @@
<GeometryDrawing Brush="#FF9B4E96" Geometry="F1M12,13L4,13 4,3 9,3 9,6 12,6z M9.641,2L3.964,2C3.964,2,3,2,3,3L3,13C3,14,3.964,14,3.964,14L11.965,14C12.965,14,13,13,13,13L13,5z" />
<GeometryDrawing Brush="#FFF0EFF1" Geometry="F1M4,3L9,3 9,6 12,6 12,13 4,13z" />
</DrawingGroup>
<DrawingGroup x:Key="Icon_Volume">
<GeometryDrawing Brush="#00FFFFFF" Geometry="F1M16,16L0,16 0,0 16,0z" />
<GeometryDrawing Brush="#FFF6F6F6" Geometry="F1M0,12L0,6.5C0,5.122,1.122,4,2.5,4L13.5,4C14.879,4,16,5.122,16,6.5L16,12z" />
<GeometryDrawing Brush="#FFEFEFF0" Geometry="F1M13,8L12,8 12,7 13,7z M11,8L10,8 10,7 11,7z M13.5,6L2.5,6C2.224,6,2,6.224,2,6.5L2,10 14,10 14,6.5C14,6.224,13.775,6,13.5,6" />
<GeometryDrawing Brush="#FF424242" Geometry="F1M13,7L12,7 12,8 13,8z M11,7L10,7 10,8 11,8z M2,10L14,10 14,6.5C14,6.224,13.775,6,13.5,6L2.5,6C2.224,6,2,6.224,2,6.5z M15,11L1,11 1,6.5C1,5.673,1.673,5,2.5,5L13.5,5C14.327,5,15,5.673,15,6.5z" />
</DrawingGroup>
</dialogs:ResourceSelectorConverter>
</UserControl.Resources>
<DockPanel>

6
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;

9
src/Avalonia.Dialogs/ManagedFileChooserItemType.cs

@ -0,0 +1,9 @@
namespace Avalonia.Dialogs
{
public enum ManagedFileChooserItemType
{
File,
Folder,
Volume
}
}

28
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;
}

1
src/Avalonia.Dialogs/ManagedFileChooserNavigationItem.cs

@ -4,5 +4,6 @@
{
public string DisplayName { get; set; }
public string Path { get; set; }
public ManagedFileChooserItemType ItemType { get; set; }
}
}

6
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

37
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<ManagedFileChooserSources>()
?? new ManagedFileChooserSources();
var quickSources = AvaloniaLocator.Current
.GetService<ManagedFileChooserSources>()
?? 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<IMountedDriveInfoProvider>()
.MountedDrives;
var drivesInfoSrv = AvaloniaLocator.Current
.GetService<IMountedDriveInfoProvider>()
.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)
{

Loading…
Cancel
Save