Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Allows launching links in editing mode, where: * For desktop platforms: links launch on `Cmd` + `Click` (macOS) or `Ctrl` + `Click` (windows, linux) * For mobile platforms: long-pressing a link shows a context menu with multiple actions (Open, Copy, Remove) for the user to choose from.
- Loading branch information
1 parent
baeee13
commit ef283f7
Showing
8 changed files
with
491 additions
and
39 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
import 'package:flutter/material.dart'; | ||
import 'package:flutter/services.dart'; | ||
|
||
class ZefyrPressedKeys extends ChangeNotifier { | ||
static ZefyrPressedKeys of(BuildContext context) { | ||
final widget = | ||
context.dependOnInheritedWidgetOfExactType<_ZefyrPressedKeysAccess>(); | ||
return widget!.pressedKeys; | ||
} | ||
|
||
bool _metaPressed = false; | ||
bool _controlPressed = false; | ||
|
||
/// Whether meta key is currently pressed. | ||
bool get metaPressed => _metaPressed; | ||
|
||
/// Whether control key is currently pressed. | ||
bool get controlPressed => _controlPressed; | ||
|
||
void _updatePressedKeys(Set<LogicalKeyboardKey> pressedKeys) { | ||
final meta = pressedKeys.contains(LogicalKeyboardKey.metaLeft) || | ||
pressedKeys.contains(LogicalKeyboardKey.metaRight); | ||
final control = pressedKeys.contains(LogicalKeyboardKey.controlLeft) || | ||
pressedKeys.contains(LogicalKeyboardKey.controlRight); | ||
if (_metaPressed != meta || _controlPressed != control) { | ||
_metaPressed = meta; | ||
_controlPressed = control; | ||
notifyListeners(); | ||
} | ||
} | ||
} | ||
|
||
class ZefyrKeyboardListener extends StatefulWidget { | ||
final Widget child; | ||
const ZefyrKeyboardListener({Key? key, required this.child}) | ||
: super(key: key); | ||
|
||
@override | ||
ZefyrKeyboardListenerState createState() => ZefyrKeyboardListenerState(); | ||
} | ||
|
||
class ZefyrKeyboardListenerState extends State<ZefyrKeyboardListener> { | ||
final ZefyrPressedKeys _pressedKeys = ZefyrPressedKeys(); | ||
|
||
bool _keyEvent(KeyEvent event) { | ||
_pressedKeys | ||
._updatePressedKeys(HardwareKeyboard.instance.logicalKeysPressed); | ||
return false; | ||
} | ||
|
||
@override | ||
void initState() { | ||
super.initState(); | ||
HardwareKeyboard.instance.addHandler(_keyEvent); | ||
_pressedKeys | ||
._updatePressedKeys(HardwareKeyboard.instance.logicalKeysPressed); | ||
} | ||
|
||
@override | ||
void dispose() { | ||
HardwareKeyboard.instance.removeHandler(_keyEvent); | ||
_pressedKeys.dispose(); | ||
super.dispose(); | ||
} | ||
|
||
@override | ||
Widget build(BuildContext context) { | ||
return _ZefyrPressedKeysAccess( | ||
pressedKeys: _pressedKeys, | ||
child: widget.child, | ||
); | ||
} | ||
} | ||
|
||
class _ZefyrPressedKeysAccess extends InheritedWidget { | ||
final ZefyrPressedKeys pressedKeys; | ||
const _ZefyrPressedKeysAccess({ | ||
Key? key, | ||
required this.pressedKeys, | ||
required Widget child, | ||
}) : super(key: key, child: child); | ||
|
||
@override | ||
bool updateShouldNotify(covariant _ZefyrPressedKeysAccess oldWidget) { | ||
return oldWidget.pressedKeys != pressedKeys; | ||
} | ||
} |
Oops, something went wrong.