浏览代码

Fixed crash

Tigger Kindel 2 年之前
父节点
当前提交
f9fe2dca34
共有 2 个文件被更改,包括 50 次插入10 次删除
  1. 46 6
      Terminal.Gui/Core/Frame.cs
  2. 4 4
      Terminal.Gui/Drawing/Ruler.cs

+ 46 - 6
Terminal.Gui/Core/Frame.cs

@@ -85,8 +85,8 @@ namespace Terminal.Gui {
 		/// <summary>
 		/// Redraws the Frames that comprise the <see cref="Frame"/>.
 		/// </summary>
-		/// <param name="clipRect"></param>
-		public override void Redraw (Rect clipRect)
+		/// <param name="bounds"></param>
+		public override void Redraw (Rect bounds)
 		{
 			if (Thickness == Thickness.Empty) return;
 
@@ -114,7 +114,13 @@ namespace Terminal.Gui {
 
 			if (Id == "BorderFrame" && BorderStyle != BorderStyle.None) {
 				var lc = new LineCanvas ();
-				if (Thickness.Top > 0 && Frame.Width > 1 && Frame.Height > 1) {
+				
+				var drawTop = Thickness.Top > 0 && Frame.Width > 1 && Frame.Height > 1;
+				var drawLeft = Thickness.Left > 0 && (Frame.Height > 1 || Thickness.Top == 0);
+				var drawBottom = Thickness.Bottom > 0 && Frame.Width > 1;
+				var drawRight = Thickness.Right > 0 && (Frame.Height > 1 || Thickness.Top == 0);
+
+				if (drawTop) {
 					// ╔╡Title╞═════╗
 					// ╔╡╞═════╗
 					if (Frame.Width < 4 || ustring.IsNullOrEmpty (Parent?.Title)) {
@@ -133,19 +139,53 @@ namespace Terminal.Gui {
 						lc.AddLine (new Point (screenBounds.X + 1 + (titleWidth + 1), screenBounds.Location.Y), Frame.Width - (titleWidth + 3), Orientation.Horizontal, BorderStyle);
 					}
 				}
-				if (Thickness.Left > 0 && (Frame.Height > 1 || Thickness.Top == 0)) {
+				if (drawLeft) {
 					lc.AddLine (screenBounds.Location, Frame.Height - 1, Orientation.Vertical, BorderStyle);
 				}
-				if (Thickness.Bottom > 0 && Frame.Width > 1) {
+				if (drawBottom) {
 					lc.AddLine (new Point (screenBounds.X, screenBounds.Y + screenBounds.Height - 1), screenBounds.Width - 1, Orientation.Horizontal, BorderStyle);
 				}
-				if (Thickness.Right > 0 && (Frame.Height > 1 || Thickness.Top == 0)) {
+				if (drawRight) {
 					lc.AddLine (new Point (screenBounds.X + screenBounds.Width - 1, screenBounds.Y), screenBounds.Height - 1, Orientation.Vertical, BorderStyle);
 				}
 				foreach (var p in lc.GenerateImage (screenBounds)) {
 					Driver.Move (p.Key.X, p.Key.Y);
 					Driver.AddRune (p.Value);
 				}
+
+				// TODO: This should be moved to LineCanvas as a new BorderStyle.Ruler
+				if ((ConsoleDriver.Diagnostics & ConsoleDriver.DiagnosticFlags.FrameRuler) == ConsoleDriver.DiagnosticFlags.FrameRuler) {
+					// Top
+					var hruler = new Ruler () { Length = screenBounds.Width, Orientation = Orientation.Horizontal };
+					if (drawTop) {
+						hruler.Draw (new Point (screenBounds.X, screenBounds.Y));
+					}
+
+					// Redraw title 
+					if (drawTop && Id == "BorderFrame" && !ustring.IsNullOrEmpty (Parent?.Title)) {
+						var prevAttr = Driver.GetAttribute ();
+						Driver.SetAttribute (Parent.HasFocus ? Parent.GetHotNormalColor () : Parent.GetNormalColor ());
+						Driver.DrawWindowTitle (screenBounds, Parent?.Title, 0, 0, 0, 0);
+						Driver.SetAttribute (prevAttr);
+					}
+
+					//Left
+					var vruler = new Ruler () { Length = screenBounds.Height - 2, Orientation = Orientation.Vertical };
+					if (drawLeft) {
+						vruler.Draw (new Point (screenBounds.X, screenBounds.Y + 1), 1);
+					}
+
+					// Bottom
+					if (drawBottom) {
+						hruler.Draw (new Point (screenBounds.X, screenBounds.Y + screenBounds.Height - 1));
+					}
+
+					// Right
+					if (drawRight) {
+						vruler.Draw (new Point (screenBounds.X + screenBounds.Width - 1, screenBounds.Y + 1), 1);
+					}
+
+				}
 			}
 
 

+ 4 - 4
Terminal.Gui/Drawing/Ruler.cs

@@ -46,19 +46,19 @@ namespace Terminal.Gui {
 			if (start < 0) {
 				throw new ArgumentException ("start must be greater than or equal to 0");
 			}
-			
+
 			if (Length < 1) {
 				return;
 			}
-			
+
 			if (Orientation == Orientation.Horizontal) {
-				var hrule = _hTemplate.Repeat ((int)Math.Ceiling ((double)Length / (double)_hTemplate.Length)) [start..(Length + start)];
+				var hrule = _hTemplate.Repeat ((int)Math.Ceiling ((double)Length + 2 / (double)_hTemplate.Length)) [start..(Length + start)];
 				// Top
 				Application.Driver.Move (location.X, location.Y);
 				Application.Driver.AddStr (hrule);
 
 			} else {
-				var vrule = _vTemplate.Repeat ((int)Math.Ceiling ((double)(Length) / (double)_vTemplate.Length)) [start..(Length + start)];
+				var vrule = _vTemplate.Repeat ((int)Math.Ceiling ((double)(Length + 2) / (double)_vTemplate.Length)) [start..(Length + start)];
 				for (var r = location.Y; r < location.Y + Length; r++) {
 					Application.Driver.Move (location.X, r);
 					Application.Driver.AddRune (vrule [r - location.Y]);