Reimplemented Driver.FillRect to directly use Contnets vs calling Move/AddRune

This commit is contained in:
Tig
2024-04-15 15:43:03 -06:00
parent 50fcb19af5
commit de1a844787
3 changed files with 40 additions and 27 deletions

View File

@@ -882,7 +882,7 @@ public static partial class Application
}
else
{
Driver.UpdateCursor ();
//Driver.UpdateCursor ();
}
if (state.Toplevel != Top && !state.Toplevel.Modal && (Top.NeedsDisplay || Top.SubViewNeedsDisplay || Top.LayoutNeeded))

View File

@@ -314,28 +314,23 @@ public abstract class ConsoleDriver
// TODO: This method is really "Clear Contents" now and should not be abstract (or virtual)
Contents = new Cell [Rows, Cols];
//CONCURRENCY: Unsynchronized access to Clip isn't safe.
Clip = new (0, 0, Cols, Rows);
// TODO: ClearContents should not clear the clip; it should only clear the contents. Move clearing it elsewhere.
Clip = Screen;
_dirtyLines = new bool [Rows];
lock (Contents)
{
// Can raise an exception while is still resizing.
try
for (var row = 0; row < Rows; row++)
{
for (var row = 0; row < Rows; row++)
for (var c = 0; c < Cols; c++)
{
for (var c = 0; c < Cols; c++)
Contents [row, c] = new Cell
{
Contents [row, c] = new Cell
{
Rune = (Rune)' ', Attribute = new Attribute (Color.White, Color.Black), IsDirty = true
};
_dirtyLines [row] = true;
}
Rune = (Rune)' ', Attribute = new Attribute (Color.White, Color.Black), IsDirty = true
};
_dirtyLines [row] = true;
}
}
catch (IndexOutOfRangeException)
{ }
}
}
@@ -343,18 +338,27 @@ public abstract class ConsoleDriver
/// <returns><see langword="true"/> upon success</returns>
public abstract bool EnsureCursorVisibility ();
// TODO: Move FillRect to ./Drawing
/// <summary>Fills the specified rectangle with the specified rune.</summary>
/// <param name="rect"></param>
/// <param name="rune"></param>
/// <summary>Fills the specified rectangle with the specified rune, using <see cref="CurrentAttribute"/></summary>
/// <remarks>
/// The value of <see cref="Clip"/> is honored. Any parts of the rectangle not in the clip will not be drawn.
/// </remarks>
/// <param name="rect">The Screen-relative rectangle.</param>
/// <param name="rune">The Rune used to fill the rectangle</param>
public void FillRect (Rectangle rect, Rune rune = default)
{
for (int r = rect.Y; r < rect.Y + rect.Height; r++)
rect = Rectangle.Intersect (rect, Clip);
lock (Contents)
{
for (int c = rect.X; c < rect.X + rect.Width; c++)
for (int r = rect.Y; r < rect.Y + rect.Height; r++)
{
Move (c, r);
AddRune (rune == default (Rune) ? new Rune (' ') : rune);
for (int c = rect.X; c < rect.X + rect.Width; c++)
{
Contents [r, c] = new Cell
{
Rune = (Rune)' ', Attribute = CurrentAttribute, IsDirty = true
};
_dirtyLines [r] = true;
}
}
}
}

View File

@@ -24,6 +24,7 @@ public class Scrolling : Scenario
Y = 3,
Width = Dim.Fill (3),
Height = Dim.Fill (3),
BorderStyle = LineStyle.None
};
var label = new Label { X = 0, Y = 0 };
@@ -37,13 +38,13 @@ public class Scrolling : Scenario
Width = 60,
Height = 20,
ColorScheme = Colors.ColorSchemes ["TopLevel"],
ContentSize = new (200, 100),
ContentSize = new (120, 40),
//ContentOffset = Point.Empty,
ShowVerticalScrollIndicator = true,
ShowHorizontalScrollIndicator = true
};
scrollView.Padding.Thickness = new (1);
// scrollView.Padding.Thickness = new (1);
label.Text = $"{scrollView}\nContentSize: {scrollView.ContentSize}\nContentOffset: {scrollView.ContentOffset}";
@@ -58,6 +59,7 @@ public class Scrolling : Scenario
Height = 2,
ColorScheme = Colors.ColorSchemes ["Error"]
};
horizontalRuler.Visible = false;
scrollView.Add (horizontalRuler);
const string vrule = "0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n";
@@ -71,9 +73,11 @@ public class Scrolling : Scenario
Height = Dim.Fill (),
ColorScheme = Colors.ColorSchemes ["Error"]
};
horizontalRuler.Visible = false;
scrollView.Add (verticalRuler);
var pressMeButton = new Button { X = 3, Y = 3, Text = "Press me!" };
pressMeButton.Visible = false;
pressMeButton.Accept += (s, e) => MessageBox.Query (20, 7, "MessageBox", "Neat?", "Yes", "No");
scrollView.Add (pressMeButton);
@@ -85,6 +89,7 @@ public class Scrolling : Scenario
Width = Dim.Fill (3),
Text = "A very long button. Should be wide enough to demo clipping!"
};
aLongButton.Visible = false;
aLongButton.Accept += (s, e) => MessageBox.Query (20, 7, "MessageBox", "Neat?", "Yes", "No");
scrollView.Add (aLongButton);
@@ -95,7 +100,8 @@ public class Scrolling : Scenario
Y = 5,
Width = 50,
ColorScheme = Colors.ColorSchemes ["Dialog"],
Text = "This is a test of..."
Text = "This is a test of...",
//Visible = false
}
);
@@ -106,7 +112,8 @@ public class Scrolling : Scenario
Y = 10,
Width = 50,
ColorScheme = Colors.ColorSchemes ["Dialog"],
Text = "... the emergency broadcast system."
Text = "... the emergency broadcast system.",
Visible = false
}
);
@@ -117,7 +124,8 @@ public class Scrolling : Scenario
Y = 99,
Width = 50,
ColorScheme = Colors.ColorSchemes ["Dialog"],
Text = "Last line"
Text = "Last line",
Visible = false
}
);
@@ -223,6 +231,7 @@ public class Scrolling : Scenario
// Add a progress bar to cause constant redraws
var progress = new ProgressBar { X = Pos.Right (scrollView) + 1, Y = Pos.AnchorEnd (2), Width = 50 };
app.Add (progress);
var pulsing = true;