parseShortcut function
Implementation
LogicalKeySet? parseShortcut(String shortcut) {
final parts = shortcut.toLowerCase().split('+').map((s) => s.trim()).toList();
final keys = <LogicalKeyboardKey>[];
for (var part in parts) {
switch (part) {
case 'ctrl':
case 'control':
keys.add(LogicalKeyboardKey.control);
break;
case 'shift':
keys.add(LogicalKeyboardKey.shift);
break;
case 'alt':
keys.add(LogicalKeyboardKey.alt);
break;
case 'meta':
case 'cmd':
case 'command':
keys.add(LogicalKeyboardKey.meta);
break;
// arrow keys
case 'up':
case 'arrowup':
keys.add(LogicalKeyboardKey.arrowUp);
break;
case 'down':
case 'arrowdown':
keys.add(LogicalKeyboardKey.arrowDown);
break;
case 'left':
case 'arrowleft':
keys.add(LogicalKeyboardKey.arrowLeft);
break;
case 'right':
case 'arrowright':
keys.add(LogicalKeyboardKey.arrowRight);
break;
// escape, enter, space etc.
case 'esc':
case 'escape':
keys.add(LogicalKeyboardKey.escape);
break;
case 'enter':
case 'return':
keys.add(LogicalKeyboardKey.enter);
break;
case 'space':
case 'spacebar':
keys.add(LogicalKeyboardKey.space);
break;
default:
// check for single character (letters, digits)
if (part.length == 1) {
final code = part.toUpperCase().codeUnitAt(0);
final key = LogicalKeyboardKey(code);
keys.add(key);
}
else {
// Fallback: try lookup by keyLabel
final match = LogicalKeyboardKey.knownLogicalKeys.firstWhere(
(k) => k.keyLabel.toLowerCase() == part,
orElse: () => LogicalKeyboardKey.camera, // TODO
);
if (match != LogicalKeyboardKey.camera) {
keys.add(match);
}
}
}
}
if (keys.isEmpty)
return null;
return LogicalKeySet.fromSet(keys.toSet());
}