diff --git a/CHANGELOG.md b/CHANGELOG.md index 6216b20a..00fb9778 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## [7.6.1] + +- Bug fixes + ## [7.6.0] - **Breaking change**: To customize the buttons in the toolbar, you can do that in the `QuillProvider` diff --git a/flutter_quill_extensions/lib/embeds/builders.dart b/flutter_quill_extensions/lib/embeds/builders.dart index 8ea23202..5b3103f1 100644 --- a/flutter_quill_extensions/lib/embeds/builders.dart +++ b/flutter_quill_extensions/lib/embeds/builders.dart @@ -5,7 +5,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_quill/extensions.dart' as base; -import 'package:flutter_quill/flutter_quill.dart' hide Text; +import 'package:flutter_quill/flutter_quill.dart'; import 'package:flutter_quill/translations.dart'; import 'package:math_keyboard/math_keyboard.dart'; import 'package:universal_html/html.dart' as html; diff --git a/flutter_quill_extensions/lib/embeds/toolbar/camera_button.dart b/flutter_quill_extensions/lib/embeds/toolbar/camera_button.dart index d654425c..6fab2583 100644 --- a/flutter_quill_extensions/lib/embeds/toolbar/camera_button.dart +++ b/flutter_quill_extensions/lib/embeds/toolbar/camera_button.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_quill/flutter_quill.dart' hide Text; +import 'package:flutter_quill/flutter_quill.dart'; import 'package:flutter_quill/translations.dart'; import 'package:image_picker/image_picker.dart'; diff --git a/flutter_quill_extensions/lib/embeds/toolbar/image_video_utils.dart b/flutter_quill_extensions/lib/embeds/toolbar/image_video_utils.dart index 66045a51..5da99c6d 100644 --- a/flutter_quill_extensions/lib/embeds/toolbar/image_video_utils.dart +++ b/flutter_quill_extensions/lib/embeds/toolbar/image_video_utils.dart @@ -3,7 +3,7 @@ import 'dart:io' show File; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_quill/extensions.dart'; -import 'package:flutter_quill/flutter_quill.dart' hide Text; +import 'package:flutter_quill/flutter_quill.dart'; import 'package:flutter_quill/translations.dart'; import 'package:image_picker/image_picker.dart'; diff --git a/flutter_quill_extensions/lib/embeds/toolbar/media_button.dart b/flutter_quill_extensions/lib/embeds/toolbar/media_button.dart index 135f4536..8a13a5fc 100644 --- a/flutter_quill_extensions/lib/embeds/toolbar/media_button.dart +++ b/flutter_quill_extensions/lib/embeds/toolbar/media_button.dart @@ -4,7 +4,7 @@ import 'dart:ui'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_quill/extensions.dart'; -import 'package:flutter_quill/flutter_quill.dart' hide Text; +import 'package:flutter_quill/flutter_quill.dart'; import 'package:flutter_quill/translations.dart'; import 'package:image_picker/image_picker.dart'; diff --git a/flutter_quill_extensions/pubspec.yaml b/flutter_quill_extensions/pubspec.yaml index 2c6231ef..b0d616c7 100644 --- a/flutter_quill_extensions/pubspec.yaml +++ b/flutter_quill_extensions/pubspec.yaml @@ -19,10 +19,10 @@ dependencies: flutter: sdk: flutter - # flutter_quill: ^7.5.0 + flutter_quill: ^7.5.0 # In case you are working on changes for both libraries, - flutter_quill: - path: /Users/ahmedhnewa/development/playground/framework_based/flutter/flutter-quill + # flutter_quill: + # path: ~/development/playground/framework_based/flutter/flutter-quill http: ^1.1.0 image_picker: ">=1.0.4" diff --git a/lib/flutter_quill.dart b/lib/flutter_quill.dart index 8f004617..9cef05c3 100644 --- a/lib/flutter_quill.dart +++ b/lib/flutter_quill.dart @@ -22,10 +22,10 @@ export 'src/models/themes/quill_icon_theme.dart'; export 'src/utils/embeds.dart'; export 'src/widgets/controller.dart'; export 'src/widgets/default_styles.dart'; -export 'src/widgets/editor.dart'; +export 'src/widgets/editor/editor.dart'; export 'src/widgets/embeds.dart'; export 'src/widgets/link.dart' show LinkActionPickerDelegate, LinkMenuAction; export 'src/widgets/style_widgets/style_widgets.dart'; -export 'src/widgets/toolbar.dart'; export 'src/widgets/toolbar/enum.dart'; +export 'src/widgets/toolbar/toolbar.dart'; export 'src/widgets/utils/provider.dart'; diff --git a/lib/src/models/config/toolbar/buttons/base.dart b/lib/src/models/config/toolbar/buttons/base.dart index 82514a27..d683b5a0 100644 --- a/lib/src/models/config/toolbar/buttons/base.dart +++ b/lib/src/models/config/toolbar/buttons/base.dart @@ -1,3 +1,4 @@ +import 'package:equatable/equatable.dart'; import 'package:flutter/foundation.dart' show VoidCallback, immutable; import 'package:flutter/widgets.dart' show IconData, Widget; @@ -9,7 +10,7 @@ import '../../quill_configurations.dart' show kDefaultIconSize; /// it's used in [childBuilder] so the developer can custmize this when using it /// The [I] is extra options for the button, usually for it's state @immutable -class QuillToolbarBaseButtonOptions { +class QuillToolbarBaseButtonOptions extends Equatable { const QuillToolbarBaseButtonOptions({ this.iconData, this.globalIconSize = kDefaultIconSize, @@ -45,4 +46,15 @@ class QuillToolbarBaseButtonOptions { /// By default it will be from the one in [QuillProvider] /// To override it you must pass not null controller final QuillController? controller; + + @override + List get props => [ + iconData, + globalIconSize, + afterButtonPressed, + tooltip, + iconTheme, + childBuilder, + controller, + ]; } diff --git a/lib/src/models/config/toolbar/buttons/font_family.dart b/lib/src/models/config/toolbar/buttons/font_family.dart index f098c9ec..92bb5395 100644 --- a/lib/src/models/config/toolbar/buttons/font_family.dart +++ b/lib/src/models/config/toolbar/buttons/font_family.dart @@ -25,7 +25,7 @@ class QuillToolbarFontFamilyButtonOptions extends QuillToolbarBaseButtonOptions< QuillToolbarFontFamilyButtonOptions, QuillToolbarFontFamilyButtonExtraOptions> { const QuillToolbarFontFamilyButtonOptions({ - this.attribute = Attribute.bold, + this.attribute = Attribute.font, this.rawItemsMap, super.controller, super.iconData, diff --git a/lib/src/models/config/toolbar/buttons/font_size.dart b/lib/src/models/config/toolbar/buttons/font_size.dart new file mode 100644 index 00000000..693e55fb --- /dev/null +++ b/lib/src/models/config/toolbar/buttons/font_size.dart @@ -0,0 +1,68 @@ +import 'package:flutter/foundation.dart' show immutable; +import 'package:flutter/material.dart' + show Colors, PopupMenuEntry, ValueChanged; +import 'package:flutter/widgets.dart' + show + Color, + EdgeInsetsGeometry, + TextStyle, + VoidCallback, + TextOverflow, + EdgeInsets; + +import '../../../../widgets/controller.dart'; +import '../../../documents/attribute.dart'; +import '../../../themes/quill_icon_theme.dart'; +import '../../quill_configurations.dart'; + +@immutable +class QuillToolbarFontSizeButtonOptions extends QuillToolbarBaseButtonOptions { + const QuillToolbarFontSizeButtonOptions({ + this.iconSize, + this.fillColor, + this.hoverElevation = 1, + this.highlightElevation = 1, + this.items, + this.rawItemsMap, + this.onSelected, + this.iconTheme, + this.attribute = Attribute.size, + this.controller, + this.afterButtonPressed, + this.tooltip, + this.padding, + this.style, + this.width, + this.initialValue, + this.labelOverflow = TextOverflow.visible, + this.itemHeight, + this.itemPadding, + this.defaultItemColor = Colors.red, + }); + + final double? iconSize; + final Color? fillColor; + final double hoverElevation; + final double highlightElevation; + @Deprecated('It is not required because of `rawItemsMap`') + final List>? items; + final Map? rawItemsMap; + final ValueChanged? onSelected; + @override + final QuillIconTheme? iconTheme; + final Attribute attribute; + @override + final QuillController? controller; + @override + final VoidCallback? afterButtonPressed; + @override + final String? tooltip; + final EdgeInsetsGeometry? padding; + final TextStyle? style; + final double? width; + final String? initialValue; + final TextOverflow labelOverflow; + final double? itemHeight; + final EdgeInsets? itemPadding; + final Color? defaultItemColor; +} diff --git a/lib/src/models/config/toolbar/configurations.dart b/lib/src/models/config/toolbar/configurations.dart index 54cadd33..5f142c5c 100644 --- a/lib/src/models/config/toolbar/configurations.dart +++ b/lib/src/models/config/toolbar/configurations.dart @@ -1,13 +1,14 @@ import 'package:equatable/equatable.dart'; import 'package:flutter/foundation.dart' show immutable; -import '../../documents/attribute.dart'; import 'buttons/base.dart'; import 'buttons/font_family.dart'; +import 'buttons/font_size.dart'; import 'buttons/history.dart'; export './buttons/base.dart'; export './buttons/font_family.dart'; +export './buttons/font_size.dart'; export './buttons/history.dart'; export './buttons/toggle_style.dart'; @@ -46,7 +47,7 @@ class QuillToolbarConfigurations extends Equatable { if (alternativeToolbarSize != null) { return alternativeToolbarSize; } - return buttonOptions.baseButtonOptions.globalIconSize * 2; + return buttonOptions.base.globalIconSize * 2; } /// If you want change spesefic buttons or all of them @@ -81,21 +82,30 @@ class QuillToolbarConfigurations extends Equatable { /// The configurations for the buttons of the toolbar widget of flutter quill @immutable -class QuillToolbarButtonOptions { +class QuillToolbarButtonOptions extends Equatable { const QuillToolbarButtonOptions({ - this.baseButtonOptions = const QuillToolbarBaseButtonOptions(), - this.undoHistoryButtonOptions = const QuillToolbarHistoryButtonOptions( + this.base = const QuillToolbarBaseButtonOptions(), + this.undoHistory = const QuillToolbarHistoryButtonOptions( isUndo: true, ), - this.redoHistoryButtonOptions = const QuillToolbarHistoryButtonOptions( + this.redoHistory = const QuillToolbarHistoryButtonOptions( isUndo: false, ), - this.fontFamilyButtonOptions = const QuillToolbarFontFamilyButtonOptions(), + this.fontFamily = const QuillToolbarFontFamilyButtonOptions(), + this.fontSize = const QuillToolbarFontSizeButtonOptions(), }); - /// The base configurations for all the buttons - final QuillToolbarBaseButtonOptions baseButtonOptions; - final QuillToolbarHistoryButtonOptions undoHistoryButtonOptions; - final QuillToolbarHistoryButtonOptions redoHistoryButtonOptions; - final QuillToolbarFontFamilyButtonOptions fontFamilyButtonOptions; + /// The base configurations for all the buttons which will apply to all + /// but if the options overrided in the spesefic button options + /// then it will use that instead + final QuillToolbarBaseButtonOptions base; + final QuillToolbarHistoryButtonOptions undoHistory; + final QuillToolbarHistoryButtonOptions redoHistory; + final QuillToolbarFontFamilyButtonOptions fontFamily; + final QuillToolbarFontSizeButtonOptions fontSize; + + @override + List get props => [ + base, + ]; } diff --git a/lib/src/test/widget_tester_extension.dart b/lib/src/test/widget_tester_extension.dart index 866c5c7f..85cc4500 100644 --- a/lib/src/test/widget_tester_extension.dart +++ b/lib/src/test/widget_tester_extension.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import '../widgets/editor.dart'; +import '../widgets/editor/editor.dart'; import '../widgets/raw_editor/raw_editor.dart'; /// Extends diff --git a/lib/src/utils/extensions/build_context.dart b/lib/src/utils/extensions/build_context.dart index 820919d9..3eadd78a 100644 --- a/lib/src/utils/extensions/build_context.dart +++ b/lib/src/utils/extensions/build_context.dart @@ -102,7 +102,7 @@ extension BuildContextExt on BuildContext { /// get the provider widget first and then we will return base button /// don't throw exception if [QuillProvider] is not in the widget tree QuillToolbarBaseButtonOptions? get quillToolbarBaseButtonOptions { - return quillToolbarConfigurations?.buttonOptions.baseButtonOptions; + return quillToolbarConfigurations?.buttonOptions.base; } /// return [QuillToolbarBaseButtonOptions] as not null. Since the quill @@ -110,6 +110,6 @@ extension BuildContextExt on BuildContext { /// get the provider widget first and then we will return base button /// throw exception if [QuillProvider] is not in the widget tree QuillToolbarBaseButtonOptions get requireQuillToolbarBaseButtonOptions { - return requireQuillToolbarConfigurations.buttonOptions.baseButtonOptions; + return requireQuillToolbarConfigurations.buttonOptions.base; } } diff --git a/lib/src/widgets/delegate.dart b/lib/src/widgets/delegate.dart index 988473bd..c196a5d3 100644 --- a/lib/src/widgets/delegate.dart +++ b/lib/src/widgets/delegate.dart @@ -6,7 +6,7 @@ import 'package:flutter/scheduler.dart'; import '../models/documents/attribute.dart'; import '../models/documents/nodes/leaf.dart'; import '../utils/platform.dart'; -import 'editor.dart'; +import 'editor/editor.dart'; import 'embeds.dart'; import 'text_selection.dart'; diff --git a/lib/src/widgets/editor.dart b/lib/src/widgets/editor/editor.dart similarity index 99% rename from lib/src/widgets/editor.dart rename to lib/src/widgets/editor/editor.dart index 2c154eb9..9502d229 100644 --- a/lib/src/widgets/editor.dart +++ b/lib/src/widgets/editor/editor.dart @@ -11,17 +11,17 @@ import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'package:i18n_extension/i18n_widget.dart'; -import '../../flutter_quill.dart'; -import '../models/documents/nodes/container.dart' as container_node; -import '../utils/extensions/build_context.dart'; -import '../utils/platform.dart'; -import 'box.dart'; -import 'cursor.dart'; -import 'delegate.dart'; -import 'float_cursor.dart'; -import 'link.dart'; -import 'raw_editor/raw_editor.dart'; -import 'text_selection.dart'; +import '../../../flutter_quill.dart'; +import '../../models/documents/nodes/container.dart' as container_node; +import '../../utils/extensions/build_context.dart'; +import '../../utils/platform.dart'; +import '../box.dart'; +import '../cursor.dart'; +import '../delegate.dart'; +import '../float_cursor.dart'; +import '../link.dart'; +import '../raw_editor/raw_editor.dart'; +import '../text_selection.dart'; /// Base interface for the editor state which defines contract used by /// various mixins. diff --git a/lib/src/widgets/raw_editor/raw_editor.dart b/lib/src/widgets/raw_editor/raw_editor.dart index e3b0f1a1..c71bbd08 100644 --- a/lib/src/widgets/raw_editor/raw_editor.dart +++ b/lib/src/widgets/raw_editor/raw_editor.dart @@ -41,7 +41,7 @@ import '../controller.dart'; import '../cursor.dart'; import '../default_styles.dart'; import '../delegate.dart'; -import '../editor.dart'; +import '../editor/editor.dart'; import '../keyboard_listener.dart'; import '../link.dart'; import '../proxy.dart'; diff --git a/lib/src/widgets/raw_editor/raw_editor_state_selection_delegate_mixin.dart b/lib/src/widgets/raw_editor/raw_editor_state_selection_delegate_mixin.dart index 363b9d31..603402fa 100644 --- a/lib/src/widgets/raw_editor/raw_editor_state_selection_delegate_mixin.dart +++ b/lib/src/widgets/raw_editor/raw_editor_state_selection_delegate_mixin.dart @@ -8,7 +8,7 @@ import '../../models/documents/nodes/embeddable.dart'; import '../../models/documents/nodes/leaf.dart'; import '../../models/documents/style.dart'; import '../../utils/delta.dart'; -import '../editor.dart'; +import '../editor/editor.dart'; mixin RawEditorStateSelectionDelegateMixin on EditorState implements TextSelectionDelegate { diff --git a/lib/src/widgets/raw_editor/raw_editor_state_text_input_client_mixin.dart b/lib/src/widgets/raw_editor/raw_editor_state_text_input_client_mixin.dart index 396a76e1..2cd9ebf1 100644 --- a/lib/src/widgets/raw_editor/raw_editor_state_text_input_client_mixin.dart +++ b/lib/src/widgets/raw_editor/raw_editor_state_text_input_client_mixin.dart @@ -7,7 +7,7 @@ import 'package:flutter/services.dart'; import '../../models/documents/document.dart'; import '../../utils/delta.dart'; -import '../editor.dart'; +import '../editor/editor.dart'; mixin RawEditorStateTextInputClientMixin on EditorState implements TextInputClient { diff --git a/lib/src/widgets/text_block.dart b/lib/src/widgets/text_block.dart index fd265f45..f1aa5e96 100644 --- a/lib/src/widgets/text_block.dart +++ b/lib/src/widgets/text_block.dart @@ -11,7 +11,7 @@ import 'controller.dart'; import 'cursor.dart'; import 'default_styles.dart'; import 'delegate.dart'; -import 'editor.dart'; +import 'editor/editor.dart'; import 'link.dart'; import 'style_widgets/bullet_point.dart'; import 'style_widgets/checkbox_point.dart'; diff --git a/lib/src/widgets/text_selection.dart b/lib/src/widgets/text_selection.dart index 688505e2..c13f9952 100644 --- a/lib/src/widgets/text_selection.dart +++ b/lib/src/widgets/text_selection.dart @@ -7,7 +7,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import '../models/documents/nodes/node.dart'; -import 'editor.dart'; +import 'editor/editor.dart'; TextSelection localSelection(Node node, TextSelection selection, fromParent) { final base = fromParent ? node.offset : node.documentOffset; diff --git a/lib/src/widgets/toolbar/buttons/clear_format.dart b/lib/src/widgets/toolbar/buttons/clear_format.dart index 54c5a07d..7a1d5397 100644 --- a/lib/src/widgets/toolbar/buttons/clear_format.dart +++ b/lib/src/widgets/toolbar/buttons/clear_format.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import '../../../models/documents/attribute.dart'; import '../../../models/themes/quill_icon_theme.dart'; import '../../controller.dart'; -import '../../toolbar.dart'; +import '../toolbar.dart'; class ClearFormatButton extends StatefulWidget { const ClearFormatButton({ diff --git a/lib/src/widgets/toolbar/buttons/color.dart b/lib/src/widgets/toolbar/buttons/color.dart index 5222dbe4..8733c209 100644 --- a/lib/src/widgets/toolbar/buttons/color.dart +++ b/lib/src/widgets/toolbar/buttons/color.dart @@ -7,7 +7,7 @@ import '../../../models/themes/quill_icon_theme.dart'; import '../../../translations/toolbar.i18n.dart'; import '../../../utils/color.dart'; import '../../controller.dart'; -import '../../toolbar.dart'; +import '../toolbar.dart'; /// Controls color styles. /// diff --git a/lib/src/widgets/toolbar/buttons/custom_button.dart b/lib/src/widgets/toolbar/buttons/custom_button.dart index a226c000..99924f8b 100644 --- a/lib/src/widgets/toolbar/buttons/custom_button.dart +++ b/lib/src/widgets/toolbar/buttons/custom_button.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import '../../../models/themes/quill_icon_theme.dart'; -import '../../toolbar.dart'; +import '../toolbar.dart'; class CustomButton extends StatelessWidget { const CustomButton({ diff --git a/lib/src/widgets/toolbar/buttons/font_family.dart b/lib/src/widgets/toolbar/buttons/font_family.dart index 9bac7574..e2328868 100644 --- a/lib/src/widgets/toolbar/buttons/font_family.dart +++ b/lib/src/widgets/toolbar/buttons/font_family.dart @@ -27,8 +27,7 @@ class QuillToolbarFontFamilyButton extends StatefulWidget { class _QuillToolbarFontFamilyButtonState extends State { - late String _defaultDisplayText; - String _currentValue = ''; + var _currentValue = ''; QuillToolbarFontFamilyButtonOptions get options { return widget.options; @@ -59,7 +58,7 @@ class _QuillToolbarFontFamilyButtonState } await Future.delayed(Duration.zero); setState(() { - _currentValue = _defaultDisplayText = options.initialValue ?? 'Font'.i18n; + _currentValue = _defaultDisplayText; }); controller.addListener(_didChangeEditingValue); } @@ -76,14 +75,19 @@ class _QuillToolbarFontFamilyButtonState super.dispose(); } + String get _defaultDisplayText { + return options.initialValue ?? 'Font'.i18n; + } + @override void didUpdateWidget(covariant QuillToolbarFontFamilyButton oldWidget) { super.didUpdateWidget(oldWidget); - if (controller != controller) { - controller - ..removeListener(_didChangeEditingValue) - ..addListener(_didChangeEditingValue); + if (controller == controller) { + return; } + controller + ..removeListener(_didChangeEditingValue) + ..addListener(_didChangeEditingValue); } void _didChangeEditingValue() { @@ -222,7 +226,9 @@ class _QuillToolbarFontFamilyButtonState shape: popupMenuTheme.shape, color: popupMenuTheme.color, ); - if (!mounted) return; + if (!mounted) { + return; + } if (newValue == null) { return; } @@ -231,7 +237,10 @@ class _QuillToolbarFontFamilyButtonState _currentValue = keyName ?? _defaultDisplayText; if (keyName != null) { controller.formatSelection( - Attribute.fromKeyValue('font', newValue == 'Clear' ? null : newValue), + Attribute.fromKeyValue( + 'font', + newValue == 'Clear' ? null : newValue, + ), ); options.onSelected?.call(newValue); } diff --git a/lib/src/widgets/toolbar/buttons/history.dart b/lib/src/widgets/toolbar/buttons/history.dart index 7d9008e9..603d10d8 100644 --- a/lib/src/widgets/toolbar/buttons/history.dart +++ b/lib/src/widgets/toolbar/buttons/history.dart @@ -5,7 +5,7 @@ import '../../../../translations.dart'; import '../../../utils/extensions/build_context.dart'; import '../../../utils/extensions/quill_controller.dart'; import '../../controller.dart'; -import '../../toolbar.dart'; +import '../toolbar.dart'; class QuillToolbarHistoryButton extends StatefulWidget { const QuillToolbarHistoryButton({ diff --git a/lib/src/widgets/toolbar/buttons/indent.dart b/lib/src/widgets/toolbar/buttons/indent.dart index 83f15fb8..2297431a 100644 --- a/lib/src/widgets/toolbar/buttons/indent.dart +++ b/lib/src/widgets/toolbar/buttons/indent.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import '../../../models/themes/quill_icon_theme.dart'; import '../../controller.dart'; -import '../../toolbar.dart'; +import '../toolbar.dart'; class IndentButton extends StatefulWidget { const IndentButton({ diff --git a/lib/src/widgets/toolbar/buttons/link_style.dart b/lib/src/widgets/toolbar/buttons/link_style.dart index dd4f650c..bca23b58 100644 --- a/lib/src/widgets/toolbar/buttons/link_style.dart +++ b/lib/src/widgets/toolbar/buttons/link_style.dart @@ -8,7 +8,7 @@ import '../../../models/themes/quill_icon_theme.dart'; import '../../../translations/toolbar.i18n.dart'; import '../../controller.dart'; import '../../link.dart'; -import '../../toolbar.dart'; +import '../toolbar.dart'; class LinkStyleButton extends StatefulWidget { const LinkStyleButton({ diff --git a/lib/src/widgets/toolbar/buttons/link_style2.dart b/lib/src/widgets/toolbar/buttons/link_style2.dart index a3c9178f..2e21941a 100644 --- a/lib/src/widgets/toolbar/buttons/link_style2.dart +++ b/lib/src/widgets/toolbar/buttons/link_style2.dart @@ -10,7 +10,7 @@ import '../../../models/themes/quill_dialog_theme.dart'; import '../../../models/themes/quill_icon_theme.dart'; import '../../controller.dart'; import '../../link.dart'; -import '../../toolbar.dart'; +import '../toolbar.dart'; /// Alternative version of [LinkStyleButton]. This widget has more customization /// and uses dialog similar to one which is used on [http://quilljs.com]. diff --git a/lib/src/widgets/toolbar/buttons/quill_font_size.dart b/lib/src/widgets/toolbar/buttons/quill_font_size.dart index 57491a68..5230005b 100644 --- a/lib/src/widgets/toolbar/buttons/quill_font_size.dart +++ b/lib/src/widgets/toolbar/buttons/quill_font_size.dart @@ -8,8 +8,8 @@ import '../../../utils/font.dart'; import '../../../utils/widgets.dart'; import '../../controller.dart'; -class QuillFontSizeButton extends StatefulWidget { - const QuillFontSizeButton({ +class QuillToolbarFontSizeButton extends StatefulWidget { + const QuillToolbarFontSizeButton({ required this.rawItemsMap, required this.attribute, required this.controller, @@ -58,10 +58,12 @@ class QuillFontSizeButton extends StatefulWidget { final Color? defaultItemColor; @override - _QuillFontSizeButtonState createState() => _QuillFontSizeButtonState(); + _QuillToolbarFontSizeButtonState createState() => + _QuillToolbarFontSizeButtonState(); } -class _QuillFontSizeButtonState extends State { +class _QuillToolbarFontSizeButtonState + extends State { late String _defaultDisplayText; late String _currentValue; Style get _selectionStyle => widget.controller.getSelectionStyle(); @@ -80,7 +82,7 @@ class _QuillFontSizeButtonState extends State { } @override - void didUpdateWidget(covariant QuillFontSizeButton oldWidget) { + void didUpdateWidget(covariant QuillToolbarFontSizeButton oldWidget) { super.didUpdateWidget(oldWidget); if (oldWidget.controller != widget.controller) { oldWidget.controller.removeListener(_didChangeEditingValue); @@ -119,8 +121,9 @@ class _QuillFontSizeButtonState extends State { child: RawMaterialButton( visualDensity: VisualDensity.compact, shape: RoundedRectangleBorder( - borderRadius: - BorderRadius.circular(widget.iconTheme?.borderRadius ?? 2)), + borderRadius: + BorderRadius.circular(widget.iconTheme?.borderRadius ?? 2), + ), fillColor: widget.fillColor, elevation: 0, hoverElevation: widget.hoverElevation, @@ -135,7 +138,7 @@ class _QuillFontSizeButtonState extends State { ); } - void _showMenu() { + Future _showMenu() async { final popupMenuTheme = PopupMenuTheme.of(context); final button = context.findRenderObject() as RenderBox; final overlay = Overlay.of(context).context.findRenderObject() as RenderBox; @@ -147,7 +150,7 @@ class _QuillFontSizeButtonState extends State { ), Offset.zero & overlay.size, ); - showMenu( + final newValue = await showMenu( context: context, elevation: 4, items: [ @@ -169,20 +172,19 @@ class _QuillFontSizeButtonState extends State { position: position, shape: popupMenuTheme.shape, color: popupMenuTheme.color, - ).then((newValue) { - if (!mounted) return; - if (newValue == null) { - return; + ); + if (!mounted) return; + if (newValue == null) { + return; + } + final keyName = _getKeyName(newValue); + setState(() { + _currentValue = keyName ?? _defaultDisplayText; + if (keyName != null) { + widget.controller.formatSelection(Attribute.fromKeyValue( + 'size', newValue == '0' ? null : getFontSize(newValue))); + widget.onSelected?.call(newValue); } - final keyName = _getKeyName(newValue); - setState(() { - _currentValue = keyName ?? _defaultDisplayText; - if (keyName != null) { - widget.controller.formatSelection(Attribute.fromKeyValue( - 'size', newValue == '0' ? null : getFontSize(newValue))); - widget.onSelected?.call(newValue); - } - }); }); } @@ -198,19 +200,24 @@ class _QuillFontSizeButtonState extends State { UtilityWidgets.maybeWidget( enabled: hasFinalWidth, wrapper: (child) => Expanded(child: child), - child: Text(_currentValue, - overflow: widget.labelOverflow, - style: widget.style ?? - TextStyle( - fontSize: widget.iconSize / 1.15, - color: widget.iconTheme?.iconUnselectedColor ?? - theme.iconTheme.color)), + child: Text( + _currentValue, + overflow: widget.labelOverflow, + style: widget.style ?? + TextStyle( + fontSize: widget.iconSize / 1.15, + color: widget.iconTheme?.iconUnselectedColor ?? + theme.iconTheme.color, + ), + ), ), const SizedBox(width: 3), - Icon(Icons.arrow_drop_down, - size: widget.iconSize / 1.15, - color: widget.iconTheme?.iconUnselectedColor ?? - theme.iconTheme.color) + Icon( + Icons.arrow_drop_down, + size: widget.iconSize / 1.15, + color: + widget.iconTheme?.iconUnselectedColor ?? theme.iconTheme.color, + ) ], ), ); diff --git a/lib/src/widgets/toolbar/buttons/search.dart b/lib/src/widgets/toolbar/buttons/search.dart index eec9c429..6245de78 100644 --- a/lib/src/widgets/toolbar/buttons/search.dart +++ b/lib/src/widgets/toolbar/buttons/search.dart @@ -3,8 +3,8 @@ import 'package:flutter/material.dart'; import '../../../models/themes/quill_dialog_theme.dart'; import '../../../models/themes/quill_icon_theme.dart'; import '../../controller.dart'; -import '../../toolbar.dart'; import '../search_dialog.dart'; +import '../toolbar.dart'; class SearchButton extends StatelessWidget { const SearchButton({ diff --git a/lib/src/widgets/toolbar/buttons/select_alignment.dart b/lib/src/widgets/toolbar/buttons/select_alignment.dart index 87d40be0..6957ce66 100644 --- a/lib/src/widgets/toolbar/buttons/select_alignment.dart +++ b/lib/src/widgets/toolbar/buttons/select_alignment.dart @@ -6,8 +6,8 @@ import '../../../models/documents/style.dart'; import '../../../models/themes/quill_icon_theme.dart'; import '../../../utils/widgets.dart'; import '../../controller.dart'; -import '../../toolbar.dart'; import '../enum.dart'; +import '../toolbar.dart'; class SelectAlignmentButton extends StatefulWidget { const SelectAlignmentButton({ diff --git a/lib/src/widgets/toolbar/buttons/select_header_style.dart b/lib/src/widgets/toolbar/buttons/select_header_style.dart index cacda410..cde2cb3f 100644 --- a/lib/src/widgets/toolbar/buttons/select_header_style.dart +++ b/lib/src/widgets/toolbar/buttons/select_header_style.dart @@ -6,7 +6,7 @@ import '../../../models/documents/style.dart'; import '../../../models/themes/quill_icon_theme.dart'; import '../../../utils/widgets.dart'; import '../../controller.dart'; -import '../../toolbar.dart'; +import '../toolbar.dart'; class SelectHeaderStyleButton extends StatefulWidget { const SelectHeaderStyleButton({ diff --git a/lib/src/widgets/toolbar/buttons/toggle_check_list.dart b/lib/src/widgets/toolbar/buttons/toggle_check_list.dart index 628c7535..fa5c1452 100644 --- a/lib/src/widgets/toolbar/buttons/toggle_check_list.dart +++ b/lib/src/widgets/toolbar/buttons/toggle_check_list.dart @@ -5,7 +5,7 @@ import '../../../models/documents/style.dart'; import '../../../models/themes/quill_icon_theme.dart'; import '../../../utils/widgets.dart'; import '../../controller.dart'; -import '../../toolbar.dart'; +import '../toolbar.dart'; class ToggleCheckListButton extends StatefulWidget { const ToggleCheckListButton({ diff --git a/lib/src/widgets/toolbar/buttons/toggle_style.dart b/lib/src/widgets/toolbar/buttons/toggle_style.dart index 5c16ca41..e85ac6d1 100644 --- a/lib/src/widgets/toolbar/buttons/toggle_style.dart +++ b/lib/src/widgets/toolbar/buttons/toggle_style.dart @@ -5,7 +5,7 @@ import '../../../models/documents/style.dart'; import '../../../models/themes/quill_icon_theme.dart'; import '../../../utils/widgets.dart'; import '../../controller.dart'; -import '../../toolbar.dart'; +import '../toolbar.dart'; typedef ToggleStyleButtonBuilder = Widget Function( BuildContext context, diff --git a/lib/src/widgets/toolbar.dart b/lib/src/widgets/toolbar/toolbar.dart similarity index 90% rename from lib/src/widgets/toolbar.dart rename to lib/src/widgets/toolbar/toolbar.dart index 12c2f0cd..c269813a 100644 --- a/lib/src/widgets/toolbar.dart +++ b/lib/src/widgets/toolbar/toolbar.dart @@ -1,28 +1,28 @@ import 'package:flutter/material.dart'; import 'package:i18n_extension/i18n_widget.dart'; -import '../../flutter_quill.dart'; -import '../translations/toolbar.i18n.dart'; -import '../utils/extensions/build_context.dart'; -import 'toolbar/buttons/arrow_indicated_list.dart'; - -export '../models/config/toolbar/buttons/base.dart'; -export '../models/config/toolbar/configurations.dart'; -export 'toolbar/buttons/clear_format.dart'; -export 'toolbar/buttons/color.dart'; -export 'toolbar/buttons/custom_button.dart'; -export 'toolbar/buttons/font_family.dart'; -export 'toolbar/buttons/history.dart'; -export 'toolbar/buttons/indent.dart'; -export 'toolbar/buttons/link_style.dart'; -export 'toolbar/buttons/link_style2.dart'; -export 'toolbar/buttons/quill_font_size.dart'; -export 'toolbar/buttons/quill_icon.dart'; -export 'toolbar/buttons/search.dart'; -export 'toolbar/buttons/select_alignment.dart'; -export 'toolbar/buttons/select_header_style.dart'; -export 'toolbar/buttons/toggle_check_list.dart'; -export 'toolbar/buttons/toggle_style.dart'; +import '../../../flutter_quill.dart'; +import '../../translations/toolbar.i18n.dart'; +import '../../utils/extensions/build_context.dart'; +import 'buttons/arrow_indicated_list.dart'; + +export '../../models/config/toolbar/buttons/base.dart'; +export '../../models/config/toolbar/configurations.dart'; +export 'buttons/clear_format.dart'; +export 'buttons/color.dart'; +export 'buttons/custom_button.dart'; +export 'buttons/font_family.dart'; +export 'buttons/history.dart'; +export 'buttons/indent.dart'; +export 'buttons/link_style.dart'; +export 'buttons/link_style2.dart'; +export 'buttons/quill_font_size.dart'; +export 'buttons/quill_icon.dart'; +export 'buttons/search.dart'; +export 'buttons/select_alignment.dart'; +export 'buttons/select_header_style.dart'; +export 'buttons/toggle_check_list.dart'; +export 'buttons/toggle_style.dart'; typedef QuillToolbarChildrenBuilder = List Function( BuildContext context, @@ -220,54 +220,24 @@ class QuillToolbar extends StatelessWidget implements PreferredSizeWidget { final toolbarConfigurations = context.requireQuillToolbarConfigurations; - final toolbarIconSize = toolbarConfigurations - .buttonOptions.baseButtonOptions.globalIconSize; + final toolbarIconSize = + toolbarConfigurations.buttonOptions.base.globalIconSize; return [ if (showUndo) QuillToolbarHistoryButton( - options: - toolbarConfigurations.buttonOptions.undoHistoryButtonOptions, + options: toolbarConfigurations.buttonOptions.undoHistory, ), - // QuillToolbarHistoryButton( - // icon: Icons.undo_outlined, - // iconSize: toolbarIconSize, - // tooltip: buttonTooltips[ToolbarButtons.undo], - // controller: controller, - // undo: true, - // iconTheme: iconTheme, - // afterButtonPressed: afterButtonPressed, - // ), if (showRedo) QuillToolbarHistoryButton( - options: - toolbarConfigurations.buttonOptions.redoHistoryButtonOptions, + options: toolbarConfigurations.buttonOptions.redoHistory, ), - // QuillToolbarHistoryButton( - // icon: Icons.redo_outlined, - // iconSize: toolbarIconSize, - // tooltip: buttonTooltips[ToolbarButtons.redo], - // controller: controller, - // undo: false, - // iconTheme: iconTheme, - // afterButtonPressed: afterButtonPressed, - // ), if (showFontFamily) QuillToolbarFontFamilyButton( - options: - toolbarConfigurations.buttonOptions.fontFamilyButtonOptions, + options: toolbarConfigurations.buttonOptions.fontFamily, ), - // QuillFontFamilyButton( - // iconTheme: iconTheme, - // iconSize: toolbarIconSize, - // tooltip: buttonTooltips[ToolbarButtons.fontFamily], - // attribute: Attribute.font, - // controller: controller, - // rawItemsMap: {}, - // afterButtonPressed: afterButtonPressed, - // ), if (showFontSize) - QuillFontSizeButton( + QuillToolbarFontSizeButton( iconTheme: iconTheme, iconSize: toolbarIconSize, tooltip: buttonTooltips[ToolbarButtons.fontSize], diff --git a/lib/src/widgets/utils/provider.dart b/lib/src/widgets/utils/provider.dart index 9e71e1ad..55553cc2 100644 --- a/lib/src/widgets/utils/provider.dart +++ b/lib/src/widgets/utils/provider.dart @@ -18,7 +18,7 @@ class QuillProvider extends InheritedWidget { @override bool updateShouldNotify(covariant QuillProvider oldWidget) { - throw true; + return oldWidget.configurations != configurations; } static QuillProvider? of(BuildContext context) { diff --git a/pubspec.yaml b/pubspec.yaml index 98158560..f1b1a4d5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_quill description: A rich text editor built for the modern Android, iOS, web and desktop platforms. It is the WYSIWYG editor and a Quill component for Flutter. -version: 7.6.0 +version: 7.6.1 homepage: https://1o24bbs.com/c/bulletjournal/108 repository: https://github.com/singerdmx/flutter-quill platforms: