From b945231c22afb2337aaf3c0f0169f47e03ccef4e Mon Sep 17 00:00:00 2001 From: BDisp Date: Mon, 27 Feb 2023 19:20:44 +0000 Subject: [PATCH] Fixes redraw behavior by ignoring negative rows. --- Terminal.Gui/Core/Border.cs | 121 ++++++++++++++++++++++++------------ 1 file changed, 80 insertions(+), 41 deletions(-) diff --git a/Terminal.Gui/Core/Border.cs b/Terminal.Gui/Core/Border.cs index 8040afdeb..2bf9244b6 100644 --- a/Terminal.Gui/Core/Border.cs +++ b/Terminal.Gui/Core/Border.cs @@ -651,9 +651,13 @@ namespace Terminal.Gui { // Draw the upper BorderThickness for (int r = frame.Y - drawMarginFrame - sumThickness.Top; - r > 0 && r < frame.Y - drawMarginFrame - padding.Top; r++) { + r < frame.Y - drawMarginFrame - padding.Top; r++) { + + if (r < 0) { + continue; + } for (int c = frame.X - drawMarginFrame - sumThickness.Left; - c > 0 && c < Math.Min (frame.Right + drawMarginFrame + sumThickness.Right, driver.Cols); c++) { + c < Math.Min (frame.Right + drawMarginFrame + sumThickness.Right, driver.Cols); c++) { AddRuneAt (driver, c, r, ' '); } @@ -661,9 +665,13 @@ namespace Terminal.Gui { // Draw the left BorderThickness for (int r = frame.Y - drawMarginFrame - padding.Top; - r > 0 && r < Math.Min (frame.Bottom + drawMarginFrame + padding.Bottom, driver.Rows); r++) { + r < Math.Min (frame.Bottom + drawMarginFrame + padding.Bottom, driver.Rows); r++) { + + if (r < 0) { + continue; + } for (int c = frame.X - drawMarginFrame - sumThickness.Left; - c > 0 && c < frame.X - drawMarginFrame - padding.Left; c++) { + c < frame.X - drawMarginFrame - padding.Left; c++) { AddRuneAt (driver, c, r, ' '); } @@ -671,9 +679,13 @@ namespace Terminal.Gui { // Draw the right BorderThickness for (int r = frame.Y - drawMarginFrame - padding.Top; - r > 0 && r < Math.Min (frame.Bottom + drawMarginFrame + padding.Bottom, driver.Rows); r++) { + r < Math.Min (frame.Bottom + drawMarginFrame + padding.Bottom, driver.Rows); r++) { + + if (r < 0) { + continue; + } for (int c = frame.Right + drawMarginFrame + padding.Right; - c > 0 && c < Math.Min (frame.Right + drawMarginFrame + sumThickness.Right, driver.Cols); c++) { + c < Math.Min (frame.Right + drawMarginFrame + sumThickness.Right, driver.Cols); c++) { AddRuneAt (driver, c, r, ' '); } @@ -681,9 +693,9 @@ namespace Terminal.Gui { // Draw the lower BorderThickness for (int r = frame.Bottom + drawMarginFrame + padding.Bottom; - r > 0 && r > 0 && r < Math.Min (frame.Bottom + drawMarginFrame + sumThickness.Bottom, driver.Rows); r++) { + r < Math.Min (frame.Bottom + drawMarginFrame + sumThickness.Bottom, driver.Rows); r++) { for (int c = frame.X - drawMarginFrame - sumThickness.Left; - c > 0 && c > 0 && c < Math.Min (frame.Right + drawMarginFrame + sumThickness.Right, driver.Cols); c++) { + c < Math.Min (frame.Right + drawMarginFrame + sumThickness.Right, driver.Cols); c++) { AddRuneAt (driver, c, r, ' '); } @@ -693,9 +705,13 @@ namespace Terminal.Gui { // Draw the upper Padding for (int r = frame.Y - drawMarginFrame - padding.Top; - r > 0 && r < frame.Y - drawMarginFrame; r++) { + r < frame.Y - drawMarginFrame; r++) { + + if (r < 0) { + continue; + } for (int c = frame.X - drawMarginFrame - padding.Left; - c > 0 && c < Math.Min (frame.Right + drawMarginFrame + padding.Right, driver.Cols); c++) { + c < Math.Min (frame.Right + drawMarginFrame + padding.Right, driver.Cols); c++) { AddRuneAt (driver, c, r, ' '); } @@ -703,9 +719,9 @@ namespace Terminal.Gui { // Draw the left Padding for (int r = frame.Y - drawMarginFrame; - r > 0 && r < Math.Min (frame.Bottom + drawMarginFrame, driver.Rows); r++) { + r < Math.Min (frame.Bottom + drawMarginFrame, driver.Rows); r++) { for (int c = frame.X - drawMarginFrame - padding.Left; - c > 0 && c < frame.X - drawMarginFrame; c++) { + c < frame.X - drawMarginFrame; c++) { AddRuneAt (driver, c, r, ' '); } @@ -713,9 +729,9 @@ namespace Terminal.Gui { // Draw the right Padding for (int r = frame.Y - drawMarginFrame; - r > 0 && r < Math.Min (frame.Bottom + drawMarginFrame, driver.Rows); r++) { + r < Math.Min (frame.Bottom + drawMarginFrame, driver.Rows); r++) { for (int c = frame.Right + drawMarginFrame; - c > 0 && c < Math.Min (frame.Right + drawMarginFrame + padding.Right, driver.Cols); c++) { + c < Math.Min (frame.Right + drawMarginFrame + padding.Right, driver.Cols); c++) { AddRuneAt (driver, c, r, ' '); } @@ -723,9 +739,9 @@ namespace Terminal.Gui { // Draw the lower Padding for (int r = frame.Bottom + drawMarginFrame; - r > 0 && r < Math.Min (frame.Bottom + drawMarginFrame + padding.Bottom, driver.Rows); r++) { + r < Math.Min (frame.Bottom + drawMarginFrame + padding.Bottom, driver.Rows); r++) { for (int c = frame.X - drawMarginFrame - padding.Left; - c > 0 && c < Math.Min (frame.Right + drawMarginFrame + padding.Right, driver.Cols); c++) { + c < Math.Min (frame.Right + drawMarginFrame + padding.Right, driver.Cols); c++) { AddRuneAt (driver, c, r, ' '); } @@ -825,9 +841,12 @@ namespace Terminal.Gui { // Draw the upper BorderThickness for (int r = frame.Y; - r > 0 && r < Math.Min (frame.Y + borderThickness.Top, frame.Bottom); r++) { + r < Math.Min (frame.Y + borderThickness.Top, frame.Bottom); r++) { + if (r < 0) { + continue; + } for (int c = frame.X; - c > 0 && c < Math.Min (frame.Right, driver.Cols); c++) { + c < Math.Min (frame.Right, driver.Cols); c++) { AddRuneAt (driver, c, r, ' '); } @@ -835,9 +854,13 @@ namespace Terminal.Gui { // Draw the left BorderThickness for (int r = Math.Min (frame.Y + borderThickness.Top, frame.Bottom); - r > 0 && r < Math.Min (frame.Bottom - borderThickness.Bottom, driver.Rows); r++) { + r < Math.Min (frame.Bottom - borderThickness.Bottom, driver.Rows); r++) { + + if (r < 0) { + continue; + } for (int c = frame.X; - c > 0 && c < Math.Min (frame.X + borderThickness.Left, frame.Right); c++) { + c < Math.Min (frame.X + borderThickness.Left, frame.Right); c++) { AddRuneAt (driver, c, r, ' '); } @@ -845,9 +868,13 @@ namespace Terminal.Gui { // Draw the right BorderThickness for (int r = Math.Min (frame.Y + borderThickness.Top, frame.Bottom); - r > 0 && r < Math.Min (frame.Bottom - borderThickness.Bottom, driver.Rows); r++) { + r < Math.Min (frame.Bottom - borderThickness.Bottom, driver.Rows); r++) { + + if (r < 0) { + continue; + } for (int c = Math.Max (frame.Right - borderThickness.Right, frame.X); - c > 0 && c < Math.Min (frame.Right, driver.Cols); c++) { + c < Math.Min (frame.Right, driver.Cols); c++) { AddRuneAt (driver, c, r, ' '); } @@ -855,9 +882,9 @@ namespace Terminal.Gui { // Draw the lower BorderThickness for (int r = Math.Max (frame.Bottom - borderThickness.Bottom, frame.Y); - r > 0 && r < Math.Min (frame.Bottom, driver.Rows); r++) { + r < Math.Min (frame.Bottom, driver.Rows); r++) { for (int c = frame.X; - c > 0 && c < Math.Min (frame.Right, driver.Cols); c++) { + c < Math.Min (frame.Right, driver.Cols); c++) { AddRuneAt (driver, c, r, ' '); } @@ -867,9 +894,13 @@ namespace Terminal.Gui { // Draw the upper Padding for (int r = frame.Y + borderThickness.Top; - r > 0 && r < Math.Min (frame.Y + sumThickness.Top, frame.Bottom - borderThickness.Bottom); r++) { + r < Math.Min (frame.Y + sumThickness.Top, frame.Bottom - borderThickness.Bottom); r++) { + + if (r < 0) { + continue; + } for (int c = frame.X + borderThickness.Left; - c > 0 && c < Math.Min (frame.Right - borderThickness.Right, driver.Cols); c++) { + c < Math.Min (frame.Right - borderThickness.Right, driver.Cols); c++) { AddRuneAt (driver, c, r, ' '); } @@ -877,9 +908,13 @@ namespace Terminal.Gui { // Draw the left Padding for (int r = frame.Y + sumThickness.Top; - r > 0 && r < Math.Min (frame.Bottom - sumThickness.Bottom, driver.Rows); r++) { + r < Math.Min (frame.Bottom - sumThickness.Bottom, driver.Rows); r++) { + + if (r < 0) { + continue; + } for (int c = frame.X + borderThickness.Left; - c > 0 && c < Math.Min (frame.X + sumThickness.Left, frame.Right - borderThickness.Right); c++) { + c < Math.Min (frame.X + sumThickness.Left, frame.Right - borderThickness.Right); c++) { AddRuneAt (driver, c, r, ' '); } @@ -887,9 +922,13 @@ namespace Terminal.Gui { // Draw the right Padding for (int r = frame.Y + sumThickness.Top; - r > 0 && r < Math.Min (frame.Bottom - sumThickness.Bottom, driver.Rows); r++) { + r < Math.Min (frame.Bottom - sumThickness.Bottom, driver.Rows); r++) { + + if (r < 0) { + continue; + } for (int c = Math.Max (frame.Right - sumThickness.Right, frame.X + sumThickness.Left); - c > 0 && c < Math.Max (frame.Right - borderThickness.Right, frame.X + sumThickness.Left); c++) { + c < Math.Max (frame.Right - borderThickness.Right, frame.X + sumThickness.Left); c++) { AddRuneAt (driver, c, r, ' '); } @@ -897,9 +936,9 @@ namespace Terminal.Gui { // Draw the lower Padding for (int r = Math.Max (frame.Bottom - sumThickness.Bottom, frame.Y + borderThickness.Top); - r > 0 && r < Math.Min (frame.Bottom - borderThickness.Bottom, driver.Rows); r++) { + r < Math.Min (frame.Bottom - borderThickness.Bottom, driver.Rows); r++) { for (int c = frame.X + borderThickness.Left; - c > 0 && c < Math.Min (frame.Right - borderThickness.Right, driver.Cols); c++) { + c < Math.Min (frame.Right - borderThickness.Right, driver.Cols); c++) { AddRuneAt (driver, c, r, ' '); } @@ -926,9 +965,9 @@ namespace Terminal.Gui { // Draw the upper Effect3D for (int r = Math.Max (frame.Y + effect3DOffset.Y, 0); - r > 0 && r < frame.Y; r++) { + r < frame.Y; r++) { for (int c = Math.Max (frame.X + effect3DOffset.X, 0); - c > 0 && c < Math.Min (frame.Right + effect3DOffset.X, driver.Cols); c++) { + c < Math.Min (frame.Right + effect3DOffset.X, driver.Cols); c++) { AddRuneAt (driver, c, r, (Rune)driver.Contents [r, c, 0]); } @@ -936,9 +975,9 @@ namespace Terminal.Gui { // Draw the left Effect3D for (int r = Math.Max (frame.Y + effect3DOffset.Y, 0); - r > 0 && r < Math.Min (frame.Bottom + effect3DOffset.Y, driver.Rows); r++) { + r < Math.Min (frame.Bottom + effect3DOffset.Y, driver.Rows); r++) { for (int c = Math.Max (frame.X + effect3DOffset.X, 0); - c > 0 && c < frame.X; c++) { + c < frame.X; c++) { AddRuneAt (driver, c, r, (Rune)driver.Contents [r, c, 0]); } @@ -946,9 +985,9 @@ namespace Terminal.Gui { // Draw the right Effect3D for (int r = Math.Max (frame.Y + effect3DOffset.Y, 0); - r > 0 && r < Math.Min (frame.Bottom + effect3DOffset.Y, driver.Rows); r++) { + r < Math.Min (frame.Bottom + effect3DOffset.Y, driver.Rows); r++) { for (int c = frame.Right; - c > 0 && c < Math.Min (frame.Right + effect3DOffset.X, driver.Cols); c++) { + c < Math.Min (frame.Right + effect3DOffset.X, driver.Cols); c++) { AddRuneAt (driver, c, r, (Rune)driver.Contents [r, c, 0]); } @@ -956,9 +995,9 @@ namespace Terminal.Gui { // Draw the lower Effect3D for (int r = frame.Bottom; - r > 0 && r < Math.Min (frame.Bottom + effect3DOffset.Y, driver.Rows); r++) { + r < Math.Min (frame.Bottom + effect3DOffset.Y, driver.Rows); r++) { for (int c = Math.Max (frame.X + effect3DOffset.X, 0); - c > 0 && c < Math.Min (frame.Right + effect3DOffset.X, driver.Cols); c++) { + c < Math.Min (frame.Right + effect3DOffset.X, driver.Cols); c++) { AddRuneAt (driver, c, r, (Rune)driver.Contents [r, c, 0]); } @@ -1034,4 +1073,4 @@ namespace Terminal.Gui { BorderChanged?.Invoke (this); } } -} +} \ No newline at end of file