From 3c55db11dc9eeafcf9aca98bd804cc1a925d5cc7 Mon Sep 17 00:00:00 2001 From: Adil Hanney Date: Sun, 12 Mar 2023 08:36:46 +0000 Subject: [PATCH] Create struct for individual styles offsetvalue --- lib/flutter_quill.dart | 3 +++ lib/src/models/documents/document.dart | 3 ++- lib/src/models/documents/nodes/line.dart | 9 +++++---- lib/src/models/structs/offset_value.dart | 5 +++++ lib/src/widgets/controller.dart | 4 +++- lib/src/widgets/editor.dart | 3 ++- lib/src/widgets/raw_editor.dart | 5 +++-- .../raw_editor_state_selection_delegate_mixin.dart | 6 +++--- 8 files changed, 26 insertions(+), 12 deletions(-) create mode 100644 lib/src/models/structs/offset_value.dart diff --git a/lib/flutter_quill.dart b/lib/flutter_quill.dart index af5fc4cc..aefc566c 100644 --- a/lib/flutter_quill.dart +++ b/lib/flutter_quill.dart @@ -10,6 +10,9 @@ export 'src/models/documents/nodes/node.dart'; export 'src/models/documents/style.dart'; export 'src/models/quill_delta.dart'; export 'src/models/structs/doc_change.dart'; +export 'src/models/structs/image_url.dart'; +export 'src/models/structs/offset_value.dart'; +export 'src/models/structs/optional_size.dart'; export 'src/models/structs/vertical_spacing.dart'; export 'src/models/themes/quill_custom_button.dart'; export 'src/models/themes/quill_dialog_theme.dart'; diff --git a/lib/src/models/documents/document.dart b/lib/src/models/documents/document.dart index 3227a8dd..e789377a 100644 --- a/lib/src/models/documents/document.dart +++ b/lib/src/models/documents/document.dart @@ -3,6 +3,7 @@ import 'dart:async'; import '../quill_delta.dart'; import '../rules/rule.dart'; import '../structs/doc_change.dart'; +import '../structs/offset_value.dart'; import 'attribute.dart'; import 'history.dart'; import 'nodes/block.dart'; @@ -156,7 +157,7 @@ class Document { } /// Returns all styles for each node within selection - List> collectAllIndividualStyles(int index, int len) { + List> collectAllIndividualStyles(int index, int len) { final res = queryChild(index); return (res.node as Line).collectAllIndividualStyles(res.offset, len); } diff --git a/lib/src/models/documents/nodes/line.dart b/lib/src/models/documents/nodes/line.dart index 3dadd88c..a8cca75c 100644 --- a/lib/src/models/documents/nodes/line.dart +++ b/lib/src/models/documents/nodes/line.dart @@ -3,6 +3,7 @@ import 'dart:math' as math; import 'package:collection/collection.dart'; import '../../quill_delta.dart'; +import '../../structs/offset_value.dart'; import '../attribute.dart'; import '../style.dart'; import 'block.dart'; @@ -390,10 +391,10 @@ class Line extends Container { /// Returns each node segment's offset in selection /// with its corresponding style as a list - List> collectAllIndividualStyles(int offset, int len, + List> collectAllIndividualStyles(int offset, int len, {int beg = 0}) { final local = math.min(length - offset, len); - final result = >[]; + final result = >[]; final data = queryChild(offset, true); var node = data.node as Leaf?; @@ -401,12 +402,12 @@ class Line extends Container { var pos = 0; if (node is Text) { pos = node.length - data.offset; - result.add(Tuple2(beg, node.style)); + result.add(OffsetValue(beg, node.style)); } while (!node!.isLast && pos < local) { node = node.next as Leaf; if (node is Text) { - result.add(Tuple2(pos + beg, node.style)); + result.add(OffsetValue(pos + beg, node.style)); pos += node.length; } } diff --git a/lib/src/models/structs/offset_value.dart b/lib/src/models/structs/offset_value.dart new file mode 100644 index 00000000..0f9e558b --- /dev/null +++ b/lib/src/models/structs/offset_value.dart @@ -0,0 +1,5 @@ +class OffsetValue { + OffsetValue(this.offset, this.value); + final int offset; + final T value; +} diff --git a/lib/src/widgets/controller.dart b/lib/src/widgets/controller.dart index cf02eb8f..b087bc99 100644 --- a/lib/src/widgets/controller.dart +++ b/lib/src/widgets/controller.dart @@ -10,6 +10,8 @@ import '../models/documents/nodes/leaf.dart'; import '../models/documents/style.dart'; import '../models/quill_delta.dart'; import '../models/structs/doc_change.dart'; +import '../models/structs/image_url.dart'; +import '../models/structs/offset_value.dart'; import '../utils/delta.dart'; typedef ReplaceTextCallback = bool Function(int index, int len, Object? data); @@ -118,7 +120,7 @@ class QuillController extends ChangeNotifier { } /// Returns all styles for each node within selection - List> getAllIndividualSelectionStyles() { + List> getAllIndividualSelectionStyles() { final styles = document.collectAllIndividualStyles( selection.start, selection.end - selection.start); return styles; diff --git a/lib/src/widgets/editor.dart b/lib/src/widgets/editor.dart index f0cc9170..752433a6 100644 --- a/lib/src/widgets/editor.dart +++ b/lib/src/widgets/editor.dart @@ -15,6 +15,7 @@ import '../models/documents/nodes/container.dart' as container_node; import '../models/documents/nodes/embeddable.dart'; import '../models/documents/nodes/leaf.dart'; import '../models/documents/style.dart'; +import '../models/structs/offset_value.dart'; import '../utils/platform.dart'; import 'box.dart'; import 'controller.dart'; @@ -37,7 +38,7 @@ abstract class EditorState extends State EditorTextSelectionOverlay? get selectionOverlay; - List> get pasteStyle; + List> get pasteStyle; String get pastePlainText; diff --git a/lib/src/widgets/raw_editor.dart b/lib/src/widgets/raw_editor.dart index d68919d1..055509fa 100644 --- a/lib/src/widgets/raw_editor.dart +++ b/lib/src/widgets/raw_editor.dart @@ -13,6 +13,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart'; import 'package:pasteboard/pasteboard.dart'; +import '../../flutter_quill.dart'; import '../models/documents/attribute.dart'; import '../models/documents/document.dart'; import '../models/documents/nodes/block.dart'; @@ -288,8 +289,8 @@ class RawEditorState extends EditorState // for pasting style @override - List> get pasteStyle => _pasteStyle; - List> _pasteStyle = >[]; + List> get pasteStyle => _pasteStyle; + List> _pasteStyle = >[]; @override String get pastePlainText => _pastePlainText; diff --git a/lib/src/widgets/raw_editor/raw_editor_state_selection_delegate_mixin.dart b/lib/src/widgets/raw_editor/raw_editor_state_selection_delegate_mixin.dart index 5da7cef2..fdd9244b 100644 --- a/lib/src/widgets/raw_editor/raw_editor_state_selection_delegate_mixin.dart +++ b/lib/src/widgets/raw_editor/raw_editor_state_selection_delegate_mixin.dart @@ -38,13 +38,13 @@ mixin RawEditorStateSelectionDelegateMixin on EditorState if (insertedText == pastePlainText && pastePlainText != '') { final pos = start; for (var i = 0; i < pasteStyle.length; i++) { - final offset = pasteStyle[i].item1; - final style = pasteStyle[i].item2; + final offset = pasteStyle[i].offset; + final style = pasteStyle[i].value; widget.controller.formatTextStyle( pos + offset, i == pasteStyle.length - 1 ? pastePlainText.length - offset - : pasteStyle[i + 1].item1, + : pasteStyle[i + 1].offset, style); } }