From aa35d0a92ddb0b9ec0f51aecdafaee9dc6e8b011 Mon Sep 17 00:00:00 2001 From: Maksim Nikolaev Date: Sun, 5 Jan 2025 19:45:26 +0100 Subject: [PATCH 01/27] Removed ClipboardMonitor from ClipboardAction.paste type button --- lib/src/toolbar/buttons/clipboard_button.dart | 43 ++++++------------- 1 file changed, 13 insertions(+), 30 deletions(-) diff --git a/lib/src/toolbar/buttons/clipboard_button.dart b/lib/src/toolbar/buttons/clipboard_button.dart index 1b631e8ce..85b6a5776 100644 --- a/lib/src/toolbar/buttons/clipboard_button.dart +++ b/lib/src/toolbar/buttons/clipboard_button.dart @@ -61,8 +61,6 @@ class QuillToolbarClipboardButton extends QuillToolbarToggleStyleBaseButton { final ClipboardAction clipboardAction; - final ClipboardMonitor _monitor = ClipboardMonitor(); - @override State createState() => QuillToolbarClipboardButtonState(); } @@ -78,23 +76,7 @@ class QuillToolbarClipboardButtonState case ClipboardAction.copy: return !controller.selection.isCollapsed; case ClipboardAction.paste: - return !controller.readOnly && (kIsWeb || widget._monitor.canPaste); - } - } - - void _listenClipboardStatus() => didChangeEditingValue(); - - @override - void addExtraListener() { - if (widget.clipboardAction == ClipboardAction.paste) { - widget._monitor.monitorClipboard(true, _listenClipboardStatus); - } - } - - @override - void removeExtraListener(covariant QuillToolbarClipboardButton oldWidget) { - if (widget.clipboardAction == ClipboardAction.paste) { - oldWidget._monitor.monitorClipboard(false, _listenClipboardStatus); + return !controller.readOnly; } } @@ -143,16 +125,17 @@ class QuillToolbarClipboardButtonState } return UtilityWidgets.maybeTooltip( - message: tooltip, - child: QuillToolbarIconButton( - icon: Icon( - iconData, - size: iconSize * iconButtonFactor, - ), - isSelected: false, - onPressed: currentValue ? _onPressed : null, - afterPressed: afterButtonPressed, - iconTheme: iconTheme, - )); + message: tooltip, + child: QuillToolbarIconButton( + icon: Icon( + iconData, + size: iconSize * iconButtonFactor, + ), + isSelected: false, + onPressed: currentValue ? _onPressed : null, + afterPressed: afterButtonPressed, + iconTheme: iconTheme, + ), + ); } } From 596af778e1044fafc6c2a1c4ce49d94e5935aa3c Mon Sep 17 00:00:00 2001 From: Maksim Nikolaev Date: Sun, 5 Jan 2025 20:00:04 +0100 Subject: [PATCH 02/27] Removed unused imports & added const keyword --- lib/src/toolbar/buttons/clipboard_button.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/src/toolbar/buttons/clipboard_button.dart b/lib/src/toolbar/buttons/clipboard_button.dart index 85b6a5776..f282adb1b 100644 --- a/lib/src/toolbar/buttons/clipboard_button.dart +++ b/lib/src/toolbar/buttons/clipboard_button.dart @@ -8,7 +8,6 @@ import 'package:flutter/material.dart'; import 'package:meta/meta.dart'; import '../../common/utils/widgets.dart'; -import '../../editor_toolbar_controller_shared/clipboard/clipboard_service_provider.dart'; import '../../l10n/extensions/localizations_ext.dart'; import '../base_button/base_value_button.dart'; import '../simple_toolbar.dart'; @@ -43,7 +42,7 @@ class ClipboardMonitor { @experimental class QuillToolbarClipboardButton extends QuillToolbarToggleStyleBaseButton { - QuillToolbarClipboardButton({ + const QuillToolbarClipboardButton({ required super.controller, required this.clipboardAction, QuillToolbarClipboardButtonOptions? options, From a91df17b160467c1fcd0d26fe010f732c2aaba62 Mon Sep 17 00:00:00 2001 From: Maksim Nikolaev Date: Sun, 5 Jan 2025 20:20:37 +0100 Subject: [PATCH 03/27] Revert "Removed ClipboardMonitor from ClipboardAction.paste type button" This reverts commit dac1cf69872dcc28001a479604f6c5d4e73c000e. --- lib/src/toolbar/buttons/clipboard_button.dart | 43 +++++++++++++------ 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/lib/src/toolbar/buttons/clipboard_button.dart b/lib/src/toolbar/buttons/clipboard_button.dart index f282adb1b..d8c04c669 100644 --- a/lib/src/toolbar/buttons/clipboard_button.dart +++ b/lib/src/toolbar/buttons/clipboard_button.dart @@ -60,6 +60,8 @@ class QuillToolbarClipboardButton extends QuillToolbarToggleStyleBaseButton { final ClipboardAction clipboardAction; + final ClipboardMonitor _monitor = ClipboardMonitor(); + @override State createState() => QuillToolbarClipboardButtonState(); } @@ -75,7 +77,23 @@ class QuillToolbarClipboardButtonState case ClipboardAction.copy: return !controller.selection.isCollapsed; case ClipboardAction.paste: - return !controller.readOnly; + return !controller.readOnly && (kIsWeb || widget._monitor.canPaste); + } + } + + void _listenClipboardStatus() => didChangeEditingValue(); + + @override + void addExtraListener() { + if (widget.clipboardAction == ClipboardAction.paste) { + widget._monitor.monitorClipboard(true, _listenClipboardStatus); + } + } + + @override + void removeExtraListener(covariant QuillToolbarClipboardButton oldWidget) { + if (widget.clipboardAction == ClipboardAction.paste) { + oldWidget._monitor.monitorClipboard(false, _listenClipboardStatus); } } @@ -124,17 +142,16 @@ class QuillToolbarClipboardButtonState } return UtilityWidgets.maybeTooltip( - message: tooltip, - child: QuillToolbarIconButton( - icon: Icon( - iconData, - size: iconSize * iconButtonFactor, - ), - isSelected: false, - onPressed: currentValue ? _onPressed : null, - afterPressed: afterButtonPressed, - iconTheme: iconTheme, - ), - ); + message: tooltip, + child: QuillToolbarIconButton( + icon: Icon( + iconData, + size: iconSize * iconButtonFactor, + ), + isSelected: false, + onPressed: currentValue ? _onPressed : null, + afterPressed: afterButtonPressed, + iconTheme: iconTheme, + )); } } From b202b7a797d1e82634f22f275146e6ced6372417 Mon Sep 17 00:00:00 2001 From: Maksim Nikolaev Date: Sun, 5 Jan 2025 20:20:55 +0100 Subject: [PATCH 04/27] Revert "Removed unused imports & added const keyword" This reverts commit dfeb9c26a506e5a62b9a651c7c258f4c97a24ccf. --- lib/src/toolbar/buttons/clipboard_button.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/src/toolbar/buttons/clipboard_button.dart b/lib/src/toolbar/buttons/clipboard_button.dart index d8c04c669..1b631e8ce 100644 --- a/lib/src/toolbar/buttons/clipboard_button.dart +++ b/lib/src/toolbar/buttons/clipboard_button.dart @@ -8,6 +8,7 @@ import 'package:flutter/material.dart'; import 'package:meta/meta.dart'; import '../../common/utils/widgets.dart'; +import '../../editor_toolbar_controller_shared/clipboard/clipboard_service_provider.dart'; import '../../l10n/extensions/localizations_ext.dart'; import '../base_button/base_value_button.dart'; import '../simple_toolbar.dart'; @@ -42,7 +43,7 @@ class ClipboardMonitor { @experimental class QuillToolbarClipboardButton extends QuillToolbarToggleStyleBaseButton { - const QuillToolbarClipboardButton({ + QuillToolbarClipboardButton({ required super.controller, required this.clipboardAction, QuillToolbarClipboardButtonOptions? options, From 7600a4d753dc51648e86072b0b6dd6f516cd6a63 Mon Sep 17 00:00:00 2001 From: Maksim Nikolaev Date: Sun, 5 Jan 2025 21:57:47 +0100 Subject: [PATCH 05/27] added enableClipboardPaste to QuillSimpleToolbarConfig --- lib/src/toolbar/buttons/clipboard_button.dart | 102 ++++++++++++++---- .../toolbar/config/simple_toolbar_config.dart | 5 + lib/src/toolbar/simple_toolbar.dart | 1 + 3 files changed, 88 insertions(+), 20 deletions(-) diff --git a/lib/src/toolbar/buttons/clipboard_button.dart b/lib/src/toolbar/buttons/clipboard_button.dart index 1b631e8ce..5f7866476 100644 --- a/lib/src/toolbar/buttons/clipboard_button.dart +++ b/lib/src/toolbar/buttons/clipboard_button.dart @@ -22,32 +22,60 @@ class ClipboardMonitor { bool get canPaste => _canPaste; Timer? _timer; + bool _isCheckingClipboard = false; + void monitorClipboard(bool add, void Function() listener) { if (kIsWeb) return; + if (add) { _timer = Timer.periodic( - const Duration(seconds: 1), (timer) => _update(listener)); + const Duration(seconds: 5), + (timer) => _update(listener), + ); } else { _timer?.cancel(); } } Future _update(void Function() listener) async { + // If the clipboard is already being checked, return early. + if (_isCheckingClipboard) { + return; + } + + // Prevent multiple clipboard checks at the same time. + _isCheckingClipboard = true; + + // Initialize the clipboard service. final clipboardService = ClipboardServiceProvider.instance; + + // Check if the clipboard has content. if (await clipboardService.hasClipboardContent) { + // If the clipboard has content, set the flag to true. _canPaste = true; + + // Notify the listener that the clipboard has content. listener(); } + + // Prevent multiple clipboard checks at the same time. + _isCheckingClipboard = false; } } @experimental class QuillToolbarClipboardButton extends QuillToolbarToggleStyleBaseButton { - QuillToolbarClipboardButton({ + const QuillToolbarClipboardButton({ required super.controller, required this.clipboardAction, QuillToolbarClipboardButtonOptions? options, + // If null, uses in-built [ClipboardMonitor] + // If true, paste button is enabled (if true & not readonly) + // If false, paste button is disabled + final bool? canPaste, + this.enableClipboardPaste, + /// Shares common options between all buttons, prefer the [options] /// over the [baseOptions]. super.baseOptions, @@ -61,7 +89,7 @@ class QuillToolbarClipboardButton extends QuillToolbarToggleStyleBaseButton { final ClipboardAction clipboardAction; - final ClipboardMonitor _monitor = ClipboardMonitor(); + final bool? enableClipboardPaste; @override State createState() => QuillToolbarClipboardButtonState(); @@ -70,6 +98,8 @@ class QuillToolbarClipboardButton extends QuillToolbarToggleStyleBaseButton { class QuillToolbarClipboardButtonState extends QuillToolbarToggleStyleBaseButtonState< QuillToolbarClipboardButton> { + final ClipboardMonitor _monitor = ClipboardMonitor(); + @override bool get currentStateValue { switch (widget.clipboardAction) { @@ -78,23 +108,54 @@ class QuillToolbarClipboardButtonState case ClipboardAction.copy: return !controller.selection.isCollapsed; case ClipboardAction.paste: - return !controller.readOnly && (kIsWeb || widget._monitor.canPaste); + return !controller.readOnly && + (kIsWeb || (widget.enableClipboardPaste ?? _monitor.canPaste)); } } - void _listenClipboardStatus() => didChangeEditingValue(); + void _listenClipboardStatus() { + didChangeEditingValue(); + } + + @override + void didUpdateWidget(QuillToolbarClipboardButton oldWidget) { + super.didUpdateWidget(oldWidget); + + // Default didUpdateWidget handler, otherwise simple flag change didn't stop the monitor + if (oldWidget.controller != controller) { + oldWidget.controller.removeListener(didChangeEditingValue); + removeExtraListener(oldWidget); + controller.addListener(didChangeEditingValue); + addExtraListener(); + currentValue = currentStateValue; + } + // If controller didn't change, but something else did (enableClipboardPaste) + else if (widget.clipboardAction == ClipboardAction.paste) { + // If enableClipboardPaste is not null, disable monitors + if (widget.enableClipboardPaste != null) { + _monitor.monitorClipboard(false, _listenClipboardStatus); + currentValue = currentStateValue; + } else { + // Otherwise remove old listener and add a new one + _monitor.monitorClipboard(true, _listenClipboardStatus); + currentValue = currentStateValue; + } + } + } @override void addExtraListener() { - if (widget.clipboardAction == ClipboardAction.paste) { - widget._monitor.monitorClipboard(true, _listenClipboardStatus); + if (widget.clipboardAction == ClipboardAction.paste && + widget.enableClipboardPaste == null) { + _monitor.monitorClipboard(true, _listenClipboardStatus); } } @override void removeExtraListener(covariant QuillToolbarClipboardButton oldWidget) { - if (widget.clipboardAction == ClipboardAction.paste) { - oldWidget._monitor.monitorClipboard(false, _listenClipboardStatus); + if (widget.clipboardAction == ClipboardAction.paste && + widget.enableClipboardPaste == null) { + _monitor.monitorClipboard(false, _listenClipboardStatus); } } @@ -143,16 +204,17 @@ class QuillToolbarClipboardButtonState } return UtilityWidgets.maybeTooltip( - message: tooltip, - child: QuillToolbarIconButton( - icon: Icon( - iconData, - size: iconSize * iconButtonFactor, - ), - isSelected: false, - onPressed: currentValue ? _onPressed : null, - afterPressed: afterButtonPressed, - iconTheme: iconTheme, - )); + message: tooltip, + child: QuillToolbarIconButton( + icon: Icon( + iconData, + size: iconSize * iconButtonFactor, + ), + isSelected: false, + onPressed: currentValue ? _onPressed : null, + afterPressed: afterButtonPressed, + iconTheme: iconTheme, + ), + ); } } diff --git a/lib/src/toolbar/config/simple_toolbar_config.dart b/lib/src/toolbar/config/simple_toolbar_config.dart index 349bdcd26..fa254b2a6 100644 --- a/lib/src/toolbar/config/simple_toolbar_config.dart +++ b/lib/src/toolbar/config/simple_toolbar_config.dart @@ -186,6 +186,11 @@ class QuillSimpleToolbarConfig { @experimental final bool showClipboardPaste; + /// If null, uses in-built [ClipboardMonitor] + /// If true, paste button is enabled (if true & not readonly) + /// If false, paste button is disabled + final bool? enableClipboardPaste; + /// This activates a functionality that is only implemented in [flutter_quill] and is NOT originally /// used in the [Quill Js API]. So it could cause conflicts if you use this attribute with the original Delta format of Quill Js final bool showLineHeightButton; diff --git a/lib/src/toolbar/simple_toolbar.dart b/lib/src/toolbar/simple_toolbar.dart index dbfd42687..7cf03c1cf 100644 --- a/lib/src/toolbar/simple_toolbar.dart +++ b/lib/src/toolbar/simple_toolbar.dart @@ -307,6 +307,7 @@ class QuillSimpleToolbar extends StatelessWidget options: config.buttonOptions.clipboardPaste, controller: controller, clipboardAction: ClipboardAction.paste, + enableClipboardPaste: config.enableClipboardPaste, ), ], [ From 0d4f4211601f8d8f2cb77d46c8ef478bd0d46d4d Mon Sep 17 00:00:00 2001 From: Maksim Nikolaev Date: Sun, 5 Jan 2025 22:26:35 +0100 Subject: [PATCH 06/27] Reverted 5 seconds to 1 second periodic timer --- lib/src/toolbar/buttons/clipboard_button.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/toolbar/buttons/clipboard_button.dart b/lib/src/toolbar/buttons/clipboard_button.dart index 5f7866476..ae2b5559e 100644 --- a/lib/src/toolbar/buttons/clipboard_button.dart +++ b/lib/src/toolbar/buttons/clipboard_button.dart @@ -29,7 +29,7 @@ class ClipboardMonitor { if (add) { _timer = Timer.periodic( - const Duration(seconds: 5), + const Duration(seconds: 1), (timer) => _update(listener), ); } else { From 5a729a6e676c39c15bd3b7fb6e6346f7537c3031 Mon Sep 17 00:00:00 2001 From: Maksim Nikolaev Date: Sun, 5 Jan 2025 23:47:33 +0100 Subject: [PATCH 07/27] moved enableClipboardPaste to button config --- lib/src/toolbar/buttons/clipboard_button.dart | 21 ++++++------------- .../toolbar/config/base_button_options.dart | 6 ++++++ .../config/buttons/toggle_style_options.dart | 1 + lib/src/toolbar/simple_toolbar.dart | 1 - 4 files changed, 13 insertions(+), 16 deletions(-) diff --git a/lib/src/toolbar/buttons/clipboard_button.dart b/lib/src/toolbar/buttons/clipboard_button.dart index ae2b5559e..860ad1913 100644 --- a/lib/src/toolbar/buttons/clipboard_button.dart +++ b/lib/src/toolbar/buttons/clipboard_button.dart @@ -70,12 +70,6 @@ class QuillToolbarClipboardButton extends QuillToolbarToggleStyleBaseButton { required this.clipboardAction, QuillToolbarClipboardButtonOptions? options, - // If null, uses in-built [ClipboardMonitor] - // If true, paste button is enabled (if true & not readonly) - // If false, paste button is disabled - final bool? canPaste, - this.enableClipboardPaste, - /// Shares common options between all buttons, prefer the [options] /// over the [baseOptions]. super.baseOptions, @@ -89,8 +83,6 @@ class QuillToolbarClipboardButton extends QuillToolbarToggleStyleBaseButton { final ClipboardAction clipboardAction; - final bool? enableClipboardPaste; - @override State createState() => QuillToolbarClipboardButtonState(); } @@ -109,13 +101,12 @@ class QuillToolbarClipboardButtonState return !controller.selection.isCollapsed; case ClipboardAction.paste: return !controller.readOnly && - (kIsWeb || (widget.enableClipboardPaste ?? _monitor.canPaste)); + (kIsWeb || + (widget.options.enableClipboardPaste ?? _monitor.canPaste)); } } - void _listenClipboardStatus() { - didChangeEditingValue(); - } + void _listenClipboardStatus() => didChangeEditingValue(); @override void didUpdateWidget(QuillToolbarClipboardButton oldWidget) { @@ -132,7 +123,7 @@ class QuillToolbarClipboardButtonState // If controller didn't change, but something else did (enableClipboardPaste) else if (widget.clipboardAction == ClipboardAction.paste) { // If enableClipboardPaste is not null, disable monitors - if (widget.enableClipboardPaste != null) { + if (widget.options.enableClipboardPaste != null) { _monitor.monitorClipboard(false, _listenClipboardStatus); currentValue = currentStateValue; } else { @@ -146,7 +137,7 @@ class QuillToolbarClipboardButtonState @override void addExtraListener() { if (widget.clipboardAction == ClipboardAction.paste && - widget.enableClipboardPaste == null) { + widget.options.enableClipboardPaste == null) { _monitor.monitorClipboard(true, _listenClipboardStatus); } } @@ -154,7 +145,7 @@ class QuillToolbarClipboardButtonState @override void removeExtraListener(covariant QuillToolbarClipboardButton oldWidget) { if (widget.clipboardAction == ClipboardAction.paste && - widget.enableClipboardPaste == null) { + widget.options.enableClipboardPaste == null) { _monitor.monitorClipboard(false, _listenClipboardStatus); } } diff --git a/lib/src/toolbar/config/base_button_options.dart b/lib/src/toolbar/config/base_button_options.dart index 699238c99..27a05a086 100644 --- a/lib/src/toolbar/config/base_button_options.dart +++ b/lib/src/toolbar/config/base_button_options.dart @@ -41,6 +41,7 @@ class QuillToolbarBaseButtonOptions { this.afterButtonPressed, this.tooltip, this.iconTheme, + this.enableClipboardPaste, this.childBuilder, }); @@ -65,6 +66,11 @@ class QuillToolbarBaseButtonOptions { /// Use custom theme final QuillIconTheme? iconTheme; + /// Disables the [ClipboardMonitor] of [QuillToolbarClipboardButton] if not null + /// If true or false, it will enable or disable the clipboard paste button + /// Only affects the clipboard paste button + final bool? enableClipboardPaste; + /// If you want to display a different widget based using a builder final QuillToolbarButtonOptionsChildBuilder childBuilder; } diff --git a/lib/src/toolbar/config/buttons/toggle_style_options.dart b/lib/src/toolbar/config/buttons/toggle_style_options.dart index 1ef207b69..7b6bbacd1 100644 --- a/lib/src/toolbar/config/buttons/toggle_style_options.dart +++ b/lib/src/toolbar/config/buttons/toggle_style_options.dart @@ -29,5 +29,6 @@ class QuillToolbarToggleStyleButtonOptions super.afterButtonPressed, super.iconTheme, super.childBuilder, + super.enableClipboardPaste, }); } diff --git a/lib/src/toolbar/simple_toolbar.dart b/lib/src/toolbar/simple_toolbar.dart index 7cf03c1cf..dbfd42687 100644 --- a/lib/src/toolbar/simple_toolbar.dart +++ b/lib/src/toolbar/simple_toolbar.dart @@ -307,7 +307,6 @@ class QuillSimpleToolbar extends StatelessWidget options: config.buttonOptions.clipboardPaste, controller: controller, clipboardAction: ClipboardAction.paste, - enableClipboardPaste: config.enableClipboardPaste, ), ], [ From 22b744f2fc74382f8f687e63558853051ff44347 Mon Sep 17 00:00:00 2001 From: Maksim Nikolaev Date: Mon, 6 Jan 2025 00:13:14 +0100 Subject: [PATCH 08/27] Fix monitor enabling & disabling --- lib/src/toolbar/buttons/clipboard_button.dart | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/lib/src/toolbar/buttons/clipboard_button.dart b/lib/src/toolbar/buttons/clipboard_button.dart index 860ad1913..8a22b8ad7 100644 --- a/lib/src/toolbar/buttons/clipboard_button.dart +++ b/lib/src/toolbar/buttons/clipboard_button.dart @@ -36,7 +36,7 @@ class ClipboardMonitor { _timer?.cancel(); } } - + Future _update(void Function() listener) async { // If the clipboard is already being checked, return early. if (_isCheckingClipboard) { @@ -122,15 +122,19 @@ class QuillToolbarClipboardButtonState } // If controller didn't change, but something else did (enableClipboardPaste) else if (widget.clipboardAction == ClipboardAction.paste) { - // If enableClipboardPaste is not null, disable monitors - if (widget.options.enableClipboardPaste != null) { - _monitor.monitorClipboard(false, _listenClipboardStatus); - currentValue = currentStateValue; + // If enableClipboardPaste is null, check if clipboard monitor is active and enable it if not + if (widget.options.enableClipboardPaste == null) { + if (!(_monitor._timer?.isActive ?? false)) { + _monitor.monitorClipboard(true, _listenClipboardStatus); + } } else { - // Otherwise remove old listener and add a new one - _monitor.monitorClipboard(true, _listenClipboardStatus); - currentValue = currentStateValue; + // Otherwise check if the timer is active and disable it + if (_monitor._timer == null || _monitor._timer!.isActive) { + _monitor.monitorClipboard(false, _listenClipboardStatus); + } } + + currentValue = currentStateValue; } } From 74df2ced3292c54ad9415e39932fc04500dd75b4 Mon Sep 17 00:00:00 2001 From: Maksim Nikolaev Date: Mon, 6 Jan 2025 00:16:51 +0100 Subject: [PATCH 09/27] dartformat --- lib/src/toolbar/buttons/clipboard_button.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/toolbar/buttons/clipboard_button.dart b/lib/src/toolbar/buttons/clipboard_button.dart index 8a22b8ad7..cfecad841 100644 --- a/lib/src/toolbar/buttons/clipboard_button.dart +++ b/lib/src/toolbar/buttons/clipboard_button.dart @@ -36,7 +36,7 @@ class ClipboardMonitor { _timer?.cancel(); } } - + Future _update(void Function() listener) async { // If the clipboard is already being checked, return early. if (_isCheckingClipboard) { From 80c779d6fffcbf1a27d90494d4323de98bea14e1 Mon Sep 17 00:00:00 2001 From: Maksim Nikolaev Date: Mon, 6 Jan 2025 00:37:57 +0100 Subject: [PATCH 10/27] remove enableClipboardPaste from toolbar config --- lib/src/toolbar/config/simple_toolbar_config.dart | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lib/src/toolbar/config/simple_toolbar_config.dart b/lib/src/toolbar/config/simple_toolbar_config.dart index fa254b2a6..349bdcd26 100644 --- a/lib/src/toolbar/config/simple_toolbar_config.dart +++ b/lib/src/toolbar/config/simple_toolbar_config.dart @@ -186,11 +186,6 @@ class QuillSimpleToolbarConfig { @experimental final bool showClipboardPaste; - /// If null, uses in-built [ClipboardMonitor] - /// If true, paste button is enabled (if true & not readonly) - /// If false, paste button is disabled - final bool? enableClipboardPaste; - /// This activates a functionality that is only implemented in [flutter_quill] and is NOT originally /// used in the [Quill Js API]. So it could cause conflicts if you use this attribute with the original Delta format of Quill Js final bool showLineHeightButton; From f85e4442ebca7ef04db71419417993db258552a9 Mon Sep 17 00:00:00 2001 From: Maksim Nikolaev Date: Thu, 9 Jan 2025 15:37:33 +0100 Subject: [PATCH 11/27] Adjusted comments & documentation --- lib/src/toolbar/buttons/clipboard_button.dart | 6 ------ lib/src/toolbar/config/base_button_options.dart | 8 +++++--- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/lib/src/toolbar/buttons/clipboard_button.dart b/lib/src/toolbar/buttons/clipboard_button.dart index cfecad841..d53bacb8d 100644 --- a/lib/src/toolbar/buttons/clipboard_button.dart +++ b/lib/src/toolbar/buttons/clipboard_button.dart @@ -43,22 +43,16 @@ class ClipboardMonitor { return; } - // Prevent multiple clipboard checks at the same time. _isCheckingClipboard = true; - // Initialize the clipboard service. final clipboardService = ClipboardServiceProvider.instance; - // Check if the clipboard has content. if (await clipboardService.hasClipboardContent) { - // If the clipboard has content, set the flag to true. _canPaste = true; - // Notify the listener that the clipboard has content. listener(); } - // Prevent multiple clipboard checks at the same time. _isCheckingClipboard = false; } } diff --git a/lib/src/toolbar/config/base_button_options.dart b/lib/src/toolbar/config/base_button_options.dart index 27a05a086..498266f8c 100644 --- a/lib/src/toolbar/config/base_button_options.dart +++ b/lib/src/toolbar/config/base_button_options.dart @@ -66,9 +66,11 @@ class QuillToolbarBaseButtonOptions { /// Use custom theme final QuillIconTheme? iconTheme; - /// Disables the [ClipboardMonitor] of [QuillToolbarClipboardButton] if not null - /// If true or false, it will enable or disable the clipboard paste button - /// Only affects the clipboard paste button + /// Determines if the paste button is enabled. + /// + /// Defaults to [ClipboardMonitor] in case of `null`, which will check if the clipboard has content to paste every second, and only then enable the button, indicating to the user that they can paste something. + /// + /// Set to `true` to always enable it even if the clipboard has no content to paste, which will do nothing on a press. final bool? enableClipboardPaste; /// If you want to display a different widget based using a builder From df4fd18de8a1fc9e60f63fb45695a9c7337fc6f4 Mon Sep 17 00:00:00 2001 From: Maksim Nikolaev Date: Thu, 9 Jan 2025 21:17:50 +0100 Subject: [PATCH 12/27] dart format --- lib/src/toolbar/config/base_button_options.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/toolbar/config/base_button_options.dart b/lib/src/toolbar/config/base_button_options.dart index 498266f8c..d154da5d9 100644 --- a/lib/src/toolbar/config/base_button_options.dart +++ b/lib/src/toolbar/config/base_button_options.dart @@ -66,7 +66,7 @@ class QuillToolbarBaseButtonOptions { /// Use custom theme final QuillIconTheme? iconTheme; - /// Determines if the paste button is enabled. + /// Determines if the paste button is enabled. /// /// Defaults to [ClipboardMonitor] in case of `null`, which will check if the clipboard has content to paste every second, and only then enable the button, indicating to the user that they can paste something. /// From 3d689c7207aa9317a4f67957929c962dcf28da7d Mon Sep 17 00:00:00 2001 From: Ellet Date: Fri, 10 Jan 2025 14:28:47 +0300 Subject: [PATCH 13/27] docs: improve doc comment of enableClipboardPaste --- lib/src/toolbar/config/base_button_options.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/src/toolbar/config/base_button_options.dart b/lib/src/toolbar/config/base_button_options.dart index d154da5d9..77e158514 100644 --- a/lib/src/toolbar/config/base_button_options.dart +++ b/lib/src/toolbar/config/base_button_options.dart @@ -66,11 +66,11 @@ class QuillToolbarBaseButtonOptions { /// Use custom theme final QuillIconTheme? iconTheme; - /// Determines if the paste button is enabled. + /// Determines if the paste button is enabled. The button is disabled and cannot be clicked if set to `false`. /// - /// Defaults to [ClipboardMonitor] in case of `null`, which will check if the clipboard has content to paste every second, and only then enable the button, indicating to the user that they can paste something. + /// Defaults to [ClipboardMonitor] in case of `null`, which checks if the clipboard has content to paste every second and only then enables the button, indicating to the user that they can paste something. /// - /// Set to `true` to always enable it even if the clipboard has no content to paste, which will do nothing on a press. + /// Set it to `true` to enable it even if the clipboard has no content to paste, which will do nothing on a press. final bool? enableClipboardPaste; /// If you want to display a different widget based using a builder From e41abf327e70c51f0d94da59ec98ab4eec776340 Mon Sep 17 00:00:00 2001 From: Ellet Date: Fri, 10 Jan 2025 14:32:59 +0300 Subject: [PATCH 14/27] docs: minor changes to comments --- lib/src/toolbar/buttons/clipboard_button.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/src/toolbar/buttons/clipboard_button.dart b/lib/src/toolbar/buttons/clipboard_button.dart index d53bacb8d..e229efc2f 100644 --- a/lib/src/toolbar/buttons/clipboard_button.dart +++ b/lib/src/toolbar/buttons/clipboard_button.dart @@ -106,7 +106,7 @@ class QuillToolbarClipboardButtonState void didUpdateWidget(QuillToolbarClipboardButton oldWidget) { super.didUpdateWidget(oldWidget); - // Default didUpdateWidget handler, otherwise simple flag change didn't stop the monitor + // Default didUpdateWidget handler, otherwise simple flag change didn't stop the monitor. if (oldWidget.controller != controller) { oldWidget.controller.removeListener(didChangeEditingValue); removeExtraListener(oldWidget); @@ -114,15 +114,15 @@ class QuillToolbarClipboardButtonState addExtraListener(); currentValue = currentStateValue; } - // If controller didn't change, but something else did (enableClipboardPaste) + // The controller didn't change, but enableClipboardPaste did. else if (widget.clipboardAction == ClipboardAction.paste) { - // If enableClipboardPaste is null, check if clipboard monitor is active and enable it if not + // Check if the clipboard monitor is active and enable it if not. if (widget.options.enableClipboardPaste == null) { if (!(_monitor._timer?.isActive ?? false)) { _monitor.monitorClipboard(true, _listenClipboardStatus); } } else { - // Otherwise check if the timer is active and disable it + // Otherwise check if the timer is active and disable it. if (_monitor._timer == null || _monitor._timer!.isActive) { _monitor.monitorClipboard(false, _listenClipboardStatus); } From db97d4fe495b0c8e4344911367abebc8711a9cc2 Mon Sep 17 00:00:00 2001 From: Ellet Date: Fri, 10 Jan 2025 15:03:37 +0300 Subject: [PATCH 15/27] revert: remove the addition of const keyword to QuillToolbarClipboardButton --- lib/src/toolbar/buttons/clipboard_button.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/toolbar/buttons/clipboard_button.dart b/lib/src/toolbar/buttons/clipboard_button.dart index e229efc2f..06077dcb4 100644 --- a/lib/src/toolbar/buttons/clipboard_button.dart +++ b/lib/src/toolbar/buttons/clipboard_button.dart @@ -59,7 +59,7 @@ class ClipboardMonitor { @experimental class QuillToolbarClipboardButton extends QuillToolbarToggleStyleBaseButton { - const QuillToolbarClipboardButton({ + QuillToolbarClipboardButton({ required super.controller, required this.clipboardAction, QuillToolbarClipboardButtonOptions? options, From daa20cd289db163d5d22e7bc6b157113aed544e0 Mon Sep 17 00:00:00 2001 From: Maksim Nikolaev Date: Fri, 10 Jan 2025 13:17:39 +0100 Subject: [PATCH 16/27] Updated code readability with getter shouldUseClipboardMonitor --- lib/src/toolbar/buttons/clipboard_button.dart | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/lib/src/toolbar/buttons/clipboard_button.dart b/lib/src/toolbar/buttons/clipboard_button.dart index 06077dcb4..a75b2af38 100644 --- a/lib/src/toolbar/buttons/clipboard_button.dart +++ b/lib/src/toolbar/buttons/clipboard_button.dart @@ -116,16 +116,15 @@ class QuillToolbarClipboardButtonState } // The controller didn't change, but enableClipboardPaste did. else if (widget.clipboardAction == ClipboardAction.paste) { - // Check if the clipboard monitor is active and enable it if not. - if (widget.options.enableClipboardPaste == null) { - if (!(_monitor._timer?.isActive ?? false)) { - _monitor.monitorClipboard(true, _listenClipboardStatus); - } - } else { - // Otherwise check if the timer is active and disable it. - if (_monitor._timer == null || _monitor._timer!.isActive) { - _monitor.monitorClipboard(false, _listenClipboardStatus); - } + final isTimerActive = _monitor._timer?.isActive ?? false; + + // Enable clipboard monitoring if not active and should be monitored. + if (shouldUseClipboardMonitor && !isTimerActive) { + _monitor.monitorClipboard(true, _listenClipboardStatus); + } + // Disable clipboard monitoring if active and should not be monitored. + else if (!shouldUseClipboardMonitor && isTimerActive) { + _monitor.monitorClipboard(false, _listenClipboardStatus); } currentValue = currentStateValue; @@ -134,16 +133,14 @@ class QuillToolbarClipboardButtonState @override void addExtraListener() { - if (widget.clipboardAction == ClipboardAction.paste && - widget.options.enableClipboardPaste == null) { + if (shouldUseClipboardMonitor) { _monitor.monitorClipboard(true, _listenClipboardStatus); } } @override void removeExtraListener(covariant QuillToolbarClipboardButton oldWidget) { - if (widget.clipboardAction == ClipboardAction.paste && - widget.options.enableClipboardPaste == null) { + if (shouldUseClipboardMonitor) { _monitor.monitorClipboard(false, _listenClipboardStatus); } } @@ -162,6 +159,11 @@ class QuillToolbarClipboardButtonState ClipboardAction.paste => Icons.paste_outlined, }; + bool get shouldUseClipboardMonitor { + return widget.clipboardAction == ClipboardAction.paste && + widget.options.enableClipboardPaste == null; + } + void _onPressed() { switch (widget.clipboardAction) { case ClipboardAction.cut: From f0a4616e66b309d4501b0b2d5001c1daa6b6cbc0 Mon Sep 17 00:00:00 2001 From: Maksim Nikolaev Date: Fri, 10 Jan 2025 13:48:02 +0100 Subject: [PATCH 17/27] Make the _shouldUseClipboardMonitor getter private --- lib/src/toolbar/buttons/clipboard_button.dart | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/src/toolbar/buttons/clipboard_button.dart b/lib/src/toolbar/buttons/clipboard_button.dart index a75b2af38..d5ed8a057 100644 --- a/lib/src/toolbar/buttons/clipboard_button.dart +++ b/lib/src/toolbar/buttons/clipboard_button.dart @@ -119,11 +119,11 @@ class QuillToolbarClipboardButtonState final isTimerActive = _monitor._timer?.isActive ?? false; // Enable clipboard monitoring if not active and should be monitored. - if (shouldUseClipboardMonitor && !isTimerActive) { + if (_shouldUseClipboardMonitor && !isTimerActive) { _monitor.monitorClipboard(true, _listenClipboardStatus); } // Disable clipboard monitoring if active and should not be monitored. - else if (!shouldUseClipboardMonitor && isTimerActive) { + else if (!_shouldUseClipboardMonitor && isTimerActive) { _monitor.monitorClipboard(false, _listenClipboardStatus); } @@ -133,14 +133,14 @@ class QuillToolbarClipboardButtonState @override void addExtraListener() { - if (shouldUseClipboardMonitor) { + if (_shouldUseClipboardMonitor) { _monitor.monitorClipboard(true, _listenClipboardStatus); } } @override void removeExtraListener(covariant QuillToolbarClipboardButton oldWidget) { - if (shouldUseClipboardMonitor) { + if (_shouldUseClipboardMonitor) { _monitor.monitorClipboard(false, _listenClipboardStatus); } } @@ -159,7 +159,7 @@ class QuillToolbarClipboardButtonState ClipboardAction.paste => Icons.paste_outlined, }; - bool get shouldUseClipboardMonitor { + bool get _shouldUseClipboardMonitor { return widget.clipboardAction == ClipboardAction.paste && widget.options.enableClipboardPaste == null; } From 7a8a2e565ea78d6cb2d1285dc0352120d0783c7b Mon Sep 17 00:00:00 2001 From: Maksim Nikolaev Date: Fri, 17 Jan 2025 15:42:25 +0100 Subject: [PATCH 18/27] Update clipboard_button.dart --- lib/src/toolbar/buttons/clipboard_button.dart | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/src/toolbar/buttons/clipboard_button.dart b/lib/src/toolbar/buttons/clipboard_button.dart index d5ed8a057..3a038f3a0 100644 --- a/lib/src/toolbar/buttons/clipboard_button.dart +++ b/lib/src/toolbar/buttons/clipboard_button.dart @@ -71,8 +71,6 @@ class QuillToolbarClipboardButton extends QuillToolbarToggleStyleBaseButton { }) : _options = options, super(options: options ?? const QuillToolbarClipboardButtonOptions()); - // TODO: This field will be used by the PR: https://github.com/singerdmx/flutter-quill/pull/2427 - // ignore: unused_field final QuillToolbarClipboardButtonOptions? _options; final ClipboardAction clipboardAction; @@ -96,7 +94,7 @@ class QuillToolbarClipboardButtonState case ClipboardAction.paste: return !controller.readOnly && (kIsWeb || - (widget.options.enableClipboardPaste ?? _monitor.canPaste)); + (widget._options?.enableClipboardPaste ?? _monitor.canPaste)); } } @@ -161,7 +159,7 @@ class QuillToolbarClipboardButtonState bool get _shouldUseClipboardMonitor { return widget.clipboardAction == ClipboardAction.paste && - widget.options.enableClipboardPaste == null; + (widget._options?.enableClipboardPaste == null); } void _onPressed() { From a48c90f24709a6510f4610e3a7578d8a895dc2f8 Mon Sep 17 00:00:00 2001 From: Maksim Nikolaev Date: Fri, 17 Jan 2025 16:33:43 +0100 Subject: [PATCH 19/27] removed enableClipboardPaste from base_button_options --- lib/src/toolbar/config/base_button_options.dart | 9 --------- 1 file changed, 9 deletions(-) diff --git a/lib/src/toolbar/config/base_button_options.dart b/lib/src/toolbar/config/base_button_options.dart index 77e158514..18190bb7d 100644 --- a/lib/src/toolbar/config/base_button_options.dart +++ b/lib/src/toolbar/config/base_button_options.dart @@ -41,7 +41,6 @@ class QuillToolbarBaseButtonOptions { this.afterButtonPressed, this.tooltip, this.iconTheme, - this.enableClipboardPaste, this.childBuilder, }); @@ -65,14 +64,6 @@ class QuillToolbarBaseButtonOptions { /// Use custom theme final QuillIconTheme? iconTheme; - - /// Determines if the paste button is enabled. The button is disabled and cannot be clicked if set to `false`. - /// - /// Defaults to [ClipboardMonitor] in case of `null`, which checks if the clipboard has content to paste every second and only then enables the button, indicating to the user that they can paste something. - /// - /// Set it to `true` to enable it even if the clipboard has no content to paste, which will do nothing on a press. - final bool? enableClipboardPaste; - /// If you want to display a different widget based using a builder final QuillToolbarButtonOptionsChildBuilder childBuilder; } From fd4dd91fb4159f97c41a60509d074f39b77c3102 Mon Sep 17 00:00:00 2001 From: Ellet Date: Fri, 17 Jan 2025 18:20:28 +0300 Subject: [PATCH 20/27] chore: revert the trailing comma --- lib/src/toolbar/buttons/clipboard_button.dart | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/lib/src/toolbar/buttons/clipboard_button.dart b/lib/src/toolbar/buttons/clipboard_button.dart index 3a038f3a0..8c31cc08a 100644 --- a/lib/src/toolbar/buttons/clipboard_button.dart +++ b/lib/src/toolbar/buttons/clipboard_button.dart @@ -193,17 +193,16 @@ class QuillToolbarClipboardButtonState } return UtilityWidgets.maybeTooltip( - message: tooltip, - child: QuillToolbarIconButton( - icon: Icon( - iconData, - size: iconSize * iconButtonFactor, - ), - isSelected: false, - onPressed: currentValue ? _onPressed : null, - afterPressed: afterButtonPressed, - iconTheme: iconTheme, - ), - ); + message: tooltip, + child: QuillToolbarIconButton( + icon: Icon( + iconData, + size: iconSize * iconButtonFactor, + ), + isSelected: false, + onPressed: currentValue ? _onPressed : null, + afterPressed: afterButtonPressed, + iconTheme: iconTheme, + )); } } From e00464733504f886f950df1f3192ca2339896e94 Mon Sep 17 00:00:00 2001 From: Ellet Date: Sat, 18 Jan 2025 13:05:37 +0300 Subject: [PATCH 21/27] chore: revert changes to base_button_options.dart --- lib/src/toolbar/config/base_button_options.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/src/toolbar/config/base_button_options.dart b/lib/src/toolbar/config/base_button_options.dart index 18190bb7d..699238c99 100644 --- a/lib/src/toolbar/config/base_button_options.dart +++ b/lib/src/toolbar/config/base_button_options.dart @@ -64,6 +64,7 @@ class QuillToolbarBaseButtonOptions { /// Use custom theme final QuillIconTheme? iconTheme; + /// If you want to display a different widget based using a builder final QuillToolbarButtonOptionsChildBuilder childBuilder; } From fb0084e72ead38c51b442a667365282fcd7d42a7 Mon Sep 17 00:00:00 2001 From: Maksim Nikolaev Date: Sat, 18 Jan 2025 12:02:01 +0100 Subject: [PATCH 22/27] Update toggle_style_options.dart --- lib/src/toolbar/config/buttons/toggle_style_options.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/src/toolbar/config/buttons/toggle_style_options.dart b/lib/src/toolbar/config/buttons/toggle_style_options.dart index 7b6bbacd1..1ef207b69 100644 --- a/lib/src/toolbar/config/buttons/toggle_style_options.dart +++ b/lib/src/toolbar/config/buttons/toggle_style_options.dart @@ -29,6 +29,5 @@ class QuillToolbarToggleStyleButtonOptions super.afterButtonPressed, super.iconTheme, super.childBuilder, - super.enableClipboardPaste, }); } From a58d4e683ebcffd82e94c8b80472be0105ab1373 Mon Sep 17 00:00:00 2001 From: Ellet Date: Sat, 18 Jan 2025 15:28:39 +0300 Subject: [PATCH 23/27] revert: trailing comma in clipboard_button.dart --- lib/src/toolbar/buttons/clipboard_button.dart | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/src/toolbar/buttons/clipboard_button.dart b/lib/src/toolbar/buttons/clipboard_button.dart index 8c31cc08a..6c8e8f66c 100644 --- a/lib/src/toolbar/buttons/clipboard_button.dart +++ b/lib/src/toolbar/buttons/clipboard_button.dart @@ -29,9 +29,7 @@ class ClipboardMonitor { if (add) { _timer = Timer.periodic( - const Duration(seconds: 1), - (timer) => _update(listener), - ); + const Duration(seconds: 1), (timer) => _update(listener)); } else { _timer?.cancel(); } From e03cef5581a0275bdbaa7cf6e861c3ac40784a42 Mon Sep 17 00:00:00 2001 From: Ellet Date: Sat, 18 Jan 2025 15:29:41 +0300 Subject: [PATCH 24/27] revert: formatting to clipboard_button.dart --- lib/src/toolbar/buttons/clipboard_button.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/toolbar/buttons/clipboard_button.dart b/lib/src/toolbar/buttons/clipboard_button.dart index 6c8e8f66c..fc1730856 100644 --- a/lib/src/toolbar/buttons/clipboard_button.dart +++ b/lib/src/toolbar/buttons/clipboard_button.dart @@ -29,7 +29,7 @@ class ClipboardMonitor { if (add) { _timer = Timer.periodic( - const Duration(seconds: 1), (timer) => _update(listener)); + const Duration(seconds: 1), (timer) => _update(listener)); } else { _timer?.cancel(); } From a12b4f4040e933c3e4ec428bebcddac6a5f50773 Mon Sep 17 00:00:00 2001 From: Ellet Date: Sat, 18 Jan 2025 15:31:05 +0300 Subject: [PATCH 25/27] chore: remove a comment --- lib/src/toolbar/buttons/clipboard_button.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/src/toolbar/buttons/clipboard_button.dart b/lib/src/toolbar/buttons/clipboard_button.dart index fc1730856..7cd4ed6e8 100644 --- a/lib/src/toolbar/buttons/clipboard_button.dart +++ b/lib/src/toolbar/buttons/clipboard_button.dart @@ -36,7 +36,6 @@ class ClipboardMonitor { } Future _update(void Function() listener) async { - // If the clipboard is already being checked, return early. if (_isCheckingClipboard) { return; } From fd8a3596ea6de049943c4971dcc9d0242c09a328 Mon Sep 17 00:00:00 2001 From: Maksim Nikolaev Date: Sun, 19 Jan 2025 12:40:34 +0100 Subject: [PATCH 26/27] Update CHANGELOG.md --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 96a2e2217..fc60e661f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- `enableClipboardPaste` flag in `QuillToolbarClipboardButton` to determine if the button defaults to `null,` which will use `ClipboardMonitor`, which checks every second if the clipboard has content to paste [#2427](https://github.com/singerdmx/flutter-quill/pull/2427). + ## [11.0.0-dev.20] - 2025-01-19 ### Changed From 0cc73be93513308b5677ce8b0920caa7e9a6e655 Mon Sep 17 00:00:00 2001 From: Maksim Nikolaev Date: Sun, 19 Jan 2025 12:41:54 +0100 Subject: [PATCH 27/27] Added const to QuillToolbarClipboardButton constructor --- lib/src/toolbar/buttons/clipboard_button.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/toolbar/buttons/clipboard_button.dart b/lib/src/toolbar/buttons/clipboard_button.dart index 7cd4ed6e8..1e070de20 100644 --- a/lib/src/toolbar/buttons/clipboard_button.dart +++ b/lib/src/toolbar/buttons/clipboard_button.dart @@ -56,7 +56,7 @@ class ClipboardMonitor { @experimental class QuillToolbarClipboardButton extends QuillToolbarToggleStyleBaseButton { - QuillToolbarClipboardButton({ + const QuillToolbarClipboardButton({ required super.controller, required this.clipboardAction, QuillToolbarClipboardButtonOptions? options,