pull/1566/head
Ellet 1 year ago
parent 4b4c148946
commit 0d39d9d4e9
No known key found for this signature in database
GPG Key ID: C488CC70BBCEF0D1
  1. 24
      example/lib/presentation/quill/quill_toolbar.dart
  2. 0
      lib/src/models/config/toolbar/buttons/base_configurations.dart
  3. 0
      lib/src/models/config/toolbar/buttons/clear_format_configurations.dart
  4. 2
      lib/src/models/config/toolbar/buttons/color_configurations.dart
  5. 2
      lib/src/models/config/toolbar/buttons/custom_button_configurations.dart
  6. 0
      lib/src/models/config/toolbar/buttons/font_family_configurations.dart
  7. 0
      lib/src/models/config/toolbar/buttons/font_size_configurations.dart
  8. 0
      lib/src/models/config/toolbar/buttons/history_configurations.dart
  9. 2
      lib/src/models/config/toolbar/buttons/indent_configurations.dart
  10. 2
      lib/src/models/config/toolbar/buttons/link_style2_configurations.dart
  11. 0
      lib/src/models/config/toolbar/buttons/link_style_configurations.dart
  12. 0
      lib/src/models/config/toolbar/buttons/search_configurations.dart
  13. 2
      lib/src/models/config/toolbar/buttons/select_alignment_configurations.dart
  14. 0
      lib/src/models/config/toolbar/buttons/select_header_style_configurations.dart
  15. 0
      lib/src/models/config/toolbar/buttons/toggle_check_list_configurations.dart
  16. 2
      lib/src/models/config/toolbar/buttons/toggle_style_configurations.dart
  17. 66
      lib/src/models/config/toolbar/simple_toolbar_configurations.dart
  18. 1
      lib/src/models/config/toolbar/toolbar_configurations.dart
  19. 4
      lib/src/models/config/toolbar/toolbar_shared_configurations.dart
  20. 4
      lib/src/widgets/toolbar/base_toolbar.dart
  21. 2
      lib/src/widgets/toolbar/buttons/font_family_button.dart
  22. 2
      lib/src/widgets/toolbar/buttons/indent_button.dart
  23. 54
      lib/src/widgets/toolbar/buttons/select_alignment_buttons.dart
  24. 16
      lib/src/widgets/toolbar/buttons/select_alignment_old_buttons.dart
  25. 48
      lib/src/widgets/toolbar/buttons/select_header_style_button.dart
  26. 4
      lib/src/widgets/toolbar/buttons/toggle_check_list_button.dart
  27. 13
      lib/src/widgets/toolbar/buttons/toggle_style_button.dart
  28. 11
      lib/src/widgets/toolbar/simple_toolbar.dart

@ -10,7 +10,6 @@ import 'package:path/path.dart' as path;
import 'package:path_provider/path_provider.dart'
show getApplicationDocumentsDirectory;
import '../extensions/scaffold_messenger.dart';
import '../settings/cubit/settings_cubit.dart';
import 'embeds/timestamp_embed.dart';
@ -106,12 +105,21 @@ class MyQuillToolbar extends StatelessWidget {
multiRowsDisplay: false,
buttonOptions: const QuillToolbarButtonOptions(
base: QuillToolbarBaseButtonOptions(
globalIconSize: 30,
globalIconSize: 20,
),
),
childrenBuilder: (context) {
final controller = context.requireQuillController;
return [
IconButton(
onPressed: () {
context.read<SettingsCubit>().updateSettings(
state.copyWith(useCustomQuillToolbar: false));
},
icon: const Icon(
Icons.width_normal,
size: 16,
),
),
QuillToolbarImageButton(
controller: controller,
options: const QuillToolbarImageButtonOptions(),
@ -238,7 +246,6 @@ class MyQuillToolbar extends StatelessWidget {
QuillToolbarCustomButtonOptions(
icon: const Icon(Icons.add_alarm_rounded),
onPressed: () {
final controller = context.requireQuillController;
controller.document
.insert(controller.selection.extentOffset, '\n');
controller.updateSelection(
@ -282,13 +289,10 @@ class MyQuillToolbar extends StatelessWidget {
},
),
QuillToolbarCustomButtonOptions(
icon: const Icon(Icons.ac_unit),
icon: const Icon(Icons.dashboard_customize),
onPressed: () {
ScaffoldMessenger.of(context)
..clearSnackBars()
..showText(
'Custom button!',
);
context.read<SettingsCubit>().updateSettings(
state.copyWith(useCustomQuillToolbar: true));
},
),
],

@ -2,7 +2,7 @@ import 'package:flutter/widgets.dart' show Color;
import '../../../../widgets/others/controller.dart';
import '../../quill_shared_configurations.dart' show QuillSharedConfigurations;
import 'base.dart';
import 'base_configurations.dart';
class QuillToolbarColorButtonExtraOptions
extends QuillToolbarBaseButtonExtraOptions {

@ -1,6 +1,6 @@
import 'package:flutter/widgets.dart' show VoidCallback, Widget;
import 'base.dart';
import 'base_configurations.dart';
class QuillToolbarCustomButtonExtraOptions
extends QuillToolbarBaseButtonExtraOptions {

@ -1,6 +1,6 @@
import 'package:flutter/foundation.dart';
import 'base.dart';
import 'base_configurations.dart';
class QuillToolbarIndentButtonExtraOptions
extends QuillToolbarBaseButtonExtraOptions {

@ -1,7 +1,7 @@
import 'package:flutter/widgets.dart';
import '../../../themes/quill_dialog_theme.dart';
import 'base.dart';
import 'base_configurations.dart';
class QuillToolbarLinkStyleButton2ExtraOptions
extends QuillToolbarBaseButtonExtraOptions {

@ -1,5 +1,5 @@
import 'package:flutter/widgets.dart' show IconData, immutable;
import 'base.dart';
import 'base_configurations.dart';
class QuillToolbarSelectAlignmentButtonExtraOptions
extends QuillToolbarBaseButtonExtraOptions {

@ -2,7 +2,7 @@
import 'package:flutter/foundation.dart' show immutable;
import 'package:flutter/widgets.dart' show Color;
import 'base.dart';
import 'base_configurations.dart';
class QuillToolbarToggleStyleButtonExtraOptions
extends QuillToolbarBaseButtonExtraOptions

@ -7,39 +7,39 @@ import '../../../widgets/others/controller.dart';
import '../../../widgets/others/embeds.dart';
import '../../themes/quill_dialog_theme.dart';
import '../../themes/quill_icon_theme.dart';
import 'buttons/base.dart';
import 'buttons/clear_format.dart';
import 'buttons/color.dart';
import 'buttons/custom_button.dart';
import 'buttons/font_family.dart';
import 'buttons/font_size.dart';
import 'buttons/history.dart';
import 'buttons/indent.dart';
import 'buttons/link_style.dart';
import 'buttons/link_style2.dart';
import 'buttons/search.dart';
import 'buttons/select_alignment.dart';
import 'buttons/select_header_style.dart';
import 'buttons/toggle_check_list.dart';
import 'buttons/toggle_style.dart';
import 'buttons/base_configurations.dart';
import 'buttons/clear_format_configurations.dart';
import 'buttons/color_configurations.dart';
import 'buttons/custom_button_configurations.dart';
import 'buttons/font_family_configurations.dart';
import 'buttons/font_size_configurations.dart';
import 'buttons/history_configurations.dart';
import 'buttons/indent_configurations.dart';
import 'buttons/link_style_configurations.dart';
import 'buttons/link_style2_configurations.dart';
import 'buttons/search_configurations.dart';
import 'buttons/select_alignment_configurations.dart';
import 'buttons/select_header_style_configurations.dart';
import 'buttons/toggle_check_list_configurations.dart';
import 'buttons/toggle_style_configurations.dart';
import 'toolbar_shared_configurations.dart';
export './../../../widgets/toolbar/buttons/search/search_dialog.dart';
export './buttons/base.dart';
export './buttons/clear_format.dart';
export './buttons/color.dart';
export './buttons/custom_button.dart';
export './buttons/font_family.dart';
export './buttons/font_size.dart';
export './buttons/history.dart';
export './buttons/indent.dart';
export './buttons/link_style.dart';
export './buttons/link_style2.dart';
export './buttons/search.dart';
export './buttons/select_alignment.dart';
export './buttons/select_header_style.dart';
export './buttons/toggle_check_list.dart';
export './buttons/toggle_style.dart';
export 'buttons/base_configurations.dart';
export 'buttons/clear_format_configurations.dart';
export 'buttons/color_configurations.dart';
export 'buttons/custom_button_configurations.dart';
export 'buttons/font_family_configurations.dart';
export 'buttons/font_size_configurations.dart';
export 'buttons/history_configurations.dart';
export 'buttons/indent_configurations.dart';
export 'buttons/link_style_configurations.dart';
export 'buttons/link_style2_configurations.dart';
export 'buttons/search_configurations.dart';
export 'buttons/select_alignment_configurations.dart';
export 'buttons/select_header_style_configurations.dart';
export 'buttons/toggle_check_list_configurations.dart';
export 'buttons/toggle_style_configurations.dart';
/// The default size of the icon of a button.
const double kDefaultIconSize = 18;
@ -73,6 +73,7 @@ class QuillSimpleToolbarConfigurations extends QuillSharedToolbarProperties {
super.toolbarIconAlignment = WrapAlignment.center,
super.toolbarIconCrossAlignment = WrapCrossAlignment.center,
super.buttonOptions = const QuillToolbarButtonOptions(),
this.customButtons = const [],
super.multiRowsDisplay = true,
this.fontSizesValues,
this.showDividers = true,
@ -107,7 +108,6 @@ class QuillSimpleToolbarConfigurations extends QuillSharedToolbarProperties {
this.showSubscript = true,
this.showSuperscript = true,
this.linkStyleType = LinkStyleType.original,
super.customButtons = const [],
/// The decoration to use for the toolbar.
super.decoration,
@ -167,6 +167,9 @@ class QuillSimpleToolbarConfigurations extends QuillSharedToolbarProperties {
/// ```
final Map<String, String>? fontSizesValues;
/// List of custom buttons
final List<QuillToolbarCustomButtonOptions> customButtons;
final bool showDividers;
final bool showFontFamily;
final bool showFontSize;
@ -179,6 +182,7 @@ class QuillSimpleToolbarConfigurations extends QuillSharedToolbarProperties {
final bool showColorButton;
final bool showBackgroundColorButton;
final bool showClearFormat;
final bool showAlignmentButtons;
final bool showLeftAlignment;
final bool showCenterAlignment;

@ -14,7 +14,6 @@ class QuillToolbarConfigurations extends QuillSharedToolbarProperties {
super.toolbarIconAlignment = WrapAlignment.center,
super.toolbarIconCrossAlignment = WrapCrossAlignment.center,
super.color,
super.customButtons = const [],
super.sectionDividerColor,
super.sectionDividerSpace,
super.linkDialogAction,

@ -13,7 +13,6 @@ abstract class QuillSharedToolbarProperties extends Equatable {
this.toolbarIconAlignment = WrapAlignment.center,
this.toolbarIconCrossAlignment = WrapCrossAlignment.center,
this.color,
this.customButtons = const [],
this.sectionDividerColor,
this.sectionDividerSpace,
this.linkDialogAction,
@ -36,9 +35,6 @@ abstract class QuillSharedToolbarProperties extends Equatable {
/// is given.
final Color? color;
/// List of custom buttons
final List<QuillToolbarCustomButtonOptions> customButtons;
/// The color to use when painting the toolbar section divider.
///
/// If this is null, then the [DividerThemeData.color] is used. If that is

@ -6,7 +6,7 @@ import '../../l10n/widgets/localizations.dart';
import '../../models/config/toolbar/toolbar_configurations.dart';
import 'buttons/arrow_indicated_list_button.dart';
export '../../models/config/toolbar/buttons/base.dart';
export '../../models/config/toolbar/buttons/base_configurations.dart';
export '../../models/config/toolbar/simple_toolbar_configurations.dart';
export 'buttons/clear_format_button.dart';
export 'buttons/color/color_button.dart';
@ -19,7 +19,7 @@ export 'buttons/link_style2_button.dart';
export 'buttons/link_style_button.dart';
export 'buttons/quill_icon_button.dart';
export 'buttons/search/search_button.dart';
export 'buttons/select_alignment_button.dart';
export 'buttons/select_alignment_old_buttons.dart';
export 'buttons/select_header_style_buttons.dart';
export 'buttons/toggle_check_list_button.dart';
export 'buttons/toggle_style_button.dart';

@ -3,7 +3,7 @@ import 'package:flutter/material.dart';
import '../../../../extensions.dart';
import '../../../extensions/quill_provider.dart';
import '../../../l10n/extensions/localizations.dart';
import '../../../models/config/toolbar/buttons/font_family.dart';
import '../../../models/config/toolbar/buttons/font_family_configurations.dart';
import '../../../models/documents/attribute.dart';
import '../../../models/documents/style.dart';
import '../../../models/themes/quill_icon_theme.dart';

@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import '../../../extensions/quill_provider.dart';
import '../../../l10n/extensions/localizations.dart';
import '../../../models/config/toolbar/buttons/indent.dart';
import '../../../models/config/toolbar/buttons/indent_configurations.dart';
import '../../../models/themes/quill_icon_theme.dart';
import '../../others/controller.dart';
import '../base_toolbar.dart'

@ -0,0 +1,54 @@
import 'package:flutter/material.dart';
import '../../../models/config/toolbar/buttons/select_alignment_configurations.dart';
import '../../../models/config/toolbar/buttons/toggle_style_configurations.dart';
import '../../../models/documents/attribute.dart';
import '../../others/controller.dart';
import 'toggle_style_button.dart';
enum _AlignmentOptions {
left(attribute: Attribute.leftAlignment),
center(attribute: Attribute.centerAlignment),
right(attribute: Attribute.rightAlignment),
justifyMinWidth(attribute: Attribute.justifyAlignment);
const _AlignmentOptions({required this.attribute});
final Attribute attribute;
}
class QuillToolbarSelectAlignmentButtons extends StatelessWidget {
const QuillToolbarSelectAlignmentButtons({
required this.controller,
required this.options,
this.showLeftAlignment,
this.showCenterAlignment,
this.showRightAlignment,
this.showJustifyAlignment,
this.padding,
super.key,
});
final QuillController controller;
final QuillToolbarSelectAlignmentButtonOptions options;
final bool? showLeftAlignment;
final bool? showCenterAlignment;
final bool? showRightAlignment;
final bool? showJustifyAlignment;
final EdgeInsetsGeometry? padding;
@override
Widget build(BuildContext context) {
return Row(
mainAxisSize: MainAxisSize.min,
children: _AlignmentOptions.values
.map((e) => QuillToolbarToggleStyleButton(
options: const QuillToolbarToggleStyleButtonOptions(),
controller: controller,
attribute: e.attribute,
))
.toList(),
);
}
}

@ -10,8 +10,9 @@ import '../../../utils/widgets.dart';
import '../../others/controller.dart';
import '../base_toolbar.dart';
class QuillToolbarSelectAlignmentButton extends StatefulWidget {
const QuillToolbarSelectAlignmentButton({
@Deprecated('This button has been deprecated, use')
class QuillToolbarSelectAlignmentOldButtons extends StatefulWidget {
const QuillToolbarSelectAlignmentOldButtons({
required this.controller,
required this.options,
this.showLeftAlignment,
@ -32,12 +33,12 @@ class QuillToolbarSelectAlignmentButton extends StatefulWidget {
final EdgeInsetsGeometry? padding;
@override
QuillToolbarSelectAlignmentButtonState createState() =>
QuillToolbarSelectAlignmentButtonState();
QuillToolbarSelectAlignmentOldButtonsState createState() =>
QuillToolbarSelectAlignmentOldButtonsState();
}
class QuillToolbarSelectAlignmentButtonState
extends State<QuillToolbarSelectAlignmentButton> {
class QuillToolbarSelectAlignmentOldButtonsState
extends State<QuillToolbarSelectAlignmentOldButtons> {
Attribute? _value;
Style get _selectionStyle => controller.getSelectionStyle();
@ -137,7 +138,8 @@ class QuillToolbarSelectAlignmentButtonState
}
@override
void didUpdateWidget(covariant QuillToolbarSelectAlignmentButton oldWidget) {
void didUpdateWidget(
covariant QuillToolbarSelectAlignmentOldButtons oldWidget) {
super.didUpdateWidget(oldWidget);
if (oldWidget.controller != controller) {
oldWidget.controller.removeListener(_didChangeEditingValue);

@ -1,11 +1,11 @@
import 'package:flutter/material.dart';
import '../../../../translations.dart';
import '../../../models/config/toolbar/buttons/select_header_style.dart';
import '../../../models/config/toolbar/buttons/select_header_style_configurations.dart';
import '../../../models/documents/attribute.dart';
import '../../others/controller.dart';
enum QuillToolbarSelectHeaderStyleButtonOptions {
enum _HeaderStyleOptions {
normal,
headingOne,
headingTwo,
@ -29,7 +29,7 @@ class QuillToolbarSelectHeaderStyleButton extends StatefulWidget {
class _QuillToolbarSelectHeaderStyleButtonState
extends State<QuillToolbarSelectHeaderStyleButton> {
var _selectedItem = QuillToolbarSelectHeaderStyleButtonOptions.normal;
var _selectedItem = _HeaderStyleOptions.normal;
@override
void initState() {
super.initState();
@ -55,47 +55,43 @@ class _QuillToolbarSelectHeaderStyleButtonState
Attribute.header;
}
String _label(QuillToolbarSelectHeaderStyleButtonOptions value) {
String _label(_HeaderStyleOptions value) {
final label = switch (value) {
QuillToolbarSelectHeaderStyleButtonOptions.normal => context.loc.normal,
QuillToolbarSelectHeaderStyleButtonOptions.headingOne =>
context.loc.heading1,
QuillToolbarSelectHeaderStyleButtonOptions.headingTwo =>
context.loc.heading2,
QuillToolbarSelectHeaderStyleButtonOptions.headingThree =>
context.loc.heading3,
_HeaderStyleOptions.normal => context.loc.normal,
_HeaderStyleOptions.headingOne => context.loc.heading1,
_HeaderStyleOptions.headingTwo => context.loc.heading2,
_HeaderStyleOptions.headingThree => context.loc.heading3,
};
return label;
}
Attribute<dynamic>? getAttributeByOptionsItem(
QuillToolbarSelectHeaderStyleButtonOptions option) {
Attribute<dynamic>? getAttributeByOptionsItem(_HeaderStyleOptions option) {
return switch (option) {
QuillToolbarSelectHeaderStyleButtonOptions.normal => Attribute.header,
QuillToolbarSelectHeaderStyleButtonOptions.headingOne => Attribute.h1,
QuillToolbarSelectHeaderStyleButtonOptions.headingTwo => Attribute.h2,
QuillToolbarSelectHeaderStyleButtonOptions.headingThree => Attribute.h3,
_HeaderStyleOptions.normal => Attribute.header,
_HeaderStyleOptions.headingOne => Attribute.h1,
_HeaderStyleOptions.headingTwo => Attribute.h2,
_HeaderStyleOptions.headingThree => Attribute.h3,
};
}
QuillToolbarSelectHeaderStyleButtonOptions _getOptionsItemByAttribute(
_HeaderStyleOptions _getOptionsItemByAttribute(
Attribute<dynamic>? attribute) {
return switch (attribute) {
Attribute.h1 => QuillToolbarSelectHeaderStyleButtonOptions.headingOne,
Attribute.h2 => QuillToolbarSelectHeaderStyleButtonOptions.headingTwo,
Attribute.h2 => QuillToolbarSelectHeaderStyleButtonOptions.headingThree,
Attribute() => QuillToolbarSelectHeaderStyleButtonOptions.normal,
null => QuillToolbarSelectHeaderStyleButtonOptions.normal,
Attribute.h1 => _HeaderStyleOptions.headingOne,
Attribute.h2 => _HeaderStyleOptions.headingTwo,
Attribute.h2 => _HeaderStyleOptions.headingThree,
Attribute() => _HeaderStyleOptions.normal,
null => _HeaderStyleOptions.normal,
};
}
@override
Widget build(BuildContext context) {
return DropdownButton<QuillToolbarSelectHeaderStyleButtonOptions>(
return DropdownButton<_HeaderStyleOptions>(
value: _selectedItem,
items: QuillToolbarSelectHeaderStyleButtonOptions.values
items: _HeaderStyleOptions.values
.map(
(e) => DropdownMenuItem<QuillToolbarSelectHeaderStyleButtonOptions>(
(e) => DropdownMenuItem<_HeaderStyleOptions>(
value: e,
child: Text(_label(e)),
onTap: () {

@ -2,8 +2,8 @@ import 'package:flutter/material.dart';
import '../../../extensions/quill_provider.dart';
import '../../../l10n/extensions/localizations.dart';
import '../../../models/config/toolbar/buttons/base.dart';
import '../../../models/config/toolbar/buttons/toggle_check_list.dart';
import '../../../models/config/toolbar/buttons/base_configurations.dart';
import '../../../models/config/toolbar/buttons/toggle_check_list_configurations.dart';
import '../../../models/documents/attribute.dart';
import '../../../models/documents/style.dart';
import '../../../models/themes/quill_icon_theme.dart';

@ -85,7 +85,7 @@ class QuillToolbarToggleStyleButtonState
context.requireQuillToolbarBaseButtonOptions.iconTheme;
}
(String?, IconData) get _defaultTooltipAndIconData {
(String, IconData) get _defaultTooltipAndIconData {
switch (widget.attribute.key) {
case 'bold':
return (context.loc.bold, Icons.format_bold);
@ -115,6 +115,14 @@ class QuillToolbarToggleStyleButtonState
return (context.loc.codeBlock, Icons.code);
case 'blockquote':
return (context.loc.quote, Icons.format_quote);
case 'align':
return switch (widget.attribute.value) {
'left' => (context.loc.alignLeft, Icons.format_align_left),
'right' => (context.loc.alignRight, Icons.format_align_right),
'center' => (context.loc.alignCenter, Icons.format_align_center),
Object() => (context.loc.alignCenter, Icons.format_align_center),
null => (context.loc.alignCenter, Icons.format_align_center),
};
default:
throw ArgumentError(
'Could not find the default tooltip for '
@ -203,7 +211,8 @@ class QuillToolbarToggleStyleButtonState
bool _getIsToggled(Map<String, Attribute> attrs) {
if (widget.attribute.key == Attribute.list.key ||
widget.attribute.key == Attribute.script.key) {
widget.attribute.key == Attribute.script.key ||
widget.attribute.key == Attribute.align.key) {
final attribute = attrs[widget.attribute.key];
if (attribute == null) {
return false;

@ -6,6 +6,7 @@ import '../../models/config/toolbar/toolbar_configurations.dart';
import '../../models/documents/attribute.dart';
import '../utils/provider.dart';
import 'base_toolbar.dart';
import 'buttons/select_alignment_buttons.dart';
import 'buttons/select_header_style_button.dart';
class QuillSimpleToolbar extends StatelessWidget
@ -58,7 +59,6 @@ class QuillSimpleToolbar extends StatelessWidget
toolbarSectionSpacing: configurations.toolbarSectionSpacing,
toolbarIconAlignment: configurations.toolbarIconAlignment,
toolbarIconCrossAlignment: configurations.toolbarIconCrossAlignment,
customButtons: configurations.customButtons,
linkDialogAction: configurations.linkDialogAction,
multiRowsDisplay: configurations.multiRowsDisplay,
sectionDividerColor: configurations.sectionDividerColor,
@ -246,19 +246,12 @@ class QuillSimpleToolbar extends StatelessWidget
space: configurations.sectionDividerSpace,
),
if (configurations.showAlignmentButtons) ...[
QuillToolbarSelectAlignmentButton(
QuillToolbarSelectAlignmentButtons(
controller: toolbarConfigurations
.buttonOptions.selectAlignmentButtons.controller ??
globalController,
options: toolbarConfigurations
.buttonOptions.selectAlignmentButtons,
// tooltips: Map.of(buttonTooltips)
// ..removeWhere((key, value) => ![
// ToolbarButtons.leftAlignment,
// ToolbarButtons.centerAlignment,
// ToolbarButtons.rightAlignment,
// ToolbarButtons.justifyAlignment,
// ].contains(key)),
showLeftAlignment: configurations.showLeftAlignment,
showCenterAlignment: configurations.showCenterAlignment,
showRightAlignment: configurations.showRightAlignment,

Loading…
Cancel
Save