diff --git a/CHANGELOG.md b/CHANGELOG.md index 7132f0725..849261e54 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ All notable changes to this project will be documented in this file. +## 9.0.0-dev-4 +* The options parameter in all of the buttons is no longer required which can be useful to create custom toolbar with minimal efforts +* Toolbar buttons fixes in both `flutter_quill` and `flutter_quill_extensions` + ## 9.0.0-dev-3 * Breaking Changes: * Rename `QuillToolbar` to `QuillSimpleToolbar` diff --git a/example/lib/presentation/quill/quill_screen.dart b/example/lib/presentation/quill/quill_screen.dart index 0fc392fc4..7f34cc305 100644 --- a/example/lib/presentation/quill/quill_screen.dart +++ b/example/lib/presentation/quill/quill_screen.dart @@ -3,7 +3,7 @@ import 'dart:convert' show jsonEncode; import 'package:flutter/material.dart'; import 'package:flutter_quill/flutter_quill.dart'; import 'package:flutter_quill_extensions/flutter_quill_extensions.dart' - show FlutterQuillEmbeds; + show FlutterQuillEmbeds, QuillSharedExtensionsConfigurations; import 'package:quill_html_converter/quill_html_converter.dart'; import 'package:share_plus/share_plus.dart' show Share; @@ -106,12 +106,14 @@ class _QuillScreenState extends State { MyQuillToolbar( controller: _controller, focusNode: _editorFocusNode, + sharedConfigurations: _sharedConfigurations, ), Builder( builder: (context) { return Expanded( child: MyQuillEditor( configurations: QuillEditorConfigurations( + sharedConfigurations: _sharedConfigurations, controller: _controller, readOnly: _isReadOnly, ), @@ -129,4 +131,15 @@ class _QuillScreenState extends State { ), ); } + + QuillSharedConfigurations get _sharedConfigurations { + return const QuillSharedConfigurations( + extraConfigurations: { + QuillSharedExtensionsConfigurations.key: + QuillSharedExtensionsConfigurations( + assetsPrefix: 'your-assets-folder-name', // Defaults to assets + ), + }, + ); + } } diff --git a/example/lib/presentation/quill/quill_toolbar.dart b/example/lib/presentation/quill/quill_toolbar.dart index 79c38ce1f..4c0f3124d 100644 --- a/example/lib/presentation/quill/quill_toolbar.dart +++ b/example/lib/presentation/quill/quill_toolbar.dart @@ -17,11 +17,14 @@ class MyQuillToolbar extends StatelessWidget { const MyQuillToolbar({ required this.controller, required this.focusNode, + required this.sharedConfigurations, super.key, }); final QuillController controller; final FocusNode focusNode; + // TODO: Use it + final QuillSharedConfigurations sharedConfigurations; Future onImageInsertWithCropping( String image, @@ -101,132 +104,103 @@ class MyQuillToolbar extends StatelessWidget { // https://github.com/singerdmx/flutter-quill/blob/master/doc/custom_toolbar.md return QuillToolbar( configurations: QuillToolbarConfigurations( - toolbarSize: 15 * 2, + toolbarSize: 20 * 2, multiRowsDisplay: false, buttonOptions: const QuillToolbarButtonOptions( base: QuillToolbarBaseButtonOptions( globalIconSize: 20, + globalIconButtonFactor: 1.4, ), ), childrenBuilder: (context) { return [ IconButton( - onPressed: () { - context.read().updateSettings( - state.copyWith(useCustomQuillToolbar: false)); - }, + onPressed: () => context + .read() + .updateSettings( + state.copyWith(useCustomQuillToolbar: false)), icon: const Icon( Icons.width_normal, - size: 16, ), ), - QuillToolbarImageButton( - controller: controller, - options: const QuillToolbarImageButtonOptions(), - ), QuillToolbarHistoryButton( + isUndo: true, controller: controller, - options: - const QuillToolbarHistoryButtonOptions(isUndo: true), ), QuillToolbarHistoryButton( + isUndo: false, controller: controller, - options: - const QuillToolbarHistoryButtonOptions(isUndo: false), ), QuillToolbarToggleStyleButton( - attribute: Attribute.bold, + options: const QuillToolbarToggleStyleButtonOptions(), controller: controller, - options: QuillToolbarToggleStyleButtonOptions( - childBuilder: (options, extraOptions) { - if (extraOptions.isToggled) { - return IconButton.filled( - onPressed: extraOptions.onPressed, - icon: Icon(options.iconData), - ); - } - return IconButton( - onPressed: extraOptions.onPressed, - icon: Icon(options.iconData), - ); - }, - ), + attribute: Attribute.bold, ), QuillToolbarToggleStyleButton( - attribute: Attribute.italic, + options: const QuillToolbarToggleStyleButtonOptions(), controller: controller, - options: const QuillToolbarToggleStyleButtonOptions( - iconData: Icons.format_italic, - ), + attribute: Attribute.italic, ), QuillToolbarToggleStyleButton( - attribute: Attribute.underline, controller: controller, - options: const QuillToolbarToggleStyleButtonOptions( - iconData: Icons.format_underline, - iconSize: 20, - ), + attribute: Attribute.underline, ), QuillToolbarClearFormatButton( controller: controller, - options: const QuillToolbarClearFormatButtonOptions( - iconData: Icons.format_clear, - ), ), - VerticalDivider( - indent: 12, - endIndent: 12, - color: Colors.grey.shade400, + const VerticalDivider(), + QuillToolbarImageButton( + controller: controller, ), - QuillToolbarSelectHeaderStyleButtons( + QuillToolbarCameraButton( + controller: controller, + ), + QuillToolbarVideoButton( + controller: controller, + ), + const VerticalDivider(), + QuillToolbarColorButton( + controller: controller, + isBackground: false, + ), + QuillToolbarColorButton( + controller: controller, + isBackground: true, + ), + const VerticalDivider(), + QuillToolbarSelectHeaderStyleButton( + controller: controller, + ), + const VerticalDivider(), + QuillToolbarToggleCheckListButton( controller: controller, - options: const QuillToolbarSelectHeaderStyleButtonsOptions( - iconSize: 20, - ), ), QuillToolbarToggleStyleButton( - attribute: Attribute.ol, controller: controller, - options: const QuillToolbarToggleStyleButtonOptions( - iconData: Icons.format_list_numbered, - iconSize: 39, - ), + attribute: Attribute.list, ), QuillToolbarToggleStyleButton( - attribute: Attribute.ul, controller: controller, - options: const QuillToolbarToggleStyleButtonOptions( - iconData: Icons.format_list_bulleted, - ), + attribute: Attribute.ul, ), QuillToolbarToggleStyleButton( - attribute: Attribute.blockQuote, controller: controller, - options: const QuillToolbarToggleStyleButtonOptions( - iconData: Icons.format_quote, - iconSize: 15, - ), + attribute: Attribute.inlineCode, ), - VerticalDivider( - indent: 12, - endIndent: 12, - color: Colors.grey.shade400, + QuillToolbarToggleStyleButton( + controller: controller, + attribute: Attribute.blockQuote, ), QuillToolbarIndentButton( - controller: controller, - isIncrease: true, - options: const QuillToolbarIndentButtonOptions( - iconData: Icons.format_indent_increase, - iconSize: 20, - )), + controller: controller, + isIncrease: true, + ), QuillToolbarIndentButton( controller: controller, isIncrease: false, - options: const QuillToolbarIndentButtonOptions( - iconData: Icons.format_indent_decrease, - iconSize: 20, - ), ), + const VerticalDivider(), + QuillToolbarLinkStyleButton(controller: controller), ]; }, ), diff --git a/example/lib/presentation/simple/simple_screen.dart b/example/lib/presentation/simple/simple_screen.dart new file mode 100644 index 000000000..0393fcf7c --- /dev/null +++ b/example/lib/presentation/simple/simple_screen.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_quill/flutter_quill.dart'; + +class SimpleScreen extends StatefulWidget { + const SimpleScreen({super.key}); + + @override + State createState() => _SimpleScreenState(); +} + +class _SimpleScreenState extends State { + final _controller = QuillController.basic(); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(), + body: Column( + children: [ + QuillToolbar.simple( + QuillSimpleToolbarConfigurations(controller: _controller), + ), + Expanded( + child: QuillEditor.basic( + configurations: QuillEditorConfigurations( + controller: _controller, + padding: const EdgeInsets.all(16), + ), + ), + ), + ], + ), + ); + } +} diff --git a/flutter_quill_extensions/lib/embeds/formula/toolbar/formula_button.dart b/flutter_quill_extensions/lib/embeds/formula/toolbar/formula_button.dart index 3be5075c1..84dfdb367 100644 --- a/flutter_quill_extensions/lib/embeds/formula/toolbar/formula_button.dart +++ b/flutter_quill_extensions/lib/embeds/formula/toolbar/formula_button.dart @@ -6,7 +6,7 @@ import '../../../models/config/toolbar/buttons/formula.dart'; class QuillToolbarFormulaButton extends StatelessWidget { const QuillToolbarFormulaButton({ required this.controller, - required this.options, + this.options = const QuillToolbarFormulaButtonOptions(), super.key, }); @@ -91,7 +91,7 @@ class QuillToolbarFormulaButton extends StatelessWidget { } return QuillToolbarIconButton( - icon: Icon(iconData, size: iconSize * 1.77, color: iconColor), + icon: Icon(iconData, size: iconSize * iconButtonFactor, color: iconColor), tooltip: tooltip, onPressed: () => _sharedOnPressed(context), isFilled: false, diff --git a/flutter_quill_extensions/lib/embeds/image/toolbar/image_button.dart b/flutter_quill_extensions/lib/embeds/image/toolbar/image_button.dart index 362b6ce8f..f943dabd4 100644 --- a/flutter_quill_extensions/lib/embeds/image/toolbar/image_button.dart +++ b/flutter_quill_extensions/lib/embeds/image/toolbar/image_button.dart @@ -14,7 +14,7 @@ import 'select_image_source.dart'; class QuillToolbarImageButton extends StatelessWidget { const QuillToolbarImageButton({ required this.controller, - required this.options, + this.options = const QuillToolbarImageButtonOptions(), super.key, }); @@ -105,7 +105,7 @@ class QuillToolbarImageButton extends StatelessWidget { return QuillToolbarIconButton( icon: Icon( iconData, - size: iconSize * 1.77, + size: iconButtonFactor * iconSize, color: iconColor, ), tooltip: tooltip, diff --git a/flutter_quill_extensions/lib/embeds/others/camera_button/camera_button.dart b/flutter_quill_extensions/lib/embeds/others/camera_button/camera_button.dart index 4f7582037..70ef09907 100644 --- a/flutter_quill_extensions/lib/embeds/others/camera_button/camera_button.dart +++ b/flutter_quill_extensions/lib/embeds/others/camera_button/camera_button.dart @@ -3,7 +3,7 @@ import 'package:flutter_quill/flutter_quill.dart' show QuillController, QuillIconTheme, - QuillProviderExt, + QuillSimpleToolbarExt, QuillToolbarBaseButtonOptions, QuillToolbarIconButton; import 'package:flutter_quill/translations.dart'; @@ -17,7 +17,7 @@ import 'select_camera_action.dart'; class QuillToolbarCameraButton extends StatelessWidget { const QuillToolbarCameraButton({ required this.controller, - required this.options, + this.options = const QuillToolbarCameraButtonOptions(), super.key, }); @@ -30,6 +30,13 @@ class QuillToolbarCameraButton extends StatelessWidget { return iconSize ?? baseFontSize; } + double _iconButtonFactor(BuildContext context) { + final baseIconFactor = + baseButtonExtraOptions(context).globalIconButtonFactor; + final iconButtonFactor = options.iconButtonFactor; + return iconButtonFactor ?? baseIconFactor; + } + VoidCallback? _afterButtonPressed(BuildContext context) { return options.afterButtonPressed ?? baseButtonExtraOptions(context).afterButtonPressed; @@ -69,6 +76,7 @@ class QuillToolbarCameraButton extends StatelessWidget { final tooltip = _tooltip(context); final iconSize = _iconSize(context); final iconData = _iconData(context); + final iconButtonFactor = _iconButtonFactor(context); final childBuilder = options.childBuilder ?? baseButtonExtraOptions(context).childBuilder; @@ -80,7 +88,7 @@ class QuillToolbarCameraButton extends StatelessWidget { iconData: options.iconData, fillColor: options.fillColor, iconSize: options.iconSize, - iconButtonFactor: options.iconButtonFactor, + iconButtonFactor: iconButtonFactor, iconTheme: options.iconTheme, tooltip: options.tooltip, cameraConfigurations: options.cameraConfigurations, @@ -98,7 +106,7 @@ class QuillToolbarCameraButton extends StatelessWidget { final iconColor = iconTheme?.iconUnselectedColor ?? theme.iconTheme.color; return QuillToolbarIconButton( - icon: Icon(iconData, size: iconSize * 1.77, color: iconColor), + icon: Icon(iconData, size: iconButtonFactor * iconSize, color: iconColor), tooltip: tooltip, isFilled: false, // isDesktop(supportWeb: false) ? null : @@ -114,7 +122,8 @@ class QuillToolbarCameraButton extends StatelessWidget { } final cameraAction = await showDialog( context: context, - builder: (ctx) => const SelectCameraActionDialog(), + builder: (ctx) => const FlutterQuillLocalizationsWidget( + child: SelectCameraActionDialog()), ); return cameraAction; diff --git a/flutter_quill_extensions/lib/embeds/others/media_button/media_button.dart b/flutter_quill_extensions/lib/embeds/others/media_button/media_button.dart index 5246e8381..132c7bcd0 100644 --- a/flutter_quill_extensions/lib/embeds/others/media_button/media_button.dart +++ b/flutter_quill_extensions/lib/embeds/others/media_button/media_button.dart @@ -20,7 +20,7 @@ // class QuillToolbarMediaButton extends StatelessWidget { // QuillToolbarMediaButton({ // required this.controller, -// required this.options, +// this.options, // super.key, // }) : assert(options.type == QuillMediaType.image, // 'Video selection is not supported yet'); @@ -135,7 +135,7 @@ // tooltip: tooltip, // highlightElevation: 0, // hoverElevation: 0, -// size: iconSize * 1.77, +// size: iconSize * iconButtonFactor, // fillColor: iconFillColor, // borderRadius: iconTheme?.borderRadius ?? 2, // onPressed: () => _sharedOnPressed(context), diff --git a/flutter_quill_extensions/lib/embeds/video/toolbar/select_video_source.dart b/flutter_quill_extensions/lib/embeds/video/toolbar/select_video_source.dart index f4c030c9f..d8ddb7747 100644 --- a/flutter_quill_extensions/lib/embeds/video/toolbar/select_video_source.dart +++ b/flutter_quill_extensions/lib/embeds/video/toolbar/select_video_source.dart @@ -52,7 +52,8 @@ Future showSelectVideoSourceDialog({ showDragHandle: true, context: context, constraints: const BoxConstraints(maxWidth: 640), - builder: (context) => const SelectVideoSourceDialog(), + builder: (context) => + const FlutterQuillLocalizationsWidget(child: SelectVideoSourceDialog()), ); return imageSource; } diff --git a/flutter_quill_extensions/lib/embeds/video/toolbar/video_button.dart b/flutter_quill_extensions/lib/embeds/video/toolbar/video_button.dart index 3b6708b94..748759784 100644 --- a/flutter_quill_extensions/lib/embeds/video/toolbar/video_button.dart +++ b/flutter_quill_extensions/lib/embeds/video/toolbar/video_button.dart @@ -13,8 +13,8 @@ import 'select_video_source.dart'; class QuillToolbarVideoButton extends StatelessWidget { const QuillToolbarVideoButton({ - required this.options, required this.controller, + this.options = const QuillToolbarVideoButtonOptions(), super.key, }); @@ -28,6 +28,13 @@ class QuillToolbarVideoButton extends StatelessWidget { return iconSize ?? baseFontSize; } + double _iconButtonFactor(BuildContext context) { + final baseIconFactor = + baseButtonExtraOptions(context).globalIconButtonFactor; + final iconButtonFactor = options.iconButtonFactor; + return iconButtonFactor ?? baseIconFactor; + } + VoidCallback? _afterButtonPressed(BuildContext context) { return options.afterButtonPressed ?? baseButtonExtraOptions(context).afterButtonPressed; @@ -67,6 +74,7 @@ class QuillToolbarVideoButton extends StatelessWidget { final tooltip = _tooltip(context); final iconSize = _iconSize(context); + final iconButtonFactor = _iconButtonFactor(context); final iconData = _iconData(context); final childBuilder = options.childBuilder ?? baseButtonExtraOptions(context).childBuilder; @@ -83,7 +91,7 @@ class QuillToolbarVideoButton extends StatelessWidget { dialogTheme: options.dialogTheme, fillColor: iconFillColor, iconSize: options.iconSize, - iconButtonFactor: options.iconButtonFactor, + iconButtonFactor: iconButtonFactor, linkRegExp: options.linkRegExp, tooltip: options.tooltip, iconTheme: options.iconTheme, @@ -98,7 +106,7 @@ class QuillToolbarVideoButton extends StatelessWidget { } return QuillToolbarIconButton( - icon: Icon(iconData, size: iconSize * 1.77, color: iconColor), + icon: Icon(iconData, size: iconSize * iconButtonFactor, color: iconColor), tooltip: tooltip, isFilled: false, onPressed: () => _sharedOnPressed(context), diff --git a/lib/flutter_quill.dart b/lib/flutter_quill.dart index 9d0b04868..5ea179f4c 100644 --- a/lib/flutter_quill.dart +++ b/lib/flutter_quill.dart @@ -1,6 +1,6 @@ library flutter_quill; -export 'src/extensions/quill_provider.dart'; +export 'src/extensions/quill_configurations_ext.dart'; export 'src/models/config/quill_configurations.dart'; export 'src/models/config/raw_editor/configurations.dart'; export 'src/models/config/toolbar/toolbar_configurations.dart'; @@ -33,5 +33,6 @@ export 'src/widgets/raw_editor/raw_editor.dart'; export 'src/widgets/raw_editor/raw_editor_state.dart'; export 'src/widgets/style_widgets/style_widgets.dart'; export 'src/widgets/toolbar/base_toolbar.dart'; +export 'src/widgets/toolbar/buttons/select_header_style_button.dart'; export 'src/widgets/toolbar/simple_toolbar.dart'; export 'src/widgets/utils/provider.dart'; diff --git a/lib/src/extensions/quill_configurations_ext.dart b/lib/src/extensions/quill_configurations_ext.dart new file mode 100644 index 000000000..f926f76eb --- /dev/null +++ b/lib/src/extensions/quill_configurations_ext.dart @@ -0,0 +1,93 @@ +import 'package:flutter/widgets.dart' show BuildContext; + +import '../../flutter_quill.dart'; + +extension QuillControllerExt on BuildContext { + /// return nullable [QuillController] + QuillController? get quilController { + return quillSimpleToolbarConfigurations?.controller ?? + quillEditorConfigurations?.controller; + } + + /// return [QuillController] as not null + QuillController get requireQuillController { + return quillSimpleToolbarConfigurations?.controller ?? + quillEditorConfigurations?.controller ?? + (throw ArgumentError( + 'The quill provider is required, you must only call requireQuillController inside the QuillToolbar and QuillEditor')); + } +} + +extension QuillSharedExt on BuildContext { + /// return nullable [QuillSharedConfigurations] + QuillSharedConfigurations? get quillSharedConfigurations { + return quillSimpleToolbarConfigurations?.sharedConfigurations ?? + quillEditorConfigurations?.sharedConfigurations; + } +} + +extension QuillEditorExt on BuildContext { + /// return [QuillEditorConfigurations] as not null + QuillEditorConfigurations get requireQuillEditorConfigurations { + return QuillEditorProvider.ofNotNull(this).editorConfigurations; + } + + /// return nullable [QuillEditorConfigurations] + QuillEditorConfigurations? get quillEditorConfigurations { + return QuillEditorProvider.of(this)?.editorConfigurations; + } + + /// return nullable [QuillToolbarBaseButtonOptions]. Since the quill + /// quill editor block options is in the [QuillEditorProvider] then we need to + /// get the provider widget first and then we will return block options + /// throw exception if [QuillEditorProvider] is not in the widget tree + QuillEditorElementOptions? get quillEditorElementOptions { + return quillEditorConfigurations?.elementOptions; + } + + /// return [QuillToolbarBaseButtonOptions] as not null. Since the quill + /// quill editor block options is in the [QuillEditorProvider] then we need to + /// get the provider widget first and then we will return block options + /// don't throw exception if [QuillEditorProvider] is not in the widget tree + QuillEditorElementOptions get requireQuillEditorElementOptions { + return requireQuillEditorConfigurations.elementOptions; + } +} + +extension QuillSimpleToolbarExt on BuildContext { + /// return [QuillSimpleToolbarConfigurations] as not null + QuillSimpleToolbarConfigurations get requireQuillSimpleToolbarConfigurations { + return QuillToolbarProvider.ofNotNull(this).toolbarConfigurations; + } + + /// return nullable [QuillSimpleToolbarConfigurations] + QuillSimpleToolbarConfigurations? get quillSimpleToolbarConfigurations { + return QuillToolbarProvider.of(this)?.toolbarConfigurations; + } + + /// return nullable [QuillToolbarBaseButtonOptions]. + QuillToolbarBaseButtonOptions? get quillToolbarBaseButtonOptions { + return quillSimpleToolbarConfigurations?.buttonOptions.base; + } + + /// return [QuillToolbarBaseButtonOptions] as not null. + QuillToolbarBaseButtonOptions get requireQuillToolbarBaseButtonOptions { + return quillSimpleToolbarConfigurations?.buttonOptions.base ?? + quillToolbarConfigurations?.buttonOptions.base ?? + (throw ArgumentError( + "The buttonOptions is required and it's null because the toolbar configurations is.", + )); + } +} + +extension QuillToolbarExt on BuildContext { + /// return [QuillToolbarConfigurations] as not null + QuillToolbarConfigurations get requireQuillToolbarConfigurations { + return QuillBaseToolbarProvider.ofNotNull(this).toolbarConfigurations; + } + + /// return nullable [QuillToolbarConfigurations]. + QuillToolbarConfigurations? get quillToolbarConfigurations { + return QuillBaseToolbarProvider.of(this)?.toolbarConfigurations; + } +} diff --git a/lib/src/extensions/quill_controller.dart b/lib/src/extensions/quill_controller_ext.dart similarity index 82% rename from lib/src/extensions/quill_controller.dart rename to lib/src/extensions/quill_controller_ext.dart index ca7c36998..3ae3e8470 100644 --- a/lib/src/extensions/quill_controller.dart +++ b/lib/src/extensions/quill_controller_ext.dart @@ -1,7 +1,7 @@ import 'package:flutter/widgets.dart' show BuildContext; -import '../../flutter_quill.dart' show QuillController, QuillProvider; -import 'quill_provider.dart'; +import '../../flutter_quill.dart' show QuillController; +import 'quill_configurations_ext.dart'; extension QuillControllerNullableExt on QuillController? { /// Simple logic to use the current passed controller if not null diff --git a/lib/src/extensions/quill_provider.dart b/lib/src/extensions/quill_provider.dart deleted file mode 100644 index e6fbc1650..000000000 --- a/lib/src/extensions/quill_provider.dart +++ /dev/null @@ -1,142 +0,0 @@ -import 'package:flutter/widgets.dart' show BuildContext; - -import '../../flutter_quill.dart'; - -// TODO: The comments of this file is outdated and needs to be updated - -/// Public shared extension -extension QuillProviderExt on BuildContext { - /// return nullable [QuillProvider] - /// don't throw exception if it's not in the widget tree - /// instead it will be null - QuillProvider? get quillProvider { - return QuillProvider.of(this); - } - - /// return nullable [QuillController] - /// since the quill controller is in the [QuillProvider] then we need to get - /// the provider widget first and then we will return the controller - /// don't throw exception if [QuillProvider] is not in the widget tree - /// instead it will be null - QuillController? get quilController { - return quillToolbarConfigurations?.controller ?? - quillEditorConfigurations?.controller; - } - - /// return [QuillController] as not null - /// since the quill controller is in the [QuillProvider] then we need to get - /// the provider widget first and then we will return the controller - /// throw exception if [QuillProvider] is not in the widget tree - QuillController get requireQuillController { - return quillToolbarConfigurations?.controller ?? - quillEditorConfigurations?.controller ?? - (throw ArgumentError( - 'The quill provider is required, you must only call requireQuillController inside the QuillToolbar and QuillEditor')); - } - - /// return nullable [QuillConfigurations] - /// since the quill configurations is in the [QuillProvider] then we need to - /// get the provider widget first and then we will return quill configurations - /// don't throw exception if [QuillProvider] is not in the widget tree - QuillConfigurations? get quillConfigurations { - return quillProvider?.configurations; - } - - /// return nullable [QuillSharedConfigurations] . Since the quill - /// shared configurations is in the [QuillProvider] then we need to get the - /// provider widget first and then we will return shared configurations - /// don't throw exception if [QuillProvider] is not in the widget tree - QuillSharedConfigurations? get quillSharedConfigurations { - return quillConfigurations?.sharedConfigurations; - } - - /// return [QuillEditorConfigurations] as not null . Since the quill - /// editor configurations is in the [QuillEditorProvider] - /// then we need to get the - /// provider widget first and then we will return editor configurations - /// throw exception if [QuillProvider] is not in the widget tree - QuillEditorConfigurations get requireQuillEditorConfigurations { - return QuillEditorProvider.ofNotNull(this).editorConfigurations; - } - - /// return nullable [QuillEditorConfigurations]. Since the quill - /// editor configurations is in the [QuillEditorProvider] - /// then we need to get the - /// provider widget first and then we will return editor configurations - /// don't throw exception if [QuillProvider] is not in the widget tree - QuillEditorConfigurations? get quillEditorConfigurations { - return QuillEditorProvider.of(this)?.editorConfigurations; - } - - /// return [QuillSimpleToolbarConfigurations] as not null . Since the quill - /// toolbar configurations is in the [QuillToolbarProvider] - /// then we need to get the - /// provider widget first and then we will return toolbar configurations - /// throw exception if [QuillProvider] is not in the widget tree - QuillSimpleToolbarConfigurations get requireQuillToolbarConfigurations { - return QuillToolbarProvider.ofNotNull(this).toolbarConfigurations; - } - - /// return nullable [QuillSimpleToolbarConfigurations]. Since the quill - /// toolbar configurations is in the [QuillToolbarProvider] - /// then we need to get the - /// provider widget first and then we will return toolbar configurations - /// don't throw exception if [QuillProvider] is not in the widget tree - QuillSimpleToolbarConfigurations? get quillToolbarConfigurations { - return QuillToolbarProvider.of(this)?.toolbarConfigurations; - } - - /// return [QuillToolbarConfigurations] as not null . Since the quill - /// toolbar configurations is in the [QuillBaseToolbarProvider] - /// then we need to get the - /// provider widget first and then we will return toolbar configurations - /// throw exception if [QuillBaseToolbarProvider] is not in the widget tree - QuillToolbarConfigurations get requireQuillBaseToolbarConfigurations { - return QuillBaseToolbarProvider.ofNotNull(this).toolbarConfigurations; - } - - /// return nullable [QuillToolbarConfigurations]. Since the quill - /// toolbar configurations is in the [QuillBaseToolbarProvider] - /// then we need to get the - /// provider widget first and then we will return toolbar configurations - /// don't throw exception if [QuillBaseToolbarProvider] is not in the widget tree - QuillToolbarConfigurations? get quillBaseToolbarConfigurations { - return QuillBaseToolbarProvider.of(this)?.toolbarConfigurations; - } - - /// return nullable [QuillToolbarBaseButtonOptions]. Since the quill - /// toolbar base button options is in the [QuillProvider] then we need to - /// 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.base; - } - - /// return [QuillToolbarBaseButtonOptions] as not null. Since the quill - /// toolbar base button options is in the [QuillProvider] then we need to - /// 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 quillToolbarConfigurations?.buttonOptions.base ?? - quillBaseToolbarConfigurations?.buttonOptions.base ?? - (throw ArgumentError( - "The buttonOptions is required and it's null because the toolbar configurations is.", - )); - } - - /// return nullable [QuillToolbarBaseButtonOptions]. Since the quill - /// quill editor block options is in the [QuillEditorProvider] then we need to - /// get the provider widget first and then we will return block options - /// throw exception if [QuillEditorProvider] is not in the widget tree - QuillEditorElementOptions? get quillEditorElementOptions { - return quillEditorConfigurations?.elementOptions; - } - - /// return [QuillToolbarBaseButtonOptions] as not null. Since the quill - /// quill editor block options is in the [QuillEditorProvider] then we need to - /// get the provider widget first and then we will return block options - /// don't throw exception if [QuillEditorProvider] is not in the widget tree - QuillEditorElementOptions get requireQuillEditorElementOptions { - return requireQuillEditorConfigurations.elementOptions; - } -} diff --git a/lib/src/l10n/widgets/localizations.dart b/lib/src/l10n/widgets/localizations.dart index 85fe5ff21..57277b6b0 100644 --- a/lib/src/l10n/widgets/localizations.dart +++ b/lib/src/l10n/widgets/localizations.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; -import '../../extensions/quill_provider.dart'; +import '../../extensions/quill_configurations_ext.dart'; import '../extensions/localizations.dart'; class FlutterQuillLocalizationsWidget extends StatelessWidget { diff --git a/lib/src/models/config/editor/configurations.dart b/lib/src/models/config/editor/configurations.dart index ec793fa5e..55151b1b5 100644 --- a/lib/src/models/config/editor/configurations.dart +++ b/lib/src/models/config/editor/configurations.dart @@ -15,6 +15,7 @@ import '../../../widgets/others/embeds.dart'; import '../../../widgets/others/link.dart'; import '../../../widgets/raw_editor/raw_editor.dart'; import '../../themes/quill_dialog_theme.dart'; +import '../quill_shared_configurations.dart'; import 'element_options.dart'; export 'element_options.dart'; @@ -26,6 +27,7 @@ class QuillEditorConfigurations extends Equatable { /// When editing this class please update the [copyWith] function too. const QuillEditorConfigurations({ required this.controller, + this.sharedConfigurations = const QuillSharedConfigurations(), this.scrollable = true, this.padding = EdgeInsets.zero, this.autoFocus = false, @@ -76,6 +78,8 @@ class QuillEditorConfigurations extends Equatable { this.textInputAction = TextInputAction.newline, }); + final QuillSharedConfigurations sharedConfigurations; + final QuillController controller; /// The text placeholder in the quill editor diff --git a/lib/src/models/config/toolbar/buttons/base_configurations.dart b/lib/src/models/config/toolbar/buttons/base_configurations.dart index 4b7b8ab12..be77a833b 100644 --- a/lib/src/models/config/toolbar/buttons/base_configurations.dart +++ b/lib/src/models/config/toolbar/buttons/base_configurations.dart @@ -3,7 +3,7 @@ import 'package:equatable/equatable.dart'; import 'package:flutter/foundation.dart' show VoidCallback, immutable; import 'package:flutter/widgets.dart' show BuildContext, IconData, Widget; -import '../../../../../flutter_quill.dart' show QuillController, QuillProvider; +import '../../../../../flutter_quill.dart' show QuillController; import '../../../themes/quill_icon_theme.dart' show QuillIconTheme; import '../../quill_configurations.dart' show kDefaultIconSize, kIconButtonFactor; diff --git a/lib/src/models/config/toolbar/buttons/history_configurations.dart b/lib/src/models/config/toolbar/buttons/history_configurations.dart index 1f1bfaabf..5766c3802 100644 --- a/lib/src/models/config/toolbar/buttons/history_configurations.dart +++ b/lib/src/models/config/toolbar/buttons/history_configurations.dart @@ -20,7 +20,6 @@ class QuillToolbarHistoryButtonExtraOptions class QuillToolbarHistoryButtonOptions extends QuillToolbarBaseButtonOptions< QuillToolbarHistoryButtonOptions, QuillToolbarHistoryButtonExtraOptions> { const QuillToolbarHistoryButtonOptions({ - required this.isUndo, super.iconData, super.controller, super.iconTheme, @@ -31,10 +30,6 @@ class QuillToolbarHistoryButtonOptions extends QuillToolbarBaseButtonOptions< this.iconButtonFactor, }); - /// If this true then it will be the undo button - /// otherwise it will be redo - final bool isUndo; - /// By default will use [globalIconSize] final double? iconSize; final double? iconButtonFactor; diff --git a/lib/src/models/config/toolbar/simple_toolbar_configurations.dart b/lib/src/models/config/toolbar/simple_toolbar_configurations.dart index a8c95293b..1ed627e95 100644 --- a/lib/src/models/config/toolbar/simple_toolbar_configurations.dart +++ b/lib/src/models/config/toolbar/simple_toolbar_configurations.dart @@ -1,3 +1,4 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first import 'package:equatable/equatable.dart'; import 'package:flutter/foundation.dart' show immutable; import 'package:flutter/widgets.dart' @@ -69,11 +70,13 @@ enum LinkStyleType { class QuillSimpleToolbarConfigurations extends QuillSharedToolbarProperties { const QuillSimpleToolbarConfigurations({ required this.controller, + super.sharedConfigurations, super.toolbarSectionSpacing = kToolbarSectionSpacing, super.toolbarIconAlignment = WrapAlignment.center, super.toolbarIconCrossAlignment = WrapCrossAlignment.center, super.buttonOptions = const QuillToolbarButtonOptions(), this.customButtons = const [], + this.fontFamilyValues, super.multiRowsDisplay = true, this.fontSizesValues, this.showDividers = true, @@ -145,6 +148,8 @@ class QuillSimpleToolbarConfigurations extends QuillSharedToolbarProperties { return buttonOptions.base.globalIconSize * 2; } + final Map? fontFamilyValues; + final QuillController controller; /// A widget that will placed between each button in the toolbar @@ -231,12 +236,8 @@ class QuillSimpleToolbarConfigurations extends QuillSharedToolbarProperties { class QuillToolbarButtonOptions extends Equatable { const QuillToolbarButtonOptions({ this.base = const QuillToolbarBaseButtonOptions(), - this.undoHistory = const QuillToolbarHistoryButtonOptions( - isUndo: true, - ), - this.redoHistory = const QuillToolbarHistoryButtonOptions( - isUndo: false, - ), + this.undoHistory = const QuillToolbarHistoryButtonOptions(), + this.redoHistory = const QuillToolbarHistoryButtonOptions(), this.fontFamily = const QuillToolbarFontFamilyButtonOptions(), this.fontSize = const QuillToolbarFontSizeButtonOptions(), this.bold = const QuillToolbarToggleStyleButtonOptions(), diff --git a/lib/src/models/config/toolbar/toolbar_configurations.dart b/lib/src/models/config/toolbar/toolbar_configurations.dart index 15e675fd7..5969e23c7 100644 --- a/lib/src/models/config/toolbar/toolbar_configurations.dart +++ b/lib/src/models/config/toolbar/toolbar_configurations.dart @@ -1,3 +1,4 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first import 'package:flutter/widgets.dart' show Axis, WrapAlignment, WrapCrossAlignment, immutable; @@ -7,7 +8,7 @@ import 'toolbar_shared_configurations.dart'; @immutable class QuillToolbarConfigurations extends QuillSharedToolbarProperties { const QuillToolbarConfigurations({ - required this.childrenBuilder, + this.childrenBuilder, super.axis = Axis.horizontal, super.toolbarSize = kDefaultIconSize * 2, super.toolbarSectionSpacing = kToolbarSectionSpacing, @@ -25,8 +26,16 @@ class QuillToolbarConfigurations extends QuillSharedToolbarProperties { super.buttonOptions = const QuillToolbarButtonOptions(), }); - final QuillBaseToolbarChildrenBuilder childrenBuilder; + final QuillBaseToolbarChildrenBuilder? childrenBuilder; @override List get props => []; + + QuillToolbarConfigurations copyWith({ + QuillBaseToolbarChildrenBuilder? childrenBuilder, + }) { + return QuillToolbarConfigurations( + childrenBuilder: childrenBuilder ?? this.childrenBuilder, + ); + } } diff --git a/lib/src/models/config/toolbar/toolbar_shared_configurations.dart b/lib/src/models/config/toolbar/toolbar_shared_configurations.dart index 166a4a95c..aff603a52 100644 --- a/lib/src/models/config/toolbar/toolbar_shared_configurations.dart +++ b/lib/src/models/config/toolbar/toolbar_shared_configurations.dart @@ -4,9 +4,11 @@ import 'package:flutter/widgets.dart' import '../../../widgets/toolbar/base_toolbar.dart'; import '../../structs/link_dialog_action.dart'; +import '../quill_shared_configurations.dart'; abstract class QuillSharedToolbarProperties extends Equatable { const QuillSharedToolbarProperties({ + this.sharedConfigurations = const QuillSharedConfigurations(), this.toolbarSize, this.axis = Axis.horizontal, this.toolbarSectionSpacing = kToolbarSectionSpacing, @@ -53,4 +55,6 @@ abstract class QuillSharedToolbarProperties extends Equatable { /// If you want change spesefic buttons or all of them /// then you came to the right place final QuillToolbarButtonOptions buttonOptions; + + final QuillSharedConfigurations sharedConfigurations; } diff --git a/lib/src/widgets/others/text_block.dart b/lib/src/widgets/others/text_block.dart index a05d57442..878064804 100644 --- a/lib/src/widgets/others/text_block.dart +++ b/lib/src/widgets/others/text_block.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; -import '../../extensions/quill_provider.dart'; +import '../../extensions/quill_configurations_ext.dart'; import '../../models/documents/attribute.dart'; import '../../models/documents/nodes/block.dart'; import '../../models/documents/nodes/line.dart'; diff --git a/lib/src/widgets/toolbar/base_toolbar.dart b/lib/src/widgets/toolbar/base_toolbar.dart index f8bf5a098..6d535b1ac 100644 --- a/lib/src/widgets/toolbar/base_toolbar.dart +++ b/lib/src/widgets/toolbar/base_toolbar.dart @@ -3,8 +3,10 @@ import 'package:flutter/material.dart'; import '../../../flutter_quill.dart' show QuillBaseToolbarProvider, defaultToolbarSize; import '../../l10n/widgets/localizations.dart'; +import '../../models/config/toolbar/simple_toolbar_configurations.dart'; import '../../models/config/toolbar/toolbar_configurations.dart'; import 'buttons/arrow_indicated_list_button.dart'; +import 'simple_toolbar.dart'; export '../../models/config/toolbar/buttons/base_configurations.dart'; export '../../models/config/toolbar/simple_toolbar_configurations.dart'; @@ -34,6 +36,13 @@ class QuillToolbar extends StatelessWidget implements PreferredSizeWidget { super.key, }); + static QuillSimpleToolbar simple( + QuillSimpleToolbarConfigurations configurations) { + return QuillSimpleToolbar( + configurations: configurations, + ); + } + final QuillToolbarConfigurations configurations; // We can't get the modified [toolbarSize] by the developer @@ -60,7 +69,7 @@ class QuillToolbar extends StatelessWidget implements PreferredSizeWidget { crossAxisAlignment: configurations.toolbarIconCrossAlignment, runSpacing: 4, spacing: configurations.toolbarSectionSpacing, - children: configurations.childrenBuilder(context), + children: configurations.childrenBuilder?.call(context) ?? [], ); } return Container( @@ -77,7 +86,7 @@ class QuillToolbar extends StatelessWidget implements PreferredSizeWidget { ), child: QuillToolbarArrowIndicatedButtonList( axis: configurations.axis, - buttons: configurations.childrenBuilder(context), + buttons: configurations.childrenBuilder?.call(context) ?? [], ), ); }, diff --git a/lib/src/widgets/toolbar/buttons/clear_format_button.dart b/lib/src/widgets/toolbar/buttons/clear_format_button.dart index 7dc2ecfdc..bf1ba0962 100644 --- a/lib/src/widgets/toolbar/buttons/clear_format_button.dart +++ b/lib/src/widgets/toolbar/buttons/clear_format_button.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import '../../../extensions/quill_provider.dart'; +import '../../../extensions/quill_configurations_ext.dart'; import '../../../l10n/extensions/localizations.dart'; import '../../../models/documents/attribute.dart'; import '../../../models/themes/quill_icon_theme.dart'; @@ -10,7 +10,7 @@ import '../base_toolbar.dart'; class QuillToolbarClearFormatButton extends StatelessWidget { const QuillToolbarClearFormatButton({ required QuillController controller, - required this.options, + this.options = const QuillToolbarClearFormatButtonOptions(), super.key, }) : _controller = controller; diff --git a/lib/src/widgets/toolbar/buttons/color/color_button.dart b/lib/src/widgets/toolbar/buttons/color/color_button.dart index 2965f8b25..ff2dce6b6 100644 --- a/lib/src/widgets/toolbar/buttons/color/color_button.dart +++ b/lib/src/widgets/toolbar/buttons/color/color_button.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import '../../../../extensions/quill_provider.dart'; +import '../../../../extensions/quill_configurations_ext.dart'; import '../../../../l10n/extensions/localizations.dart'; import '../../../../l10n/widgets/localizations.dart'; import '../../../../models/documents/attribute.dart'; @@ -196,9 +196,10 @@ class QuillToolbarColorButtonState extends State { return IconButton( tooltip: tooltip, iconSize: iconSize * iconButtonFactor, - icon: Icon(iconData, - size: iconSize, - color: widget.isBackground ? iconColorBackground : iconColor), + icon: Icon( + iconData, + color: widget.isBackground ? iconColorBackground : iconColor, + ), onPressed: _showColorPicker, ); } diff --git a/lib/src/widgets/toolbar/buttons/custom_button_button.dart b/lib/src/widgets/toolbar/buttons/custom_button_button.dart index c63dc6aec..27145d344 100644 --- a/lib/src/widgets/toolbar/buttons/custom_button_button.dart +++ b/lib/src/widgets/toolbar/buttons/custom_button_button.dart @@ -1,14 +1,14 @@ import 'package:flutter/material.dart'; -import '../../../extensions/quill_provider.dart'; +import '../../../extensions/quill_configurations_ext.dart'; import '../../../models/themes/quill_icon_theme.dart'; import '../../others/controller.dart'; import '../base_toolbar.dart'; class QuillToolbarCustomButton extends StatelessWidget { const QuillToolbarCustomButton({ - required this.options, required this.controller, + this.options = const QuillToolbarCustomButtonOptions(), super.key, }); diff --git a/lib/src/widgets/toolbar/buttons/font_family_button.dart b/lib/src/widgets/toolbar/buttons/font_family_button.dart index b173a4f12..dc23f92fa 100644 --- a/lib/src/widgets/toolbar/buttons/font_family_button.dart +++ b/lib/src/widgets/toolbar/buttons/font_family_button.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import '../../../../extensions.dart'; -import '../../../extensions/quill_provider.dart'; +import '../../../extensions/quill_configurations_ext.dart'; import '../../../l10n/extensions/localizations.dart'; import '../../../models/config/toolbar/buttons/font_family_configurations.dart'; import '../../../models/documents/attribute.dart'; @@ -11,9 +11,9 @@ import '../../others/controller.dart'; class QuillToolbarFontFamilyButton extends StatefulWidget { QuillToolbarFontFamilyButton({ - required this.options, required this.controller, required this.defaultDispalyText, + this.options = const QuillToolbarFontFamilyButtonOptions(), super.key, }) : assert(options.rawItemsMap?.isNotEmpty ?? (true)), assert( @@ -86,19 +86,20 @@ class QuillToolbarFontFamilyButtonState } Map get rawItemsMap { - // context.requireQuillToolbarConfigurations.buttonOptions; - final rawItemsMap = options.rawItemsMap ?? - { - 'Sans Serif': 'sans-serif', - 'Serif': 'serif', - 'Monospace': 'monospace', - 'Ibarra Real Nova': 'ibarra-real-nova', - 'SquarePeg': 'square-peg', - 'Nunito': 'nunito', - 'Pacifico': 'pacifico', - 'Roboto Mono': 'roboto-mono', - context.loc.clear: 'Clear' - }; + final rawItemsMap = + context.quillSimpleToolbarConfigurations?.fontFamilyValues ?? + options.rawItemsMap ?? + { + 'Sans Serif': 'sans-serif', + 'Serif': 'serif', + 'Monospace': 'monospace', + 'Ibarra Real Nova': 'ibarra-real-nova', + 'SquarePeg': 'square-peg', + 'Nunito': 'nunito', + 'Pacifico': 'pacifico', + 'Roboto Mono': 'roboto-mono', + context.loc.clear: 'Clear' + }; return rawItemsMap; } diff --git a/lib/src/widgets/toolbar/buttons/font_size_button.dart b/lib/src/widgets/toolbar/buttons/font_size_button.dart index 58dd04e92..0debeba72 100644 --- a/lib/src/widgets/toolbar/buttons/font_size_button.dart +++ b/lib/src/widgets/toolbar/buttons/font_size_button.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import '../../../../extensions.dart'; -import '../../../extensions/quill_provider.dart'; +import '../../../extensions/quill_configurations_ext.dart'; import '../../../l10n/extensions/localizations.dart'; import '../../../models/config/quill_configurations.dart'; import '../../../models/documents/attribute.dart'; @@ -12,9 +12,9 @@ import '../../others/controller.dart'; class QuillToolbarFontSizeButton extends StatefulWidget { QuillToolbarFontSizeButton({ - required this.options, required this.controller, required this.defaultDisplayText, + this.options = const QuillToolbarFontSizeButtonOptions(), super.key, }) : assert(options.rawItemsMap?.isNotEmpty ?? true), assert(options.initialValue == null || @@ -43,7 +43,7 @@ class QuillToolbarFontSizeButtonState Map get rawItemsMap { final fontSizes = options.rawItemsMap ?? - context.requireQuillToolbarConfigurations.fontSizesValues ?? + context.quillSimpleToolbarConfigurations?.fontSizesValues ?? { context.loc.small: 'small', context.loc.large: 'large', @@ -112,10 +112,9 @@ class QuillToolbarFontSizeButtonState } double get iconSize { - final baseFontSize = - context.requireQuillToolbarBaseButtonOptions.globalIconSize; + final baseFontSize = context.quillToolbarBaseButtonOptions?.globalIconSize; final iconSize = options.iconSize; - return iconSize ?? baseFontSize; + return iconSize ?? baseFontSize ?? kDefaultIconSize; } double get iconButtonFactor { diff --git a/lib/src/widgets/toolbar/buttons/history_button.dart b/lib/src/widgets/toolbar/buttons/history_button.dart index 3fceb0b8d..4346a6e37 100644 --- a/lib/src/widgets/toolbar/buttons/history_button.dart +++ b/lib/src/widgets/toolbar/buttons/history_button.dart @@ -1,17 +1,22 @@ import 'package:flutter/material.dart'; -import '../../../extensions/quill_provider.dart'; +import '../../../extensions/quill_configurations_ext.dart'; import '../../../l10n/extensions/localizations.dart'; import '../../others/controller.dart'; import '../base_toolbar.dart'; class QuillToolbarHistoryButton extends StatefulWidget { const QuillToolbarHistoryButton({ - required this.options, required this.controller, + required this.isUndo, + this.options = const QuillToolbarHistoryButtonOptions(), super.key, }); + /// If this true then it will be the undo button + /// otherwise it will be redo + final bool isUndo; + final QuillToolbarHistoryButtonOptions options; final QuillController controller; @@ -53,10 +58,10 @@ class QuillToolbarHistoryButtonState extends State { context.requireQuillToolbarBaseButtonOptions; final tooltip = options.tooltip ?? baseButtonConfigurations.tooltip ?? - (options.isUndo ? context.loc.undo : context.loc.redo); + (widget.isUndo ? context.loc.undo : context.loc.redo); final iconData = options.iconData ?? baseButtonConfigurations.iconData ?? - (options.isUndo ? Icons.undo_outlined : Icons.redo_outlined); + (widget.isUndo ? Icons.undo_outlined : Icons.redo_outlined); final childBuilder = options.childBuilder ?? baseButtonConfigurations.childBuilder; final iconSize = @@ -71,7 +76,6 @@ class QuillToolbarHistoryButtonState extends State { if (childBuilder != null) { return childBuilder( QuillToolbarHistoryButtonOptions( - isUndo: options.isUndo, afterButtonPressed: afterButtonPressed, controller: controller, iconData: iconData, @@ -115,7 +119,7 @@ class QuillToolbarHistoryButtonState extends State { } void _updateCanPressed() { - if (options.isUndo) { + if (widget.isUndo) { _canPressed = controller.hasUndo; return; } @@ -123,7 +127,7 @@ class QuillToolbarHistoryButtonState extends State { } void _updateHistory() { - if (options.isUndo) { + if (widget.isUndo) { if (controller.hasUndo) { controller.undo(); } diff --git a/lib/src/widgets/toolbar/buttons/indent_button.dart b/lib/src/widgets/toolbar/buttons/indent_button.dart index d8e61a2ca..f82097b16 100644 --- a/lib/src/widgets/toolbar/buttons/indent_button.dart +++ b/lib/src/widgets/toolbar/buttons/indent_button.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import '../../../extensions/quill_provider.dart'; +import '../../../extensions/quill_configurations_ext.dart'; import '../../../l10n/extensions/localizations.dart'; import '../../../models/config/toolbar/buttons/indent_configurations.dart'; import '../../../models/themes/quill_icon_theme.dart'; @@ -12,7 +12,7 @@ class QuillToolbarIndentButton extends StatefulWidget { const QuillToolbarIndentButton({ required this.controller, required this.isIncrease, - required this.options, + this.options = const QuillToolbarIndentButtonOptions(), super.key, }); diff --git a/lib/src/widgets/toolbar/buttons/link_style2_button.dart b/lib/src/widgets/toolbar/buttons/link_style2_button.dart index c97d2129e..a663d8647 100644 --- a/lib/src/widgets/toolbar/buttons/link_style2_button.dart +++ b/lib/src/widgets/toolbar/buttons/link_style2_button.dart @@ -4,7 +4,7 @@ import 'package:url_launcher/link.dart'; import '../../../../extensions.dart' show UtilityWidgets, AutoFormatMultipleLinksRule; -import '../../../extensions/quill_provider.dart'; +import '../../../extensions/quill_configurations_ext.dart'; import '../../../l10n/extensions/localizations.dart'; import '../../../l10n/widgets/localizations.dart'; import '../../../models/documents/attribute.dart'; @@ -20,7 +20,7 @@ import '../base_toolbar.dart'; class QuillToolbarLinkStyleButton2 extends StatefulWidget { QuillToolbarLinkStyleButton2({ required this.controller, - required this.options, + this.options = const QuillToolbarLinkStyleButton2Options(), super.key, }) : assert(options.addLinkLabel == null || (options.addLinkLabel?.isNotEmpty ?? true)), diff --git a/lib/src/widgets/toolbar/buttons/link_style_button.dart b/lib/src/widgets/toolbar/buttons/link_style_button.dart index 265e4e75e..82ad93452 100644 --- a/lib/src/widgets/toolbar/buttons/link_style_button.dart +++ b/lib/src/widgets/toolbar/buttons/link_style_button.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import '../../../extensions/quill_provider.dart'; +import '../../../extensions/quill_configurations_ext.dart'; import '../../../l10n/extensions/localizations.dart'; import '../../../l10n/widgets/localizations.dart'; import '../../../models/documents/attribute.dart'; @@ -15,7 +15,7 @@ import '../base_toolbar.dart'; class QuillToolbarLinkStyleButton extends StatefulWidget { const QuillToolbarLinkStyleButton({ required this.controller, - required this.options, + this.options = const QuillToolbarLinkStyleButtonOptions(), super.key, }); diff --git a/lib/src/widgets/toolbar/buttons/search/search_button.dart b/lib/src/widgets/toolbar/buttons/search/search_button.dart index 2ef2f8627..ed8f634c3 100644 --- a/lib/src/widgets/toolbar/buttons/search/search_button.dart +++ b/lib/src/widgets/toolbar/buttons/search/search_button.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import '../../../../extensions/quill_provider.dart'; +import '../../../../extensions/quill_configurations_ext.dart'; import '../../../../l10n/extensions/localizations.dart'; import '../../../../l10n/widgets/localizations.dart'; import '../../../../models/themes/quill_dialog_theme.dart'; @@ -11,7 +11,7 @@ import '../../base_toolbar.dart'; class QuillToolbarSearchButton extends StatelessWidget { const QuillToolbarSearchButton({ required QuillController controller, - required this.options, + this.options = const QuillToolbarSearchButtonOptions(), super.key, }) : _controller = controller; diff --git a/lib/src/widgets/toolbar/buttons/select_alignment_buttons.dart b/lib/src/widgets/toolbar/buttons/select_alignment_buttons.dart index 51fe901b2..c76224b0f 100644 --- a/lib/src/widgets/toolbar/buttons/select_alignment_buttons.dart +++ b/lib/src/widgets/toolbar/buttons/select_alignment_buttons.dart @@ -20,7 +20,7 @@ enum _AlignmentOptions { class QuillToolbarSelectAlignmentButtons extends StatelessWidget { const QuillToolbarSelectAlignmentButtons({ required this.controller, - required this.options, + this.options = const QuillToolbarSelectAlignmentButtonOptions(), this.showLeftAlignment, this.showCenterAlignment, this.showRightAlignment, @@ -44,7 +44,6 @@ class QuillToolbarSelectAlignmentButtons extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: _AlignmentOptions.values .map((e) => QuillToolbarToggleStyleButton( - options: const QuillToolbarToggleStyleButtonOptions(), controller: controller, attribute: e.attribute, )) diff --git a/lib/src/widgets/toolbar/buttons/select_alignment_old_buttons.dart b/lib/src/widgets/toolbar/buttons/select_alignment_old_buttons.dart index 9c4c5e31f..ed5913893 100644 --- a/lib/src/widgets/toolbar/buttons/select_alignment_old_buttons.dart +++ b/lib/src/widgets/toolbar/buttons/select_alignment_old_buttons.dart @@ -14,7 +14,7 @@ // class QuillToolbarSelectAlignmentOldButtons extends StatefulWidget { // const QuillToolbarSelectAlignmentOldButtons({ // required this.controller, -// required this.options, +// this.options, // this.showLeftAlignment, // this.showCenterAlignment, // this.showRightAlignment, diff --git a/lib/src/widgets/toolbar/buttons/select_header_style_button.dart b/lib/src/widgets/toolbar/buttons/select_header_style_button.dart index 4016147d8..32140602f 100644 --- a/lib/src/widgets/toolbar/buttons/select_header_style_button.dart +++ b/lib/src/widgets/toolbar/buttons/select_header_style_button.dart @@ -15,7 +15,7 @@ enum _HeaderStyleOptions { class QuillToolbarSelectHeaderStyleButton extends StatefulWidget { const QuillToolbarSelectHeaderStyleButton({ required this.controller, - required this.options, + this.options = const QuillToolbarSelectHeaderStyleButtonsOptions(), super.key, }); diff --git a/lib/src/widgets/toolbar/buttons/select_header_style_buttons.dart b/lib/src/widgets/toolbar/buttons/select_header_style_buttons.dart index 5972baf20..b1d3dd2c3 100644 --- a/lib/src/widgets/toolbar/buttons/select_header_style_buttons.dart +++ b/lib/src/widgets/toolbar/buttons/select_header_style_buttons.dart @@ -2,7 +2,7 @@ import 'package:flutter/foundation.dart' show kIsWeb; import 'package:flutter/material.dart'; import '../../../../extensions.dart'; -import '../../../extensions/quill_provider.dart'; +import '../../../extensions/quill_configurations_ext.dart'; import '../../../l10n/extensions/localizations.dart'; import '../../../models/documents/attribute.dart'; import '../../../models/documents/style.dart'; @@ -13,7 +13,7 @@ import '../base_toolbar.dart'; class QuillToolbarSelectHeaderStyleButtons extends StatefulWidget { const QuillToolbarSelectHeaderStyleButtons({ required this.controller, - required this.options, + this.options = const QuillToolbarSelectHeaderStyleButtonsOptions(), super.key, }); @@ -88,8 +88,8 @@ class QuillToolbarSelectHeaderStyleButtonsState Axis get axis { return options.axis ?? + context.quillSimpleToolbarConfigurations?.axis ?? context.quillToolbarConfigurations?.axis ?? - context.quillBaseToolbarConfigurations?.axis ?? (throw ArgumentError( 'There is no default value for the Axis of the toolbar')); } diff --git a/lib/src/widgets/toolbar/buttons/toggle_check_list_button.dart b/lib/src/widgets/toolbar/buttons/toggle_check_list_button.dart index 2776cbc2b..866882481 100644 --- a/lib/src/widgets/toolbar/buttons/toggle_check_list_button.dart +++ b/lib/src/widgets/toolbar/buttons/toggle_check_list_button.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import '../../../extensions/quill_provider.dart'; +import '../../../extensions/quill_configurations_ext.dart'; import '../../../l10n/extensions/localizations.dart'; import '../../../models/config/toolbar/buttons/base_configurations.dart'; import '../../../models/config/toolbar/buttons/toggle_check_list_configurations.dart'; @@ -13,8 +13,8 @@ import 'toggle_style_button.dart'; class QuillToolbarToggleCheckListButton extends StatefulWidget { const QuillToolbarToggleCheckListButton({ - required this.options, required this.controller, + this.options = const QuillToolbarToggleCheckListButtonOptions(), super.key, }); diff --git a/lib/src/widgets/toolbar/buttons/toggle_style_button.dart b/lib/src/widgets/toolbar/buttons/toggle_style_button.dart index 75a8066d4..2ea43f97b 100644 --- a/lib/src/widgets/toolbar/buttons/toggle_style_button.dart +++ b/lib/src/widgets/toolbar/buttons/toggle_style_button.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import '../../../extensions/quill_provider.dart'; +import '../../../extensions/quill_configurations_ext.dart'; import '../../../l10n/extensions/localizations.dart'; import '../../../models/documents/attribute.dart'; import '../../../models/documents/style.dart'; @@ -23,9 +23,9 @@ typedef ToggleStyleButtonBuilder = Widget Function( class QuillToolbarToggleStyleButton extends StatefulWidget { const QuillToolbarToggleStyleButton({ - required this.options, required this.controller, required this.attribute, + this.options = const QuillToolbarToggleStyleButtonOptions(), super.key, }); @@ -62,10 +62,9 @@ class QuillToolbarToggleStyleButtonState } double get iconSize { - final baseFontSize = - context.requireQuillToolbarBaseButtonOptions.globalIconSize; + final baseFontSize = context.quillToolbarBaseButtonOptions?.globalIconSize; final iconSize = options.iconSize; - return iconSize ?? baseFontSize; + return iconSize ?? baseFontSize ?? kDefaultIconSize; } double get iconButtonFactor { diff --git a/lib/src/widgets/toolbar/simple_toolbar.dart b/lib/src/widgets/toolbar/simple_toolbar.dart index 094b65797..f27bcd680 100644 --- a/lib/src/widgets/toolbar/simple_toolbar.dart +++ b/lib/src/widgets/toolbar/simple_toolbar.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import '../../extensions/quill_provider.dart'; +import '../../extensions/quill_configurations_ext.dart'; import '../../l10n/extensions/localizations.dart'; import '../../models/config/toolbar/toolbar_configurations.dart'; import '../../models/documents/attribute.dart'; @@ -67,7 +67,7 @@ class QuillSimpleToolbar extends StatelessWidget toolbarSize: configurations.toolbarSize, childrenBuilder: (context) { final toolbarConfigurations = - context.requireQuillToolbarConfigurations; + context.requireQuillSimpleToolbarConfigurations; final globalIconSize = toolbarConfigurations.buttonOptions.base.globalIconSize; @@ -81,6 +81,7 @@ class QuillSimpleToolbar extends StatelessWidget return [ if (configurations.showUndo) ...[ QuillToolbarHistoryButton( + isUndo: true, options: toolbarConfigurations.buttonOptions.undoHistory, controller: toolbarConfigurations .buttonOptions.undoHistory.controller ?? @@ -90,6 +91,7 @@ class QuillSimpleToolbar extends StatelessWidget ], if (configurations.showRedo) ...[ QuillToolbarHistoryButton( + isUndo: false, options: toolbarConfigurations.buttonOptions.redoHistory, controller: toolbarConfigurations .buttonOptions.redoHistory.controller ?? diff --git a/lib/src/widgets/utils/provider.dart b/lib/src/widgets/utils/provider.dart index 4cd656362..f7fbc02ce 100644 --- a/lib/src/widgets/utils/provider.dart +++ b/lib/src/widgets/utils/provider.dart @@ -5,65 +5,6 @@ import 'package:flutter/widgets.dart' import '../../models/config/quill_configurations.dart'; import '../../models/config/toolbar/toolbar_configurations.dart'; -class QuillProvider extends InheritedWidget { - const QuillProvider({ - required this.configurations, - required super.child, - super.key, - }); - - /// Controller object which establishes a link between a rich text document - /// and this editor. - /// - /// Must not be null. - final QuillConfigurations configurations; - - @override - bool updateShouldNotify(covariant QuillProvider oldWidget) { - return oldWidget.configurations != configurations; - } - - static QuillProvider? of(BuildContext context) { - return context.dependOnInheritedWidgetOfExactType(); - } - - static QuillProvider ofNotNull(BuildContext context) { - final provider = of(context); - if (provider == null) { - if (kDebugMode) { - debugPrint( - 'The quill provider must be provided in the widget tree.', - ); - } - throw ArgumentError.checkNotNull( - 'You are using a widget in the Flutter quill library that require ' - 'The Quill provider widget to be in the parent widget tree ' - 'because ' - 'The provider is $provider. Please make sure to wrap this widget' - ' with' - ' QuillProvider widget. ' - 'You might using QuillEditor and QuillToolbar so make sure to' - ' wrap them with the quill provider widget and setup the required ' - 'configurations', - 'QuillProvider', - ); - } - return provider; - } - - /// To pass the [QuillProvider] instance as value instead of creating new - /// widget - static QuillProvider value({ - required QuillProvider value, - required Widget child, - }) { - return QuillProvider( - configurations: value.configurations, - child: child, - ); - } -} - class QuillToolbarProvider extends InheritedWidget { const QuillToolbarProvider({ required super.child,