WIP CommandScheduler UI

This commit is contained in:
2023-01-31 23:26:36 +01:00
parent 06a9fc27d7
commit 30ecc6e515
37 changed files with 553 additions and 181 deletions

View File

@@ -1,106 +0,0 @@
using System.Collections.ObjectModel;
using System.ComponentModel;
using DynamicData;
using PropertyChanged.SourceGenerator;
namespace FileTime.App.Core.Models;
public partial class BindedCollection<T> : IDisposable, INotifyPropertyChanged
{
private readonly IDisposable? _disposable;
private IDisposable? _innerDisposable;
[Notify] private ReadOnlyObservableCollection<T>? _collection;
public BindedCollection()
{
}
public BindedCollection(IObservable<IChangeSet<T>> dynamicList)
{
_disposable = dynamicList
.Bind(out var collection)
.DisposeMany()
.Subscribe();
_collection = collection;
}
public BindedCollection(IObservable<IObservable<IChangeSet<T>>?> dynamicListSource)
{
_disposable = dynamicListSource.Subscribe(dynamicList =>
{
_innerDisposable?.Dispose();
if (dynamicList is not null)
{
_innerDisposable = dynamicList
.Bind(out var collection)
.DisposeMany()
.Subscribe();
Collection = collection;
}
else
{
Collection = null;
}
});
}
public void Dispose()
{
_disposable?.Dispose();
_innerDisposable?.Dispose();
GC.SuppressFinalize(this);
}
}
public partial class BindedCollection<T, TKey> : IDisposable, INotifyPropertyChanged where TKey : notnull
{
private readonly IDisposable? _disposable;
private IDisposable? _innerDisposable;
[Notify] private ReadOnlyObservableCollection<T>? _collection;
public BindedCollection()
{
}
public BindedCollection(IObservable<IChangeSet<T, TKey>> dynamicList)
{
_disposable = dynamicList
.Bind(out var collection)
.DisposeMany()
.Subscribe();
_collection = collection;
}
public BindedCollection(IObservable<IObservable<IChangeSet<T, TKey>>?> dynamicListSource)
{
_disposable = dynamicListSource.Subscribe(dynamicList =>
{
_innerDisposable?.Dispose();
if (dynamicList is not null)
{
_innerDisposable = dynamicList
.Bind(out var collection)
.DisposeMany()
.Subscribe();
Collection = collection;
}
else
{
Collection = null;
}
});
}
public void Dispose()
{
_disposable?.Dispose();
_innerDisposable?.Dispose();
GC.SuppressFinalize(this);
}
}

View File

@@ -0,0 +1,13 @@
namespace FileTime.App.Core.UserCommand;
public class PauseCommandSchedulerCommand : IIdentifiableUserCommand
{
public const string CommandName = "pause_command_scheduler";
public static PauseCommandSchedulerCommand Instance { get; } = new();
private PauseCommandSchedulerCommand()
{
}
public string UserCommandID => CommandName;
}

View File

@@ -0,0 +1,13 @@
namespace FileTime.App.Core.UserCommand;
public sealed class StartCommandSchedulerCommand : IIdentifiableUserCommand
{
public const string CommandName = "start_command_scheduler";
public static StartCommandSchedulerCommand Instance { get; } = new();
private StartCommandSchedulerCommand()
{
}
public string UserCommandID => CommandName;
}

View File

@@ -1,7 +1,6 @@
using System.Collections.ObjectModel;
using System.Reactive.Subjects;
using FileTime.App.Core.Models.Enums;
using FileTime.Core.Timeline;
using FileTime.App.Core.ViewModels.Timeline;
namespace FileTime.App.Core.ViewModels;
@@ -13,6 +12,7 @@ public interface IAppState
IObservable<ViewMode> ViewMode { get; }
string RapidTravelText { get; set; }
ITabViewModel? CurrentSelectedTab { get; }
ITimelineViewModel TimelineViewModel { get; }
void AddTab(ITabViewModel tabViewModel);
void RemoveTab(ITabViewModel tabViewModel);

View File

@@ -0,0 +1,8 @@
namespace FileTime.App.Core.ViewModels.Timeline;
public interface ICommandTimeStateViewModel
{
IObservable<int> TotalProgress { get; }
IObservable<string> DisplayLabel { get; }
IObservable<bool> IsSelected { get; }
}

View File

@@ -0,0 +1,9 @@
using FileTime.Core.Models;
using FileTime.Core.Timeline;
namespace FileTime.App.Core.ViewModels.Timeline;
public interface IParallelCommandsViewModel
{
BindedCollection<ICommandTimeStateViewModel> Commands { get; }
}

View File

@@ -0,0 +1,8 @@
using FileTime.Core.Models;
namespace FileTime.App.Core.ViewModels.Timeline;
public interface ITimelineViewModel
{
BindedCollection<IParallelCommandsViewModel> ParallelCommandsGroups { get; }
}