Browse Source

adds some clear line + wrapped logic

devmil 4 năm trước cách đây
mục cha
commit
47e2d5cf76
3 tập tin đã thay đổi với 18 bổ sung14 xóa
  1. 11 10
      lib/buffer/buffer.dart
  2. 4 1
      lib/buffer/buffer_line.dart
  3. 3 3
      lib/buffer/buffer_reflow.dart

+ 11 - 10
lib/buffer/buffer.dart

@@ -73,12 +73,13 @@ class Buffer {
       return lines.last;
     }
 
-    while (index >= lines.length) {
-      final newLine = BufferLine();
-      lines.add(newLine);
+    final rawIndex = convertViewLineToRawLine(index);
+
+    if(rawIndex >= lines.length) {
+      lines.addAll(List<BufferLine>.generate(rawIndex - lines.length + 1, (index) => BufferLine()));
     }
 
-    return lines[convertViewLineToRawLine(index)];
+    return lines[rawIndex];
   }
 
   BufferLine get currentLine {
@@ -148,7 +149,7 @@ class Buffer {
     eraseLineFromCursor();
 
     for (var i = _cursorY + 1; i < terminal.viewHeight; i++) {
-      getViewLine(i).erase(terminal.cellAttr.value, 0, terminal.viewWidth);
+      getViewLine(i).erase(terminal.cellAttr.value, 0, terminal.viewWidth, true);
     }
   }
 
@@ -156,27 +157,27 @@ class Buffer {
     eraseLineToCursor();
 
     for (var i = 0; i < _cursorY; i++) {
-      getViewLine(i).erase(terminal.cellAttr.value, 0, terminal.viewWidth);
+      getViewLine(i).erase(terminal.cellAttr.value, 0, terminal.viewWidth, true);
     }
   }
 
   void eraseDisplay() {
     for (var i = 0; i < terminal.viewHeight; i++) {
       final line = getViewLine(i);
-      line.erase(terminal.cellAttr.value, 0, terminal.viewWidth);
+      line.erase(terminal.cellAttr.value, 0, terminal.viewWidth, true);
     }
   }
 
   void eraseLineFromCursor() {
-    currentLine.erase(terminal.cellAttr.value, _cursorX, terminal.viewWidth);
+    currentLine.erase(terminal.cellAttr.value, _cursorX, terminal.viewWidth, _cursorX == 0);
   }
 
   void eraseLineToCursor() {
-    currentLine.erase(terminal.cellAttr.value, 0, _cursorX);
+    currentLine.erase(terminal.cellAttr.value, 0, _cursorX, _cursorX == 0);
   }
 
   void eraseLine() {
-    currentLine.erase(terminal.cellAttr.value, 0, terminal.viewWidth);
+    currentLine.erase(terminal.cellAttr.value, 0, terminal.viewWidth, true);
   }
 
   void eraseCharacters(int count) {

+ 4 - 1
lib/buffer/buffer_line.dart

@@ -40,7 +40,7 @@ class BufferLine {
     return width;
   }
 
-  void erase(CellAttr attr, int start, int end) {
+  void erase(CellAttr attr, int start, int end, bool clearWrap) {
     for (var i = start; i < end; i++) {
       if (i >= length) {
         add(Cell(attr: attr));
@@ -48,6 +48,9 @@ class BufferLine {
         getCell(i).erase(attr);
       }
     }
+    if(_isWrapped && clearWrap) {
+      _isWrapped = false;
+    }
   }
 
   Cell getCell(int index) {

+ 3 - 3
lib/buffer/buffer_reflow.dart

@@ -220,7 +220,7 @@ class BufferReflow {
           if (nextToInsertIndex < toInsert.length - 1) {
             nextToInsert = toInsert[++nextToInsertIndex];
           } else {
-            nextToInsert = InsertionSet.nullValue;
+            nextToInsert = InsertionSet.nullValue; //TODO: just break?
           }
         } else {
           _buffer.lines[i] = originalLines[originalLineIndex--];
@@ -420,13 +420,13 @@ class BufferReflow {
                 wrappedLines[destLineIndex - 1], colsAfter - 1, destCol++, 1);
             // Null out the end of the last row
             wrappedLines[destLineIndex - 1]
-                .erase(_buffer.terminal.cellAttr.value, colsAfter - 1, colsAfter);
+                .erase(_buffer.terminal.cellAttr.value, colsAfter - 1, colsAfter, false);
           }
         }
       }
 
       // Clear out remaining cells or fragments could remain;
-      wrappedLines[destLineIndex].erase(_buffer.terminal.cellAttr.value, destCol, colsAfter);
+      wrappedLines[destLineIndex].erase(_buffer.terminal.cellAttr.value, destCol, colsAfter, false);
 
       // Work backwards and remove any rows at the end that only contain null cells
       int countToRemove = 0;