-
Notifications
You must be signed in to change notification settings - Fork 244
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add popover toolbar builder that uses Flutter's new support for an iOS 16+ system toolbar (Resolves #2032) #2058
Merged
Merged
Changes from 2 commits
Commits
Show all changes
8 commits
Select commit
Hold shift + click to select a range
a95873b
Use native iOS edit menu when available (Resolves #2032)
matthew-carroll 150bf52
Add popover toolbar builder that uses Flutter's new support for an iO…
matthew-carroll c1a4a87
Merge branch 'main' into 2032_ios-native-edit-menu
matthew-carroll fa38418
Switched iOS text field demo to use native context menu
matthew-carroll 0e74c94
WIP: Integrating iOS context menu with Super Editor
matthew-carroll 946fd1c
Merge branch 'main' into 2032_ios-native-edit-menu
matthew-carroll a4b341a
Reworked pattern tags demo to layout on mobile
matthew-carroll 8bf3656
Removed commented code, removed a couple deprecated properties.
matthew-carroll File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
<component name="ProjectRunConfigurationManager"> | ||
<configuration default="false" name="Flutter - Text Field" type="FlutterRunConfigurationType" factoryName="Flutter"> | ||
<option name="filePath" value="$PROJECT_DIR$/example/lib/flutter_demos/main_flutter_textfield.dart" /> | ||
<method v="2" /> | ||
</configuration> | ||
</component> |
63 changes: 63 additions & 0 deletions
63
super_editor/example/lib/flutter_demos/main_flutter_textfield.dart
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,63 @@ | ||
import 'package:flutter/cupertino.dart'; | ||
import 'package:flutter/material.dart'; | ||
|
||
void main() { | ||
runApp(_FlutterTextFieldDemoApp()); | ||
} | ||
|
||
class _FlutterTextFieldDemoApp extends StatelessWidget { | ||
const _FlutterTextFieldDemoApp(); | ||
|
||
@override | ||
Widget build(BuildContext context) { | ||
return MaterialApp( | ||
home: Scaffold( | ||
body: Padding( | ||
padding: const EdgeInsets.all(24), | ||
child: Center( | ||
child: _DemoTextField(), | ||
), | ||
), | ||
), | ||
); | ||
} | ||
} | ||
|
||
class _DemoTextField extends StatefulWidget { | ||
const _DemoTextField(); | ||
|
||
@override | ||
State<_DemoTextField> createState() => _DemoTextFieldState(); | ||
} | ||
|
||
class _DemoTextFieldState extends State<_DemoTextField> { | ||
final _textController = TextEditingController(); | ||
|
||
@override | ||
void dispose() { | ||
_textController.dispose(); | ||
super.dispose(); | ||
} | ||
|
||
@override | ||
Widget build(BuildContext context) { | ||
return TextField( | ||
controller: _textController, | ||
decoration: InputDecoration( | ||
hintText: "Enter text...", | ||
), | ||
contextMenuBuilder: (BuildContext context, EditableTextState editableTextState) { | ||
// If supported, show the system context menu. | ||
if (SystemContextMenu.isSupported(context)) { | ||
return SystemContextMenu.editableText( | ||
editableTextState: editableTextState, | ||
); | ||
} | ||
// Otherwise, show the flutter-rendered context menu for the current | ||
// platform. | ||
return AdaptiveTextSelectionToolbar.editableText( | ||
editableTextState: editableTextState, | ||
); | ||
}); | ||
} | ||
} |
File renamed without changes.
File renamed without changes.
File renamed without changes.
87 changes: 87 additions & 0 deletions
87
super_editor/lib/src/super_textfield/ios/ios_system_context_menu.dart
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/services.dart'; | ||
import 'package:flutter/widgets.dart'; | ||
|
||
/// Displays the iOS system context menu on top of the Flutter view. | ||
/// | ||
/// This class was copied and adjusted from Flutter's [SystemContextMenu]. | ||
/// | ||
/// Currently, only supports iOS 16.0 and above. | ||
/// | ||
/// The context menu is the menu that appears, for example, when doing text | ||
/// selection. Flutter typically draws this menu itself, but this class deals | ||
/// with the platform-rendered context menu instead. | ||
/// | ||
/// There can only be one system context menu visible at a time. Building this | ||
/// widget when the system context menu is already visible will hide the old one | ||
/// and display this one. A system context menu that is hidden is informed via | ||
/// [onSystemHide]. | ||
/// | ||
/// To check if the current device supports showing the system context menu, | ||
/// call [isSupported]. | ||
/// | ||
/// See also: | ||
/// | ||
/// * [SystemContextMenuController], which directly controls the hiding and | ||
/// showing of the system context menu. | ||
class IOSSystemContextMenu extends StatefulWidget { | ||
/// Whether the current device supports showing the system context menu. | ||
/// | ||
/// Currently, this is only supported on iOS 16.0 and above. | ||
static bool isSupported(BuildContext context) { | ||
return MediaQuery.maybeSupportsShowingSystemContextMenu(context) ?? false; | ||
} | ||
|
||
const IOSSystemContextMenu({ | ||
super.key, | ||
required this.anchor, | ||
this.onSystemHide, | ||
}); | ||
|
||
/// The [Rect] that the context menu should point to. | ||
final Rect anchor; | ||
|
||
/// Called when the system hides this context menu. | ||
/// | ||
/// For example, tapping outside of the context menu typically causes the | ||
/// system to hide the menu. | ||
/// | ||
/// This is not called when showing a new system context menu causes another | ||
/// to be hidden. | ||
final VoidCallback? onSystemHide; | ||
|
||
@override | ||
State<IOSSystemContextMenu> createState() => _IOSSystemContextMenuState(); | ||
} | ||
|
||
class _IOSSystemContextMenuState extends State<IOSSystemContextMenu> { | ||
late final SystemContextMenuController _systemContextMenuController; | ||
|
||
@override | ||
void initState() { | ||
super.initState(); | ||
_systemContextMenuController = SystemContextMenuController( | ||
onSystemHide: widget.onSystemHide, | ||
); | ||
_systemContextMenuController.show(widget.anchor); | ||
} | ||
|
||
@override | ||
void didUpdateWidget(IOSSystemContextMenu oldWidget) { | ||
super.didUpdateWidget(oldWidget); | ||
if (widget.anchor != oldWidget.anchor) { | ||
_systemContextMenuController.show(widget.anchor); | ||
} | ||
} | ||
|
||
@override | ||
void dispose() { | ||
_systemContextMenuController.dispose(); | ||
super.dispose(); | ||
} | ||
|
||
@override | ||
Widget build(BuildContext context) { | ||
assert(IOSSystemContextMenu.isSupported(context)); | ||
return const SizedBox.shrink(); | ||
} | ||
} |
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
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is
WithBackupFlutterVersion
an appropriate name? I thinkiOSSystemPopoverToolbarWithFallback
would be simpler.