keyPressed method

  1. @override
bool keyPressed(
  1. WriggleContext context,
  2. KeyInput key
)
override

Handle key presses. Return true if the key was absorbed, or false if another listener further up the tree should handle it.

Implementation

@override
bool keyPressed(WriggleContext context, KeyInput key) {
  final state = getState(context);
  final width = state.width;
  final cursorPos =
      state.cursorPos ?? (startCursorAtEnd ? content.length : 0);

  final lines = Text.wrapText(content, width, null);

  switch (key) {
    case KeyInput.arrowUp:
      final coords = _cursorCoords(context);
      if (coords == null) {
        return false;
      }
      if (coords.row == 0) {
        return false;
      }

      _setState(
        context,
        cursorPos: _cursorCoordsToIndex(context, coords.row - 1, coords.col),
      );
      return true;

    case KeyInput.arrowDown:
      final coords = _cursorCoords(context);
      if (coords == null) {
        return false;
      }
      if (coords.row + 1 >= lines.length) {
        return false;
      }
      _setState(
        context,
        cursorPos: _cursorCoordsToIndex(context, coords.row + 1, coords.col),
      );
      return true;

    case KeyInput.arrowLeft:
      final coords = _cursorCoords(context);
      if (coords == null) {
        return false;
      }
      final newCursor = _cursorCoordsToIndex(
        context,
        coords.row,
        coords.col - 1,
      );
      if (newCursor < 0) {
        return false;
      }
      _setState(context, cursorPos: newCursor);
      return true;

    case KeyInput.arrowRight:
      final coords = _cursorCoords(context);
      if (coords == null) {
        return false;
      }
      final newCursor = _cursorCoordsToIndex(
        context,
        coords.row,
        coords.col + 1,
      );
      if (newCursor > content.length) {
        return false;
      }
      _setState(context, cursorPos: newCursor);
      return true;

    case KeyInput.home:
      _setState(context, cursorPos: 0);
      return true;

    case KeyInput.end:
      _setState(context, cursorPos: content.length);
      return true;

    case KeyInput.tab:
      _insertCharacters(context, '    ');
      return true;

    case KeyInput.backspace:
      if (cursorPos > content.length) {
        _deleteCharacter(context, content.length - 1);
        return true;
      }
      _deleteCharacter(context, cursorPos - 1);
      return true;

    case KeyInput.delete:
      _deleteCharacter(context, cursorPos);
      return true;

    case KeyInput.controlDelete:
      _setState(context, cursorPos: 0);
      contentChanged(context, '');
      return true;

    case KeyInput.controlK:
      Wriggle.clipboard.write(content).then((value) {
        if (value) {
          _setState(context, cursorPos: 0);
          contentChanged(context, '');
        }
      });
      return true;
    case KeyInput.controlY:
      Wriggle.clipboard.write(content);
      return true;
    case KeyInput.controlU:
      Wriggle.clipboard.read().then(
        (value) => _insertCharacters(context, value.removeLineBreaks()),
      );
      return true;
    default:
  }

  if (key.isPrintable) {
    _insertCharacters(context, key.string);
    return true;
  }

  return false;
}