diff --git a/src/Library/TerminalUI/Controls/Border.cs b/src/Library/TerminalUI/Controls/Border.cs index 07f17b8..e808fa0 100644 --- a/src/Library/TerminalUI/Controls/Border.cs +++ b/src/Library/TerminalUI/Controls/Border.cs @@ -1,9 +1,10 @@ -using PropertyChanged.SourceGenerator; +using PropertyChanged.SourceGenerator; using TerminalUI.Models; +using TerminalUI.Traits; namespace TerminalUI.Controls; -public partial class Border : ContentView +public partial class Border : ContentView, IDisplayView { [Notify] private Thickness _borderThickness = 1; [Notify] private Thickness _padding = 0; diff --git a/src/Library/TerminalUI/Controls/Rectangle.cs b/src/Library/TerminalUI/Controls/Rectangle.cs index caecbc0..1a7df6d 100644 --- a/src/Library/TerminalUI/Controls/Rectangle.cs +++ b/src/Library/TerminalUI/Controls/Rectangle.cs @@ -1,10 +1,11 @@ using PropertyChanged.SourceGenerator; using TerminalUI.Color; using TerminalUI.Models; +using TerminalUI.Traits; namespace TerminalUI.Controls; -public partial class Rectangle : View +public partial class Rectangle : View, IDisplayView { private record RenderState( Position Position, diff --git a/src/Library/TerminalUI/Controls/TextBlock.cs b/src/Library/TerminalUI/Controls/TextBlock.cs index 62904cd..f7873fb 100644 --- a/src/Library/TerminalUI/Controls/TextBlock.cs +++ b/src/Library/TerminalUI/Controls/TextBlock.cs @@ -1,14 +1,15 @@ -using System.ComponentModel; +using System.ComponentModel; using System.Diagnostics; using PropertyChanged.SourceGenerator; using TerminalUI.Color; using TerminalUI.Extensions; using TerminalUI.Models; +using TerminalUI.Traits; namespace TerminalUI.Controls; [DebuggerDisplay("Text = {Text}")] -public partial class TextBlock : View +public partial class TextBlock : View, IDisplayView { private record RenderState( Position Position, diff --git a/src/Library/TerminalUI/Controls/TextBox.cs b/src/Library/TerminalUI/Controls/TextBox.cs index a361640..628fdaf 100644 --- a/src/Library/TerminalUI/Controls/TextBox.cs +++ b/src/Library/TerminalUI/Controls/TextBox.cs @@ -1,3 +1,4 @@ +using System.Diagnostics; using GeneralInputKey; using PropertyChanged.SourceGenerator; using TerminalUI.Color; @@ -7,7 +8,8 @@ using TerminalUI.Traits; namespace TerminalUI.Controls; -public partial class TextBox : View, IFocusable +[DebuggerDisplay("Text = {Text}")] +public partial class TextBox : View, IFocusable, IDisplayView { private record RenderState( string? Text, diff --git a/src/Library/TerminalUI/Controls/View.cs b/src/Library/TerminalUI/Controls/View.cs index 372c7d8..b1afbba 100644 --- a/src/Library/TerminalUI/Controls/View.cs +++ b/src/Library/TerminalUI/Controls/View.cs @@ -1,4 +1,4 @@ -using System.Buffers; +using System.Buffers; using System.Collections.ObjectModel; using System.ComponentModel; using System.Runtime.CompilerServices; @@ -6,6 +6,7 @@ using PropertyChanged.SourceGenerator; using TerminalUI.Color; using TerminalUI.ConsoleDrivers; using TerminalUI.Models; +using TerminalUI.Traits; namespace TerminalUI.Controls; @@ -118,6 +119,7 @@ public abstract partial class View : IView public bool Render(in RenderContext renderContext, Position position, Size size) { + renderContext.Statistics.ProcessedViews++; if (!Attached) throw new InvalidOperationException("Cannot render unattached view"); @@ -149,7 +151,16 @@ public abstract partial class View : IView ); } - return RenderMethod(renderContext, position, size); + var renderResult = RenderMethod(renderContext, position, size); + if (renderResult) + { + renderContext.Statistics.RenderedViews++; + + if (this is IDisplayView) + renderContext.Statistics.RenderedDisplayViews++; + } + + return renderResult; } protected void RenderEmpty(in RenderContext renderContext, Position position, Size size) diff --git a/src/Library/TerminalUI/Models/RenderContext.cs b/src/Library/TerminalUI/Models/RenderContext.cs index 68e170a..edb0711 100644 --- a/src/Library/TerminalUI/Models/RenderContext.cs +++ b/src/Library/TerminalUI/Models/RenderContext.cs @@ -13,20 +13,30 @@ public readonly ref struct RenderContext public readonly bool ForceRerender; public readonly IColor? Foreground; public readonly IColor? Background; + public readonly RenderStatistics Statistics; public RenderContext( - IConsoleDriver consoleDriver, - bool forceRerender, - IColor? foreground, - IColor? background) + IConsoleDriver consoleDriver, + bool forceRerender, + IColor? foreground, + IColor? background, + RenderStatistics statistics) { RenderId = _renderId++; - + ConsoleDriver = consoleDriver; ForceRerender = forceRerender; Foreground = foreground; Background = background; + Statistics = statistics; } - - public static RenderContext Empty => new(null!, false, null, null); + + public static RenderContext Empty => + new( + null!, + false, + null, + null, + new RenderStatistics() + ); } \ No newline at end of file diff --git a/src/Library/TerminalUI/Models/RenderStatistics.cs b/src/Library/TerminalUI/Models/RenderStatistics.cs new file mode 100644 index 0000000..0cd5885 --- /dev/null +++ b/src/Library/TerminalUI/Models/RenderStatistics.cs @@ -0,0 +1,11 @@ +using System.Diagnostics; + +namespace TerminalUI.Models; + +[DebuggerDisplay("RenderedViews = {RenderedViews}, RenderedDisplayViews = {RenderedDisplayViews}, ProcessedViews = {ProcessedViews}")] +public class RenderStatistics +{ + public ulong RenderedViews { get; set; } + public ulong RenderedDisplayViews { get; set; } + public ulong ProcessedViews { get; set; } +} \ No newline at end of file diff --git a/src/Library/TerminalUI/RenderEngine.cs b/src/Library/TerminalUI/RenderEngine.cs index b33d61b..419224b 100644 --- a/src/Library/TerminalUI/RenderEngine.cs +++ b/src/Library/TerminalUI/RenderEngine.cs @@ -1,4 +1,4 @@ -using TerminalUI.Controls; +using TerminalUI.Controls; using TerminalUI.Models; using TerminalUI.Traits; @@ -82,7 +82,8 @@ public class RenderEngine : IRenderEngine driver, true, null, - null + null, + new RenderStatistics() ), initialPosition, size); @@ -93,7 +94,8 @@ public class RenderEngine : IRenderEngine driver, false, null, - null + null, + new RenderStatistics() ), initialPosition, size); diff --git a/src/Library/TerminalUI/Traits/IDisplayView.cs b/src/Library/TerminalUI/Traits/IDisplayView.cs new file mode 100644 index 0000000..0e2426a --- /dev/null +++ b/src/Library/TerminalUI/Traits/IDisplayView.cs @@ -0,0 +1,6 @@ +namespace TerminalUI.Traits; + +public interface IDisplayView +{ + +} \ No newline at end of file