From 55f5101ccceaeb456fdc44e0f5c4ba6e7731b94b Mon Sep 17 00:00:00 2001 From: Ahmed Hnewa <73608287+freshtechtips@users.noreply.github.com> Date: Sun, 22 Oct 2023 02:19:09 +0300 Subject: [PATCH] Fixes for step 2 update (#1449) * Improve main workflow * Fixes * Bug fixes * Edit toolbar configurations * Fix conflicts * Bug fixes --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- .github/workflows/main.yml | 27 ++++-- CHANGELOG.md | 4 + before-push.sh | 4 + example/ios/Runner.xcodeproj/project.pbxproj | 3 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- .../lib/embeds/builders.dart | 2 +- .../lib/embeds/toolbar/camera_button.dart | 2 +- .../lib/embeds/toolbar/image_video_utils.dart | 2 +- .../lib/embeds/toolbar/media_button.dart | 2 +- lib/flutter_quill.dart | 4 +- .../models/config/editor/configurations.dart | 9 +- .../models/config/quill_configurations.dart | 10 ++- .../models/config/shared_configurations.dart | 9 +- .../models/config/toolbar/buttons/base.dart | 14 ++- .../config/toolbar/buttons/font_family.dart | 2 +- .../config/toolbar/buttons/font_size.dart | 68 +++++++++++++++ .../models/config/toolbar/configurations.dart | 48 +++++++---- lib/src/test/widget_tester_extension.dart | 2 +- lib/src/utils/extensions/build_context.dart | 4 +- lib/src/widgets/delegate.dart | 2 +- lib/src/widgets/{ => editor}/editor.dart | 22 ++--- lib/src/widgets/raw_editor/raw_editor.dart | 2 +- ...editor_state_selection_delegate_mixin.dart | 2 +- ..._editor_state_text_input_client_mixin.dart | 2 +- lib/src/widgets/text_block.dart | 2 +- lib/src/widgets/text_selection.dart | 2 +- .../widgets/toolbar/buttons/clear_format.dart | 2 +- lib/src/widgets/toolbar/buttons/color.dart | 2 +- .../toolbar/buttons/custom_button.dart | 2 +- .../widgets/toolbar/buttons/font_family.dart | 27 ++++-- lib/src/widgets/toolbar/buttons/history.dart | 2 +- lib/src/widgets/toolbar/buttons/indent.dart | 2 +- .../widgets/toolbar/buttons/link_style.dart | 2 +- .../widgets/toolbar/buttons/link_style2.dart | 2 +- .../toolbar/buttons/quill_font_size.dart | 73 +++++++++------- lib/src/widgets/toolbar/buttons/search.dart | 2 +- .../toolbar/buttons/select_alignment.dart | 2 +- .../toolbar/buttons/select_header_style.dart | 2 +- .../toolbar/buttons/toggle_check_list.dart | 2 +- .../widgets/toolbar/buttons/toggle_style.dart | 2 +- lib/src/widgets/{ => toolbar}/toolbar.dart | 86 ++++++------------- lib/src/widgets/utils/provider.dart | 4 +- pubspec.yaml | 3 +- 44 files changed, 301 insertions(+), 170 deletions(-) create mode 100644 lib/src/models/config/toolbar/buttons/font_size.dart rename lib/src/widgets/{ => editor}/editor.dart (99%) rename lib/src/widgets/{ => toolbar}/toolbar.dart (90%) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 905e0064..c4810500 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -43,4 +43,4 @@ Closes #IssueNumber - [ ] I have run `dart format .`` on the project - [ ] I have run `dart fix --apply` on the project - [ ] I have run `flutter test` and `flutter analyze` and it passed successfully -- [ ] I have run `./before-push.sh` and everything is fine diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c9262307..c5314cc0 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -15,9 +15,24 @@ jobs: - uses: subosito/flutter-action@v2 with: channel: 'stable' - - run: flutter --version - - run: flutter pub get - - run: flutter pub get -C flutter_quill_extensions - - run: flutter analyze - - run: flutter test - - run: flutter pub publish --dry-run + + - name: Check flutter version + run: flutter --version + + - name: Install dependencies + run: flutter pub get + + - name: Install flutter_quill_extensions dependencies + run: flutter pub get -C flutter_quill_extensions + + - name: Run flutter analysis + run: flutter analyze + + - name: Check dart code formatting + run: dart format --set-exit-if-changed . + + - name: Check if package is ready for publishing + run: flutter pub publish --dry-run + + - name: Run flutter tests + run: flutter test 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/before-push.sh b/before-push.sh index 3f836d4a..3c163f6a 100755 --- a/before-push.sh +++ b/before-push.sh @@ -20,4 +20,8 @@ dart fix --apply echo "Running 'dart format .'" dart format . +# Check dart code formatting +echo "Running `dart format --set-exit-if-changed .`" +dart format --set-exit-if-changed . + echo "Script completed." diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj index 3d83c0c2..01a3496a 100644 --- a/example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -167,7 +167,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1300; + LastUpgradeCheck = 1430; ORGANIZATIONNAME = ""; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -215,6 +215,7 @@ files = ( ); inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); name = "Thin Binary"; outputPaths = ( diff --git a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 3db53b6e..b52b2e69 100644 --- a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ get props => [ + placeholder, + readOnly, + ]; } diff --git a/lib/src/models/config/quill_configurations.dart b/lib/src/models/config/quill_configurations.dart index 25313dbf..e37a9fad 100644 --- a/lib/src/models/config/quill_configurations.dart +++ b/lib/src/models/config/quill_configurations.dart @@ -1,3 +1,4 @@ +import 'package:equatable/equatable.dart'; import 'package:flutter/foundation.dart' show immutable; import '../../../flutter_quill.dart'; @@ -7,7 +8,7 @@ export './shared_configurations.dart'; export './toolbar/configurations.dart'; @immutable -class QuillConfigurations { +class QuillConfigurations extends Equatable { const QuillConfigurations({ required this.controller, this.editorConfigurations = const QuillEditorConfigurations(), @@ -32,4 +33,11 @@ class QuillConfigurations { /// The shared configurations between [QuillEditorConfigurations] and /// [QuillToolbarConfigurations] so we don't duplicate things final QuillSharedConfigurations sharedConfigurations; + + @override + List get props => [ + editorConfigurations, + toolbarConfigurations, + sharedConfigurations, + ]; } diff --git a/lib/src/models/config/shared_configurations.dart b/lib/src/models/config/shared_configurations.dart index 434677a0..8c1a9449 100644 --- a/lib/src/models/config/shared_configurations.dart +++ b/lib/src/models/config/shared_configurations.dart @@ -1,10 +1,11 @@ +import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart' show Color, Colors, Locale; import './editor/configurations.dart' show QuillEditorConfigurations; import './toolbar/configurations.dart' show QuillToolbarConfigurations; /// The shared configurations between [QuillEditorConfigurations] and /// [QuillToolbarConfigurations] so we don't duplicate things -class QuillSharedConfigurations { +class QuillSharedConfigurations extends Equatable { const QuillSharedConfigurations({ this.dialogBarrierColor = Colors.black54, this.locale, @@ -18,4 +19,10 @@ class QuillSharedConfigurations { /// The locale to use for the editor and toolbar, defaults to system locale /// More https://github.com/singerdmx/flutter-quill#translation final Locale? locale; + + @override + List get props => [ + dialogBarrierColor, + locale, + ]; } 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 babdb56d..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({ - required this.attribute, + 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 6a8193bb..b28b437d 100644 --- a/lib/src/models/config/toolbar/configurations.dart +++ b/lib/src/models/config/toolbar/configurations.dart @@ -1,11 +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'; @@ -23,7 +26,7 @@ const double kToolbarSectionSpacing = 4; /// The configurations for the toolbar widget of flutter quill @immutable -class QuillToolbarConfigurations { +class QuillToolbarConfigurations extends Equatable { const QuillToolbarConfigurations({ this.buttonOptions = const QuillToolbarButtonOptions(), this.multiRowsDisplay = true, @@ -44,7 +47,7 @@ class QuillToolbarConfigurations { 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 @@ -67,27 +70,42 @@ class QuillToolbarConfigurations { /// }; /// ``` final Map? fontFamilyValues; + + @override + List get props => [ + buttonOptions, + multiRowsDisplay, + fontFamilyValues, + toolbarSize, + ]; } /// 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( - attribute: Attribute.font, - ), + 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 0cfcc926..55553cc2 100644 --- a/lib/src/widgets/utils/provider.dart +++ b/lib/src/widgets/utils/provider.dart @@ -17,8 +17,8 @@ class QuillProvider extends InheritedWidget { final QuillConfigurations configurations; @override - bool updateShouldNotify(covariant InheritedWidget oldWidget) { - return true; + bool updateShouldNotify(covariant QuillProvider oldWidget) { + return oldWidget.configurations != configurations; } static QuillProvider? of(BuildContext context) { diff --git a/pubspec.yaml b/pubspec.yaml index 276a8160..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: @@ -30,6 +30,7 @@ dependencies: device_info_plus: ^9.1.0 platform: ^3.1.3 pasteboard: ^0.2.0 + equatable: ^2.0.5 flutter_test: sdk: flutter