reflow method

  1. @override
void reflow(
  1. int newCols,
  2. int newRows,
  3. int oldCols,
  4. int oldRows,
)
override

Implementation

@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) {
        break;
      }
      // when we are reflowing wider we can be sure that this line and the next all have equal to or less than
      // 'newCols' length => we can pass newCols as the upper limit
      final lineLength = line.getTrimmedLength(newCols);

      var copyDestIndex = lineLength;
      if (copyDestIndex >= 1 &&
          line.cellGetWidth(copyDestIndex - 1) == 2 &&
          line.cellGetContent(copyDestIndex) == 0) {
        //we would override a wide char placeholder => move index one to the right
        copyDestIndex += 1;
      }

      final spaceOnLine = newCols - copyDestIndex;
      if (spaceOnLine <= 0) {
        // no more space to unwrap
        break;
      }
      // when we are reflowing wider we can be sure that this line and the next all have equal to or less than
      // 'newCols' length => we can pass newCols as the upper limit
      final nextLineLength = nextLine.getTrimmedLength(newCols);
      var moveCount = min(spaceOnLine, nextLineLength);
      if (moveCount <= 0) {
        break;
      }

      // when we are about to copy a double width character
      // to the end of the line then we just ignore it as the target width
      // would be too much
      if (nextLine.cellGetWidth(moveCount - 1) == 2) {
        moveCount -= 1;
      }
      line.copyCellsFrom(nextLine, 0, copyDestIndex, moveCount);
      if (moveCount >= nextLineLength) {
        // 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 (linesAfterReflow.length < buffer.viewHeight) {
    linesAfterReflow.add(BufferLine(length: buffer.viewWidth));
  }

  buffer.lines.replaceWith(linesAfterReflow);
}