Preview refactor, Console rename form

This commit is contained in:
2023-08-14 16:42:22 +02:00
parent 2a595b2548
commit 8aa8d83598
25 changed files with 610 additions and 348 deletions

View File

@@ -6,7 +6,7 @@ using TerminalUI.Traits;
namespace TerminalUI.Controls;
public sealed partial class ItemsControl<TDataContext, TItem>
public sealed partial class ItemsControl<TDataContext, TItem>
: View<ItemsControl<TDataContext, TItem>, TDataContext>, IVisibilityChangeHandler
{
private readonly List<IView> _forceRerenderChildren = new();
@@ -17,7 +17,7 @@ public sealed partial class ItemsControl<TDataContext, TItem>
private object? _itemsSource;
[Notify] private Orientation _orientation = Orientation.Vertical;
public Func<IView<TItem>?> ItemTemplate { get; set; } = DefaultItemTemplate;
public Func<IView<TItem>> ItemTemplate { get; set; } = DefaultItemTemplate;
public IReadOnlyList<IView<TItem>> Children => _children.AsReadOnly();
@@ -41,7 +41,6 @@ public sealed partial class ItemsControl<TDataContext, TItem>
var consumer = new OcConsumer();
_children = observableDeclarative
.Selecting(i => CreateItem(i))
.OfTypeComputing<IView<TItem>>()
.For(consumer);
_itemsDisposables.Add(consumer);
}
@@ -50,16 +49,15 @@ public sealed partial class ItemsControl<TDataContext, TItem>
var consumer = new OcConsumer();
_children = readOnlyObservableDeclarative
.Selecting(i => CreateItem(i))
.OfTypeComputing<IView<TItem>>()
.For(consumer);
_itemsDisposables.Add(consumer);
}
else if (_itemsSource is ICollection<TItem> collection)
_children = collection.Select(CreateItem).OfType<IView<TItem>>().ToList();
_children = collection.Select(CreateItem).ToList();
else if (_itemsSource is TItem[] array)
_children = array.Select(CreateItem).OfType<IView<TItem>>().ToList();
_children = array.Select(CreateItem).ToList();
else if (_itemsSource is IEnumerable<TItem> enumerable)
_children = enumerable.Select(CreateItem).OfType<IView<TItem>>().ToList();
_children = enumerable.Select(CreateItem).ToList();
else if (value is null)
{
_children = new List<IView<TItem>>();
@@ -173,14 +171,14 @@ public sealed partial class ItemsControl<TDataContext, TItem>
return neededRerender;
}
private IView<TItem>? CreateItem(TItem dataContext)
private IView<TItem> CreateItem(TItem dataContext)
{
var newItem = ItemTemplate();
AddChild(newItem, _ => dataContext);
return newItem;
}
private static IView<TItem>? DefaultItemTemplate() => null;
private static IView<TItem> DefaultItemTemplate() => new TextBlock<TItem> {Text = typeof(TItem).ToString()};
public void ChildVisibilityChanged(IView child)
{

View File

@@ -1,6 +1,7 @@
using System.Buffers;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Diagnostics;
using System.Runtime.CompilerServices;
using GeneralInputKey;
using PropertyChanged.SourceGenerator;
@@ -321,6 +322,7 @@ public abstract partial class View<TConcrete, T> : IView<T> where TConcrete : Vi
public virtual TChild AddChild<TChild>(TChild child) where TChild : IView<T>
{
Debug.Assert(child != null);
child.DataContext = DataContext;
var mapper = new DataContextMapper<T, T>(this, child, d => d);
SetupNewChild(child, mapper);
@@ -331,6 +333,7 @@ public abstract partial class View<TConcrete, T> : IView<T> where TConcrete : Vi
public virtual TChild AddChild<TChild, TDataContext>(TChild child, Func<T?, TDataContext?> dataContextMapper)
where TChild : IView<TDataContext>
{
Debug.Assert(child != null);
child.DataContext = dataContextMapper(DataContext);
var mapper = new DataContextMapper<T, TDataContext>(this, child, dataContextMapper);
SetupNewChild(child, mapper);
@@ -395,7 +398,7 @@ public abstract partial class View<TConcrete, T> : IView<T> where TConcrete : Vi
_disposables.Clear();
KeyHandlers.Clear();
Disposed?.Invoke(this);
}
}
@@ -411,7 +414,7 @@ public abstract partial class View<TConcrete, T> : IView<T> where TConcrete : Vi
{
foreach (var keyHandler in KeyHandlers)
{
keyHandler((TConcrete)this, keyEventArgs);
keyHandler((TConcrete) this, keyEventArgs);
if (keyEventArgs.Handled) return;
}
}
@@ -427,6 +430,6 @@ public abstract partial class View<TConcrete, T> : IView<T> where TConcrete : Vi
public TConcrete WithKeyHandler(Action<TConcrete, GeneralKeyEventArgs> keyHandler)
{
KeyHandlers.Add(keyHandler);
return (TConcrete)this;
return (TConcrete) this;
}
}