From cef8e5de18e38e0d550b58b791afc3e8f5876b81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81d=C3=A1m=20Kov=C3=A1cs?= Date: Wed, 23 Feb 2022 22:47:43 +0100 Subject: [PATCH] History --- .../Models/IHaveContainer.cs | 9 + src/Core/FileTime.Core/Components/Tab.cs | 35 +- src/Core/FileTime.Core/Models/AbsolutePath.cs | 2 + .../Providers/ContentProviderBase.cs | 3 +- src/Core/InitableService/Initable.cs | 148 ++ .../InitableService/InitableExtensions.cs | 1193 +++++++++++++++++ .../InitableService/InitableService.csproj | 13 + .../InitableService/generateExtensions.csx | 180 +++ .../InitableService/generateInterfaces.csx | 66 + src/FileTime.sln | 23 + src/GuiApp/FileTime.Avalonia/App.axaml | 12 +- .../Application/TabContainer.cs | 38 +- .../FileTime.Avalonia.csproj | 1 + .../FileTime.Avalonia/Models/PlaceInfo.cs | 3 +- .../FileTime.Avalonia/Models/RootDriveInfo.cs | 5 +- src/GuiApp/FileTime.Avalonia/Startup.cs | 2 +- .../ViewModels/ContainerViewModel.cs | 21 +- .../ViewModels/HistoryItemViewModel.cs | 19 + .../FileTime.Avalonia/Views/MainWindow.axaml | 39 +- .../Views/MainWindow.axaml.cs | 19 +- 20 files changed, 1790 insertions(+), 41 deletions(-) create mode 100644 src/AppCommon/FileTime.App.Core/Models/IHaveContainer.cs create mode 100644 src/Core/InitableService/Initable.cs create mode 100644 src/Core/InitableService/InitableExtensions.cs create mode 100644 src/Core/InitableService/InitableService.csproj create mode 100644 src/Core/InitableService/generateExtensions.csx create mode 100644 src/Core/InitableService/generateInterfaces.csx create mode 100644 src/GuiApp/FileTime.Avalonia/ViewModels/HistoryItemViewModel.cs diff --git a/src/AppCommon/FileTime.App.Core/Models/IHaveContainer.cs b/src/AppCommon/FileTime.App.Core/Models/IHaveContainer.cs new file mode 100644 index 0000000..b658577 --- /dev/null +++ b/src/AppCommon/FileTime.App.Core/Models/IHaveContainer.cs @@ -0,0 +1,9 @@ +using FileTime.Core.Models; + +namespace FileTime.App.Core.Models +{ + public interface IHaveContainer + { + IContainer Container { get; } + } +} \ No newline at end of file diff --git a/src/Core/FileTime.Core/Components/Tab.cs b/src/Core/FileTime.Core/Components/Tab.cs index 3ae136b..6cdaffc 100644 --- a/src/Core/FileTime.Core/Components/Tab.cs +++ b/src/Core/FileTime.Core/Components/Tab.cs @@ -8,12 +8,13 @@ namespace FileTime.Core.Components public class Tab { private IItem? _currentSelectedItem; -#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. private IContainer _currentLocation; -#pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. + + private readonly List _history = new(); + private string? _lastPath; - private bool _currentlySelecting = false; + private bool _currentlySelecting; private readonly object _guardSetCurrentSelectedItemCTS = new(); private CancellationTokenSource? _setCurrentSelectedItemCTS; @@ -22,9 +23,18 @@ namespace FileTime.Core.Components public bool AutoRefresh { get; set; } + public IReadOnlyList History { get; } + public AsyncEventHandler CurrentLocationChanged = new(); + public AsyncEventHandler HistoryChanged { get; } = new(); public AsyncEventHandler CurrentSelectedItemChanged = new(); + public Tab() + { + _currentLocation = null!; + History = _history.AsReadOnly(); + } + public async Task Init(IContainer currentPath) { await SetCurrentLocation(currentPath); @@ -42,13 +52,14 @@ namespace FileTime.Core.Components if (_currentLocation != null) { _currentLocation.Refreshed.Remove(HandleCurrentLocationRefresh); - if(_currentLocation is SearchContainer searchContainer) + if (_currentLocation is SearchContainer searchContainer) { searchContainer.SearchTaskBase.Cancel(); } } _currentLocation = value; + await AddHistoryItem(_currentLocation); await CurrentLocationChanged.InvokeAsync(this, AsyncEventArgs.Empty); var currentLocationItems = await (await GetCurrentLocation()).GetItems(); @@ -58,6 +69,22 @@ namespace FileTime.Core.Components } } + private async Task AddHistoryItem(IContainer container) + { + var containerPath = new AbsolutePath(container); + if (_history.Count == 0 || _history.Last() != containerPath) + { + _history.Add(containerPath); + } + + while (_history.Count > 50) + { + _history.RemoveAt(0); + } + + await HistoryChanged.InvokeAsync(this, AsyncEventArgs.Empty); + } + public Task GetCurrentSelectedItem() { return Task.FromResult(_currentSelectedItem); diff --git a/src/Core/FileTime.Core/Models/AbsolutePath.cs b/src/Core/FileTime.Core/Models/AbsolutePath.cs index 523ed3f..c2d8443 100644 --- a/src/Core/FileTime.Core/Models/AbsolutePath.cs +++ b/src/Core/FileTime.Core/Models/AbsolutePath.cs @@ -82,6 +82,8 @@ namespace FileTime.Core.Models ? await VirtualContentProvider.GetByPath(Path) : null; + if (ContentProvider == null) return null; + result ??= await ContentProvider.GetByPath(Path); return result; diff --git a/src/Core/FileTime.Core/Providers/ContentProviderBase.cs b/src/Core/FileTime.Core/Providers/ContentProviderBase.cs index f4ec515..439bce5 100644 --- a/src/Core/FileTime.Core/Providers/ContentProviderBase.cs +++ b/src/Core/FileTime.Core/Providers/ContentProviderBase.cs @@ -97,6 +97,7 @@ namespace FileTime.Core.Providers { lock (_initializationGuard) { + if (_initialized) return; if (!_initializing) { _initializing = true; @@ -109,8 +110,8 @@ namespace FileTime.Core.Providers try { if (_initialized) return; - _initialized = true; await Init(); + _initialized = true; IsLoaded = true; } finally diff --git a/src/Core/InitableService/Initable.cs b/src/Core/InitableService/Initable.cs new file mode 100644 index 0000000..81147d7 --- /dev/null +++ b/src/Core/InitableService/Initable.cs @@ -0,0 +1,148 @@ +// Autogenerated +namespace InitableService; + +public interface IInitable +{ + void Init(); +} +public interface IInitable +{ + void Init(T1 obj1); +} +public interface IInitable +{ + void Init(T1 obj1, T2 obj2); +} +public interface IInitable +{ + void Init(T1 obj1, T2 obj2, T3 obj3); +} +public interface IInitable +{ + void Init(T1 obj1, T2 obj2, T3 obj3, T4 obj4); +} +public interface IInitable +{ + void Init(T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5); +} +public interface IInitable +{ + void Init(T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6); +} +public interface IInitable +{ + void Init(T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7); +} +public interface IInitable +{ + void Init(T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8); +} +public interface IInitable +{ + void Init(T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9); +} +public interface IInitable +{ + void Init(T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10); +} +public interface IInitable +{ + void Init(T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10, T11 obj11); +} +public interface IInitable +{ + void Init(T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10, T11 obj11, T12 obj12); +} +public interface IInitable +{ + void Init(T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10, T11 obj11, T12 obj12, T13 obj13); +} +public interface IInitable +{ + void Init(T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10, T11 obj11, T12 obj12, T13 obj13, T14 obj14); +} +public interface IInitable +{ + void Init(T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10, T11 obj11, T12 obj12, T13 obj13, T14 obj14, T15 obj15); +} +public interface IAsyncInitable +{ + Task InitAsync(); +} + +public interface IAsyncInitable +{ + Task InitAsync(T1 obj1); +} + +public interface IAsyncInitable +{ + Task InitAsync(T1 obj1, T2 obj2); +} + +public interface IAsyncInitable +{ + Task InitAsync(T1 obj1, T2 obj2, T3 obj3); +} + +public interface IAsyncInitable +{ + Task InitAsync(T1 obj1, T2 obj2, T3 obj3, T4 obj4); +} + +public interface IAsyncInitable +{ + Task InitAsync(T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5); +} + +public interface IAsyncInitable +{ + Task InitAsync(T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6); +} + +public interface IAsyncInitable +{ + Task InitAsync(T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7); +} + +public interface IAsyncInitable +{ + Task InitAsync(T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8); +} + +public interface IAsyncInitable +{ + Task InitAsync(T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9); +} + +public interface IAsyncInitable +{ + Task InitAsync(T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10); +} + +public interface IAsyncInitable +{ + Task InitAsync(T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10, T11 obj11); +} + +public interface IAsyncInitable +{ + Task InitAsync(T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10, T11 obj11, T12 obj12); +} + +public interface IAsyncInitable +{ + Task InitAsync(T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10, T11 obj11, T12 obj12, T13 obj13); +} + +public interface IAsyncInitable +{ + Task InitAsync(T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10, T11 obj11, T12 obj12, T13 obj13, T14 obj14); +} + +public interface IAsyncInitable +{ + Task InitAsync(T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10, T11 obj11, T12 obj12, T13 obj13, T14 obj14, T15 obj15); +} + + diff --git a/src/Core/InitableService/InitableExtensions.cs b/src/Core/InitableService/InitableExtensions.cs new file mode 100644 index 0000000..eb34d33 --- /dev/null +++ b/src/Core/InitableService/InitableExtensions.cs @@ -0,0 +1,1193 @@ +// Autogenerated +using InitableService; + +namespace Microsoft.Extensions.DependencyInjection; + +public static class InitableExtensions +{ + + public static Resolver GetInitableResolver(this IServiceProvider serviceProvider) + { + return new Resolver(serviceProvider); + } + + public static Resolver GetInitableResolver(this IServiceProvider serviceProvider, T1 obj1) + { + return new Resolver(serviceProvider, obj1); + } + + public static Resolver GetInitableResolver(this IServiceProvider serviceProvider, T1 obj1, T2 obj2) + { + return new Resolver(serviceProvider, obj1, obj2); + } + + public static Resolver GetInitableResolver(this IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3) + { + return new Resolver(serviceProvider, obj1, obj2, obj3); + } + + public static Resolver GetInitableResolver(this IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4) + { + return new Resolver(serviceProvider, obj1, obj2, obj3, obj4); + } + + public static Resolver GetInitableResolver(this IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5) + { + return new Resolver(serviceProvider, obj1, obj2, obj3, obj4, obj5); + } + + public static Resolver GetInitableResolver(this IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6) + { + return new Resolver(serviceProvider, obj1, obj2, obj3, obj4, obj5, obj6); + } + + public static Resolver GetInitableResolver(this IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7) + { + return new Resolver(serviceProvider, obj1, obj2, obj3, obj4, obj5, obj6, obj7); + } + + public static Resolver GetInitableResolver(this IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8) + { + return new Resolver(serviceProvider, obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8); + } + + public static Resolver GetInitableResolver(this IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9) + { + return new Resolver(serviceProvider, obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8, obj9); + } + + public static Resolver GetInitableResolver(this IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10) + { + return new Resolver(serviceProvider, obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8, obj9, obj10); + } + + public static Resolver GetInitableResolver(this IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10, T11 obj11) + { + return new Resolver(serviceProvider, obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8, obj9, obj10, obj11); + } + + public static Resolver GetInitableResolver(this IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10, T11 obj11, T12 obj12) + { + return new Resolver(serviceProvider, obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8, obj9, obj10, obj11, obj12); + } + + public static Resolver GetInitableResolver(this IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10, T11 obj11, T12 obj12, T13 obj13) + { + return new Resolver(serviceProvider, obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8, obj9, obj10, obj11, obj12, obj13); + } + + public static Resolver GetInitableResolver(this IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10, T11 obj11, T12 obj12, T13 obj13, T14 obj14) + { + return new Resolver(serviceProvider, obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8, obj9, obj10, obj11, obj12, obj13, obj14); + } + + public static Resolver GetInitableResolver(this IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10, T11 obj11, T12 obj12, T13 obj13, T14 obj14, T15 obj15) + { + return new Resolver(serviceProvider, obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8, obj9, obj10, obj11, obj12, obj13, obj14, obj15); + } + + public static AsyncResolver GetAsyncInitableResolver(this IServiceProvider serviceProvider) + { + return new AsyncResolver(serviceProvider); + } + + public static AsyncResolver GetAsyncInitableResolver(this IServiceProvider serviceProvider, T1 obj1) + { + return new AsyncResolver(serviceProvider, obj1); + } + + public static AsyncResolver GetAsyncInitableResolver(this IServiceProvider serviceProvider, T1 obj1, T2 obj2) + { + return new AsyncResolver(serviceProvider, obj1, obj2); + } + + public static AsyncResolver GetAsyncInitableResolver(this IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3) + { + return new AsyncResolver(serviceProvider, obj1, obj2, obj3); + } + + public static AsyncResolver GetAsyncInitableResolver(this IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4) + { + return new AsyncResolver(serviceProvider, obj1, obj2, obj3, obj4); + } + + public static AsyncResolver GetAsyncInitableResolver(this IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5) + { + return new AsyncResolver(serviceProvider, obj1, obj2, obj3, obj4, obj5); + } + + public static AsyncResolver GetAsyncInitableResolver(this IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6) + { + return new AsyncResolver(serviceProvider, obj1, obj2, obj3, obj4, obj5, obj6); + } + + public static AsyncResolver GetAsyncInitableResolver(this IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7) + { + return new AsyncResolver(serviceProvider, obj1, obj2, obj3, obj4, obj5, obj6, obj7); + } + + public static AsyncResolver GetAsyncInitableResolver(this IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8) + { + return new AsyncResolver(serviceProvider, obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8); + } + + public static AsyncResolver GetAsyncInitableResolver(this IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9) + { + return new AsyncResolver(serviceProvider, obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8, obj9); + } + + public static AsyncResolver GetAsyncInitableResolver(this IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10) + { + return new AsyncResolver(serviceProvider, obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8, obj9, obj10); + } + + public static AsyncResolver GetAsyncInitableResolver(this IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10, T11 obj11) + { + return new AsyncResolver(serviceProvider, obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8, obj9, obj10, obj11); + } + + public static AsyncResolver GetAsyncInitableResolver(this IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10, T11 obj11, T12 obj12) + { + return new AsyncResolver(serviceProvider, obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8, obj9, obj10, obj11, obj12); + } + + public static AsyncResolver GetAsyncInitableResolver(this IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10, T11 obj11, T12 obj12, T13 obj13) + { + return new AsyncResolver(serviceProvider, obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8, obj9, obj10, obj11, obj12, obj13); + } + + public static AsyncResolver GetAsyncInitableResolver(this IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10, T11 obj11, T12 obj12, T13 obj13, T14 obj14) + { + return new AsyncResolver(serviceProvider, obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8, obj9, obj10, obj11, obj12, obj13, obj14); + } + + public static AsyncResolver GetAsyncInitableResolver(this IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10, T11 obj11, T12 obj12, T13 obj13, T14 obj14, T15 obj15) + { + return new AsyncResolver(serviceProvider, obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8, obj9, obj10, obj11, obj12, obj13, obj14, obj15); + } + +} +public class Resolver +{ + IServiceProvider _serviceProvider; + public Resolver(IServiceProvider serviceProvider) + { + _serviceProvider = serviceProvider; + } + + public TResult GetService() + where TResult : class, IInitable + { + var initableService = _serviceProvider.GetService()!; + initableService.Init(); + return initableService; + } +} + +public class Resolver +{ + IServiceProvider _serviceProvider; + private T1 _obj1; + public Resolver(IServiceProvider serviceProvider, T1 obj1) + { + _serviceProvider = serviceProvider; + _obj1 = obj1; + } + + public TResult GetService() + where TResult : class, IInitable + { + var initableService = _serviceProvider.GetService()!; + initableService.Init(_obj1); + return initableService; + } +} + +public class Resolver +{ + IServiceProvider _serviceProvider; + private T1 _obj1; + private T2 _obj2; + public Resolver(IServiceProvider serviceProvider, T1 obj1, T2 obj2) + { + _serviceProvider = serviceProvider; + _obj1 = obj1; + _obj2 = obj2; + } + + public TResult GetService() + where TResult : class, IInitable + { + var initableService = _serviceProvider.GetService()!; + initableService.Init(_obj1, _obj2); + return initableService; + } +} + +public class Resolver +{ + IServiceProvider _serviceProvider; + private T1 _obj1; + private T2 _obj2; + private T3 _obj3; + public Resolver(IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3) + { + _serviceProvider = serviceProvider; + _obj1 = obj1; + _obj2 = obj2; + _obj3 = obj3; + } + + public TResult GetService() + where TResult : class, IInitable + { + var initableService = _serviceProvider.GetService()!; + initableService.Init(_obj1, _obj2, _obj3); + return initableService; + } +} + +public class Resolver +{ + IServiceProvider _serviceProvider; + private T1 _obj1; + private T2 _obj2; + private T3 _obj3; + private T4 _obj4; + public Resolver(IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4) + { + _serviceProvider = serviceProvider; + _obj1 = obj1; + _obj2 = obj2; + _obj3 = obj3; + _obj4 = obj4; + } + + public TResult GetService() + where TResult : class, IInitable + { + var initableService = _serviceProvider.GetService()!; + initableService.Init(_obj1, _obj2, _obj3, _obj4); + return initableService; + } +} + +public class Resolver +{ + IServiceProvider _serviceProvider; + private T1 _obj1; + private T2 _obj2; + private T3 _obj3; + private T4 _obj4; + private T5 _obj5; + public Resolver(IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5) + { + _serviceProvider = serviceProvider; + _obj1 = obj1; + _obj2 = obj2; + _obj3 = obj3; + _obj4 = obj4; + _obj5 = obj5; + } + + public TResult GetService() + where TResult : class, IInitable + { + var initableService = _serviceProvider.GetService()!; + initableService.Init(_obj1, _obj2, _obj3, _obj4, _obj5); + return initableService; + } +} + +public class Resolver +{ + IServiceProvider _serviceProvider; + private T1 _obj1; + private T2 _obj2; + private T3 _obj3; + private T4 _obj4; + private T5 _obj5; + private T6 _obj6; + public Resolver(IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6) + { + _serviceProvider = serviceProvider; + _obj1 = obj1; + _obj2 = obj2; + _obj3 = obj3; + _obj4 = obj4; + _obj5 = obj5; + _obj6 = obj6; + } + + public TResult GetService() + where TResult : class, IInitable + { + var initableService = _serviceProvider.GetService()!; + initableService.Init(_obj1, _obj2, _obj3, _obj4, _obj5, _obj6); + return initableService; + } +} + +public class Resolver +{ + IServiceProvider _serviceProvider; + private T1 _obj1; + private T2 _obj2; + private T3 _obj3; + private T4 _obj4; + private T5 _obj5; + private T6 _obj6; + private T7 _obj7; + public Resolver(IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7) + { + _serviceProvider = serviceProvider; + _obj1 = obj1; + _obj2 = obj2; + _obj3 = obj3; + _obj4 = obj4; + _obj5 = obj5; + _obj6 = obj6; + _obj7 = obj7; + } + + public TResult GetService() + where TResult : class, IInitable + { + var initableService = _serviceProvider.GetService()!; + initableService.Init(_obj1, _obj2, _obj3, _obj4, _obj5, _obj6, _obj7); + return initableService; + } +} + +public class Resolver +{ + IServiceProvider _serviceProvider; + private T1 _obj1; + private T2 _obj2; + private T3 _obj3; + private T4 _obj4; + private T5 _obj5; + private T6 _obj6; + private T7 _obj7; + private T8 _obj8; + public Resolver(IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8) + { + _serviceProvider = serviceProvider; + _obj1 = obj1; + _obj2 = obj2; + _obj3 = obj3; + _obj4 = obj4; + _obj5 = obj5; + _obj6 = obj6; + _obj7 = obj7; + _obj8 = obj8; + } + + public TResult GetService() + where TResult : class, IInitable + { + var initableService = _serviceProvider.GetService()!; + initableService.Init(_obj1, _obj2, _obj3, _obj4, _obj5, _obj6, _obj7, _obj8); + return initableService; + } +} + +public class Resolver +{ + IServiceProvider _serviceProvider; + private T1 _obj1; + private T2 _obj2; + private T3 _obj3; + private T4 _obj4; + private T5 _obj5; + private T6 _obj6; + private T7 _obj7; + private T8 _obj8; + private T9 _obj9; + public Resolver(IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9) + { + _serviceProvider = serviceProvider; + _obj1 = obj1; + _obj2 = obj2; + _obj3 = obj3; + _obj4 = obj4; + _obj5 = obj5; + _obj6 = obj6; + _obj7 = obj7; + _obj8 = obj8; + _obj9 = obj9; + } + + public TResult GetService() + where TResult : class, IInitable + { + var initableService = _serviceProvider.GetService()!; + initableService.Init(_obj1, _obj2, _obj3, _obj4, _obj5, _obj6, _obj7, _obj8, _obj9); + return initableService; + } +} + +public class Resolver +{ + IServiceProvider _serviceProvider; + private T1 _obj1; + private T2 _obj2; + private T3 _obj3; + private T4 _obj4; + private T5 _obj5; + private T6 _obj6; + private T7 _obj7; + private T8 _obj8; + private T9 _obj9; + private T10 _obj10; + public Resolver(IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10) + { + _serviceProvider = serviceProvider; + _obj1 = obj1; + _obj2 = obj2; + _obj3 = obj3; + _obj4 = obj4; + _obj5 = obj5; + _obj6 = obj6; + _obj7 = obj7; + _obj8 = obj8; + _obj9 = obj9; + _obj10 = obj10; + } + + public TResult GetService() + where TResult : class, IInitable + { + var initableService = _serviceProvider.GetService()!; + initableService.Init(_obj1, _obj2, _obj3, _obj4, _obj5, _obj6, _obj7, _obj8, _obj9, _obj10); + return initableService; + } +} + +public class Resolver +{ + IServiceProvider _serviceProvider; + private T1 _obj1; + private T2 _obj2; + private T3 _obj3; + private T4 _obj4; + private T5 _obj5; + private T6 _obj6; + private T7 _obj7; + private T8 _obj8; + private T9 _obj9; + private T10 _obj10; + private T11 _obj11; + public Resolver(IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10, T11 obj11) + { + _serviceProvider = serviceProvider; + _obj1 = obj1; + _obj2 = obj2; + _obj3 = obj3; + _obj4 = obj4; + _obj5 = obj5; + _obj6 = obj6; + _obj7 = obj7; + _obj8 = obj8; + _obj9 = obj9; + _obj10 = obj10; + _obj11 = obj11; + } + + public TResult GetService() + where TResult : class, IInitable + { + var initableService = _serviceProvider.GetService()!; + initableService.Init(_obj1, _obj2, _obj3, _obj4, _obj5, _obj6, _obj7, _obj8, _obj9, _obj10, _obj11); + return initableService; + } +} + +public class Resolver +{ + IServiceProvider _serviceProvider; + private T1 _obj1; + private T2 _obj2; + private T3 _obj3; + private T4 _obj4; + private T5 _obj5; + private T6 _obj6; + private T7 _obj7; + private T8 _obj8; + private T9 _obj9; + private T10 _obj10; + private T11 _obj11; + private T12 _obj12; + public Resolver(IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10, T11 obj11, T12 obj12) + { + _serviceProvider = serviceProvider; + _obj1 = obj1; + _obj2 = obj2; + _obj3 = obj3; + _obj4 = obj4; + _obj5 = obj5; + _obj6 = obj6; + _obj7 = obj7; + _obj8 = obj8; + _obj9 = obj9; + _obj10 = obj10; + _obj11 = obj11; + _obj12 = obj12; + } + + public TResult GetService() + where TResult : class, IInitable + { + var initableService = _serviceProvider.GetService()!; + initableService.Init(_obj1, _obj2, _obj3, _obj4, _obj5, _obj6, _obj7, _obj8, _obj9, _obj10, _obj11, _obj12); + return initableService; + } +} + +public class Resolver +{ + IServiceProvider _serviceProvider; + private T1 _obj1; + private T2 _obj2; + private T3 _obj3; + private T4 _obj4; + private T5 _obj5; + private T6 _obj6; + private T7 _obj7; + private T8 _obj8; + private T9 _obj9; + private T10 _obj10; + private T11 _obj11; + private T12 _obj12; + private T13 _obj13; + public Resolver(IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10, T11 obj11, T12 obj12, T13 obj13) + { + _serviceProvider = serviceProvider; + _obj1 = obj1; + _obj2 = obj2; + _obj3 = obj3; + _obj4 = obj4; + _obj5 = obj5; + _obj6 = obj6; + _obj7 = obj7; + _obj8 = obj8; + _obj9 = obj9; + _obj10 = obj10; + _obj11 = obj11; + _obj12 = obj12; + _obj13 = obj13; + } + + public TResult GetService() + where TResult : class, IInitable + { + var initableService = _serviceProvider.GetService()!; + initableService.Init(_obj1, _obj2, _obj3, _obj4, _obj5, _obj6, _obj7, _obj8, _obj9, _obj10, _obj11, _obj12, _obj13); + return initableService; + } +} + +public class Resolver +{ + IServiceProvider _serviceProvider; + private T1 _obj1; + private T2 _obj2; + private T3 _obj3; + private T4 _obj4; + private T5 _obj5; + private T6 _obj6; + private T7 _obj7; + private T8 _obj8; + private T9 _obj9; + private T10 _obj10; + private T11 _obj11; + private T12 _obj12; + private T13 _obj13; + private T14 _obj14; + public Resolver(IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10, T11 obj11, T12 obj12, T13 obj13, T14 obj14) + { + _serviceProvider = serviceProvider; + _obj1 = obj1; + _obj2 = obj2; + _obj3 = obj3; + _obj4 = obj4; + _obj5 = obj5; + _obj6 = obj6; + _obj7 = obj7; + _obj8 = obj8; + _obj9 = obj9; + _obj10 = obj10; + _obj11 = obj11; + _obj12 = obj12; + _obj13 = obj13; + _obj14 = obj14; + } + + public TResult GetService() + where TResult : class, IInitable + { + var initableService = _serviceProvider.GetService()!; + initableService.Init(_obj1, _obj2, _obj3, _obj4, _obj5, _obj6, _obj7, _obj8, _obj9, _obj10, _obj11, _obj12, _obj13, _obj14); + return initableService; + } +} + +public class Resolver +{ + IServiceProvider _serviceProvider; + private T1 _obj1; + private T2 _obj2; + private T3 _obj3; + private T4 _obj4; + private T5 _obj5; + private T6 _obj6; + private T7 _obj7; + private T8 _obj8; + private T9 _obj9; + private T10 _obj10; + private T11 _obj11; + private T12 _obj12; + private T13 _obj13; + private T14 _obj14; + private T15 _obj15; + public Resolver(IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10, T11 obj11, T12 obj12, T13 obj13, T14 obj14, T15 obj15) + { + _serviceProvider = serviceProvider; + _obj1 = obj1; + _obj2 = obj2; + _obj3 = obj3; + _obj4 = obj4; + _obj5 = obj5; + _obj6 = obj6; + _obj7 = obj7; + _obj8 = obj8; + _obj9 = obj9; + _obj10 = obj10; + _obj11 = obj11; + _obj12 = obj12; + _obj13 = obj13; + _obj14 = obj14; + _obj15 = obj15; + } + + public TResult GetService() + where TResult : class, IInitable + { + var initableService = _serviceProvider.GetService()!; + initableService.Init(_obj1, _obj2, _obj3, _obj4, _obj5, _obj6, _obj7, _obj8, _obj9, _obj10, _obj11, _obj12, _obj13, _obj14, _obj15); + return initableService; + } +} + +public class AsyncResolver +{ + IServiceProvider _serviceProvider; + public AsyncResolver(IServiceProvider serviceProvider) + { + _serviceProvider = serviceProvider; + } + + public async Task GetServiceAsync() + where TResult : class, IAsyncInitable + { + var initableService = _serviceProvider.GetService()!; + await initableService.InitAsync(); + return initableService; + } +} + +public class AsyncResolver +{ + IServiceProvider _serviceProvider; + private T1 _obj1; + public AsyncResolver(IServiceProvider serviceProvider, T1 obj1) + { + _serviceProvider = serviceProvider; + _obj1 = obj1; + } + + public async Task GetServiceAsync() + where TResult : class, IAsyncInitable + { + var initableService = _serviceProvider.GetService() ?? throw new ArgumentException($"{typeof(TResult).Name} is not registered in the DI container."); + await initableService.InitAsync(_obj1); + return initableService; + } +} + +public class AsyncResolver +{ + IServiceProvider _serviceProvider; + private T1 _obj1; + private T2 _obj2; + public AsyncResolver(IServiceProvider serviceProvider, T1 obj1, T2 obj2) + { + _serviceProvider = serviceProvider; + _obj1 = obj1; + _obj2 = obj2; + } + + public async Task GetServiceAsync() + where TResult : class, IAsyncInitable + { + var initableService = _serviceProvider.GetService()!; + await initableService.InitAsync(_obj1, _obj2); + return initableService; + } +} + +public class AsyncResolver +{ + IServiceProvider _serviceProvider; + private T1 _obj1; + private T2 _obj2; + private T3 _obj3; + public AsyncResolver(IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3) + { + _serviceProvider = serviceProvider; + _obj1 = obj1; + _obj2 = obj2; + _obj3 = obj3; + } + + public async Task GetServiceAsync() + where TResult : class, IAsyncInitable + { + var initableService = _serviceProvider.GetService()!; + await initableService.InitAsync(_obj1, _obj2, _obj3); + return initableService; + } +} + +public class AsyncResolver +{ + IServiceProvider _serviceProvider; + private T1 _obj1; + private T2 _obj2; + private T3 _obj3; + private T4 _obj4; + public AsyncResolver(IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4) + { + _serviceProvider = serviceProvider; + _obj1 = obj1; + _obj2 = obj2; + _obj3 = obj3; + _obj4 = obj4; + } + + public async Task GetServiceAsync() + where TResult : class, IAsyncInitable + { + var initableService = _serviceProvider.GetService()!; + await initableService.InitAsync(_obj1, _obj2, _obj3, _obj4); + return initableService; + } +} + +public class AsyncResolver +{ + IServiceProvider _serviceProvider; + private T1 _obj1; + private T2 _obj2; + private T3 _obj3; + private T4 _obj4; + private T5 _obj5; + public AsyncResolver(IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5) + { + _serviceProvider = serviceProvider; + _obj1 = obj1; + _obj2 = obj2; + _obj3 = obj3; + _obj4 = obj4; + _obj5 = obj5; + } + + public async Task GetServiceAsync() + where TResult : class, IAsyncInitable + { + var initableService = _serviceProvider.GetService()!; + await initableService.InitAsync(_obj1, _obj2, _obj3, _obj4, _obj5); + return initableService; + } +} + +public class AsyncResolver +{ + IServiceProvider _serviceProvider; + private T1 _obj1; + private T2 _obj2; + private T3 _obj3; + private T4 _obj4; + private T5 _obj5; + private T6 _obj6; + public AsyncResolver(IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6) + { + _serviceProvider = serviceProvider; + _obj1 = obj1; + _obj2 = obj2; + _obj3 = obj3; + _obj4 = obj4; + _obj5 = obj5; + _obj6 = obj6; + } + + public async Task GetServiceAsync() + where TResult : class, IAsyncInitable + { + var initableService = _serviceProvider.GetService()!; + await initableService.InitAsync(_obj1, _obj2, _obj3, _obj4, _obj5, _obj6); + return initableService; + } +} + +public class AsyncResolver +{ + IServiceProvider _serviceProvider; + private T1 _obj1; + private T2 _obj2; + private T3 _obj3; + private T4 _obj4; + private T5 _obj5; + private T6 _obj6; + private T7 _obj7; + public AsyncResolver(IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7) + { + _serviceProvider = serviceProvider; + _obj1 = obj1; + _obj2 = obj2; + _obj3 = obj3; + _obj4 = obj4; + _obj5 = obj5; + _obj6 = obj6; + _obj7 = obj7; + } + + public async Task GetServiceAsync() + where TResult : class, IAsyncInitable + { + var initableService = _serviceProvider.GetService()!; + await initableService.InitAsync(_obj1, _obj2, _obj3, _obj4, _obj5, _obj6, _obj7); + return initableService; + } +} + +public class AsyncResolver +{ + IServiceProvider _serviceProvider; + private T1 _obj1; + private T2 _obj2; + private T3 _obj3; + private T4 _obj4; + private T5 _obj5; + private T6 _obj6; + private T7 _obj7; + private T8 _obj8; + public AsyncResolver(IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8) + { + _serviceProvider = serviceProvider; + _obj1 = obj1; + _obj2 = obj2; + _obj3 = obj3; + _obj4 = obj4; + _obj5 = obj5; + _obj6 = obj6; + _obj7 = obj7; + _obj8 = obj8; + } + + public async Task GetServiceAsync() + where TResult : class, IAsyncInitable + { + var initableService = _serviceProvider.GetService()!; + await initableService.InitAsync(_obj1, _obj2, _obj3, _obj4, _obj5, _obj6, _obj7, _obj8); + return initableService; + } +} + +public class AsyncResolver +{ + IServiceProvider _serviceProvider; + private T1 _obj1; + private T2 _obj2; + private T3 _obj3; + private T4 _obj4; + private T5 _obj5; + private T6 _obj6; + private T7 _obj7; + private T8 _obj8; + private T9 _obj9; + public AsyncResolver(IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9) + { + _serviceProvider = serviceProvider; + _obj1 = obj1; + _obj2 = obj2; + _obj3 = obj3; + _obj4 = obj4; + _obj5 = obj5; + _obj6 = obj6; + _obj7 = obj7; + _obj8 = obj8; + _obj9 = obj9; + } + + public async Task GetServiceAsync() + where TResult : class, IAsyncInitable + { + var initableService = _serviceProvider.GetService()!; + await initableService.InitAsync(_obj1, _obj2, _obj3, _obj4, _obj5, _obj6, _obj7, _obj8, _obj9); + return initableService; + } +} + +public class AsyncResolver +{ + IServiceProvider _serviceProvider; + private T1 _obj1; + private T2 _obj2; + private T3 _obj3; + private T4 _obj4; + private T5 _obj5; + private T6 _obj6; + private T7 _obj7; + private T8 _obj8; + private T9 _obj9; + private T10 _obj10; + public AsyncResolver(IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10) + { + _serviceProvider = serviceProvider; + _obj1 = obj1; + _obj2 = obj2; + _obj3 = obj3; + _obj4 = obj4; + _obj5 = obj5; + _obj6 = obj6; + _obj7 = obj7; + _obj8 = obj8; + _obj9 = obj9; + _obj10 = obj10; + } + + public async Task GetServiceAsync() + where TResult : class, IAsyncInitable + { + var initableService = _serviceProvider.GetService()!; + await initableService.InitAsync(_obj1, _obj2, _obj3, _obj4, _obj5, _obj6, _obj7, _obj8, _obj9, _obj10); + return initableService; + } +} + +public class AsyncResolver +{ + IServiceProvider _serviceProvider; + private T1 _obj1; + private T2 _obj2; + private T3 _obj3; + private T4 _obj4; + private T5 _obj5; + private T6 _obj6; + private T7 _obj7; + private T8 _obj8; + private T9 _obj9; + private T10 _obj10; + private T11 _obj11; + public AsyncResolver(IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10, T11 obj11) + { + _serviceProvider = serviceProvider; + _obj1 = obj1; + _obj2 = obj2; + _obj3 = obj3; + _obj4 = obj4; + _obj5 = obj5; + _obj6 = obj6; + _obj7 = obj7; + _obj8 = obj8; + _obj9 = obj9; + _obj10 = obj10; + _obj11 = obj11; + } + + public async Task GetServiceAsync() + where TResult : class, IAsyncInitable + { + var initableService = _serviceProvider.GetService()!; + await initableService.InitAsync(_obj1, _obj2, _obj3, _obj4, _obj5, _obj6, _obj7, _obj8, _obj9, _obj10, _obj11); + return initableService; + } +} + +public class AsyncResolver +{ + IServiceProvider _serviceProvider; + private T1 _obj1; + private T2 _obj2; + private T3 _obj3; + private T4 _obj4; + private T5 _obj5; + private T6 _obj6; + private T7 _obj7; + private T8 _obj8; + private T9 _obj9; + private T10 _obj10; + private T11 _obj11; + private T12 _obj12; + public AsyncResolver(IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10, T11 obj11, T12 obj12) + { + _serviceProvider = serviceProvider; + _obj1 = obj1; + _obj2 = obj2; + _obj3 = obj3; + _obj4 = obj4; + _obj5 = obj5; + _obj6 = obj6; + _obj7 = obj7; + _obj8 = obj8; + _obj9 = obj9; + _obj10 = obj10; + _obj11 = obj11; + _obj12 = obj12; + } + + public async Task GetServiceAsync() + where TResult : class, IAsyncInitable + { + var initableService = _serviceProvider.GetService()!; + await initableService.InitAsync(_obj1, _obj2, _obj3, _obj4, _obj5, _obj6, _obj7, _obj8, _obj9, _obj10, _obj11, _obj12); + return initableService; + } +} + +public class AsyncResolver +{ + IServiceProvider _serviceProvider; + private T1 _obj1; + private T2 _obj2; + private T3 _obj3; + private T4 _obj4; + private T5 _obj5; + private T6 _obj6; + private T7 _obj7; + private T8 _obj8; + private T9 _obj9; + private T10 _obj10; + private T11 _obj11; + private T12 _obj12; + private T13 _obj13; + public AsyncResolver(IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10, T11 obj11, T12 obj12, T13 obj13) + { + _serviceProvider = serviceProvider; + _obj1 = obj1; + _obj2 = obj2; + _obj3 = obj3; + _obj4 = obj4; + _obj5 = obj5; + _obj6 = obj6; + _obj7 = obj7; + _obj8 = obj8; + _obj9 = obj9; + _obj10 = obj10; + _obj11 = obj11; + _obj12 = obj12; + _obj13 = obj13; + } + + public async Task GetServiceAsync() + where TResult : class, IAsyncInitable + { + var initableService = _serviceProvider.GetService()!; + await initableService.InitAsync(_obj1, _obj2, _obj3, _obj4, _obj5, _obj6, _obj7, _obj8, _obj9, _obj10, _obj11, _obj12, _obj13); + return initableService; + } +} + +public class AsyncResolver +{ + IServiceProvider _serviceProvider; + private T1 _obj1; + private T2 _obj2; + private T3 _obj3; + private T4 _obj4; + private T5 _obj5; + private T6 _obj6; + private T7 _obj7; + private T8 _obj8; + private T9 _obj9; + private T10 _obj10; + private T11 _obj11; + private T12 _obj12; + private T13 _obj13; + private T14 _obj14; + public AsyncResolver(IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10, T11 obj11, T12 obj12, T13 obj13, T14 obj14) + { + _serviceProvider = serviceProvider; + _obj1 = obj1; + _obj2 = obj2; + _obj3 = obj3; + _obj4 = obj4; + _obj5 = obj5; + _obj6 = obj6; + _obj7 = obj7; + _obj8 = obj8; + _obj9 = obj9; + _obj10 = obj10; + _obj11 = obj11; + _obj12 = obj12; + _obj13 = obj13; + _obj14 = obj14; + } + + public async Task GetServiceAsync() + where TResult : class, IAsyncInitable + { + var initableService = _serviceProvider.GetService()!; + await initableService.InitAsync(_obj1, _obj2, _obj3, _obj4, _obj5, _obj6, _obj7, _obj8, _obj9, _obj10, _obj11, _obj12, _obj13, _obj14); + return initableService; + } +} + +public class AsyncResolver +{ + IServiceProvider _serviceProvider; + private T1 _obj1; + private T2 _obj2; + private T3 _obj3; + private T4 _obj4; + private T5 _obj5; + private T6 _obj6; + private T7 _obj7; + private T8 _obj8; + private T9 _obj9; + private T10 _obj10; + private T11 _obj11; + private T12 _obj12; + private T13 _obj13; + private T14 _obj14; + private T15 _obj15; + public AsyncResolver(IServiceProvider serviceProvider, T1 obj1, T2 obj2, T3 obj3, T4 obj4, T5 obj5, T6 obj6, T7 obj7, T8 obj8, T9 obj9, T10 obj10, T11 obj11, T12 obj12, T13 obj13, T14 obj14, T15 obj15) + { + _serviceProvider = serviceProvider; + _obj1 = obj1; + _obj2 = obj2; + _obj3 = obj3; + _obj4 = obj4; + _obj5 = obj5; + _obj6 = obj6; + _obj7 = obj7; + _obj8 = obj8; + _obj9 = obj9; + _obj10 = obj10; + _obj11 = obj11; + _obj12 = obj12; + _obj13 = obj13; + _obj14 = obj14; + _obj15 = obj15; + } + + public async Task GetServiceAsync() + where TResult : class, IAsyncInitable + { + var initableService = _serviceProvider.GetService()!; + await initableService.InitAsync(_obj1, _obj2, _obj3, _obj4, _obj5, _obj6, _obj7, _obj8, _obj9, _obj10, _obj11, _obj12, _obj13, _obj14, _obj15); + return initableService; + } +} + diff --git a/src/Core/InitableService/InitableService.csproj b/src/Core/InitableService/InitableService.csproj new file mode 100644 index 0000000..dbde20d --- /dev/null +++ b/src/Core/InitableService/InitableService.csproj @@ -0,0 +1,13 @@ + + + + net6.0 + enable + enable + + + + + + + diff --git a/src/Core/InitableService/generateExtensions.csx b/src/Core/InitableService/generateExtensions.csx new file mode 100644 index 0000000..d0c02db --- /dev/null +++ b/src/Core/InitableService/generateExtensions.csx @@ -0,0 +1,180 @@ +#!/usr/bin/env dotnet-script + +{ + const string header = +@"// Autogenerated +using InitableService; + +namespace Microsoft.Extensions.DependencyInjection; + +public static class InitableExtensions +{ +"; + + const string footer = "}"; + using var initableWriter = File.CreateText("InitableExtensions.cs"); + initableWriter.WriteLine(header); + const int generateForParams = 15; + + for (var i = 0; i <= generateForParams; i++) + { + WriteInitableExtension(initableWriter, false, i); + initableWriter.WriteLine(); + } + + for (var i = 0; i <= generateForParams; i++) + { + WriteInitableExtension(initableWriter, true, i); + initableWriter.WriteLine(); + } + + initableWriter.WriteLine(footer); + + for (var i = 0; i <= generateForParams; i++) + { + WriteInitableResolver(initableWriter, false, i); + initableWriter.WriteLine(); + } + + for (var i = 0; i <= generateForParams; i++) + { + WriteInitableResolver(initableWriter, true, i); + initableWriter.WriteLine(); + } + + initableWriter.Flush(); +} + +void WriteInitableExtension(StreamWriter initableWriter, bool isAsync, int i) +{ + initableWriter.Write($"\tpublic static {(isAsync ? "Async" : "")}Resolver"); + if (i > 0) + { + initableWriter.Write("<"); + initableWriter.Write(string.Join(", ", Enumerable.Range(1, i).Select(c => "T" + c))); + initableWriter.Write(">"); + } + initableWriter.Write($" Get{(isAsync ? "Async" : "")}InitableResolver"); + if (i > 0) + { + initableWriter.Write("<"); + initableWriter.Write(string.Join(", ", Enumerable.Range(1, i).Select(c => "T" + c))); + initableWriter.Write(">"); + } + + initableWriter.Write("("); + var thisParameter = "this IServiceProvider serviceProvider"; + + if (i > 0) + { + initableWriter.Write(string.Join(", ", Enumerable.Range(1, i).Select(c => $"T{c} obj{c}").Prepend(thisParameter))); + } + else + { + initableWriter.Write(thisParameter); + } + + initableWriter.WriteLine(")"); + initableWriter.WriteLine("\t{"); + initableWriter.Write($"\t\treturn new {(isAsync ? "Async" : "")}Resolver"); + + if (i > 0) + { + initableWriter.Write("<"); + initableWriter.Write(string.Join(", ", Enumerable.Range(1, i).Select(c => "T" + c))); + initableWriter.Write(">"); + } + + initableWriter.Write("("); + if (i > 0) + { + initableWriter.Write(string.Join(", ", Enumerable.Range(1, i).Select(c => $"obj{c}").Prepend("serviceProvider"))); + } + else + { + initableWriter.Write("serviceProvider"); + } + initableWriter.WriteLine(");"); + + initableWriter.WriteLine("\t}"); +} + +void WriteInitableResolver(StreamWriter initableWriter, bool isAsync, int i) +{ + initableWriter.Write($"public class {(isAsync ? "Async" : "")}Resolver"); + if (i > 0) + { + initableWriter.Write("<"); + initableWriter.Write(string.Join(", ", Enumerable.Range(1, i).Select(c => "T" + c))); + initableWriter.Write(">"); + } + initableWriter.WriteLine(); + initableWriter.WriteLine("{"); + initableWriter.WriteLine("\tIServiceProvider _serviceProvider;"); + if (i > 0) + { + for (var j = 1; j <= i; j++) + { + initableWriter.WriteLine($"\tprivate T{j} _obj{j};"); + } + } + + initableWriter.Write($"\tpublic {(isAsync ? "Async" : "")}Resolver("); + if (i > 0) + { + initableWriter.Write(string.Join(", ", Enumerable.Range(1, i).Select(c => $"T{c} obj{c}").Prepend("IServiceProvider serviceProvider"))); + } + else + { + initableWriter.Write("IServiceProvider serviceProvider"); + } + + initableWriter.WriteLine(")"); + initableWriter.WriteLine("\t{"); + initableWriter.WriteLine("\t\t_serviceProvider = serviceProvider;"); + if (i > 0) + { + for (var j = 1; j <= i; j++) + { + initableWriter.WriteLine($"\t\t_obj{j} = obj{j};"); + } + } + initableWriter.WriteLine("\t}"); + initableWriter.WriteLine(""); + + var returnType = isAsync ? "async Task" : "TResult"; + initableWriter.WriteLine($"\tpublic {returnType} GetService{(isAsync ? "Async" : "")}()"); + + + + initableWriter.Write($"\t\twhere TResult : class, I{(isAsync ? "Async" : "")}Initable"); + if (i > 0) + { + initableWriter.Write("<"); + initableWriter.Write(string.Join(", ", Enumerable.Range(1, i).Select(c => "T" + c))); + initableWriter.Write(">"); + } + initableWriter.WriteLine(""); + initableWriter.WriteLine("\t{"); + initableWriter.WriteLine("\t\tvar initableService = _serviceProvider.GetService()!;"); + if (isAsync) + { + initableWriter.Write("\t\tawait initableService.InitAsync"); + } + else + { + initableWriter.Write("\t\tinitableService.Init"); + } + + initableWriter.Write("("); + + if (i > 0) + { + initableWriter.Write(string.Join(", ", Enumerable.Range(1, i).Select(c => $"_obj{c}"))); + } + initableWriter.WriteLine(");"); + initableWriter.WriteLine("\t\treturn initableService;"); + + initableWriter.WriteLine("\t}"); + initableWriter.WriteLine("}"); +} \ No newline at end of file diff --git a/src/Core/InitableService/generateInterfaces.csx b/src/Core/InitableService/generateInterfaces.csx new file mode 100644 index 0000000..395990d --- /dev/null +++ b/src/Core/InitableService/generateInterfaces.csx @@ -0,0 +1,66 @@ +#!/usr/bin/env dotnet-script + +{ + const string header = +@"// Autogenerated +namespace InitableService; +"; + + const string footer = ""; + using var initableWriter = File.CreateText("Initable.cs"); + initableWriter.WriteLine(header); + const int generateForParams = 15; + + for (var i = 0; i <= generateForParams; i++) + { + WriteInitable(initableWriter, false, i); + } + + for (var i = 0; i <= generateForParams; i++) + { + WriteInitable(initableWriter, true, i); + initableWriter.WriteLine(); + } + + initableWriter.WriteLine(footer); + initableWriter.Flush(); +} + +void WriteInitable(StreamWriter initableWriter, bool isAsync, int i) +{ + initableWriter.Write($"public interface I{(isAsync ? "Async" : "")}Initable"); + if (i > 0) + { + initableWriter.Write("<"); + initableWriter.Write(string.Join(", ", Enumerable.Range(1, i).Select(c => "T" + c))); + initableWriter.Write(">"); + } + + initableWriter.WriteLine(); + initableWriter.WriteLine("{"); + + if (isAsync) + { + initableWriter.Write("\tTask InitAsync"); + } + else + { + initableWriter.Write("\tvoid Init"); + } + + if (i > 0) + { + /*initableWriter.Write("<"); + initableWriter.Write(string.Join(", ", Enumerable.Range(1, i).Select(c => "T" + c))); + initableWriter.Write(">");*/ + initableWriter.Write("("); + initableWriter.Write(string.Join(", ", Enumerable.Range(1, i).Select(c => $"T{c} obj{c}"))); + initableWriter.Write(")"); + } + else + { + initableWriter.Write("()"); + } + initableWriter.WriteLine(";"); + initableWriter.WriteLine("}"); +} \ No newline at end of file diff --git a/src/FileTime.sln b/src/FileTime.sln index 3a8279e..2c4bf15 100644 --- a/src/FileTime.sln +++ b/src/FileTime.sln @@ -41,6 +41,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FileTime.Tools.Compression" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FileTime.Providers.Sftp", "Providers\FileTime.Providers.Sftp\FileTime.Providers.Sftp.csproj", "{0E650206-801D-4E8D-95BA-4565B32092E1}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "InitableService", "Core\InitableService\InitableService.csproj", "{B1520189-8646-4DE8-B5C9-46AE04B4D01C}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -315,6 +317,26 @@ Global {0E650206-801D-4E8D-95BA-4565B32092E1}.Release|x64.Build.0 = Release|Any CPU {0E650206-801D-4E8D-95BA-4565B32092E1}.Release|x86.ActiveCfg = Release|Any CPU {0E650206-801D-4E8D-95BA-4565B32092E1}.Release|x86.Build.0 = Release|Any CPU + {B1520189-8646-4DE8-B5C9-46AE04B4D01C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B1520189-8646-4DE8-B5C9-46AE04B4D01C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B1520189-8646-4DE8-B5C9-46AE04B4D01C}.Debug|ARM.ActiveCfg = Debug|Any CPU + {B1520189-8646-4DE8-B5C9-46AE04B4D01C}.Debug|ARM.Build.0 = Debug|Any CPU + {B1520189-8646-4DE8-B5C9-46AE04B4D01C}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {B1520189-8646-4DE8-B5C9-46AE04B4D01C}.Debug|ARM64.Build.0 = Debug|Any CPU + {B1520189-8646-4DE8-B5C9-46AE04B4D01C}.Debug|x64.ActiveCfg = Debug|Any CPU + {B1520189-8646-4DE8-B5C9-46AE04B4D01C}.Debug|x64.Build.0 = Debug|Any CPU + {B1520189-8646-4DE8-B5C9-46AE04B4D01C}.Debug|x86.ActiveCfg = Debug|Any CPU + {B1520189-8646-4DE8-B5C9-46AE04B4D01C}.Debug|x86.Build.0 = Debug|Any CPU + {B1520189-8646-4DE8-B5C9-46AE04B4D01C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B1520189-8646-4DE8-B5C9-46AE04B4D01C}.Release|Any CPU.Build.0 = Release|Any CPU + {B1520189-8646-4DE8-B5C9-46AE04B4D01C}.Release|ARM.ActiveCfg = Release|Any CPU + {B1520189-8646-4DE8-B5C9-46AE04B4D01C}.Release|ARM.Build.0 = Release|Any CPU + {B1520189-8646-4DE8-B5C9-46AE04B4D01C}.Release|ARM64.ActiveCfg = Release|Any CPU + {B1520189-8646-4DE8-B5C9-46AE04B4D01C}.Release|ARM64.Build.0 = Release|Any CPU + {B1520189-8646-4DE8-B5C9-46AE04B4D01C}.Release|x64.ActiveCfg = Release|Any CPU + {B1520189-8646-4DE8-B5C9-46AE04B4D01C}.Release|x64.Build.0 = Release|Any CPU + {B1520189-8646-4DE8-B5C9-46AE04B4D01C}.Release|x86.ActiveCfg = Release|Any CPU + {B1520189-8646-4DE8-B5C9-46AE04B4D01C}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -333,6 +355,7 @@ Global {22B33BC6-3987-4BE6-8C54-BFC75C78CCE7} = {890275FF-943A-4D07-83BA-14E5C52D7846} {B6F6A8F9-9B7B-4E3E-AE99-A90ECFDDC966} = {0D2B4BAA-0399-459C-B022-41DB7F408225} {0E650206-801D-4E8D-95BA-4565B32092E1} = {517D96CE-A956-4638-A93D-465D34DE22B1} + {B1520189-8646-4DE8-B5C9-46AE04B4D01C} = {38B1B927-4201-4B7A-87EE-737B8C6D4090} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {8D679DCE-AC84-4A91-BFED-8F8D8E1D8183} diff --git a/src/GuiApp/FileTime.Avalonia/App.axaml b/src/GuiApp/FileTime.Avalonia/App.axaml index 69d8a67..eb12bbb 100644 --- a/src/GuiApp/FileTime.Avalonia/App.axaml +++ b/src/GuiApp/FileTime.Avalonia/App.axaml @@ -187,19 +187,11 @@ - - - - - - diff --git a/src/GuiApp/FileTime.Avalonia/Application/TabContainer.cs b/src/GuiApp/FileTime.Avalonia/Application/TabContainer.cs index b322bea..3a73b6d 100644 --- a/src/GuiApp/FileTime.Avalonia/Application/TabContainer.cs +++ b/src/GuiApp/FileTime.Avalonia/Application/TabContainer.cs @@ -1,4 +1,4 @@ -using AsyncEvent; +using AsyncEvent; using FileTime.Core.Components; using FileTime.Core.Models; using FileTime.Providers.Local; @@ -16,6 +16,8 @@ using FileTime.Core.Search; using Microsoft.Extensions.DependencyInjection; using FileTime.Core.Services; using FileTime.Core.ContainerSizeScanner; +using System.Collections.Generic; +using FileTime.Core.Providers; namespace FileTime.Avalonia.Application { @@ -71,6 +73,9 @@ namespace FileTime.Avalonia.Application [Property] private IItemPreviewViewModel? _itemPreview; + [Property] + private List _history = new(); + public async Task SetSelectedItemAsync(IItemViewModel? value) { if (_selectedItem != value) @@ -86,7 +91,38 @@ namespace FileTime.Avalonia.Application { _tabState = new TabState(Tab); _timeRunner.RefreshContainer.Add(TimeRunnerContainerRefreshed); + Tab.HistoryChanged.Add(TabHistoryChanged); + } + private async Task TabHistoryChanged(object? sender, AsyncEventArgs e, CancellationToken token) + { + await RefreshHistory(); + } + + private async Task RefreshHistory() + { + var newHistory = new List(); + + var counter = 0; + AbsolutePath? lastPath = null; + foreach (var history in Tab.History.Reverse()) + { + try + { + var historyItemVM = await _serviceProvider.GetAsyncInitableResolver(history).GetServiceAsync(); + if (historyItemVM.Container != null && historyItemVM.Container is not IContentProvider && lastPath != history) + { + lastPath = history; + newHistory.Add(historyItemVM); + counter++; + + if (counter == 10) break; + } + } + catch { } + } + + History = newHistory; } private async Task TimeRunnerContainerRefreshed(object? sender, AbsolutePath container, CancellationToken token = default) diff --git a/src/GuiApp/FileTime.Avalonia/FileTime.Avalonia.csproj b/src/GuiApp/FileTime.Avalonia/FileTime.Avalonia.csproj index 60b42c4..9da264b 100644 --- a/src/GuiApp/FileTime.Avalonia/FileTime.Avalonia.csproj +++ b/src/GuiApp/FileTime.Avalonia/FileTime.Avalonia.csproj @@ -52,6 +52,7 @@ + diff --git a/src/GuiApp/FileTime.Avalonia/Models/PlaceInfo.cs b/src/GuiApp/FileTime.Avalonia/Models/PlaceInfo.cs index 035a653..d8c8ece 100644 --- a/src/GuiApp/FileTime.Avalonia/Models/PlaceInfo.cs +++ b/src/GuiApp/FileTime.Avalonia/Models/PlaceInfo.cs @@ -1,8 +1,9 @@ +using FileTime.App.Core.Models; using FileTime.Core.Models; namespace FileTime.Avalonia.Models { - public class PlaceInfo + public class PlaceInfo : IHaveContainer { public string Name { get; } public IContainer Container { get; } diff --git a/src/GuiApp/FileTime.Avalonia/Models/RootDriveInfo.cs b/src/GuiApp/FileTime.Avalonia/Models/RootDriveInfo.cs index d300cd5..58a54de 100644 --- a/src/GuiApp/FileTime.Avalonia/Models/RootDriveInfo.cs +++ b/src/GuiApp/FileTime.Avalonia/Models/RootDriveInfo.cs @@ -1,4 +1,5 @@ -using FileTime.Core.Models; +using FileTime.App.Core.Models; +using FileTime.Core.Models; using FileTime.Providers.Local; using MvvmGen; using System.IO; @@ -7,7 +8,7 @@ using System.Runtime.InteropServices; namespace FileTime.Avalonia.Models { [ViewModel] - public partial class RootDriveInfo + public partial class RootDriveInfo : IHaveContainer { private readonly DriveInfo _driveInfo; private readonly IContainer _container; diff --git a/src/GuiApp/FileTime.Avalonia/Startup.cs b/src/GuiApp/FileTime.Avalonia/Startup.cs index cae64b4..c143bb9 100644 --- a/src/GuiApp/FileTime.Avalonia/Startup.cs +++ b/src/GuiApp/FileTime.Avalonia/Startup.cs @@ -8,7 +8,6 @@ using FileTime.Avalonia.Logging; using FileTime.Avalonia.Services; using FileTime.Avalonia.ViewModels; using FileTime.Avalonia.ViewModels.ItemPreview; -using FileTime.Core.Command; using FileTime.Core.Interactions; using FileTime.Core.Persistence; using Microsoft.Extensions.Configuration; @@ -29,6 +28,7 @@ namespace FileTime.Avalonia .AddTransient() .AddTransient() .AddTransient() + .AddTransient() .AddSingleton(); } internal static IServiceCollection AddServices(this IServiceCollection serviceCollection) diff --git a/src/GuiApp/FileTime.Avalonia/ViewModels/ContainerViewModel.cs b/src/GuiApp/FileTime.Avalonia/ViewModels/ContainerViewModel.cs index 74b1952..916ba85 100644 --- a/src/GuiApp/FileTime.Avalonia/ViewModels/ContainerViewModel.cs +++ b/src/GuiApp/FileTime.Avalonia/ViewModels/ContainerViewModel.cs @@ -228,6 +228,11 @@ namespace FileTime.Avalonia.ViewModels } } + foreach (var oldContainer in _containers.Except(newContainers)) + { + oldContainer.Unload(recursive: true, unloadParent: false, unloadEvents: true); + } + if (silent) { _containers = new ObservableCollection(newContainers); @@ -251,9 +256,14 @@ namespace FileTime.Avalonia.ViewModels _exceptions.Add(e); } - await _newItemProcessor.UpdateMarkedItems(this, CancellationToken.None); - - _isRefreshing = false; + try + { + await _newItemProcessor.UpdateMarkedItems(this, CancellationToken.None); + } + finally + { + _isRefreshing = false; + } } private int GetNewItemPosition(TItem itemToAdd, IList items) where TItem : IItemViewModel where T : IItemViewModel @@ -320,7 +330,12 @@ namespace FileTime.Avalonia.ViewModels if (unloadEvents) { + if (BaseContainer is ContainerSizeContainer sizeContainer) + { + sizeContainer.SizeChanged.Remove(UpdateSize); + } Container.Refreshed.Remove(Container_Refreshed); + Container.LazyLoadingChanged.Remove(Container_LazyLoadingChanged); } _containers.Clear(); diff --git a/src/GuiApp/FileTime.Avalonia/ViewModels/HistoryItemViewModel.cs b/src/GuiApp/FileTime.Avalonia/ViewModels/HistoryItemViewModel.cs new file mode 100644 index 0000000..317e701 --- /dev/null +++ b/src/GuiApp/FileTime.Avalonia/ViewModels/HistoryItemViewModel.cs @@ -0,0 +1,19 @@ +using FileTime.Core.Models; +using InitableService; +using System; +using System.Threading.Tasks; + +namespace FileTime.Avalonia.ViewModels +{ + public class HistoryItemViewModel : IAsyncInitable + { + public string? Name { get; private set; } + public IContainer? Container { get; private set; } + + public async Task InitAsync(AbsolutePath path) + { + Container = await path.ResolveAsync() as IContainer ?? throw new ArgumentException($"Parameter must be {nameof(IContainer)}", nameof(path)); + Name = Container.DisplayName; + } + } +} diff --git a/src/GuiApp/FileTime.Avalonia/Views/MainWindow.axaml b/src/GuiApp/FileTime.Avalonia/Views/MainWindow.axaml index 166a2eb..3a62205 100644 --- a/src/GuiApp/FileTime.Avalonia/Views/MainWindow.axaml +++ b/src/GuiApp/FileTime.Avalonia/Views/MainWindow.axaml @@ -41,7 +41,7 @@ - + @@ -55,7 +55,7 @@ Items="{Binding RootDriveInfos}"> - + - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/GuiApp/FileTime.Avalonia/Views/MainWindow.axaml.cs b/src/GuiApp/FileTime.Avalonia/Views/MainWindow.axaml.cs index 77e9489..55aab73 100644 --- a/src/GuiApp/FileTime.Avalonia/Views/MainWindow.axaml.cs +++ b/src/GuiApp/FileTime.Avalonia/Views/MainWindow.axaml.cs @@ -3,6 +3,7 @@ using Avalonia.Controls; using Avalonia.Input; using Avalonia.Interactivity; using Avalonia.Markup.Xaml; +using FileTime.App.Core.Models; using FileTime.Avalonia.Misc; using FileTime.Avalonia.Models; using FileTime.Avalonia.ViewModels; @@ -93,31 +94,19 @@ namespace FileTime.Avalonia.Views } } - private void OnPlacePointerPressed(object sender, PointerPressedEventArgs e) + private void OnHasContainerPointerPressed(object sender, PointerPressedEventArgs e) { if (!e.Handled && ViewModel != null && e.GetCurrentPoint(this).Properties.IsLeftButtonPressed && sender is StyledElement control - && control.DataContext is PlaceInfo placeInfo) + && control.DataContext is IHaveContainer hasContainer) { - ViewModel.CommandHandlerService.OpenContainer(placeInfo.Container); + ViewModel.CommandHandlerService.OpenContainer(hasContainer.Container); e.Handled = true; } } - private void OnRootDrivePointerPressed(object sender, PointerPressedEventArgs e) - { - if (!e.Handled - && ViewModel != null - && e.GetCurrentPoint(this).Properties.IsLeftButtonPressed - && sender is StyledElement control - && control.DataContext is RootDriveInfo rootDriveInfo) - { - ViewModel.CommandHandlerService.OpenContainer(rootDriveInfo.Container); - e.Handled = true; - } - } private void OnWindowClosed(object sender, EventArgs e) { try