diff --git a/lib/src/widgets/quill/quill_controller.dart b/lib/src/widgets/quill/quill_controller.dart index b0c476e9..41300cb2 100644 --- a/lib/src/widgets/quill/quill_controller.dart +++ b/lib/src/widgets/quill/quill_controller.dart @@ -1,6 +1,6 @@ import 'dart:math' as math; -import 'package:flutter/services.dart'; +import 'package:flutter/services.dart' show ClipboardData, Clipboard; import 'package:flutter/widgets.dart'; import 'package:html2md/html2md.dart' as html2md; import 'package:markdown/markdown.dart' as md; @@ -26,14 +26,13 @@ class QuillController extends ChangeNotifier { QuillController({ required Document document, required TextSelection selection, - bool keepStyleOnNewLine = false, + this.keepStyleOnNewLine = true, this.onReplaceText, this.onDelete, this.onSelectionCompleted, this.onSelectionChanged, }) : _document = document, - _selection = selection, - _keepStyleOnNewLine = keepStyleOnNewLine; + _selection = selection; factory QuillController.basic() { return QuillController( @@ -71,6 +70,9 @@ class QuillController extends ChangeNotifier { notifyListeners(); } + // Thoses are the values that the user selects and not the one + // from the current line + /// The current font family, null to use the default one String? _selectedFontFamily; @@ -87,6 +89,10 @@ class QuillController extends ChangeNotifier { /// The current font size, null to use the default one String? get selectedFontSize => _selectedFontSize; + void selectFontSize(String? newFontSize) { + _selectedFontSize = newFontSize; + } + /// For the [QuillToolbarToggleStyleButton] final Map _selectedStyles = {}; @@ -98,13 +104,9 @@ class QuillController extends ChangeNotifier { _selectedStyles[attribute] = value; } - void selectFontSize(String? newFontSize) { - _selectedFontSize = newFontSize; - } - /// Tells whether to keep or reset the [toggledStyle] /// when user adds a new line. - final bool _keepStyleOnNewLine; + final bool keepStyleOnNewLine; /// Currently selected text within the [document]. TextSelection get selection => _selection; @@ -283,6 +285,7 @@ class QuillController extends ChangeNotifier { Object? data, TextSelection? textSelection, { bool ignoreFocus = false, + bool shouldNotifyListeners = true, }) { assert(data is String || data is Embeddable); @@ -338,7 +341,9 @@ class QuillController extends ChangeNotifier { if (ignoreFocus) { ignoreFocusOnTextChange = true; } - notifyListeners(); + if (shouldNotifyListeners) { + notifyListeners(); + } ignoreFocusOnTextChange = false; } @@ -356,7 +361,12 @@ class QuillController extends ChangeNotifier { }); } - void formatText(int index, int len, Attribute? attribute) { + void formatText( + int index, + int len, + Attribute? attribute, { + bool shouldNotifyListeners = true, + }) { if (len == 0 && attribute!.isInline && attribute.key != Attribute.link.key) { @@ -375,11 +385,19 @@ class QuillController extends ChangeNotifier { if (selection != adjustedSelection) { _updateSelection(adjustedSelection, ChangeSource.local); } - notifyListeners(); + if (shouldNotifyListeners) { + notifyListeners(); + } } - void formatSelection(Attribute? attribute) { - formatText(selection.start, selection.end - selection.start, attribute); + void formatSelection(Attribute? attribute, + {bool shouldNotifyListeners = true}) { + formatText( + selection.start, + selection.end - selection.start, + attribute, + shouldNotifyListeners: shouldNotifyListeners, + ); } void moveCursorToStart() { @@ -461,7 +479,7 @@ class QuillController extends ChangeNotifier { _selection = selection.copyWith( baseOffset: math.min(selection.baseOffset, end), extentOffset: math.min(selection.extentOffset, end)); - if (_keepStyleOnNewLine) { + if (keepStyleOnNewLine) { final style = getSelectionStyle(); final ignoredStyles = style.attributes.values.where( (s) => !s.isInline || s.key == Attribute.link.key, diff --git a/lib/src/widgets/raw_editor/raw_editor_state_text_input_client_mixin.dart b/lib/src/widgets/raw_editor/raw_editor_state_text_input_client_mixin.dart index 9b1ca750..c8c37561 100644 --- a/lib/src/widgets/raw_editor/raw_editor_state_text_input_client_mixin.dart +++ b/lib/src/widgets/raw_editor/raw_editor_state_text_input_client_mixin.dart @@ -208,8 +208,6 @@ mixin RawEditorStateTextInputClientMixin on EditorState value.selection, ); - // TODO: There is a bug here, the first character is not being formatted - if (widget.configurations.controller.selectedFontFamily != null) { widget.configurations.controller.formatSelection( Attribute.fromKeyValue( @@ -219,8 +217,6 @@ mixin RawEditorStateTextInputClientMixin on EditorState ); } - // TODO: The same bug here - if (widget.configurations.controller.selectedFontSize != null) { widget.configurations.controller.formatSelection( Attribute.fromKeyValue( @@ -232,14 +228,13 @@ mixin RawEditorStateTextInputClientMixin on EditorState ), ); } - - // TODO: The same bug here - - widget.configurations.controller.selectedStyles.forEach((key, value) { - if (value ?? false) { - widget.configurations.controller.formatSelection(key); - } - }); + // if (widget.configurations.controller.keepStyleOnNewLine) { + // widget.configurations.controller.selectedStyles.forEach((key, value) { + // if (value ?? false) { + // widget.configurations.controller.formatSelection(key); + // } + // }); + // } } }