keyPressed method
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;
}