KeyEvent.fromString constructor

KeyEvent.fromString(
  1. String spec
)

Parses a key specification string into a KeyEvent.

Supports both generic and specific modifier syntax:

  • 'a' → single character key
  • 'enter' → named key (use exact enum names)
  • 'ctrl+a' → modifier + key
  • 'shift+ctrl+enter' → multiple modifiers
  • 'play' → media key (use exact enum names)
  • 'ctrl+raiseVolume' → media key with modifier
  • 'leftCtrl' → named modifier key itself

Key names are case-insensitive and match the enum names from KeyCodeName.

Throws ArgumentError if the specification is invalid.

Implementation

factory KeyEvent.fromString(String spec) {
  if (spec.isEmpty) {
    throw ArgumentError('Key specification cannot be empty');
  }

  final parts = spec.split('+');
  final keyPart = parts.last;
  final modifierParts = parts.length > 1 ? parts.sublist(0, parts.length - 1) : [parts[0]];

  var modifierMask = KeyModifiers.none;

  for (final mod in modifierParts) {
    final genericMod = _parseGenericModifier(mod);
    if (genericMod != null) {
      modifierMask |= genericMod;
      continue;
    }

    if (parts.length > 1 && genericMod == null) {
      throw ArgumentError('Unknown modifier: $mod');
    }
  }

  var keyCode = _parseKey(keyPart);

  // Uppercase letters when shift modifier is present
  if (modifierMask.has(KeyModifiers.shift) && keyCode.kind == KeyCodeKind.char && keyCode.char.length == 1) {
    final char = keyCode.char;
    final code = char.codeUnitAt(0);
    // Check if it's a lowercase letter (a-z)
    if (code >= 0x61 && code <= 0x7A) {
      keyCode = KeyCode.char(char.toUpperCase());
    }
  }

  return KeyEvent(
    keyCode,
    modifiers: modifierMask,
  );
}