Fix checkbox not toggled correctly in toolbar button

pull/635/head
X Code 3 years ago
parent 69e4de7075
commit 179fd0b802
  1. 3
      lib/src/widgets/controller.dart
  2. 17
      lib/src/widgets/raw_editor.dart
  3. 19
      lib/src/widgets/toolbar/select_header_style_button.dart
  4. 9
      lib/src/widgets/toolbar/toggle_check_list_button.dart

@ -326,4 +326,7 @@ class QuillController extends ChangeNotifier {
baseOffset: math.min(selection.baseOffset, end),
extentOffset: math.min(selection.extentOffset, end));
}
// To notify toolbar buttons directly with attributes
Map<String, Attribute> toolbarButtonToggler = {};
}

@ -405,8 +405,21 @@ class RawEditorState extends EditorState
void _handleCheckboxTap(int offset, bool value) {
if (!widget.readOnly) {
_disableScrollControllerAnimateOnce = true;
widget.controller.formatText(
offset, 0, value ? Attribute.checked : Attribute.unchecked);
final attribute = value ? Attribute.checked : Attribute.unchecked;
widget.controller.formatText(offset, 0, attribute);
// Checkbox tapping causes controller.selection to go to offset 0
// Stop toggling those two toolbar buttons
widget.controller.toolbarButtonToggler = {
Attribute.list.key: attribute,
Attribute.header.key: Attribute.header
};
// Go back from offset 0 to current selection
SchedulerBinding.instance!.addPostFrameCallback((_) {
widget.controller.updateSelection(
TextSelection.collapsed(offset: offset), ChangeSource.LOCAL);
});
}
}

@ -34,8 +34,7 @@ class _SelectHeaderStyleButtonState extends State<SelectHeaderStyleButton> {
void initState() {
super.initState();
setState(() {
_value =
_selectionStyle.attributes[Attribute.header.key] ?? Attribute.header;
_value = _getHeaderValue();
});
widget.controller.addListener(_didChangeEditingValue);
}
@ -107,19 +106,27 @@ class _SelectHeaderStyleButtonState extends State<SelectHeaderStyleButton> {
void _didChangeEditingValue() {
setState(() {
_value =
_selectionStyle.attributes[Attribute.header.key] ?? Attribute.header;
_value = _getHeaderValue();
});
}
Attribute<dynamic> _getHeaderValue() {
final attr = widget.controller.toolbarButtonToggler[Attribute.header.key];
if (attr != null) {
// checkbox tapping causes controller.selection to go to offset 0
widget.controller.toolbarButtonToggler.remove(Attribute.header.key);
return attr;
}
return _selectionStyle.attributes[Attribute.header.key] ?? Attribute.header;
}
@override
void didUpdateWidget(covariant SelectHeaderStyleButton oldWidget) {
super.didUpdateWidget(oldWidget);
if (oldWidget.controller != widget.controller) {
oldWidget.controller.removeListener(_didChangeEditingValue);
widget.controller.addListener(_didChangeEditingValue);
_value =
_selectionStyle.attributes[Attribute.header.key] ?? Attribute.header;
_value = _getHeaderValue();
}
}

@ -55,7 +55,14 @@ class _ToggleCheckListButtonState extends State<ToggleCheckListButton> {
}
bool _getIsToggled(Map<String, Attribute> attrs) {
final attribute = attrs[Attribute.list.key];
var attribute = widget.controller.toolbarButtonToggler[Attribute.list.key];
if (attribute == null) {
attribute = attrs[Attribute.list.key];
} else {
// checkbox tapping causes controller.selection to go to offset 0
widget.controller.toolbarButtonToggler.remove(Attribute.list.key);
}
if (attribute == null) {
return false;

Loading…
Cancel
Save