Libation/Source/LibationWinForms/AvaloniaUI/Controls/DirectorySelectControl.axaml.cs
2022-07-18 10:07:13 -06:00

147 lines
4.6 KiB
C#

using Avalonia;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
using Dinah.Core;
using LibationFileManager;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using ReactiveUI;
using Avalonia.Controls.Primitives;
using System.Collections;
using Avalonia.Data.Converters;
using System;
using System.Globalization;
using Avalonia.Data;
namespace LibationWinForms.AvaloniaUI.Controls
{
public class TextCaseConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is Configuration.KnownDirectories dir)
{
}
return new BindingNotification(new InvalidCastException(), BindingErrorType.Error);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
public partial class DirectorySelectControl : TemplatedControl
{
private static readonly List<Configuration.KnownDirectories> defaultList = new List<Configuration.KnownDirectories>()
{
Configuration.KnownDirectories.WinTemp,
Configuration.KnownDirectories.UserProfile,
Configuration.KnownDirectories.AppDir,
Configuration.KnownDirectories.MyDocs,
Configuration.KnownDirectories.LibationFiles
};
public static readonly StyledProperty<Configuration.KnownDirectories?> SelectedirectoryProperty =
AvaloniaProperty.Register<DirectorySelectControl, Configuration.KnownDirectories?>(nameof(Selectedirectory), defaultList[0]);
public static readonly StyledProperty<List<Configuration.KnownDirectories>> KnownDirectoriesProperty =
AvaloniaProperty.Register<DirectorySelectControl, List<Configuration.KnownDirectories>>(nameof(KnownDirectories), defaultList);
public static readonly StyledProperty<string?> SubdirectoryProperty =
AvaloniaProperty.Register<DirectorySelectControl, string?>(nameof(Subdirectory), "subdir");
DirectorySelectViewModel DirectorySelect { get; } = new();
public DirectorySelectControl()
{
InitializeComponent();
}
protected override void OnInitialized()
{
DirectorySelect.Directories.Clear();
int insertIndex = 0;
foreach (var kd in KnownDirectories.Distinct())
DirectorySelect.Directories.Insert(insertIndex++, new(this, kd));
DataContext = DirectorySelect;
base.OnInitialized();
}
public List<Configuration.KnownDirectories> KnownDirectories
{
get { return GetValue(KnownDirectoriesProperty); }
set
{
SetValue(KnownDirectoriesProperty, value);
//SetDirectoryItems(KnownDirectories);
}
}
public Configuration.KnownDirectories? Selectedirectory
{
get { return GetValue(SelectedirectoryProperty); }
set
{
SetValue(SelectedirectoryProperty, value);
if (value is null or Configuration.KnownDirectories.None)
return;
// set default
var item = DirectorySelect.Directories.SingleOrDefault(item => item.Value == value.Value);
if (item is null)
return;
DirectorySelect.SelectedDirectory = item;
}
}
public string? Subdirectory
{
get { return GetValue(SubdirectoryProperty); }
set
{
SetValue(SubdirectoryProperty, value);
}
}
private void InitializeComponent()
{
AvaloniaXamlLoader.Load(this);
}
}
public class DirectorySelectViewModel : ViewModels.ViewModelBase
{
public class DirectoryComboBoxItem
{
private readonly DirectorySelectControl _parentControl;
public string Description { get; }
public Configuration.KnownDirectories Value { get; }
public string FullPath => AddSubDirectoryToPath(Configuration.GetKnownDirectoryPath(Value));
/// <summary>Displaying relative paths is confusing. UI should display absolute equivalent</summary>
public string UiDisplayPath => Value == Configuration.KnownDirectories.AppDir ? AddSubDirectoryToPath(Configuration.AppDir_Absolute) : FullPath;
public DirectoryComboBoxItem(DirectorySelectControl parentControl, Configuration.KnownDirectories knownDirectory)
{
_parentControl = parentControl;
Value = knownDirectory;
Description = Value.GetDescription();
}
internal string AddSubDirectoryToPath(string path) => string.IsNullOrWhiteSpace(_parentControl.Subdirectory) ? path : System.IO.Path.Combine(path, _parentControl.Subdirectory);
public override string ToString() => Description;
}
public ObservableCollection<DirectoryComboBoxItem> Directories { get; } = new(new());
private DirectoryComboBoxItem _selectedDirectory;
public DirectoryComboBoxItem SelectedDirectory { get => _selectedDirectory; set => this.RaiseAndSetIfChanged(ref _selectedDirectory, value); }
}
}