createDocumentShortcut function

DocumentKeyboardAction createDocumentShortcut(
  1. DocumentKeyboardAction action, {
  2. LogicalKeyboardKey? keyPressedOrReleased,
  3. Set<LogicalKeyboardKey>? triggers,
  4. bool? isShiftPressed,
  5. bool? isCmdPressed,
  6. bool? isCtlPressed,
  7. bool? isAltPressed,
  8. bool onKeyUp = false,
  9. bool onKeyDown = true,
  10. Set<TargetPlatform>? platforms,
})

A proxy for a DocumentKeyboardAction that filters events based on onKeyUp, onKeyDown, and shortcut.

If onKeyUp is false, all key-up events are ignored. If onKeyDown is false, all key-down events are ignored. If shortcut is non-null, all events that don't match the shortcut key presses are ignored.

This proxy is optional. Individual DocumentKeyboardActions can make these same decisions about key handling. This proxy is provided as a convenience for the average use-case, which typically tries to match a specific shortcut for either an up or down key event.

Implementation

DocumentKeyboardAction createDocumentShortcut(
  DocumentKeyboardAction action, {
  LogicalKeyboardKey? keyPressedOrReleased,
  Set<LogicalKeyboardKey>? triggers,
  bool? isShiftPressed,
  bool? isCmdPressed,
  bool? isCtlPressed,
  bool? isAltPressed,
  bool onKeyUp = false,
  bool onKeyDown = true,
  Set<TargetPlatform>? platforms,
}) {
  if (onKeyUp == false && onKeyDown == false) {
    throw Exception(
        "Invalid shortcut definition. Both onKeyUp and onKeyDown are false. This shortcut will never be triggered.");
  }

  return ({required DocumentContext documentContext, required KeyEvent keyEvent}) {
    if (keyEvent is KeyUpEvent && !onKeyUp) {
      return ExecutionInstruction.continueExecution;
    }

    if ((keyEvent is KeyDownEvent || keyEvent is KeyRepeatEvent) && !onKeyDown) {
      return ExecutionInstruction.continueExecution;
    }

    if (isCmdPressed != null && isCmdPressed != HardwareKeyboard.instance.isMetaPressed) {
      return ExecutionInstruction.continueExecution;
    }

    if (isCtlPressed != null && isCtlPressed != HardwareKeyboard.instance.isControlPressed) {
      return ExecutionInstruction.continueExecution;
    }

    if (isAltPressed != null && isAltPressed != HardwareKeyboard.instance.isAltPressed) {
      return ExecutionInstruction.continueExecution;
    }

    if (isShiftPressed != null) {
      if (isShiftPressed && !HardwareKeyboard.instance.isShiftPressed) {
        return ExecutionInstruction.continueExecution;
      } else if (!isShiftPressed && HardwareKeyboard.instance.isShiftPressed) {
        return ExecutionInstruction.continueExecution;
      }
    }

    if (keyPressedOrReleased != null && keyEvent.logicalKey != keyPressedOrReleased) {
      // Manually account for the fact that Flutter pretends that different
      // shift keys mean different things.
      if ((keyPressedOrReleased == LogicalKeyboardKey.shift ||
              keyPressedOrReleased == LogicalKeyboardKey.shiftLeft ||
              keyPressedOrReleased == LogicalKeyboardKey.shiftRight) &&
          (keyEvent.logicalKey == LogicalKeyboardKey.shift ||
              keyEvent.logicalKey == LogicalKeyboardKey.shiftLeft ||
              keyEvent.logicalKey == LogicalKeyboardKey.shiftRight)) {
        // This is a false positive signal. We're looking for a shift key trigger, and
        // one of the shifts is the trigger. We don't care which one.
      } else {
        return ExecutionInstruction.continueExecution;
      }
    }

    if (triggers != null) {
      for (final key in triggers) {
        if (!HardwareKeyboard.instance.isLogicalKeyPressed(key)) {
          // Manually account for the fact that Flutter pretends that different
          // shift keys mean different things.
          if (key == LogicalKeyboardKey.shift ||
              key == LogicalKeyboardKey.shiftLeft ||
              key == LogicalKeyboardKey.shiftRight) {
            if (keyEvent.logicalKey == LogicalKeyboardKey.shift ||
                keyEvent.logicalKey == LogicalKeyboardKey.shiftLeft ||
                keyEvent.logicalKey == LogicalKeyboardKey.shiftRight) {
              // This is a false positive signal. We're looking for a shift key trigger, and
              // one of the shifts is the trigger. We don't care which one.
              continue;
            }
          }

          // A required trigger key isn't currently pressed. We don't
          // want to respond to this key event.
          return ExecutionInstruction.continueExecution;
        }
      }
    }

    if (platforms != null && !platforms.contains(defaultTargetPlatform)) {
      return ExecutionInstruction.continueExecution;
    }

    // The key event has passed all the proxy conditions. Run the real key action.
    return action(documentContext: documentContext, keyEvent: keyEvent);
  };
}