fix ordered list numeration with several lists in document (#1163)

pull/1164/head
spChief 2 years ago committed by GitHub
parent f0ce4d0580
commit d5984dea17
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 20
      lib/src/widgets/raw_editor.dart
  2. 1
      lib/src/widgets/style_widgets/number_point.dart
  3. 11
      lib/src/widgets/text_block.dart

@ -756,13 +756,28 @@ class RawEditorState extends EditorState
List<Widget> _buildChildren(Document doc, BuildContext context) { List<Widget> _buildChildren(Document doc, BuildContext context) {
final result = <Widget>[]; final result = <Widget>[];
final indentLevelCounts = <int, int>{}; final indentLevelCounts = <int, int>{};
// this need for several ordered list in document
// we need to reset indents Map, if list finished
// List finished when there is node without Attribute.ol in styles
// So in this case we set clearIndents=true and send it
// to the next EditableTextBlock
var prevNodeOl = false;
var clearIndents = false;
for (final node in doc.root.children) { for (final node in doc.root.children) {
final attrs = node.style.attributes;
if (prevNodeOl && attrs[Attribute.list.key] != Attribute.ol) {
clearIndents = true;
}
prevNodeOl = attrs[Attribute.list.key] == Attribute.ol;
if (node is Line) { if (node is Line) {
final editableTextLine = _getEditableTextLineFromNode(node, context); final editableTextLine = _getEditableTextLineFromNode(node, context);
result.add(Directionality( result.add(Directionality(
textDirection: getDirectionOfNode(node), child: editableTextLine)); textDirection: getDirectionOfNode(node), child: editableTextLine));
} else if (node is Block) { } else if (node is Block) {
final attrs = node.style.attributes;
final editableTextBlock = EditableTextBlock( final editableTextBlock = EditableTextBlock(
block: node, block: node,
controller: controller, controller: controller,
@ -782,11 +797,14 @@ class RawEditorState extends EditorState
onLaunchUrl: widget.onLaunchUrl, onLaunchUrl: widget.onLaunchUrl,
cursorCont: _cursorCont, cursorCont: _cursorCont,
indentLevelCounts: indentLevelCounts, indentLevelCounts: indentLevelCounts,
clearIndents: clearIndents,
onCheckboxTap: _handleCheckboxTap, onCheckboxTap: _handleCheckboxTap,
readOnly: widget.readOnly, readOnly: widget.readOnly,
customStyleBuilder: widget.customStyleBuilder); customStyleBuilder: widget.customStyleBuilder);
result.add(Directionality( result.add(Directionality(
textDirection: getDirectionOfNode(node), child: editableTextBlock)); textDirection: getDirectionOfNode(node), child: editableTextBlock));
clearIndents = false;
} else { } else {
throw StateError('Unreachable.'); throw StateError('Unreachable.');
} }

@ -31,6 +31,7 @@ class QuillNumberPoint extends StatelessWidget {
int? level = 0; int? level = 0;
if (!attrs.containsKey(Attribute.indent.key) && indentLevelCounts.isEmpty) { if (!attrs.containsKey(Attribute.indent.key) && indentLevelCounts.isEmpty) {
indentLevelCounts.clear(); indentLevelCounts.clear();
indentLevelCounts[0] = 1;
return Container( return Container(
alignment: AlignmentDirectional.topEnd, alignment: AlignmentDirectional.topEnd,
width: width, width: width,

@ -68,6 +68,7 @@ class EditableTextBlock extends StatelessWidget {
required this.linkActionPicker, required this.linkActionPicker,
required this.cursorCont, required this.cursorCont,
required this.indentLevelCounts, required this.indentLevelCounts,
required this.clearIndents,
required this.onCheckboxTap, required this.onCheckboxTap,
required this.readOnly, required this.readOnly,
this.onLaunchUrl, this.onLaunchUrl,
@ -91,6 +92,7 @@ class EditableTextBlock extends StatelessWidget {
final CustomStyleBuilder? customStyleBuilder; final CustomStyleBuilder? customStyleBuilder;
final CursorCont cursorCont; final CursorCont cursorCont;
final Map<int, int> indentLevelCounts; final Map<int, int> indentLevelCounts;
final bool clearIndents;
final Function(int, bool) onCheckboxTap; final Function(int, bool) onCheckboxTap;
final bool readOnly; final bool readOnly;
@ -107,7 +109,7 @@ class EditableTextBlock extends StatelessWidget {
decoration: _getDecorationForBlock(block, defaultStyles) ?? decoration: _getDecorationForBlock(block, defaultStyles) ??
const BoxDecoration(), const BoxDecoration(),
contentPadding: contentPadding, contentPadding: contentPadding,
children: _buildChildren(context, indentLevelCounts)); children: _buildChildren(context, indentLevelCounts, clearIndents));
} }
BoxDecoration? _getDecorationForBlock( BoxDecoration? _getDecorationForBlock(
@ -122,11 +124,14 @@ class EditableTextBlock extends StatelessWidget {
return null; return null;
} }
List<Widget> _buildChildren( List<Widget> _buildChildren(BuildContext context,
BuildContext context, Map<int, int> indentLevelCounts) { Map<int, int> indentLevelCounts, bool clearIndents) {
final defaultStyles = QuillStyles.getStyles(context, false); final defaultStyles = QuillStyles.getStyles(context, false);
final count = block.children.length; final count = block.children.length;
final children = <Widget>[]; final children = <Widget>[];
if (clearIndents) {
indentLevelCounts.clear();
}
var index = 0; var index = 0;
for (final line in Iterable.castFrom<dynamic, Line>(block.children)) { for (final line in Iterable.castFrom<dynamic, Line>(block.children)) {
index++; index++;

Loading…
Cancel
Save