diff --git a/src/AppCommon/FileTime.App.ContainerSizeScanner/ContainerSizeSizeScanProvider.cs b/src/AppCommon/FileTime.App.ContainerSizeScanner/ContainerSizeSizeScanProvider.cs index 0467675..6db55d6 100644 --- a/src/AppCommon/FileTime.App.ContainerSizeScanner/ContainerSizeSizeScanProvider.cs +++ b/src/AppCommon/FileTime.App.ContainerSizeScanner/ContainerSizeSizeScanProvider.cs @@ -98,6 +98,8 @@ public class ContainerSizeSizeScanProvider : ContentProviderBase, IContainerSize public override bool CanHandlePath(NativePath path) => path.Path.StartsWith(ContentProviderName); + public override VolumeSizeInfo? GetVolumeSizeInfo(FullName path) => null; + public ISizeScanTask StartSizeScan(IContainer scanSizeOf) { var searchTask = _serviceProvider diff --git a/src/AppCommon/FileTime.App.Core/Services/Persistence/TabPersistenceService.cs b/src/AppCommon/FileTime.App.Core/Services/Persistence/TabPersistenceService.cs index f7a0dca..265c782 100644 --- a/src/AppCommon/FileTime.App.Core/Services/Persistence/TabPersistenceService.cs +++ b/src/AppCommon/FileTime.App.Core/Services/Persistence/TabPersistenceService.cs @@ -57,6 +57,9 @@ public class TabPersistenceService : ITabPersistenceService }; } + public async Task InitAsync() + => await LoadStatesAsync(); + public Task ExitAsync(CancellationToken token = default) { SaveStates(token); @@ -90,7 +93,20 @@ public class TabPersistenceService : ITabPersistenceService async Task CreateEmptyTab() { - var tab = await _serviceProvider.GetAsyncInitableResolver(_localContentProvider) + IContainer? currentDirectory = null; + try + { + currentDirectory = await _localContentProvider.GetItemByNativePathAsync( + new NativePath(Environment.CurrentDirectory), + PointInTime.Present + ) as IContainer; + } + catch + { + // ignored + } + + var tab = await _serviceProvider.GetAsyncInitableResolver(currentDirectory ?? _localContentProvider) .GetRequiredServiceAsync(); var tabViewModel = _serviceProvider.GetInitableResolver(tab, 1).GetRequiredService(); @@ -218,7 +234,4 @@ public class TabPersistenceService : ITabPersistenceService _appState.SelectedTab.Value?.TabNumber ); } - - public async Task InitAsync() - => await LoadStatesAsync(); } \ No newline at end of file diff --git a/src/AppCommon/FileTime.App.Search/SearchContentProvider.cs b/src/AppCommon/FileTime.App.Search/SearchContentProvider.cs index aa8a66d..2ab4cde 100644 --- a/src/AppCommon/FileTime.App.Search/SearchContentProvider.cs +++ b/src/AppCommon/FileTime.App.Search/SearchContentProvider.cs @@ -77,6 +77,7 @@ public class SearchContentProvider : ContentProviderBase, ISearchContentProvider => Task.FromResult(null as byte[]); public override bool CanHandlePath(NativePath path) => path.Path.StartsWith(ContentProviderName); + public override VolumeSizeInfo? GetVolumeSizeInfo(FullName path) => null; public async Task StartSearchAsync(ISearchMatcher matcher, IContainer searchIn) { diff --git a/src/ConsoleApp/FileTime.ConsoleUI.App.Abstractions/IRootViewModel.cs b/src/ConsoleApp/FileTime.ConsoleUI.App.Abstractions/IRootViewModel.cs index c70b3a2..79e77a4 100644 --- a/src/ConsoleApp/FileTime.ConsoleUI.App.Abstractions/IRootViewModel.cs +++ b/src/ConsoleApp/FileTime.ConsoleUI.App.Abstractions/IRootViewModel.cs @@ -1,8 +1,10 @@ -using FileTime.App.CommandPalette.ViewModels; +using DeclarativeProperty; +using FileTime.App.CommandPalette.ViewModels; using FileTime.App.Core.ViewModels; using FileTime.App.Core.ViewModels.Timeline; using FileTime.ConsoleUI.App.Services; using FileTime.Core.Interactions; +using FileTime.Core.Models; namespace FileTime.ConsoleUI.App; @@ -15,5 +17,6 @@ public interface IRootViewModel ICommandPaletteViewModel CommandPalette { get; } IDialogService DialogService { get; } ITimelineViewModel TimelineViewModel { get; } + IDeclarativeProperty VolumeSizeInfo { get; } event Action? FocusReadInputElement; } \ No newline at end of file diff --git a/src/ConsoleApp/FileTime.ConsoleUI.App/MainWindow.cs b/src/ConsoleApp/FileTime.ConsoleUI.App/MainWindow.cs index 9959cfb..c1f0722 100644 --- a/src/ConsoleApp/FileTime.ConsoleUI.App/MainWindow.cs +++ b/src/ConsoleApp/FileTime.ConsoleUI.App/MainWindow.cs @@ -79,7 +79,7 @@ public class MainWindow private Grid MainContent() => new() { - RowDefinitionsObject = "Auto * Auto Auto Auto", + RowDefinitionsObject = "Auto * Auto Auto Auto Auto", ChildInitializer = { new Grid @@ -176,6 +176,38 @@ public class MainWindow } }, _timeline.View().WithExtension(new GridPositionExtension(0, 4)), + new Grid + { + ColumnDefinitionsObject = "* Auto", + Extensions = + { + new GridPositionExtension(0, 5) + }, + ChildInitializer = + { + new TextBlock + { + Extensions = {new GridPositionExtension(1, 0)} + } + .Setup(t => + { + t.Bind( + t, + dc => dc.VolumeSizeInfo.Value, + t => t.IsVisible, + v => v is null ? false : v.HasValue + ); + t.Bind( + t, + dc => dc.VolumeSizeInfo.Value, + tb => tb.Text, + v => v.HasValue + ? $"{ByteSize.FromBytes(v.Value.FreeSize)} / {ByteSize.FromBytes(v.Value.TotalSize)} free" + : string.Empty + ); + }) + } + }, } }; diff --git a/src/ConsoleApp/FileTime.ConsoleUI.App/RootViewModel.cs b/src/ConsoleApp/FileTime.ConsoleUI.App/RootViewModel.cs index 30c47ec..c77ce9e 100644 --- a/src/ConsoleApp/FileTime.ConsoleUI.App/RootViewModel.cs +++ b/src/ConsoleApp/FileTime.ConsoleUI.App/RootViewModel.cs @@ -1,8 +1,10 @@ -using FileTime.App.CommandPalette.ViewModels; +using DeclarativeProperty; +using FileTime.App.CommandPalette.ViewModels; using FileTime.App.Core.ViewModels; using FileTime.App.Core.ViewModels.Timeline; using FileTime.ConsoleUI.App.Services; using FileTime.Core.Interactions; +using FileTime.Core.Models; namespace FileTime.ConsoleUI.App; @@ -15,6 +17,8 @@ public class RootViewModel : IRootViewModel public ICommandPaletteViewModel CommandPalette { get; } public IDialogService DialogService { get; } public ITimelineViewModel TimelineViewModel { get; } + public IDeclarativeProperty VolumeSizeInfo { get;} + public event Action? FocusReadInputElement; public RootViewModel( @@ -40,5 +44,10 @@ public class RootViewModel : IRootViewModel } } }; + + VolumeSizeInfo = appState.SelectedTab + .Map(t => t?.CurrentLocation) + .Switch() + .Map(l => l?.Provider.GetVolumeSizeInfo(l.FullName!)); } } \ No newline at end of file diff --git a/src/ConsoleApp/FileTime.ConsoleUI.Styles/DefaultTheme.cs b/src/ConsoleApp/FileTime.ConsoleUI.Styles/DefaultTheme.cs index 5115fcf..4d4bebd 100644 --- a/src/ConsoleApp/FileTime.ConsoleUI.Styles/DefaultTheme.cs +++ b/src/ConsoleApp/FileTime.ConsoleUI.Styles/DefaultTheme.cs @@ -32,7 +32,7 @@ public record Theme( public static class DefaultThemes { public static Theme Color256Theme => new( - DefaultForegroundColor: Color256Colors.Foregrounds.Gray, + DefaultForegroundColor: null, DefaultForegroundAccentColor: Color256Colors.Foregrounds.Red, DefaultBackgroundColor: null, ElementColor: Color256Colors.Foregrounds.Gray, @@ -67,7 +67,7 @@ public static class DefaultThemes ); public static Theme ConsoleColorTheme => new( - DefaultForegroundColor: ConsoleColors.Foregrounds.Gray, + DefaultForegroundColor: null, DefaultForegroundAccentColor: ConsoleColors.Foregrounds.Red, DefaultBackgroundColor: null, ElementColor: ConsoleColors.Foregrounds.Gray, diff --git a/src/Core/FileTime.Core.Abstraction/ContentAccess/IContentProvider.cs b/src/Core/FileTime.Core.Abstraction/ContentAccess/IContentProvider.cs index d5746ee..548c297 100644 --- a/src/Core/FileTime.Core.Abstraction/ContentAccess/IContentProvider.cs +++ b/src/Core/FileTime.Core.Abstraction/ContentAccess/IContentProvider.cs @@ -28,4 +28,5 @@ public interface IContentProvider : IContainer, IOnContainerEnter Task GetContentAsync(IElement element, int? maxLength = null, CancellationToken cancellationToken = default); bool CanHandlePath(NativePath path); bool CanHandlePath(FullName path); + VolumeSizeInfo? GetVolumeSizeInfo(FullName path); } \ No newline at end of file diff --git a/src/Core/FileTime.Core.Abstraction/Models/VolumeSizeInfo.cs b/src/Core/FileTime.Core.Abstraction/Models/VolumeSizeInfo.cs new file mode 100644 index 0000000..9c3cb42 --- /dev/null +++ b/src/Core/FileTime.Core.Abstraction/Models/VolumeSizeInfo.cs @@ -0,0 +1,13 @@ +namespace FileTime.Core.Models; + +public readonly struct VolumeSizeInfo +{ + public readonly long TotalSize; + public readonly long FreeSize; + + public VolumeSizeInfo(long totalSize, long freeSize) + { + TotalSize = totalSize; + FreeSize = freeSize; + } +} \ No newline at end of file diff --git a/src/Core/FileTime.Core.ContentAccess/ContentProviderBase.cs b/src/Core/FileTime.Core.ContentAccess/ContentProviderBase.cs index 9f35d1a..3971e83 100644 --- a/src/Core/FileTime.Core.ContentAccess/ContentProviderBase.cs +++ b/src/Core/FileTime.Core.ContentAccess/ContentProviderBase.cs @@ -90,5 +90,7 @@ public abstract class ContentProviderBase : IContentProvider public abstract bool CanHandlePath(NativePath path); public bool CanHandlePath(FullName path) => CanHandlePath(GetNativePath(path)); + public abstract VolumeSizeInfo? GetVolumeSizeInfo(FullName path); + public IItem WithParent(AbsolutePath parent) => this; } \ No newline at end of file diff --git a/src/Core/FileTime.Core.ContentAccess/RootContentProvider.cs b/src/Core/FileTime.Core.ContentAccess/RootContentProvider.cs index 589bf6e..c3653f4 100644 --- a/src/Core/FileTime.Core.ContentAccess/RootContentProvider.cs +++ b/src/Core/FileTime.Core.ContentAccess/RootContentProvider.cs @@ -85,5 +85,7 @@ public class RootContentProvider : IRootContentProvider public bool CanHandlePath(NativePath path) => throw new NotImplementedException(); public bool CanHandlePath(FullName path) => throw new NotImplementedException(); - public IItem WithParent(AbsolutePath parent) => this; + public VolumeSizeInfo? GetVolumeSizeInfo(FullName path) => null; + + public IItem WithParent(AbsolutePath parent) => this; } \ No newline at end of file diff --git a/src/GuiApp/Avalonia/FileTime.GuiApp.App.Abstractions/Models/IHaveFullPath.cs b/src/GuiApp/Avalonia/FileTime.GuiApp.App.Abstractions/Models/IHaveFullPath.cs deleted file mode 100644 index 0c7913e..0000000 --- a/src/GuiApp/Avalonia/FileTime.GuiApp.App.Abstractions/Models/IHaveFullPath.cs +++ /dev/null @@ -1,8 +0,0 @@ -using FileTime.Core.Models; - -namespace FileTime.GuiApp.App.Models; - -public interface IHaveFullPath -{ - FullName Path { get; } -} \ No newline at end of file diff --git a/src/GuiApp/Avalonia/FileTime.GuiApp.App.Abstractions/ViewModels/IGuiAppState.cs b/src/GuiApp/Avalonia/FileTime.GuiApp.App.Abstractions/ViewModels/IGuiAppState.cs index 69a7f19..ecbef5c 100644 --- a/src/GuiApp/Avalonia/FileTime.GuiApp.App.Abstractions/ViewModels/IGuiAppState.cs +++ b/src/GuiApp/Avalonia/FileTime.GuiApp.App.Abstractions/ViewModels/IGuiAppState.cs @@ -1,6 +1,7 @@ using System.Collections.ObjectModel; using FileTime.App.Core.ViewModels; using FileTime.GuiApp.App.Models; +using FileTime.Providers.Local; namespace FileTime.GuiApp.App.ViewModels; diff --git a/src/GuiApp/Avalonia/FileTime.GuiApp.App.Abstractions/ViewModels/PlaceInfo.cs b/src/GuiApp/Avalonia/FileTime.GuiApp.App.Abstractions/ViewModels/PlaceInfo.cs index 4f5699d..1623197 100644 --- a/src/GuiApp/Avalonia/FileTime.GuiApp.App.Abstractions/ViewModels/PlaceInfo.cs +++ b/src/GuiApp/Avalonia/FileTime.GuiApp.App.Abstractions/ViewModels/PlaceInfo.cs @@ -3,7 +3,7 @@ using FileTime.GuiApp.App.Models; namespace FileTime.GuiApp.App.ViewModels; -public class PlaceInfo : IHaveFullPath +public class PlaceInfo { public IContainer Container { get; } public string DisplayName { get; } diff --git a/src/GuiApp/Avalonia/FileTime.GuiApp.App/Views/MainWindow.axaml b/src/GuiApp/Avalonia/FileTime.GuiApp.App/Views/MainWindow.axaml index 92ea4bb..80238cb 100644 --- a/src/GuiApp/Avalonia/FileTime.GuiApp.App/Views/MainWindow.axaml +++ b/src/GuiApp/Avalonia/FileTime.GuiApp.App/Views/MainWindow.axaml @@ -28,6 +28,7 @@ xmlns:interactions="using:FileTime.Core.Interactions" xmlns:itemPreview="clr-namespace:FileTime.App.Core.ViewModels.ItemPreview;assembly=FileTime.App.Core" xmlns:local="using:FileTime.GuiApp.App.Views" + xmlns:local1="clr-namespace:FileTime.Providers.Local;assembly=FileTime.Providers.Local.Abstractions" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:sizePreview="clr-namespace:FileTime.App.ContainerSizeScanner;assembly=FileTime.App.ContainerSizeScanner" xmlns:vm="using:FileTime.GuiApp.App.ViewModels" @@ -108,7 +109,7 @@ - + diff --git a/src/GuiApp/Avalonia/FileTime.GuiApp.CustomImpl/ViewModels/GuiAppState.cs b/src/GuiApp/Avalonia/FileTime.GuiApp.CustomImpl/ViewModels/GuiAppState.cs index eeb042a..2188f25 100644 --- a/src/GuiApp/Avalonia/FileTime.GuiApp.CustomImpl/ViewModels/GuiAppState.cs +++ b/src/GuiApp/Avalonia/FileTime.GuiApp.CustomImpl/ViewModels/GuiAppState.cs @@ -7,6 +7,7 @@ using FileTime.App.Core.ViewModels; using FileTime.App.Core.ViewModels.Timeline; using FileTime.GuiApp.App.Models; using FileTime.GuiApp.App.ViewModels; +using FileTime.Providers.Local; using MvvmGen; using PropertyChanged.SourceGenerator; @@ -16,18 +17,19 @@ public partial class GuiAppState : AppStateBase, IGuiAppState, IDisposable { private readonly BehaviorSubject _activePanel = new(GuiPanel.FileBrowser); - public GuiAppState() - { - ActivePanel = _activePanel.AsObservable(); - } - - [Notify] private ObservableCollection _rootDriveInfos = new(); + [Notify] private ObservableCollection _rootDriveInfos; [Notify] private IReadOnlyList _places = new List(); public ObservableCollection PopupTexts { get; } = new(); public IObservable ActivePanel { get; } + public GuiAppState(IRootDriveInfoService rootDriveInfoService) + { + ActivePanel = _activePanel.AsObservable(); + _rootDriveInfos = rootDriveInfoService.RootDriveInfos; + } + public void SetActivePanel(GuiPanel newPanel) => _activePanel.OnNext(newPanel); diff --git a/src/GuiApp/Avalonia/FileTime.GuiApp/Startup.cs b/src/GuiApp/Avalonia/FileTime.GuiApp/Startup.cs index 8e1e0dc..190c497 100644 --- a/src/GuiApp/Avalonia/FileTime.GuiApp/Startup.cs +++ b/src/GuiApp/Avalonia/FileTime.GuiApp/Startup.cs @@ -11,6 +11,7 @@ using FileTime.GuiApp.App.IconProviders; using FileTime.GuiApp.App.Logging; using FileTime.GuiApp.App.Services; using FileTime.GuiApp.App.ViewModels; +using FileTime.Providers.Local; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; diff --git a/src/Library/TerminalUI/Controls/Grid.cs b/src/Library/TerminalUI/Controls/Grid.cs index 2566e46..f210bca 100644 --- a/src/Library/TerminalUI/Controls/Grid.cs +++ b/src/Library/TerminalUI/Controls/Grid.cs @@ -214,7 +214,6 @@ public sealed class Grid : ChildContainerView, T>, IVisibilityChangeH int row, IReadOnlyList forceRerenderChildren) { - if (!viewsByPosition.TryGetValue((column, row), out var children)) return false; var width = columnWidths[column]; var height = rowHeights[row]; @@ -239,6 +238,12 @@ public sealed class Grid : ChildContainerView, T>, IVisibilityChangeH } if (renderSize.Width == 0 || renderSize.Height == 0) return false; + + if (!viewsByPosition.TryGetValue((column, row), out var children)) + { + RenderEmpty(context, renderPosition, renderSize); + return true; + } var needsRerender = children.Any(forceRerenderChildren.Contains); if (needsRerender) @@ -270,7 +275,7 @@ public sealed class Grid : ChildContainerView, T>, IVisibilityChangeH } } - return true; + return needsRerender; static Position GetRenderPosition( Position gridPosition, diff --git a/src/Library/TerminalUI/Controls/StackPanel.cs b/src/Library/TerminalUI/Controls/StackPanel.cs index ad33467..20b1502 100644 --- a/src/Library/TerminalUI/Controls/StackPanel.cs +++ b/src/Library/TerminalUI/Controls/StackPanel.cs @@ -99,6 +99,35 @@ public sealed partial class StackPanel : ChildContainerView, T> : childSize.Width; } + if (Orientation == Orientation.Horizontal) + { + var leftWidth = size.Width - delta; + Span text = stackalloc char[leftWidth]; + text.Fill(ApplicationContext!.EmptyCharacter); + + SetColorsForDriver(renderContext); + RenderText( + text, + renderContext.ConsoleDriver, + position with {X = position.X + delta}, + size with {Width = leftWidth} + ); + } + else + { + var leftHeight = size.Height - delta; + Span text = stackalloc char[size.Width]; + text.Fill(ApplicationContext!.EmptyCharacter); + + SetColorsForDriver(renderContext); + RenderText( + text, + renderContext.ConsoleDriver, + position with {Y = position.Y + delta}, + size with {Height = leftHeight} + ); + } + return neededRerender; } diff --git a/src/Providers/FileTime.Providers.Local.Abstractions/FileTime.Providers.Local.Abstractions.csproj b/src/Providers/FileTime.Providers.Local.Abstractions/FileTime.Providers.Local.Abstractions.csproj index 3e37046..21641ba 100644 --- a/src/Providers/FileTime.Providers.Local.Abstractions/FileTime.Providers.Local.Abstractions.csproj +++ b/src/Providers/FileTime.Providers.Local.Abstractions/FileTime.Providers.Local.Abstractions.csproj @@ -15,4 +15,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + diff --git a/src/Providers/FileTime.Providers.Local.Abstractions/IRootDriveInfoService.cs b/src/Providers/FileTime.Providers.Local.Abstractions/IRootDriveInfoService.cs new file mode 100644 index 0000000..331ed11 --- /dev/null +++ b/src/Providers/FileTime.Providers.Local.Abstractions/IRootDriveInfoService.cs @@ -0,0 +1,8 @@ +using System.Collections.ObjectModel; + +namespace FileTime.Providers.Local; + +public interface IRootDriveInfoService +{ + ObservableCollection RootDriveInfos { get; set; } +} \ No newline at end of file diff --git a/src/GuiApp/Avalonia/FileTime.GuiApp.App.Abstractions/ViewModels/RootDriveInfo.cs b/src/Providers/FileTime.Providers.Local.Abstractions/RootDriveInfo.cs similarity index 90% rename from src/GuiApp/Avalonia/FileTime.GuiApp.App.Abstractions/ViewModels/RootDriveInfo.cs rename to src/Providers/FileTime.Providers.Local.Abstractions/RootDriveInfo.cs index abbd28b..b403235 100644 --- a/src/GuiApp/Avalonia/FileTime.GuiApp.App.Abstractions/ViewModels/RootDriveInfo.cs +++ b/src/Providers/FileTime.Providers.Local.Abstractions/RootDriveInfo.cs @@ -1,13 +1,13 @@ using System.ComponentModel; +using System.Drawing; using System.Runtime.InteropServices; using FileTime.Core.Models; -using FileTime.GuiApp.App.Models; using PropertyChanged.SourceGenerator; using IContainer = FileTime.Core.Models.IContainer; -namespace FileTime.GuiApp.App.ViewModels; +namespace FileTime.Providers.Local; -public partial class RootDriveInfo : IHaveFullPath, INotifyPropertyChanged +public partial class RootDriveInfo { private readonly DriveInfo _driveInfo; diff --git a/src/Providers/FileTime.Providers.Local/LocalContentProvider.cs b/src/Providers/FileTime.Providers.Local/LocalContentProvider.cs index 25a26f3..a465b2b 100644 --- a/src/Providers/FileTime.Providers.Local/LocalContentProvider.cs +++ b/src/Providers/FileTime.Providers.Local/LocalContentProvider.cs @@ -6,6 +6,7 @@ using FileTime.Core.Enums; using FileTime.Core.Models; using FileTime.Core.Models.Extensions; using FileTime.Core.Timeline; +using Microsoft.Extensions.DependencyInjection; namespace FileTime.Providers.Local; @@ -13,13 +14,18 @@ public sealed partial class LocalContentProvider : ContentProviderBase, ILocalCo { private readonly ITimelessContentProvider _timelessContentProvider; private readonly bool _isCaseInsensitive; + private readonly Lazy> _rootDriveInfos; - public LocalContentProvider(ITimelessContentProvider timelessContentProvider) + public LocalContentProvider( + ITimelessContentProvider timelessContentProvider, + IServiceProvider serviceProvider) : base(LocalContentProviderConstants.ContentProviderId, timelessContentProvider) { _timelessContentProvider = timelessContentProvider; _isCaseInsensitive = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); + _rootDriveInfos = new Lazy>(() => serviceProvider.GetRequiredService().RootDriveInfos); + SupportsContentStreams = true; RefreshRootDirectories(); @@ -63,6 +69,16 @@ public sealed partial class LocalContentProvider : ContentProviderBase, ILocalCo return rootDrive is not null; } + public override VolumeSizeInfo? GetVolumeSizeInfo(FullName path) + { + var rootDriveInfos = _rootDriveInfos.Value; + var rootDriveInfo = rootDriveInfos.FirstOrDefault(d => path.Path.StartsWith(d.Path.Path)); + + if(rootDriveInfo is null) return null; + + return new VolumeSizeInfo(rootDriveInfo.Size, rootDriveInfo.Free); + } + public override Task GetItemByNativePathAsync(NativePath nativePath, PointInTime pointInTime, bool forceResolve = false, diff --git a/src/GuiApp/Avalonia/FileTime.GuiApp.App/Services/RootDriveInfoService.cs b/src/Providers/FileTime.Providers.Local/RootDriveInfoService.cs similarity index 86% rename from src/GuiApp/Avalonia/FileTime.GuiApp.App/Services/RootDriveInfoService.cs rename to src/Providers/FileTime.Providers.Local/RootDriveInfoService.cs index 8da8c64..53f8765 100644 --- a/src/GuiApp/Avalonia/FileTime.GuiApp.App/Services/RootDriveInfoService.cs +++ b/src/Providers/FileTime.Providers.Local/RootDriveInfoService.cs @@ -1,21 +1,20 @@ +using System.Collections.ObjectModel; using System.Runtime.InteropServices; using FileTime.App.Core.Services; using FileTime.Core.Models; -using FileTime.GuiApp.App.ViewModels; -using FileTime.Providers.Local; using ObservableComputations; -namespace FileTime.GuiApp.App.Services; +namespace FileTime.Providers.Local; -public class RootDriveInfoService : IExitHandler +public class RootDriveInfoService : IRootDriveInfoService, IExitHandler { private readonly ILocalContentProvider _localContentProvider; private readonly List _rootDrives = new(); private readonly OcConsumer _rootDriveInfosConsumer = new(); - public RootDriveInfoService( - IGuiAppState guiAppState, - ILocalContentProvider localContentProvider) + public ObservableCollection RootDriveInfos { get; set; } + + public RootDriveInfoService(ILocalContentProvider localContentProvider) { _localContentProvider = localContentProvider; InitRootDrives(); @@ -31,11 +30,10 @@ public class RootDriveInfoService : IExitHandler rootDriveInfos.For(_rootDriveInfosConsumer); - guiAppState.RootDriveInfos = rootDriveInfos; + RootDriveInfos = rootDriveInfos; void InitRootDrives() { - var driveInfos = new List(); var drives = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? DriveInfo.GetDrives().Where(d => d.DriveType == DriveType.Fixed) : DriveInfo.GetDrives().Where(d => diff --git a/src/Providers/FileTime.Providers.Local/Startup.cs b/src/Providers/FileTime.Providers.Local/Startup.cs index 33df98c..afc2e67 100644 --- a/src/Providers/FileTime.Providers.Local/Startup.cs +++ b/src/Providers/FileTime.Providers.Local/Startup.cs @@ -20,6 +20,7 @@ public static class Startup serviceCollection.TryAddSingleton>(sp => sp.GetRequiredService>()); serviceCollection.TryAddSingleton, LocalContentWriterFactory>(); serviceCollection.TryAddSingleton>(sp => sp.GetRequiredService>()); + serviceCollection.TryAddSingleton(); return serviceCollection; } } \ No newline at end of file diff --git a/src/Providers/FileTime.Providers.Remote/RemoteContentProvider.cs b/src/Providers/FileTime.Providers.Remote/RemoteContentProvider.cs index d4b835d..635dac2 100644 --- a/src/Providers/FileTime.Providers.Remote/RemoteContentProvider.cs +++ b/src/Providers/FileTime.Providers.Remote/RemoteContentProvider.cs @@ -25,4 +25,5 @@ public class RemoteContentProvider : ContentProviderBase, IRemoteContentProvider public override Task GetContentAsync(IElement element, int? maxLength = null, CancellationToken cancellationToken = default) => throw new NotImplementedException(); public override bool CanHandlePath(NativePath path) => throw new NotImplementedException(); + public override VolumeSizeInfo? GetVolumeSizeInfo(FullName path) => throw new NotImplementedException(); } \ No newline at end of file