IconProvider, container exceptions, refactor

This commit is contained in:
2022-02-02 11:02:37 +01:00
parent c4bf417ba3
commit 3e553dd448
31 changed files with 597 additions and 132 deletions

View File

@@ -23,6 +23,9 @@ using Microsoft.Extensions.DependencyInjection;
using FileTime.Core.Command;
using FileTime.Core.Timeline;
using FileTime.Core.Providers;
using Syroot.Windows.IO;
using FileTime.Avalonia.IconProviders;
using Avalonia.Threading;
namespace FileTime.Avalonia.ViewModels
{
@@ -42,6 +45,8 @@ namespace FileTime.Avalonia.ViewModels
private IClipboard _clipboard;
private TimeRunner _timeRunner;
private IEnumerable<IContentProvider> _contentProviders;
private IIconProvider _iconProvider;
private Func<Task>? _inputHandler;
[Property]
@@ -59,9 +64,15 @@ namespace FileTime.Avalonia.ViewModels
[Property]
private List<RootDriveInfo> _rootDriveInfos;
[Property]
private List<PlaceInfo> _places;
[Property]
private string _messageBoxText;
[Property]
private ObservableCollection<string> _popupTexts = new ObservableCollection<string>();
public IReadOnlyList<ReadOnlyParallelCommands> TimelineCommands => _timeRunner.ParallelCommands;
async partial void OnInitialize()
@@ -69,8 +80,9 @@ namespace FileTime.Avalonia.ViewModels
_clipboard = App.ServiceProvider.GetService<IClipboard>()!;
_timeRunner = App.ServiceProvider.GetService<TimeRunner>()!;
_contentProviders = App.ServiceProvider.GetService<IEnumerable<IContentProvider>>()!;
_iconProvider = App.ServiceProvider.GetService<IIconProvider>()!;
var inputInterface = (BasicInputHandler)App.ServiceProvider.GetService<IInputInterface>()!;
inputInterface.InputHandler = ReadInputs2;
inputInterface.InputHandler = ReadInputs;
App.ServiceProvider.GetService<TopContainer>();
_timeRunner.CommandsChanged += (o, e) => OnPropertyChanged(nameof(TimelineCommands));
@@ -103,8 +115,68 @@ namespace FileTime.Avalonia.ViewModels
driveInfos.Add(driveInfo);
}
}
RootDriveInfos = driveInfos.OrderBy(d => d.Name).ToList();
var places = new List<PlaceInfo>();
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
var placesFolders = new List<KnownFolder>()
{
KnownFolders.Profile,
KnownFolders.Desktop,
KnownFolders.DocumentsLocalized,
KnownFolders.DownloadsLocalized,
KnownFolders.Music,
KnownFolders.Pictures,
KnownFolders.Videos,
};
foreach (var placesFolder in placesFolders)
{
var possibleContainer = await LocalContentProvider.GetByPath(placesFolder.Path);
if (possibleContainer is IContainer container)
{
var name = container.Name;
if (await container.GetByPath("desktop.ini") is LocalFile element)
{
var lines = File.ReadAllLines(element.File.FullName);
if (Array.Find(lines, l => l.StartsWith("localizedresourcename", StringComparison.OrdinalIgnoreCase)) is string nameLine)
{
var nameLineValue = string.Join('=', nameLine.Split('=')[1..]);
var environemntVariables = Environment.GetEnvironmentVariables();
foreach (var keyo in environemntVariables.Keys)
{
if (keyo is string key && environemntVariables[key] is string value)
{
nameLineValue = nameLineValue.Replace($"%{key}%", value);
}
}
if (nameLineValue.StartsWith("@"))
{
var parts = nameLineValue[1..].Split(',');
if (parts.Length >= 2 && long.TryParse(parts[^1], out var parsedResourceId))
{
if (parsedResourceId < 0) parsedResourceId *= -1;
name = NativeMethodHelpers.GetStringResource(string.Join(',', parts[..^1]), (uint)parsedResourceId);
}
}
else
{
name = nameLineValue;
}
}
}
places.Add(new PlaceInfo(name, container));
}
}
}
else
{
throw new Exception("TODO linux places");
}
Places = places;
}
private async Task<IContainer?> GetContainerForWindowsDrive(DriveInfo drive)
@@ -123,6 +195,12 @@ namespace FileTime.Avalonia.ViewModels
await AppState.SelectedTab.Open();
}
public async Task OpenContainer(IContainer container)
{
AppState.RapidTravelText = "";
await AppState.SelectedTab.OpenContainer(container);
}
public async Task OpenOrRun()
{
if (AppState.SelectedTab.SelectedItem is ContainerViewModel)
@@ -530,6 +608,20 @@ namespace FileTime.Avalonia.ViewModels
return Task.CompletedTask;
}
private Task ToggleAdvancedIcons()
{
_iconProvider.EnableAdvancedIcons = !_iconProvider.EnableAdvancedIcons;
var text = "Advanced icons are: " + (_iconProvider.EnableAdvancedIcons ? "ON" : "OFF");
_popupTexts.Add(text);
Task.Run(async () =>
{
await Task.Delay(5000);
await Dispatcher.UIThread.InvokeAsync(() => _popupTexts.Remove(text));
});
return Task.CompletedTask;
}
[Command]
public async void ProcessInputs()
{
@@ -714,7 +806,7 @@ namespace FileTime.Avalonia.ViewModels
_inputHandler = inputHandler;
}
public async Task<string?[]> ReadInputs2(IEnumerable<Core.Interactions.InputElement> fields)
public async Task<string?[]> ReadInputs(IEnumerable<Core.Interactions.InputElement> fields)
{
var waiting = true;
var result = new string[0];
@@ -912,9 +1004,14 @@ namespace FileTime.Avalonia.ViewModels
RefreshCurrentLocation),
new CommandBinding(
"go to",
FileTime.App.Core.Command.Commands.Refresh,
FileTime.App.Core.Command.Commands.Dummy,
new KeyWithModifiers[]{new KeyWithModifiers(Key.L, ctrl: true)},
GoToContainer),
new CommandBinding(
"toggle advanced icons",
FileTime.App.Core.Command.Commands.Dummy,
new KeyWithModifiers[]{new KeyWithModifiers(Key.Z),new KeyWithModifiers(Key.I)},
ToggleAdvancedIcons),
};
var universalCommandBindings = new List<CommandBinding>()
{