Ver Fonte

improve scroll wider performance

xuty há 4 anos atrás
pai
commit
5caa291be9
1 ficheiros alterados com 14 adições e 5 exclusões
  1. 14 5
      lib/buffer/reflow_strategy_wider.dart

+ 14 - 5
lib/buffer/reflow_strategy_wider.dart

@@ -9,9 +9,14 @@ class ReflowStrategyWider extends ReflowStrategy {
 
   @override
   void reflow(int newCols, int newRows, int oldCols, int oldRows) {
+    final linesAfterReflow = <BufferLine>[];
+
     for (var i = 0; i < buffer.lines.length; i++) {
       final line = buffer.lines[i];
       line.ensure(newCols);
+      linesAfterReflow.add(line);
+
+      var linesToSkip = 0;
       for (var offset = 1; i + offset < buffer.lines.length; offset++) {
         final nextLine = buffer.lines[i + offset];
         if (!nextLine.isWrapped) {
@@ -50,18 +55,22 @@ class ReflowStrategyWider extends ReflowStrategy {
         }
         line.copyCellsFrom(nextLine, 0, copyDestIndex, moveCount);
         if (moveCount >= nextLineLength) {
-          // if we unwrapped all cells off the next line, delete it
-          buffer.lines.remove(i + offset);
-          offset--;
+          // if we unwrapped all cells off the next line, skip it
+          linesToSkip++;
         } else {
           // otherwise just remove the characters we moved up a line
           nextLine.removeN(0, moveCount);
         }
       }
+
+      // skip empty lines.
+      i += linesToSkip;
     }
     //buffer doesn't have enough lines
-    while (buffer.lines.length < buffer.terminal.viewHeight) {
-      buffer.lines.push(BufferLine());
+    while (linesAfterReflow.length < buffer.terminal.viewHeight) {
+      linesAfterReflow.add(BufferLine(length: buffer.terminal.viewWidth));
     }
+
+    buffer.lines.replaceWith(linesAfterReflow);
   }
 }