Update QuillCustomButton

pull/1517/head
Ellet 1 year ago
parent b6b756535a
commit ad642da044
No known key found for this signature in database
GPG Key ID: C488CC70BBCEF0D1
  1. 4
      CHANGELOG.md
  2. 33
      lib/src/models/config/toolbar/buttons/custom_button.dart
  3. 4
      lib/src/models/config/toolbar/configurations.dart
  4. 14
      lib/src/models/themes/quill_custom_button.dart
  5. 98
      lib/src/widgets/toolbar/buttons/custom_button.dart
  6. 51
      lib/src/widgets/toolbar/toolbar.dart
  7. 2
      pubspec.yaml

@ -1,3 +1,7 @@
## [8.4.0]
- **Breaking change**: Update the `QuillCustomButton` to have `QuillCustomButtonOptions`. We moved everything that is in the `QuillCustomButton` to `QuillCustomButtonOptions` but replaced the `iconData` with `icon` widget for more customizations
- Bug fixes with the new `8.0.0` update
## [8.3.0] ## [8.3.0]
- Added a `iconButtonFactor` property to `QuillToolbarBaseButtonOptions` to customise how big the button is compared to its icon size (defaults to `kIconButtonFactor` which is the same as previous releases) - Added a `iconButtonFactor` property to `QuillToolbarBaseButtonOptions` to customise how big the button is compared to its icon size (defaults to `kIconButtonFactor` which is the same as previous releases)

@ -0,0 +1,33 @@
import 'package:flutter/widgets.dart' show VoidCallback, Widget;
import 'base.dart';
class QuillToolbarCustomButtonExtraOptions
extends QuillToolbarBaseButtonExtraOptions {
const QuillToolbarCustomButtonExtraOptions({
required super.controller,
required super.context,
required super.onPressed,
});
}
class QuillToolbarCustomButtonOptions extends QuillToolbarBaseButtonOptions<
QuillToolbarBaseButtonOptions, QuillToolbarCustomButtonExtraOptions> {
const QuillToolbarCustomButtonOptions({
this.icon,
this.iconButtonFactor,
this.iconSize,
super.iconData,
super.afterButtonPressed,
super.tooltip,
super.iconTheme,
super.childBuilder,
super.controller,
this.onPressed,
});
final double? iconButtonFactor;
final double? iconSize;
final VoidCallback? onPressed;
final Widget? icon;
}

@ -11,6 +11,7 @@ import '../../themes/quill_icon_theme.dart';
import 'buttons/base.dart'; import 'buttons/base.dart';
import 'buttons/clear_format.dart'; import 'buttons/clear_format.dart';
import 'buttons/color.dart'; import 'buttons/color.dart';
import 'buttons/custom_button.dart';
import 'buttons/font_family.dart'; import 'buttons/font_family.dart';
import 'buttons/font_size.dart'; import 'buttons/font_size.dart';
import 'buttons/history.dart'; import 'buttons/history.dart';
@ -284,6 +285,7 @@ class QuillToolbarButtonOptions extends Equatable {
this.selectHeaderStyleButtons = this.selectHeaderStyleButtons =
const QuillToolbarSelectHeaderStyleButtonsOptions(), const QuillToolbarSelectHeaderStyleButtonsOptions(),
this.linkStyle = const QuillToolbarLinkStyleButtonOptions(), this.linkStyle = const QuillToolbarLinkStyleButtonOptions(),
this.customButtons = const QuillToolbarCustomButtonOptions(),
}); });
/// The base configurations for all the buttons which will apply to all /// The base configurations for all the buttons which will apply to all
@ -329,6 +331,8 @@ class QuillToolbarButtonOptions extends Equatable {
final QuillToolbarLinkStyleButtonOptions linkStyle; final QuillToolbarLinkStyleButtonOptions linkStyle;
final QuillToolbarCustomButtonOptions customButtons;
@override @override
List<Object?> get props => [ List<Object?> get props => [
base, base,

@ -4,23 +4,19 @@ import '../../widgets/toolbar/base_toolbar.dart';
class QuillCustomButton extends QuillToolbarBaseButtonOptions { class QuillCustomButton extends QuillToolbarBaseButtonOptions {
const QuillCustomButton({ const QuillCustomButton({
super.iconData, this.icon,
this.iconColor,
this.onTap, this.onTap,
super.tooltip, super.tooltip,
this.iconSize,
this.child, this.child,
super.iconTheme, super.iconTheme,
}); });
///The icon color; /// The icon widget
final Color? iconColor; final Widget? icon;
///The function when the icon is tapped /// The function when the icon is tapped
final VoidCallback? onTap; final VoidCallback? onTap;
///The customButton placeholder /// The customButton placeholder
final Widget? child; final Widget? child;
final double? iconSize;
} }

@ -1,43 +1,93 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../../models/config/toolbar/buttons/custom_button.dart';
import '../../../models/themes/quill_icon_theme.dart'; import '../../../models/themes/quill_icon_theme.dart';
import '../../../utils/extensions/build_context.dart';
import '../../controller.dart';
import '../base_toolbar.dart'; import '../base_toolbar.dart';
class CustomButton extends StatelessWidget { class QuillToolbarCustomButton extends StatelessWidget {
const CustomButton({ const QuillToolbarCustomButton({
required this.onPressed, required this.options,
required this.icon, required this.controller,
this.iconColor,
this.iconSize = kDefaultIconSize,
this.iconButtonFactor = kIconButtonFactor,
this.iconTheme,
this.afterButtonPressed,
this.tooltip,
super.key, super.key,
}); });
final VoidCallback? onPressed; final QuillController controller;
final IconData? icon; final QuillToolbarCustomButtonOptions options;
final Color? iconColor;
final double iconSize; double _iconSize(BuildContext context) {
final double iconButtonFactor; final baseFontSize = baseButtonExtraOptions(context).globalIconSize;
final QuillIconTheme? iconTheme; final iconSize = options.iconSize;
final VoidCallback? afterButtonPressed; return iconSize ?? baseFontSize;
final String? tooltip; }
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;
}
QuillIconTheme? _iconTheme(BuildContext context) {
return options.iconTheme ?? baseButtonExtraOptions(context).iconTheme;
}
QuillToolbarBaseButtonOptions baseButtonExtraOptions(BuildContext context) {
return context.requireQuillToolbarBaseButtonOptions;
}
String? _tooltip(BuildContext context) {
return options.tooltip ?? baseButtonExtraOptions(context).tooltip;
}
void _onPressed(BuildContext context) {
options.onPressed?.call();
_afterButtonPressed(context)?.call();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final theme = Theme.of(context); final iconTheme = _iconTheme(context);
final tooltip = _tooltip(context);
final iconSize = _iconSize(context);
final iconButtonFactor = _iconButtonFactor(context);
final childBuilder =
options.childBuilder ?? baseButtonExtraOptions(context).childBuilder;
final afterButtonPressed = _afterButtonPressed(context);
final iconColor = iconTheme?.iconUnselectedColor ?? theme.iconTheme.color; if (childBuilder != null) {
return childBuilder(
QuillToolbarCustomButtonOptions(
iconButtonFactor: iconButtonFactor,
iconSize: iconSize,
afterButtonPressed: afterButtonPressed,
controller: controller,
iconTheme: iconTheme,
tooltip: tooltip,
icon: options.icon,
),
QuillToolbarCustomButtonExtraOptions(
context: context,
controller: controller,
onPressed: () => _onPressed(context),
),
);
}
final theme = Theme.of(context);
return QuillToolbarIconButton( return QuillToolbarIconButton(
highlightElevation: 0,
hoverElevation: 0,
size: iconSize * iconButtonFactor, size: iconSize * iconButtonFactor,
icon: Icon(icon, size: iconSize, color: iconColor), icon: options.icon,
tooltip: tooltip, tooltip: tooltip,
borderRadius: iconTheme?.borderRadius ?? 2, borderRadius: iconTheme?.borderRadius ?? 2,
onPressed: onPressed, onPressed: () => _onPressed(context),
afterPressed: afterButtonPressed, afterPressed: afterButtonPressed,
fillColor: iconTheme?.iconUnselectedFillColor ?? theme.canvasColor, fillColor: iconTheme?.iconUnselectedFillColor ?? theme.canvasColor,
); );

@ -59,8 +59,6 @@ class QuillToolbar extends StatelessWidget {
sectionDividerSpace: configurations.sectionDividerSpace, sectionDividerSpace: configurations.sectionDividerSpace,
toolbarSize: configurations.toolbarSize, toolbarSize: configurations.toolbarSize,
childrenBuilder: (context) { childrenBuilder: (context) {
final controller = context.requireQuillController;
final toolbarConfigurations = final toolbarConfigurations =
context.requireQuillToolbarConfigurations; context.requireQuillToolbarConfigurations;
@ -192,7 +190,9 @@ class QuillToolbar extends StatelessWidget {
], ],
if (configurations.showColorButton) ...[ if (configurations.showColorButton) ...[
QuillToolbarColorButton( QuillToolbarColorButton(
controller: controller, controller:
toolbarConfigurations.buttonOptions.color.controller ??
globalController,
isBackground: false, isBackground: false,
options: toolbarConfigurations.buttonOptions.color, options: toolbarConfigurations.buttonOptions.color,
), ),
@ -201,14 +201,18 @@ class QuillToolbar extends StatelessWidget {
if (configurations.showBackgroundColorButton) ...[ if (configurations.showBackgroundColorButton) ...[
QuillToolbarColorButton( QuillToolbarColorButton(
options: toolbarConfigurations.buttonOptions.backgroundColor, options: toolbarConfigurations.buttonOptions.backgroundColor,
controller: controller, controller:
toolbarConfigurations.buttonOptions.color.controller ??
globalController,
isBackground: true, isBackground: true,
), ),
spacerWidget, spacerWidget,
], ],
if (configurations.showClearFormat) ...[ if (configurations.showClearFormat) ...[
QuillToolbarClearFormatButton( QuillToolbarClearFormatButton(
controller: controller, controller: toolbarConfigurations
.buttonOptions.clearFormat.controller ??
globalController,
options: toolbarConfigurations.buttonOptions.clearFormat, options: toolbarConfigurations.buttonOptions.clearFormat,
), ),
spacerWidget, spacerWidget,
@ -216,7 +220,7 @@ class QuillToolbar extends StatelessWidget {
if (theEmbedButtons != null) if (theEmbedButtons != null)
for (final builder in theEmbedButtons) for (final builder in theEmbedButtons)
builder( builder(
controller, globalController,
globalIconSize, globalIconSize,
context.requireQuillToolbarBaseButtonOptions.iconTheme, context.requireQuillToolbarBaseButtonOptions.iconTheme,
configurations.dialogTheme), configurations.dialogTheme),
@ -234,7 +238,9 @@ class QuillToolbar extends StatelessWidget {
), ),
if (configurations.showAlignmentButtons) ...[ if (configurations.showAlignmentButtons) ...[
QuillToolbarSelectAlignmentButton( QuillToolbarSelectAlignmentButton(
controller: controller, controller: toolbarConfigurations
.buttonOptions.selectAlignmentButtons.controller ??
globalController,
options: toolbarConfigurations options: toolbarConfigurations
.buttonOptions.selectAlignmentButtons, .buttonOptions.selectAlignmentButtons,
// tooltips: Map.of(buttonTooltips) // tooltips: Map.of(buttonTooltips)
@ -274,7 +280,9 @@ class QuillToolbar extends StatelessWidget {
), ),
if (configurations.showHeaderStyle) ...[ if (configurations.showHeaderStyle) ...[
QuillToolbarSelectHeaderStyleButtons( QuillToolbarSelectHeaderStyleButtons(
controller: controller, controller: toolbarConfigurations
.buttonOptions.selectHeaderStyleButtons.controller ??
globalController,
options: toolbarConfigurations options: toolbarConfigurations
.buttonOptions.selectHeaderStyleButtons, .buttonOptions.selectHeaderStyleButtons,
), ),
@ -379,14 +387,18 @@ class QuillToolbar extends StatelessWidget {
), ),
if (configurations.showLink) ...[ if (configurations.showLink) ...[
QuillToolbarLinkStyleButton( QuillToolbarLinkStyleButton(
controller: controller, controller: toolbarConfigurations
.buttonOptions.linkStyle.controller ??
globalController,
options: toolbarConfigurations.buttonOptions.linkStyle, options: toolbarConfigurations.buttonOptions.linkStyle,
), ),
spacerWidget, spacerWidget,
], ],
if (configurations.showSearchButton) ...[ if (configurations.showSearchButton) ...[
QuillToolbarSearchButton( QuillToolbarSearchButton(
controller: controller, controller:
toolbarConfigurations.buttonOptions.search.controller ??
globalController,
options: toolbarConfigurations.buttonOptions.search, options: toolbarConfigurations.buttonOptions.search,
), ),
spacerWidget, spacerWidget,
@ -405,19 +417,12 @@ class QuillToolbar extends StatelessWidget {
child: customButton.child, child: customButton.child,
), ),
] else ...[ ] else ...[
CustomButton( QuillToolbarCustomButton(
onPressed: customButton.onTap, options:
icon: customButton.iconData ?? toolbarConfigurations.buttonOptions.customButtons,
context.quillToolbarBaseButtonOptions?.iconData, controller: toolbarConfigurations
iconColor: customButton.iconColor, .buttonOptions.customButtons.controller ??
iconSize: customButton.iconSize ?? globalIconSize, globalController,
iconTheme: context
.requireQuillToolbarBaseButtonOptions.iconTheme,
afterButtonPressed: customButton.afterButtonPressed ??
context.quillToolbarBaseButtonOptions
?.afterButtonPressed,
tooltip: customButton.tooltip ??
context.quillToolbarBaseButtonOptions?.tooltip,
), ),
], ],
spacerWidget, spacerWidget,

@ -1,6 +1,6 @@
name: flutter_quill name: flutter_quill
description: A rich text editor built for the modern Android, iOS, web and desktop platforms. It is the WYSIWYG editor and a Quill component for Flutter. description: A rich text editor built for the modern Android, iOS, web and desktop platforms. It is the WYSIWYG editor and a Quill component for Flutter.
version: 8.3.0 version: 8.4.0
homepage: https://1o24bbs.com/c/bulletjournal/108 homepage: https://1o24bbs.com/c/bulletjournal/108
repository: https://github.com/singerdmx/flutter-quill repository: https://github.com/singerdmx/flutter-quill

Loading…
Cancel
Save