Possible commands, IsAlternative fix

This commit is contained in:
2022-05-08 22:45:56 +02:00
parent 9bf95ebe4e
commit 5b9d0667cc
17 changed files with 184 additions and 64 deletions

View File

@@ -0,0 +1,8 @@
namespace FileTime.App.Core.Models.Enums;
public enum ItemViewModelType
{
Main,
SelectedChild,
Parent
}

View File

@@ -1,9 +1,10 @@
using FileTime.App.Core.Models.Enums;
using FileTime.Core.Models; using FileTime.Core.Models;
using InitableService; using InitableService;
namespace FileTime.App.Core.ViewModels; namespace FileTime.App.Core.ViewModels;
public interface IContainerSizeContainerViewModel : IItemViewModel, IInitable<IContainer, ITabViewModel> public interface IContainerSizeContainerViewModel : IItemViewModel, IInitable<IContainer, ITabViewModel, ItemViewModelType>
{ {
long Size { get; set; } long Size { get; set; }
} }

View File

@@ -1,9 +1,10 @@
using FileTime.App.Core.Models.Enums;
using FileTime.Core.Models; using FileTime.Core.Models;
using InitableService; using InitableService;
namespace FileTime.App.Core.ViewModels; namespace FileTime.App.Core.ViewModels;
public interface IContainerViewModel : IItemViewModel, IInitable<IContainer, ITabViewModel> public interface IContainerViewModel : IItemViewModel, IInitable<IContainer, ITabViewModel, ItemViewModelType>
{ {
IContainer? Container { get; } IContainer? Container { get; }
} }

View File

@@ -1,9 +1,10 @@
using FileTime.App.Core.Models.Enums;
using FileTime.Core.Models; using FileTime.Core.Models;
using InitableService; using InitableService;
namespace FileTime.App.Core.ViewModels; namespace FileTime.App.Core.ViewModels;
public interface IElementViewModel : IItemViewModel, IInitable<IElement, ITabViewModel> public interface IElementViewModel : IItemViewModel, IInitable<IElement, ITabViewModel, ItemViewModelType>
{ {
long? Size { get; set; } long? Size { get; set; }
} }

View File

@@ -1,8 +1,9 @@
using FileTime.App.Core.Models.Enums;
using FileTime.Core.Models; using FileTime.Core.Models;
using InitableService; using InitableService;
namespace FileTime.App.Core.ViewModels; namespace FileTime.App.Core.ViewModels;
public interface IFileViewModel : IElementViewModel, IInitable<IFileElement, ITabViewModel> public interface IFileViewModel : IElementViewModel, IInitable<IFileElement, ITabViewModel, ItemViewModelType>
{ {
} }

View File

@@ -5,7 +5,7 @@ using InitableService;
namespace FileTime.App.Core.ViewModels; namespace FileTime.App.Core.ViewModels;
public interface IItemViewModel : IInitable<IItem, ITabViewModel> public interface IItemViewModel : IInitable<IItem, ITabViewModel, ItemViewModelType>
{ {
IItem? BaseItem { get; set; } IItem? BaseItem { get; set; }
IObservable<IReadOnlyList<ItemNamePart>>? DisplayName { get; set; } IObservable<IReadOnlyList<ItemNamePart>>? DisplayName { get; set; }

View File

@@ -22,6 +22,8 @@ public interface ITabViewModel : IInitable<ITab, int>
BindedCollection<IItemViewModel>? SelectedsChildrenCollection { get; } BindedCollection<IItemViewModel>? SelectedsChildrenCollection { get; }
BindedCollection<IItemViewModel>? ParentsChildrenCollection { get; } BindedCollection<IItemViewModel>? ParentsChildrenCollection { get; }
IObservable<IReadOnlyCollection<IItemViewModel>?> CurrentItemsCollectionObservable { get; } IObservable<IReadOnlyCollection<IItemViewModel>?> CurrentItemsCollectionObservable { get; }
IObservable<IReadOnlyCollection<IItemViewModel>?> ParentsChildrenCollectionObservable { get; }
IObservable<IReadOnlyCollection<IItemViewModel>?> SelectedsChildrenCollectionObservable { get; }
void ClearMarkedItems(); void ClearMarkedItems();
void RemoveMarkedItem(IAbsolutePath item); void RemoveMarkedItem(IAbsolutePath item);
void AddMarkedItem(IAbsolutePath item); void AddMarkedItem(IAbsolutePath item);

View File

@@ -1,3 +1,4 @@
using FileTime.App.Core.Models.Enums;
using FileTime.App.Core.Services; using FileTime.App.Core.Services;
using FileTime.Core.Models; using FileTime.Core.Models;
using MvvmGen; using MvvmGen;
@@ -10,12 +11,12 @@ public partial class ContainerSizeContainerViewModel : ItemViewModel, IContainer
[Property] [Property]
private long _size; private long _size;
public ContainerSizeContainerViewModel(IItemNameConverterService _itemNameConverterService, IAppState _appState) : base(_itemNameConverterService, _appState) public ContainerSizeContainerViewModel(IItemNameConverterService itemNameConverterService, IAppState appState) : base(itemNameConverterService, appState)
{ {
} }
public void Init(IContainer item, ITabViewModel parentTab) public void Init(IContainer item, ITabViewModel parentTab, ItemViewModelType itemViewModelType)
{ {
Init((IItem)item, parentTab); Init((IItem)item, parentTab, itemViewModelType);
} }
} }

View File

@@ -1,3 +1,4 @@
using FileTime.App.Core.Models.Enums;
using FileTime.App.Core.Services; using FileTime.App.Core.Services;
using FileTime.Core.Models; using FileTime.Core.Models;
using MvvmGen; using MvvmGen;
@@ -9,12 +10,12 @@ public partial class ContainerViewModel : ItemViewModel, IContainerViewModel
{ {
public IContainer? Container => BaseItem as IContainer; public IContainer? Container => BaseItem as IContainer;
public ContainerViewModel(IItemNameConverterService _itemNameConverterService, IAppState _appState) : base(_itemNameConverterService, _appState) public ContainerViewModel(IItemNameConverterService itemNameConverterService, IAppState appState) : base(itemNameConverterService, appState)
{ {
} }
public void Init(IContainer item, ITabViewModel parentTab) public void Init(IContainer item, ITabViewModel parentTab, ItemViewModelType itemViewModelType)
{ {
Init((IItem)item, parentTab); Init((IItem)item, parentTab, itemViewModelType);
} }
} }

View File

@@ -1,3 +1,4 @@
using FileTime.App.Core.Models.Enums;
using FileTime.App.Core.Services; using FileTime.App.Core.Services;
using FileTime.Core.Models; using FileTime.Core.Models;
using MvvmGen; using MvvmGen;
@@ -10,12 +11,12 @@ public partial class ElementViewModel : ItemViewModel, IElementViewModel
[Property] [Property]
private long? _size; private long? _size;
public ElementViewModel(IItemNameConverterService _itemNameConverterService, IAppState _appState) : base(_itemNameConverterService, _appState) public ElementViewModel(IItemNameConverterService itemNameConverterService, IAppState appState) : base(itemNameConverterService, appState)
{ {
} }
public void Init(IElement item, ITabViewModel parentTab) public void Init(IElement item, ITabViewModel parentTab, ItemViewModelType itemViewModelType)
{ {
Init((IItem)item, parentTab); Init((IItem)item, parentTab, itemViewModelType);
} }
} }

View File

@@ -1,3 +1,4 @@
using FileTime.App.Core.Models.Enums;
using FileTime.App.Core.Services; using FileTime.App.Core.Services;
using FileTime.Core.Models; using FileTime.Core.Models;
using MvvmGen; using MvvmGen;
@@ -7,12 +8,12 @@ namespace FileTime.App.Core.ViewModels;
[ViewModel(GenerateConstructor = false)] [ViewModel(GenerateConstructor = false)]
public partial class FileViewModel : ElementViewModel, IFileViewModel public partial class FileViewModel : ElementViewModel, IFileViewModel
{ {
public FileViewModel(IItemNameConverterService _itemNameConverterService, IAppState _appState) : base(_itemNameConverterService, _appState) public FileViewModel(IItemNameConverterService itemNameConverterService, IAppState appState) : base(itemNameConverterService, appState)
{ {
} }
public void Init(IFileElement item, ITabViewModel parentTab) public void Init(IFileElement item, ITabViewModel parentTab, ItemViewModelType itemViewModelType)
{ {
Init((IElement)item, parentTab); Init((IElement)item, parentTab, itemViewModelType);
} }
} }

View File

@@ -1,3 +1,4 @@
using System.ComponentModel;
using System.Reactive.Linq; using System.Reactive.Linq;
using DynamicData; using DynamicData;
using FileTime.App.Core.Models; using FileTime.App.Core.Models;
@@ -41,21 +42,29 @@ public abstract partial class ItemViewModel : IItemViewModel
[Property] [Property]
private IObservable<bool> _isAlternative; private IObservable<bool> _isAlternative;
public void Init(IItem item, ITabViewModel parentTab) public void Init(IItem item, ITabViewModel parentTab, ItemViewModelType itemViewModelType)
{ {
var sourceCollection = itemViewModelType switch
{
ItemViewModelType.Main => parentTab.CurrentItemsCollectionObservable,
ItemViewModelType.Parent => parentTab.ParentsChildrenCollectionObservable,
ItemViewModelType.SelectedChild => parentTab.SelectedsChildrenCollectionObservable,
_ => throw new InvalidEnumArgumentException()
};
BaseItem = item; BaseItem = item;
DisplayName = _appState.SearchText.Select(s => _itemNameConverterService.GetDisplayName(item.DisplayName, s)); DisplayName = _appState.SearchText.Select(s => _itemNameConverterService.GetDisplayName(item.DisplayName, s));
DisplayNameText = item.DisplayName; DisplayNameText = item.DisplayName;
IsMarked = parentTab.MarkedItems.ToCollection().Select(m => m.Any(i => i.Path.Path == item.FullName?.Path)); IsMarked = parentTab.MarkedItems.ToCollection().Select(m => m.Any(i => i.Path.Path == item.FullName?.Path));
IsSelected = parentTab.CurrentSelectedItem.Select(EqualsTo); IsSelected = parentTab.CurrentSelectedItem.Select(EqualsTo);
IsAlternative = parentTab.CurrentItemsCollectionObservable.Select(c => c?.Index().FirstOrDefault(i => EqualsTo(i.Value)).Key % 2 == 0); IsAlternative = sourceCollection.Select(c => c?.Index().FirstOrDefault(i => EqualsTo(i.Value)).Key % 2 == 0);
ViewMode = Observable.CombineLatest(IsMarked, IsSelected, IsAlternative, GenerateViewMode); ViewMode = Observable.CombineLatest(IsMarked, IsSelected, IsAlternative, GenerateViewMode);
Attributes = item.Attributes; Attributes = item.Attributes;
CreatedAt = item.CreatedAt; CreatedAt = item.CreatedAt;
} }
private ItemViewMode GenerateViewMode(bool isMarked, bool isSelected, bool sAlternative) private ItemViewMode GenerateViewMode(bool isMarked, bool isSelected, bool isAlternative)
=> (isMarked, isSelected, sAlternative) switch => (isMarked, isSelected, isAlternative) switch
{ {
(true, true, _) => ItemViewMode.MarkedSelected, (true, true, _) => ItemViewMode.MarkedSelected,
(true, false, true) => ItemViewMode.MarkedAlternative, (true, false, true) => ItemViewMode.MarkedAlternative,

View File

@@ -2,6 +2,7 @@ using System.Reactive.Linq;
using DynamicData; using DynamicData;
using FileTime.App.Core.Extensions; using FileTime.App.Core.Extensions;
using FileTime.App.Core.Models; using FileTime.App.Core.Models;
using FileTime.App.Core.Models.Enums;
using FileTime.App.Core.Services; using FileTime.App.Core.Services;
using FileTime.Core.Models; using FileTime.Core.Models;
using FileTime.Core.Services; using FileTime.Core.Services;
@@ -35,15 +36,14 @@ public partial class TabViewModel : ITabViewModel, IDisposable
public IObservable<IObservable<IChangeSet<IItemViewModel>>?> ParentsChildren { get; private set; } = null!; public IObservable<IObservable<IChangeSet<IItemViewModel>>?> ParentsChildren { get; private set; } = null!;
public IObservable<IReadOnlyCollection<IItemViewModel>?> CurrentItemsCollectionObservable { get; private set; } = null!; public IObservable<IReadOnlyCollection<IItemViewModel>?> CurrentItemsCollectionObservable { get; private set; } = null!;
public IObservable<IReadOnlyCollection<IItemViewModel>?> ParentsChildrenCollectionObservable { get; private set; } = null!;
public IObservable<IReadOnlyCollection<IItemViewModel>?> SelectedsChildrenCollectionObservable { get; private set; } = null!;
[Property] [Property] private BindedCollection<IItemViewModel>? _currentItemsCollection;
private BindedCollection<IItemViewModel>? _currentItemsCollection;
[Property] [Property] private BindedCollection<IItemViewModel>? _parentsChildrenCollection;
private BindedCollection<IItemViewModel>? _parentsChildrenCollection;
[Property] [Property] private BindedCollection<IItemViewModel>? _selectedsChildrenCollection;
private BindedCollection<IItemViewModel>? _selectedsChildrenCollection;
public TabViewModel( public TabViewModel(
IServiceProvider serviceProvider, IServiceProvider serviceProvider,
@@ -67,7 +67,7 @@ public partial class TabViewModel : ITabViewModel, IDisposable
CurrentLocation = tab.CurrentLocation.AsObservable(); CurrentLocation = tab.CurrentLocation.AsObservable();
CurrentItems = tab.CurrentItems CurrentItems = tab.CurrentItems
.Select(items => items?.Transform(MapItemToViewModel)) .Select(items => items?.Transform(i => MapItemToViewModel(i, ItemViewModelType.Main)))
.ObserveOn(_rxSchedulerService.GetWorkerScheduler()) .ObserveOn(_rxSchedulerService.GetWorkerScheduler())
.SubscribeOn(_rxSchedulerService.GetUIScheduler()) .SubscribeOn(_rxSchedulerService.GetUIScheduler())
.Publish(null) .Publish(null)
@@ -82,7 +82,8 @@ public partial class TabViewModel : ITabViewModel, IDisposable
? Observable.Return((IItemViewModel?) null) ? Observable.Return((IItemViewModel?) null)
: currentItems : currentItems
.ToCollection() .ToCollection()
.Select(items => items.FirstOrDefault(i => i.BaseItem?.FullName == currentSelectedItemPath?.Path)) .Select(items =>
items.FirstOrDefault(i => i.BaseItem?.FullName == currentSelectedItemPath?.Path))
) )
.Switch() .Switch()
.Publish(null) .Publish(null)
@@ -91,11 +92,9 @@ public partial class TabViewModel : ITabViewModel, IDisposable
SelectedsChildren = InitSelectedsChildren(); SelectedsChildren = InitSelectedsChildren();
ParentsChildren = InitParentsChildren(); ParentsChildren = InitParentsChildren();
CurrentItemsCollectionObservable = CurrentItems CurrentItemsCollectionObservable = InitAsd(CurrentItems);
.Select(c => c != null ? c.ToCollection() : Observable.Return((IReadOnlyCollection<IItemViewModel>?)null)) SelectedsChildrenCollectionObservable = InitAsd(SelectedsChildren);
.Switch() ParentsChildrenCollectionObservable = InitAsd(ParentsChildren);
.Publish(null)
.RefCount();
CurrentItems.Subscribe(children => CurrentItems.Subscribe(children =>
{ {
@@ -119,7 +118,8 @@ public partial class TabViewModel : ITabViewModel, IDisposable
IObservable<IObservable<IChangeSet<IItemViewModel>>?> InitSelectedsChildren() IObservable<IObservable<IChangeSet<IItemViewModel>>?> InitSelectedsChildren()
{ {
var currentSelectedItemThrottled = CurrentSelectedItem.Throttle(TimeSpan.FromMilliseconds(250)).Publish(null).RefCount(); var currentSelectedItemThrottled =
CurrentSelectedItem.Throttle(TimeSpan.FromMilliseconds(250)).Publish(null).RefCount();
return Observable.Merge( return Observable.Merge(
currentSelectedItemThrottled currentSelectedItemThrottled
.WhereNotNull() .WhereNotNull()
@@ -127,7 +127,9 @@ public partial class TabViewModel : ITabViewModel, IDisposable
.Where(c => c?.Container is not null) .Where(c => c?.Container is not null)
.Select(c => c.Container!.Items) .Select(c => c.Container!.Items)
.Switch() .Switch()
.Select(i => i?.TransformAsync(MapItem).Transform(MapItemToViewModel)), .Select(i =>
i?.TransformAsync(MapItem)
.Transform(i => MapItemToViewModel(i, ItemViewModelType.SelectedChild))),
currentSelectedItemThrottled currentSelectedItemThrottled
.Where(c => c is null || c is not IContainerViewModel) .Where(c => c is null || c is not IContainerViewModel)
.Select(_ => (IObservable<IChangeSet<IItemViewModel>>?) null) .Select(_ => (IObservable<IChangeSet<IItemViewModel>>?) null)
@@ -153,7 +155,9 @@ public partial class TabViewModel : ITabViewModel, IDisposable
.Switch() .Switch()
.Select(p => p.Items) .Select(p => p.Items)
.Switch() .Switch()
.Select(items => items?.TransformAsync(MapItem).Transform(MapItemToViewModel)), .Select(items =>
items?.TransformAsync(MapItem)
.Transform(i => MapItemToViewModel(i, ItemViewModelType.Parent))),
parentThrottled parentThrottled
.Where(p => p is null) .Where(p => p is null)
.Select(_ => (IObservable<IChangeSet<IItemViewModel>>?) null) .Select(_ => (IObservable<IChangeSet<IItemViewModel>>?) null)
@@ -163,29 +167,47 @@ public partial class TabViewModel : ITabViewModel, IDisposable
.Publish(null) .Publish(null)
.RefCount(); .RefCount();
} }
IObservable<IReadOnlyCollection<IItemViewModel>?> InitAsd(
IObservable<IObservable<IChangeSet<IItemViewModel>>?> source)
{
return source
.Select(c =>
c != null ? c.ToCollection() : Observable.Return((IReadOnlyCollection<IItemViewModel>?) null))
.Switch()
.Publish(null)
.RefCount();
}
} }
private static async Task<IItem> MapItem(IAbsolutePath item) private static async Task<IItem> MapItem(IAbsolutePath item)
=> await item.ResolveAsync(forceResolve: true, itemInitializationSettings: new ItemInitializationSettings(true)); => await item.ResolveAsync(forceResolve: true,
itemInitializationSettings: new ItemInitializationSettings(true));
private IItemViewModel MapItemToViewModel(IItem item) private IItemViewModel MapItemToViewModel(IItem item, ItemViewModelType type)
{ {
if (item is IContainer container) if (item is IContainer container)
{ {
var containerViewModel = _serviceProvider.GetInitableResolver<IContainer, ITabViewModel>(container, this).GetRequiredService<IContainerViewModel>(); var containerViewModel = _serviceProvider
.GetInitableResolver<IContainer, ITabViewModel, ItemViewModelType>(container, this, type)
.GetRequiredService<IContainerViewModel>();
return containerViewModel; return containerViewModel;
} }
else if (item is IFileElement fileElement) else if (item is IFileElement fileElement)
{ {
var fileViewModel = _serviceProvider.GetInitableResolver<IFileElement, ITabViewModel>(fileElement, this).GetRequiredService<IFileViewModel>(); var fileViewModel = _serviceProvider
.GetInitableResolver<IFileElement, ITabViewModel, ItemViewModelType>(fileElement, this, type)
.GetRequiredService<IFileViewModel>();
fileViewModel.Size = fileElement.Size; fileViewModel.Size = fileElement.Size;
return fileViewModel; return fileViewModel;
} }
else if (item is IElement element) else if (item is IElement element)
{ {
var elementViewModel = _serviceProvider.GetInitableResolver<IElement, ITabViewModel>(element, this).GetRequiredService<IElementViewModel>(); var elementViewModel = _serviceProvider
.GetInitableResolver<IElement, ITabViewModel, ItemViewModelType>(element, this, type)
.GetRequiredService<IElementViewModel>();
return elementViewModel; return elementViewModel;
} }
@@ -237,9 +259,12 @@ public partial class TabViewModel : ITabViewModel, IDisposable
{ {
disposable.Dispose(); disposable.Dispose();
} }
catch { } catch
{
} }
} }
}
disposed = true; disposed = true;
} }
} }

View File

@@ -44,33 +44,39 @@
</LinearGradientBrush> </LinearGradientBrush>
<SolidColorBrush Color="{DynamicResource AppBackgroundColor}" x:Key="AppBackgroundBrush" /> <SolidColorBrush Color="{DynamicResource AppBackgroundColor}" x:Key="AppBackgroundBrush" />
<SolidColorBrush Color="{DynamicResource ContainerBackgroundColor}" x:Key="ContainerBackgroundBrush" /> <SolidColorBrush Color="{DynamicResource ContainerBackgroundColor}" x:Key="ContainerBackgroundBrush" />
<SolidColorBrush Color="{DynamicResource TransparentContainerBackgroundColor}" x:Key="TransparentContainerBackgroundBrush" /> <SolidColorBrush Color="{DynamicResource TransparentContainerBackgroundColor}"
x:Key="TransparentContainerBackgroundBrush" />
<SolidColorBrush Color="{DynamicResource ItemBackgroundColor}" x:Key="ItemBackgroundBrush" /> <SolidColorBrush Color="{DynamicResource ItemBackgroundColor}" x:Key="ItemBackgroundBrush" />
<SolidColorBrush Color="{DynamicResource AlternativeItemBackgroundColor}" x:Key="AlternativeItemBackgroundBrush" /> <SolidColorBrush Color="{DynamicResource AlternativeItemBackgroundColor}"
x:Key="AlternativeItemBackgroundBrush" />
<SolidColorBrush Color="{DynamicResource SelectedItemBackgroundColor}" x:Key="SelectedItemBackgroundBrush" /> <SolidColorBrush Color="{DynamicResource SelectedItemBackgroundColor}" x:Key="SelectedItemBackgroundBrush" />
<SolidColorBrush Color="{DynamicResource MarkedItemBackgroundColor}" x:Key="MarkedItemBackgroundBrush" /> <SolidColorBrush Color="{DynamicResource MarkedItemBackgroundColor}" x:Key="MarkedItemBackgroundBrush" />
<SolidColorBrush Color="{DynamicResource MarkedSelectedItemBackgroundColor}" x:Key="MarkedSelectedItemBackgroundBrush" /> <SolidColorBrush Color="{DynamicResource MarkedSelectedItemBackgroundColor}"
<SolidColorBrush Color="{DynamicResource MarkedAlternativeItemBackgroundColor}" x:Key="MarkedAlternativeItemBackgroundBrush" /> x:Key="MarkedSelectedItemBackgroundBrush" />
<SolidColorBrush Color="{DynamicResource MarkedAlternativeItemBackgroundColor}"
x:Key="MarkedAlternativeItemBackgroundBrush" />
<SolidColorBrush Color="{DynamicResource ForegroundColor}" x:Key="ForegroundBrush" /> <SolidColorBrush Color="{DynamicResource ForegroundColor}" x:Key="ForegroundBrush" />
<SolidColorBrush Color="{DynamicResource AccentColor}" x:Key="AccentBrush" /> <SolidColorBrush Color="{DynamicResource AccentColor}" x:Key="AccentBrush" />
<SolidColorBrush Color="{DynamicResource AccentComplementColor}" x:Key="AccentComplementBrush" /> <SolidColorBrush Color="{DynamicResource AccentComplementColor}" x:Key="AccentComplementBrush" />
<SolidColorBrush Color="{DynamicResource LightForegroundColor}" x:Key="LightForegroundBrush" /> <SolidColorBrush Color="{DynamicResource LightForegroundColor}" x:Key="LightForegroundBrush" />
<SolidColorBrush Color="{DynamicResource AlternativeItemForegroundColor}" x:Key="AlternativeItemForegroundBrush" /> <SolidColorBrush Color="{DynamicResource AlternativeItemForegroundColor}"
x:Key="AlternativeItemForegroundBrush" />
<SolidColorBrush Color="{DynamicResource SelectedItemForegroundColor}" x:Key="SelectedItemForegroundBrush" /> <SolidColorBrush Color="{DynamicResource SelectedItemForegroundColor}" x:Key="SelectedItemForegroundBrush" />
<SolidColorBrush Color="{DynamicResource MarkedItemForegroundColor}" x:Key="MarkedItemForegroundBrush" /> <SolidColorBrush Color="{DynamicResource MarkedItemForegroundColor}" x:Key="MarkedItemForegroundBrush" />
<SolidColorBrush Color="{DynamicResource MarkedAlternativeItemForegroundColor}" x:Key="MarkedAlternativeItemForegroundBrush" /> <SolidColorBrush Color="{DynamicResource MarkedAlternativeItemForegroundColor}"
<SolidColorBrush Color="{DynamicResource MarkedSelectedItemForegroundColor}" x:Key="MarkedSelectedItemForegroundBrush" /> x:Key="MarkedAlternativeItemForegroundBrush" />
<SolidColorBrush Color="{DynamicResource MarkedSelectedItemForegroundColor}"
x:Key="MarkedSelectedItemForegroundBrush" />
<SolidColorBrush Color="{DynamicResource ErrorColor}" x:Key="ErrorBrush" /> <SolidColorBrush Color="{DynamicResource ErrorColor}" x:Key="ErrorBrush" />
<SolidColorBrush Color="{DynamicResource SelectedItemBackgroundColor}" x:Key="SystemControlHighlightListAccentLowBrush" /> <SolidColorBrush Color="{DynamicResource SelectedItemBackgroundColor}"
x:Key="SystemControlHighlightListAccentLowBrush" />
<converters:ItemViewModeToBrushConverter <converters:ItemViewModeToBrushConverter
@@ -91,14 +97,17 @@
x:Key="ItemViewModeToBackgroundConverter" /> x:Key="ItemViewModeToBackgroundConverter" />
<converters:NamePartShrinkerConverter x:Key="NamePartShrinkerConverter" /> <converters:NamePartShrinkerConverter x:Key="NamePartShrinkerConverter" />
<converters:ItemViewModelIsAttributeTypeConverter x:Key="ItemViewModelIsAttributeTypeConverter" /> <converters:ItemViewModelIsAttributeTypeConverter x:Key="ItemViewModelIsAttributeTypeConverter" />
<converters:ItemViewModelIsAttributeTypeConverter Invert="true" x:Key="ItemViewModelIsNotAttributeTypeConverter" /> <converters:ItemViewModelIsAttributeTypeConverter Invert="true"
x:Key="ItemViewModelIsNotAttributeTypeConverter" />
<converters:GetFileExtensionConverter x:Key="GetFileExtensionConverter" /> <converters:GetFileExtensionConverter x:Key="GetFileExtensionConverter" />
<converters:FormatSizeConverter x:Key="FormatSizeConverter" /> <converters:FormatSizeConverter x:Key="FormatSizeConverter" />
<converters:DateTimeConverter x:Key="DateTimeConverter" /> <converters:DateTimeConverter x:Key="DateTimeConverter" />
<converters:SplitStringConverter x:Key="SplitStringConverter" /> <converters:SplitStringConverter x:Key="SplitStringConverter" />
<converters:CompareConverter x:Key="EqualityConverter" /> <converters:CompareConverter x:Key="EqualityConverter" />
<converters:CompareConverter ComparisonCondition="{x:Static converters:ComparisonCondition.NotEqual}" x:Key="NotEqualsConverter" /> <converters:CompareConverter ComparisonCondition="{x:Static converters:ComparisonCondition.NotEqual}"
x:Key="NotEqualsConverter" />
<converters:ExceptionToStringConverter x:Key="ExceptionToStringConverter" /> <converters:ExceptionToStringConverter x:Key="ExceptionToStringConverter" />
<converters:CommandToCommandNameConverter x:Key="CommandToCommandNameConverter" />
</ResourceDictionary> </ResourceDictionary>
</Application.Resources> </Application.Resources>

View File

@@ -0,0 +1,21 @@
using System.Globalization;
using Avalonia.Data.Converters;
using FileTime.App.Core.Command;
namespace FileTime.GuiApp.Converters;
public class CommandToCommandNameConverter : IValueConverter
{
public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
{
if(value is not Commands command) return value;
//TODO: implement
return command.ToString();
}
public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}

View File

@@ -14,7 +14,7 @@ using MvvmGen;
namespace FileTime.GuiApp.ViewModels; namespace FileTime.GuiApp.ViewModels;
[ViewModel] [ViewModel]
[Inject(typeof(IAppState), "_appState")] [Inject(typeof(IGuiAppState), "_appState")]
[Inject(typeof(ILocalContentProvider), "_localContentProvider")] [Inject(typeof(ILocalContentProvider), "_localContentProvider")]
[Inject(typeof(IServiceProvider), PropertyName = "_serviceProvider")] [Inject(typeof(IServiceProvider), PropertyName = "_serviceProvider")]
[Inject(typeof(ILogger<MainWindowViewModel>), PropertyName = "_logger")] [Inject(typeof(ILogger<MainWindowViewModel>), PropertyName = "_logger")]
@@ -22,7 +22,7 @@ namespace FileTime.GuiApp.ViewModels;
public partial class MainWindowViewModel : IMainWindowViewModelBase public partial class MainWindowViewModel : IMainWindowViewModelBase
{ {
public bool Loading => false; public bool Loading => false;
public IAppState AppState => _appState; public IGuiAppState AppState => _appState;
public string Title { get; private set; } public string Title { get; private set; }
partial void OnInitialize() partial void OnInitialize()
@@ -30,7 +30,7 @@ public partial class MainWindowViewModel : IMainWindowViewModelBase
_logger?.LogInformation($"Starting {nameof(MainWindowViewModel)} initialization..."); _logger?.LogInformation($"Starting {nameof(MainWindowViewModel)} initialization...");
var version = Assembly.GetEntryAssembly()!.GetName().Version; var version = Assembly.GetEntryAssembly()!.GetName().Version;
var versionString = "Unknwon version"; var versionString = "Unknown version";
if (version != null) if (version != null)
{ {
versionString = $"{version.Major}.{version.Minor}.{version.Build}"; versionString = $"{version.Major}.{version.Minor}.{version.Build}";

View File

@@ -7,6 +7,7 @@
xmlns:local="using:FileTime.GuiApp.Views" xmlns:local="using:FileTime.GuiApp.Views"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="using:FileTime.GuiApp.ViewModels" xmlns:vm="using:FileTime.GuiApp.ViewModels"
xmlns:config="using:FileTime.GuiApp.Configuration"
Title="FileTime" Title="FileTime"
d:DesignHeight="450" d:DesignHeight="450"
d:DesignWidth="800" d:DesignWidth="800"
@@ -180,7 +181,8 @@
Fill="{DynamicResource ContentSeparatorBrush}" /> Fill="{DynamicResource ContentSeparatorBrush}" />
<Grid Grid.Column="4"> <Grid Grid.Column="4">
<Grid IsVisible="{Binding AppState.SelectedTab^.SelectedsChildrenCollection.Collection, Converter={x:Static ObjectConverters.IsNotNull}}"> <Grid
IsVisible="{Binding AppState.SelectedTab^.SelectedsChildrenCollection.Collection, Converter={x:Static ObjectConverters.IsNotNull}}">
<ListBox <ListBox
x:Name="ChildItems" x:Name="ChildItems"
x:CompileBindings="False" x:CompileBindings="False"
@@ -232,6 +234,42 @@
</Grid> </Grid>
</Grid> </Grid>
</Grid> </Grid>
<Grid Grid.Row="3">
<Grid
IsVisible="{Binding AppState.PossibleCommands.Count, Converter={StaticResource NotEqualsConverter}, ConverterParameter=0}">
<Grid.RowDefinitions>
<RowDefinition Height="1" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Rectangle
Height="1"
Margin="10,0"
HorizontalAlignment="Stretch"
VerticalAlignment="Center"
Fill="{DynamicResource ContentSeparatorBrush}" />
<ItemsRepeater
Grid.Row="1"
Items="{Binding AppState.PossibleCommands}">
<ItemsRepeater.ItemTemplate>
<DataTemplate x:DataType="config:CommandBindingConfiguration">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding KeysDisplayText}" />
<TextBlock Grid.Column="1"
Text="{Binding Command, Converter={StaticResource CommandToCommandNameConverter}}" />
</Grid>
</DataTemplate>
</ItemsRepeater.ItemTemplate>
</ItemsRepeater>
</Grid>
</Grid>
</Grid> </Grid>
</Grid> </Grid>
<!-- Borders --> <!-- Borders -->