pull/1566/head
Ellet 1 year ago
parent 0c4c6cd775
commit 9727fea996
No known key found for this signature in database
GPG Key ID: C488CC70BBCEF0D1
  1. 6
      CHANGELOG.md
  2. 1
      example/lib/presentation/quill/quill_screen.dart
  3. 188
      example/lib/presentation/quill/quill_toolbar.dart
  4. 2
      example/pubspec.yaml
  5. 11
      flutter_quill_extensions/lib/embeds/others/camera_button/camera_button.dart
  6. 56
      flutter_quill_extensions/lib/embeds/others/camera_button/select_camera_action.dart
  7. 1
      flutter_quill_extensions/pubspec.yaml
  8. 26
      lib/src/models/config/toolbar/toolbar_configurations.dart
  9. 82
      lib/src/widgets/toolbar/base_toolbar.dart
  10. 831
      lib/src/widgets/toolbar/simple_toolbar.dart
  11. 2
      version.dart

@ -2,9 +2,15 @@
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-5
* The `QuillToolbar` is now accepting only `child` with no configurations so you can customize everything you wants, the `QuillToolbar.simple()` or `QuillSimpleToolbar` implements a simple toolbar that is based on `QuillToolbar`, you are free to use it but it just an example and not standard
* Flutter Quill Extensions:
* Improve the camera button
## 9.0.0-dev-4 ## 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 * 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` * Toolbar buttons fixes in both `flutter_quill` and `flutter_quill_extensions`
* The `QuillProvider` has been dropped and no longer used, the providers will be used only internally from now on and we will not using them as much as possible
## 9.0.0-dev-3 ## 9.0.0-dev-3
* Breaking Changes: * Breaking Changes:

@ -106,7 +106,6 @@ class _QuillScreenState extends State<QuillScreen> {
MyQuillToolbar( MyQuillToolbar(
controller: _controller, controller: _controller,
focusNode: _editorFocusNode, focusNode: _editorFocusNode,
sharedConfigurations: _sharedConfigurations,
), ),
Builder( Builder(
builder: (context) { builder: (context) {

@ -17,14 +17,11 @@ 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,
@ -104,105 +101,106 @@ 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: 20 * 2,
multiRowsDisplay: false,
buttonOptions: const QuillToolbarButtonOptions( buttonOptions: const QuillToolbarButtonOptions(
base: QuillToolbarBaseButtonOptions( base: QuillToolbarBaseButtonOptions(
globalIconSize: 20, globalIconSize: 20,
globalIconButtonFactor: 1.4, globalIconButtonFactor: 1.4,
), ),
), ),
childrenBuilder: (context) { child: SingleChildScrollView(
return [ scrollDirection: Axis.horizontal,
IconButton( child: Row(
onPressed: () => context children: [
.read<SettingsCubit>() IconButton(
.updateSettings( onPressed: () => context
state.copyWith(useCustomQuillToolbar: false)), .read<SettingsCubit>()
icon: const Icon( .updateSettings(
Icons.width_normal, state.copyWith(useCustomQuillToolbar: false)),
icon: const Icon(
Icons.width_normal,
),
), ),
), QuillToolbarHistoryButton(
QuillToolbarHistoryButton( isUndo: true,
isUndo: true, controller: controller,
controller: controller, ),
), QuillToolbarHistoryButton(
QuillToolbarHistoryButton( isUndo: false,
isUndo: false, controller: controller,
controller: controller, ),
), QuillToolbarToggleStyleButton(
QuillToolbarToggleStyleButton( options: const QuillToolbarToggleStyleButtonOptions(),
options: const QuillToolbarToggleStyleButtonOptions(), controller: controller,
controller: controller, attribute: Attribute.bold,
attribute: Attribute.bold, ),
), QuillToolbarToggleStyleButton(
QuillToolbarToggleStyleButton( options: const QuillToolbarToggleStyleButtonOptions(),
options: const QuillToolbarToggleStyleButtonOptions(), controller: controller,
controller: controller, attribute: Attribute.italic,
attribute: Attribute.italic, ),
), QuillToolbarToggleStyleButton(
QuillToolbarToggleStyleButton( controller: controller,
controller: controller, attribute: Attribute.underline,
attribute: Attribute.underline, ),
), QuillToolbarClearFormatButton(
QuillToolbarClearFormatButton( controller: controller,
controller: controller, ),
), const VerticalDivider(),
const VerticalDivider(), QuillToolbarImageButton(
QuillToolbarImageButton( controller: controller,
controller: controller, ),
), QuillToolbarCameraButton(
QuillToolbarCameraButton( controller: controller,
controller: controller, ),
), QuillToolbarVideoButton(
QuillToolbarVideoButton( controller: controller,
controller: controller, ),
), const VerticalDivider(),
const VerticalDivider(), QuillToolbarColorButton(
QuillToolbarColorButton( controller: controller,
controller: controller, isBackground: false,
isBackground: false, ),
), QuillToolbarColorButton(
QuillToolbarColorButton( controller: controller,
controller: controller, isBackground: true,
isBackground: true, ),
), const VerticalDivider(),
const VerticalDivider(), QuillToolbarSelectHeaderStyleButton(
QuillToolbarSelectHeaderStyleButton( controller: controller,
controller: controller, ),
), const VerticalDivider(),
const VerticalDivider(), QuillToolbarToggleCheckListButton(
QuillToolbarToggleCheckListButton( controller: controller,
controller: controller, ),
), QuillToolbarToggleStyleButton(
QuillToolbarToggleStyleButton( controller: controller,
controller: controller, attribute: Attribute.ol,
attribute: Attribute.list, ),
), QuillToolbarToggleStyleButton(
QuillToolbarToggleStyleButton( controller: controller,
controller: controller, attribute: Attribute.ul,
attribute: Attribute.ul, ),
), QuillToolbarToggleStyleButton(
QuillToolbarToggleStyleButton( controller: controller,
controller: controller, attribute: Attribute.inlineCode,
attribute: Attribute.inlineCode, ),
), QuillToolbarToggleStyleButton(
QuillToolbarToggleStyleButton( controller: controller,
controller: controller, attribute: Attribute.blockQuote,
attribute: Attribute.blockQuote, ),
), QuillToolbarIndentButton(
QuillToolbarIndentButton( controller: controller,
controller: controller, isIncrease: true,
isIncrease: true, ),
), QuillToolbarIndentButton(
QuillToolbarIndentButton( controller: controller,
controller: controller, isIncrease: false,
isIncrease: false, ),
), const VerticalDivider(),
const VerticalDivider(), QuillToolbarLinkStyleButton(controller: controller),
QuillToolbarLinkStyleButton(controller: controller), ],
]; ),
}, ),
), ),
); );
} }

@ -24,8 +24,6 @@ dependencies:
cross_file: ^0.3.3+6 cross_file: ^0.3.3+6
cached_network_image: ^3.3.0 cached_network_image: ^3.3.0
gal_linux: ^0.0.1-dev
# Bloc libraries # Bloc libraries
bloc: ^8.1.2 bloc: ^8.1.2
flutter_bloc: ^8.1.3 flutter_bloc: ^8.1.3

@ -120,10 +120,8 @@ class QuillToolbarCameraButton extends StatelessWidget {
if (customCallback != null) { if (customCallback != null) {
return await customCallback(context); return await customCallback(context);
} }
final cameraAction = await showDialog<CameraAction>( final cameraAction = await showSelectCameraActionDialog(
context: context, context: context,
builder: (ctx) => const FlutterQuillLocalizationsWidget(
child: SelectCameraActionDialog()),
); );
return cameraAction; return cameraAction;
@ -171,12 +169,5 @@ class QuillToolbarCameraButton extends StatelessWidget {
await options.cameraConfigurations.onImageInsertedCallback await options.cameraConfigurations.onImageInsertedCallback
?.call(imageFile.path); ?.call(imageFile.path);
} }
// final file = await switch (cameraAction) {
// CameraAction.image =>
// imagePickerService.pickImage(source: ImageSource.camera),
// CameraAction.video =>
// imagePickerService.pickVideo(source: ImageSource.camera),
// };
} }
} }

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_quill/extensions.dart';
import 'package:flutter_quill/translations.dart'; import 'package:flutter_quill/translations.dart';
import 'camera_types.dart'; import 'camera_types.dart';
@ -8,27 +9,46 @@ class SelectCameraActionDialog extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return AlertDialog( return SizedBox(
contentPadding: EdgeInsets.zero, height: 150,
content: Column( width: double.infinity,
mainAxisSize: MainAxisSize.min, child: SingleChildScrollView(
children: [ child: Column(
TextButton.icon( children: [
icon: const Icon( ListTile(
Icons.camera, title: Text(context.loc.photo),
subtitle: Text(
context.loc.takeAPhotoUsingYourCamera,
),
leading: const Icon(Icons.photo_sharp),
enabled: !isDesktop(supportWeb: false),
onTap: () => Navigator.of(context).pop(CameraAction.image),
), ),
label: Text(context.loc.photo), ListTile(
onPressed: () => Navigator.pop(context, CameraAction.image), title: Text(context.loc.video),
), subtitle: Text(
TextButton.icon( context.loc.recordAVideoUsingYourCamera,
icon: const Icon( ),
Icons.video_call, leading: const Icon(Icons.camera),
enabled: !isDesktop(supportWeb: false),
onTap: () => Navigator.of(context).pop(CameraAction.video),
), ),
label: Text(context.loc.video), ],
onPressed: () => Navigator.pop(context, CameraAction.video), ),
)
],
), ),
); );
} }
} }
Future<CameraAction?> showSelectCameraActionDialog({
required BuildContext context,
}) async {
final imageSource = await showModalBottomSheet<CameraAction>(
showDragHandle: true,
context: context,
constraints: const BoxConstraints(maxWidth: 640),
builder: (context) => const FlutterQuillLocalizationsWidget(
child: SelectCameraActionDialog()),
);
return imageSource;
}

@ -44,6 +44,7 @@ dependencies:
url_launcher: ^6.2.1 url_launcher: ^6.2.1
super_clipboard: ^0.7.3 super_clipboard: ^0.7.3
gal: ^2.1.3 gal: ^2.1.3
gal_linux: ^0.0.1-dev-3
image_picker: ^1.0.4 image_picker: ^1.0.4
dev_dependencies: dev_dependencies:

@ -1,6 +1,6 @@
// ignore_for_file: public_member_api_docs, sort_constructors_first // 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, Widget, WrapAlignment, WrapCrossAlignment, immutable;
import '../../../widgets/toolbar/base_toolbar.dart'; import '../../../widgets/toolbar/base_toolbar.dart';
import 'toolbar_shared_configurations.dart'; import 'toolbar_shared_configurations.dart';
@ -8,34 +8,16 @@ import 'toolbar_shared_configurations.dart';
@immutable @immutable
class QuillToolbarConfigurations extends QuillSharedToolbarProperties { class QuillToolbarConfigurations extends QuillSharedToolbarProperties {
const QuillToolbarConfigurations({ const QuillToolbarConfigurations({
this.childrenBuilder, required this.child,
super.axis = Axis.horizontal, super.sharedConfigurations,
super.toolbarSize = kDefaultIconSize * 2,
super.toolbarSectionSpacing = kToolbarSectionSpacing,
super.toolbarIconAlignment = WrapAlignment.center,
super.toolbarIconCrossAlignment = WrapCrossAlignment.center,
super.color,
super.sectionDividerColor,
super.sectionDividerSpace,
super.linkDialogAction,
super.multiRowsDisplay = true,
super.decoration,
/// Note this only used when you using the quill toolbar buttons like /// Note this only used when you using the quill toolbar buttons like
/// `QuillToolbarHistoryButton` inside it /// `QuillToolbarHistoryButton` inside it
super.buttonOptions = const QuillToolbarButtonOptions(), super.buttonOptions = const QuillToolbarButtonOptions(),
}); });
final QuillBaseToolbarChildrenBuilder? childrenBuilder; final Widget child;
@override @override
List<Object?> get props => []; List<Object?> get props => [];
QuillToolbarConfigurations copyWith({
QuillBaseToolbarChildrenBuilder? childrenBuilder,
}) {
return QuillToolbarConfigurations(
childrenBuilder: childrenBuilder ?? this.childrenBuilder,
);
}
} }

@ -5,7 +5,6 @@ import '../../../flutter_quill.dart'
import '../../l10n/widgets/localizations.dart'; import '../../l10n/widgets/localizations.dart';
import '../../models/config/toolbar/simple_toolbar_configurations.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 'simple_toolbar.dart'; import 'simple_toolbar.dart';
export '../../models/config/toolbar/buttons/base_configurations.dart'; export '../../models/config/toolbar/buttons/base_configurations.dart';
@ -56,90 +55,11 @@ class QuillToolbar extends StatelessWidget implements PreferredSizeWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final toolbarSize = configurations.toolbarSize;
return FlutterQuillLocalizationsWidget( return FlutterQuillLocalizationsWidget(
child: QuillBaseToolbarProvider( child: QuillBaseToolbarProvider(
toolbarConfigurations: configurations, toolbarConfigurations: configurations,
child: Builder( child: configurations.child,
builder: (context) {
if (configurations.multiRowsDisplay) {
return Wrap(
direction: configurations.axis,
alignment: configurations.toolbarIconAlignment,
crossAxisAlignment: configurations.toolbarIconCrossAlignment,
runSpacing: 4,
spacing: configurations.toolbarSectionSpacing,
children: configurations.childrenBuilder?.call(context) ?? [],
);
}
return Container(
decoration: configurations.decoration ??
BoxDecoration(
color:
configurations.color ?? Theme.of(context).canvasColor,
),
constraints: BoxConstraints.tightFor(
height:
configurations.axis == Axis.horizontal ? toolbarSize : null,
width:
configurations.axis == Axis.vertical ? toolbarSize : null,
),
child: QuillToolbarArrowIndicatedButtonList(
axis: configurations.axis,
buttons: configurations.childrenBuilder?.call(context) ?? [],
),
);
},
),
), ),
); );
} }
} }
/// The divider which is used for separation of buttons in the toolbar.
///
/// It can be used outside of this package, for example when user does not use
/// [QuillToolbar.basic] and compose toolbar's children on its own.
class QuillToolbarDivider extends StatelessWidget {
const QuillToolbarDivider(
this.axis, {
super.key,
this.color,
this.space,
});
/// Provides a horizontal divider for vertical toolbar.
const QuillToolbarDivider.horizontal({Key? key, Color? color, double? space})
: this(Axis.horizontal, color: color, space: space, key: key);
/// Provides a horizontal divider for horizontal toolbar.
const QuillToolbarDivider.vertical({Key? key, Color? color, double? space})
: this(Axis.vertical, color: color, space: space, key: key);
/// The axis along which the toolbar is.
final Axis axis;
/// The color to use when painting this divider's line.
final Color? color;
/// The divider's space (width or height) depending of [axis].
final double? space;
@override
Widget build(BuildContext context) {
// Vertical toolbar requires horizontal divider, and vice versa
return axis == Axis.vertical
? Divider(
height: space,
color: color,
indent: 12,
endIndent: 12,
)
: VerticalDivider(
width: space,
color: color,
indent: 12,
endIndent: 12,
);
}
}

@ -6,6 +6,7 @@ import '../../models/config/toolbar/toolbar_configurations.dart';
import '../../models/documents/attribute.dart'; import '../../models/documents/attribute.dart';
import '../utils/provider.dart'; import '../utils/provider.dart';
import 'base_toolbar.dart'; import 'base_toolbar.dart';
import 'buttons/arrow_indicated_list_button.dart';
import 'buttons/select_alignment_buttons.dart'; import 'buttons/select_alignment_buttons.dart';
import 'buttons/select_header_style_button.dart'; import 'buttons/select_header_style_button.dart';
@ -50,400 +51,416 @@ class QuillSimpleToolbar extends StatelessWidget
configurations.showLink || configurations.showSearchButton configurations.showLink || configurations.showSearchButton
]; ];
return QuillToolbarProvider( List<Widget> childrenBuilder(context) {
toolbarConfigurations: configurations, final toolbarConfigurations =
child: QuillToolbar( context.requireQuillSimpleToolbarConfigurations;
configurations: QuillToolbarConfigurations(
color: configurations.color,
decoration: configurations.decoration,
toolbarSectionSpacing: configurations.toolbarSectionSpacing,
toolbarIconAlignment: configurations.toolbarIconAlignment,
toolbarIconCrossAlignment: configurations.toolbarIconCrossAlignment,
linkDialogAction: configurations.linkDialogAction,
multiRowsDisplay: configurations.multiRowsDisplay,
sectionDividerColor: configurations.sectionDividerColor,
axis: configurations.axis,
sectionDividerSpace: configurations.sectionDividerSpace,
toolbarSize: configurations.toolbarSize,
childrenBuilder: (context) {
final toolbarConfigurations =
context.requireQuillSimpleToolbarConfigurations;
final globalIconSize = final globalIconSize =
toolbarConfigurations.buttonOptions.base.globalIconSize; toolbarConfigurations.buttonOptions.base.globalIconSize;
final axis = toolbarConfigurations.axis; final axis = toolbarConfigurations.axis;
final globalController = configurations.controller; final globalController = configurations.controller;
final spacerWidget = final spacerWidget =
configurations.spacerWidget ?? const SizedBox.shrink(); configurations.spacerWidget ?? const SizedBox.shrink();
return [ return [
if (configurations.showUndo) ...[ if (configurations.showUndo) ...[
QuillToolbarHistoryButton( QuillToolbarHistoryButton(
isUndo: true, isUndo: true,
options: toolbarConfigurations.buttonOptions.undoHistory, options: toolbarConfigurations.buttonOptions.undoHistory,
controller: toolbarConfigurations controller:
.buttonOptions.undoHistory.controller ?? toolbarConfigurations.buttonOptions.undoHistory.controller ??
globalController, globalController,
), ),
spacerWidget, spacerWidget,
], ],
if (configurations.showRedo) ...[ if (configurations.showRedo) ...[
QuillToolbarHistoryButton( QuillToolbarHistoryButton(
isUndo: false, isUndo: false,
options: toolbarConfigurations.buttonOptions.redoHistory, options: toolbarConfigurations.buttonOptions.redoHistory,
controller: toolbarConfigurations controller:
.buttonOptions.redoHistory.controller ?? toolbarConfigurations.buttonOptions.redoHistory.controller ??
globalController, globalController,
), ),
spacerWidget, spacerWidget,
], ],
if (configurations.showFontFamily) ...[ if (configurations.showFontFamily) ...[
QuillToolbarFontFamilyButton( QuillToolbarFontFamilyButton(
options: toolbarConfigurations.buttonOptions.fontFamily, options: toolbarConfigurations.buttonOptions.fontFamily,
controller: toolbarConfigurations controller:
.buttonOptions.fontFamily.controller ?? toolbarConfigurations.buttonOptions.fontFamily.controller ??
globalController, globalController,
defaultDispalyText: context.loc.font, defaultDispalyText: context.loc.font,
), ),
spacerWidget, spacerWidget,
], ],
if (configurations.showFontSize) ...[ if (configurations.showFontSize) ...[
QuillToolbarFontSizeButton( QuillToolbarFontSizeButton(
options: toolbarConfigurations.buttonOptions.fontSize, options: toolbarConfigurations.buttonOptions.fontSize,
controller:
toolbarConfigurations.buttonOptions.fontFamily.controller ??
globalController,
defaultDisplayText: context.loc.fontSize,
),
spacerWidget,
],
if (configurations.showBoldButton) ...[
QuillToolbarToggleStyleButton(
attribute: Attribute.bold,
options: toolbarConfigurations.buttonOptions.bold,
controller: toolbarConfigurations.buttonOptions.bold.controller ??
globalController,
),
spacerWidget,
],
if (configurations.showItalicButton) ...[
QuillToolbarToggleStyleButton(
attribute: Attribute.italic,
options: toolbarConfigurations.buttonOptions.italic,
controller: toolbarConfigurations.buttonOptions.italic.controller ??
globalController,
),
spacerWidget,
],
if (configurations.showUnderLineButton) ...[
QuillToolbarToggleStyleButton(
attribute: Attribute.underline,
options: toolbarConfigurations.buttonOptions.underLine,
controller:
toolbarConfigurations.buttonOptions.underLine.controller ??
globalController,
),
spacerWidget,
],
if (configurations.showInlineCode) ...[
QuillToolbarToggleStyleButton(
attribute: Attribute.inlineCode,
options: toolbarConfigurations.buttonOptions.inlineCode,
controller:
toolbarConfigurations.buttonOptions.inlineCode.controller ??
globalController,
),
spacerWidget,
],
if (configurations.showSubscript) ...[
QuillToolbarToggleStyleButton(
attribute: Attribute.subscript,
options: toolbarConfigurations.buttonOptions.subscript,
controller:
toolbarConfigurations.buttonOptions.subscript.controller ??
globalController,
),
spacerWidget,
],
if (configurations.showSuperscript) ...[
QuillToolbarToggleStyleButton(
attribute: Attribute.superscript,
options: toolbarConfigurations.buttonOptions.superscript,
controller:
toolbarConfigurations.buttonOptions.superscript.controller ??
globalController,
),
spacerWidget,
],
if (configurations.showSmallButton) ...[
QuillToolbarToggleStyleButton(
attribute: Attribute.small,
options: toolbarConfigurations.buttonOptions.small,
controller: toolbarConfigurations.buttonOptions.small.controller ??
globalController,
),
spacerWidget,
],
if (configurations.showStrikeThrough) ...[
QuillToolbarToggleStyleButton(
attribute: Attribute.strikeThrough,
options: toolbarConfigurations.buttonOptions.strikeThrough,
controller:
toolbarConfigurations.buttonOptions.strikeThrough.controller ??
globalController,
),
spacerWidget,
],
if (configurations.showColorButton) ...[
QuillToolbarColorButton(
controller: toolbarConfigurations.buttonOptions.color.controller ??
globalController,
isBackground: false,
options: toolbarConfigurations.buttonOptions.color,
),
spacerWidget,
],
if (configurations.showBackgroundColorButton) ...[
QuillToolbarColorButton(
options: toolbarConfigurations.buttonOptions.backgroundColor,
controller: toolbarConfigurations.buttonOptions.color.controller ??
globalController,
isBackground: true,
),
spacerWidget,
],
if (configurations.showClearFormat) ...[
QuillToolbarClearFormatButton(
controller:
toolbarConfigurations.buttonOptions.clearFormat.controller ??
globalController,
options: toolbarConfigurations.buttonOptions.clearFormat,
),
spacerWidget,
],
if (theEmbedButtons != null)
for (final builder in theEmbedButtons)
builder(
globalController,
globalIconSize,
context.requireQuillToolbarBaseButtonOptions.iconTheme,
configurations.dialogTheme),
if (configurations.showDividers &&
isButtonGroupShown[0] &&
(isButtonGroupShown[1] ||
isButtonGroupShown[2] ||
isButtonGroupShown[3] ||
isButtonGroupShown[4] ||
isButtonGroupShown[5]))
QuillToolbarDivider(
axis,
color: configurations.sectionDividerColor,
space: configurations.sectionDividerSpace,
),
if (configurations.showAlignmentButtons) ...[
QuillToolbarSelectAlignmentButtons(
controller: toolbarConfigurations
.buttonOptions.selectAlignmentButtons.controller ??
globalController,
options: toolbarConfigurations.buttonOptions.selectAlignmentButtons,
showLeftAlignment: configurations.showLeftAlignment,
showCenterAlignment: configurations.showCenterAlignment,
showRightAlignment: configurations.showRightAlignment,
showJustifyAlignment: configurations.showJustifyAlignment,
),
spacerWidget,
],
if (configurations.showDirection) ...[
QuillToolbarToggleStyleButton(
attribute: Attribute.rtl,
options: toolbarConfigurations.buttonOptions.direction,
controller:
toolbarConfigurations.buttonOptions.direction.controller ??
globalController,
),
spacerWidget,
],
if (configurations.showDividers &&
isButtonGroupShown[1] &&
(isButtonGroupShown[2] ||
isButtonGroupShown[3] ||
isButtonGroupShown[4] ||
isButtonGroupShown[5]))
QuillToolbarDivider(
axis,
color: configurations.sectionDividerColor,
space: configurations.sectionDividerSpace,
),
if (configurations.showHeaderStyle) ...[
QuillToolbarSelectHeaderStyleButton(
controller: toolbarConfigurations
.buttonOptions.selectHeaderStyleButtons.controller ??
globalController,
options:
toolbarConfigurations.buttonOptions.selectHeaderStyleButtons,
),
spacerWidget,
],
if (configurations.showDividers &&
configurations.showHeaderStyle &&
isButtonGroupShown[2] &&
(isButtonGroupShown[3] ||
isButtonGroupShown[4] ||
isButtonGroupShown[5]))
QuillToolbarDivider(
axis,
color: configurations.sectionDividerColor,
space: configurations.sectionDividerSpace,
),
if (configurations.showListNumbers) ...[
QuillToolbarToggleStyleButton(
attribute: Attribute.ol,
options: toolbarConfigurations.buttonOptions.listNumbers,
controller:
toolbarConfigurations.buttonOptions.listNumbers.controller ??
globalController,
),
spacerWidget,
],
if (configurations.showListBullets) ...[
QuillToolbarToggleStyleButton(
attribute: Attribute.ul,
options: toolbarConfigurations.buttonOptions.listBullets,
controller:
toolbarConfigurations.buttonOptions.listBullets.controller ??
globalController,
),
spacerWidget,
],
if (configurations.showListCheck) ...[
QuillToolbarToggleCheckListButton(
options: toolbarConfigurations.buttonOptions.toggleCheckList,
controller: toolbarConfigurations
.buttonOptions.toggleCheckList.controller ??
globalController,
),
spacerWidget,
],
if (configurations.showCodeBlock) ...[
QuillToolbarToggleStyleButton(
attribute: Attribute.codeBlock,
options: toolbarConfigurations.buttonOptions.codeBlock,
controller:
toolbarConfigurations.buttonOptions.codeBlock.controller ??
globalController,
),
spacerWidget,
],
if (configurations.showDividers &&
isButtonGroupShown[3] &&
(isButtonGroupShown[4] || isButtonGroupShown[5])) ...[
QuillToolbarDivider(
axis,
color: configurations.sectionDividerColor,
space: configurations.sectionDividerSpace,
),
],
if (configurations.showQuote) ...[
QuillToolbarToggleStyleButton(
options: toolbarConfigurations.buttonOptions.quote,
controller: toolbarConfigurations.buttonOptions.quote.controller ??
globalController,
attribute: Attribute.blockQuote,
),
spacerWidget,
],
if (configurations.showIndent) ...[
QuillToolbarIndentButton(
controller:
toolbarConfigurations.buttonOptions.indentIncrease.controller ??
globalController,
isIncrease: true,
options: toolbarConfigurations.buttonOptions.indentIncrease,
),
spacerWidget,
],
if (configurations.showIndent) ...[
QuillToolbarIndentButton(
controller:
toolbarConfigurations.buttonOptions.indentDecrease.controller ??
globalController,
isIncrease: false,
options: toolbarConfigurations.buttonOptions.indentDecrease,
),
spacerWidget,
],
if (configurations.showDividers &&
isButtonGroupShown[4] &&
isButtonGroupShown[5])
QuillToolbarDivider(
axis,
color: configurations.sectionDividerColor,
space: configurations.sectionDividerSpace,
),
if (configurations.showLink) ...[
toolbarConfigurations.linkStyleType.isOriginal
? QuillToolbarLinkStyleButton(
controller: toolbarConfigurations controller: toolbarConfigurations
.buttonOptions.fontFamily.controller ?? .buttonOptions.linkStyle.controller ??
globalController, globalController,
defaultDisplayText: context.loc.fontSize, options: toolbarConfigurations.buttonOptions.linkStyle,
), )
spacerWidget, : QuillToolbarLinkStyleButton2(
],
if (configurations.showBoldButton) ...[
QuillToolbarToggleStyleButton(
attribute: Attribute.bold,
options: toolbarConfigurations.buttonOptions.bold,
controller:
toolbarConfigurations.buttonOptions.bold.controller ??
globalController,
),
spacerWidget,
],
if (configurations.showItalicButton) ...[
QuillToolbarToggleStyleButton(
attribute: Attribute.italic,
options: toolbarConfigurations.buttonOptions.italic,
controller:
toolbarConfigurations.buttonOptions.italic.controller ??
globalController,
),
spacerWidget,
],
if (configurations.showUnderLineButton) ...[
QuillToolbarToggleStyleButton(
attribute: Attribute.underline,
options: toolbarConfigurations.buttonOptions.underLine,
controller: toolbarConfigurations
.buttonOptions.underLine.controller ??
globalController,
),
spacerWidget,
],
if (configurations.showInlineCode) ...[
QuillToolbarToggleStyleButton(
attribute: Attribute.inlineCode,
options: toolbarConfigurations.buttonOptions.inlineCode,
controller: toolbarConfigurations
.buttonOptions.inlineCode.controller ??
globalController,
),
spacerWidget,
],
if (configurations.showSubscript) ...[
QuillToolbarToggleStyleButton(
attribute: Attribute.subscript,
options: toolbarConfigurations.buttonOptions.subscript,
controller: toolbarConfigurations controller: toolbarConfigurations
.buttonOptions.subscript.controller ?? .buttonOptions.linkStyle2.controller ??
globalController, globalController,
options: toolbarConfigurations.buttonOptions.linkStyle2,
), ),
spacerWidget, spacerWidget,
], ],
if (configurations.showSuperscript) ...[ if (configurations.showSearchButton) ...[
QuillToolbarToggleStyleButton( QuillToolbarSearchButton(
attribute: Attribute.superscript, controller: toolbarConfigurations.buttonOptions.search.controller ??
options: toolbarConfigurations.buttonOptions.superscript, globalController,
controller: toolbarConfigurations options: toolbarConfigurations.buttonOptions.search,
.buttonOptions.superscript.controller ?? ),
globalController, spacerWidget,
), ],
spacerWidget, if (configurations.customButtons.isNotEmpty) ...[
], if (configurations.showDividers)
if (configurations.showSmallButton) ...[ QuillToolbarDivider(
QuillToolbarToggleStyleButton( axis,
attribute: Attribute.small, color: configurations.sectionDividerColor,
options: toolbarConfigurations.buttonOptions.small, space: configurations.sectionDividerSpace,
controller: ),
toolbarConfigurations.buttonOptions.small.controller ?? for (final customButton in configurations.customButtons)
globalController, QuillToolbarCustomButton(
), options: customButton,
spacerWidget, controller: customButton.controller ?? globalController,
], ),
if (configurations.showStrikeThrough) ...[ // if (customButton.child != null) ...[
QuillToolbarToggleStyleButton( // InkWell(
attribute: Attribute.strikeThrough, // onTap: customButton.onTap,
options: toolbarConfigurations.buttonOptions.strikeThrough, // child: customButton.child,
controller: toolbarConfigurations // ),
.buttonOptions.strikeThrough.controller ?? // ] else ...[
globalController, // QuillToolbarCustomButton(
), // options:
spacerWidget, // toolbarConfigurations.buttonOptions.customButtons,
], // controller: toolbarConfigurations
if (configurations.showColorButton) ...[ // .buttonOptions.customButtons.controller ??
QuillToolbarColorButton( // globalController,
controller: // ),
toolbarConfigurations.buttonOptions.color.controller ?? // ],
globalController, spacerWidget,
isBackground: false, ],
options: toolbarConfigurations.buttonOptions.color, ];
), }
spacerWidget,
], return QuillToolbarProvider(
if (configurations.showBackgroundColorButton) ...[ toolbarConfigurations: configurations,
QuillToolbarColorButton( child: QuillToolbar(
options: toolbarConfigurations.buttonOptions.backgroundColor, configurations: QuillToolbarConfigurations(
controller: buttonOptions: configurations.buttonOptions,
toolbarConfigurations.buttonOptions.color.controller ?? child: Builder(
globalController, builder: (context) {
isBackground: true, if (configurations.multiRowsDisplay) {
), return Wrap(
spacerWidget, direction: configurations.axis,
], alignment: configurations.toolbarIconAlignment,
if (configurations.showClearFormat) ...[ crossAxisAlignment: configurations.toolbarIconCrossAlignment,
QuillToolbarClearFormatButton( runSpacing: 4,
controller: toolbarConfigurations spacing: configurations.toolbarSectionSpacing,
.buttonOptions.clearFormat.controller ?? children: childrenBuilder(context),
globalController, );
options: toolbarConfigurations.buttonOptions.clearFormat, }
), return Container(
spacerWidget, decoration: configurations.decoration ??
], BoxDecoration(
if (theEmbedButtons != null) color:
for (final builder in theEmbedButtons) configurations.color ?? Theme.of(context).canvasColor,
builder( ),
globalController, constraints: BoxConstraints.tightFor(
globalIconSize, height: configurations.axis == Axis.horizontal
context.requireQuillToolbarBaseButtonOptions.iconTheme, ? configurations.toolbarSize
configurations.dialogTheme), : null,
if (configurations.showDividers && width: configurations.axis == Axis.vertical
isButtonGroupShown[0] && ? configurations.toolbarSize
(isButtonGroupShown[1] || : null,
isButtonGroupShown[2] ||
isButtonGroupShown[3] ||
isButtonGroupShown[4] ||
isButtonGroupShown[5]))
QuillToolbarDivider(
axis,
color: configurations.sectionDividerColor,
space: configurations.sectionDividerSpace,
),
if (configurations.showAlignmentButtons) ...[
QuillToolbarSelectAlignmentButtons(
controller: toolbarConfigurations
.buttonOptions.selectAlignmentButtons.controller ??
globalController,
options: toolbarConfigurations
.buttonOptions.selectAlignmentButtons,
showLeftAlignment: configurations.showLeftAlignment,
showCenterAlignment: configurations.showCenterAlignment,
showRightAlignment: configurations.showRightAlignment,
showJustifyAlignment: configurations.showJustifyAlignment,
),
spacerWidget,
],
if (configurations.showDirection) ...[
QuillToolbarToggleStyleButton(
attribute: Attribute.rtl,
options: toolbarConfigurations.buttonOptions.direction,
controller: toolbarConfigurations
.buttonOptions.direction.controller ??
globalController,
),
spacerWidget,
],
if (configurations.showDividers &&
isButtonGroupShown[1] &&
(isButtonGroupShown[2] ||
isButtonGroupShown[3] ||
isButtonGroupShown[4] ||
isButtonGroupShown[5]))
QuillToolbarDivider(
axis,
color: configurations.sectionDividerColor,
space: configurations.sectionDividerSpace,
),
if (configurations.showHeaderStyle) ...[
QuillToolbarSelectHeaderStyleButton(
controller: toolbarConfigurations
.buttonOptions.selectHeaderStyleButtons.controller ??
globalController,
options: toolbarConfigurations
.buttonOptions.selectHeaderStyleButtons,
),
spacerWidget,
],
if (configurations.showDividers &&
configurations.showHeaderStyle &&
isButtonGroupShown[2] &&
(isButtonGroupShown[3] ||
isButtonGroupShown[4] ||
isButtonGroupShown[5]))
QuillToolbarDivider(
axis,
color: configurations.sectionDividerColor,
space: configurations.sectionDividerSpace,
),
if (configurations.showListNumbers) ...[
QuillToolbarToggleStyleButton(
attribute: Attribute.ol,
options: toolbarConfigurations.buttonOptions.listNumbers,
controller: toolbarConfigurations
.buttonOptions.listNumbers.controller ??
globalController,
),
spacerWidget,
],
if (configurations.showListBullets) ...[
QuillToolbarToggleStyleButton(
attribute: Attribute.ul,
options: toolbarConfigurations.buttonOptions.listBullets,
controller: toolbarConfigurations
.buttonOptions.listBullets.controller ??
globalController,
),
spacerWidget,
],
if (configurations.showListCheck) ...[
QuillToolbarToggleCheckListButton(
options: toolbarConfigurations.buttonOptions.toggleCheckList,
controller: toolbarConfigurations
.buttonOptions.toggleCheckList.controller ??
globalController,
),
spacerWidget,
],
if (configurations.showCodeBlock) ...[
QuillToolbarToggleStyleButton(
attribute: Attribute.codeBlock,
options: toolbarConfigurations.buttonOptions.codeBlock,
controller: toolbarConfigurations
.buttonOptions.codeBlock.controller ??
globalController,
),
spacerWidget,
],
if (configurations.showDividers &&
isButtonGroupShown[3] &&
(isButtonGroupShown[4] || isButtonGroupShown[5])) ...[
QuillToolbarDivider(
axis,
color: configurations.sectionDividerColor,
space: configurations.sectionDividerSpace,
),
],
if (configurations.showQuote) ...[
QuillToolbarToggleStyleButton(
options: toolbarConfigurations.buttonOptions.quote,
controller:
toolbarConfigurations.buttonOptions.quote.controller ??
globalController,
attribute: Attribute.blockQuote,
),
spacerWidget,
],
if (configurations.showIndent) ...[
QuillToolbarIndentButton(
controller: toolbarConfigurations
.buttonOptions.indentIncrease.controller ??
globalController,
isIncrease: true,
options: toolbarConfigurations.buttonOptions.indentIncrease,
),
spacerWidget,
],
if (configurations.showIndent) ...[
QuillToolbarIndentButton(
controller: toolbarConfigurations
.buttonOptions.indentDecrease.controller ??
globalController,
isIncrease: false,
options: toolbarConfigurations.buttonOptions.indentDecrease,
),
spacerWidget,
],
if (configurations.showDividers &&
isButtonGroupShown[4] &&
isButtonGroupShown[5])
QuillToolbarDivider(
axis,
color: configurations.sectionDividerColor,
space: configurations.sectionDividerSpace,
), ),
if (configurations.showLink) ...[ child: QuillToolbarArrowIndicatedButtonList(
toolbarConfigurations.linkStyleType.isOriginal axis: configurations.axis,
? QuillToolbarLinkStyleButton( buttons: childrenBuilder(context),
controller: toolbarConfigurations
.buttonOptions.linkStyle.controller ??
globalController,
options: toolbarConfigurations.buttonOptions.linkStyle,
)
: QuillToolbarLinkStyleButton2(
controller: toolbarConfigurations
.buttonOptions.linkStyle2.controller ??
globalController,
options: toolbarConfigurations.buttonOptions.linkStyle2,
),
spacerWidget,
],
if (configurations.showSearchButton) ...[
QuillToolbarSearchButton(
controller:
toolbarConfigurations.buttonOptions.search.controller ??
globalController,
options: toolbarConfigurations.buttonOptions.search,
), ),
spacerWidget, );
], },
if (configurations.customButtons.isNotEmpty) ...[ ),
if (configurations.showDividers)
QuillToolbarDivider(
axis,
color: configurations.sectionDividerColor,
space: configurations.sectionDividerSpace,
),
for (final customButton in configurations.customButtons)
QuillToolbarCustomButton(
options: customButton,
controller: customButton.controller ?? globalController,
),
// if (customButton.child != null) ...[
// InkWell(
// onTap: customButton.onTap,
// child: customButton.child,
// ),
// ] else ...[
// QuillToolbarCustomButton(
// options:
// toolbarConfigurations.buttonOptions.customButtons,
// controller: toolbarConfigurations
// .buttonOptions.customButtons.controller ??
// globalController,
// ),
// ],
spacerWidget,
],
];
},
), ),
), ),
); );
@ -454,3 +471,51 @@ class QuillSimpleToolbar extends StatelessWidget
? const Size.fromHeight(defaultToolbarSize) ? const Size.fromHeight(defaultToolbarSize)
: const Size.fromWidth(defaultToolbarSize); : const Size.fromWidth(defaultToolbarSize);
} }
/// The divider which is used for separation of buttons in the toolbar.
///
/// It can be used outside of this package, for example when user does not use
/// [QuillToolbar.basic] and compose toolbar's children on its own.
class QuillToolbarDivider extends StatelessWidget {
const QuillToolbarDivider(
this.axis, {
super.key,
this.color,
this.space,
});
/// Provides a horizontal divider for vertical toolbar.
const QuillToolbarDivider.horizontal({Key? key, Color? color, double? space})
: this(Axis.horizontal, color: color, space: space, key: key);
/// Provides a horizontal divider for horizontal toolbar.
const QuillToolbarDivider.vertical({Key? key, Color? color, double? space})
: this(Axis.vertical, color: color, space: space, key: key);
/// The axis along which the toolbar is.
final Axis axis;
/// The color to use when painting this divider's line.
final Color? color;
/// The divider's space (width or height) depending of [axis].
final double? space;
@override
Widget build(BuildContext context) {
// Vertical toolbar requires horizontal divider, and vice versa
return axis == Axis.vertical
? Divider(
height: space,
color: color,
indent: 12,
endIndent: 12,
)
: VerticalDivider(
width: space,
color: color,
indent: 12,
endIndent: 12,
);
}
}

@ -1 +1 @@
const version = '9.0.0-dev-4'; const version = '9.0.0-dev-5';

Loading…
Cancel
Save