Miguel de Icaza 7 лет назад
Родитель
Сommit
874c685f9e
1 измененных файлов с 80 добавлено и 1 удалено
  1. 80 1
      Terminal.Gui/Views/TextView.cs

+ 80 - 1
Terminal.Gui/Views/TextView.cs

@@ -4,6 +4,13 @@
 // Authors:
 //   Miguel de Icaza ([email protected])
 //
+// 
+// TODO:
+// Attributed text on spans
+// Cursor target track
+// Kill-ring, paste
+// Render selection
+// Mark/Delete/Cut commands
 
 using System;
 using System.Collections.Generic;
@@ -98,6 +105,16 @@ namespace Terminal.Gui {
 		public int Count => lines.Count;
 
 		public List<Rune> GetLine (int line) => lines [line];
+
+		public void AddLine (int pos, List<Rune> runes)
+		{
+			lines.Insert (pos, runes);
+		}
+
+		public void RemoveLine (int pos)
+		{
+			lines.RemoveAt (pos);
+		}
 	}
 
 	/// <summary>
@@ -224,7 +241,7 @@ namespace Terminal.Gui {
 			Clipboard.Contents = text;
 		}
 
-		public void Insert (Rune rune)
+		void Insert (Rune rune)
 		{
 			var line = model.GetLine (currentRow);
 			line.Insert (currentColumn, rune);
@@ -316,6 +333,30 @@ namespace Terminal.Gui {
 
 			case Key.Delete:
 			case Key.Backspace:
+				if (currentColumn > 0) {
+					currentLine = model.GetLine (currentRow);
+					currentLine.RemoveAt (currentColumn - 1);
+					currentColumn--;
+					if (currentColumn < leftColumn) {
+						leftColumn--;
+						SetNeedsDisplay ();
+					} else
+						SetNeedsDisplay (new Rect (0, currentRow - topRow, 1, Frame.Width));
+				} else {
+					// Merges the current line with the previous one.
+					if (currentRow == 0)
+						return true;
+					var prowIdx = currentRow - 1;
+					var prevRow = model.GetLine (prowIdx);
+					var prevCount = prevRow.Count;
+					model.GetLine (prowIdx).AddRange (model.GetLine (currentRow));
+					currentRow--;
+					currentColumn = prevCount;
+					leftColumn = currentColumn - Frame.Width + 1;
+					if (leftColumn < 0)
+						leftColumn = 0;
+					SetNeedsDisplay ();
+				}
 				break;
 
 			// Home, C-A
@@ -330,6 +371,20 @@ namespace Terminal.Gui {
 				break;
 
 			case Key.ControlD: // Delete
+				currentLine = model.GetLine (currentRow);
+				if (currentColumn == currentLine.Count) {
+					if (currentRow + 1 == model.Count)
+						break;
+					var nextLine = model.GetLine (currentRow + 1);
+					currentLine.AddRange (nextLine);
+					model.RemoveLine (currentRow + 1);
+					var sr = currentRow - topRow;
+					SetNeedsDisplay (new Rect (0, sr, Frame.Width, sr + 1));
+				} else {
+					currentLine.RemoveAt (currentColumn);
+					var r = currentRow - topRow;
+					SetNeedsDisplay (new Rect (currentColumn - leftColumn, r, Frame.Width, r + 1));
+				}
 				break;
 
 			case Key.ControlE: // End
@@ -355,6 +410,30 @@ namespace Terminal.Gui {
 			case (Key)((int)'f' + Key.AltMask):
 				break;
 
+			case Key.Enter:
+				var orow = currentRow;
+				currentLine = model.GetLine (currentRow);
+				var restCount = currentLine.Count - currentColumn;
+				var rest = currentLine.GetRange (currentColumn, restCount);
+				currentLine.RemoveRange (currentColumn, restCount);
+				model.AddLine (currentRow + 1, rest);
+				currentRow++;
+				bool fullNeedsDisplay = false;
+				if (currentRow >= topRow + Frame.Height) {
+					topRow++;
+					fullNeedsDisplay = true;
+				}
+				currentColumn = 0;
+				if (currentColumn < leftColumn) {
+					fullNeedsDisplay = true;
+					leftColumn = 0;
+				}
+
+				if (fullNeedsDisplay)
+					SetNeedsDisplay ();
+				else
+					SetNeedsDisplay (new Rect (0, currentRow - topRow, 0, Frame.Height));
+				break;
 			default:
 				// Ignore control characters and other special keys
 				if (kb.Key < Key.Space || kb.Key > Key.CharMask)