|
@@ -357,11 +357,12 @@ namespace Terminal.Gui {
|
|
|
/// </summary>
|
|
|
public int ActualWidth {
|
|
|
get {
|
|
|
+ var driver = Application.Driver;
|
|
|
if (Parent?.Border == null) {
|
|
|
- return Child?.Frame.Width + (2 * marginFrame) + Padding.Right
|
|
|
- + BorderThickness.Right + Padding.Left + BorderThickness.Left ?? 0;
|
|
|
+ return Math.Min (Child?.Frame.Width + (2 * marginFrame) + Padding.Right
|
|
|
+ + BorderThickness.Right + Padding.Left + BorderThickness.Left ?? 0, driver.Cols);
|
|
|
}
|
|
|
- return Parent.Frame.Width;
|
|
|
+ return Math.Min (Parent.Frame.Width, driver.Cols);
|
|
|
}
|
|
|
}
|
|
|
/// <summary>
|
|
@@ -369,11 +370,12 @@ namespace Terminal.Gui {
|
|
|
/// </summary>
|
|
|
public int ActualHeight {
|
|
|
get {
|
|
|
+ var driver = Application.Driver;
|
|
|
if (Parent?.Border == null) {
|
|
|
- return Child?.Frame.Height + (2 * marginFrame) + Padding.Bottom
|
|
|
- + BorderThickness.Bottom + Padding.Top + BorderThickness.Top ?? 0;
|
|
|
+ return Math.Min (Child?.Frame.Height + (2 * marginFrame) + Padding.Bottom
|
|
|
+ + BorderThickness.Bottom + Padding.Top + BorderThickness.Top ?? 0, driver.Rows);
|
|
|
}
|
|
|
- return Parent.Frame.Height;
|
|
|
+ return Math.Min (Parent.Frame.Height, driver.Rows);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -405,7 +407,7 @@ namespace Terminal.Gui {
|
|
|
/// <summary>
|
|
|
/// Gets or sets the color for the <see cref="Border"/>
|
|
|
/// </summary>
|
|
|
- public Color Effect3DBrush { get; set; } = Color.DarkGray;
|
|
|
+ public Attribute? Effect3DBrush { get; set; }
|
|
|
|
|
|
/// <summary>
|
|
|
/// Calculate the sum of the <see cref="Padding"/> and the <see cref="BorderThickness"/>
|
|
@@ -428,9 +430,9 @@ namespace Terminal.Gui {
|
|
|
public void DrawContent ()
|
|
|
{
|
|
|
if (Parent?.Border != null) {
|
|
|
- DrawParentBorder (Parent.ViewToScreen (new Rect (0, 0, Parent.Frame.Width, Parent.Frame.Height)));
|
|
|
+ DrawParentBorder (Parent.ViewToScreen (Parent.Bounds));
|
|
|
} else {
|
|
|
- DrawChildBorder (Child.ViewToScreen (new Rect (0, 0, Child.Frame.Width, Child.Frame.Height)));
|
|
|
+ DrawChildBorder (Child.ViewToScreen (Child.Bounds));
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -445,9 +447,9 @@ namespace Terminal.Gui {
|
|
|
var driver = Application.Driver;
|
|
|
Rect scrRect;
|
|
|
if (Parent?.Border != null) {
|
|
|
- scrRect = Parent.ViewToScreen (new Rect (0, 0, Parent.Frame.Width, Parent.Frame.Height));
|
|
|
+ scrRect = Parent.ViewToScreen (Parent.Bounds);
|
|
|
} else {
|
|
|
- scrRect = Child.ViewToScreen (new Rect (0, 0, Child.Frame.Width, Child.Frame.Height));
|
|
|
+ scrRect = Child.ViewToScreen (Child.Bounds);
|
|
|
}
|
|
|
Rect borderRect;
|
|
|
if (Parent?.Border != null) {
|
|
@@ -464,14 +466,21 @@ namespace Terminal.Gui {
|
|
|
|
|
|
// Draw 3D effects
|
|
|
if (Effect3D) {
|
|
|
- driver.SetAttribute (new Attribute (Effect3DBrush));
|
|
|
+ driver.SetAttribute (GetEffect3DBrush ());
|
|
|
+
|
|
|
var effectBorder = new Rect () {
|
|
|
X = borderRect.X + Effect3DOffset.X,
|
|
|
Y = borderRect.Y + Effect3DOffset.Y,
|
|
|
Width = ActualWidth,
|
|
|
Height = ActualHeight
|
|
|
};
|
|
|
- Child.Clear (effectBorder);
|
|
|
+ //Child.Clear (effectBorder);
|
|
|
+ for (int r = effectBorder.Y; r < Math.Min (effectBorder.Bottom, driver.Rows); r++) {
|
|
|
+ for (int c = effectBorder.X; c < Math.Min (effectBorder.Right, driver.Cols); c++) {
|
|
|
+
|
|
|
+ AddRuneAt (driver, c, r, (Rune)driver.Contents [r, c, 0]);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// Draw border thickness
|
|
@@ -530,7 +539,7 @@ namespace Terminal.Gui {
|
|
|
for (int r = frame.Y - drawMarginFrame - sumThickness.Top;
|
|
|
r < frame.Y - drawMarginFrame - padding.Top; r++) {
|
|
|
for (int c = frame.X - drawMarginFrame - sumThickness.Left;
|
|
|
- c < frame.Right + drawMarginFrame + sumThickness.Right; c++) {
|
|
|
+ c < Math.Min (frame.Right + drawMarginFrame + sumThickness.Right, driver.Cols); c++) {
|
|
|
|
|
|
AddRuneAt (driver, c, r, ' ');
|
|
|
}
|
|
@@ -538,7 +547,7 @@ namespace Terminal.Gui {
|
|
|
|
|
|
// Draw the left BorderThickness
|
|
|
for (int r = frame.Y - drawMarginFrame - padding.Top;
|
|
|
- r < frame.Bottom + drawMarginFrame + padding.Bottom; r++) {
|
|
|
+ r < Math.Min (frame.Bottom + drawMarginFrame + padding.Bottom, driver.Rows); r++) {
|
|
|
for (int c = frame.X - drawMarginFrame - sumThickness.Left;
|
|
|
c < frame.X - drawMarginFrame - padding.Left; c++) {
|
|
|
|
|
@@ -548,9 +557,9 @@ namespace Terminal.Gui {
|
|
|
|
|
|
// Draw the right BorderThickness
|
|
|
for (int r = frame.Y - drawMarginFrame - padding.Top;
|
|
|
- r < frame.Bottom + drawMarginFrame + padding.Bottom; r++) {
|
|
|
+ r < Math.Min (frame.Bottom + drawMarginFrame + padding.Bottom, driver.Rows); r++) {
|
|
|
for (int c = frame.Right + drawMarginFrame + padding.Right;
|
|
|
- c < frame.Right + drawMarginFrame + sumThickness.Right; c++) {
|
|
|
+ c < Math.Min (frame.Right + drawMarginFrame + sumThickness.Right, driver.Cols); c++) {
|
|
|
|
|
|
AddRuneAt (driver, c, r, ' ');
|
|
|
}
|
|
@@ -558,9 +567,9 @@ namespace Terminal.Gui {
|
|
|
|
|
|
// Draw the lower BorderThickness
|
|
|
for (int r = frame.Bottom + drawMarginFrame + padding.Bottom;
|
|
|
- r < frame.Bottom + drawMarginFrame + sumThickness.Bottom; r++) {
|
|
|
+ r < Math.Min (frame.Bottom + drawMarginFrame + sumThickness.Bottom, driver.Rows); r++) {
|
|
|
for (int c = frame.X - drawMarginFrame - sumThickness.Left;
|
|
|
- c < frame.Right + drawMarginFrame + sumThickness.Right; c++) {
|
|
|
+ c < Math.Min (frame.Right + drawMarginFrame + sumThickness.Right, driver.Cols); c++) {
|
|
|
|
|
|
AddRuneAt (driver, c, r, ' ');
|
|
|
}
|
|
@@ -572,7 +581,7 @@ namespace Terminal.Gui {
|
|
|
for (int r = frame.Y - drawMarginFrame - padding.Top;
|
|
|
r < frame.Y - drawMarginFrame; r++) {
|
|
|
for (int c = frame.X - drawMarginFrame - padding.Left;
|
|
|
- c < frame.Right + drawMarginFrame + padding.Right; c++) {
|
|
|
+ c < Math.Min (frame.Right + drawMarginFrame + padding.Right, driver.Cols); c++) {
|
|
|
|
|
|
AddRuneAt (driver, c, r, ' ');
|
|
|
}
|
|
@@ -580,7 +589,7 @@ namespace Terminal.Gui {
|
|
|
|
|
|
// Draw the left Padding
|
|
|
for (int r = frame.Y - drawMarginFrame;
|
|
|
- r < frame.Bottom + drawMarginFrame; r++) {
|
|
|
+ r < Math.Min (frame.Bottom + drawMarginFrame, driver.Rows); r++) {
|
|
|
for (int c = frame.X - drawMarginFrame - padding.Left;
|
|
|
c < frame.X - drawMarginFrame; c++) {
|
|
|
|
|
@@ -590,9 +599,9 @@ namespace Terminal.Gui {
|
|
|
|
|
|
// Draw the right Padding
|
|
|
for (int r = frame.Y - drawMarginFrame;
|
|
|
- r < frame.Bottom + drawMarginFrame; r++) {
|
|
|
+ r < Math.Min (frame.Bottom + drawMarginFrame, driver.Rows); r++) {
|
|
|
for (int c = frame.Right + drawMarginFrame;
|
|
|
- c < frame.Right + drawMarginFrame + padding.Right; c++) {
|
|
|
+ c < Math.Min (frame.Right + drawMarginFrame + padding.Right, driver.Cols); c++) {
|
|
|
|
|
|
AddRuneAt (driver, c, r, ' ');
|
|
|
}
|
|
@@ -600,9 +609,9 @@ namespace Terminal.Gui {
|
|
|
|
|
|
// Draw the lower Padding
|
|
|
for (int r = frame.Bottom + drawMarginFrame;
|
|
|
- r < frame.Bottom + drawMarginFrame + padding.Bottom; r++) {
|
|
|
+ r < Math.Min (frame.Bottom + drawMarginFrame + padding.Bottom, driver.Rows); r++) {
|
|
|
for (int c = frame.X - drawMarginFrame - padding.Left;
|
|
|
- c < frame.Right + drawMarginFrame + padding.Right; c++) {
|
|
|
+ c < Math.Min (frame.Right + drawMarginFrame + padding.Right, driver.Cols); c++) {
|
|
|
|
|
|
AddRuneAt (driver, c, r, ' ');
|
|
|
}
|
|
@@ -622,45 +631,45 @@ namespace Terminal.Gui {
|
|
|
}
|
|
|
|
|
|
if (Effect3D) {
|
|
|
- driver.SetAttribute (new Attribute (Effect3DBrush));
|
|
|
+ driver.SetAttribute (GetEffect3DBrush ());
|
|
|
|
|
|
// Draw the upper Effect3D
|
|
|
for (int r = frame.Y - drawMarginFrame - sumThickness.Top + effect3DOffset.Y;
|
|
|
r < frame.Y - drawMarginFrame - sumThickness.Top; r++) {
|
|
|
for (int c = frame.X - drawMarginFrame - sumThickness.Left + effect3DOffset.X;
|
|
|
- c < frame.Right + drawMarginFrame + sumThickness.Right + effect3DOffset.X; c++) {
|
|
|
+ c < Math.Min (frame.Right + drawMarginFrame + sumThickness.Right + effect3DOffset.X, driver.Cols); c++) {
|
|
|
|
|
|
- AddRuneAt (driver, c, r, ' ');
|
|
|
+ AddRuneAt (driver, c, r, (Rune)driver.Contents [r, c, 0]);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// Draw the left Effect3D
|
|
|
for (int r = frame.Y - drawMarginFrame - sumThickness.Top + effect3DOffset.Y;
|
|
|
- r < frame.Bottom + drawMarginFrame + sumThickness.Bottom + effect3DOffset.Y; r++) {
|
|
|
+ r < Math.Min (frame.Bottom + drawMarginFrame + sumThickness.Bottom + effect3DOffset.Y, driver.Rows); r++) {
|
|
|
for (int c = frame.X - drawMarginFrame - sumThickness.Left + effect3DOffset.X;
|
|
|
c < frame.X - drawMarginFrame - sumThickness.Left; c++) {
|
|
|
|
|
|
- AddRuneAt (driver, c, r, ' ');
|
|
|
+ AddRuneAt (driver, c, r, (Rune)driver.Contents [r, c, 0]);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// Draw the right Effect3D
|
|
|
for (int r = frame.Y - drawMarginFrame - sumThickness.Top + effect3DOffset.Y;
|
|
|
- r < frame.Bottom + drawMarginFrame + sumThickness.Bottom + effect3DOffset.Y; r++) {
|
|
|
+ r < Math.Min (frame.Bottom + drawMarginFrame + sumThickness.Bottom + effect3DOffset.Y, driver.Rows); r++) {
|
|
|
for (int c = frame.Right + drawMarginFrame + sumThickness.Right;
|
|
|
- c < frame.Right + drawMarginFrame + sumThickness.Right + effect3DOffset.X; c++) {
|
|
|
+ c < Math.Min (frame.Right + drawMarginFrame + sumThickness.Right + effect3DOffset.X, driver.Cols); c++) {
|
|
|
|
|
|
- AddRuneAt (driver, c, r, ' ');
|
|
|
+ AddRuneAt (driver, c, r, (Rune)driver.Contents [r, c, 0]);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// Draw the lower Effect3D
|
|
|
for (int r = frame.Bottom + drawMarginFrame + sumThickness.Bottom;
|
|
|
- r < frame.Bottom + drawMarginFrame + sumThickness.Bottom + effect3DOffset.Y; r++) {
|
|
|
+ r < Math.Min (frame.Bottom + drawMarginFrame + sumThickness.Bottom + effect3DOffset.Y, driver.Rows); r++) {
|
|
|
for (int c = frame.X - drawMarginFrame - sumThickness.Left + effect3DOffset.X;
|
|
|
- c < frame.Right + drawMarginFrame + sumThickness.Right + effect3DOffset.X; c++) {
|
|
|
+ c < Math.Min (frame.Right + drawMarginFrame + sumThickness.Right + effect3DOffset.X, driver.Cols); c++) {
|
|
|
|
|
|
- AddRuneAt (driver, c, r, ' ');
|
|
|
+ AddRuneAt (driver, c, r, (Rune)driver.Contents [r, c, 0]);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -668,7 +677,6 @@ namespace Terminal.Gui {
|
|
|
|
|
|
private void DrawParentBorder (Rect frame)
|
|
|
{
|
|
|
- var drawMarginFrame = DrawMarginFrame ? 1 : 0;
|
|
|
var sumThickness = GetSumThickness ();
|
|
|
var borderThickness = BorderThickness;
|
|
|
var effect3DOffset = Effect3DOffset;
|
|
@@ -682,7 +690,7 @@ namespace Terminal.Gui {
|
|
|
for (int r = frame.Y;
|
|
|
r < Math.Min (frame.Y + borderThickness.Top, frame.Bottom); r++) {
|
|
|
for (int c = frame.X;
|
|
|
- c < frame.Right; c++) {
|
|
|
+ c < Math.Min (frame.Right, driver.Cols); c++) {
|
|
|
|
|
|
AddRuneAt (driver, c, r, ' ');
|
|
|
}
|
|
@@ -690,7 +698,7 @@ namespace Terminal.Gui {
|
|
|
|
|
|
// Draw the left BorderThickness
|
|
|
for (int r = Math.Min (frame.Y + borderThickness.Top, frame.Bottom);
|
|
|
- r < frame.Bottom - borderThickness.Bottom; r++) {
|
|
|
+ r < Math.Min (frame.Bottom - borderThickness.Bottom, driver.Rows); r++) {
|
|
|
for (int c = frame.X;
|
|
|
c < Math.Min (frame.X + borderThickness.Left, frame.Right); c++) {
|
|
|
|
|
@@ -700,9 +708,9 @@ namespace Terminal.Gui {
|
|
|
|
|
|
// Draw the right BorderThickness
|
|
|
for (int r = Math.Min (frame.Y + borderThickness.Top, frame.Bottom);
|
|
|
- r < frame.Bottom - borderThickness.Bottom; r++) {
|
|
|
+ r < Math.Min (frame.Bottom - borderThickness.Bottom, driver.Rows); r++) {
|
|
|
for (int c = Math.Max (frame.Right - borderThickness.Right, frame.X);
|
|
|
- c < frame.Right; c++) {
|
|
|
+ c < Math.Min (frame.Right, driver.Cols); c++) {
|
|
|
|
|
|
AddRuneAt (driver, c, r, ' ');
|
|
|
}
|
|
@@ -710,9 +718,9 @@ namespace Terminal.Gui {
|
|
|
|
|
|
// Draw the lower BorderThickness
|
|
|
for (int r = Math.Max (frame.Bottom - borderThickness.Bottom, frame.Y);
|
|
|
- r < frame.Bottom; r++) {
|
|
|
+ r < Math.Min (frame.Bottom, driver.Rows); r++) {
|
|
|
for (int c = frame.X;
|
|
|
- c < frame.Right; c++) {
|
|
|
+ c < Math.Min (frame.Right, driver.Cols); c++) {
|
|
|
|
|
|
AddRuneAt (driver, c, r, ' ');
|
|
|
}
|
|
@@ -724,7 +732,7 @@ namespace Terminal.Gui {
|
|
|
for (int r = frame.Y + borderThickness.Top;
|
|
|
r < Math.Min (frame.Y + sumThickness.Top, frame.Bottom - borderThickness.Bottom); r++) {
|
|
|
for (int c = frame.X + borderThickness.Left;
|
|
|
- c < frame.Right - borderThickness.Right; c++) {
|
|
|
+ c < Math.Min (frame.Right - borderThickness.Right, driver.Cols); c++) {
|
|
|
|
|
|
AddRuneAt (driver, c, r, ' ');
|
|
|
}
|
|
@@ -732,7 +740,7 @@ namespace Terminal.Gui {
|
|
|
|
|
|
// Draw the left Padding
|
|
|
for (int r = frame.Y + sumThickness.Top;
|
|
|
- r < frame.Bottom - sumThickness.Bottom; r++) {
|
|
|
+ r < Math.Min (frame.Bottom - sumThickness.Bottom, driver.Rows); r++) {
|
|
|
for (int c = frame.X + borderThickness.Left;
|
|
|
c < Math.Min (frame.X + sumThickness.Left, frame.Right - borderThickness.Right); c++) {
|
|
|
|
|
@@ -742,7 +750,7 @@ namespace Terminal.Gui {
|
|
|
|
|
|
// Draw the right Padding
|
|
|
for (int r = frame.Y + sumThickness.Top;
|
|
|
- r < frame.Bottom - sumThickness.Bottom; r++) {
|
|
|
+ r < Math.Min (frame.Bottom - sumThickness.Bottom, driver.Rows); r++) {
|
|
|
for (int c = Math.Max (frame.Right - sumThickness.Right, frame.X + sumThickness.Left);
|
|
|
c < Math.Max (frame.Right - borderThickness.Right, frame.X + sumThickness.Left); c++) {
|
|
|
|
|
@@ -752,9 +760,9 @@ namespace Terminal.Gui {
|
|
|
|
|
|
// Draw the lower Padding
|
|
|
for (int r = Math.Max (frame.Bottom - sumThickness.Bottom, frame.Y + borderThickness.Top);
|
|
|
- r < frame.Bottom - borderThickness.Bottom; r++) {
|
|
|
+ r < Math.Min (frame.Bottom - borderThickness.Bottom, driver.Rows); r++) {
|
|
|
for (int c = frame.X + borderThickness.Left;
|
|
|
- c < frame.Right - borderThickness.Right; c++) {
|
|
|
+ c < Math.Min (frame.Right - borderThickness.Right, driver.Cols); c++) {
|
|
|
|
|
|
AddRuneAt (driver, c, r, ' ');
|
|
|
}
|
|
@@ -774,50 +782,57 @@ namespace Terminal.Gui {
|
|
|
}
|
|
|
|
|
|
if (Effect3D) {
|
|
|
- driver.SetAttribute (new Attribute (Effect3DBrush));
|
|
|
+ driver.SetAttribute (GetEffect3DBrush ());
|
|
|
|
|
|
// Draw the upper Effect3D
|
|
|
- for (int r = frame.Y + effect3DOffset.Y;
|
|
|
+ for (int r = Math.Max (frame.Y + effect3DOffset.Y, 0);
|
|
|
r < frame.Y; r++) {
|
|
|
- for (int c = frame.X + effect3DOffset.X;
|
|
|
- c < frame.Right + effect3DOffset.X; c++) {
|
|
|
+ for (int c = Math.Max (frame.X + effect3DOffset.X, 0);
|
|
|
+ c < Math.Min (frame.Right + effect3DOffset.X, driver.Cols); c++) {
|
|
|
|
|
|
- AddRuneAt (driver, c, r, ' ');
|
|
|
+ AddRuneAt (driver, c, r, (Rune)driver.Contents [r, c, 0]);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// Draw the left Effect3D
|
|
|
- for (int r = frame.Y + effect3DOffset.Y;
|
|
|
- r < frame.Bottom + effect3DOffset.Y; r++) {
|
|
|
- for (int c = frame.X + effect3DOffset.X;
|
|
|
+ for (int r = Math.Max (frame.Y + effect3DOffset.Y, 0);
|
|
|
+ r < Math.Min (frame.Bottom + effect3DOffset.Y, driver.Rows); r++) {
|
|
|
+ for (int c = Math.Max (frame.X + effect3DOffset.X, 0);
|
|
|
c < frame.X; c++) {
|
|
|
|
|
|
- AddRuneAt (driver, c, r, ' ');
|
|
|
+ AddRuneAt (driver, c, r, (Rune)driver.Contents [r, c, 0]);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// Draw the right Effect3D
|
|
|
- for (int r = frame.Y + effect3DOffset.Y;
|
|
|
- r < frame.Bottom + effect3DOffset.Y; r++) {
|
|
|
+ for (int r = Math.Max (frame.Y + effect3DOffset.Y, 0);
|
|
|
+ r < Math.Min (frame.Bottom + effect3DOffset.Y, driver.Rows); r++) {
|
|
|
for (int c = frame.Right;
|
|
|
- c < frame.Right + effect3DOffset.X; c++) {
|
|
|
+ c < Math.Min (frame.Right + effect3DOffset.X, driver.Cols); c++) {
|
|
|
|
|
|
- AddRuneAt (driver, c, r, ' ');
|
|
|
+ AddRuneAt (driver, c, r, (Rune)driver.Contents [r, c, 0]);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// Draw the lower Effect3D
|
|
|
for (int r = frame.Bottom;
|
|
|
- r < frame.Bottom + effect3DOffset.Y; r++) {
|
|
|
- for (int c = frame.X + effect3DOffset.X;
|
|
|
- c < frame.Right + effect3DOffset.X; c++) {
|
|
|
+ r < Math.Min (frame.Bottom + effect3DOffset.Y, driver.Rows); r++) {
|
|
|
+ for (int c = Math.Max (frame.X + effect3DOffset.X, 0);
|
|
|
+ c < Math.Min (frame.Right + effect3DOffset.X, driver.Cols); c++) {
|
|
|
|
|
|
- AddRuneAt (driver, c, r, ' ');
|
|
|
+ AddRuneAt (driver, c, r, (Rune)driver.Contents [r, c, 0]);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private Attribute GetEffect3DBrush ()
|
|
|
+ {
|
|
|
+ return Effect3DBrush == null
|
|
|
+ ? new Attribute (Color.Gray, Color.DarkGray)
|
|
|
+ : (Attribute)Effect3DBrush;
|
|
|
+ }
|
|
|
+
|
|
|
private void AddRuneAt (ConsoleDriver driver, int col, int row, Rune ch)
|
|
|
{
|
|
|
driver.Move (col, row);
|