diff --git a/Terminal.Gui/Application/Application.Run.cs b/Terminal.Gui/Application/Application.Run.cs
index e40e30c30..898fc935b 100644
--- a/Terminal.Gui/Application/Application.Run.cs
+++ b/Terminal.Gui/Application/Application.Run.cs
@@ -496,7 +496,7 @@ public static partial class Application // Run (Begin, Run, End, Stop)
public static void Wakeup () { MainLoop?.Wakeup (); }
///
- /// Causes any Toplevels that need layout to be laid out. Then draws any Toplevels that need dispplay. Only Views that need to be laid out (see ) will be laid out.
+ /// Causes any Toplevels that need layout to be laid out. Then draws any Toplevels that need display. Only Views that need to be laid out (see ) will be laid out.
/// Only Views that need to be drawn (see ) will be drawn.
///
/// If the entire View hierarchy will be redrawn. The default is and should only be overriden for testing.
@@ -509,9 +509,9 @@ public static partial class Application // Run (Begin, Run, End, Stop)
Driver?.ClearContents ();
}
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
View.Draw (TopLevels, neededLayout || forceDraw);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
Driver?.Refresh ();
}
diff --git a/Terminal.Gui/Application/Application.Screen.cs b/Terminal.Gui/Application/Application.Screen.cs
index d2d04295e..c5bf6d6fd 100644
--- a/Terminal.Gui/Application/Application.Screen.cs
+++ b/Terminal.Gui/Application/Application.Screen.cs
@@ -67,44 +67,4 @@ public static partial class Application // Screen related stuff
return true;
}
-
- #region Clip Support
- ///
- /// Sets the clip region to the screen.
- ///
- /// The previous clip region.>
- public static Region? ClipToScreen ()
- {
- Region? previous = Driver?.Clip;
- if (Driver is { })
- {
- Driver.Clip = new (Screen);
- }
-
- return previous;
- }
-
- ///
- /// Sets the clip to the specified region.
- ///
- ///
- public static void SetClip (Region? region)
- {
- if (Driver is { } && region is {})
- {
- Driver.Clip = region;
- }
- }
-
- ///
- /// Removes the specified rectangle from the Clip.
- ///
- ///
- public static void ExcludeFromClip (Rectangle rectangle)
- {
- Driver?.Clip?.Exclude (rectangle);
- }
-
- #endregion Clip Support
-
}
diff --git a/Terminal.Gui/View/Adornment/Margin.cs b/Terminal.Gui/View/Adornment/Margin.cs
index 9132e400c..fab6f2ffa 100644
--- a/Terminal.Gui/View/Adornment/Margin.cs
+++ b/Terminal.Gui/View/Adornment/Margin.cs
@@ -60,10 +60,10 @@ public class Margin : Adornment
if (view.Margin is { CachedClip: { } })
{
view.Margin.NeedsDraw = true;
- Region? saved = Driver?.Clip;
- Application.SetClip (view.Margin.CachedClip);
+ Region? saved = GetClip ();
+ View.SetClip (view.Margin.CachedClip);
view.Margin.Draw ();
- Application.SetClip (saved);
+ View.SetClip (saved);
view.Margin.CachedClip = null;
}
diff --git a/Terminal.Gui/View/View.Diagnostics.cs b/Terminal.Gui/View/View.Diagnostics.cs
index 6cf51985f..8b67e50a8 100644
--- a/Terminal.Gui/View/View.Diagnostics.cs
+++ b/Terminal.Gui/View/View.Diagnostics.cs
@@ -38,7 +38,7 @@ public partial class View
/// gets set to this property by default, enabling and .
///
///
- /// is enabled for all Views independently of Adornments.
+ /// and are enabled for all Views independently of Adornments.
///
///
public static ViewDiagnosticFlags Diagnostics { get; set; }
diff --git a/Terminal.Gui/View/View.Drawing.Clipping.cs b/Terminal.Gui/View/View.Drawing.Clipping.cs
index d3d3c1499..9d4058cd3 100644
--- a/Terminal.Gui/View/View.Drawing.Clipping.cs
+++ b/Terminal.Gui/View/View.Drawing.Clipping.cs
@@ -1,38 +1,123 @@
#nullable enable
+using static Unix.Terminal.Curses;
+
namespace Terminal.Gui;
public partial class View
{
- internal Region? SetClipToFrame ()
+ ///
+ /// Gets the current Clip region.
+ ///
+ ///
+ ///
+ /// There is a single clip region for the entire application.
+ ///
+ ///
+ /// This method returns the current clip region, not a clone. If there is a need to modify the clip region, it is recommended to clone it first.
+ ///
+ ///
+ /// The current Clip.
+ public static Region? GetClip ()
+ {
+ return Application.Driver?.Clip;
+ }
+
+ ///
+ /// Sets the Clip to the specified region.
+ ///
+ ///
+ ///
+ /// There is a single clip region for the entire application. This method sets the clip region to the specified region.
+ ///
+ ///
+ ///
+ public static void SetClip (Region? region)
+ {
+ if (Driver is { } && region is { })
+ {
+ Driver.Clip = region;
+ }
+ }
+
+ ///
+ /// Sets the Clip to be the rectangle of the screen.
+ ///
+ ///
+ ///
+ /// There is a single clip region for the entire application. This method sets the clip region to the screen.
+ ///
+ ///
+ /// This method returns the current clip region, not a clone. If there is a need to modify the clip region, it is recommended to clone it first.
+ ///
+ ///
+ ///
+ /// The current Clip, which can be then re-applied
+ ///
+ public static Region? SetClipToScreen ()
+ {
+ Region? previous = GetClip ();
+ if (Driver is { })
+ {
+ Driver.Clip = new (Application.Screen);
+ }
+
+ return previous;
+ }
+
+ ///
+ /// Removes the specified rectangle from the Clip.
+ ///
+ ///
+ ///
+ /// There is a single clip region for the entire application.
+ ///
+ ///
+ ///
+ public static void ExcludeFromClip (Rectangle rectangle)
+ {
+ Driver?.Clip?.Exclude (rectangle);
+ }
+
+ ///
+ /// Changes the Clip to the intersection of the current Clip and the of this View.
+ ///
+ ///
+ ///
+ /// This method returns the current clip region, not a clone. If there is a need to modify the clip region, it is recommended to clone it first.
+ ///
+ ///
+ ///
+ /// The current Clip, which can be then re-applied
+ ///
+ internal Region? ClipFrame ()
{
if (Driver is null)
{
return null;
}
- Region previous = Driver.Clip ?? new (Application.Screen);
+ Region previous = GetClip () ?? new (Application.Screen);
- Region frameRegion = Driver.Clip!.Clone ();
+ Region frameRegion = previous.Clone ();
// Translate viewportRegion to screen-relative coords
Rectangle screenRect = FrameToScreen ();
frameRegion.Intersect (screenRect);
if (this is Adornment adornment && adornment.Thickness != Thickness.Empty)
{
- // Ensure adornments can't draw outside thier thickness
+ // Ensure adornments can't draw outside their thickness
frameRegion.Exclude (adornment.Thickness.GetInside (Frame));
}
- Application.SetClip (frameRegion);
+ View.SetClip (frameRegion);
return previous;
-
}
- /// Sets the 's clip region to .
+ /// Changes the Clip to the intersection of the current Clip and the of this View.
///
///
- /// By default, the clip rectangle is set to the intersection of the current clip region and the
+ /// By default, sets the Clip to the intersection of the current clip region and the
/// . This ensures that drawing is constrained to the viewport, but allows
/// content to be drawn beyond the viewport.
///
@@ -40,21 +125,25 @@ public partial class View
/// If has set, clipping will be
/// applied to just the visible content area.
///
+ ///
+ ///
+ /// This method returns the current clip region, not a clone. If there is a need to modify the clip region, it is recommended to clone it first.
+ ///
+ ///
///
///
- /// The current screen-relative clip region, which can be then re-applied by setting
- /// .
+ /// The current Clip, which can be then re-applied
///
- public Region? SetClipToViewport ()
+ public Region? ClipViewport ()
{
if (Driver is null)
{
return null;
}
- Region previous = Driver.Clip ?? new (Application.Screen);
+ Region previous = GetClip () ?? new (Application.Screen);
- Region viewportRegion = Driver.Clip!.Clone ();
+ Region viewportRegion = previous.Clone ();
Rectangle viewport = ViewportToScreen (new Rectangle (Point.Empty, Viewport.Size));
viewportRegion?.Intersect (viewport);
@@ -72,32 +161,8 @@ public partial class View
viewportRegion?.Exclude (adornment.Thickness.GetInside (viewport));
}
- Application.SetClip (viewportRegion);
+ View.SetClip (viewportRegion);
return previous;
}
-
- /// Gets the view-relative clip region.
- public Region? GetClip ()
- {
- // get just the portion of the application clip that is within this view's Viewport
- if (Driver is null)
- {
- return null;
- }
-
- // Get our Viewport in screen coordinates
- Rectangle screen = ViewportToScreen (Viewport with { Location = Point.Empty });
-
- // Get the clip region in screen coordinates
- Region? clip = Driver.Clip;
- if (clip is null)
- {
- return null;
- }
- Region? previous = Driver.Clip;
- clip = clip.Clone ();
- clip.Intersect (screen);
- return clip;
- }
}
diff --git a/Terminal.Gui/View/View.Drawing.Primitives.cs b/Terminal.Gui/View/View.Drawing.Primitives.cs
index 8160fdd07..f76162c94 100644
--- a/Terminal.Gui/View/View.Drawing.Primitives.cs
+++ b/Terminal.Gui/View/View.Drawing.Primitives.cs
@@ -116,12 +116,12 @@ public partial class View
return;
}
- Region prevClip = SetClipToViewport ();
+ Region prevClip = ClipViewport ();
Rectangle toClear = ViewportToScreen (rect);
Attribute prev = SetAttribute (new (color ?? GetNormalColor ().Background));
Driver.FillRect (toClear);
SetAttribute (prev);
- Application.SetClip (prevClip);
+ View.SetClip (prevClip);
}
#endregion Drawing Primitives
diff --git a/Terminal.Gui/View/View.Drawing.cs b/Terminal.Gui/View/View.Drawing.cs
index 80cd69cd9..3d3884d87 100644
--- a/Terminal.Gui/View/View.Drawing.cs
+++ b/Terminal.Gui/View/View.Drawing.cs
@@ -46,19 +46,19 @@ public partial class View // Drawing APIs
return;
}
- Region? saved = Driver?.Clip;
+ Region? saved = GetClip ();
if (NeedsDraw || SubViewNeedsDraw)
{
- saved = SetClipToFrame ();
- DoDrawAdornments ();
- Application.SetClip (saved);
+ saved = ClipFrame ();
+ DoDrawBorderAndPadding ();
+ View.SetClip (saved);
// By default, we clip to the viewport preventing drawing outside the viewport
// We also clip to the content, but if a developer wants to draw outside the viewport, they can do
// so via settings. SetClip honors the ViewportSettings.DisableVisibleContentClipping flag.
// Get our Viewport in screen coordinates
- saved = SetClipToViewport ();
+ saved = ClipViewport ();
// TODO: Simplify/optimize SetAttribute system.
DoSetAttribute ();
@@ -79,15 +79,13 @@ public partial class View // Drawing APIs
// Restore the clip before rendering the line canvas and adornment subviews
// because they may draw outside the viewport.
- Application.SetClip (saved);
+ SetClip (saved);
- saved = SetClipToFrame ();
+ saved = ClipFrame ();
- //DoSetAttribute ();
DoRenderLineCanvas ();
- //DoSetAttribute ();
- DoDrawAdornmentSubViews ();
+ DoDrawBorderAndPaddingSubViews ();
if (Border is { Diagnostics: ViewDiagnosticFlags.DrawIndicator, DrawIndicator: { } })
{
@@ -99,19 +97,21 @@ public partial class View // Drawing APIs
}
// This causes the Margin to be drawn in a second pass
- // TODO: Figure out how to make this more efficient
+ // PERFORMANCE: If there is a Margin, it will be redrawn each iteration of the main loop.
if (Margin is { } && Margin?.Thickness != Thickness.Empty)
{
- Margin!.CachedClip = Application.Driver?.Clip?.Clone ();
+ // PERFORMANCE: How expensive are these clones?
+ Margin!.CachedClip = GetClip ()!.Clone ();
}
// We're done drawing
DoDrawComplete ();
- // QUESTION: SHould this go before DoDrawComplete?
- Application.SetClip (saved);
- // Exclude this view from the clip
- if (this is not Adornment && Driver?.Clip is { })
+ // QUESTION: Should this go before DoDrawComplete? What is more correct?
+ View.SetClip (saved);
+
+ // Exclude this view (not including Margin) from the Clip
+ if (this is not Adornment && GetClip () is { })
{
Rectangle borderFrame = FrameToScreen ();
@@ -120,21 +120,14 @@ public partial class View // Drawing APIs
borderFrame = Border.FrameToScreen ();
}
- Application.ExcludeFromClip (borderFrame);
+ ExcludeFromClip (borderFrame);
}
}
#region DrawAdornments
- private void DoDrawAdornmentSubViews ()
+ private void DoDrawBorderAndPaddingSubViews ()
{
- //if (Margin?.Subviews is { } && Margin.Thickness != Thickness.Empty)
- //{
- // //Region? saved = Margin?.SetClipToFrame ();
- // //Margin?.DoDrawSubviews ();
- // //Application.SetClip (saved);
- //}
-
if (Border?.Subviews is { } && Border.Thickness != Thickness.Empty)
{
foreach (View subview in Border.Subviews)
@@ -142,9 +135,9 @@ public partial class View // Drawing APIs
subview.SetNeedsDraw ();
}
- Region? saved = Border?.SetClipToFrame ();
+ Region? saved = Border?.ClipFrame ();
Border?.DoDrawSubviews ();
- Application.SetClip (saved);
+ SetClip (saved);
}
if (Padding?.Subviews is { } && Padding.Thickness != Thickness.Empty)
@@ -154,36 +147,38 @@ public partial class View // Drawing APIs
subview.SetNeedsDraw ();
}
- Region? saved = Padding?.SetClipToFrame ();
+ Region? saved = Padding?.ClipFrame ();
Padding?.DoDrawSubviews ();
- Application.SetClip (saved);
+ SetClip (saved);
}
}
- private void DoDrawAdornments ()
+ private void DoDrawBorderAndPadding ()
{
- if (OnDrawingAdornments ())
+ if (OnDrawingBorderAndPadding ())
{
return;
}
// TODO: add event.
- DrawAdornments ();
+ DrawBorderAndPadding ();
}
///
- /// Causes each of the View's Adornments to be drawn. This includes the , , and .
+ /// Causes and to be drawn.
///
- public void DrawAdornments ()
+ ///
+ ///
+ /// is drawn in a separate pass.
+ ///
+ ///
+ public void DrawBorderAndPadding ()
{
+ // We do not attempt to draw Margin. It is drawn in a separate pass.
+
// Each of these renders lines to either this View's LineCanvas
// Those lines will be finally rendered in OnRenderLineCanvas
- if (Margin is { } && Margin.Thickness != Thickness.Empty)
- {
- //Margin?.Draw ();
- }
-
if (Border is { } && Border.Thickness != Thickness.Empty)
{
Border?.Draw ();
@@ -202,7 +197,7 @@ public partial class View // Drawing APIs
/// false (the default), this method will cause the be prepared to be rendered.
///
/// to stop further drawing of the Adornments.
- protected virtual bool OnDrawingAdornments () { return false; }
+ protected virtual bool OnDrawingBorderAndPadding () { return false; }
#endregion DrawAdornments
@@ -379,7 +374,6 @@ public partial class View // Drawing APIs
TextFormatter.NeedsFormat = true;
}
- // This should NOT clear
// TODO: If the output is not in the Viewport, do nothing
var drawRect = new Rectangle (ContentToScreen (Point.Empty), GetContentSize ());
@@ -484,22 +478,8 @@ public partial class View // Drawing APIs
return;
}
-#if HACK_DRAW_OVERLAPPED
- IEnumerable subviewsNeedingDraw = _subviews.Where (view => (view.Visible && (view.NeedsDraw || view.SubViewNeedsDraw))
- || view.Arrangement.HasFlag (ViewArrangement.Overlapped));
-#else
- IEnumerable subviewsNeedingDraw = _subviews.Where (view => (view.Visible));
-#endif
-
- foreach (View view in subviewsNeedingDraw.Reverse ())
+ foreach (View view in _subviews.Where (view => view.Visible).Reverse ())
{
-#if HACK_DRAW_OVERLAPPED
- if (view.Arrangement.HasFlag (ViewArrangement.Overlapped))
- {
-
- view.SetNeedsDraw ();
- }
-#endif
view.Draw ();
}
}
@@ -533,7 +513,7 @@ public partial class View // Drawing APIs
///
/// Gets or sets whether this View will use it's SuperView's for rendering any
/// lines. If the rendering of any borders drawn by this Frame will be done by its parent's
- /// SuperView. If (the default) this View's method will be
+ /// SuperView. If (the default) this View's method will be
/// called to render the borders.
///
public virtual bool SuperViewRendersLineCanvas { get; set; } = false;
@@ -608,7 +588,6 @@ public partial class View // Drawing APIs
DrawComplete?.Invoke (this, new (Viewport, Viewport));
// Default implementation does nothing.
-
}
///
@@ -764,7 +743,6 @@ public partial class View // Drawing APIs
_needsDrawRect = Rectangle.Empty;
SubViewNeedsDraw = false;
-
if (Margin is { } && Margin.Thickness != Thickness.Empty)
{
Margin?.ClearNeedsDraw ();
diff --git a/Terminal.Gui/Views/GraphView/Annotations.cs b/Terminal.Gui/Views/GraphView/Annotations.cs
index 7d41ae4f9..02b67c974 100644
--- a/Terminal.Gui/Views/GraphView/Annotations.cs
+++ b/Terminal.Gui/Views/GraphView/Annotations.cs
@@ -150,7 +150,7 @@ public class LegendAnnotation : View, IAnnotation
if (BorderStyle != LineStyle.None)
{
- DrawAdornments ();
+ DrawBorderAndPadding ();
RenderLineCanvas ();
}
diff --git a/Terminal.Gui/Views/Menu/Menu.cs b/Terminal.Gui/Views/Menu/Menu.cs
index fa38e0dda..fdfab4d98 100644
--- a/Terminal.Gui/Views/Menu/Menu.cs
+++ b/Terminal.Gui/Views/Menu/Menu.cs
@@ -406,11 +406,11 @@ internal sealed class Menu : View
return;
}
- DrawAdornments ();
+ DrawBorderAndPadding ();
RenderLineCanvas ();
// BUGBUG: Views should not change the clip. Doing so is an indcation of poor design or a bug in the framework.
- Region? savedClip = Application.ClipToScreen ();
+ Region? savedClip = View.SetClipToScreen ();
SetAttribute (GetNormalColor ());
@@ -579,7 +579,7 @@ internal sealed class Menu : View
}
}
- Application.SetClip (savedClip);
+ View.SetClip (savedClip);
}
public override Point? PositionCursor ()
diff --git a/Terminal.Gui/Views/ScrollView.cs b/Terminal.Gui/Views/ScrollView.cs
index 113d35eec..aeae539ad 100644
--- a/Terminal.Gui/Views/ScrollView.cs
+++ b/Terminal.Gui/Views/ScrollView.cs
@@ -381,9 +381,9 @@ public class ScrollView : View
if (!string.IsNullOrEmpty (_contentView.Text) || _contentView.Subviews.Count > 0)
{
- Region? saved = SetClipToFrame();
+ Region? saved = ClipFrame();
_contentView.Draw ();
- Application.SetClip (saved);
+ View.SetClip (saved);
}
DrawScrollBars ();
@@ -584,24 +584,24 @@ public class ScrollView : View
{
if (ShowVerticalScrollIndicator)
{
- Region? saved = Application.ClipToScreen ();
+ Region? saved = View.SetClipToScreen ();
_vertical.Draw ();
- Application.SetClip (saved);
+ View.SetClip (saved);
}
if (ShowHorizontalScrollIndicator)
{
- Region? saved = Application.ClipToScreen ();
+ Region? saved = View.SetClipToScreen ();
_horizontal.Draw ();
- Application.SetClip (saved);
+ View.SetClip (saved);
}
if (ShowVerticalScrollIndicator && ShowHorizontalScrollIndicator)
{
SetContentBottomRightCornerVisibility ();
- Region? saved = Application.ClipToScreen ();
+ Region? saved = View.SetClipToScreen ();
_contentBottomRightCorner.Draw ();
- Application.SetClip (saved);
+ View.SetClip (saved);
}
}
}
diff --git a/Terminal.Gui/Views/TabView.cs b/Terminal.Gui/Views/TabView.cs
index 8fe189914..3d77b9b9b 100644
--- a/Terminal.Gui/Views/TabView.cs
+++ b/Terminal.Gui/Views/TabView.cs
@@ -1296,7 +1296,7 @@ public class TabView : View
// BUGBUG: Layout should only be called from Mainloop iteration!
Layout ();
- tab.DrawAdornments ();
+ tab.DrawBorderAndPadding ();
Attribute prevAttr = Driver?.GetAttribute () ?? Attribute.Default;
@@ -1321,7 +1321,7 @@ public class TabView : View
ColorScheme.HotNormal
);
- tab.DrawAdornments ();
+ tab.DrawBorderAndPadding ();
SetAttribute (GetNormalColor ());
diff --git a/Terminal.Gui/Views/TileView.cs b/Terminal.Gui/Views/TileView.cs
index 9a6acb72a..94f4c0f85 100644
--- a/Terminal.Gui/Views/TileView.cs
+++ b/Terminal.Gui/Views/TileView.cs
@@ -176,7 +176,7 @@ public class TileView : View
/// Overridden so no Frames get drawn
///
///
- protected override bool OnDrawingAdornments () { return true; }
+ protected override bool OnDrawingBorderAndPadding () { return true; }
///
///
diff --git a/UnitTests/View/Adornment/BorderTests.cs b/UnitTests/View/Adornment/BorderTests.cs
index a991e8fd9..15637d507 100644
--- a/UnitTests/View/Adornment/BorderTests.cs
+++ b/UnitTests/View/Adornment/BorderTests.cs
@@ -38,7 +38,7 @@ public class BorderTests (ITestOutputHelper output)
view.CanFocus = true;
view.SetFocus ();
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
view.Draw ();
Assert.Equal (view.GetFocusColor (), view.Border.GetFocusColor ());
Assert.Equal (view.ColorScheme.Focus.Foreground, view.Border.GetFocusColor ().Foreground);
diff --git a/UnitTests/View/Draw/DrawTests.cs b/UnitTests/View/Draw/DrawTests.cs
index c5550751f..3326ee1a1 100644
--- a/UnitTests/View/Draw/DrawTests.cs
+++ b/UnitTests/View/Draw/DrawTests.cs
@@ -93,7 +93,7 @@ public class DrawTests (ITestOutputHelper _output)
_output);
Rectangle toFill = new (x, y, width, height);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
view.FillRect (toFill);
TestHelpers.AssertDriverContentsWithFrameAre (
@@ -135,7 +135,7 @@ public class DrawTests (ITestOutputHelper _output)
_output);
toFill = new (-1, -1, width + 1, height + 1);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
view.FillRect (toFill);
TestHelpers.AssertDriverContentsWithFrameAre (
@@ -156,7 +156,7 @@ public class DrawTests (ITestOutputHelper _output)
└─┘",
_output);
toFill = new (0, 0, width * 2, height * 2);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
view.FillRect (toFill);
TestHelpers.AssertDriverContentsWithFrameAre (
@@ -203,7 +203,7 @@ public class DrawTests (ITestOutputHelper _output)
└─┘",
_output);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
view.ClearViewport ();
TestHelpers.AssertDriverContentsWithFrameAre (
@@ -241,7 +241,7 @@ public class DrawTests (ITestOutputHelper _output)
│X│
└─┘",
_output);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
view.ClearViewport ();
TestHelpers.AssertDriverContentsWithFrameAre (
@@ -319,7 +319,7 @@ public class DrawTests (ITestOutputHelper _output)
frameView.Border.Thickness = new (1, 0, 0, 0);
top.Add (frameView);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
top.Layout ();
top.Draw ();
@@ -342,7 +342,7 @@ public class DrawTests (ITestOutputHelper _output)
top.Add (view);
top.Layout ();
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
top.Draw ();
// 012345678901234567890123456789012345678
// 012 34 56 78 90 12 34 56 78 90 12 34 56 78
@@ -967,13 +967,13 @@ public class DrawTests (ITestOutputHelper _output)
view.Border.Thickness = new (1);
view.BeginInit ();
view.EndInit ();
- Assert.Equal (view.Frame, Application.Driver?.Clip?.GetBounds ());
+ Assert.Equal (view.Frame, View.GetClip ()!.GetBounds ());
// Act
- view.SetClipToViewport ();
+ view.ClipViewport ();
// Assert
- Assert.Equal (expectedClip, Application.Driver?.Clip?.GetBounds ());
+ Assert.Equal (expectedClip, View.GetClip ()!.GetBounds ());
view.Dispose ();
}
@@ -1000,14 +1000,14 @@ public class DrawTests (ITestOutputHelper _output)
view.Border.Thickness = new (1);
view.BeginInit ();
view.EndInit ();
- Assert.Equal (view.Frame, Application.Driver?.Clip.GetBounds ());
+ Assert.Equal (view.Frame, View.GetClip ()!.GetBounds ());
view.Viewport = view.Viewport with { X = 1, Y = 1 };
// Act
- view.SetClipToViewport ();
+ view.ClipViewport ();
// Assert
- Assert.Equal (expectedClip, Application.Driver?.Clip.GetBounds ());
+ Assert.Equal (expectedClip, View.GetClip ()!.GetBounds ());
view.Dispose ();
}
diff --git a/UnitTests/View/TextTests.cs b/UnitTests/View/TextTests.cs
index 537655563..4d739d84a 100644
--- a/UnitTests/View/TextTests.cs
+++ b/UnitTests/View/TextTests.cs
@@ -67,7 +67,7 @@ Y
Assert.Equal (new (0, 0, 10, 2), label.Frame);
top.LayoutSubviews ();
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
top.Draw ();
expected = @"
@@ -1258,7 +1258,7 @@ w ";
verticalView.Width = 2;
verticalView.TextFormatter.ConstrainToSize = new (2, 20);
Assert.True (verticalView.TextFormatter.NeedsFormat);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
top.Draw ();
Assert.Equal (new (0, 3, 2, 20), verticalView.Frame);
diff --git a/UnitTests/View/ViewTests.cs b/UnitTests/View/ViewTests.cs
index d92c2d019..a0175bc3b 100644
--- a/UnitTests/View/ViewTests.cs
+++ b/UnitTests/View/ViewTests.cs
@@ -14,7 +14,7 @@ public class ViewTests (ITestOutputHelper output)
view.DrawingContent += (s, e) =>
{
- Region savedClip = view.SetClipToViewport ();
+ Region savedClip = view.ClipViewport ();
for (var row = 0; row < view.Viewport.Height; row++)
{
@@ -26,7 +26,7 @@ public class ViewTests (ITestOutputHelper output)
}
}
- Application.SetClip (savedClip);
+ View.SetClip (savedClip);
e.Cancel = true;
};
var top = new Toplevel ();
@@ -77,7 +77,7 @@ public class ViewTests (ITestOutputHelper output)
view.DrawingContent += (s, e) =>
{
- Region savedClip = view.SetClipToViewport ();
+ Region savedClip = view.ClipViewport ();
for (var row = 0; row < view.Viewport.Height; row++)
{
@@ -89,7 +89,7 @@ public class ViewTests (ITestOutputHelper output)
}
}
- Application.SetClip (savedClip);
+ View.SetClip (savedClip);
e.Cancel = true;
};
var top = new Toplevel ();
@@ -309,7 +309,7 @@ At 0,0
Assert.Equal (new (3, 3, 10, 1), view.Frame);
Assert.Equal (new (0, 0, 10, 1), view.Viewport);
Assert.Equal (new (0, 0, 10, 1), view._needsDrawRect);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
top.Draw ();
TestHelpers.AssertDriverContentsWithFrameAre (
@@ -404,7 +404,7 @@ At 0,0
Assert.Equal (new (1, 1, 10, 1), view.Frame);
Assert.Equal (new (0, 0, 10, 1), view.Viewport);
Assert.Equal (new (0, 0, 10, 1), view._needsDrawRect);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
top.Draw ();
diff --git a/UnitTests/Views/AppendAutocompleteTests.cs b/UnitTests/Views/AppendAutocompleteTests.cs
index 09845bc37..6bdc1f067 100644
--- a/UnitTests/Views/AppendAutocompleteTests.cs
+++ b/UnitTests/Views/AppendAutocompleteTests.cs
@@ -9,7 +9,7 @@ public class AppendAutocompleteTests (ITestOutputHelper output)
public void TestAutoAppend_AfterCloseKey_NoAutocomplete ()
{
TextField tf = GetTextFieldsInViewSuggesting ("fish");
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
// f is typed and suggestion is "fish"
Application.Driver?.SendKeys ('f', ConsoleKey.F, false, false, false);
tf.Draw ();
@@ -21,7 +21,7 @@ public class AppendAutocompleteTests (ITestOutputHelper output)
Application.Driver?.SendKeys ('e', ConsoleKey.Escape, false, false, false);
// Suggestion should disappear
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tf.Draw ();
TestHelpers.AssertDriverContentsAre ("f", output);
Assert.Equal ("f", tf.Text);
@@ -43,7 +43,7 @@ public class AppendAutocompleteTests (ITestOutputHelper output)
// f is typed and suggestion is "fish"
Application.Driver?.SendKeys ('f', ConsoleKey.F, false, false, false);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tf.Draw ();
tf.PositionCursor ();
TestHelpers.AssertDriverContentsAre ("fish", output);
@@ -53,7 +53,7 @@ public class AppendAutocompleteTests (ITestOutputHelper output)
Application.Driver?.SendKeys ('\0', ConsoleKey.Escape, false, false, false);
// Suggestion should disappear
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tf.Draw ();
TestHelpers.AssertDriverContentsAre ("f", output);
Assert.Equal ("f", tf.Text);
@@ -61,7 +61,7 @@ public class AppendAutocompleteTests (ITestOutputHelper output)
// Should reappear when you press next letter
Application.Driver?.SendKeys ('i', ConsoleKey.I, false, false, false);
tf.PositionCursor ();
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tf.Draw ();
TestHelpers.AssertDriverContentsAre ("fish", output);
Assert.Equal ("fi", tf.Text);
@@ -78,7 +78,7 @@ public class AppendAutocompleteTests (ITestOutputHelper output)
// f is typed and suggestion is "fish"
Application.Driver?.SendKeys ('f', ConsoleKey.F, false, false, false);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tf.Draw ();
tf.PositionCursor ();
TestHelpers.AssertDriverContentsAre ("fish", output);
@@ -87,7 +87,7 @@ public class AppendAutocompleteTests (ITestOutputHelper output)
// When cycling autocomplete
Application.Driver?.SendKeys (' ', cycleKey, false, false, false);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tf.Draw ();
tf.PositionCursor ();
TestHelpers.AssertDriverContentsAre ("friend", output);
@@ -95,7 +95,7 @@ public class AppendAutocompleteTests (ITestOutputHelper output)
// Should be able to cycle in circles endlessly
Application.Driver?.SendKeys (' ', cycleKey, false, false, false);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tf.Draw ();
tf.PositionCursor ();
TestHelpers.AssertDriverContentsAre ("fish", output);
@@ -111,7 +111,7 @@ public class AppendAutocompleteTests (ITestOutputHelper output)
// f is typed and suggestion is "fish"
Application.Driver?.SendKeys ('f', ConsoleKey.F, false, false, false);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tf.Draw ();
tf.PositionCursor ();
TestHelpers.AssertDriverContentsAre ("fish", output);
@@ -121,7 +121,7 @@ public class AppendAutocompleteTests (ITestOutputHelper output)
Application.Driver?.SendKeys (' ', ConsoleKey.Spacebar, false, false, false);
Application.Driver?.SendKeys ('<', ConsoleKey.LeftArrow, false, false, false);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tf.Draw ();
TestHelpers.AssertDriverContentsAre ("f", output);
Assert.Equal ("f ", tf.Text);
@@ -136,7 +136,7 @@ public class AppendAutocompleteTests (ITestOutputHelper output)
// f is typed and suggestion is "fish"
Application.Driver?.SendKeys ('f', ConsoleKey.F, false, false, false);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tf.Draw ();
tf.PositionCursor ();
TestHelpers.AssertDriverContentsAre ("fish", output);
@@ -144,7 +144,7 @@ public class AppendAutocompleteTests (ITestOutputHelper output)
// x is typed and suggestion should disappear
Application.Driver?.SendKeys ('x', ConsoleKey.X, false, false, false);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tf.Draw ();
TestHelpers.AssertDriverContentsAre ("fx", output);
Assert.Equal ("fx", tf.Text);
@@ -161,7 +161,7 @@ public class AppendAutocompleteTests (ITestOutputHelper output)
var generator = (SingleWordSuggestionGenerator)tf.Autocomplete.SuggestionGenerator;
generator.AllSuggestions = new List { "FISH" };
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tf.Draw ();
tf.PositionCursor ();
TestHelpers.AssertDriverContentsAre ("", output);
@@ -172,7 +172,7 @@ public class AppendAutocompleteTests (ITestOutputHelper output)
Assert.Equal ("my f", tf.Text);
// Even though there is no match on case we should still get the suggestion
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tf.Draw ();
tf.PositionCursor ();
TestHelpers.AssertDriverContentsAre ("my fISH", output);
@@ -180,7 +180,7 @@ public class AppendAutocompleteTests (ITestOutputHelper output)
// When tab completing the case of the whole suggestion should be applied
Application.Driver?.SendKeys ('\t', ConsoleKey.Tab, false, false, false);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tf.Draw ();
TestHelpers.AssertDriverContentsAre ("my FISH", output);
Assert.Equal ("my FISH", tf.Text);
@@ -197,14 +197,14 @@ public class AppendAutocompleteTests (ITestOutputHelper output)
var generator = (SingleWordSuggestionGenerator)tf.Autocomplete.SuggestionGenerator;
generator.AllSuggestions = new List { "fish" };
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tf.Draw ();
tf.PositionCursor ();
TestHelpers.AssertDriverContentsAre ("", output);
tf.NewKeyDownEvent (new Key ('f'));
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tf.Draw ();
tf.PositionCursor ();
TestHelpers.AssertDriverContentsAre ("fish", output);
@@ -212,7 +212,7 @@ public class AppendAutocompleteTests (ITestOutputHelper output)
Application.Driver?.SendKeys ('\t', ConsoleKey.Tab, false, false, false);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tf.Draw ();
TestHelpers.AssertDriverContentsAre ("fish", output);
Assert.Equal ("fish", tf.Text);
@@ -237,7 +237,7 @@ public class AppendAutocompleteTests (ITestOutputHelper output)
// f is typed we should only see 'f' up to size of View (10)
Application.Driver?.SendKeys ('f', ConsoleKey.F, false, false, false);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tf.Draw ();
tf.PositionCursor ();
TestHelpers.AssertDriverContentsAre (expectRender, output);
diff --git a/UnitTests/Views/ComboBoxTests.cs b/UnitTests/Views/ComboBoxTests.cs
index b501bded8..ecc4a5cbc 100644
--- a/UnitTests/Views/ComboBoxTests.cs
+++ b/UnitTests/Views/ComboBoxTests.cs
@@ -566,7 +566,7 @@ Three ",
Assert.True (cb.IsShow);
Assert.Equal (-1, cb.SelectedItem);
Assert.Equal ("", cb.Text);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
cb.Draw ();
TestHelpers.AssertDriverAttributesAre (
@@ -585,7 +585,7 @@ Three ",
Assert.True (cb.IsShow);
Assert.Equal (-1, cb.SelectedItem);
Assert.Equal ("", cb.Text);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
cb.Draw ();
TestHelpers.AssertDriverAttributesAre (
@@ -610,7 +610,7 @@ Three ",
Assert.True (cb.IsShow);
Assert.Equal (2, cb.SelectedItem);
Assert.Equal ("Three", cb.Text);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
cb.Draw ();
TestHelpers.AssertDriverAttributesAre (
@@ -629,7 +629,7 @@ Three ",
Assert.True (cb.IsShow);
Assert.Equal (2, cb.SelectedItem);
Assert.Equal ("Three", cb.Text);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
cb.Draw ();
TestHelpers.AssertDriverAttributesAre (
@@ -648,7 +648,7 @@ Three ",
Assert.True (cb.IsShow);
Assert.Equal (2, cb.SelectedItem);
Assert.Equal ("Three", cb.Text);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
cb.Draw ();
TestHelpers.AssertDriverAttributesAre (
@@ -928,7 +928,7 @@ One
Assert.Equal (1, cb.SelectedItem);
Assert.Equal ("Two", cb.Text);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
cb.Draw ();
TestHelpers.AssertDriverContentsWithFrameAre (
@"
@@ -943,7 +943,7 @@ Two
Assert.Equal (2, cb.SelectedItem);
Assert.Equal ("Three", cb.Text);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
cb.Draw ();
TestHelpers.AssertDriverContentsWithFrameAre (
@"
diff --git a/UnitTests/Views/ContextMenuTests.cs b/UnitTests/Views/ContextMenuTests.cs
index 7ba7941b8..2d4da3ffb 100644
--- a/UnitTests/Views/ContextMenuTests.cs
+++ b/UnitTests/Views/ContextMenuTests.cs
@@ -132,7 +132,7 @@ public class ContextMenuTests (ITestOutputHelper output)
{
((FakeDriver)Application.Driver!).SetBufferSize (20, 15);
- Assert.Equal (new Rectangle (0, 0, 20, 15), Application.Driver?.Clip.GetBounds ());
+ Assert.Equal (new Rectangle (0, 0, 20, 15), View.GetClip ()!.GetBounds ());
TestHelpers.AssertDriverContentsWithFrameAre ("", output);
var top = new Toplevel { X = 2, Y = 2, Width = 15, Height = 4 };
@@ -267,7 +267,7 @@ public class ContextMenuTests (ITestOutputHelper output)
{
((FakeDriver)Application.Driver!).SetBufferSize (20, 15);
- Assert.Equal (new Rectangle (0, 0, 20, 15), Application.Driver?.Clip.GetBounds ());
+ Assert.Equal (new Rectangle (0, 0, 20, 15), View.GetClip ()!.GetBounds ());
TestHelpers.AssertDriverContentsWithFrameAre ("", output);
// Don't use Dialog here as it has more layout logic. Use Window instead.
@@ -1042,7 +1042,7 @@ public class ContextMenuTests (ITestOutputHelper output)
cm.Host.Height = 3;
cm.Show (menuItems);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
Application.Top.Draw ();
Assert.Equal (new Point (5, 12), cm.Position);
diff --git a/UnitTests/Views/GraphViewTests.cs b/UnitTests/Views/GraphViewTests.cs
index f18e69fae..c44f26ea3 100644
--- a/UnitTests/Views/GraphViewTests.cs
+++ b/UnitTests/Views/GraphViewTests.cs
@@ -685,7 +685,7 @@ public class MultiBarSeriesTests
fakeXAxis.LabelPoints.Clear ();
gv.LayoutSubviews ();
gv.SetNeedsDraw ();
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
gv.Draw ();
Assert.Equal (3, fakeXAxis.LabelPoints.Count);
@@ -1154,7 +1154,7 @@ public class TextAnnotationTests
// user scrolls up one unit of graph space
gv.ScrollOffset = new PointF (0, 1f);
gv.SetNeedsDraw ();
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
gv.Draw ();
// we expect the text annotation to go down one line since
@@ -1248,7 +1248,7 @@ public class TextAnnotationTests
new TextAnnotation { Text = "hey!", ScreenPosition = new Point (3, 1) }
);
gv.LayoutSubviews ();
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
gv.Draw ();
var expected =
@@ -1264,7 +1264,7 @@ public class TextAnnotationTests
// user scrolls up one unit of graph space
gv.ScrollOffset = new PointF (0, 1f);
gv.SetNeedsDraw ();
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
gv.Draw ();
// we expect no change in the location of the annotation (only the axis label changes)
@@ -1283,7 +1283,7 @@ public class TextAnnotationTests
// user scrolls up one unit of graph space
gv.ScrollOffset = new PointF (0, 1f);
gv.SetNeedsDraw ();
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
gv.Draw ();
// we expect no change in the location of the annotation (only the axis label changes)
@@ -1553,7 +1553,7 @@ public class PathAnnotationTests
// change the text and redraw
view.Text = "ff1234";
mount.SetNeedsDraw ();
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
mount.Draw ();
// should have the new text rendered
diff --git a/UnitTests/Views/MenuBarTests.cs b/UnitTests/Views/MenuBarTests.cs
index 5abff5a95..f3a49a66d 100644
--- a/UnitTests/Views/MenuBarTests.cs
+++ b/UnitTests/Views/MenuBarTests.cs
@@ -698,7 +698,7 @@ public class MenuBarTests (ITestOutputHelper output)
Dialog.DefaultShadow = ShadowStyle.None;
Button.DefaultShadow = ShadowStyle.None;
- Assert.Equal (new (0, 0, 40, 15), Application.Driver?.Clip.GetBounds());
+ Assert.Equal (new (0, 0, 40, 15), View.GetClip ()!.GetBounds());
TestHelpers.AssertDriverContentsWithFrameAre (@"", output);
List items = new ()
@@ -1595,7 +1595,7 @@ wo
Assert.True (menu.NewMouseEvent (new () { Position = new (1, 0), Flags = MouseFlags.Button1Pressed, View = menu }));
Assert.False (menu.IsMenuOpen);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
top.Draw ();
TestHelpers.AssertDriverContentsAre (expectedMenu.ClosedMenuText, output);
top.Dispose ();
@@ -1693,7 +1693,7 @@ wo
);
Assert.True (menu._openMenu.NewKeyDownEvent (Key.CursorRight));
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
top.Draw ();
TestHelpers.AssertDriverContentsWithFrameAre (
@@ -1805,7 +1805,7 @@ wo
);
Assert.True (menu._openMenu.NewKeyDownEvent (Key.CursorRight));
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
top.Draw ();
TestHelpers.AssertDriverContentsWithFrameAre (
@@ -2013,7 +2013,7 @@ wo
Assert.True (
((MenuBar)top.Subviews [0])._openMenu.NewKeyDownEvent (Key.CursorRight)
);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
top.Draw ();
TestHelpers.AssertDriverContentsWithFrameAre (
@@ -2088,14 +2088,14 @@ wo
// Open second
Assert.True (Application.Top.Subviews [1].NewKeyDownEvent (Key.CursorRight));
Assert.True (menu.IsMenuOpen);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
top.Draw ();
TestHelpers.AssertDriverContentsAre (expectedMenu.ExpectedSubMenuOpen (1), output);
// Close menu
Assert.True (menu.NewKeyDownEvent (menu.Key));
Assert.False (menu.IsMenuOpen);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
top.Draw ();
TestHelpers.AssertDriverContentsAre (expectedMenu.ClosedMenuText, output);
@@ -2129,21 +2129,21 @@ wo
// Open first
Assert.True (menu.NewKeyDownEvent (menu.Key));
Assert.True (menu.IsMenuOpen);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
top.Draw ();
TestHelpers.AssertDriverContentsAre (expectedMenu.ExpectedSubMenuOpen (0), output);
// Open second
Assert.True (top.Subviews [1].NewKeyDownEvent (Key.CursorRight));
Assert.True (menu.IsMenuOpen);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
Application.Top.Draw ();
TestHelpers.AssertDriverContentsAre (expectedMenu.ExpectedSubMenuOpen (1), output);
// Close menu
Assert.True (menu.NewKeyDownEvent (menu.Key));
Assert.False (menu.IsMenuOpen);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
top.Draw ();
TestHelpers.AssertDriverContentsAre (expectedMenu.ClosedMenuText, output);
top.Dispose ();
@@ -2212,7 +2212,7 @@ wo
top.Add (menu);
Application.Begin (top);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
top.Draw ();
TestHelpers.AssertDriverContentsAre (expectedMenu.ClosedMenuText, output);
@@ -2220,7 +2220,7 @@ wo
{
menu.OpenMenu (i);
Assert.True (menu.IsMenuOpen);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
top.Draw ();
TestHelpers.AssertDriverContentsAre (expectedMenu.ExpectedSubMenuOpen (i), output);
}
@@ -2479,7 +2479,7 @@ Edit
Assert.True (menu.NewKeyDownEvent (menu.Key));
Assert.True (menu.IsMenuOpen);
Assert.False (isMenuClosed);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
top.Draw ();
expected = @"
@@ -2494,7 +2494,7 @@ Edit
Assert.True (menu.NewKeyDownEvent (menu.Key));
Assert.False (menu.IsMenuOpen);
Assert.True (isMenuClosed);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
top.Draw ();
expected = @"
@@ -2658,7 +2658,7 @@ Edit
Assert.Equal (1, menu._selected);
Assert.Equal (-1, menu._selectedSub);
Assert.Null (menu._openSubMenu);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
top.Draw ();
TestHelpers.AssertDriverContentsAre (expectedMenu.ExpectedSubMenuOpen (1), output);
@@ -2666,7 +2666,7 @@ Edit
Assert.True (menu._openMenu.NewKeyDownEvent (Key.CursorRight));
Assert.True (menu.IsMenuOpen);
Assert.False (tf.HasFocus);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
top.Draw ();
TestHelpers.AssertDriverContentsAre (expectedMenu.ExpectedSubMenuOpen (2), output);
@@ -2674,21 +2674,21 @@ Edit
Assert.True (menu._openMenu.NewKeyDownEvent (Key.CursorLeft));
Assert.True (menu.IsMenuOpen);
Assert.False (tf.HasFocus);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
top.Draw ();
TestHelpers.AssertDriverContentsAre (expectedMenu.ExpectedSubMenuOpen (1), output);
Assert.True (menu._openMenu.NewKeyDownEvent (Key.CursorLeft));
Assert.True (menu.IsMenuOpen);
Assert.False (tf.HasFocus);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
top.Draw ();
TestHelpers.AssertDriverContentsAre (expectedMenu.ExpectedSubMenuOpen (0), output);
Assert.True (Application.RaiseKeyDownEvent (menu.Key));
Assert.False (menu.IsMenuOpen);
Assert.True (tf.HasFocus);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
top.Draw ();
TestHelpers.AssertDriverContentsAre (expectedMenu.ClosedMenuText, output);
top.Dispose ();
@@ -2759,7 +2759,7 @@ Edit
);
Assert.True (menu.IsMenuOpen);
Assert.False (tf.HasFocus);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
top.Draw ();
TestHelpers.AssertDriverContentsAre (expectedMenu.ExpectedSubMenuOpen (1), output);
@@ -2770,7 +2770,7 @@ Edit
);
Assert.True (menu.IsMenuOpen);
Assert.False (tf.HasFocus);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
top.Draw ();
TestHelpers.AssertDriverContentsAre (expectedMenu.ExpectedSubMenuOpen (2), output);
@@ -2781,7 +2781,7 @@ Edit
);
Assert.True (menu.IsMenuOpen);
Assert.False (tf.HasFocus);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
top.Draw ();
TestHelpers.AssertDriverContentsAre (expectedMenu.ClosedMenuText, output);
@@ -2792,14 +2792,14 @@ Edit
);
Assert.True (menu.IsMenuOpen);
Assert.False (tf.HasFocus);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
top.Draw ();
TestHelpers.AssertDriverContentsAre (expectedMenu.ExpectedSubMenuOpen (0), output);
Assert.True (menu.NewMouseEvent (new () { Position = new (8, 0), Flags = MouseFlags.Button1Pressed, View = menu }));
Assert.False (menu.IsMenuOpen);
Assert.True (tf.HasFocus);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
top.Draw ();
TestHelpers.AssertDriverContentsAre (expectedMenu.ClosedMenuText, output);
top.Dispose ();
diff --git a/UnitTests/Views/ProgressBarTests.cs b/UnitTests/Views/ProgressBarTests.cs
index 4da7a58cd..927085f74 100644
--- a/UnitTests/Views/ProgressBarTests.cs
+++ b/UnitTests/Views/ProgressBarTests.cs
@@ -36,7 +36,7 @@ public class ProgressBarTests
for (var i = 0; i <= pb.Frame.Width; i++)
{
pb.Fraction += 0.2F;
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
pb.Draw ();
if (i == 0)
@@ -178,7 +178,7 @@ public class ProgressBarTests
for (var i = 0; i < 38; i++)
{
pb.Pulse ();
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
pb.Draw ();
if (i == 0)
@@ -883,7 +883,7 @@ public class ProgressBarTests
for (var i = 0; i < 38; i++)
{
pb.Pulse ();
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
pb.Draw ();
if (i == 0)
diff --git a/UnitTests/Views/ScrollViewTests.cs b/UnitTests/Views/ScrollViewTests.cs
index 9c40b2ba2..2858cf5bd 100644
--- a/UnitTests/Views/ScrollViewTests.cs
+++ b/UnitTests/Views/ScrollViewTests.cs
@@ -413,7 +413,7 @@ public class ScrollViewTests (ITestOutputHelper output)
top.LayoutSubviews ();
- Application.ClipToScreen ();
+ View.ClipToScreen ();
top.Draw ();
View contentBottomRightCorner = sv.Subviews.First (v => v is ScrollBarView.ContentBottomRightCorner);
diff --git a/UnitTests/Views/SpinnerViewTests.cs b/UnitTests/Views/SpinnerViewTests.cs
index cdb82635b..b8e62f828 100644
--- a/UnitTests/Views/SpinnerViewTests.cs
+++ b/UnitTests/Views/SpinnerViewTests.cs
@@ -59,7 +59,7 @@ public class SpinnerViewTests
TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
view.AdvanceAnimation ();
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
view.Draw ();
expected = "/";
diff --git a/UnitTests/Views/TabViewTests.cs b/UnitTests/Views/TabViewTests.cs
index aefa55868..3999142fa 100644
--- a/UnitTests/Views/TabViewTests.cs
+++ b/UnitTests/Views/TabViewTests.cs
@@ -610,7 +610,7 @@ public class TabViewTests (ITestOutputHelper output)
tv.ApplyStyleChanges ();
tv.Layout ();
- Application.ClipToScreen ();
+ View.ClipToScreen ();
tv.Draw ();
TestHelpers.AssertDriverContentsWithFrameAre (
@@ -679,7 +679,7 @@ public class TabViewTests (ITestOutputHelper output)
tv.SelectedTab = tab2;
- Application.ClipToScreen ();
+ View.ClipToScreen ();
tv.Draw ();
TestHelpers.AssertDriverContentsWithFrameAre (
@@ -698,7 +698,7 @@ public class TabViewTests (ITestOutputHelper output)
tab1.DisplayText = "12345678910";
tab2.DisplayText = "13";
- Application.ClipToScreen ();
+ View.ClipToScreen ();
tv.Draw ();
TestHelpers.AssertDriverContentsWithFrameAre (
@@ -713,7 +713,7 @@ public class TabViewTests (ITestOutputHelper output)
//switch to tab2
tv.SelectedTab = tab2;
- Application.ClipToScreen ();
+ View.ClipToScreen ();
tv.Draw ();
TestHelpers.AssertDriverContentsWithFrameAre (
@@ -730,7 +730,7 @@ public class TabViewTests (ITestOutputHelper output)
tab1.DisplayText = "12345678910";
tab2.DisplayText = "abcdefghijklmnopq";
- Application.ClipToScreen ();
+ View.ClipToScreen ();
tv.Draw ();
TestHelpers.AssertDriverContentsWithFrameAre (
@@ -755,7 +755,7 @@ public class TabViewTests (ITestOutputHelper output)
tv.ApplyStyleChanges ();
tv.LayoutSubviews ();
- Application.ClipToScreen ();
+ View.ClipToScreen ();
tv.Draw ();
TestHelpers.AssertDriverContentsWithFrameAre (
@@ -809,7 +809,7 @@ public class TabViewTests (ITestOutputHelper output)
// Test two tab names that fit
tab1.DisplayText = "12";
tab2.DisplayText = "13";
- Application.ClipToScreen ();
+ View.ClipToScreen ();
tv.Draw ();
@@ -825,7 +825,7 @@ public class TabViewTests (ITestOutputHelper output)
tv.SelectedTab = tab2;
- Application.ClipToScreen ();
+ View.ClipToScreen ();
tv.Draw ();
TestHelpers.AssertDriverContentsWithFrameAre (
@@ -844,7 +844,7 @@ public class TabViewTests (ITestOutputHelper output)
tab1.DisplayText = "12345678910";
tab2.DisplayText = "13";
- Application.ClipToScreen ();
+ View.ClipToScreen ();
tv.Draw ();
TestHelpers.AssertDriverContentsWithFrameAre (
@@ -859,7 +859,7 @@ public class TabViewTests (ITestOutputHelper output)
//switch to tab2
tv.SelectedTab = tab2;
- Application.ClipToScreen ();
+ View.ClipToScreen ();
tv.Draw ();
TestHelpers.AssertDriverContentsWithFrameAre (
@@ -876,7 +876,7 @@ public class TabViewTests (ITestOutputHelper output)
tab1.DisplayText = "12345678910";
tab2.DisplayText = "abcdefghijklmnopq";
- Application.ClipToScreen ();
+ View.ClipToScreen ();
tv.Draw ();
TestHelpers.AssertDriverContentsWithFrameAre (
@@ -899,7 +899,7 @@ public class TabViewTests (ITestOutputHelper output)
tv.Height = 5;
tv.Layout ();
- Application.ClipToScreen ();
+ View.ClipToScreen ();
tv.Draw ();
TestHelpers.AssertDriverContentsWithFrameAre (
@@ -922,7 +922,7 @@ public class TabViewTests (ITestOutputHelper output)
tv.Height = 5;
tv.Layout ();
- Application.ClipToScreen ();
+ View.ClipToScreen ();
tv.Draw ();
TestHelpers.AssertDriverContentsWithFrameAre (
@@ -951,7 +951,7 @@ public class TabViewTests (ITestOutputHelper output)
tab1.DisplayText = "12";
tab2.DisplayText = "13";
- Application.ClipToScreen ();
+ View.ClipToScreen ();
tv.Draw ();
TestHelpers.AssertDriverContentsWithFrameAre (
@@ -966,7 +966,7 @@ public class TabViewTests (ITestOutputHelper output)
tv.SelectedTab = tab2;
- Application.ClipToScreen ();
+ View.ClipToScreen ();
tv.Draw ();
TestHelpers.AssertDriverContentsWithFrameAre (
@@ -985,7 +985,7 @@ public class TabViewTests (ITestOutputHelper output)
tab1.DisplayText = "12345678910";
tab2.DisplayText = "13";
- Application.ClipToScreen ();
+ View.ClipToScreen ();
tv.Draw ();
TestHelpers.AssertDriverContentsWithFrameAre (
@@ -1000,7 +1000,7 @@ public class TabViewTests (ITestOutputHelper output)
//switch to tab2
tv.SelectedTab = tab2;
- Application.ClipToScreen ();
+ View.ClipToScreen ();
tv.Draw ();
TestHelpers.AssertDriverContentsWithFrameAre (
@@ -1017,7 +1017,7 @@ public class TabViewTests (ITestOutputHelper output)
tab1.DisplayText = "12345678910";
tab2.DisplayText = "abcdefghijklmnopq";
- Application.ClipToScreen ();
+ View.ClipToScreen ();
tv.Draw ();
TestHelpers.AssertDriverContentsWithFrameAre (
@@ -1045,7 +1045,7 @@ public class TabViewTests (ITestOutputHelper output)
tab2.DisplayText = "Les Mise" + char.ConvertFromUtf32 (int.Parse ("0301", NumberStyles.HexNumber)) + "rables";
- Application.ClipToScreen ();
+ View.ClipToScreen ();
tv.Draw ();
TestHelpers.AssertDriverContentsWithFrameAre (
@@ -1060,7 +1060,7 @@ public class TabViewTests (ITestOutputHelper output)
tv.SelectedTab = tab2;
- Application.ClipToScreen ();
+ View.ClipToScreen ();
tv.Draw ();
TestHelpers.AssertDriverContentsWithFrameAre (
@@ -1138,7 +1138,7 @@ public class TabViewTests (ITestOutputHelper output)
// Test two tab names that fit
tab1.DisplayText = "12";
tab2.DisplayText = "13";
- Application.ClipToScreen ();
+ View.ClipToScreen ();
tv.Draw ();
@@ -1156,7 +1156,7 @@ public class TabViewTests (ITestOutputHelper output)
tab1.DisplayText = "12345678910";
tab2.DisplayText = "13";
- Application.ClipToScreen ();
+ View.ClipToScreen ();
tv.Draw ();
TestHelpers.AssertDriverContentsWithFrameAre (
@@ -1171,7 +1171,7 @@ public class TabViewTests (ITestOutputHelper output)
//switch to tab2
tv.SelectedTab = tab2;
- Application.ClipToScreen ();
+ View.ClipToScreen ();
tv.Draw ();
TestHelpers.AssertDriverContentsWithFrameAre (
@@ -1188,7 +1188,7 @@ public class TabViewTests (ITestOutputHelper output)
tab1.DisplayText = "12345678910";
tab2.DisplayText = "abcdefghijklmnopq";
- Application.ClipToScreen ();
+ View.ClipToScreen ();
tv.Draw ();
TestHelpers.AssertDriverContentsWithFrameAre (
@@ -1232,7 +1232,7 @@ public class TabViewTests (ITestOutputHelper output)
tv.SelectedTab = tab2;
- Application.ClipToScreen ();
+ View.ClipToScreen ();
tv.Draw ();
TestHelpers.AssertDriverContentsWithFrameAre (
diff --git a/UnitTests/Views/TableViewTests.cs b/UnitTests/Views/TableViewTests.cs
index 8b6259d60..dd099553f 100644
--- a/UnitTests/Views/TableViewTests.cs
+++ b/UnitTests/Views/TableViewTests.cs
@@ -723,7 +723,7 @@ public class TableViewTests (ITestOutputHelper output)
// since A is now pushed off screen we get indicator showing
// that user can scroll left to see first column
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tableView.Draw ();
expected =
@@ -738,7 +738,7 @@ public class TableViewTests (ITestOutputHelper output)
tableView.NewKeyDownEvent (new () { KeyCode = KeyCode.CursorRight });
tableView.NewKeyDownEvent (new () { KeyCode = KeyCode.CursorRight });
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tableView.Draw ();
expected =
@@ -797,7 +797,7 @@ public class TableViewTests (ITestOutputHelper output)
// Scroll right
tableView.NewKeyDownEvent (new () { KeyCode = KeyCode.CursorRight });
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tableView.Draw ();
// Note that with SmoothHorizontalScrolling only a single new column
@@ -845,7 +845,7 @@ public class TableViewTests (ITestOutputHelper output)
// select last visible column
tableView.SelectedColumn = 2; // column C
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tableView.Draw ();
var expected =
@@ -857,7 +857,7 @@ public class TableViewTests (ITestOutputHelper output)
// Scroll right
tableView.NewKeyDownEvent (new () { KeyCode = KeyCode.CursorRight });
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tableView.Draw ();
// notice that without smooth scrolling we just update the first column
@@ -1980,7 +1980,7 @@ public class TableViewTests (ITestOutputHelper output)
◄─┼─┼─┤
│2│3│4│";
tableView.SetNeedsDraw ();
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tableView.Draw ();
TestHelpers.AssertDriverContentsAre (expected, output);
@@ -1994,7 +1994,7 @@ public class TableViewTests (ITestOutputHelper output)
├─┼─┼─┤
│2│3│4│";
tableView.SetNeedsDraw ();
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tableView.Draw ();
TestHelpers.AssertDriverContentsAre (expected, output);
@@ -2010,7 +2010,7 @@ public class TableViewTests (ITestOutputHelper output)
tableView.Style.ShowHorizontalHeaderUnderline = true;
tableView.LayoutSubviews ();
tableView.SetNeedsDraw ();
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tableView.Draw ();
// normally we should have scroll indicators because DEF are of screen
@@ -2033,7 +2033,7 @@ public class TableViewTests (ITestOutputHelper output)
├─┼─┼─┤
│1│2│3│";
tableView.SetNeedsDraw ();
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tableView.Draw ();
TestHelpers.AssertDriverContentsAre (expected, output);
}
@@ -2609,7 +2609,7 @@ A B C
Assert.True (pets.First ().IsPicked);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
expected =
@@ -2629,7 +2629,7 @@ A B C
Assert.True (pets.ElementAt (0).IsPicked);
Assert.True (pets.ElementAt (1).IsPicked);
Assert.False (pets.ElementAt (2).IsPicked);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
expected =
@@ -2649,7 +2649,7 @@ A B C
Assert.False (pets.ElementAt (0).IsPicked);
Assert.True (pets.ElementAt (1).IsPicked);
Assert.False (pets.ElementAt (2).IsPicked);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
expected =
@@ -2677,7 +2677,7 @@ A B C
wrapper.CheckedRows.Add (0);
wrapper.CheckedRows.Add (2);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
var expected =
@@ -2701,7 +2701,7 @@ A B C
Assert.Contains (2, wrapper.CheckedRows);
Assert.Equal (3, wrapper.CheckedRows.Count);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
expected =
@@ -2717,7 +2717,7 @@ A B C
// Untoggle the top 2
tv.NewKeyDownEvent (Key.Space);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
expected =
@@ -2746,7 +2746,7 @@ A B C
tv.NewKeyDownEvent (Key.A.WithCtrl);
tv.NewKeyDownEvent (Key.Space);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
var expected =
@@ -2766,7 +2766,7 @@ A B C
// Untoggle all again
tv.NewKeyDownEvent (Key.Space);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
expected =
@@ -2807,7 +2807,7 @@ A B C
Assert.True (pets.All (p => p.IsPicked));
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
var expected =
@@ -2827,7 +2827,7 @@ A B C
Assert.Empty (pets.Where (p => p.IsPicked));
#pragma warning restore xUnit2029
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
expected =
@@ -2854,7 +2854,7 @@ A B C
var wrapper = new CheckBoxTableSourceWrapperByIndex (tv, tv.Table);
tv.Table = wrapper;
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
var expected =
@@ -2874,7 +2874,7 @@ A B C
Assert.Single (wrapper.CheckedRows, 0);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
expected =
@@ -2894,7 +2894,7 @@ A B C
Assert.Contains (1, wrapper.CheckedRows);
Assert.Equal (2, wrapper.CheckedRows.Count);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
expected =
@@ -2913,7 +2913,7 @@ A B C
Assert.Single (wrapper.CheckedRows, 1);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
expected =
@@ -2945,7 +2945,7 @@ A B C
wrapper.UseRadioButtons = true;
tv.Table = wrapper;
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
var expected =
@@ -2968,7 +2968,7 @@ A B C
Assert.True (pets.First ().IsPicked);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
expected =
@@ -2989,7 +2989,7 @@ A B C
Assert.True (pets.ElementAt (1).IsPicked);
Assert.False (pets.ElementAt (2).IsPicked);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
expected =
@@ -3010,7 +3010,7 @@ A B C
Assert.False (pets.ElementAt (1).IsPicked);
Assert.False (pets.ElementAt (2).IsPicked);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
expected =
diff --git a/UnitTests/Views/TextFieldTests.cs b/UnitTests/Views/TextFieldTests.cs
index 4ff0ea2e2..ed793d905 100644
--- a/UnitTests/Views/TextFieldTests.cs
+++ b/UnitTests/Views/TextFieldTests.cs
@@ -210,13 +210,13 @@ public class TextFieldTests (ITestOutputHelper output)
// Caption should appear when not focused and no text
Assert.False (tf.HasFocus);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tf.Draw ();
TestHelpers.AssertDriverContentsAre ("Enter txt", output);
// but disapear when text is added
tf.Text = content;
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tf.Draw ();
TestHelpers.AssertDriverContentsAre (content, output);
Application.Top.Dispose ();
@@ -234,14 +234,14 @@ public class TextFieldTests (ITestOutputHelper output)
// Caption has no effect when focused
tf.Caption = "Enter txt";
Assert.True (tf.HasFocus);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tf.Draw ();
TestHelpers.AssertDriverContentsAre ("", output);
Application.Driver?.SendKeys ('\t', ConsoleKey.Tab, false, false, false);
Assert.False (tf.HasFocus);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tf.Draw ();
TestHelpers.AssertDriverContentsAre ("Enter txt", output);
Application.Top.Dispose ();
@@ -1997,7 +1997,7 @@ Les Misérables",
// incorrect order will result with a wrong accent place
tf.Text = "Les Mis" + char.ConvertFromUtf32 (int.Parse ("0301", NumberStyles.HexNumber)) + "erables";
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tf.Draw ();
TestHelpers.AssertDriverContentsWithFrameAre (
diff --git a/UnitTests/Views/TextViewTests.cs b/UnitTests/Views/TextViewTests.cs
index d1ed9fd74..ced1943fe 100644
--- a/UnitTests/Views/TextViewTests.cs
+++ b/UnitTests/Views/TextViewTests.cs
@@ -8353,7 +8353,7 @@ line.
tv.CursorPosition = new Point (6, 2);
Assert.Equal (new Point (5, 2), tv.CursorPosition);
top.LayoutSubviews ();
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
TestHelpers.AssertDriverContentsWithFrameAre (
diff --git a/UnitTests/Views/TreeTableSourceTests.cs b/UnitTests/Views/TreeTableSourceTests.cs
index 59170344b..c22bfcc86 100644
--- a/UnitTests/Views/TreeTableSourceTests.cs
+++ b/UnitTests/Views/TreeTableSourceTests.cs
@@ -54,7 +54,7 @@ public class TreeTableSourceTests : IDisposable
// when pressing right we should expand the top route
tv.NewKeyDownEvent (Key.CursorRight);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
expected =
@@ -72,7 +72,7 @@ public class TreeTableSourceTests : IDisposable
// when pressing left we should collapse the top route again
tv.NewKeyDownEvent (Key.CursorLeft);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
expected =
@@ -96,7 +96,7 @@ public class TreeTableSourceTests : IDisposable
tv.Style.GetOrCreateColumnStyle (1).MinAcceptableWidth = 1;
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
var expected =
@@ -116,7 +116,7 @@ public class TreeTableSourceTests : IDisposable
Assert.True (tv.NewMouseEvent (new MouseEventArgs { Position = new (2, 2), Flags = MouseFlags.Button1Clicked }));
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
expected =
@@ -141,7 +141,7 @@ public class TreeTableSourceTests : IDisposable
// Clicking on the + again should collapse
tv.NewMouseEvent (new MouseEventArgs { Position = new (2, 2), Flags = MouseFlags.Button1Clicked });
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
expected =
@@ -194,7 +194,7 @@ public class TreeTableSourceTests : IDisposable
Application.RaiseKeyDownEvent (Key.CursorRight);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
expected =
@@ -212,7 +212,7 @@ public class TreeTableSourceTests : IDisposable
tv.NewKeyDownEvent (Key.CursorDown);
tv.NewKeyDownEvent (Key.Space);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
expected =
diff --git a/UnitTests/Views/TreeViewTests.cs b/UnitTests/Views/TreeViewTests.cs
index 2736c173e..21ba9a5f3 100644
--- a/UnitTests/Views/TreeViewTests.cs
+++ b/UnitTests/Views/TreeViewTests.cs
@@ -721,7 +721,7 @@ public class TreeViewTests
);
tv.MaxDepth = 3;
tv.ExpandAll ();
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
// Normal drawing of the tree view
@@ -760,7 +760,7 @@ public class TreeViewTests
);
tv.MaxDepth = 5;
tv.ExpandAll ();
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
@@ -788,7 +788,7 @@ public class TreeViewTests
Assert.True (tv.CanExpand ("5"));
Assert.False (tv.IsExpanded ("5"));
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
@@ -843,7 +843,7 @@ public class TreeViewTests
Assert.Null (tv.GetObjectOnRow (4));
tv.Collapse (n1);
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
@@ -880,7 +880,7 @@ public class TreeViewTests
tv.ColorScheme = new ColorScheme ();
tv.LayoutSubviews ();
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
TestHelpers.AssertDriverContentsAre (
@@ -900,7 +900,7 @@ public class TreeViewTests
tv.Collapse (n1);
tv.LayoutSubviews ();
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
TestHelpers.AssertDriverContentsAre (
@@ -918,7 +918,7 @@ public class TreeViewTests
tv.ScrollOffsetVertical = 1;
tv.LayoutSubviews ();
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
TestHelpers.AssertDriverContentsAre (
@@ -955,7 +955,7 @@ public class TreeViewTests
tv.ColorScheme = new ColorScheme ();
tv.LayoutSubviews ();
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
// Normal drawing of the tree view
@@ -1144,7 +1144,7 @@ oot two
// matches nothing
filter.Text = "asdfjhasdf";
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
// Normal drawing of the tree view
@@ -1155,7 +1155,7 @@ oot two
// Matches everything
filter.Text = "root";
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
TestHelpers.AssertDriverContentsAre (
@@ -1170,7 +1170,7 @@ oot two
// Matches 2 leaf nodes
filter.Text = "leaf";
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
TestHelpers.AssertDriverContentsAre (
@@ -1184,7 +1184,7 @@ oot two
// Matches 1 leaf nodes
filter.Text = "leaf 1";
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
TestHelpers.AssertDriverContentsAre (
@@ -1256,7 +1256,7 @@ oot two
// redraw now that the custom color
// delegate is registered
tv.SetNeedsDraw ();
- Application.ClipToScreen ();
+ View.SetClipToScreen ();
tv.Draw ();
// Same text
diff --git a/docfx/docs/drawing.md b/docfx/docs/drawing.md
index 91fa3fbc2..a846adfa4 100644
--- a/docfx/docs/drawing.md
+++ b/docfx/docs/drawing.md
@@ -10,9 +10,9 @@ Terminal.Gui apps draw using the @Terminal.Gui.View.Move and @Terminal.Gui.View.
Outputting unformatted text involves:
-a) Moving the draw cursor using @Terminal.Gui.ViewMove.
-b) Setting the attributes using @Terminal.Gui.ViewSetAttribute`
-c) Outputting glyphs by calling @Terminal.Gui.View.AddRune or @Terminal.Gui.View.AddStr
+a) Moving the draw cursor using @Terminal.Gui.View.Move.
+b) Setting the attributes using @Terminal.Gui.View.SetAttribute.
+c) Outputting glyphs by calling @Terminal.Gui.View.AddRune or @Terminal.Gui.View.AddStr.
Outputting formatted text involves:
@@ -25,17 +25,29 @@ Line drawing is accomplished using the @Terminal.Gui.LineCanvas API:
a) Add the lines via @Terminal.Gui.LineCanvas.Add.
b) Either render the line canvas via @Terminal.Gui.LineCanvas.GetMap() or let the @Terminal.Gui.View do so automatically (which enables automatic line joining across Views).
-The @Terminal.Gui.Application MainLoop will iterate over all Views in an application looking for views have their @Terminal.Gui.View.NeedsDraw property set. The @Terminal.Gui.View.Draw method will be called which, in turn.
+### Drawing occurs each MainLoop Iteration
-1) Draws the Adornments (e.g. @Terminal.Gui.View.Border).
-2) Sets the Normal color scheme.
-3) Clears the @Terminal.Gui.View.Viewport.
-4) Draws @Terminal.Gui.View.Text.
-5) Draws any non-text or Subview content.
-6) Draws @Terminal.Gui.View.Subviews.
-7) Draws @Terminal.Gui.View.LineCanvas (which may have been added to by any of the steps above).
+The @Terminal.Gui.Application MainLoop will iterate over all Views in the view hierarchy, starting with @Terminal.Gui.Application.Toplevels. The @Terminal.Gui.View.Draw method will be called which, in turn:
+
+0) Determines if @Terminal.Gui.View.NeedsDraw or @Terminal.Gui.View.SubviewsNeedsDraw are set. If neither is set, processing stops.
+1) Sets the clip to the view's Frame.
+2) Draws the @Terminal.Gui.View.Border and @Terminal.Gui.View.Padding (but NOT the Margin).
+3) Sets the clip to the view's Viewport.
+4) Sets the Normal color scheme.
+5) Calls Draw on any @Terminal.Gui.View.Subviews.
+6) Draws @Terminal.Gui.View.Text.
+7) Draws any non-text content (the base View does nothing.)
+8) Sets the clip back to the view's Frame.
+9) Draws @Terminal.Gui.View.LineCanvas (which may have been added to by any of the steps above).
+10) Draws the @Terminal.Gui.View.Border and @Terminal.Gui.View.Padding Subviews (just the subviews). (but NOT the Margin).
+11) The Clip at this point excludes all Subviews NOT INCLUDING their Margins. This clip is cached so @Terminal.Gui.View.Margin can be rendered later.
+12) DrawComplete is raised.
+13) The current View's Frame NOT INCLUDING the Margin is excluded from the current Clip region.
+
+Most of the steps above can be overridden by developers using the standard [Terminal.Gui cancellable event pattern](events.md). For example, the base @Terminal.Gui.View always clears the viewport. To override this, a subclass can override @Terminal.Gui.View.OnClearingViewport to simply return `true`. Or, a user of `View` can subscribe to the @Terminal.Gui.View.ClearingViewport event and set the `Cancel` argument to `true`.
+
+Then, after the above steps have completed, the Mainloop will iterate through all views in the view hierarchy again, this time calling Draw on any @Terminal.Gui.View.Margin objects, using the cached Clip region mentioned above. This enables Margin to be transparent.
-Each of these steps can be overridden by developers using the standard [Terminal.Gui cancellable event pattern](events.md). For example, the base @Terminal.Gui.View always clears the viewport. To override this, a subclass can override @Terminal.Gui.View.OnClearingViewport to simply return `true`. Or, a user of `View` can subscribe to the @Terminal.Gui.View.ClearingViewport event and set the `Cancel` argument to `true`.
### Declaring that drawing is needed
@@ -45,7 +57,6 @@ If a View need to redraw because something changed within it's Content Area it c
Clipping enables better performance by ensuring on regions of the terminal that need to be drawn actually get drawn by the @Terminal.Gui.ConsoleDriver. Terminal.Gui supports non-rectangular clip regions with @Terminal.Gui.Region. @Terminal.Gui.ConsoleDriver.Clip is the application managed clip region and is managed by @Terminal.Gui.Application. Developers cannot change this directly, but can use @Terminal.Gui.Application.ClipToScreen, @Terminal.Gui.Application.SetClip(Region), @Terminal.Gui.View.ClipToFrame, and @Terminal.Gui.ClipToViewPort.
-
## Coordinate System for Drawing
The @Terminal.Gui.View draw APIs all take coordinates specified in *Viewport-Relative* coordinates. That is, `0, 0` is the top-left cell visible to the user.
@@ -107,7 +118,10 @@ Terminal.Gui supports drawing lines and shapes using box-drawing glyphs. The @Te
## Thickness
-Describes the thickness of a frame around a rectangle. The thickness is specified for each side of the rectangle using a @Terminal.Gui.Thickness object. The Thickness class contains properties for the left, top, right, and bottom thickness. The @Terminal.Gui.Adornment class uses @Terminal.Gui.Thickness to support drawing the frame around a view. The `View` class contains three Adornment-derived properties:
+Describes the thickness of a frame around a rectangle. The thickness is specified for each side of the rectangle using a @Terminal.Gui.Thickness object. The Thickness class contains properties for the left, top, right, and bottom thickness. The @Terminal.Gui.Adornment class uses @Terminal.Gui.Thickness to support drawing the frame around a view.
See [View Deep Dive](View.md) for details.
+## Diagnostics
+
+The @Terminal.Gui.ViewDiagnostics.DisplayIndicator flag can be set on @Terminal.Gui.View.Diagnostics to cause an animated glyph to appear in the `Border` of each View. The glyph will animate each time that View's `Draw` method is called where either @Terminal.Gui.View.NeedsDraw or @Terminal.Gui.View.SubviewNeedsDraw is set.
\ No newline at end of file