pull/1566/head
Ellet 2 years ago
parent 5afa35e02d
commit 25435c9bcc
No known key found for this signature in database
GPG Key ID: C488CC70BBCEF0D1
  1. 4
      CHANGELOG.md
  2. 15
      example/lib/presentation/quill/quill_screen.dart
  3. 118
      example/lib/presentation/quill/quill_toolbar.dart
  4. 35
      example/lib/presentation/simple/simple_screen.dart
  5. 4
      flutter_quill_extensions/lib/embeds/formula/toolbar/formula_button.dart
  6. 4
      flutter_quill_extensions/lib/embeds/image/toolbar/image_button.dart
  7. 19
      flutter_quill_extensions/lib/embeds/others/camera_button/camera_button.dart
  8. 4
      flutter_quill_extensions/lib/embeds/others/media_button/media_button.dart
  9. 3
      flutter_quill_extensions/lib/embeds/video/toolbar/select_video_source.dart
  10. 14
      flutter_quill_extensions/lib/embeds/video/toolbar/video_button.dart
  11. 3
      lib/flutter_quill.dart
  12. 93
      lib/src/extensions/quill_configurations_ext.dart
  13. 4
      lib/src/extensions/quill_controller_ext.dart
  14. 142
      lib/src/extensions/quill_provider.dart
  15. 2
      lib/src/l10n/widgets/localizations.dart
  16. 4
      lib/src/models/config/editor/configurations.dart
  17. 2
      lib/src/models/config/toolbar/buttons/base_configurations.dart
  18. 5
      lib/src/models/config/toolbar/buttons/history_configurations.dart
  19. 13
      lib/src/models/config/toolbar/simple_toolbar_configurations.dart
  20. 13
      lib/src/models/config/toolbar/toolbar_configurations.dart
  21. 4
      lib/src/models/config/toolbar/toolbar_shared_configurations.dart
  22. 2
      lib/src/widgets/others/text_block.dart
  23. 13
      lib/src/widgets/toolbar/base_toolbar.dart
  24. 4
      lib/src/widgets/toolbar/buttons/clear_format_button.dart
  25. 9
      lib/src/widgets/toolbar/buttons/color/color_button.dart
  26. 4
      lib/src/widgets/toolbar/buttons/custom_button_button.dart
  27. 9
      lib/src/widgets/toolbar/buttons/font_family_button.dart
  28. 11
      lib/src/widgets/toolbar/buttons/font_size_button.dart
  29. 18
      lib/src/widgets/toolbar/buttons/history_button.dart
  30. 4
      lib/src/widgets/toolbar/buttons/indent_button.dart
  31. 4
      lib/src/widgets/toolbar/buttons/link_style2_button.dart
  32. 4
      lib/src/widgets/toolbar/buttons/link_style_button.dart
  33. 4
      lib/src/widgets/toolbar/buttons/search/search_button.dart
  34. 3
      lib/src/widgets/toolbar/buttons/select_alignment_buttons.dart
  35. 2
      lib/src/widgets/toolbar/buttons/select_alignment_old_buttons.dart
  36. 2
      lib/src/widgets/toolbar/buttons/select_header_style_button.dart
  37. 6
      lib/src/widgets/toolbar/buttons/select_header_style_buttons.dart
  38. 4
      lib/src/widgets/toolbar/buttons/toggle_check_list_button.dart
  39. 9
      lib/src/widgets/toolbar/buttons/toggle_style_button.dart
  40. 6
      lib/src/widgets/toolbar/simple_toolbar.dart
  41. 59
      lib/src/widgets/utils/provider.dart

@ -2,6 +2,10 @@
All notable changes to this project will be documented in this file. 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 ## 9.0.0-dev-3
* Breaking Changes: * Breaking Changes:
* Rename `QuillToolbar` to `QuillSimpleToolbar` * Rename `QuillToolbar` to `QuillSimpleToolbar`

@ -3,7 +3,7 @@ import 'dart:convert' show jsonEncode;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_quill/flutter_quill.dart'; import 'package:flutter_quill/flutter_quill.dart';
import 'package:flutter_quill_extensions/flutter_quill_extensions.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:quill_html_converter/quill_html_converter.dart';
import 'package:share_plus/share_plus.dart' show Share; import 'package:share_plus/share_plus.dart' show Share;
@ -106,12 +106,14 @@ class _QuillScreenState extends State<QuillScreen> {
MyQuillToolbar( MyQuillToolbar(
controller: _controller, controller: _controller,
focusNode: _editorFocusNode, focusNode: _editorFocusNode,
sharedConfigurations: _sharedConfigurations,
), ),
Builder( Builder(
builder: (context) { builder: (context) {
return Expanded( return Expanded(
child: MyQuillEditor( child: MyQuillEditor(
configurations: QuillEditorConfigurations( configurations: QuillEditorConfigurations(
sharedConfigurations: _sharedConfigurations,
controller: _controller, controller: _controller,
readOnly: _isReadOnly, readOnly: _isReadOnly,
), ),
@ -129,4 +131,15 @@ class _QuillScreenState extends State<QuillScreen> {
), ),
); );
} }
QuillSharedConfigurations get _sharedConfigurations {
return const QuillSharedConfigurations(
extraConfigurations: {
QuillSharedExtensionsConfigurations.key:
QuillSharedExtensionsConfigurations(
assetsPrefix: 'your-assets-folder-name', // Defaults to assets
),
},
);
}
} }

@ -17,11 +17,14 @@ class MyQuillToolbar extends StatelessWidget {
const MyQuillToolbar({ const MyQuillToolbar({
required this.controller, required this.controller,
required this.focusNode, required this.focusNode,
required this.sharedConfigurations,
super.key, super.key,
}); });
final QuillController controller; final QuillController controller;
final FocusNode focusNode; final FocusNode focusNode;
// TODO: Use it
final QuillSharedConfigurations sharedConfigurations;
Future<void> onImageInsertWithCropping( Future<void> onImageInsertWithCropping(
String image, String image,
@ -101,132 +104,103 @@ class MyQuillToolbar extends StatelessWidget {
// https://github.com/singerdmx/flutter-quill/blob/master/doc/custom_toolbar.md // https://github.com/singerdmx/flutter-quill/blob/master/doc/custom_toolbar.md
return QuillToolbar( return QuillToolbar(
configurations: QuillToolbarConfigurations( configurations: QuillToolbarConfigurations(
toolbarSize: 15 * 2, toolbarSize: 20 * 2,
multiRowsDisplay: false, multiRowsDisplay: false,
buttonOptions: const QuillToolbarButtonOptions( buttonOptions: const QuillToolbarButtonOptions(
base: QuillToolbarBaseButtonOptions( base: QuillToolbarBaseButtonOptions(
globalIconSize: 20, globalIconSize: 20,
globalIconButtonFactor: 1.4,
), ),
), ),
childrenBuilder: (context) { childrenBuilder: (context) {
return [ return [
IconButton( IconButton(
onPressed: () { onPressed: () => context
context.read<SettingsCubit>().updateSettings( .read<SettingsCubit>()
state.copyWith(useCustomQuillToolbar: false)); .updateSettings(
}, state.copyWith(useCustomQuillToolbar: false)),
icon: const Icon( icon: const Icon(
Icons.width_normal, Icons.width_normal,
size: 16,
), ),
), ),
QuillToolbarImageButton(
controller: controller,
options: const QuillToolbarImageButtonOptions(),
),
QuillToolbarHistoryButton( QuillToolbarHistoryButton(
isUndo: true,
controller: controller, controller: controller,
options:
const QuillToolbarHistoryButtonOptions(isUndo: true),
), ),
QuillToolbarHistoryButton( QuillToolbarHistoryButton(
isUndo: false,
controller: controller, controller: controller,
options:
const QuillToolbarHistoryButtonOptions(isUndo: false),
), ),
QuillToolbarToggleStyleButton( QuillToolbarToggleStyleButton(
attribute: Attribute.bold, options: const QuillToolbarToggleStyleButtonOptions(),
controller: controller, controller: controller,
options: QuillToolbarToggleStyleButtonOptions( attribute: Attribute.bold,
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),
);
},
),
), ),
QuillToolbarToggleStyleButton( QuillToolbarToggleStyleButton(
attribute: Attribute.italic, options: const QuillToolbarToggleStyleButtonOptions(),
controller: controller, controller: controller,
options: const QuillToolbarToggleStyleButtonOptions( attribute: Attribute.italic,
iconData: Icons.format_italic,
),
), ),
QuillToolbarToggleStyleButton( QuillToolbarToggleStyleButton(
attribute: Attribute.underline,
controller: controller, controller: controller,
options: const QuillToolbarToggleStyleButtonOptions( attribute: Attribute.underline,
iconData: Icons.format_underline,
iconSize: 20,
),
), ),
QuillToolbarClearFormatButton( QuillToolbarClearFormatButton(
controller: controller, controller: controller,
options: const QuillToolbarClearFormatButtonOptions(
iconData: Icons.format_clear,
), ),
const VerticalDivider(),
QuillToolbarImageButton(
controller: controller,
), ),
VerticalDivider( QuillToolbarCameraButton(
indent: 12, controller: controller,
endIndent: 12,
color: Colors.grey.shade400,
), ),
QuillToolbarSelectHeaderStyleButtons( QuillToolbarVideoButton(
controller: controller, controller: controller,
options: const QuillToolbarSelectHeaderStyleButtonsOptions(
iconSize: 20,
), ),
const VerticalDivider(),
QuillToolbarColorButton(
controller: controller,
isBackground: false,
), ),
QuillToolbarToggleStyleButton( QuillToolbarColorButton(
attribute: Attribute.ol,
controller: controller, controller: controller,
options: const QuillToolbarToggleStyleButtonOptions( isBackground: true,
iconData: Icons.format_list_numbered,
iconSize: 39,
), ),
const VerticalDivider(),
QuillToolbarSelectHeaderStyleButton(
controller: controller,
), ),
QuillToolbarToggleStyleButton( const VerticalDivider(),
attribute: Attribute.ul, QuillToolbarToggleCheckListButton(
controller: controller, controller: controller,
options: const QuillToolbarToggleStyleButtonOptions(
iconData: Icons.format_list_bulleted,
), ),
QuillToolbarToggleStyleButton(
controller: controller,
attribute: Attribute.list,
), ),
QuillToolbarToggleStyleButton( QuillToolbarToggleStyleButton(
attribute: Attribute.blockQuote,
controller: controller, controller: controller,
options: const QuillToolbarToggleStyleButtonOptions( attribute: Attribute.ul,
iconData: Icons.format_quote,
iconSize: 15,
), ),
QuillToolbarToggleStyleButton(
controller: controller,
attribute: Attribute.inlineCode,
), ),
VerticalDivider( QuillToolbarToggleStyleButton(
indent: 12, controller: controller,
endIndent: 12, attribute: Attribute.blockQuote,
color: Colors.grey.shade400,
), ),
QuillToolbarIndentButton( QuillToolbarIndentButton(
controller: controller, controller: controller,
isIncrease: true, isIncrease: true,
options: const QuillToolbarIndentButtonOptions( ),
iconData: Icons.format_indent_increase,
iconSize: 20,
)),
QuillToolbarIndentButton( QuillToolbarIndentButton(
controller: controller, controller: controller,
isIncrease: false, isIncrease: false,
options: const QuillToolbarIndentButtonOptions(
iconData: Icons.format_indent_decrease,
iconSize: 20,
),
), ),
const VerticalDivider(),
QuillToolbarLinkStyleButton(controller: controller),
]; ];
}, },
), ),

@ -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<SimpleScreen> createState() => _SimpleScreenState();
}
class _SimpleScreenState extends State<SimpleScreen> {
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),
),
),
),
],
),
);
}
}

@ -6,7 +6,7 @@ import '../../../models/config/toolbar/buttons/formula.dart';
class QuillToolbarFormulaButton extends StatelessWidget { class QuillToolbarFormulaButton extends StatelessWidget {
const QuillToolbarFormulaButton({ const QuillToolbarFormulaButton({
required this.controller, required this.controller,
required this.options, this.options = const QuillToolbarFormulaButtonOptions(),
super.key, super.key,
}); });
@ -91,7 +91,7 @@ class QuillToolbarFormulaButton extends StatelessWidget {
} }
return QuillToolbarIconButton( return QuillToolbarIconButton(
icon: Icon(iconData, size: iconSize * 1.77, color: iconColor), icon: Icon(iconData, size: iconSize * iconButtonFactor, color: iconColor),
tooltip: tooltip, tooltip: tooltip,
onPressed: () => _sharedOnPressed(context), onPressed: () => _sharedOnPressed(context),
isFilled: false, isFilled: false,

@ -14,7 +14,7 @@ import 'select_image_source.dart';
class QuillToolbarImageButton extends StatelessWidget { class QuillToolbarImageButton extends StatelessWidget {
const QuillToolbarImageButton({ const QuillToolbarImageButton({
required this.controller, required this.controller,
required this.options, this.options = const QuillToolbarImageButtonOptions(),
super.key, super.key,
}); });
@ -105,7 +105,7 @@ class QuillToolbarImageButton extends StatelessWidget {
return QuillToolbarIconButton( return QuillToolbarIconButton(
icon: Icon( icon: Icon(
iconData, iconData,
size: iconSize * 1.77, size: iconButtonFactor * iconSize,
color: iconColor, color: iconColor,
), ),
tooltip: tooltip, tooltip: tooltip,

@ -3,7 +3,7 @@ import 'package:flutter_quill/flutter_quill.dart'
show show
QuillController, QuillController,
QuillIconTheme, QuillIconTheme,
QuillProviderExt, QuillSimpleToolbarExt,
QuillToolbarBaseButtonOptions, QuillToolbarBaseButtonOptions,
QuillToolbarIconButton; QuillToolbarIconButton;
import 'package:flutter_quill/translations.dart'; import 'package:flutter_quill/translations.dart';
@ -17,7 +17,7 @@ import 'select_camera_action.dart';
class QuillToolbarCameraButton extends StatelessWidget { class QuillToolbarCameraButton extends StatelessWidget {
const QuillToolbarCameraButton({ const QuillToolbarCameraButton({
required this.controller, required this.controller,
required this.options, this.options = const QuillToolbarCameraButtonOptions(),
super.key, super.key,
}); });
@ -30,6 +30,13 @@ class QuillToolbarCameraButton extends StatelessWidget {
return iconSize ?? baseFontSize; return iconSize ?? baseFontSize;
} }
double _iconButtonFactor(BuildContext context) {
final baseIconFactor =
baseButtonExtraOptions(context).globalIconButtonFactor;
final iconButtonFactor = options.iconButtonFactor;
return iconButtonFactor ?? baseIconFactor;
}
VoidCallback? _afterButtonPressed(BuildContext context) { VoidCallback? _afterButtonPressed(BuildContext context) {
return options.afterButtonPressed ?? return options.afterButtonPressed ??
baseButtonExtraOptions(context).afterButtonPressed; baseButtonExtraOptions(context).afterButtonPressed;
@ -69,6 +76,7 @@ class QuillToolbarCameraButton extends StatelessWidget {
final tooltip = _tooltip(context); final tooltip = _tooltip(context);
final iconSize = _iconSize(context); final iconSize = _iconSize(context);
final iconData = _iconData(context); final iconData = _iconData(context);
final iconButtonFactor = _iconButtonFactor(context);
final childBuilder = final childBuilder =
options.childBuilder ?? baseButtonExtraOptions(context).childBuilder; options.childBuilder ?? baseButtonExtraOptions(context).childBuilder;
@ -80,7 +88,7 @@ class QuillToolbarCameraButton extends StatelessWidget {
iconData: options.iconData, iconData: options.iconData,
fillColor: options.fillColor, fillColor: options.fillColor,
iconSize: options.iconSize, iconSize: options.iconSize,
iconButtonFactor: options.iconButtonFactor, iconButtonFactor: iconButtonFactor,
iconTheme: options.iconTheme, iconTheme: options.iconTheme,
tooltip: options.tooltip, tooltip: options.tooltip,
cameraConfigurations: options.cameraConfigurations, cameraConfigurations: options.cameraConfigurations,
@ -98,7 +106,7 @@ class QuillToolbarCameraButton extends StatelessWidget {
final iconColor = iconTheme?.iconUnselectedColor ?? theme.iconTheme.color; final iconColor = iconTheme?.iconUnselectedColor ?? theme.iconTheme.color;
return QuillToolbarIconButton( return QuillToolbarIconButton(
icon: Icon(iconData, size: iconSize * 1.77, color: iconColor), icon: Icon(iconData, size: iconButtonFactor * iconSize, color: iconColor),
tooltip: tooltip, tooltip: tooltip,
isFilled: false, isFilled: false,
// isDesktop(supportWeb: false) ? null : // isDesktop(supportWeb: false) ? null :
@ -114,7 +122,8 @@ class QuillToolbarCameraButton extends StatelessWidget {
} }
final cameraAction = await showDialog<CameraAction>( final cameraAction = await showDialog<CameraAction>(
context: context, context: context,
builder: (ctx) => const SelectCameraActionDialog(), builder: (ctx) => const FlutterQuillLocalizationsWidget(
child: SelectCameraActionDialog()),
); );
return cameraAction; return cameraAction;

@ -20,7 +20,7 @@
// class QuillToolbarMediaButton extends StatelessWidget { // class QuillToolbarMediaButton extends StatelessWidget {
// QuillToolbarMediaButton({ // QuillToolbarMediaButton({
// required this.controller, // required this.controller,
// required this.options, // this.options,
// super.key, // super.key,
// }) : assert(options.type == QuillMediaType.image, // }) : assert(options.type == QuillMediaType.image,
// 'Video selection is not supported yet'); // 'Video selection is not supported yet');
@ -135,7 +135,7 @@
// tooltip: tooltip, // tooltip: tooltip,
// highlightElevation: 0, // highlightElevation: 0,
// hoverElevation: 0, // hoverElevation: 0,
// size: iconSize * 1.77, // size: iconSize * iconButtonFactor,
// fillColor: iconFillColor, // fillColor: iconFillColor,
// borderRadius: iconTheme?.borderRadius ?? 2, // borderRadius: iconTheme?.borderRadius ?? 2,
// onPressed: () => _sharedOnPressed(context), // onPressed: () => _sharedOnPressed(context),

@ -52,7 +52,8 @@ Future<InsertVideoSource?> showSelectVideoSourceDialog({
showDragHandle: true, showDragHandle: true,
context: context, context: context,
constraints: const BoxConstraints(maxWidth: 640), constraints: const BoxConstraints(maxWidth: 640),
builder: (context) => const SelectVideoSourceDialog(), builder: (context) =>
const FlutterQuillLocalizationsWidget(child: SelectVideoSourceDialog()),
); );
return imageSource; return imageSource;
} }

@ -13,8 +13,8 @@ import 'select_video_source.dart';
class QuillToolbarVideoButton extends StatelessWidget { class QuillToolbarVideoButton extends StatelessWidget {
const QuillToolbarVideoButton({ const QuillToolbarVideoButton({
required this.options,
required this.controller, required this.controller,
this.options = const QuillToolbarVideoButtonOptions(),
super.key, super.key,
}); });
@ -28,6 +28,13 @@ class QuillToolbarVideoButton extends StatelessWidget {
return iconSize ?? baseFontSize; return iconSize ?? baseFontSize;
} }
double _iconButtonFactor(BuildContext context) {
final baseIconFactor =
baseButtonExtraOptions(context).globalIconButtonFactor;
final iconButtonFactor = options.iconButtonFactor;
return iconButtonFactor ?? baseIconFactor;
}
VoidCallback? _afterButtonPressed(BuildContext context) { VoidCallback? _afterButtonPressed(BuildContext context) {
return options.afterButtonPressed ?? return options.afterButtonPressed ??
baseButtonExtraOptions(context).afterButtonPressed; baseButtonExtraOptions(context).afterButtonPressed;
@ -67,6 +74,7 @@ class QuillToolbarVideoButton extends StatelessWidget {
final tooltip = _tooltip(context); final tooltip = _tooltip(context);
final iconSize = _iconSize(context); final iconSize = _iconSize(context);
final iconButtonFactor = _iconButtonFactor(context);
final iconData = _iconData(context); final iconData = _iconData(context);
final childBuilder = final childBuilder =
options.childBuilder ?? baseButtonExtraOptions(context).childBuilder; options.childBuilder ?? baseButtonExtraOptions(context).childBuilder;
@ -83,7 +91,7 @@ class QuillToolbarVideoButton extends StatelessWidget {
dialogTheme: options.dialogTheme, dialogTheme: options.dialogTheme,
fillColor: iconFillColor, fillColor: iconFillColor,
iconSize: options.iconSize, iconSize: options.iconSize,
iconButtonFactor: options.iconButtonFactor, iconButtonFactor: iconButtonFactor,
linkRegExp: options.linkRegExp, linkRegExp: options.linkRegExp,
tooltip: options.tooltip, tooltip: options.tooltip,
iconTheme: options.iconTheme, iconTheme: options.iconTheme,
@ -98,7 +106,7 @@ class QuillToolbarVideoButton extends StatelessWidget {
} }
return QuillToolbarIconButton( return QuillToolbarIconButton(
icon: Icon(iconData, size: iconSize * 1.77, color: iconColor), icon: Icon(iconData, size: iconSize * iconButtonFactor, color: iconColor),
tooltip: tooltip, tooltip: tooltip,
isFilled: false, isFilled: false,
onPressed: () => _sharedOnPressed(context), onPressed: () => _sharedOnPressed(context),

@ -1,6 +1,6 @@
library flutter_quill; 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/quill_configurations.dart';
export 'src/models/config/raw_editor/configurations.dart'; export 'src/models/config/raw_editor/configurations.dart';
export 'src/models/config/toolbar/toolbar_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/raw_editor/raw_editor_state.dart';
export 'src/widgets/style_widgets/style_widgets.dart'; export 'src/widgets/style_widgets/style_widgets.dart';
export 'src/widgets/toolbar/base_toolbar.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/toolbar/simple_toolbar.dart';
export 'src/widgets/utils/provider.dart'; export 'src/widgets/utils/provider.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;
}
}

@ -1,7 +1,7 @@
import 'package:flutter/widgets.dart' show BuildContext; import 'package:flutter/widgets.dart' show BuildContext;
import '../../flutter_quill.dart' show QuillController, QuillProvider; import '../../flutter_quill.dart' show QuillController;
import 'quill_provider.dart'; import 'quill_configurations_ext.dart';
extension QuillControllerNullableExt on QuillController? { extension QuillControllerNullableExt on QuillController? {
/// Simple logic to use the current passed controller if not null /// Simple logic to use the current passed controller if not 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;
}
}

@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import '../../extensions/quill_provider.dart'; import '../../extensions/quill_configurations_ext.dart';
import '../extensions/localizations.dart'; import '../extensions/localizations.dart';
class FlutterQuillLocalizationsWidget extends StatelessWidget { class FlutterQuillLocalizationsWidget extends StatelessWidget {

@ -15,6 +15,7 @@ import '../../../widgets/others/embeds.dart';
import '../../../widgets/others/link.dart'; import '../../../widgets/others/link.dart';
import '../../../widgets/raw_editor/raw_editor.dart'; import '../../../widgets/raw_editor/raw_editor.dart';
import '../../themes/quill_dialog_theme.dart'; import '../../themes/quill_dialog_theme.dart';
import '../quill_shared_configurations.dart';
import 'element_options.dart'; import 'element_options.dart';
export '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. /// When editing this class please update the [copyWith] function too.
const QuillEditorConfigurations({ const QuillEditorConfigurations({
required this.controller, required this.controller,
this.sharedConfigurations = const QuillSharedConfigurations(),
this.scrollable = true, this.scrollable = true,
this.padding = EdgeInsets.zero, this.padding = EdgeInsets.zero,
this.autoFocus = false, this.autoFocus = false,
@ -76,6 +78,8 @@ class QuillEditorConfigurations extends Equatable {
this.textInputAction = TextInputAction.newline, this.textInputAction = TextInputAction.newline,
}); });
final QuillSharedConfigurations sharedConfigurations;
final QuillController controller; final QuillController controller;
/// The text placeholder in the quill editor /// The text placeholder in the quill editor

@ -3,7 +3,7 @@ import 'package:equatable/equatable.dart';
import 'package:flutter/foundation.dart' show VoidCallback, immutable; import 'package:flutter/foundation.dart' show VoidCallback, immutable;
import 'package:flutter/widgets.dart' show BuildContext, IconData, Widget; 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 '../../../themes/quill_icon_theme.dart' show QuillIconTheme;
import '../../quill_configurations.dart' import '../../quill_configurations.dart'
show kDefaultIconSize, kIconButtonFactor; show kDefaultIconSize, kIconButtonFactor;

@ -20,7 +20,6 @@ class QuillToolbarHistoryButtonExtraOptions
class QuillToolbarHistoryButtonOptions extends QuillToolbarBaseButtonOptions< class QuillToolbarHistoryButtonOptions extends QuillToolbarBaseButtonOptions<
QuillToolbarHistoryButtonOptions, QuillToolbarHistoryButtonExtraOptions> { QuillToolbarHistoryButtonOptions, QuillToolbarHistoryButtonExtraOptions> {
const QuillToolbarHistoryButtonOptions({ const QuillToolbarHistoryButtonOptions({
required this.isUndo,
super.iconData, super.iconData,
super.controller, super.controller,
super.iconTheme, super.iconTheme,
@ -31,10 +30,6 @@ class QuillToolbarHistoryButtonOptions extends QuillToolbarBaseButtonOptions<
this.iconButtonFactor, 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] /// By default will use [globalIconSize]
final double? iconSize; final double? iconSize;
final double? iconButtonFactor; final double? iconButtonFactor;

@ -1,3 +1,4 @@
// ignore_for_file: public_member_api_docs, sort_constructors_first
import 'package:equatable/equatable.dart'; import 'package:equatable/equatable.dart';
import 'package:flutter/foundation.dart' show immutable; import 'package:flutter/foundation.dart' show immutable;
import 'package:flutter/widgets.dart' import 'package:flutter/widgets.dart'
@ -69,11 +70,13 @@ enum LinkStyleType {
class QuillSimpleToolbarConfigurations extends QuillSharedToolbarProperties { class QuillSimpleToolbarConfigurations extends QuillSharedToolbarProperties {
const QuillSimpleToolbarConfigurations({ const QuillSimpleToolbarConfigurations({
required this.controller, required this.controller,
super.sharedConfigurations,
super.toolbarSectionSpacing = kToolbarSectionSpacing, super.toolbarSectionSpacing = kToolbarSectionSpacing,
super.toolbarIconAlignment = WrapAlignment.center, super.toolbarIconAlignment = WrapAlignment.center,
super.toolbarIconCrossAlignment = WrapCrossAlignment.center, super.toolbarIconCrossAlignment = WrapCrossAlignment.center,
super.buttonOptions = const QuillToolbarButtonOptions(), super.buttonOptions = const QuillToolbarButtonOptions(),
this.customButtons = const [], this.customButtons = const [],
this.fontFamilyValues,
super.multiRowsDisplay = true, super.multiRowsDisplay = true,
this.fontSizesValues, this.fontSizesValues,
this.showDividers = true, this.showDividers = true,
@ -145,6 +148,8 @@ class QuillSimpleToolbarConfigurations extends QuillSharedToolbarProperties {
return buttonOptions.base.globalIconSize * 2; return buttonOptions.base.globalIconSize * 2;
} }
final Map<String, String>? fontFamilyValues;
final QuillController controller; final QuillController controller;
/// A widget that will placed between each button in the toolbar /// A widget that will placed between each button in the toolbar
@ -231,12 +236,8 @@ class QuillSimpleToolbarConfigurations extends QuillSharedToolbarProperties {
class QuillToolbarButtonOptions extends Equatable { class QuillToolbarButtonOptions extends Equatable {
const QuillToolbarButtonOptions({ const QuillToolbarButtonOptions({
this.base = const QuillToolbarBaseButtonOptions(), this.base = const QuillToolbarBaseButtonOptions(),
this.undoHistory = const QuillToolbarHistoryButtonOptions( this.undoHistory = const QuillToolbarHistoryButtonOptions(),
isUndo: true, this.redoHistory = const QuillToolbarHistoryButtonOptions(),
),
this.redoHistory = const QuillToolbarHistoryButtonOptions(
isUndo: false,
),
this.fontFamily = const QuillToolbarFontFamilyButtonOptions(), this.fontFamily = const QuillToolbarFontFamilyButtonOptions(),
this.fontSize = const QuillToolbarFontSizeButtonOptions(), this.fontSize = const QuillToolbarFontSizeButtonOptions(),
this.bold = const QuillToolbarToggleStyleButtonOptions(), this.bold = const QuillToolbarToggleStyleButtonOptions(),

@ -1,3 +1,4 @@
// ignore_for_file: public_member_api_docs, sort_constructors_first
import 'package:flutter/widgets.dart' import 'package:flutter/widgets.dart'
show Axis, WrapAlignment, WrapCrossAlignment, immutable; show Axis, WrapAlignment, WrapCrossAlignment, immutable;
@ -7,7 +8,7 @@ import 'toolbar_shared_configurations.dart';
@immutable @immutable
class QuillToolbarConfigurations extends QuillSharedToolbarProperties { class QuillToolbarConfigurations extends QuillSharedToolbarProperties {
const QuillToolbarConfigurations({ const QuillToolbarConfigurations({
required this.childrenBuilder, this.childrenBuilder,
super.axis = Axis.horizontal, super.axis = Axis.horizontal,
super.toolbarSize = kDefaultIconSize * 2, super.toolbarSize = kDefaultIconSize * 2,
super.toolbarSectionSpacing = kToolbarSectionSpacing, super.toolbarSectionSpacing = kToolbarSectionSpacing,
@ -25,8 +26,16 @@ class QuillToolbarConfigurations extends QuillSharedToolbarProperties {
super.buttonOptions = const QuillToolbarButtonOptions(), super.buttonOptions = const QuillToolbarButtonOptions(),
}); });
final QuillBaseToolbarChildrenBuilder childrenBuilder; final QuillBaseToolbarChildrenBuilder? childrenBuilder;
@override @override
List<Object?> get props => []; List<Object?> get props => [];
QuillToolbarConfigurations copyWith({
QuillBaseToolbarChildrenBuilder? childrenBuilder,
}) {
return QuillToolbarConfigurations(
childrenBuilder: childrenBuilder ?? this.childrenBuilder,
);
}
} }

@ -4,9 +4,11 @@ import 'package:flutter/widgets.dart'
import '../../../widgets/toolbar/base_toolbar.dart'; import '../../../widgets/toolbar/base_toolbar.dart';
import '../../structs/link_dialog_action.dart'; import '../../structs/link_dialog_action.dart';
import '../quill_shared_configurations.dart';
abstract class QuillSharedToolbarProperties extends Equatable { abstract class QuillSharedToolbarProperties extends Equatable {
const QuillSharedToolbarProperties({ const QuillSharedToolbarProperties({
this.sharedConfigurations = const QuillSharedConfigurations(),
this.toolbarSize, this.toolbarSize,
this.axis = Axis.horizontal, this.axis = Axis.horizontal,
this.toolbarSectionSpacing = kToolbarSectionSpacing, this.toolbarSectionSpacing = kToolbarSectionSpacing,
@ -53,4 +55,6 @@ abstract class QuillSharedToolbarProperties extends Equatable {
/// If you want change spesefic buttons or all of them /// If you want change spesefic buttons or all of them
/// then you came to the right place /// then you came to the right place
final QuillToolbarButtonOptions buttonOptions; final QuillToolbarButtonOptions buttonOptions;
final QuillSharedConfigurations sharedConfigurations;
} }

@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/rendering.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/attribute.dart';
import '../../models/documents/nodes/block.dart'; import '../../models/documents/nodes/block.dart';
import '../../models/documents/nodes/line.dart'; import '../../models/documents/nodes/line.dart';

@ -3,8 +3,10 @@ import 'package:flutter/material.dart';
import '../../../flutter_quill.dart' import '../../../flutter_quill.dart'
show QuillBaseToolbarProvider, defaultToolbarSize; show QuillBaseToolbarProvider, defaultToolbarSize;
import '../../l10n/widgets/localizations.dart'; import '../../l10n/widgets/localizations.dart';
import '../../models/config/toolbar/simple_toolbar_configurations.dart';
import '../../models/config/toolbar/toolbar_configurations.dart'; import '../../models/config/toolbar/toolbar_configurations.dart';
import 'buttons/arrow_indicated_list_button.dart'; import 'buttons/arrow_indicated_list_button.dart';
import 'simple_toolbar.dart';
export '../../models/config/toolbar/buttons/base_configurations.dart'; export '../../models/config/toolbar/buttons/base_configurations.dart';
export '../../models/config/toolbar/simple_toolbar_configurations.dart'; export '../../models/config/toolbar/simple_toolbar_configurations.dart';
@ -34,6 +36,13 @@ class QuillToolbar extends StatelessWidget implements PreferredSizeWidget {
super.key, super.key,
}); });
static QuillSimpleToolbar simple(
QuillSimpleToolbarConfigurations configurations) {
return QuillSimpleToolbar(
configurations: configurations,
);
}
final QuillToolbarConfigurations configurations; final QuillToolbarConfigurations configurations;
// We can't get the modified [toolbarSize] by the developer // We can't get the modified [toolbarSize] by the developer
@ -60,7 +69,7 @@ class QuillToolbar extends StatelessWidget implements PreferredSizeWidget {
crossAxisAlignment: configurations.toolbarIconCrossAlignment, crossAxisAlignment: configurations.toolbarIconCrossAlignment,
runSpacing: 4, runSpacing: 4,
spacing: configurations.toolbarSectionSpacing, spacing: configurations.toolbarSectionSpacing,
children: configurations.childrenBuilder(context), children: configurations.childrenBuilder?.call(context) ?? [],
); );
} }
return Container( return Container(
@ -77,7 +86,7 @@ class QuillToolbar extends StatelessWidget implements PreferredSizeWidget {
), ),
child: QuillToolbarArrowIndicatedButtonList( child: QuillToolbarArrowIndicatedButtonList(
axis: configurations.axis, axis: configurations.axis,
buttons: configurations.childrenBuilder(context), buttons: configurations.childrenBuilder?.call(context) ?? [],
), ),
); );
}, },

@ -1,6 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../../extensions/quill_provider.dart'; import '../../../extensions/quill_configurations_ext.dart';
import '../../../l10n/extensions/localizations.dart'; import '../../../l10n/extensions/localizations.dart';
import '../../../models/documents/attribute.dart'; import '../../../models/documents/attribute.dart';
import '../../../models/themes/quill_icon_theme.dart'; import '../../../models/themes/quill_icon_theme.dart';
@ -10,7 +10,7 @@ import '../base_toolbar.dart';
class QuillToolbarClearFormatButton extends StatelessWidget { class QuillToolbarClearFormatButton extends StatelessWidget {
const QuillToolbarClearFormatButton({ const QuillToolbarClearFormatButton({
required QuillController controller, required QuillController controller,
required this.options, this.options = const QuillToolbarClearFormatButtonOptions(),
super.key, super.key,
}) : _controller = controller; }) : _controller = controller;

@ -1,6 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../../../extensions/quill_provider.dart'; import '../../../../extensions/quill_configurations_ext.dart';
import '../../../../l10n/extensions/localizations.dart'; import '../../../../l10n/extensions/localizations.dart';
import '../../../../l10n/widgets/localizations.dart'; import '../../../../l10n/widgets/localizations.dart';
import '../../../../models/documents/attribute.dart'; import '../../../../models/documents/attribute.dart';
@ -196,9 +196,10 @@ class QuillToolbarColorButtonState extends State<QuillToolbarColorButton> {
return IconButton( return IconButton(
tooltip: tooltip, tooltip: tooltip,
iconSize: iconSize * iconButtonFactor, iconSize: iconSize * iconButtonFactor,
icon: Icon(iconData, icon: Icon(
size: iconSize, iconData,
color: widget.isBackground ? iconColorBackground : iconColor), color: widget.isBackground ? iconColorBackground : iconColor,
),
onPressed: _showColorPicker, onPressed: _showColorPicker,
); );
} }

@ -1,14 +1,14 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../../extensions/quill_provider.dart'; import '../../../extensions/quill_configurations_ext.dart';
import '../../../models/themes/quill_icon_theme.dart'; import '../../../models/themes/quill_icon_theme.dart';
import '../../others/controller.dart'; import '../../others/controller.dart';
import '../base_toolbar.dart'; import '../base_toolbar.dart';
class QuillToolbarCustomButton extends StatelessWidget { class QuillToolbarCustomButton extends StatelessWidget {
const QuillToolbarCustomButton({ const QuillToolbarCustomButton({
required this.options,
required this.controller, required this.controller,
this.options = const QuillToolbarCustomButtonOptions(),
super.key, super.key,
}); });

@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../../../extensions.dart'; import '../../../../extensions.dart';
import '../../../extensions/quill_provider.dart'; import '../../../extensions/quill_configurations_ext.dart';
import '../../../l10n/extensions/localizations.dart'; import '../../../l10n/extensions/localizations.dart';
import '../../../models/config/toolbar/buttons/font_family_configurations.dart'; import '../../../models/config/toolbar/buttons/font_family_configurations.dart';
import '../../../models/documents/attribute.dart'; import '../../../models/documents/attribute.dart';
@ -11,9 +11,9 @@ import '../../others/controller.dart';
class QuillToolbarFontFamilyButton extends StatefulWidget { class QuillToolbarFontFamilyButton extends StatefulWidget {
QuillToolbarFontFamilyButton({ QuillToolbarFontFamilyButton({
required this.options,
required this.controller, required this.controller,
required this.defaultDispalyText, required this.defaultDispalyText,
this.options = const QuillToolbarFontFamilyButtonOptions(),
super.key, super.key,
}) : assert(options.rawItemsMap?.isNotEmpty ?? (true)), }) : assert(options.rawItemsMap?.isNotEmpty ?? (true)),
assert( assert(
@ -86,8 +86,9 @@ class QuillToolbarFontFamilyButtonState
} }
Map<String, String> get rawItemsMap { Map<String, String> get rawItemsMap {
// context.requireQuillToolbarConfigurations.buttonOptions; final rawItemsMap =
final rawItemsMap = options.rawItemsMap ?? context.quillSimpleToolbarConfigurations?.fontFamilyValues ??
options.rawItemsMap ??
{ {
'Sans Serif': 'sans-serif', 'Sans Serif': 'sans-serif',
'Serif': 'serif', 'Serif': 'serif',

@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../../../extensions.dart'; import '../../../../extensions.dart';
import '../../../extensions/quill_provider.dart'; import '../../../extensions/quill_configurations_ext.dart';
import '../../../l10n/extensions/localizations.dart'; import '../../../l10n/extensions/localizations.dart';
import '../../../models/config/quill_configurations.dart'; import '../../../models/config/quill_configurations.dart';
import '../../../models/documents/attribute.dart'; import '../../../models/documents/attribute.dart';
@ -12,9 +12,9 @@ import '../../others/controller.dart';
class QuillToolbarFontSizeButton extends StatefulWidget { class QuillToolbarFontSizeButton extends StatefulWidget {
QuillToolbarFontSizeButton({ QuillToolbarFontSizeButton({
required this.options,
required this.controller, required this.controller,
required this.defaultDisplayText, required this.defaultDisplayText,
this.options = const QuillToolbarFontSizeButtonOptions(),
super.key, super.key,
}) : assert(options.rawItemsMap?.isNotEmpty ?? true), }) : assert(options.rawItemsMap?.isNotEmpty ?? true),
assert(options.initialValue == null || assert(options.initialValue == null ||
@ -43,7 +43,7 @@ class QuillToolbarFontSizeButtonState
Map<String, String> get rawItemsMap { Map<String, String> get rawItemsMap {
final fontSizes = options.rawItemsMap ?? final fontSizes = options.rawItemsMap ??
context.requireQuillToolbarConfigurations.fontSizesValues ?? context.quillSimpleToolbarConfigurations?.fontSizesValues ??
{ {
context.loc.small: 'small', context.loc.small: 'small',
context.loc.large: 'large', context.loc.large: 'large',
@ -112,10 +112,9 @@ class QuillToolbarFontSizeButtonState
} }
double get iconSize { double get iconSize {
final baseFontSize = final baseFontSize = context.quillToolbarBaseButtonOptions?.globalIconSize;
context.requireQuillToolbarBaseButtonOptions.globalIconSize;
final iconSize = options.iconSize; final iconSize = options.iconSize;
return iconSize ?? baseFontSize; return iconSize ?? baseFontSize ?? kDefaultIconSize;
} }
double get iconButtonFactor { double get iconButtonFactor {

@ -1,17 +1,22 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../../extensions/quill_provider.dart'; import '../../../extensions/quill_configurations_ext.dart';
import '../../../l10n/extensions/localizations.dart'; import '../../../l10n/extensions/localizations.dart';
import '../../others/controller.dart'; import '../../others/controller.dart';
import '../base_toolbar.dart'; import '../base_toolbar.dart';
class QuillToolbarHistoryButton extends StatefulWidget { class QuillToolbarHistoryButton extends StatefulWidget {
const QuillToolbarHistoryButton({ const QuillToolbarHistoryButton({
required this.options,
required this.controller, required this.controller,
required this.isUndo,
this.options = const QuillToolbarHistoryButtonOptions(),
super.key, super.key,
}); });
/// If this true then it will be the undo button
/// otherwise it will be redo
final bool isUndo;
final QuillToolbarHistoryButtonOptions options; final QuillToolbarHistoryButtonOptions options;
final QuillController controller; final QuillController controller;
@ -53,10 +58,10 @@ class QuillToolbarHistoryButtonState extends State<QuillToolbarHistoryButton> {
context.requireQuillToolbarBaseButtonOptions; context.requireQuillToolbarBaseButtonOptions;
final tooltip = options.tooltip ?? final tooltip = options.tooltip ??
baseButtonConfigurations.tooltip ?? baseButtonConfigurations.tooltip ??
(options.isUndo ? context.loc.undo : context.loc.redo); (widget.isUndo ? context.loc.undo : context.loc.redo);
final iconData = options.iconData ?? final iconData = options.iconData ??
baseButtonConfigurations.iconData ?? baseButtonConfigurations.iconData ??
(options.isUndo ? Icons.undo_outlined : Icons.redo_outlined); (widget.isUndo ? Icons.undo_outlined : Icons.redo_outlined);
final childBuilder = final childBuilder =
options.childBuilder ?? baseButtonConfigurations.childBuilder; options.childBuilder ?? baseButtonConfigurations.childBuilder;
final iconSize = final iconSize =
@ -71,7 +76,6 @@ class QuillToolbarHistoryButtonState extends State<QuillToolbarHistoryButton> {
if (childBuilder != null) { if (childBuilder != null) {
return childBuilder( return childBuilder(
QuillToolbarHistoryButtonOptions( QuillToolbarHistoryButtonOptions(
isUndo: options.isUndo,
afterButtonPressed: afterButtonPressed, afterButtonPressed: afterButtonPressed,
controller: controller, controller: controller,
iconData: iconData, iconData: iconData,
@ -115,7 +119,7 @@ class QuillToolbarHistoryButtonState extends State<QuillToolbarHistoryButton> {
} }
void _updateCanPressed() { void _updateCanPressed() {
if (options.isUndo) { if (widget.isUndo) {
_canPressed = controller.hasUndo; _canPressed = controller.hasUndo;
return; return;
} }
@ -123,7 +127,7 @@ class QuillToolbarHistoryButtonState extends State<QuillToolbarHistoryButton> {
} }
void _updateHistory() { void _updateHistory() {
if (options.isUndo) { if (widget.isUndo) {
if (controller.hasUndo) { if (controller.hasUndo) {
controller.undo(); controller.undo();
} }

@ -1,6 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../../extensions/quill_provider.dart'; import '../../../extensions/quill_configurations_ext.dart';
import '../../../l10n/extensions/localizations.dart'; import '../../../l10n/extensions/localizations.dart';
import '../../../models/config/toolbar/buttons/indent_configurations.dart'; import '../../../models/config/toolbar/buttons/indent_configurations.dart';
import '../../../models/themes/quill_icon_theme.dart'; import '../../../models/themes/quill_icon_theme.dart';
@ -12,7 +12,7 @@ class QuillToolbarIndentButton extends StatefulWidget {
const QuillToolbarIndentButton({ const QuillToolbarIndentButton({
required this.controller, required this.controller,
required this.isIncrease, required this.isIncrease,
required this.options, this.options = const QuillToolbarIndentButtonOptions(),
super.key, super.key,
}); });

@ -4,7 +4,7 @@ import 'package:url_launcher/link.dart';
import '../../../../extensions.dart' import '../../../../extensions.dart'
show UtilityWidgets, AutoFormatMultipleLinksRule; show UtilityWidgets, AutoFormatMultipleLinksRule;
import '../../../extensions/quill_provider.dart'; import '../../../extensions/quill_configurations_ext.dart';
import '../../../l10n/extensions/localizations.dart'; import '../../../l10n/extensions/localizations.dart';
import '../../../l10n/widgets/localizations.dart'; import '../../../l10n/widgets/localizations.dart';
import '../../../models/documents/attribute.dart'; import '../../../models/documents/attribute.dart';
@ -20,7 +20,7 @@ import '../base_toolbar.dart';
class QuillToolbarLinkStyleButton2 extends StatefulWidget { class QuillToolbarLinkStyleButton2 extends StatefulWidget {
QuillToolbarLinkStyleButton2({ QuillToolbarLinkStyleButton2({
required this.controller, required this.controller,
required this.options, this.options = const QuillToolbarLinkStyleButton2Options(),
super.key, super.key,
}) : assert(options.addLinkLabel == null || }) : assert(options.addLinkLabel == null ||
(options.addLinkLabel?.isNotEmpty ?? true)), (options.addLinkLabel?.isNotEmpty ?? true)),

@ -1,6 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../../extensions/quill_provider.dart'; import '../../../extensions/quill_configurations_ext.dart';
import '../../../l10n/extensions/localizations.dart'; import '../../../l10n/extensions/localizations.dart';
import '../../../l10n/widgets/localizations.dart'; import '../../../l10n/widgets/localizations.dart';
import '../../../models/documents/attribute.dart'; import '../../../models/documents/attribute.dart';
@ -15,7 +15,7 @@ import '../base_toolbar.dart';
class QuillToolbarLinkStyleButton extends StatefulWidget { class QuillToolbarLinkStyleButton extends StatefulWidget {
const QuillToolbarLinkStyleButton({ const QuillToolbarLinkStyleButton({
required this.controller, required this.controller,
required this.options, this.options = const QuillToolbarLinkStyleButtonOptions(),
super.key, super.key,
}); });

@ -1,6 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../../../extensions/quill_provider.dart'; import '../../../../extensions/quill_configurations_ext.dart';
import '../../../../l10n/extensions/localizations.dart'; import '../../../../l10n/extensions/localizations.dart';
import '../../../../l10n/widgets/localizations.dart'; import '../../../../l10n/widgets/localizations.dart';
import '../../../../models/themes/quill_dialog_theme.dart'; import '../../../../models/themes/quill_dialog_theme.dart';
@ -11,7 +11,7 @@ import '../../base_toolbar.dart';
class QuillToolbarSearchButton extends StatelessWidget { class QuillToolbarSearchButton extends StatelessWidget {
const QuillToolbarSearchButton({ const QuillToolbarSearchButton({
required QuillController controller, required QuillController controller,
required this.options, this.options = const QuillToolbarSearchButtonOptions(),
super.key, super.key,
}) : _controller = controller; }) : _controller = controller;

@ -20,7 +20,7 @@ enum _AlignmentOptions {
class QuillToolbarSelectAlignmentButtons extends StatelessWidget { class QuillToolbarSelectAlignmentButtons extends StatelessWidget {
const QuillToolbarSelectAlignmentButtons({ const QuillToolbarSelectAlignmentButtons({
required this.controller, required this.controller,
required this.options, this.options = const QuillToolbarSelectAlignmentButtonOptions(),
this.showLeftAlignment, this.showLeftAlignment,
this.showCenterAlignment, this.showCenterAlignment,
this.showRightAlignment, this.showRightAlignment,
@ -44,7 +44,6 @@ class QuillToolbarSelectAlignmentButtons extends StatelessWidget {
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: _AlignmentOptions.values children: _AlignmentOptions.values
.map((e) => QuillToolbarToggleStyleButton( .map((e) => QuillToolbarToggleStyleButton(
options: const QuillToolbarToggleStyleButtonOptions(),
controller: controller, controller: controller,
attribute: e.attribute, attribute: e.attribute,
)) ))

@ -14,7 +14,7 @@
// class QuillToolbarSelectAlignmentOldButtons extends StatefulWidget { // class QuillToolbarSelectAlignmentOldButtons extends StatefulWidget {
// const QuillToolbarSelectAlignmentOldButtons({ // const QuillToolbarSelectAlignmentOldButtons({
// required this.controller, // required this.controller,
// required this.options, // this.options,
// this.showLeftAlignment, // this.showLeftAlignment,
// this.showCenterAlignment, // this.showCenterAlignment,
// this.showRightAlignment, // this.showRightAlignment,

@ -15,7 +15,7 @@ enum _HeaderStyleOptions {
class QuillToolbarSelectHeaderStyleButton extends StatefulWidget { class QuillToolbarSelectHeaderStyleButton extends StatefulWidget {
const QuillToolbarSelectHeaderStyleButton({ const QuillToolbarSelectHeaderStyleButton({
required this.controller, required this.controller,
required this.options, this.options = const QuillToolbarSelectHeaderStyleButtonsOptions(),
super.key, super.key,
}); });

@ -2,7 +2,7 @@ import 'package:flutter/foundation.dart' show kIsWeb;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../../../extensions.dart'; import '../../../../extensions.dart';
import '../../../extensions/quill_provider.dart'; import '../../../extensions/quill_configurations_ext.dart';
import '../../../l10n/extensions/localizations.dart'; import '../../../l10n/extensions/localizations.dart';
import '../../../models/documents/attribute.dart'; import '../../../models/documents/attribute.dart';
import '../../../models/documents/style.dart'; import '../../../models/documents/style.dart';
@ -13,7 +13,7 @@ import '../base_toolbar.dart';
class QuillToolbarSelectHeaderStyleButtons extends StatefulWidget { class QuillToolbarSelectHeaderStyleButtons extends StatefulWidget {
const QuillToolbarSelectHeaderStyleButtons({ const QuillToolbarSelectHeaderStyleButtons({
required this.controller, required this.controller,
required this.options, this.options = const QuillToolbarSelectHeaderStyleButtonsOptions(),
super.key, super.key,
}); });
@ -88,8 +88,8 @@ class QuillToolbarSelectHeaderStyleButtonsState
Axis get axis { Axis get axis {
return options.axis ?? return options.axis ??
context.quillSimpleToolbarConfigurations?.axis ??
context.quillToolbarConfigurations?.axis ?? context.quillToolbarConfigurations?.axis ??
context.quillBaseToolbarConfigurations?.axis ??
(throw ArgumentError( (throw ArgumentError(
'There is no default value for the Axis of the toolbar')); 'There is no default value for the Axis of the toolbar'));
} }

@ -1,6 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../../extensions/quill_provider.dart'; import '../../../extensions/quill_configurations_ext.dart';
import '../../../l10n/extensions/localizations.dart'; import '../../../l10n/extensions/localizations.dart';
import '../../../models/config/toolbar/buttons/base_configurations.dart'; import '../../../models/config/toolbar/buttons/base_configurations.dart';
import '../../../models/config/toolbar/buttons/toggle_check_list_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 { class QuillToolbarToggleCheckListButton extends StatefulWidget {
const QuillToolbarToggleCheckListButton({ const QuillToolbarToggleCheckListButton({
required this.options,
required this.controller, required this.controller,
this.options = const QuillToolbarToggleCheckListButtonOptions(),
super.key, super.key,
}); });

@ -1,6 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../../extensions/quill_provider.dart'; import '../../../extensions/quill_configurations_ext.dart';
import '../../../l10n/extensions/localizations.dart'; import '../../../l10n/extensions/localizations.dart';
import '../../../models/documents/attribute.dart'; import '../../../models/documents/attribute.dart';
import '../../../models/documents/style.dart'; import '../../../models/documents/style.dart';
@ -23,9 +23,9 @@ typedef ToggleStyleButtonBuilder = Widget Function(
class QuillToolbarToggleStyleButton extends StatefulWidget { class QuillToolbarToggleStyleButton extends StatefulWidget {
const QuillToolbarToggleStyleButton({ const QuillToolbarToggleStyleButton({
required this.options,
required this.controller, required this.controller,
required this.attribute, required this.attribute,
this.options = const QuillToolbarToggleStyleButtonOptions(),
super.key, super.key,
}); });
@ -62,10 +62,9 @@ class QuillToolbarToggleStyleButtonState
} }
double get iconSize { double get iconSize {
final baseFontSize = final baseFontSize = context.quillToolbarBaseButtonOptions?.globalIconSize;
context.requireQuillToolbarBaseButtonOptions.globalIconSize;
final iconSize = options.iconSize; final iconSize = options.iconSize;
return iconSize ?? baseFontSize; return iconSize ?? baseFontSize ?? kDefaultIconSize;
} }
double get iconButtonFactor { double get iconButtonFactor {

@ -1,6 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../extensions/quill_provider.dart'; import '../../extensions/quill_configurations_ext.dart';
import '../../l10n/extensions/localizations.dart'; import '../../l10n/extensions/localizations.dart';
import '../../models/config/toolbar/toolbar_configurations.dart'; import '../../models/config/toolbar/toolbar_configurations.dart';
import '../../models/documents/attribute.dart'; import '../../models/documents/attribute.dart';
@ -67,7 +67,7 @@ class QuillSimpleToolbar extends StatelessWidget
toolbarSize: configurations.toolbarSize, toolbarSize: configurations.toolbarSize,
childrenBuilder: (context) { childrenBuilder: (context) {
final toolbarConfigurations = final toolbarConfigurations =
context.requireQuillToolbarConfigurations; context.requireQuillSimpleToolbarConfigurations;
final globalIconSize = final globalIconSize =
toolbarConfigurations.buttonOptions.base.globalIconSize; toolbarConfigurations.buttonOptions.base.globalIconSize;
@ -81,6 +81,7 @@ class QuillSimpleToolbar extends StatelessWidget
return [ return [
if (configurations.showUndo) ...[ if (configurations.showUndo) ...[
QuillToolbarHistoryButton( QuillToolbarHistoryButton(
isUndo: true,
options: toolbarConfigurations.buttonOptions.undoHistory, options: toolbarConfigurations.buttonOptions.undoHistory,
controller: toolbarConfigurations controller: toolbarConfigurations
.buttonOptions.undoHistory.controller ?? .buttonOptions.undoHistory.controller ??
@ -90,6 +91,7 @@ class QuillSimpleToolbar extends StatelessWidget
], ],
if (configurations.showRedo) ...[ if (configurations.showRedo) ...[
QuillToolbarHistoryButton( QuillToolbarHistoryButton(
isUndo: false,
options: toolbarConfigurations.buttonOptions.redoHistory, options: toolbarConfigurations.buttonOptions.redoHistory,
controller: toolbarConfigurations controller: toolbarConfigurations
.buttonOptions.redoHistory.controller ?? .buttonOptions.redoHistory.controller ??

@ -5,65 +5,6 @@ import 'package:flutter/widgets.dart'
import '../../models/config/quill_configurations.dart'; import '../../models/config/quill_configurations.dart';
import '../../models/config/toolbar/toolbar_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<QuillProvider>();
}
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 { class QuillToolbarProvider extends InheritedWidget {
const QuillToolbarProvider({ const QuillToolbarProvider({
required super.child, required super.child,

Loading…
Cancel
Save