TerminalUI theming, Commands panel

This commit is contained in:
2023-08-15 20:23:58 +02:00
parent b792639635
commit d175c7bf7e
27 changed files with 604 additions and 77 deletions

View File

@@ -153,6 +153,8 @@ public sealed class Grid<T> : ChildContainerView<Grid<T>, T>, IVisibilityChangeH
protected override bool DefaultRenderer(in RenderContext renderContext, Position position, Size size)
{
if (size.Width == 0 || size.Height == 0) return false;
return WithCalculatedSize(
renderContext,
new Option<Size>(size, true),
@@ -177,29 +179,34 @@ public sealed class Grid<T> : ChildContainerView<Grid<T>, T>, IVisibilityChangeH
);
var viewsByPosition = GroupViewsByPosition(columnWidths.Length, rowHeights.Length);
var anyRendered = false;
for (var column = 0; column < columnWidths.Length; column++)
{
for (var row = 0; row < rowHeights.Length; row++)
{
RenderViewsByPosition(
childContext,
position,
columnWidths,
rowHeights,
viewsByPosition,
column,
row,
forceRerenderChildren
);
anyRendered =
RenderViewsByPosition(
childContext,
position,
size,
columnWidths,
rowHeights,
viewsByPosition,
column,
row,
forceRerenderChildren
)
|| anyRendered;
}
}
return true;
return anyRendered;
}
}
private void RenderViewsByPosition(RenderContext context,
private bool RenderViewsByPosition(RenderContext context,
Position gridPosition,
Size gridSize,
ReadOnlySpan<int> columnWidths,
ReadOnlySpan<int> rowHeights,
IReadOnlyDictionary<(int, int), List<IView>> viewsByPosition,
@@ -207,7 +214,7 @@ public sealed class Grid<T> : ChildContainerView<Grid<T>, T>, IVisibilityChangeH
int row,
IReadOnlyList<IView> forceRerenderChildren)
{
if (!viewsByPosition.TryGetValue((column, row), out var children)) return;
if (!viewsByPosition.TryGetValue((column, row), out var children)) return false;
var width = columnWidths[column];
var height = rowHeights[row];
@@ -221,6 +228,18 @@ public sealed class Grid<T> : ChildContainerView<Grid<T>, T>, IVisibilityChangeH
row
);
if (renderPosition.X + width > gridPosition.X + gridSize.Width)
{
renderSize = renderSize with {Width = gridPosition.X + gridSize.Width - renderPosition.X};
}
if (renderPosition.Y + height > gridPosition.Y + gridSize.Height)
{
renderSize = renderSize with {Height = gridPosition.Y + gridSize.Height - renderPosition.Y};
}
if (renderSize.Width == 0 || renderSize.Height == 0) return false;
var needsRerender = children.Any(forceRerenderChildren.Contains);
if (needsRerender)
{
@@ -251,6 +270,8 @@ public sealed class Grid<T> : ChildContainerView<Grid<T>, T>, IVisibilityChangeH
}
}
return true;
static Position GetRenderPosition(
Position gridPosition,
ReadOnlySpan<int> columnWidths,