diff --git a/super_editor/example/lib/demos/flutter_features/textinputclient/barebones_ios_text_input_client.dart b/super_editor/example/lib/demos/flutter_features/textinputclient/barebones_ios_text_input_client.dart index 455d4be214..1b8448b21d 100644 --- a/super_editor/example/lib/demos/flutter_features/textinputclient/barebones_ios_text_input_client.dart +++ b/super_editor/example/lib/demos/flutter_features/textinputclient/barebones_ios_text_input_client.dart @@ -4,7 +4,7 @@ import 'package:super_text_layout/super_text_layout.dart'; /// Demo that displays a very limited iOS text field, constructed from /// the ground up, using [TextInput] for user interaction instead -/// of a [RawKeyboardListener] or similar. +/// of a [KeyboardListener] or similar. class BarebonesIosTextInputClientDemo extends StatefulWidget { @override State createState() => _BarebonesIosTextInputClientDemoState(); diff --git a/super_editor/example/lib/demos/flutter_features/textinputclient/basic_text_input_client.dart b/super_editor/example/lib/demos/flutter_features/textinputclient/basic_text_input_client.dart index 704c2a955c..aa78742c97 100644 --- a/super_editor/example/lib/demos/flutter_features/textinputclient/basic_text_input_client.dart +++ b/super_editor/example/lib/demos/flutter_features/textinputclient/basic_text_input_client.dart @@ -4,7 +4,7 @@ import 'package:super_text_layout/super_text_layout.dart'; /// Demo that displays a very limited text field, constructed from /// the ground up, and using [TextInput] for user interaction instead -/// of a [RawKeyboardListener] or similar. +/// of a [KeyboardListener] or similar. class BasicTextInputClientDemo extends StatefulWidget { @override State createState() => _BasicTextInputClientDemoState(); diff --git a/super_editor/lib/src/default_editor/blockquote.dart b/super_editor/lib/src/default_editor/blockquote.dart index fd6ac990ec..42314d56ae 100644 --- a/super_editor/lib/src/default_editor/blockquote.dart +++ b/super_editor/lib/src/default_editor/blockquote.dart @@ -245,13 +245,13 @@ class ConvertBlockquoteToParagraphCommand implements EditCommand { ExecutionInstruction insertNewlineInBlockquote({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { if (keyEvent.logicalKey != LogicalKeyboardKey.enter) { return ExecutionInstruction.continueExecution; } - if (!keyEvent.isShiftPressed) { + if (!HardwareKeyboard.instance.isShiftPressed) { return ExecutionInstruction.continueExecution; } @@ -277,7 +277,7 @@ ExecutionInstruction insertNewlineInBlockquote({ ExecutionInstruction splitBlockquoteWhenEnterPressed({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { if (keyEvent.logicalKey != LogicalKeyboardKey.enter) { return ExecutionInstruction.continueExecution; diff --git a/super_editor/lib/src/default_editor/document_gestures_mouse.dart b/super_editor/lib/src/default_editor/document_gestures_mouse.dart index 064b27f413..9583ffd1a6 100644 --- a/super_editor/lib/src/default_editor/document_gestures_mouse.dart +++ b/super_editor/lib/src/default_editor/document_gestures_mouse.dart @@ -162,9 +162,9 @@ class _DocumentMouseInteractorState extends State with } bool get _isShiftPressed => - (RawKeyboard.instance.keysPressed.contains(LogicalKeyboardKey.shiftLeft) || - RawKeyboard.instance.keysPressed.contains(LogicalKeyboardKey.shiftRight) || - RawKeyboard.instance.keysPressed.contains(LogicalKeyboardKey.shift)) && + (HardwareKeyboard.instance.logicalKeysPressed.contains(LogicalKeyboardKey.shiftLeft) || + HardwareKeyboard.instance.logicalKeysPressed.contains(LogicalKeyboardKey.shiftRight) || + HardwareKeyboard.instance.logicalKeysPressed.contains(LogicalKeyboardKey.shift)) && // TODO: this condition doesn't belong here. Move it to where it applies _currentSelection != null; diff --git a/super_editor/lib/src/default_editor/document_hardware_keyboard/document_keyboard_actions.dart b/super_editor/lib/src/default_editor/document_hardware_keyboard/document_keyboard_actions.dart index 700348be9b..a54dcd41f2 100644 --- a/super_editor/lib/src/default_editor/document_hardware_keyboard/document_keyboard_actions.dart +++ b/super_editor/lib/src/default_editor/document_hardware_keyboard/document_keyboard_actions.dart @@ -19,9 +19,9 @@ import 'package:super_editor/src/infrastructure/text_input.dart'; /// when the user presses the Page Up key. ExecutionInstruction scrollOnPageUpKeyPress({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } @@ -44,9 +44,9 @@ ExecutionInstruction scrollOnPageUpKeyPress({ /// when the user presses the Page Down key. ExecutionInstruction scrollOnPageDownKeyPress({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } @@ -69,9 +69,9 @@ ExecutionInstruction scrollOnPageDownKeyPress({ /// CMD + HOME on Mac, or CTRL + HOME on all other platforms. ExecutionInstruction scrollOnCtrlOrCmdAndHomeKeyPress({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } @@ -81,11 +81,11 @@ ExecutionInstruction scrollOnCtrlOrCmdAndHomeKeyPress({ final isMacOrIos = defaultTargetPlatform == TargetPlatform.macOS || defaultTargetPlatform == TargetPlatform.iOS; - if (isMacOrIos && !keyEvent.isMetaPressed) { + if (isMacOrIos && !HardwareKeyboard.instance.isMetaPressed) { return ExecutionInstruction.continueExecution; } - if (!isMacOrIos && !keyEvent.isControlPressed) { + if (!isMacOrIos && !HardwareKeyboard.instance.isControlPressed) { return ExecutionInstruction.continueExecution; } @@ -104,9 +104,9 @@ ExecutionInstruction scrollOnCtrlOrCmdAndHomeKeyPress({ /// CMD + END on Mac, or CTRL + END on all other platforms. ExecutionInstruction scrollOnCtrlOrCmdAndEndKeyPress({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } @@ -116,11 +116,11 @@ ExecutionInstruction scrollOnCtrlOrCmdAndEndKeyPress({ final isMacOrIos = defaultTargetPlatform == TargetPlatform.macOS || defaultTargetPlatform == TargetPlatform.iOS; - if (isMacOrIos && !keyEvent.isMetaPressed) { + if (isMacOrIos && !HardwareKeyboard.instance.isMetaPressed) { return ExecutionInstruction.continueExecution; } - if (!isMacOrIos && !keyEvent.isControlPressed) { + if (!isMacOrIos && !HardwareKeyboard.instance.isControlPressed) { return ExecutionInstruction.continueExecution; } @@ -147,7 +147,7 @@ ExecutionInstruction scrollOnCtrlOrCmdAndEndKeyPress({ /// would display an unknown '?' character in the document. ExecutionInstruction blockControlKeys({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { if (keyEvent.logicalKey == LogicalKeyboardKey.escape || keyEvent.logicalKey == LogicalKeyboardKey.pageUp || @@ -164,7 +164,7 @@ ExecutionInstruction blockControlKeys({ ExecutionInstruction toggleInteractionModeWhenCmdOrCtrlPressed({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { if (keyEvent.isPrimaryShortcutKeyPressed && !editContext.composer.isInInteractionMode.value) { editorKeyLog.fine("Activating editor interaction mode"); @@ -187,9 +187,9 @@ ExecutionInstruction toggleInteractionModeWhenCmdOrCtrlPressed({ ExecutionInstruction doNothingWhenThereIsNoSelection({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } @@ -202,7 +202,7 @@ ExecutionInstruction doNothingWhenThereIsNoSelection({ ExecutionInstruction sendKeyEventToMacOs({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { if (defaultTargetPlatform == TargetPlatform.macOS && !isWeb) { // On macOS, we let the IME handle all key events. Then, the IME might generate @@ -219,17 +219,17 @@ ExecutionInstruction sendKeyEventToMacOs({ ExecutionInstruction deleteDownstreamCharacterWithCtrlDeleteOnMac({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { if (defaultTargetPlatform != TargetPlatform.macOS) { return ExecutionInstruction.continueExecution; } - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } - if (keyEvent.logicalKey != LogicalKeyboardKey.delete || !keyEvent.isControlPressed) { + if (keyEvent.logicalKey != LogicalKeyboardKey.delete || !HardwareKeyboard.instance.isControlPressed) { return ExecutionInstruction.continueExecution; } @@ -240,9 +240,9 @@ ExecutionInstruction deleteDownstreamCharacterWithCtrlDeleteOnMac({ ExecutionInstruction pasteWhenCmdVIsPressed({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } @@ -260,9 +260,9 @@ ExecutionInstruction pasteWhenCmdVIsPressed({ ExecutionInstruction selectAllWhenCmdAIsPressed({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } @@ -276,9 +276,9 @@ ExecutionInstruction selectAllWhenCmdAIsPressed({ ExecutionInstruction copyWhenCmdCIsPressed({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } @@ -300,9 +300,9 @@ ExecutionInstruction copyWhenCmdCIsPressed({ ExecutionInstruction cutWhenCmdXIsPressed({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } @@ -324,9 +324,9 @@ ExecutionInstruction cutWhenCmdXIsPressed({ ExecutionInstruction cmdBToToggleBold({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } @@ -345,9 +345,9 @@ ExecutionInstruction cmdBToToggleBold({ ExecutionInstruction cmdIToToggleItalics({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } @@ -366,9 +366,9 @@ ExecutionInstruction cmdIToToggleItalics({ ExecutionInstruction anyCharacterOrDestructiveKeyToDeleteSelection({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } @@ -378,7 +378,7 @@ ExecutionInstruction anyCharacterOrDestructiveKeyToDeleteSelection({ // Do nothing if CMD or CTRL are pressed because this signifies an attempted // shortcut. - if (keyEvent.isControlPressed || keyEvent.isMetaPressed) { + if (HardwareKeyboard.instance.isControlPressed || HardwareKeyboard.instance.isMetaPressed) { return ExecutionInstruction.continueExecution; } @@ -392,7 +392,7 @@ ExecutionInstruction anyCharacterOrDestructiveKeyToDeleteSelection({ // needs to alter the selection, not delete content. We have to explicitly // look for this because when shift is pressed along with an arrow key, // Flutter reports a non-null character. - if (keyEvent.isShiftPressed) { + if (HardwareKeyboard.instance.isShiftPressed) { return ExecutionInstruction.continueExecution; } @@ -423,9 +423,9 @@ ExecutionInstruction anyCharacterOrDestructiveKeyToDeleteSelection({ ExecutionInstruction deleteUpstreamContentWithBackspace({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } @@ -440,9 +440,9 @@ ExecutionInstruction deleteUpstreamContentWithBackspace({ ExecutionInstruction mergeNodeWithNextWhenDeleteIsPressed({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } if (keyEvent.logicalKey != LogicalKeyboardKey.delete) { @@ -492,9 +492,9 @@ ExecutionInstruction mergeNodeWithNextWhenDeleteIsPressed({ ExecutionInstruction moveUpAndDownWithArrowKeys({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } @@ -515,36 +515,36 @@ ExecutionInstruction moveUpAndDownWithArrowKeys({ return ExecutionInstruction.blocked; } - if (defaultTargetPlatform == TargetPlatform.windows && keyEvent.isAltPressed) { + if (defaultTargetPlatform == TargetPlatform.windows && HardwareKeyboard.instance.isAltPressed) { return ExecutionInstruction.continueExecution; } - if (defaultTargetPlatform == TargetPlatform.linux && keyEvent.isAltPressed) { + if (defaultTargetPlatform == TargetPlatform.linux && HardwareKeyboard.instance.isAltPressed) { return ExecutionInstruction.continueExecution; } bool didMove = false; if (keyEvent.logicalKey == LogicalKeyboardKey.arrowUp) { - if (defaultTargetPlatform == TargetPlatform.macOS && keyEvent.isAltPressed) { + if (defaultTargetPlatform == TargetPlatform.macOS && HardwareKeyboard.instance.isAltPressed) { didMove = editContext.commonOps.moveCaretUpstream( - expand: keyEvent.isShiftPressed, + expand: HardwareKeyboard.instance.isShiftPressed, movementModifier: MovementModifier.paragraph, ); - } else if (defaultTargetPlatform == TargetPlatform.macOS && keyEvent.isMetaPressed) { - didMove = editContext.commonOps.moveSelectionToBeginningOfDocument(expand: keyEvent.isShiftPressed); + } else if (defaultTargetPlatform == TargetPlatform.macOS && HardwareKeyboard.instance.isMetaPressed) { + didMove = editContext.commonOps.moveSelectionToBeginningOfDocument(expand: HardwareKeyboard.instance.isShiftPressed); } else { - didMove = editContext.commonOps.moveCaretUp(expand: keyEvent.isShiftPressed); + didMove = editContext.commonOps.moveCaretUp(expand: HardwareKeyboard.instance.isShiftPressed); } } else { - if (defaultTargetPlatform == TargetPlatform.macOS && keyEvent.isAltPressed) { + if (defaultTargetPlatform == TargetPlatform.macOS && HardwareKeyboard.instance.isAltPressed) { didMove = editContext.commonOps.moveCaretDownstream( - expand: keyEvent.isShiftPressed, + expand: HardwareKeyboard.instance.isShiftPressed, movementModifier: MovementModifier.paragraph, ); - } else if (defaultTargetPlatform == TargetPlatform.macOS && keyEvent.isMetaPressed) { - didMove = editContext.commonOps.moveSelectionToEndOfDocument(expand: keyEvent.isShiftPressed); + } else if (defaultTargetPlatform == TargetPlatform.macOS && HardwareKeyboard.instance.isMetaPressed) { + didMove = editContext.commonOps.moveSelectionToEndOfDocument(expand: HardwareKeyboard.instance.isShiftPressed); } else { - didMove = editContext.commonOps.moveCaretDown(expand: keyEvent.isShiftPressed); + didMove = editContext.commonOps.moveCaretDown(expand: HardwareKeyboard.instance.isShiftPressed); } } @@ -553,9 +553,9 @@ ExecutionInstruction moveUpAndDownWithArrowKeys({ ExecutionInstruction moveLeftAndRightWithArrowKeys({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } @@ -576,31 +576,31 @@ ExecutionInstruction moveLeftAndRightWithArrowKeys({ return ExecutionInstruction.blocked; } - if (defaultTargetPlatform == TargetPlatform.windows && keyEvent.isAltPressed) { + if (defaultTargetPlatform == TargetPlatform.windows && HardwareKeyboard.instance.isAltPressed) { return ExecutionInstruction.continueExecution; } bool didMove = false; MovementModifier? movementModifier; if ((defaultTargetPlatform == TargetPlatform.windows || defaultTargetPlatform == TargetPlatform.linux) && - keyEvent.isControlPressed) { + HardwareKeyboard.instance.isControlPressed) { movementModifier = MovementModifier.word; - } else if (defaultTargetPlatform == TargetPlatform.macOS && keyEvent.isMetaPressed) { + } else if (defaultTargetPlatform == TargetPlatform.macOS && HardwareKeyboard.instance.isMetaPressed) { movementModifier = MovementModifier.line; - } else if (defaultTargetPlatform == TargetPlatform.macOS && keyEvent.isAltPressed) { + } else if (defaultTargetPlatform == TargetPlatform.macOS && HardwareKeyboard.instance.isAltPressed) { movementModifier = MovementModifier.word; } if (keyEvent.logicalKey == LogicalKeyboardKey.arrowLeft) { // Move the caret left/upstream. didMove = editContext.commonOps.moveCaretUpstream( - expand: keyEvent.isShiftPressed, + expand: HardwareKeyboard.instance.isShiftPressed, movementModifier: movementModifier, ); } else { // Move the caret right/downstream. didMove = editContext.commonOps.moveCaretDownstream( - expand: keyEvent.isShiftPressed, + expand: HardwareKeyboard.instance.isShiftPressed, movementModifier: movementModifier, ); } @@ -610,13 +610,13 @@ ExecutionInstruction moveLeftAndRightWithArrowKeys({ ExecutionInstruction doNothingWithLeftRightArrowKeysAtMiddleOfTextOnWeb({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { if (!isWeb) { return ExecutionInstruction.continueExecution; } - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } @@ -628,12 +628,12 @@ ExecutionInstruction doNothingWithLeftRightArrowKeysAtMiddleOfTextOnWeb({ return ExecutionInstruction.continueExecution; } - if (defaultTargetPlatform == TargetPlatform.windows && keyEvent.isAltPressed) { + if (defaultTargetPlatform == TargetPlatform.windows && HardwareKeyboard.instance.isAltPressed) { return ExecutionInstruction.continueExecution; } if (defaultTargetPlatform == TargetPlatform.linux && - keyEvent.isAltPressed && + HardwareKeyboard.instance.isAltPressed && (keyEvent.logicalKey == LogicalKeyboardKey.arrowUp || keyEvent.logicalKey == LogicalKeyboardKey.arrowDown)) { return ExecutionInstruction.continueExecution; } @@ -676,9 +676,9 @@ ExecutionInstruction doNothingWithLeftRightArrowKeysAtMiddleOfTextOnWeb({ ExecutionInstruction moveToLineStartOrEndWithCtrlAOrE({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } @@ -686,21 +686,21 @@ ExecutionInstruction moveToLineStartOrEndWithCtrlAOrE({ return ExecutionInstruction.continueExecution; } - if (!keyEvent.isControlPressed) { + if (!HardwareKeyboard.instance.isControlPressed) { return ExecutionInstruction.continueExecution; } bool didMove = false; if (keyEvent.logicalKey == LogicalKeyboardKey.keyA) { didMove = editContext.commonOps.moveCaretUpstream( - expand: keyEvent.isShiftPressed, + expand: HardwareKeyboard.instance.isShiftPressed, movementModifier: MovementModifier.line, ); } if (keyEvent.logicalKey == LogicalKeyboardKey.keyE) { didMove = editContext.commonOps.moveCaretDownstream( - expand: keyEvent.isShiftPressed, + expand: HardwareKeyboard.instance.isShiftPressed, movementModifier: MovementModifier.line, ); } @@ -710,9 +710,9 @@ ExecutionInstruction moveToLineStartOrEndWithCtrlAOrE({ ExecutionInstruction moveToLineStartWithHome({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } @@ -723,7 +723,7 @@ ExecutionInstruction moveToLineStartWithHome({ bool didMove = false; if (keyEvent.logicalKey == LogicalKeyboardKey.home) { didMove = editContext.commonOps.moveCaretUpstream( - expand: keyEvent.isShiftPressed, + expand: HardwareKeyboard.instance.isShiftPressed, movementModifier: MovementModifier.line, ); } @@ -733,9 +733,9 @@ ExecutionInstruction moveToLineStartWithHome({ ExecutionInstruction moveToLineEndWithEnd({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } @@ -746,7 +746,7 @@ ExecutionInstruction moveToLineEndWithEnd({ bool didMove = false; if (keyEvent.logicalKey == LogicalKeyboardKey.end) { didMove = editContext.commonOps.moveCaretDownstream( - expand: keyEvent.isShiftPressed, + expand: HardwareKeyboard.instance.isShiftPressed, movementModifier: MovementModifier.line, ); } @@ -756,9 +756,9 @@ ExecutionInstruction moveToLineEndWithEnd({ ExecutionInstruction deleteToStartOfLineWithCmdBackspaceOnMac({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } @@ -789,9 +789,9 @@ ExecutionInstruction deleteToStartOfLineWithCmdBackspaceOnMac({ ExecutionInstruction deleteToEndOfLineWithCmdDeleteOnMac({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } @@ -822,16 +822,16 @@ ExecutionInstruction deleteToEndOfLineWithCmdDeleteOnMac({ ExecutionInstruction deleteWordUpstreamWithAltBackspaceOnMac({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } if (defaultTargetPlatform != TargetPlatform.macOS) { return ExecutionInstruction.continueExecution; } - if (!keyEvent.isAltPressed || keyEvent.logicalKey != LogicalKeyboardKey.backspace) { + if (!HardwareKeyboard.instance.isAltPressed || keyEvent.logicalKey != LogicalKeyboardKey.backspace) { return ExecutionInstruction.continueExecution; } if (editContext.composer.selection == null) { @@ -855,16 +855,16 @@ ExecutionInstruction deleteWordUpstreamWithAltBackspaceOnMac({ ExecutionInstruction deleteWordUpstreamWithControlBackspaceOnWindowsAndLinux({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } if (defaultTargetPlatform != TargetPlatform.windows && defaultTargetPlatform != TargetPlatform.linux) { return ExecutionInstruction.continueExecution; } - if (!keyEvent.isControlPressed || keyEvent.logicalKey != LogicalKeyboardKey.backspace) { + if (!HardwareKeyboard.instance.isControlPressed || keyEvent.logicalKey != LogicalKeyboardKey.backspace) { return ExecutionInstruction.continueExecution; } if (editContext.composer.selection == null) { @@ -888,16 +888,16 @@ ExecutionInstruction deleteWordUpstreamWithControlBackspaceOnWindowsAndLinux({ ExecutionInstruction deleteWordDownstreamWithAltDeleteOnMac({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } if (defaultTargetPlatform != TargetPlatform.macOS) { return ExecutionInstruction.continueExecution; } - if (!keyEvent.isAltPressed || keyEvent.logicalKey != LogicalKeyboardKey.delete) { + if (!HardwareKeyboard.instance.isAltPressed || keyEvent.logicalKey != LogicalKeyboardKey.delete) { return ExecutionInstruction.continueExecution; } if (editContext.composer.selection == null) { @@ -921,16 +921,16 @@ ExecutionInstruction deleteWordDownstreamWithAltDeleteOnMac({ ExecutionInstruction deleteWordDownstreamWithControlDeleteOnWindowsAndLinux({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } if (defaultTargetPlatform != TargetPlatform.windows && defaultTargetPlatform != TargetPlatform.linux) { return ExecutionInstruction.continueExecution; } - if (!keyEvent.isControlPressed || keyEvent.logicalKey != LogicalKeyboardKey.delete) { + if (!HardwareKeyboard.instance.isControlPressed || keyEvent.logicalKey != LogicalKeyboardKey.delete) { return ExecutionInstruction.continueExecution; } if (editContext.composer.selection == null) { @@ -957,9 +957,9 @@ ExecutionInstruction deleteWordDownstreamWithControlDeleteOnWindowsAndLinux({ /// Do nothing if selection is already collapsed. ExecutionInstruction collapseSelectionWhenEscIsPressed({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } diff --git a/super_editor/lib/src/default_editor/document_hardware_keyboard/document_physical_keyboard.dart b/super_editor/lib/src/default_editor/document_hardware_keyboard/document_physical_keyboard.dart index 827f6b542e..bb0cf754a3 100644 --- a/super_editor/lib/src/default_editor/document_hardware_keyboard/document_physical_keyboard.dart +++ b/super_editor/lib/src/default_editor/document_hardware_keyboard/document_physical_keyboard.dart @@ -68,7 +68,7 @@ class _SuperEditorHardwareKeyHandlerState extends State keys) { return ({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { for (final key in keys) { - if (key.accepts(keyEvent, RawKeyboard.instance)) { + if (key.accepts(keyEvent, HardwareKeyboard.instance)) { return ExecutionInstruction.blocked; } } diff --git a/super_editor/lib/src/default_editor/list_items.dart b/super_editor/lib/src/default_editor/list_items.dart index c1d02c2ccb..a6846633a8 100644 --- a/super_editor/lib/src/default_editor/list_items.dart +++ b/super_editor/lib/src/default_editor/list_items.dart @@ -713,16 +713,16 @@ class SplitListItemCommand implements EditCommand { ExecutionInstruction tabToIndentListItem({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } if (keyEvent.logicalKey != LogicalKeyboardKey.tab) { return ExecutionInstruction.continueExecution; } - if (keyEvent.isShiftPressed) { + if (HardwareKeyboard.instance.isShiftPressed) { return ExecutionInstruction.continueExecution; } @@ -733,16 +733,16 @@ ExecutionInstruction tabToIndentListItem({ ExecutionInstruction shiftTabToUnIndentListItem({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } if (keyEvent.logicalKey != LogicalKeyboardKey.tab) { return ExecutionInstruction.continueExecution; } - if (!keyEvent.isShiftPressed) { + if (!HardwareKeyboard.instance.isShiftPressed) { return ExecutionInstruction.continueExecution; } @@ -753,9 +753,9 @@ ExecutionInstruction shiftTabToUnIndentListItem({ ExecutionInstruction backspaceToUnIndentListItem({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } @@ -785,9 +785,9 @@ ExecutionInstruction backspaceToUnIndentListItem({ ExecutionInstruction splitListItemWhenEnterPressed({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } diff --git a/super_editor/lib/src/default_editor/paragraph.dart b/super_editor/lib/src/default_editor/paragraph.dart index 64362f16c6..47b1f9f701 100644 --- a/super_editor/lib/src/default_editor/paragraph.dart +++ b/super_editor/lib/src/default_editor/paragraph.dart @@ -13,7 +13,7 @@ import 'package:super_editor/src/default_editor/text.dart'; import 'package:super_editor/src/infrastructure/_logging.dart'; import 'package:super_editor/src/infrastructure/attributed_text_styles.dart'; import 'package:super_editor/src/infrastructure/keyboard.dart'; -import 'package:super_editor/src/infrastructure/raw_key_event_extensions.dart'; +import 'package:super_editor/src/infrastructure/key_event_extensions.dart'; import 'package:super_editor/src/infrastructure/text_input.dart'; import 'layout_single_column/layout_single_column.dart'; @@ -647,7 +647,7 @@ class SubmitParagraphIntention extends Intention { ExecutionInstruction anyCharacterToInsertInParagraph({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { if (editContext.composer.selection == null) { return ExecutionInstruction.continueExecution; @@ -655,7 +655,7 @@ ExecutionInstruction anyCharacterToInsertInParagraph({ // Do nothing if CMD or CTRL are pressed because this signifies an attempted // shortcut. - if (keyEvent.isControlPressed || keyEvent.isMetaPressed) { + if (HardwareKeyboard.instance.isControlPressed || HardwareKeyboard.instance.isMetaPressed) { return ExecutionInstruction.continueExecution; } @@ -721,9 +721,9 @@ class DeleteParagraphCommand implements EditCommand { /// header 1, header 2, blockquote. ExecutionInstruction backspaceToClearParagraphBlockType({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } @@ -755,9 +755,9 @@ ExecutionInstruction backspaceToClearParagraphBlockType({ ExecutionInstruction enterToInsertBlockNewline({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } @@ -772,7 +772,7 @@ ExecutionInstruction enterToInsertBlockNewline({ ExecutionInstruction moveParagraphSelectionUpWhenBackspaceIsPressed({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { if (keyEvent.logicalKey != LogicalKeyboardKey.backspace) { return ExecutionInstruction.continueExecution; @@ -817,9 +817,9 @@ ExecutionInstruction moveParagraphSelectionUpWhenBackspaceIsPressed({ ExecutionInstruction doNothingWithEnterOnWeb({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } @@ -839,9 +839,9 @@ ExecutionInstruction doNothingWithEnterOnWeb({ ExecutionInstruction doNothingWithBackspaceOnWeb({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } @@ -861,9 +861,9 @@ ExecutionInstruction doNothingWithBackspaceOnWeb({ ExecutionInstruction doNothingWithDeleteOnWeb({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } diff --git a/super_editor/lib/src/default_editor/tasks.dart b/super_editor/lib/src/default_editor/tasks.dart index df6478bf22..c95f5da554 100644 --- a/super_editor/lib/src/default_editor/tasks.dart +++ b/super_editor/lib/src/default_editor/tasks.dart @@ -275,9 +275,9 @@ class _TaskComponentState extends State with ProxyDocumentCompone ExecutionInstruction enterToInsertNewTask({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } @@ -312,9 +312,9 @@ ExecutionInstruction enterToInsertNewTask({ ExecutionInstruction backspaceToConvertTaskToParagraph({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } diff --git a/super_editor/lib/src/default_editor/text.dart b/super_editor/lib/src/default_editor/text.dart index 663a0c12d3..1c02bd9c80 100644 --- a/super_editor/lib/src/default_editor/text.dart +++ b/super_editor/lib/src/default_editor/text.dart @@ -18,7 +18,7 @@ import 'package:super_editor/src/infrastructure/_logging.dart'; import 'package:super_editor/src/infrastructure/attributed_text_styles.dart'; import 'package:super_editor/src/infrastructure/composable_text.dart'; import 'package:super_editor/src/infrastructure/keyboard.dart'; -import 'package:super_editor/src/infrastructure/raw_key_event_extensions.dart'; +import 'package:super_editor/src/infrastructure/key_event_extensions.dart'; import 'package:super_editor/src/infrastructure/strings.dart'; import 'package:super_text_layout/super_text_layout.dart'; @@ -1490,15 +1490,15 @@ class InsertAttributedTextCommand implements EditCommand { ExecutionInstruction anyCharacterToInsertInTextContent({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } // Do nothing if CMD or CTRL are pressed because this signifies an attempted // shortcut. - if (keyEvent.isControlPressed || keyEvent.isMetaPressed) { + if (HardwareKeyboard.instance.isControlPressed || HardwareKeyboard.instance.isMetaPressed) { return ExecutionInstruction.continueExecution; } if (editContext.composer.selection == null) { @@ -1899,7 +1899,7 @@ void _convertToParagraph({ ExecutionInstruction deleteCharacterWhenBackspaceIsPressed({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { if (keyEvent.logicalKey != LogicalKeyboardKey.backspace) { return ExecutionInstruction.continueExecution; @@ -1927,9 +1927,9 @@ ExecutionInstruction deleteCharacterWhenBackspaceIsPressed({ ExecutionInstruction deleteDownstreamContentWithDelete({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } @@ -1944,16 +1944,16 @@ ExecutionInstruction deleteDownstreamContentWithDelete({ ExecutionInstruction shiftEnterToInsertNewlineInBlock({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is! RawKeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } if (keyEvent.logicalKey != LogicalKeyboardKey.enter && keyEvent.logicalKey != LogicalKeyboardKey.numpadEnter) { return ExecutionInstruction.continueExecution; } - if (!keyEvent.isShiftPressed) { + if (!HardwareKeyboard.instance.isShiftPressed) { return ExecutionInstruction.continueExecution; } diff --git a/super_editor/lib/src/default_editor/text_tokenizing/action_tags.dart b/super_editor/lib/src/default_editor/text_tokenizing/action_tags.dart index 866d2a33b8..bda2aab11b 100644 --- a/super_editor/lib/src/default_editor/text_tokenizing/action_tags.dart +++ b/super_editor/lib/src/default_editor/text_tokenizing/action_tags.dart @@ -88,9 +88,9 @@ class ActionTagsPlugin extends SuperEditorPlugin { List get keyboardActions => [_cancelOnEscape]; ExecutionInstruction _cancelOnEscape({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is RawKeyDownEvent) { + if (keyEvent is KeyDownEvent || keyEvent is KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } diff --git a/super_editor/lib/src/default_editor/text_tokenizing/stable_tags.dart b/super_editor/lib/src/default_editor/text_tokenizing/stable_tags.dart index 7c679f87f5..cb62230eea 100644 --- a/super_editor/lib/src/default_editor/text_tokenizing/stable_tags.dart +++ b/super_editor/lib/src/default_editor/text_tokenizing/stable_tags.dart @@ -108,9 +108,9 @@ class StableTagPlugin extends SuperEditorPlugin { List get keyboardActions => [_cancelOnEscape]; ExecutionInstruction _cancelOnEscape({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is RawKeyDownEvent) { + if (keyEvent is KeyDownEvent || keyEvent is KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } diff --git a/super_editor/lib/src/infrastructure/focus.dart b/super_editor/lib/src/infrastructure/focus.dart index efa60cfaf8..5cf0b8d61b 100644 --- a/super_editor/lib/src/infrastructure/focus.dart +++ b/super_editor/lib/src/infrastructure/focus.dart @@ -18,15 +18,16 @@ class NonReparentingFocus extends StatefulWidget { const NonReparentingFocus({ Key? key, required this.focusNode, - this.onKey, + this.onKeyEvent, required this.child, }) : super(key: key); /// The [FocusNode] that sends key events to [onKey]. final FocusNode focusNode; - /// The callback invoked whenever [focusNode] receives key events. - final FocusOnKeyCallback? onKey; + + /// The callback invoked whenever [focusNode] receives [KeyEvent] events. + final FocusOnKeyEventCallback? onKeyEvent; /// The child of this widget. final Widget child; @@ -41,7 +42,7 @@ class _NonReparentingFocusState extends State { @override void initState() { super.initState(); - _keyboardFocusAttachment = widget.focusNode.attach(context, onKey: _onKey); + _keyboardFocusAttachment = widget.focusNode.attach(context, onKeyEvent: _onKeyEvent); } @override @@ -56,7 +57,7 @@ class _NonReparentingFocusState extends State { if (widget.focusNode != oldWidget.focusNode) { _keyboardFocusAttachment.detach(); - _keyboardFocusAttachment = widget.focusNode.attach(context, onKey: widget.onKey); + _keyboardFocusAttachment = widget.focusNode.attach(context, onKeyEvent: _onKeyEvent); _reparentIfMissingParent(); } } @@ -73,8 +74,8 @@ class _NonReparentingFocusState extends State { } } - KeyEventResult _onKey(FocusNode focusNode, RawKeyEvent event) { - return widget.onKey?.call(focusNode, event) ?? KeyEventResult.ignored; + KeyEventResult _onKeyEvent(FocusNode focusNode, KeyEvent event) { + return widget.onKeyEvent?.call(focusNode, event) ?? KeyEventResult.ignored; } @override diff --git a/super_editor/lib/src/infrastructure/raw_key_event_extensions.dart b/super_editor/lib/src/infrastructure/key_event_extensions.dart similarity index 85% rename from super_editor/lib/src/infrastructure/raw_key_event_extensions.dart rename to super_editor/lib/src/infrastructure/key_event_extensions.dart index 0b5664e83a..b0e22299db 100644 --- a/super_editor/lib/src/infrastructure/raw_key_event_extensions.dart +++ b/super_editor/lib/src/infrastructure/key_event_extensions.dart @@ -1,6 +1,6 @@ import 'package:flutter/services.dart'; -extension IsArrowKeyExtension on RawKeyEvent { +extension IsArrowKeyExtension on KeyEvent { bool get isArrowKeyPressed => logicalKey == LogicalKeyboardKey.arrowUp || logicalKey == LogicalKeyboardKey.arrowDown || diff --git a/super_editor/lib/src/infrastructure/keyboard.dart b/super_editor/lib/src/infrastructure/keyboard.dart index c2c833f338..7597aadf9c 100644 --- a/super_editor/lib/src/infrastructure/keyboard.dart +++ b/super_editor/lib/src/infrastructure/keyboard.dart @@ -2,6 +2,8 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart'; +import 'package:flutter/services.dart'; + enum ExecutionInstruction { /// The handler has no relation to the key event and @@ -30,10 +32,10 @@ enum ExecutionInstruction { haltExecution, } -extension PrimaryShortcutKey on RawKeyEvent { +extension PrimaryShortcutKey on KeyEvent { bool get isPrimaryShortcutKeyPressed => - (defaultTargetPlatform == TargetPlatform.macOS && isMetaPressed) || - (defaultTargetPlatform != TargetPlatform.macOS && isControlPressed); + (defaultTargetPlatform == TargetPlatform.macOS && HardwareKeyboard.instance.isMetaPressed) || + (defaultTargetPlatform != TargetPlatform.macOS && HardwareKeyboard.instance.isControlPressed); } /// Whether the given [character] should be ignored when it's received within diff --git a/super_editor/lib/src/super_reader/read_only_document_keyboard_interactor.dart b/super_editor/lib/src/super_reader/read_only_document_keyboard_interactor.dart index 8f63e8373e..e7bca53677 100644 --- a/super_editor/lib/src/super_reader/read_only_document_keyboard_interactor.dart +++ b/super_editor/lib/src/super_reader/read_only_document_keyboard_interactor.dart @@ -58,7 +58,7 @@ class ReadOnlyDocumentKeyboardInteractor extends StatelessWidget { /// somewhere in the sub-tree. final Widget child; - KeyEventResult _onKeyPressed(FocusNode node, RawKeyEvent keyEvent) { + KeyEventResult _onKeyEventPressed(FocusNode node, KeyEvent keyEvent) { readerKeyLog.info("Handling key press: $keyEvent"); ExecutionInstruction instruction = ExecutionInstruction.continueExecution; int index = 0; @@ -83,7 +83,7 @@ class ReadOnlyDocumentKeyboardInteractor extends StatelessWidget { Widget build(BuildContext context) { return Focus( focusNode: focusNode, - onKey: _onKeyPressed, + onKeyEvent: _onKeyEventPressed, autofocus: autofocus, child: child, ); @@ -101,7 +101,7 @@ class ReadOnlyDocumentKeyboardInteractor extends StatelessWidget { /// [ExecutionInstruction.haltExecution] to prevent further execution. typedef ReadOnlyDocumentKeyboardAction = ExecutionInstruction Function({ required SuperReaderContext documentContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }); /// Keyboard actions for the standard [SuperReader]. @@ -135,7 +135,7 @@ final readOnlyDefaultKeyboardActions = [ final removeCollapsedSelectionWhenShiftIsReleased = createShortcut( ({ required SuperReaderContext documentContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { final selection = documentContext.selection.value; if (selection == null || !selection.isCollapsed) { @@ -156,7 +156,7 @@ final removeCollapsedSelectionWhenShiftIsReleased = createShortcut( final scrollUpWithArrowKey = createShortcut( ({ required SuperReaderContext documentContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { documentContext.scroller.jumpBy(-20); return ExecutionInstruction.haltExecution; @@ -168,7 +168,7 @@ final scrollUpWithArrowKey = createShortcut( final scrollDownWithArrowKey = createShortcut( ({ required SuperReaderContext documentContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { documentContext.scroller.jumpBy(20); return ExecutionInstruction.haltExecution; @@ -180,14 +180,14 @@ final scrollDownWithArrowKey = createShortcut( final expandSelectionWithLeftArrow = createShortcut( ({ required SuperReaderContext documentContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (defaultTargetPlatform == TargetPlatform.windows && keyEvent.isAltPressed) { + if (defaultTargetPlatform == TargetPlatform.windows && HardwareKeyboard.instance.isAltPressed) { return ExecutionInstruction.continueExecution; } if (defaultTargetPlatform == TargetPlatform.linux && - keyEvent.isAltPressed && + HardwareKeyboard.instance.isAltPressed && (keyEvent.logicalKey == LogicalKeyboardKey.arrowUp || keyEvent.logicalKey == LogicalKeyboardKey.arrowDown)) { return ExecutionInstruction.continueExecution; } @@ -198,7 +198,7 @@ final expandSelectionWithLeftArrow = createShortcut( documentLayout: documentContext.documentLayout, selectionNotifier: documentContext.selection, movementModifier: _getHorizontalMovementModifier(keyEvent), - retainCollapsedSelection: keyEvent.isShiftPressed, + retainCollapsedSelection: HardwareKeyboard.instance.isShiftPressed, ); return didMove ? ExecutionInstruction.haltExecution : ExecutionInstruction.continueExecution; @@ -209,14 +209,14 @@ final expandSelectionWithLeftArrow = createShortcut( final expandSelectionWithRightArrow = createShortcut( ({ required SuperReaderContext documentContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (defaultTargetPlatform == TargetPlatform.windows && keyEvent.isAltPressed) { + if (defaultTargetPlatform == TargetPlatform.windows && HardwareKeyboard.instance.isAltPressed) { return ExecutionInstruction.continueExecution; } if (defaultTargetPlatform == TargetPlatform.linux && - keyEvent.isAltPressed && + HardwareKeyboard.instance.isAltPressed && (keyEvent.logicalKey == LogicalKeyboardKey.arrowUp || keyEvent.logicalKey == LogicalKeyboardKey.arrowDown)) { return ExecutionInstruction.continueExecution; } @@ -227,7 +227,7 @@ final expandSelectionWithRightArrow = createShortcut( documentLayout: documentContext.documentLayout, selectionNotifier: documentContext.selection, movementModifier: _getHorizontalMovementModifier(keyEvent), - retainCollapsedSelection: keyEvent.isShiftPressed, + retainCollapsedSelection: HardwareKeyboard.instance.isShiftPressed, ); return didMove ? ExecutionInstruction.haltExecution : ExecutionInstruction.continueExecution; @@ -235,13 +235,13 @@ final expandSelectionWithRightArrow = createShortcut( keyPressedOrReleased: LogicalKeyboardKey.arrowRight, ); -MovementModifier? _getHorizontalMovementModifier(RawKeyEvent keyEvent) { +MovementModifier? _getHorizontalMovementModifier(KeyEvent keyEvent) { if ((defaultTargetPlatform == TargetPlatform.windows || defaultTargetPlatform == TargetPlatform.linux) && - keyEvent.isControlPressed) { + HardwareKeyboard.instance.isControlPressed) { return MovementModifier.word; - } else if (defaultTargetPlatform == TargetPlatform.macOS && keyEvent.isMetaPressed) { + } else if (defaultTargetPlatform == TargetPlatform.macOS && HardwareKeyboard.instance.isMetaPressed) { return MovementModifier.line; - } else if (defaultTargetPlatform == TargetPlatform.macOS && keyEvent.isAltPressed) { + } else if (defaultTargetPlatform == TargetPlatform.macOS && HardwareKeyboard.instance.isAltPressed) { return MovementModifier.word; } @@ -251,13 +251,13 @@ MovementModifier? _getHorizontalMovementModifier(RawKeyEvent keyEvent) { final expandSelectionWithUpArrow = createShortcut( ({ required SuperReaderContext documentContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (defaultTargetPlatform == TargetPlatform.windows && keyEvent.isAltPressed) { + if (defaultTargetPlatform == TargetPlatform.windows && HardwareKeyboard.instance.isAltPressed) { return ExecutionInstruction.continueExecution; } - if (defaultTargetPlatform == TargetPlatform.linux && keyEvent.isAltPressed) { + if (defaultTargetPlatform == TargetPlatform.linux && HardwareKeyboard.instance.isAltPressed) { return ExecutionInstruction.continueExecution; } @@ -265,7 +265,7 @@ final expandSelectionWithUpArrow = createShortcut( document: documentContext.document, documentLayout: documentContext.documentLayout, selectionNotifier: documentContext.selection, - retainCollapsedSelection: keyEvent.isShiftPressed, + retainCollapsedSelection: HardwareKeyboard.instance.isShiftPressed, ); return didMove ? ExecutionInstruction.haltExecution : ExecutionInstruction.continueExecution; @@ -276,13 +276,13 @@ final expandSelectionWithUpArrow = createShortcut( final expandSelectionWithDownArrow = createShortcut( ({ required SuperReaderContext documentContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (defaultTargetPlatform == TargetPlatform.windows && keyEvent.isAltPressed) { + if (defaultTargetPlatform == TargetPlatform.windows && HardwareKeyboard.instance.isAltPressed) { return ExecutionInstruction.continueExecution; } - if (defaultTargetPlatform == TargetPlatform.linux && keyEvent.isAltPressed) { + if (defaultTargetPlatform == TargetPlatform.linux && HardwareKeyboard.instance.isAltPressed) { return ExecutionInstruction.continueExecution; } @@ -290,7 +290,7 @@ final expandSelectionWithDownArrow = createShortcut( document: documentContext.document, documentLayout: documentContext.documentLayout, selectionNotifier: documentContext.selection, - retainCollapsedSelection: keyEvent.isShiftPressed, + retainCollapsedSelection: HardwareKeyboard.instance.isShiftPressed, ); return didMove ? ExecutionInstruction.haltExecution : ExecutionInstruction.continueExecution; @@ -301,14 +301,14 @@ final expandSelectionWithDownArrow = createShortcut( final expandSelectionToLineStartWithHomeOnWindowsAndLinux = createShortcut( ({ required SuperReaderContext documentContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { final didMove = moveCaretUpstream( document: documentContext.document, documentLayout: documentContext.documentLayout, selectionNotifier: documentContext.selection, movementModifier: MovementModifier.line, - retainCollapsedSelection: keyEvent.isShiftPressed, + retainCollapsedSelection: HardwareKeyboard.instance.isShiftPressed, ); return didMove ? ExecutionInstruction.haltExecution : ExecutionInstruction.continueExecution; @@ -321,14 +321,14 @@ final expandSelectionToLineStartWithHomeOnWindowsAndLinux = createShortcut( final expandSelectionToLineEndWithEndOnWindowsAndLinux = createShortcut( ({ required SuperReaderContext documentContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { final didMove = moveCaretDownstream( document: documentContext.document, documentLayout: documentContext.documentLayout, selectionNotifier: documentContext.selection, movementModifier: MovementModifier.line, - retainCollapsedSelection: keyEvent.isShiftPressed, + retainCollapsedSelection: HardwareKeyboard.instance.isShiftPressed, ); return didMove ? ExecutionInstruction.haltExecution : ExecutionInstruction.continueExecution; @@ -341,14 +341,14 @@ final expandSelectionToLineEndWithEndOnWindowsAndLinux = createShortcut( final expandSelectionToLineStartWithCtrlAOnWindowsAndLinux = createShortcut( ({ required SuperReaderContext documentContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { final didMove = moveCaretUpstream( document: documentContext.document, documentLayout: documentContext.documentLayout, selectionNotifier: documentContext.selection, movementModifier: MovementModifier.line, - retainCollapsedSelection: keyEvent.isShiftPressed, + retainCollapsedSelection: HardwareKeyboard.instance.isShiftPressed, ); return didMove ? ExecutionInstruction.haltExecution : ExecutionInstruction.continueExecution; @@ -362,14 +362,14 @@ final expandSelectionToLineStartWithCtrlAOnWindowsAndLinux = createShortcut( final expandSelectionToLineEndWithCtrlEOnWindowsAndLinux = createShortcut( ({ required SuperReaderContext documentContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { final didMove = moveCaretDownstream( document: documentContext.document, documentLayout: documentContext.documentLayout, selectionNotifier: documentContext.selection, movementModifier: MovementModifier.line, - retainCollapsedSelection: keyEvent.isShiftPressed, + retainCollapsedSelection: HardwareKeyboard.instance.isShiftPressed, ); return didMove ? ExecutionInstruction.haltExecution : ExecutionInstruction.continueExecution; @@ -383,7 +383,7 @@ final expandSelectionToLineEndWithCtrlEOnWindowsAndLinux = createShortcut( final selectAllWhenCmdAIsPressedOnMac = createShortcut( ({ required SuperReaderContext documentContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { final didSelectAll = selectAll(documentContext.document, documentContext.selection); return didSelectAll ? ExecutionInstruction.haltExecution : ExecutionInstruction.continueExecution; @@ -396,7 +396,7 @@ final selectAllWhenCmdAIsPressedOnMac = createShortcut( final selectAllWhenCtlAIsPressedOnWindowsAndLinux = createShortcut( ({ required SuperReaderContext documentContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { final didSelectAll = selectAll(documentContext.document, documentContext.selection); return didSelectAll ? ExecutionInstruction.haltExecution : ExecutionInstruction.continueExecution; @@ -414,7 +414,7 @@ final selectAllWhenCtlAIsPressedOnWindowsAndLinux = createShortcut( final copyWhenCmdCIsPressedOnMac = createShortcut( ({ required SuperReaderContext documentContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { if (documentContext.selection.value == null) { return ExecutionInstruction.continueExecution; @@ -439,7 +439,7 @@ final copyWhenCmdCIsPressedOnMac = createShortcut( final copyWhenCtlCIsPressedOnWindowsAndLinux = createShortcut( ({ required SuperReaderContext documentContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { if (documentContext.selection.value == null) { return ExecutionInstruction.continueExecution; @@ -494,31 +494,31 @@ ReadOnlyDocumentKeyboardAction createShortcut( "Invalid shortcut definition. Both onKeyUp and onKeyDown are false. This shortcut will never be triggered."); } - return ({required SuperReaderContext documentContext, required RawKeyEvent keyEvent}) { - if (keyEvent is RawKeyUpEvent && !onKeyUp) { + return ({required SuperReaderContext documentContext, required KeyEvent keyEvent}) { + if (keyEvent is KeyUpEvent && !onKeyUp) { return ExecutionInstruction.continueExecution; } - if (keyEvent is RawKeyDownEvent && !onKeyDown) { + if ((keyEvent is KeyDownEvent || keyEvent is KeyRepeatEvent) && !onKeyDown) { return ExecutionInstruction.continueExecution; } - if (isCmdPressed != null && isCmdPressed != keyEvent.isMetaPressed) { + if (isCmdPressed != null && isCmdPressed != HardwareKeyboard.instance.isMetaPressed) { return ExecutionInstruction.continueExecution; } - if (isCtlPressed != null && isCtlPressed != keyEvent.isControlPressed) { + if (isCtlPressed != null && isCtlPressed != HardwareKeyboard.instance.isControlPressed) { return ExecutionInstruction.continueExecution; } - if (isAltPressed != null && isAltPressed != keyEvent.isAltPressed) { + if (isAltPressed != null && isAltPressed != HardwareKeyboard.instance.isAltPressed) { return ExecutionInstruction.continueExecution; } if (isShiftPressed != null) { - if (isShiftPressed && !keyEvent.isShiftPressed) { + if (isShiftPressed && !HardwareKeyboard.instance.isShiftPressed) { return ExecutionInstruction.continueExecution; - } else if (!isShiftPressed && keyEvent.isShiftPressed) { + } else if (!isShiftPressed && HardwareKeyboard.instance.isShiftPressed) { return ExecutionInstruction.continueExecution; } } @@ -541,7 +541,7 @@ ReadOnlyDocumentKeyboardAction createShortcut( if (triggers != null) { for (final key in triggers) { - if (!keyEvent.isKeyPressed(key)) { + if (!HardwareKeyboard.instance.isLogicalKeyPressed(key)) { // Manually account for the fact that Flutter pretends that different // shift keys mean different things. if (key == LogicalKeyboardKey.shift || diff --git a/super_editor/lib/src/super_reader/read_only_document_mouse_interactor.dart b/super_editor/lib/src/super_reader/read_only_document_mouse_interactor.dart index 97fce00654..16d74c73b1 100644 --- a/super_editor/lib/src/super_reader/read_only_document_mouse_interactor.dart +++ b/super_editor/lib/src/super_reader/read_only_document_mouse_interactor.dart @@ -140,9 +140,9 @@ class _ReadOnlyDocumentMouseInteractorState extends State (RawKeyboard.instance.keysPressed.contains(LogicalKeyboardKey.shiftLeft) || - RawKeyboard.instance.keysPressed.contains(LogicalKeyboardKey.shiftRight) || - RawKeyboard.instance.keysPressed.contains(LogicalKeyboardKey.shift)); + bool get _isShiftPressed => (HardwareKeyboard.instance.logicalKeysPressed.contains(LogicalKeyboardKey.shiftLeft) || + HardwareKeyboard.instance.logicalKeysPressed.contains(LogicalKeyboardKey.shiftRight) || + HardwareKeyboard.instance.logicalKeysPressed.contains(LogicalKeyboardKey.shift)); void _onSelectionChange() { if (mounted) { diff --git a/super_editor/lib/src/super_textfield/android/android_textfield.dart b/super_editor/lib/src/super_textfield/android/android_textfield.dart index acd51fa277..d1df3b8672 100644 --- a/super_editor/lib/src/super_textfield/android/android_textfield.dart +++ b/super_editor/lib/src/super_textfield/android/android_textfield.dart @@ -423,10 +423,10 @@ class SuperAndroidTextFieldState extends State /// /// Some third party keyboards report backspace as a key press /// rather than a deletion delta, so we need to handle them manually - KeyEventResult _onKeyPressed(FocusNode focusNode, RawKeyEvent keyEvent) { - _log.finer('_onKeyPressed - keyEvent: ${keyEvent.character}'); - if (keyEvent is! RawKeyDownEvent) { - _log.finer('_onKeyPressed - not a "down" event. Ignoring.'); + KeyEventResult _onKeyEventPressed(FocusNode focusNode, KeyEvent keyEvent) { + _log.finer('_onKeyEventPressed - keyEvent: ${keyEvent.character}'); + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { + _log.finer('_onKeyEventPressed - not a "down" event. Ignoring.'); return KeyEventResult.ignored; } if (keyEvent.logicalKey != LogicalKeyboardKey.backspace) { @@ -502,7 +502,7 @@ class SuperAndroidTextFieldState extends State child: NonReparentingFocus( key: _textFieldKey, focusNode: _focusNode, - onKey: _onKeyPressed, + onKeyEvent: _onKeyEventPressed, child: CompositedTransformTarget( link: _textFieldLayerLink, child: AndroidTextFieldTouchInteractor( diff --git a/super_editor/lib/src/super_textfield/desktop/desktop_textfield.dart b/super_editor/lib/src/super_textfield/desktop/desktop_textfield.dart index c3c5be0558..c4c92710e3 100644 --- a/super_editor/lib/src/super_textfield/desktop/desktop_textfield.dart +++ b/super_editor/lib/src/super_textfield/desktop/desktop_textfield.dart @@ -542,9 +542,9 @@ class _SuperTextFieldGestureInteractorState extends State keys) { return ({ required SuperTextFieldContext textFieldContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { for (final key in keys) { - if (key.accepts(keyEvent, RawKeyboard.instance)) { + if (key.accepts(keyEvent, HardwareKeyboard.instance)) { return TextFieldKeyboardHandlerResult.blocked; } } @@ -1803,7 +1803,7 @@ class DefaultSuperTextFieldKeyboardHandlers { /// (CMD on Mac, CTL on Windows) + C is pressed. static TextFieldKeyboardHandlerResult copyTextWhenCmdCIsPressed({ required SuperTextFieldContext textFieldContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { if (!keyEvent.isPrimaryShortcutKeyPressed) { return TextFieldKeyboardHandlerResult.notHandled; @@ -1824,7 +1824,7 @@ class DefaultSuperTextFieldKeyboardHandlers { /// (CMD on Mac, CTL on Windows) + V is pressed. static TextFieldKeyboardHandlerResult pasteTextWhenCmdVIsPressed({ required SuperTextFieldContext textFieldContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { if (!keyEvent.isPrimaryShortcutKeyPressed) { return TextFieldKeyboardHandlerResult.notHandled; @@ -1849,7 +1849,7 @@ class DefaultSuperTextFieldKeyboardHandlers { /// (CMD on Mac, CTL on Windows) + A is pressed. static TextFieldKeyboardHandlerResult selectAllTextFieldWhenCmdAIsPressed({ required SuperTextFieldContext textFieldContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { if (!keyEvent.isPrimaryShortcutKeyPressed) { return TextFieldKeyboardHandlerResult.notHandled; @@ -1867,10 +1867,10 @@ class DefaultSuperTextFieldKeyboardHandlers { /// on MacOS platforms. This is part of expected behavior on MacOS. Not applicable to Windows. static TextFieldKeyboardHandlerResult moveCaretToStartOrEnd({ required SuperTextFieldContext textFieldContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { bool moveLeft = false; - if (!keyEvent.isControlPressed) { + if (!HardwareKeyboard.instance.isControlPressed) { return TextFieldKeyboardHandlerResult.notHandled; } if (defaultTargetPlatform != TargetPlatform.macOS) { @@ -1903,7 +1903,7 @@ class DefaultSuperTextFieldKeyboardHandlers { /// If there is no caret selection. it does nothing. static TextFieldKeyboardHandlerResult moveUpDownLeftAndRightWithArrowKeys({ required SuperTextFieldContext textFieldContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { const arrowKeys = [ LogicalKeyboardKey.arrowLeft, @@ -1931,12 +1931,12 @@ class DefaultSuperTextFieldKeyboardHandlers { return TextFieldKeyboardHandlerResult.handled; } - if (defaultTargetPlatform == TargetPlatform.windows && keyEvent.isAltPressed) { + if (defaultTargetPlatform == TargetPlatform.windows && HardwareKeyboard.instance.isAltPressed) { return TextFieldKeyboardHandlerResult.notHandled; } if (defaultTargetPlatform == TargetPlatform.linux && - keyEvent.isAltPressed && + HardwareKeyboard.instance.isAltPressed && (keyEvent.logicalKey == LogicalKeyboardKey.arrowUp || keyEvent.logicalKey == LogicalKeyboardKey.arrowDown)) { return TextFieldKeyboardHandlerResult.notHandled; } @@ -1946,17 +1946,17 @@ class DefaultSuperTextFieldKeyboardHandlers { MovementModifier? movementModifier; if ((defaultTargetPlatform == TargetPlatform.windows || defaultTargetPlatform == TargetPlatform.linux) && - keyEvent.isControlPressed) { + HardwareKeyboard.instance.isControlPressed) { movementModifier = MovementModifier.word; - } else if (defaultTargetPlatform == TargetPlatform.macOS && keyEvent.isMetaPressed) { + } else if (defaultTargetPlatform == TargetPlatform.macOS && HardwareKeyboard.instance.isMetaPressed) { movementModifier = MovementModifier.line; - } else if (defaultTargetPlatform == TargetPlatform.macOS && keyEvent.isAltPressed) { + } else if (defaultTargetPlatform == TargetPlatform.macOS && HardwareKeyboard.instance.isAltPressed) { movementModifier = MovementModifier.word; } textFieldContext.controller.moveCaretHorizontally( textLayout: textFieldContext.getTextLayout(), - expandSelection: keyEvent.isShiftPressed, + expandSelection: HardwareKeyboard.instance.isShiftPressed, moveLeft: true, movementModifier: movementModifier, ); @@ -1965,17 +1965,17 @@ class DefaultSuperTextFieldKeyboardHandlers { MovementModifier? movementModifier; if ((defaultTargetPlatform == TargetPlatform.windows || defaultTargetPlatform == TargetPlatform.linux) && - keyEvent.isControlPressed) { + HardwareKeyboard.instance.isControlPressed) { movementModifier = MovementModifier.word; - } else if (defaultTargetPlatform == TargetPlatform.macOS && keyEvent.isMetaPressed) { + } else if (defaultTargetPlatform == TargetPlatform.macOS && HardwareKeyboard.instance.isMetaPressed) { movementModifier = MovementModifier.line; - } else if (defaultTargetPlatform == TargetPlatform.macOS && keyEvent.isAltPressed) { + } else if (defaultTargetPlatform == TargetPlatform.macOS && HardwareKeyboard.instance.isAltPressed) { movementModifier = MovementModifier.word; } textFieldContext.controller.moveCaretHorizontally( textLayout: textFieldContext.getTextLayout(), - expandSelection: keyEvent.isShiftPressed, + expandSelection: HardwareKeyboard.instance.isShiftPressed, moveLeft: false, movementModifier: movementModifier, ); @@ -1983,14 +1983,14 @@ class DefaultSuperTextFieldKeyboardHandlers { _log.finer('moveUpDownLeftAndRightWithArrowKeys - handling up arrow key'); textFieldContext.controller.moveCaretVertically( textLayout: textFieldContext.getTextLayout(), - expandSelection: keyEvent.isShiftPressed, + expandSelection: HardwareKeyboard.instance.isShiftPressed, moveUp: true, ); } else if (keyEvent.logicalKey == LogicalKeyboardKey.arrowDown) { _log.finer('moveUpDownLeftAndRightWithArrowKeys - handling down arrow key'); textFieldContext.controller.moveCaretVertically( textLayout: textFieldContext.getTextLayout(), - expandSelection: keyEvent.isShiftPressed, + expandSelection: HardwareKeyboard.instance.isShiftPressed, moveUp: false, ); } @@ -2000,7 +2000,7 @@ class DefaultSuperTextFieldKeyboardHandlers { static TextFieldKeyboardHandlerResult moveToLineStartWithHome({ required SuperTextFieldContext textFieldContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { if (defaultTargetPlatform != TargetPlatform.windows && defaultTargetPlatform != TargetPlatform.linux) { return TextFieldKeyboardHandlerResult.notHandled; @@ -2009,7 +2009,7 @@ class DefaultSuperTextFieldKeyboardHandlers { if (keyEvent.logicalKey == LogicalKeyboardKey.home) { textFieldContext.controller.moveCaretHorizontally( textLayout: textFieldContext.getTextLayout(), - expandSelection: keyEvent.isShiftPressed, + expandSelection: HardwareKeyboard.instance.isShiftPressed, moveLeft: true, movementModifier: MovementModifier.line, ); @@ -2021,7 +2021,7 @@ class DefaultSuperTextFieldKeyboardHandlers { static TextFieldKeyboardHandlerResult moveToLineEndWithEnd({ required SuperTextFieldContext textFieldContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { if (defaultTargetPlatform != TargetPlatform.windows && defaultTargetPlatform != TargetPlatform.linux) { return TextFieldKeyboardHandlerResult.notHandled; @@ -2030,7 +2030,7 @@ class DefaultSuperTextFieldKeyboardHandlers { if (keyEvent.logicalKey == LogicalKeyboardKey.end) { textFieldContext.controller.moveCaretHorizontally( textLayout: textFieldContext.getTextLayout(), - expandSelection: keyEvent.isShiftPressed, + expandSelection: HardwareKeyboard.instance.isShiftPressed, moveLeft: false, movementModifier: MovementModifier.line, ); @@ -2045,9 +2045,9 @@ class DefaultSuperTextFieldKeyboardHandlers { /// since their behavior is unexpected. Check definition for more details. static TextFieldKeyboardHandlerResult insertCharacterWhenKeyIsPressed({ required SuperTextFieldContext textFieldContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent.isMetaPressed || keyEvent.isControlPressed) { + if (HardwareKeyboard.instance.isMetaPressed || HardwareKeyboard.instance.isControlPressed) { return TextFieldKeyboardHandlerResult.notHandled; } @@ -2079,7 +2079,7 @@ class DefaultSuperTextFieldKeyboardHandlers { /// presses CMD + Backspace, or CTL + Backspace. static TextFieldKeyboardHandlerResult deleteTextOnLineBeforeCaretWhenShortcutKeyAndBackspaceIsPressed({ required SuperTextFieldContext textFieldContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { if (!keyEvent.isPrimaryShortcutKeyPressed || keyEvent.logicalKey != LogicalKeyboardKey.backspace) { return TextFieldKeyboardHandlerResult.notHandled; @@ -2113,7 +2113,7 @@ class DefaultSuperTextFieldKeyboardHandlers { static TextFieldKeyboardHandlerResult deleteTextWhenBackspaceOrDeleteIsPressed({ required SuperTextFieldContext textFieldContext, ProseTextLayout? textLayout, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { final isBackspace = keyEvent.logicalKey == LogicalKeyboardKey.backspace; final isDelete = keyEvent.logicalKey == LogicalKeyboardKey.delete; @@ -2136,13 +2136,13 @@ class DefaultSuperTextFieldKeyboardHandlers { /// [deleteWordWhenAltBackSpaceIsPressedOnMac] deletes single words when Alt+Backspace is pressed on Mac. static TextFieldKeyboardHandlerResult deleteWordWhenAltBackSpaceIsPressedOnMac({ required SuperTextFieldContext textFieldContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { if (defaultTargetPlatform != TargetPlatform.macOS) { return TextFieldKeyboardHandlerResult.notHandled; } - if (keyEvent.logicalKey != LogicalKeyboardKey.backspace || !keyEvent.isAltPressed) { + if (keyEvent.logicalKey != LogicalKeyboardKey.backspace || !HardwareKeyboard.instance.isAltPressed) { return TextFieldKeyboardHandlerResult.notHandled; } if (textFieldContext.controller.selection.extentOffset < 0) { @@ -2157,13 +2157,13 @@ class DefaultSuperTextFieldKeyboardHandlers { /// [deleteWordWhenAltBackSpaceIsPressedOnMac] deletes single words when Ctl+Backspace is pressed on Windows/Linux. static TextFieldKeyboardHandlerResult deleteWordWhenCtlBackSpaceIsPressedOnWindowsAndLinux({ required SuperTextFieldContext textFieldContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { if (defaultTargetPlatform != TargetPlatform.windows && defaultTargetPlatform != TargetPlatform.linux) { return TextFieldKeyboardHandlerResult.notHandled; } - if (keyEvent.logicalKey != LogicalKeyboardKey.backspace || !keyEvent.isControlPressed) { + if (keyEvent.logicalKey != LogicalKeyboardKey.backspace || !HardwareKeyboard.instance.isControlPressed) { return TextFieldKeyboardHandlerResult.notHandled; } if (textFieldContext.controller.selection.extentOffset < 0) { @@ -2194,7 +2194,7 @@ class DefaultSuperTextFieldKeyboardHandlers { static TextFieldKeyboardHandlerResult insertNewlineWhenEnterIsPressed({ required SuperTextFieldContext textFieldContext, ProseTextLayout? textLayout, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { if (keyEvent.logicalKey != LogicalKeyboardKey.enter && keyEvent.logicalKey != LogicalKeyboardKey.numpadEnter) { return TextFieldKeyboardHandlerResult.notHandled; @@ -2210,7 +2210,7 @@ class DefaultSuperTextFieldKeyboardHandlers { static TextFieldKeyboardHandlerResult sendKeyEventToMacOs({ required SuperTextFieldContext textFieldContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { if (defaultTargetPlatform == TargetPlatform.macOS && !isWeb) { // On macOS, we let the IME handle all key events. Then, the IME might generate diff --git a/super_editor/test/super_editor/text_entry/tagging/action_tags_test.dart b/super_editor/test/super_editor/text_entry/tagging/action_tags_test.dart index 62e1264535..cd6d4963e3 100644 --- a/super_editor/test/super_editor/text_entry/tagging/action_tags_test.dart +++ b/super_editor/test/super_editor/text_entry/tagging/action_tags_test.dart @@ -678,9 +678,9 @@ Future _pumpTestEditor( ExecutionInstruction _submitOnEnter({ required SuperEditorContext editContext, - required RawKeyEvent keyEvent, + required KeyEvent keyEvent, }) { - if (keyEvent is KeyDownEvent) { + if (keyEvent is! KeyDownEvent && keyEvent is! KeyRepeatEvent) { return ExecutionInstruction.continueExecution; } if (keyEvent.logicalKey != LogicalKeyboardKey.enter) { diff --git a/super_editor/test/super_editor/text_entry/text_binding_test.dart b/super_editor/test/super_editor/text_entry/text_binding_test.dart new file mode 100644 index 0000000000..2a39a31365 --- /dev/null +++ b/super_editor/test/super_editor/text_entry/text_binding_test.dart @@ -0,0 +1,116 @@ +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:super_editor/super_editor.dart'; + +import '../supereditor_test_tools.dart'; + +Future main() async { + // Replace the default test binding with our fake so we can override the + // keyboard modifier state. + // + // This affects all the tests in this file, and can't be reset, so only tests + // that use this binding are in this test file. + final FakeServicesBinding binding = FakeServicesBinding(); + + group('text.dart', () { + group('TextComposable text entry', () { + test('it does nothing when meta is pressed', () { + // Make sure we're using our fake binding so we can override keyboard + // modifier state. + assert(ServicesBinding.instance == binding); + final editContext = _createEditContext(); + + // Press just the meta key. + var result = anyCharacterToInsertInTextContent( + editContext: editContext, + keyEvent: const KeyDownEvent( + logicalKey: LogicalKeyboardKey.meta, + physicalKey: PhysicalKeyboardKey.metaLeft, + timeStamp: Duration.zero, + ), + ); + + // The handler should pass on handling the key. + expect(result, ExecutionInstruction.continueExecution); + + // Press "a" + meta key + binding.fakeKeyboard.isMetaPressed = true; + expect(HardwareKeyboard.instance.isMetaPressed, isTrue); + result = anyCharacterToInsertInTextContent( + editContext: editContext, + keyEvent: const KeyDownEvent( + logicalKey: LogicalKeyboardKey.keyA, + physicalKey: PhysicalKeyboardKey.keyA, + timeStamp: Duration.zero, + ), + ); + + binding.fakeKeyboard.isMetaPressed = false; + // The handler should pass on handling the key. + expect(result, ExecutionInstruction.continueExecution); + }); + }); + }); +} + +SuperEditorContext _createEditContext() { + final document = MutableDocument(); + final composer = MutableDocumentComposer(); + final documentEditor = createDefaultDocumentEditor(document: document, composer: composer); + final fakeLayout = FakeDocumentLayout(); + return SuperEditorContext( + editor: documentEditor, + document: document, + getDocumentLayout: () => fakeLayout, + composer: composer, + scroller: FakeSuperEditorScroller(), + commonOps: CommonEditorOperations( + editor: documentEditor, + document: document, + composer: composer, + documentLayoutResolver: () => fakeLayout, + ), + ); +} + +class FakeServicesBinding extends AutomatedTestWidgetsFlutterBinding { + @override + void initInstances() { + fakeKeyboard = FakeHardwareKeyboard(); + super.initInstances(); + } + + late final FakeHardwareKeyboard fakeKeyboard; + + @override + HardwareKeyboard get keyboard => fakeKeyboard; +} + +class FakeHardwareKeyboard extends HardwareKeyboard { + FakeHardwareKeyboard({ + this.isAltPressed = false, + this.isControlPressed = false, + this.isMetaPressed = false, + this.isShiftPressed = false, + }); + + @override + bool isMetaPressed; + @override + bool isControlPressed; + @override + bool isAltPressed; + @override + bool isShiftPressed; + + @override + bool isLogicalKeyPressed(LogicalKeyboardKey key) { + return switch (key) { + LogicalKeyboardKey.shift || LogicalKeyboardKey.shiftLeft || LogicalKeyboardKey.shiftRight => isShiftPressed, + LogicalKeyboardKey.alt || LogicalKeyboardKey.altLeft || LogicalKeyboardKey.altRight => isAltPressed, + LogicalKeyboardKey.control || LogicalKeyboardKey.controlLeft || LogicalKeyboardKey.controlRight => isControlPressed, + LogicalKeyboardKey.meta || LogicalKeyboardKey.metaLeft || LogicalKeyboardKey.metaRight => isMetaPressed, + _ => super.isLogicalKeyPressed(key) + }; + } +} diff --git a/super_editor/test/super_editor/text_entry/text_test.dart b/super_editor/test/super_editor/text_entry/text_test.dart index 8c8ee98236..906a240858 100644 --- a/super_editor/test/super_editor/text_entry/text_test.dart +++ b/super_editor/test/super_editor/text_entry/text_test.dart @@ -2,10 +2,9 @@ import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:super_editor/super_editor.dart'; -import '../../test_tools_user_input.dart'; import '../supereditor_test_tools.dart'; -void main() { +Future main() async { group('text.dart', () { group('ToggleTextAttributionsCommand', () { test('it toggles selected text and nothing more', () { @@ -50,53 +49,17 @@ void main() { }); group('TextComposable text entry', () { - test('it does nothing when meta is pressed', () { - final editContext = _createEditContext(); - - // Press just the meta key. - var result = anyCharacterToInsertInTextContent( - editContext: editContext, - keyEvent: const FakeRawKeyDownEvent( - data: FakeRawKeyEventData( - logicalKey: LogicalKeyboardKey.meta, - physicalKey: PhysicalKeyboardKey.metaLeft, - isMetaPressed: true, - isModifierKeyPressed: false, - ), - ), - ); - // The handler should pass on handling the key. - expect(result, ExecutionInstruction.continueExecution); - - // Press "a" + meta key - result = anyCharacterToInsertInTextContent( - editContext: editContext, - keyEvent: const FakeRawKeyDownEvent( - data: FakeRawKeyEventData( - logicalKey: LogicalKeyboardKey.keyA, - physicalKey: PhysicalKeyboardKey.keyA, - isMetaPressed: true, - isModifierKeyPressed: false, - ), - ), - ); - - // The handler should pass on handling the key. - expect(result, ExecutionInstruction.continueExecution); - }); - - test('it does nothing when nothing is selected', () { + test('it does nothing when nothing is selected', () async { final editContext = _createEditContext(); // Try to type a character. var result = anyCharacterToInsertInTextContent( editContext: editContext, - keyEvent: const FakeRawKeyDownEvent( - data: FakeRawKeyEventData( - logicalKey: LogicalKeyboardKey.keyA, - physicalKey: PhysicalKeyboardKey.keyA, - ), + keyEvent: const KeyDownEvent( + logicalKey: LogicalKeyboardKey.keyA, + physicalKey: PhysicalKeyboardKey.keyA, + timeStamp: Duration.zero, ), ); @@ -136,11 +99,10 @@ void main() { // Try to type a character. var result = anyCharacterToInsertInTextContent( editContext: editContext, - keyEvent: const FakeRawKeyDownEvent( - data: FakeRawKeyEventData( - logicalKey: LogicalKeyboardKey.keyA, - physicalKey: PhysicalKeyboardKey.keyA, - ), + keyEvent: const KeyDownEvent( + logicalKey: LogicalKeyboardKey.keyA, + physicalKey: PhysicalKeyboardKey.keyA, + timeStamp: Duration.zero, ), ); @@ -173,11 +135,10 @@ void main() { // Try to type a character. var result = anyCharacterToInsertInTextContent( editContext: editContext, - keyEvent: const FakeRawKeyDownEvent( - data: FakeRawKeyEventData( - logicalKey: LogicalKeyboardKey.keyA, - physicalKey: PhysicalKeyboardKey.keyA, - ), + keyEvent: const KeyDownEvent( + logicalKey: LogicalKeyboardKey.keyA, + physicalKey: PhysicalKeyboardKey.keyA, + timeStamp: Duration.zero, ), ); @@ -185,7 +146,7 @@ void main() { expect(result, ExecutionInstruction.continueExecution); }); - test('it does nothing when the key doesn\'t have a character', () { + testWidgets('it does nothing when the key doesn\'t have a character', (WidgetTester tester) async { final editContext = _createEditContext(); // Add a paragraph to the document. @@ -213,13 +174,11 @@ void main() { // Press the "alt" key var result = anyCharacterToInsertInTextContent( editContext: editContext, - keyEvent: const FakeRawKeyDownEvent( + keyEvent: const KeyDownEvent( character: null, - data: FakeRawKeyEventData( - logicalKey: LogicalKeyboardKey.alt, - physicalKey: PhysicalKeyboardKey.altLeft, - isModifierKeyPressed: true, - ), + logicalKey: LogicalKeyboardKey.alt, + physicalKey: PhysicalKeyboardKey.altLeft, + timeStamp: Duration.zero, ), ); @@ -229,12 +188,11 @@ void main() { // Press the "enter" key result = anyCharacterToInsertInTextContent( editContext: editContext, - keyEvent: const FakeRawKeyDownEvent( + keyEvent: const KeyDownEvent( character: '', // Empirically, pressing enter sends '' as the character instead of null - data: FakeRawKeyEventData( - logicalKey: LogicalKeyboardKey.enter, - physicalKey: PhysicalKeyboardKey.enter, - ), + logicalKey: LogicalKeyboardKey.enter, + physicalKey: PhysicalKeyboardKey.enter, + timeStamp: Duration.zero, ), ); @@ -270,12 +228,11 @@ void main() { // Press the "a" key var result = anyCharacterToInsertInTextContent( editContext: editContext, - keyEvent: const FakeRawKeyDownEvent( + keyEvent: const KeyDownEvent( character: 'a', - data: FakeRawKeyEventData( - logicalKey: LogicalKeyboardKey.keyA, - physicalKey: PhysicalKeyboardKey.keyA, - ), + logicalKey: LogicalKeyboardKey.keyA, + physicalKey: PhysicalKeyboardKey.keyA, + timeStamp: Duration.zero, ), ); @@ -287,7 +244,7 @@ void main() { ); }); - test('it inserts a non-English character', () { + testWidgets('it inserts a non-English character', (WidgetTester tester) async { final editContext = _createEditContext(); // Add a paragraph to the document. @@ -315,12 +272,11 @@ void main() { // Type a non-English character var result = anyCharacterToInsertInTextContent( editContext: editContext, - keyEvent: const FakeRawKeyDownEvent( + keyEvent: const KeyDownEvent( character: 'ß', - data: FakeRawKeyEventData( - logicalKey: LogicalKeyboardKey.keyA, - physicalKey: PhysicalKeyboardKey.keyA, - ), + logicalKey: LogicalKeyboardKey.keyA, + physicalKey: PhysicalKeyboardKey.keyA, + timeStamp: Duration.zero, ), ); diff --git a/super_editor/test/test_tools_user_input.dart b/super_editor/test/test_tools_user_input.dart index 7b03688098..418f390766 100644 --- a/super_editor/test/test_tools_user_input.dart +++ b/super_editor/test/test_tools_user_input.dart @@ -45,90 +45,3 @@ class ImeConnectionWithUpdateCount extends TextInputConnectionDecorator { _contentUpdateCount += 1; } } - -/// Concrete version of [RawKeyEvent] used to manually simulate -/// a specific key event sent from Flutter. -/// -/// [FakeRawKeyDownEvent] does not validate its configuration. It will -/// reflect whatever information you provide in the constructor, even -/// if that configuration couldn't exist in reality. -/// -/// [FakeRawKeyDownEvent] might lack some controls or functionality. It's -/// a tool designed to meet the needs of specific tests. If new tests -/// require broader functionality, then that functionality should be -/// added to [FakeRawKeyDownEvent] and other associated classes. -class FakeRawKeyDownEvent extends RawKeyDownEvent { - const FakeRawKeyDownEvent({ - required RawKeyEventData data, - String? character, - }) : super(data: data, character: character); - - @override - bool get isMetaPressed => data.isMetaPressed; - - @override - bool get isAltPressed => data.isAltPressed; - - @override - bool get isControlPressed => data.isControlPressed; - - @override - bool get isShiftPressed => data.isShiftPressed; -} - -/// Concrete version of [FakeRawKeyEventData] used to manually simulate -/// a specific key event sent from Flutter. -/// -/// [FakeRawKeyEventData] does not validate its configuration. It will -/// reflect whatever information you provide in the constructor, even -/// if that configuration couldn't exist in reality. -/// -/// [FakeRawKeyEventData] might lack some controls or functionality. It's -/// a tool designed to meet the needs of specific tests. If new tests -/// require broader functionality, then that functionality should be -/// added to [FakeRawKeyEventData] and other associated classes. -class FakeRawKeyEventData extends RawKeyEventData { - const FakeRawKeyEventData({ - this.keyLabel = 'fake_key_event', - required this.logicalKey, - required this.physicalKey, - this.isMetaPressed = false, - this.isControlPressed = false, - this.isAltPressed = false, - this.isModifierKeyPressed = false, - this.isShiftPressed = false, - }); - - @override - final String keyLabel; - - @override - final LogicalKeyboardKey logicalKey; - - @override - final PhysicalKeyboardKey physicalKey; - - final bool isModifierKeyPressed; - - @override - final bool isMetaPressed; - - @override - final bool isAltPressed; - - @override - final bool isControlPressed; - - @override - final bool isShiftPressed; - - @override - bool isModifierPressed(ModifierKey key, {KeyboardSide side = KeyboardSide.any}) { - return isModifierKeyPressed; - } - - @override - KeyboardSide? getModifierSide(ModifierKey key) { - throw UnimplementedError(); - } -} diff --git a/super_text_layout/example/pubspec.lock b/super_text_layout/example/pubspec.lock index 37faa6683b..308eb7082c 100644 --- a/super_text_layout/example/pubspec.lock +++ b/super_text_layout/example/pubspec.lock @@ -69,10 +69,10 @@ packages: dependency: transitive description: name: collection - sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a url: "https://pub.dev" source: hosted - version: "1.17.2" + version: "1.18.0" convert: dependency: transitive description: @@ -85,10 +85,10 @@ packages: dependency: transitive description: name: coverage - sha256: "2fb815080e44a09b85e0f2ca8a820b15053982b2e714b59267719e8a9ff17097" + sha256: ac86d3abab0f165e4b8f561280ff4e066bceaac83c424dd19f1ae2c2fcd12ca9 url: "https://pub.dev" source: hosted - version: "1.6.3" + version: "1.7.1" crypto: dependency: transitive description: @@ -163,6 +163,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.2" + intl: + dependency: transitive + description: + name: intl + sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" + url: "https://pub.dev" + source: hosted + version: "0.18.1" io: dependency: transitive description: @@ -179,6 +187,22 @@ packages: url: "https://pub.dev" source: hosted version: "0.6.7" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "2c30f27ada446b4d36307aade893faaaeb6d8f55b2362b7f424a9668fcc43f4d" + url: "https://pub.dev" + source: hosted + version: "9.0.14" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: b06739349ec2477e943055aea30172c5c7000225f79dad4702e2ec0eda79a6ff + url: "https://pub.dev" + source: hosted + version: "1.0.5" lints: dependency: transitive description: @@ -207,18 +231,18 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" url: "https://pub.dev" source: hosted - version: "0.5.0" + version: "0.8.0" meta: dependency: transitive description: name: meta - sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" + sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.11.0" mime: dependency: transitive description: @@ -371,10 +395,10 @@ packages: dependency: transitive description: name: test - sha256: "67ec5684c7a19b2aba91d2831f3d305a6fd8e1504629c5818f8d64478abf4f38" + sha256: a1f7595805820fcc05e5c52e3a231aedd0b72972cb333e8c738a8b1239448b6f url: "https://pub.dev" source: hosted - version: "1.24.4" + version: "1.24.9" test_api: dependency: transitive description: @@ -387,10 +411,10 @@ packages: dependency: transitive description: name: test_core - sha256: "6b753899253c38ca0523bb0eccff3934ec83d011705dae717c61ecf209e333c9" + sha256: a757b14fc47507060a162cc2530d9a4a2f92f5100a952c7443b5cad5ef5b106a url: "https://pub.dev" source: hosted - version: "0.5.4" + version: "0.5.9" typed_data: dependency: transitive description: @@ -411,10 +435,10 @@ packages: dependency: transitive description: name: vm_service - sha256: f3743ca475e0c9ef71df4ba15eb2d7684eecd5c8ba20a462462e4e8b561b2e11 + sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 url: "https://pub.dev" source: hosted - version: "11.6.0" + version: "13.0.0" watcher: dependency: transitive description: @@ -427,10 +451,10 @@ packages: dependency: transitive description: name: web - sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 + sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 url: "https://pub.dev" source: hosted - version: "0.1.4-beta" + version: "0.3.0" web_socket_channel: dependency: transitive description: @@ -456,5 +480,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.1.0-185.0.dev <4.0.0" + dart: ">=3.2.0-194.0.dev <4.0.0" flutter: ">=1.17.0" diff --git a/website/lib/homepage/editor_toolbar.dart b/website/lib/homepage/editor_toolbar.dart index 79c50be250..6cce40c2b3 100644 --- a/website/lib/homepage/editor_toolbar.dart +++ b/website/lib/homepage/editor_toolbar.dart @@ -236,7 +236,7 @@ class _EditorToolbarState extends State { widget.editor.execute( [ ToggleTextAttributionsRequest( - documentSelection: widget.composer.selection!, + documentRange: widget.composer.selection!, attributions: {boldAttribution}, ), ], @@ -248,7 +248,7 @@ class _EditorToolbarState extends State { widget.editor.execute( [ ToggleTextAttributionsRequest( - documentSelection: widget.composer.selection!, + documentRange: widget.composer.selection!, attributions: {italicsAttribution}, ), ], @@ -260,7 +260,7 @@ class _EditorToolbarState extends State { widget.editor.execute( [ ToggleTextAttributionsRequest( - documentSelection: widget.composer.selection!, + documentRange: widget.composer.selection!, attributions: {strikethroughAttribution}, ), ], diff --git a/website/pubspec.lock b/website/pubspec.lock index ec64dd99fd..14203db393 100644 --- a/website/pubspec.lock +++ b/website/pubspec.lock @@ -77,10 +77,10 @@ packages: dependency: transitive description: name: collection - sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a url: "https://pub.dev" source: hosted - version: "1.17.2" + version: "1.18.0" convert: dependency: transitive description: @@ -93,10 +93,10 @@ packages: dependency: transitive description: name: coverage - sha256: ad538fa2e8f6b828d54c04a438af816ce814de404690136d3b9dfb3a436cd01c + sha256: ac86d3abab0f165e4b8f561280ff4e066bceaac83c424dd19f1ae2c2fcd12ca9 url: "https://pub.dev" source: hosted - version: "1.0.3" + version: "1.7.1" crypto: dependency: transitive description: @@ -135,10 +135,10 @@ packages: dependency: transitive description: name: flutter_test_robots - sha256: e43d82bce5c17813b1b47b8228a2369936cfe7d73981002bc919b510de350d08 + sha256: a95004a952e079abafabda4685615f8cafe4603bf100eda937a0a038998b7533 url: "https://pub.dev" source: hosted - version: "0.0.18" + version: "0.0.22" flutter_web_plugins: dependency: "direct main" description: flutter @@ -148,10 +148,10 @@ packages: dependency: transitive description: name: follow_the_leader - sha256: "4e74bcf1ed3b4ce9c6743ee9f24bc68c0cf017ca3731d849018eb083c60687fe" + sha256: "7e8937e811a02a2892e6c07552a918a4b1e2dec756aa87042f49777ae1ca1a09" url: "https://pub.dev" source: hosted - version: "0.0.4+2" + version: "0.0.4+6" frontend_server_client: dependency: transitive description: @@ -192,6 +192,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.0" + intl: + dependency: transitive + description: + name: intl + sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" + url: "https://pub.dev" + source: hosted + version: "0.18.1" io: dependency: transitive description: @@ -208,14 +216,30 @@ packages: url: "https://pub.dev" source: hosted version: "0.6.7" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "2c30f27ada446b4d36307aade893faaaeb6d8f55b2362b7f424a9668fcc43f4d" + url: "https://pub.dev" + source: hosted + version: "9.0.14" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: b06739349ec2477e943055aea30172c5c7000225f79dad4702e2ec0eda79a6ff + url: "https://pub.dev" + source: hosted + version: "1.0.5" linkify: dependency: transitive description: name: linkify - sha256: f27f2930577bb65a5d8f2b0676404f3c89a1f354fcb1cf14b96df34e50cddf43 + sha256: "4139ea77f4651ab9c315b577da2dd108d9aa0bd84b5d03d33323f1970c645832" url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "5.0.0" lint: dependency: "direct dev" description: @@ -244,18 +268,18 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" url: "https://pub.dev" source: hosted - version: "0.5.0" + version: "0.8.0" meta: dependency: transitive description: name: meta - sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" + sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.11.0" mime: dependency: transitive description: @@ -276,10 +300,10 @@ packages: dependency: transitive description: name: overlord - sha256: "7fa6a83455b7da5c66a16320c02783d110c574a6e6c511750c662dbadfe9399f" + sha256: "311b50446ec227beafc114968101ae623046cf27887f43c916fa7c5131a145b6" url: "https://pub.dev" source: hosted - version: "0.0.3+2" + version: "0.0.3+4" package_config: dependency: transitive description: @@ -393,18 +417,18 @@ packages: dependency: transitive description: name: stack_trace - sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.11.1" stream_channel: dependency: transitive description: name: stream_channel - sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" string_scanner: dependency: transitive description: @@ -424,10 +448,10 @@ packages: dependency: "direct main" description: name: super_text_layout - sha256: "8afed48db5e15c9c3488ca9f24b24cd24a4867a6d9d2dd2ba540ac363f50b60d" + sha256: "2f2a8b36553f775c390924f079b5a8ba6c717b0885f44d80a9602bfa182b6f9f" url: "https://pub.dev" source: hosted - version: "0.1.6" + version: "0.1.7" term_glyph: dependency: transitive description: @@ -440,26 +464,26 @@ packages: dependency: transitive description: name: test - sha256: "13b41f318e2a5751c3169137103b60c584297353d4b1761b66029bae6411fe46" + sha256: a1f7595805820fcc05e5c52e3a231aedd0b72972cb333e8c738a8b1239448b6f url: "https://pub.dev" source: hosted - version: "1.24.3" + version: "1.24.9" test_api: dependency: transitive description: name: test_api - sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" + sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" url: "https://pub.dev" source: hosted - version: "0.6.0" + version: "0.6.1" test_core: dependency: transitive description: name: test_core - sha256: "99806e9e6d95c7b059b7a0fc08f07fc53fabe54a829497f0d9676299f1e8637e" + sha256: a757b14fc47507060a162cc2530d9a4a2f92f5100a952c7443b5cad5ef5b106a url: "https://pub.dev" source: hosted - version: "0.5.3" + version: "0.5.9" typed_data: dependency: transitive description: @@ -552,10 +576,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "35ef1bbae978d7158e09c98dcdfe8673b58a30eb53e82833cc027e0aab2d5213" + sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 url: "https://pub.dev" source: hosted - version: "7.5.0" + version: "13.0.0" watcher: dependency: transitive description: @@ -564,6 +588,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.1" + web: + dependency: transitive + description: + name: web + sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 + url: "https://pub.dev" + source: hosted + version: "0.3.0" web_socket_channel: dependency: transitive description: @@ -589,5 +621,5 @@ packages: source: hosted version: "3.1.0" sdks: - dart: ">=3.0.0 <4.0.0" + dart: ">=3.2.0-194.0.dev <4.0.0" flutter: ">=3.3.0"