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. 128
      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. 31
      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.
## 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`

@ -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<QuillScreen> {
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<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({
required this.controller,
required this.focusNode,
required this.sharedConfigurations,
super.key,
});
final QuillController controller;
final FocusNode focusNode;
// TODO: Use it
final QuillSharedConfigurations sharedConfigurations;
Future<void> 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<SettingsCubit>().updateSettings(
state.copyWith(useCustomQuillToolbar: false));
},
onPressed: () => context
.read<SettingsCubit>()
.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),
];
},
),

@ -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 {
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,

@ -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,

@ -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<CameraAction>(
context: context,
builder: (ctx) => const SelectCameraActionDialog(),
builder: (ctx) => const FlutterQuillLocalizationsWidget(
child: SelectCameraActionDialog()),
);
return cameraAction;

@ -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),

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

@ -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),

@ -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';

@ -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 '../../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

@ -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/widgets.dart';
import '../../extensions/quill_provider.dart';
import '../../extensions/quill_configurations_ext.dart';
import '../extensions/localizations.dart';
class FlutterQuillLocalizationsWidget extends StatelessWidget {

@ -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

@ -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;

@ -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;

@ -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<String, String>? 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(),

@ -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<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 '../../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;
}

@ -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';

@ -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) ?? [],
),
);
},

@ -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;

@ -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<QuillToolbarColorButton> {
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,
);
}

@ -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,
});

@ -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<String, String> 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;
}

@ -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<String, String> 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 {

@ -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<QuillToolbarHistoryButton> {
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<QuillToolbarHistoryButton> {
if (childBuilder != null) {
return childBuilder(
QuillToolbarHistoryButtonOptions(
isUndo: options.isUndo,
afterButtonPressed: afterButtonPressed,
controller: controller,
iconData: iconData,
@ -115,7 +119,7 @@ class QuillToolbarHistoryButtonState extends State<QuillToolbarHistoryButton> {
}
void _updateCanPressed() {
if (options.isUndo) {
if (widget.isUndo) {
_canPressed = controller.hasUndo;
return;
}
@ -123,7 +127,7 @@ class QuillToolbarHistoryButtonState extends State<QuillToolbarHistoryButton> {
}
void _updateHistory() {
if (options.isUndo) {
if (widget.isUndo) {
if (controller.hasUndo) {
controller.undo();
}

@ -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,
});

@ -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)),

@ -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,
});

@ -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;

@ -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,
))

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

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

@ -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'));
}

@ -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,
});

@ -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 {

@ -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 ??

@ -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<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 {
const QuillToolbarProvider({
required super.child,

Loading…
Cancel
Save