diff --git a/analysis_options.yaml b/analysis_options.yaml index fb75bccd..50b1b8fc 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -3,7 +3,6 @@ include: package:pedantic/analysis_options.yaml analyzer: errors: undefined_prefixed_name: ignore - omit_local_variable_types: ignore unsafe_html: ignore linter: rules: @@ -11,7 +10,11 @@ linter: - avoid_print - avoid_redundant_argument_values - directives_ordering + - omit_local_variable_types - prefer_const_constructors - prefer_const_constructors_in_immutables + - prefer_final_fields + - prefer_final_in_for_each + - prefer_final_locals - prefer_relative_imports - unnecessary_parenthesis diff --git a/example/lib/pages/home_page.dart b/example/lib/pages/home_page.dart index 5d02d71e..a613c085 100644 --- a/example/lib/pages/home_page.dart +++ b/example/lib/pages/home_page.dart @@ -178,14 +178,14 @@ class _HomePageState extends State { // You can also upload the picked image to any server (eg : AWS s3 or Firebase) and then return the uploaded image URL Future _onImagePickCallback(File file) async { // Copies the picked file from temporary cache to applications directory - Directory appDocDir = await getApplicationDocumentsDirectory(); - File copiedFile = + final appDocDir = await getApplicationDocumentsDirectory(); + final copiedFile = await file.copy('${appDocDir.path}/${basename(file.path)}'); return copiedFile.path.toString(); } Widget _buildMenuBar(BuildContext context) { - Size size = MediaQuery.of(context).size; + final size = MediaQuery.of(context).size; final itemStyle = const TextStyle( color: Colors.white, fontSize: 18, diff --git a/example/lib/universal_ui/universal_ui.dart b/example/lib/universal_ui/universal_ui.dart index 15eeb9f8..9c833aa2 100644 --- a/example/lib/universal_ui/universal_ui.dart +++ b/example/lib/universal_ui/universal_ui.dart @@ -28,8 +28,8 @@ var ui = UniversalUI(); Widget defaultEmbedBuilderWeb(BuildContext context, leaf.Embed node) { switch (node.value.type) { case 'image': - String imageUrl = node.value.data; - Size size = MediaQuery.of(context).size; + final String imageUrl = node.value.data; + final size = MediaQuery.of(context).size; UniversalUI().platformViewRegistry.registerViewFactory( imageUrl, (int viewId) => html.ImageElement()..src = imageUrl); return Padding( diff --git a/lib/models/documents/attribute.dart b/lib/models/documents/attribute.dart index 8d43e805..7683b9ed 100644 --- a/lib/models/documents/attribute.dart +++ b/lib/models/documents/attribute.dart @@ -164,8 +164,8 @@ class Attribute { if (!_registry.containsKey(key)) { throw ArgumentError.value(key, 'key "$key" not found.'); } - Attribute origin = _registry[key]!; - Attribute attribute = clone(origin, value); + final origin = _registry[key]!; + final attribute = clone(origin, value); return attribute; } @@ -177,7 +177,7 @@ class Attribute { bool operator ==(Object other) { if (identical(this, other)) return true; if (other is! Attribute) return false; - Attribute typedOther = other; + final typedOther = other; return key == typedOther.key && scope == typedOther.scope && value == typedOther.value; diff --git a/lib/models/documents/document.dart b/lib/models/documents/document.dart index a8810079..232642fb 100644 --- a/lib/models/documents/document.dart +++ b/lib/models/documents/document.dart @@ -56,14 +56,14 @@ class Document { return Delta(); } - Delta delta = _rules.apply(RuleType.INSERT, this, index, data: data); + final delta = _rules.apply(RuleType.INSERT, this, index, data: data); compose(delta, ChangeSource.LOCAL); return delta; } Delta delete(int index, int len) { assert(index >= 0 && len > 0); - Delta delta = _rules.apply(RuleType.DELETE, this, index, len: len); + final delta = _rules.apply(RuleType.DELETE, this, index, len: len); if (delta.isNotEmpty) { compose(delta, ChangeSource.LOCAL); } @@ -74,18 +74,18 @@ class Document { assert(index >= 0); assert(data is String || data is Embeddable); - bool dataIsNotEmpty = (data is String) ? data.isNotEmpty : true; + final dataIsNotEmpty = (data is String) ? data.isNotEmpty : true; assert(dataIsNotEmpty || len > 0); - Delta delta = Delta(); + var delta = Delta(); if (dataIsNotEmpty) { delta = insert(index + len, data); } if (len > 0) { - Delta deleteDelta = delete(index, len); + final deleteDelta = delete(index, len); delta = delta.compose(deleteDelta); } @@ -95,9 +95,9 @@ class Document { Delta format(int index, int len, Attribute? attribute) { assert(index >= 0 && len >= 0 && attribute != null); - Delta delta = Delta(); + var delta = Delta(); - Delta formatDelta = _rules.apply(RuleType.FORMAT, this, index, + final formatDelta = _rules.apply(RuleType.FORMAT, this, index, len: len, attribute: attribute); if (formatDelta.isNotEmpty) { compose(formatDelta, ChangeSource.LOCAL); @@ -108,16 +108,16 @@ class Document { } Style collectStyle(int index, int len) { - ChildQuery res = queryChild(index); + final res = queryChild(index); return (res.node as Line).collectStyle(res.offset, len); } ChildQuery queryChild(int offset) { - ChildQuery res = _root.queryChild(offset, true); + final res = _root.queryChild(offset, true); if (res.node is Line) { return res; } - Block block = res.node as Block; + final block = res.node as Block; return block.queryChild(res.offset, true); } @@ -126,11 +126,11 @@ class Document { delta.trim(); assert(delta.isNotEmpty); - int offset = 0; + var offset = 0; delta = _transform(delta); - Delta originalDelta = toDelta(); - for (Operation op in delta.toList()) { - Style? style = + final originalDelta = toDelta(); + for (final op in delta.toList()) { + final style = op.attributes != null ? Style.fromJson(op.attributes) : null; if (op.isInsert) { @@ -172,10 +172,10 @@ class Document { bool get hasRedo => _history.hasRedo; static Delta _transform(Delta delta) { - Delta res = Delta(); - List ops = delta.toList(); - for (int i = 0; i < ops.length; i++) { - Operation op = ops[i]; + final res = Delta(); + final ops = delta.toList(); + for (var i = 0; i < ops.length; i++) { + final op = ops[i]; res.push(op); _handleImageInsert(i, ops, op, res); } @@ -184,14 +184,14 @@ class Document { static void _handleImageInsert( int i, List ops, Operation op, Delta res) { - bool nextOpIsImage = + final nextOpIsImage = i + 1 < ops.length && ops[i + 1].isInsert && ops[i + 1].data is! String; if (nextOpIsImage && !(op.data as String).endsWith('\n')) { res.push(Operation.insert('\n')); } // Currently embed is equivalent to image and hence `is! String` - bool opInsertImage = op.isInsert && op.data is! String; - bool nextOpIsLineBreak = i + 1 < ops.length && + final opInsertImage = op.isInsert && op.data is! String; + final nextOpIsLineBreak = i + 1 < ops.length && ops[i + 1].isInsert && ops[i + 1].data is String && (ops[i + 1].data as String).startsWith('\n'); @@ -221,7 +221,7 @@ class Document { void _loadDocument(Delta doc) { assert((doc.last.data as String).endsWith('\n')); - int offset = 0; + var offset = 0; for (final op in doc.toList()) { if (!op.isInsert) { throw ArgumentError.value(doc, @@ -247,12 +247,12 @@ class Document { return false; } - final Node node = root.children.first; + final node = root.children.first; if (!node.isLast) { return false; } - Delta delta = node.toDelta(); + final delta = node.toDelta(); return delta.length == 1 && delta.first.data == '\n' && delta.first.key == 'insert'; diff --git a/lib/models/documents/history.dart b/lib/models/documents/history.dart index d3e36e32..9398ad1c 100644 --- a/lib/models/documents/history.dart +++ b/lib/models/documents/history.dart @@ -47,7 +47,7 @@ class History { void record(Delta change, Delta before) { if (change.isEmpty) return; stack.redo.clear(); - Delta undoDelta = change.invert(before); + var undoDelta = change.invert(before); final timeStamp = DateTime.now().millisecondsSinceEpoch; if (lastRecorded + interval > timeStamp && stack.undo.isNotEmpty) { @@ -74,7 +74,7 @@ class History { } void transformStack(List stack, Delta delta) { - for (int i = stack.length - 1; i >= 0; i -= 1) { + for (var i = stack.length - 1; i >= 0; i -= 1) { final oldDelta = stack[i]; stack[i] = delta.transform(oldDelta, true); delta = oldDelta.transform(delta, false); @@ -88,10 +88,10 @@ class History { if (source.isEmpty) { return const Tuple2(false, 0); } - Delta delta = source.removeLast(); + final delta = source.removeLast(); // look for insert or delete int? len = 0; - List ops = delta.toList(); + final ops = delta.toList(); for (var i = 0; i < ops.length; i++) { if (ops[i].key == Operation.insertKey) { len = ops[i].length; @@ -99,8 +99,8 @@ class History { len = ops[i].length! * -1; } } - Delta base = Delta.from(doc.toDelta()); - Delta inverseDelta = delta.invert(base); + final base = Delta.from(doc.toDelta()); + final inverseDelta = delta.invert(base); dest.add(inverseDelta); lastRecorded = 0; ignoreChange = true; diff --git a/lib/models/documents/nodes/block.dart b/lib/models/documents/nodes/block.dart index acae321b..0919806f 100644 --- a/lib/models/documents/nodes/block.dart +++ b/lib/models/documents/nodes/block.dart @@ -17,7 +17,7 @@ class Block extends Container { @override void adjust() { if (isEmpty) { - Node? sibling = previous; + final sibling = previous; unlink(); if (sibling != null) { sibling.adjust(); @@ -25,8 +25,8 @@ class Block extends Container { return; } - Block block = this; - Node? prev = block.previous; + var block = this; + final prev = block.previous; // merging it with previous block if style is the same if (!block.isFirst && block.previous is Block && @@ -35,7 +35,7 @@ class Block extends Container { block.unlink(); block = prev as Block; } - Node? next = block.next; + final next = block.next; // merging it with next block if style is the same if (!block.isLast && block.next is Block && next!.style == block.style) { (next as Block).moveChildToNewParent(block); @@ -47,7 +47,7 @@ class Block extends Container { String toString() { final block = style.attributes.toString(); final buffer = StringBuffer('§ {$block}\n'); - for (var child in children) { + for (final child in children) { final tree = child.isLast ? '└' : '├'; buffer.write(' $tree $child'); if (!child.isLast) buffer.writeln(); diff --git a/lib/models/documents/nodes/container.dart b/lib/models/documents/nodes/container.dart index c7c10390..8b3fd0c3 100644 --- a/lib/models/documents/nodes/container.dart +++ b/lib/models/documents/nodes/container.dart @@ -48,9 +48,9 @@ abstract class Container extends Node { return; } - T? last = newParent!.isEmpty ? null : newParent.last as T?; + final last = newParent!.isEmpty ? null : newParent.last as T?; while (isNotEmpty) { - T child = first as T; + final child = first as T; child?.unlink(); newParent.add(child); } @@ -63,8 +63,8 @@ abstract class Container extends Node { return ChildQuery(null, 0); } - for (Node node in children) { - int len = node.length; + for (final node in children) { + final len = node.length; if (offset < len || (inclusive && offset == len && (node.isLast))) { return ChildQuery(node, offset); } @@ -84,14 +84,14 @@ abstract class Container extends Node { assert(index == 0 || (index > 0 && index < length)); if (isNotEmpty) { - ChildQuery child = queryChild(index, false); + final child = queryChild(index, false); child.node!.insert(child.offset, data, style); return; } // empty assert(index == 0); - T node = defaultChild; + final node = defaultChild; add(node); node?.insert(index, data, style); } @@ -99,14 +99,14 @@ abstract class Container extends Node { @override void retain(int index, int? length, Style? attributes) { assert(isNotEmpty); - ChildQuery child = queryChild(index, false); + final child = queryChild(index, false); child.node!.retain(child.offset, length, attributes); } @override void delete(int index, int? length) { assert(isNotEmpty); - ChildQuery child = queryChild(index, false); + final child = queryChild(index, false); child.node!.delete(child.offset, length); } diff --git a/lib/models/documents/nodes/embed.dart b/lib/models/documents/nodes/embed.dart index 3268e257..cc0ecaea 100644 --- a/lib/models/documents/nodes/embed.dart +++ b/lib/models/documents/nodes/embed.dart @@ -5,12 +5,12 @@ class Embeddable { Embeddable(this.type, this.data); Map toJson() { - Map m = {type: data}; + final m = {type: data}; return m; } static Embeddable fromJson(Map json) { - Map m = Map.from(json); + final m = Map.from(json); assert(m.length == 1, 'Embeddable map has one key'); return BlockEmbed(m.keys.first, m.values.first); diff --git a/lib/models/documents/nodes/leaf.dart b/lib/models/documents/nodes/leaf.dart index fab88b53..88aeca6c 100644 --- a/lib/models/documents/nodes/leaf.dart +++ b/lib/models/documents/nodes/leaf.dart @@ -18,7 +18,7 @@ abstract class Leaf extends Node { if (data is Embeddable) { return Embed(data); } - String text = data as String; + final text = data as String; assert(text.isNotEmpty); return Text(text); } @@ -44,14 +44,15 @@ abstract class Leaf extends Node { @override Delta toDelta() { - var data = _value is Embeddable ? (_value as Embeddable).toJson() : _value; + final data = + _value is Embeddable ? (_value as Embeddable).toJson() : _value; return Delta()..insert(data, style.toJson()); } @override void insert(int index, Object data, Style? style) { assert(index >= 0 && index <= length); - Leaf node = Leaf(data); + final node = Leaf(data); if (index < length) { splitAt(index)!.insertBefore(node); } else { @@ -66,9 +67,9 @@ abstract class Leaf extends Node { return; } - int local = math.min(length - index, len!); - int remain = len - local; - Leaf node = _isolate(index, local); + final local = math.min(length - index, len!); + final remain = len - local; + final node = _isolate(index, local); if (remain > 0) { assert(node.next != null); @@ -81,13 +82,13 @@ abstract class Leaf extends Node { void delete(int index, int? len) { assert(index < length); - int local = math.min(length - index, len!); - Leaf target = _isolate(index, local); - Leaf? prev = target.previous as Leaf?; - Leaf? next = target.next as Leaf?; + final local = math.min(length - index, len!); + final target = _isolate(index, local); + final prev = target.previous as Leaf?; + final next = target.next as Leaf?; target.unlink(); - int remain = len - local; + final remain = len - local; if (remain > 0) { assert(next != null); next!.delete(0, remain); @@ -104,9 +105,9 @@ abstract class Leaf extends Node { return; } - Text node = this as Text; + var node = this as Text; // merging it with previous node if style is the same - Node? prev = node.previous; + final prev = node.previous; if (!node.isFirst && prev is Text && prev.style == node.style) { prev._value = prev.value + node.value; node.unlink(); @@ -114,7 +115,7 @@ abstract class Leaf extends Node { } // merging it with next node if style is the same - Node? next = node.next; + final next = node.next; if (!node.isLast && next is Text && next.style == node.style) { node._value = node.value + next.value; next.unlink(); @@ -123,7 +124,7 @@ abstract class Leaf extends Node { Leaf? cutAt(int index) { assert(index >= 0 && index <= length); - Leaf? cut = splitAt(index); + final cut = splitAt(index); cut?.unlink(); return cut; } @@ -138,9 +139,9 @@ abstract class Leaf extends Node { } assert(this is Text); - String text = _value as String; + final text = _value as String; _value = text.substring(0, index); - Leaf split = Leaf(text.substring(index)); + final split = Leaf(text.substring(index)); split.applyStyle(style); insertAfter(split); return split; @@ -157,7 +158,7 @@ abstract class Leaf extends Node { Leaf _isolate(int index, int length) { assert( index >= 0 && index < this.length && (index + length <= this.length)); - Leaf target = splitAt(index)!; + final target = splitAt(index)!; target.splitAt(length); return target; } diff --git a/lib/models/documents/nodes/line.dart b/lib/models/documents/nodes/line.dart index ceb95801..7dba241f 100644 --- a/lib/models/documents/nodes/line.dart +++ b/lib/models/documents/nodes/line.dart @@ -47,7 +47,7 @@ class Line extends Container { .fold(Delta(), (dynamic a, b) => a.concat(b)); var attributes = style; if (parent is Block) { - Block block = parent as Block; + final block = parent as Block; attributes = attributes.mergeAll(block.style); } delta.insert('\n', attributes.toJson()); @@ -71,20 +71,20 @@ class Line extends Container { return; } - String text = data as String; - int lineBreak = text.indexOf('\n'); + final text = data as String; + final lineBreak = text.indexOf('\n'); if (lineBreak < 0) { _insert(index, text, style); return; } - String prefix = text.substring(0, lineBreak); + final prefix = text.substring(0, lineBreak); _insert(index, prefix, style); if (prefix.isNotEmpty) { index += prefix.length; } - Line nextLine = _getNextLine(index); + final nextLine = _getNextLine(index); clearStyle(); @@ -95,7 +95,7 @@ class Line extends Container { _format(style); // Continue with the remaining - String remain = text.substring(lineBreak + 1); + final remain = text.substring(lineBreak + 1); nextLine.insert(0, remain, style); } @@ -104,9 +104,9 @@ class Line extends Container { if (style == null) { return; } - int thisLen = length; + final thisLen = length; - int local = math.min(thisLen - index, len!); + final local = math.min(thisLen - index, len!); if (index + local == thisLen && local == 1) { assert(style.values.every((attr) => attr.scope == AttributeScope.BLOCK)); @@ -117,7 +117,7 @@ class Line extends Container { super.retain(index, local, style); } - int remain = len - local; + final remain = len - local; if (remain > 0) { assert(nextLine != null); nextLine!.retain(0, remain, style); @@ -126,8 +126,8 @@ class Line extends Container { @override void delete(int index, int? len) { - int local = math.min(length - index, len!); - bool deleted = index + local == length; + final local = math.min(length - index, len!); + final deleted = index + local == length; if (deleted) { clearStyle(); if (local > 1) { @@ -137,7 +137,7 @@ class Line extends Container { super.delete(index, local); } - int remain = len - local; + final remain = len - local; if (remain > 0) { assert(nextLine != null); nextLine!.delete(0, remain); @@ -150,7 +150,7 @@ class Line extends Container { } if (deleted) { - Node p = parent!; + final Node p = parent!; unlink(); p.adjust(); } @@ -162,24 +162,24 @@ class Line extends Container { } applyStyle(newStyle); - Attribute? blockStyle = newStyle.getBlockExceptHeader(); + final blockStyle = newStyle.getBlockExceptHeader(); if (blockStyle == null) { return; } if (parent is Block) { - Attribute? parentStyle = (parent as Block).style.getBlockExceptHeader(); + final parentStyle = (parent as Block).style.getBlockExceptHeader(); if (blockStyle.value == null) { _unwrap(); } else if (blockStyle != parentStyle) { _unwrap(); - Block block = Block(); + final block = Block(); block.applyAttribute(blockStyle); _wrap(block); block.adjust(); } } else if (blockStyle.value != null) { - Block block = Block(); + final block = Block(); block.applyAttribute(blockStyle); _wrap(block); block.adjust(); @@ -197,7 +197,7 @@ class Line extends Container { if (parent is! Block) { throw ArgumentError('Invalid parent'); } - Block block = parent as Block; + final block = parent as Block; assert(block.children.contains(this)); @@ -208,10 +208,10 @@ class Line extends Container { unlink(); block.insertAfter(this); } else { - Block before = block.clone() as Block; + final before = block.clone() as Block; block.insertBefore(before); - Line child = block.first as Line; + var child = block.first as Line; while (child != this) { child.unlink(); before.add(child); @@ -226,20 +226,20 @@ class Line extends Container { Line _getNextLine(int index) { assert(index == 0 || (index > 0 && index < length)); - Line line = clone() as Line; + final line = clone() as Line; insertAfter(line); if (index == length - 1) { return line; } - ChildQuery query = queryChild(index, false); + final query = queryChild(index, false); while (!query.node!.isLast) { - Leaf next = last as Leaf; + final next = last as Leaf; next.unlink(); line.addFirst(next); } - Leaf child = query.node as Leaf; - Leaf? cut = child.splitAt(query.offset); + final child = query.node as Leaf; + final cut = child.splitAt(query.offset); cut?.unlink(); line.addFirst(cut); return line; @@ -256,12 +256,12 @@ class Line extends Container { } if (isNotEmpty) { - ChildQuery result = queryChild(index, true); + final result = queryChild(index, true); result.node!.insert(result.offset, data, style); return; } - Leaf child = Leaf(data); + final child = Leaf(data); add(child); child.format(style); } @@ -272,30 +272,30 @@ class Line extends Container { } Style collectStyle(int offset, int len) { - int local = math.min(length - offset, len); - Style res = Style(); - var excluded = {}; + final local = math.min(length - offset, len); + var res = Style(); + final excluded = {}; void _handle(Style style) { if (res.isEmpty) { excluded.addAll(style.values); } else { - for (Attribute attr in res.values) { + for (final attr in res.values) { if (!style.containsKey(attr.key)) { excluded.add(attr); } } } - Style remain = style.removeAll(excluded); + final remain = style.removeAll(excluded); res = res.removeAll(excluded); res = res.mergeAll(remain); } - ChildQuery data = queryChild(offset, true); - Leaf? node = data.node as Leaf?; + final data = queryChild(offset, true); + var node = data.node as Leaf?; if (node != null) { res = res.mergeAll(node.style); - int pos = node.length - data.offset; + var pos = node.length - data.offset; while (!node!.isLast && pos < local) { node = node.next as Leaf?; _handle(node!.style); @@ -305,11 +305,11 @@ class Line extends Container { res = res.mergeAll(style); if (parent is Block) { - Block block = parent as Block; + final block = parent as Block; res = res.mergeAll(block.style); } - int remain = len - local; + final remain = len - local; if (remain > 0) { _handle(nextLine!.collectStyle(0, remain)); } diff --git a/lib/models/documents/nodes/node.dart b/lib/models/documents/nodes/node.dart index 2d694222..d46b4647 100644 --- a/lib/models/documents/nodes/node.dart +++ b/lib/models/documents/nodes/node.dart @@ -32,19 +32,19 @@ abstract class Node extends LinkedListEntry { int get length; Node clone() { - Node node = newInstance(); + final node = newInstance(); node.applyStyle(style); return node; } int getOffset() { - int offset = 0; + var offset = 0; if (list == null || isFirst) { return offset; } - Node cur = this; + var cur = this; do { cur = cur.previous!; offset += cur.length; diff --git a/lib/models/documents/style.dart b/lib/models/documents/style.dart index 90c03df0..4becc57e 100644 --- a/lib/models/documents/style.dart +++ b/lib/models/documents/style.dart @@ -16,8 +16,8 @@ class Style { return Style(); } - Map result = attributes.map((String key, dynamic value) { - Attribute attr = Attribute.fromKeyValue(key, value); + final result = attributes.map((String key, dynamic value) { + final attr = Attribute.fromKeyValue(key, value); return MapEntry(key, attr); }); return Style.attr(result); @@ -48,7 +48,7 @@ class Style { bool containsKey(String key) => _attributes.containsKey(key); Attribute? getBlockExceptHeader() { - for (Attribute val in values) { + for (final val in values) { if (val.isBlockExceptHeader) { return val; } @@ -57,7 +57,7 @@ class Style { } Style merge(Attribute attribute) { - Map merged = Map.from(_attributes); + final merged = Map.from(_attributes); if (attribute.value == null) { merged.remove(attribute.key); } else { @@ -67,21 +67,21 @@ class Style { } Style mergeAll(Style other) { - Style result = Style.attr(_attributes); - for (Attribute attribute in other.values) { + var result = Style.attr(_attributes); + for (final attribute in other.values) { result = result.merge(attribute); } return result; } Style removeAll(Set attributes) { - Map merged = Map.from(_attributes); + final merged = Map.from(_attributes); attributes.map((item) => item.key).forEach(merged.remove); return Style.attr(merged); } Style put(Attribute attribute) { - Map m = Map.from(attributes); + final m = Map.from(attributes); m[attribute.key] = attribute; return Style.attr(m); } @@ -94,7 +94,7 @@ class Style { if (other is! Style) { return false; } - Style typedOther = other; + final typedOther = other; final eq = const MapEquality(); return eq.equals(_attributes, typedOther._attributes); } diff --git a/lib/models/quill_delta.dart b/lib/models/quill_delta.dart index ddccb710..c8707ee0 100644 --- a/lib/models/quill_delta.dart +++ b/lib/models/quill_delta.dart @@ -135,7 +135,7 @@ class Operation { bool operator ==(other) { if (identical(this, other)) return true; if (other is! Operation) return false; - Operation typedOther = other; + final typedOther = other; return key == typedOther.key && length == typedOther.length && _valueEquality.equals(data, typedOther.data) && @@ -221,14 +221,14 @@ class Delta { attr ??= const {}; base ??= const {}; - var baseInverted = base.keys.fold({}, (dynamic memo, key) { + final baseInverted = base.keys.fold({}, (dynamic memo, key) { if (base![key] != attr![key] && attr.containsKey(key)) { memo[key] = base[key]; } return memo; }); - var inverted = + final inverted = Map.from(attr.keys.fold(baseInverted, (memo, key) { if (base![key] != attr![key] && !base.containsKey(key)) { memo[key] = null; @@ -292,7 +292,7 @@ class Delta { bool operator ==(dynamic other) { if (identical(this, other)) return true; if (other is! Delta) return false; - Delta typedOther = other; + final typedOther = other; final comparator = const ListEquality(DefaultEquality()); return comparator.equals(_operations, typedOther._operations); @@ -529,7 +529,8 @@ class Delta { if (op.isDelete) { inverted.push(baseOp); } else if (op.isRetain && op.isNotPlain) { - var invertAttr = invertAttributes(op.attributes, baseOp.attributes); + final invertAttr = + invertAttributes(op.attributes, baseOp.attributes); inverted.retain( baseOp.length!, invertAttr.isEmpty ? null : invertAttr); } @@ -548,7 +549,7 @@ class Delta { Delta slice(int start, [int? end]) { final delta = Delta(); var index = 0; - var opIterator = DeltaIterator(this); + final opIterator = DeltaIterator(this); final actualEnd = end ?? double.infinity; @@ -661,7 +662,7 @@ class DeltaIterator { final opIsNotEmpty = opData is String ? opData.isNotEmpty : true; // embeds are never empty final opLength = opData is String ? opData.length : 1; - final int opActualLength = opIsNotEmpty ? opLength : actualLength as int; + final opActualLength = opIsNotEmpty ? opLength : actualLength as int; return Operation._(opKey, opActualLength, opData, opAttributes); } return Operation.retain(length); diff --git a/lib/models/rules/delete.dart b/lib/models/rules/delete.dart index 535504d5..60cee64d 100644 --- a/lib/models/rules/delete.dart +++ b/lib/models/rules/delete.dart @@ -34,31 +34,31 @@ class PreserveLineStyleOnMergeRule extends DeleteRule { @override Delta? applyRule(Delta document, int index, {int? len, Object? data, Attribute? attribute}) { - DeltaIterator itr = DeltaIterator(document); + final itr = DeltaIterator(document); itr.skip(index); - Operation op = itr.next(1); + var op = itr.next(1); if (op.data != '\n') { return null; } - bool isNotPlain = op.isNotPlain; - Map? attrs = op.attributes; + final isNotPlain = op.isNotPlain; + final attrs = op.attributes; itr.skip(len! - 1); - Delta delta = Delta() + final delta = Delta() ..retain(index) ..delete(len); while (itr.hasNext) { op = itr.next(); - String text = op.data is String ? (op.data as String?)! : ''; - int lineBreak = text.indexOf('\n'); + final text = op.data is String ? (op.data as String?)! : ''; + final lineBreak = text.indexOf('\n'); if (lineBreak == -1) { delta.retain(op.length!); continue; } - Map? attributes = op.attributes == null + var attributes = op.attributes == null ? null : op.attributes!.map((String key, dynamic value) => MapEntry(key, null)); @@ -80,15 +80,15 @@ class EnsureEmbedLineRule extends DeleteRule { @override Delta? applyRule(Delta document, int index, {int? len, Object? data, Attribute? attribute}) { - DeltaIterator itr = DeltaIterator(document); + final itr = DeltaIterator(document); - Operation? op = itr.skip(index); + var op = itr.skip(index); int? indexDelta = 0, lengthDelta = 0, remain = len; - bool embedFound = op != null && op.data is! String; - bool hasLineBreakBefore = + var embedFound = op != null && op.data is! String; + final hasLineBreakBefore = !embedFound && (op == null || (op.data as String).endsWith('\n')); if (embedFound) { - Operation candidate = itr.next(1); + var candidate = itr.next(1); if (remain != null) { remain--; if (candidate.data == '\n') { @@ -107,7 +107,7 @@ class EnsureEmbedLineRule extends DeleteRule { op = itr.skip(remain!); if (op != null && (op.data is String ? op.data as String? : '')!.endsWith('\n')) { - Operation candidate = itr.next(1); + final candidate = itr.next(1); if (candidate.data is! String && !hasLineBreakBefore) { embedFound = true; lengthDelta--; diff --git a/lib/models/rules/format.dart b/lib/models/rules/format.dart index 0d574c94..470ca200 100644 --- a/lib/models/rules/format.dart +++ b/lib/models/rules/format.dart @@ -26,21 +26,21 @@ class ResolveLineFormatRule extends FormatRule { return null; } - Delta delta = Delta()..retain(index); - DeltaIterator itr = DeltaIterator(document); + var delta = Delta()..retain(index); + final itr = DeltaIterator(document); itr.skip(index); Operation op; - for (int cur = 0; cur < len! && itr.hasNext; cur += op.length!) { + for (var cur = 0; cur < len! && itr.hasNext; cur += op.length!) { op = itr.next(len - cur); if (op.data is! String || !(op.data as String).contains('\n')) { delta.retain(op.length!); continue; } - String text = op.data as String; - Delta tmp = Delta(); - int offset = 0; + final text = op.data as String; + final tmp = Delta(); + var offset = 0; - for (int lineBreak = text.indexOf('\n'); + for (var lineBreak = text.indexOf('\n'); lineBreak >= 0; lineBreak = text.indexOf('\n', offset)) { tmp..retain(lineBreak - offset)..retain(1, attribute.toJson()); @@ -52,8 +52,8 @@ class ResolveLineFormatRule extends FormatRule { while (itr.hasNext) { op = itr.next(); - String text = op.data is String ? (op.data as String?)! : ''; - int lineBreak = text.indexOf('\n'); + final text = op.data is String ? (op.data as String?)! : ''; + final lineBreak = text.indexOf('\n'); if (lineBreak < 0) { delta.retain(op.length!); continue; @@ -75,9 +75,9 @@ class FormatLinkAtCaretPositionRule extends FormatRule { return null; } - Delta delta = Delta(); - DeltaIterator itr = DeltaIterator(document); - Operation? before = itr.skip(index), after = itr.next(); + final delta = Delta(); + final itr = DeltaIterator(document); + final before = itr.skip(index), after = itr.next(); int? beg = index, retain = 0; if (before != null && before.hasAttribute(attribute.key)) { beg -= before.length!; @@ -105,20 +105,20 @@ class ResolveInlineFormatRule extends FormatRule { return null; } - Delta delta = Delta()..retain(index); - DeltaIterator itr = DeltaIterator(document); + final delta = Delta()..retain(index); + final itr = DeltaIterator(document); itr.skip(index); Operation op; - for (int cur = 0; cur < len! && itr.hasNext; cur += op.length!) { + for (var cur = 0; cur < len! && itr.hasNext; cur += op.length!) { op = itr.next(len - cur); - String text = op.data is String ? (op.data as String?)! : ''; - int lineBreak = text.indexOf('\n'); + final text = op.data is String ? (op.data as String?)! : ''; + var lineBreak = text.indexOf('\n'); if (lineBreak < 0) { delta.retain(op.length!, attribute.toJson()); continue; } - int pos = 0; + var pos = 0; while (lineBreak >= 0) { delta..retain(lineBreak - pos, attribute.toJson())..retain(1); pos = lineBreak + 1; diff --git a/lib/models/rules/insert.dart b/lib/models/rules/insert.dart index f0f7d001..97f386d5 100644 --- a/lib/models/rules/insert.dart +++ b/lib/models/rules/insert.dart @@ -29,28 +29,28 @@ class PreserveLineStyleOnSplitRule extends InsertRule { return null; } - DeltaIterator itr = DeltaIterator(document); - Operation? before = itr.skip(index); + final itr = DeltaIterator(document); + final before = itr.skip(index); if (before == null || before.data is! String || (before.data as String).endsWith('\n')) { return null; } - Operation after = itr.next(); + final after = itr.next(); if (after.data is! String || (after.data as String).startsWith('\n')) { return null; } final text = after.data as String; - Delta delta = Delta()..retain(index); + final delta = Delta()..retain(index); if (text.contains('\n')) { assert(after.isPlain); delta.insert('\n'); return delta; } - Tuple2 nextNewLine = _getNextNewLine(itr); - Map? attributes = nextNewLine.item1?.attributes; + final nextNewLine = _getNextNewLine(itr); + final attributes = nextNewLine.item1?.attributes; return delta..insert('\n', attributes); } @@ -66,19 +66,19 @@ class PreserveBlockStyleOnInsertRule extends InsertRule { return null; } - DeltaIterator itr = DeltaIterator(document); + final itr = DeltaIterator(document); itr.skip(index); - Tuple2 nextNewLine = _getNextNewLine(itr); - Style lineStyle = + final nextNewLine = _getNextNewLine(itr); + final lineStyle = Style.fromJson(nextNewLine.item1?.attributes ?? {}); - Attribute? attribute = lineStyle.getBlockExceptHeader(); + final attribute = lineStyle.getBlockExceptHeader(); if (attribute == null) { return null; } - var blockStyle = {attribute.key: attribute.value}; + final blockStyle = {attribute.key: attribute.value}; Map? resetStyle; @@ -86,10 +86,10 @@ class PreserveBlockStyleOnInsertRule extends InsertRule { resetStyle = Attribute.header.toJson(); } - List lines = data.split('\n'); - Delta delta = Delta()..retain(index); - for (int i = 0; i < lines.length; i++) { - String line = lines[i]; + final lines = data.split('\n'); + final delta = Delta()..retain(index); + for (var i = 0; i < lines.length; i++) { + final line = lines[i]; if (line.isNotEmpty) { delta.insert(line); } @@ -131,10 +131,9 @@ class AutoExitBlockRule extends InsertRule { return null; } - DeltaIterator itr = DeltaIterator(document); - Operation? prev = itr.skip(index), cur = itr.next(); - Attribute? blockStyle = - Style.fromJson(cur.attributes).getBlockExceptHeader(); + final itr = DeltaIterator(document); + final prev = itr.skip(index), cur = itr.next(); + final blockStyle = Style.fromJson(cur.attributes).getBlockExceptHeader(); if (cur.isPlain || blockStyle == null) { return null; } @@ -146,7 +145,7 @@ class AutoExitBlockRule extends InsertRule { return null; } - Tuple2 nextNewLine = _getNextNewLine(itr); + final nextNewLine = _getNextNewLine(itr); if (nextNewLine.item1 != null && nextNewLine.item1!.attributes != null && Style.fromJson(nextNewLine.item1!.attributes).getBlockExceptHeader() == @@ -155,7 +154,7 @@ class AutoExitBlockRule extends InsertRule { } final attributes = cur.attributes ?? {}; - String k = attributes.keys + final k = attributes.keys .firstWhere((k) => Attribute.blockKeysExceptHeader.contains(k)); attributes[k] = null; // retain(1) should be '\n', set it with no attribute @@ -173,9 +172,9 @@ class ResetLineFormatOnNewLineRule extends InsertRule { return null; } - DeltaIterator itr = DeltaIterator(document); + final itr = DeltaIterator(document); itr.skip(index); - Operation cur = itr.next(); + final cur = itr.next(); if (cur.data is! String || !(cur.data as String).startsWith('\n')) { return null; } @@ -203,12 +202,12 @@ class InsertEmbedsRule extends InsertRule { return null; } - Delta delta = Delta()..retain(index); - DeltaIterator itr = DeltaIterator(document); - Operation? prev = itr.skip(index), cur = itr.next(); + final delta = Delta()..retain(index); + final itr = DeltaIterator(document); + final prev = itr.skip(index), cur = itr.next(); - String? textBefore = prev?.data is String ? prev!.data as String? : ''; - String textAfter = cur.data is String ? (cur.data as String?)! : ''; + final textBefore = prev?.data is String ? prev!.data as String? : ''; + final textAfter = cur.data is String ? (cur.data as String?)! : ''; final isNewlineBefore = prev == null || textBefore!.endsWith('\n'); final isNewlineAfter = textAfter.startsWith('\n'); @@ -222,7 +221,7 @@ class InsertEmbedsRule extends InsertRule { lineStyle = cur.attributes; } else { while (itr.hasNext) { - Operation op = itr.next(); + final op = itr.next(); if ((op.data is String ? op.data as String? : '')!.contains('\n')) { lineStyle = op.attributes; break; @@ -251,17 +250,17 @@ class ForceNewlineForInsertsAroundEmbedRule extends InsertRule { return null; } - String text = data; - DeltaIterator itr = DeltaIterator(document); + final text = data; + final itr = DeltaIterator(document); final prev = itr.skip(index); final cur = itr.next(); - bool cursorBeforeEmbed = cur.data is! String; - bool cursorAfterEmbed = prev != null && prev.data is! String; + final cursorBeforeEmbed = cur.data is! String; + final cursorAfterEmbed = prev != null && prev.data is! String; if (!cursorBeforeEmbed && !cursorAfterEmbed) { return null; } - Delta delta = Delta()..retain(index); + final delta = Delta()..retain(index); if (cursorBeforeEmbed && !text.endsWith('\n')) { return delta..insert(text)..insert('\n'); } @@ -282,19 +281,19 @@ class AutoFormatLinksRule extends InsertRule { return null; } - DeltaIterator itr = DeltaIterator(document); - Operation? prev = itr.skip(index); + final itr = DeltaIterator(document); + final prev = itr.skip(index); if (prev == null || prev.data is! String) { return null; } try { - String cand = (prev.data as String).split('\n').last.split(' ').last; - Uri link = Uri.parse(cand); + final cand = (prev.data as String).split('\n').last.split(' ').last; + final link = Uri.parse(cand); if (!['https', 'http'].contains(link.scheme)) { return null; } - Map attributes = prev.attributes ?? {}; + final attributes = prev.attributes ?? {}; if (attributes.containsKey(Attribute.link.key)) { return null; @@ -321,16 +320,16 @@ class PreserveInlineStylesRule extends InsertRule { return null; } - DeltaIterator itr = DeltaIterator(document); - Operation? prev = itr.skip(index); + final itr = DeltaIterator(document); + final prev = itr.skip(index); if (prev == null || prev.data is! String || (prev.data as String).contains('\n')) { return null; } - Map? attributes = prev.attributes; - String text = data; + final attributes = prev.attributes; + final text = data; if (attributes == null || !attributes.containsKey(Attribute.link.key)) { return Delta() ..retain(index) @@ -338,13 +337,12 @@ class PreserveInlineStylesRule extends InsertRule { } attributes.remove(Attribute.link.key); - Delta delta = Delta() + final delta = Delta() ..retain(index) ..insert(text, attributes.isEmpty ? null : attributes); - Operation next = itr.next(); + final next = itr.next(); - Map nextAttributes = - next.attributes ?? const {}; + final nextAttributes = next.attributes ?? const {}; if (!nextAttributes.containsKey(Attribute.link.key)) { return delta; } @@ -371,9 +369,9 @@ class CatchAllInsertRule extends InsertRule { Tuple2 _getNextNewLine(DeltaIterator iterator) { Operation op; - for (int skipped = 0; iterator.hasNext; skipped += op.length!) { + for (var skipped = 0; iterator.hasNext; skipped += op.length!) { op = iterator.next(); - int lineBreak = + final lineBreak = (op.data is String ? op.data as String? : '')!.indexOf('\n'); if (lineBreak >= 0) { return Tuple2(op, skipped); diff --git a/lib/models/rules/rule.dart b/lib/models/rules/rule.dart index 23eb3b9d..19bc9177 100644 --- a/lib/models/rules/rule.dart +++ b/lib/models/rules/rule.dart @@ -52,7 +52,7 @@ class Rules { Delta apply(RuleType ruleType, Document document, int index, {int? len, Object? data, Attribute? attribute}) { final delta = document.toDelta(); - for (var rule in _rules) { + for (final rule in _rules) { if (rule.type != ruleType) { continue; } diff --git a/lib/utils/color.dart b/lib/utils/color.dart index 4e206644..f4c26040 100644 --- a/lib/utils/color.dart +++ b/lib/utils/color.dart @@ -118,8 +118,8 @@ Color stringToColor(String? s) { throw 'Color code not supported'; } - String hex = s.replaceFirst('#', ''); + var hex = s.replaceFirst('#', ''); hex = hex.length == 6 ? 'ff' + hex : hex; - int val = int.parse(hex, radix: 16); + final val = int.parse(hex, radix: 16); return Color(val); } diff --git a/lib/utils/diff_delta.dart b/lib/utils/diff_delta.dart index d3b97116..a3653eb0 100644 --- a/lib/utils/diff_delta.dart +++ b/lib/utils/diff_delta.dart @@ -52,17 +52,17 @@ class Diff { /* Get diff operation between old text and new text */ Diff getDiff(String oldText, String newText, int cursorPosition) { - int end = oldText.length; - int delta = newText.length - end; - for (int limit = math.max(0, cursorPosition - delta); + var end = oldText.length; + final delta = newText.length - end; + for (final limit = math.max(0, cursorPosition - delta); end > limit && oldText[end - 1] == newText[end + delta - 1]; end--) {} - int start = 0; - for (int startLimit = cursorPosition - math.max(0, delta); + var start = 0; + for (final startLimit = cursorPosition - math.max(0, delta); start < startLimit && oldText[start] == newText[start]; start++) {} - String deleted = (start >= end) ? '' : oldText.substring(start, end); - String inserted = newText.substring(start, end + delta); + final deleted = (start >= end) ? '' : oldText.substring(start, end); + final inserted = newText.substring(start, end + delta); return Diff(start, deleted, inserted); } @@ -71,13 +71,13 @@ int getPositionDelta(Delta user, Delta actual) { return 0; } - DeltaIterator userItr = DeltaIterator(user); - DeltaIterator actualItr = DeltaIterator(actual); - int diff = 0; + final userItr = DeltaIterator(user); + final actualItr = DeltaIterator(actual); + var diff = 0; while (userItr.hasNext || actualItr.hasNext) { final length = math.min(userItr.peekLength(), actualItr.peekLength()); - Operation userOperation = userItr.next(length as int); - Operation actualOperation = actualItr.next(length); + final userOperation = userItr.next(length as int); + final actualOperation = actualItr.next(length); if (userOperation.length != actualOperation.length) { throw 'userOp ' + userOperation.length.toString() + diff --git a/lib/widgets/controller.dart b/lib/widgets/controller.dart index 510db24c..faabf4c2 100644 --- a/lib/widgets/controller.dart +++ b/lib/widgets/controller.dart @@ -43,7 +43,7 @@ class QuillController extends ChangeNotifier { } void undo() { - Tuple2 tup = document.undo(); + final tup = document.undo(); if (tup.item1) { _handleHistoryChange(tup.item2); } @@ -65,7 +65,7 @@ class QuillController extends ChangeNotifier { } void redo() { - Tuple2 tup = document.redo(); + final tup = document.redo(); if (tup.item1) { _handleHistoryChange(tup.item2); } @@ -82,7 +82,7 @@ class QuillController extends ChangeNotifier { Delta? delta; if (len > 0 || data is! String || data.isNotEmpty) { delta = document.replace(index, len, data); - bool shouldRetainDelta = toggledStyle.isNotEmpty && + var shouldRetainDelta = toggledStyle.isNotEmpty && delta.isNotEmpty && delta.length <= 2 && delta.last.isInsert; @@ -98,7 +98,7 @@ class QuillController extends ChangeNotifier { } } if (shouldRetainDelta) { - Delta retainDelta = Delta() + final retainDelta = Delta() ..retain(index) ..retain(data is String ? data.length : 1, toggledStyle.toJson()); document.compose(retainDelta, ChangeSource.LOCAL); @@ -110,11 +110,11 @@ class QuillController extends ChangeNotifier { if (delta == null || delta.isEmpty) { _updateSelection(textSelection, ChangeSource.LOCAL); } else { - Delta user = Delta() + final user = Delta() ..retain(index) ..insert(data) ..delete(len); - int positionDelta = getPositionDelta(user, delta); + final positionDelta = getPositionDelta(user, delta); _updateSelection( textSelection.copyWith( baseOffset: textSelection.baseOffset + positionDelta, @@ -134,8 +134,8 @@ class QuillController extends ChangeNotifier { toggledStyle = toggledStyle.put(attribute); } - Delta change = document.format(index, len, attribute); - TextSelection adjustedSelection = selection.copyWith( + final change = document.format(index, len, attribute); + final adjustedSelection = selection.copyWith( baseOffset: change.transformPosition(selection.baseOffset), extentOffset: change.transformPosition(selection.extentOffset)); if (selection != adjustedSelection) { @@ -177,7 +177,7 @@ class QuillController extends ChangeNotifier { void _updateSelection(TextSelection textSelection, ChangeSource source) { selection = textSelection; - int end = document.length - 1; + final end = document.length - 1; selection = selection.copyWith( baseOffset: math.min(selection.baseOffset, end), extentOffset: math.min(selection.extentOffset, end)); diff --git a/lib/widgets/cursor.dart b/lib/widgets/cursor.dart index 4195d947..8a22c7c2 100644 --- a/lib/widgets/cursor.dart +++ b/lib/widgets/cursor.dart @@ -99,7 +99,7 @@ class CursorCont extends ChangeNotifier { void _cursorTick(Timer timer) { _targetCursorVisibility = !_targetCursorVisibility; - double targetOpacity = _targetCursorVisibility ? 1.0 : 0.0; + final targetOpacity = _targetCursorVisibility ? 1.0 : 0.0; if (style.opacityAnimates) { _blinkOpacityCont.animateTo(targetOpacity, curve: Curves.easeOut); } else { @@ -168,9 +168,9 @@ class CursorPainter { void paint(Canvas canvas, Offset offset, TextPosition position) { assert(prototype != null); - Offset caretOffset = + final caretOffset = editable!.getOffsetForCaret(position, prototype) + offset; - Rect caretRect = prototype!.shift(caretOffset); + var caretRect = prototype!.shift(caretOffset); if (style.offset != null) { caretRect = caretRect.shift(style.offset!); } @@ -179,7 +179,7 @@ class CursorPainter { caretRect = caretRect.shift(Offset(-caretRect.left, 0.0)); } - double? caretHeight = editable!.getFullHeightForCaret(position); + final caretHeight = editable!.getFullHeightForCaret(position); if (caretHeight != null) { switch (defaultTargetPlatform) { case TargetPlatform.android: @@ -207,8 +207,8 @@ class CursorPainter { } } - Offset caretPosition = editable!.localToGlobal(caretRect.topLeft); - double pixelMultiple = 1.0 / devicePixelRatio; + final caretPosition = editable!.localToGlobal(caretRect.topLeft); + final pixelMultiple = 1.0 / devicePixelRatio; caretRect = caretRect.shift(Offset( caretPosition.dx.isFinite ? (caretPosition.dx / pixelMultiple).round() * pixelMultiple - @@ -219,13 +219,13 @@ class CursorPainter { caretPosition.dy : caretPosition.dy)); - Paint paint = Paint()..color = color; + final paint = Paint()..color = color; if (style.radius == null) { canvas.drawRect(caretRect, paint); return; } - RRect caretRRect = RRect.fromRectAndRadius(caretRect, style.radius!); + final caretRRect = RRect.fromRectAndRadius(caretRect, style.radius!); canvas.drawRRect(caretRRect, paint); } } diff --git a/lib/widgets/default_styles.dart b/lib/widgets/default_styles.dart index 9490bebd..7f908114 100644 --- a/lib/widgets/default_styles.dart +++ b/lib/widgets/default_styles.dart @@ -17,7 +17,7 @@ class QuillStyles extends InheritedWidget { } static DefaultStyles? getStyles(BuildContext context, bool nullOk) { - var widget = context.dependOnInheritedWidgetOfExactType(); + final widget = context.dependOnInheritedWidgetOfExactType(); if (widget == null && nullOk) { return null; } @@ -84,13 +84,13 @@ class DefaultStyles { this.sizeHuge}); static DefaultStyles getInstance(BuildContext context) { - ThemeData themeData = Theme.of(context); - DefaultTextStyle defaultTextStyle = DefaultTextStyle.of(context); - TextStyle baseStyle = defaultTextStyle.style.copyWith( + final themeData = Theme.of(context); + final defaultTextStyle = DefaultTextStyle.of(context); + final baseStyle = defaultTextStyle.style.copyWith( fontSize: 16.0, height: 1.3, ); - Tuple2 baseSpacing = const Tuple2(6.0, 0); + final baseSpacing = const Tuple2(6.0, 0); String fontFamily; switch (themeData.platform) { case TargetPlatform.iOS: diff --git a/lib/widgets/delegate.dart b/lib/widgets/delegate.dart index f134a77e..8adf8ce7 100644 --- a/lib/widgets/delegate.dart +++ b/lib/widgets/delegate.dart @@ -34,7 +34,7 @@ class EditorTextSelectionGestureDetectorBuilder { void onTapDown(TapDownDetails details) { getRenderEditor()!.handleTapDown(details); - PointerDeviceKind? kind = details.kind; + final kind = details.kind; shouldShowSelectionToolbar = kind == null || kind == PointerDeviceKind.touch || kind == PointerDeviceKind.stylus; diff --git a/lib/widgets/editor.dart b/lib/widgets/editor.dart index 654daf1e..c3f24d98 100644 --- a/lib/widgets/editor.dart +++ b/lib/widgets/editor.dart @@ -17,7 +17,6 @@ import '../models/documents/nodes/container.dart' as container_node; import '../models/documents/nodes/embed.dart'; import '../models/documents/nodes/leaf.dart' as leaf; import '../models/documents/nodes/line.dart'; -import '../models/documents/nodes/node.dart'; import 'box.dart'; import 'controller.dart'; import 'cursor.dart'; @@ -100,7 +99,7 @@ Widget _defaultEmbedBuilder(BuildContext context, leaf.Embed node) { assert(!kIsWeb, 'Please provide EmbedBuilder for Web'); switch (node.value.type) { case 'image': - String imageUrl = _standardizeImageUrl(node.value.data); + final imageUrl = _standardizeImageUrl(node.value.data); return imageUrl.startsWith('http') ? Image.network(imageUrl) : isBase64(imageUrl) @@ -188,8 +187,8 @@ class _QuillEditorState extends State @override Widget build(BuildContext context) { - ThemeData theme = Theme.of(context); - TextSelectionThemeData selectionTheme = TextSelectionTheme.of(context); + final theme = Theme.of(context); + final selectionTheme = TextSelectionTheme.of(context); TextSelectionControls textSelectionControls; bool paintCursorAboveText; @@ -213,7 +212,7 @@ class _QuillEditorState extends State break; case TargetPlatform.iOS: case TargetPlatform.macOS: - CupertinoThemeData cupertinoTheme = CupertinoTheme.of(context); + final cupertinoTheme = CupertinoTheme.of(context); textSelectionControls = cupertinoTextSelectionControls; paintCursorAboveText = true; cursorOpacityAnimates = true; @@ -344,16 +343,14 @@ class _QuillEditorSelectionGestureDetectorBuilder if (_state.widget.controller.document.isEmpty()) { return false; } - TextPosition pos = - getRenderEditor()!.getPositionForOffset(details.globalPosition); - container_node.ChildQuery result = + final pos = getRenderEditor()!.getPositionForOffset(details.globalPosition); + final result = getEditor()!.widget.controller.document.queryChild(pos.offset); if (result.node == null) { return false; } - Line line = result.node as Line; - container_node.ChildQuery segmentResult = - line.queryChild(result.offset, false); + final line = result.node as Line; + final segmentResult = line.queryChild(result.offset, false); if (segmentResult.node == null) { if (line.length == 1) { // tapping when no text yet on this line @@ -364,7 +361,7 @@ class _QuillEditorSelectionGestureDetectorBuilder } return false; } - leaf.Leaf segment = segmentResult.node as leaf.Leaf; + final segment = segmentResult.node as leaf.Leaf; if (segment.style.containsKey(Attribute.link.key)) { var launchUrl = getEditor()!.widget.onLaunchUrl; launchUrl ??= _launchUrl; @@ -380,9 +377,9 @@ class _QuillEditorSelectionGestureDetectorBuilder return false; } if (getEditor()!.widget.readOnly && segment.value is BlockEmbed) { - BlockEmbed blockEmbed = segment.value as BlockEmbed; + final blockEmbed = segment.value as BlockEmbed; if (blockEmbed.type == 'image') { - final String imageUrl = _standardizeImageUrl(blockEmbed.data); + final imageUrl = _standardizeImageUrl(blockEmbed.data); Navigator.push( getEditor()!.context, MaterialPageRoute( @@ -413,7 +410,7 @@ class _QuillEditorSelectionGestureDetectorBuilder return false; } // segmentResult.offset == 0 means tap at the beginning of the TextLine - String? listVal = line.style.attributes[Attribute.list.key]!.value; + final String? listVal = line.style.attributes[Attribute.list.key]!.value; if (listVal == Attribute.unchecked.value) { getEditor()! .widget @@ -438,7 +435,7 @@ class _QuillEditorSelectionGestureDetectorBuilder void onSingleTapUp(TapUpDetails details) { getEditor()!.hideToolbar(); - bool positionSelected = _onTapping(details); + final positionSelected = _onTapping(details); if (delegate.getSelectionEnabled() && !positionSelected) { switch (Theme.of(_state.context).platform) { @@ -575,12 +572,12 @@ class RenderEditor extends RenderEditableContainerBox List getEndpointsForSelection( TextSelection textSelection) { if (textSelection.isCollapsed) { - RenderEditableBox child = childAtPosition(textSelection.extent); - TextPosition localPosition = TextPosition( + final child = childAtPosition(textSelection.extent); + final localPosition = TextPosition( offset: textSelection.extentOffset - child.getContainer().getOffset()); - Offset localOffset = child.getOffsetForCaret(localPosition); - BoxParentData parentData = child.parentData as BoxParentData; + final localOffset = child.getOffsetForCaret(localPosition); + final parentData = child.parentData as BoxParentData; return [ TextSelectionPoint( Offset(0.0, child.preferredLineHeight(localPosition)) + @@ -590,7 +587,7 @@ class RenderEditor extends RenderEditableContainerBox ]; } - Node? baseNode = _container.queryChild(textSelection.start, false).node; + final baseNode = _container.queryChild(textSelection.start, false).node; var baseChild = firstChild; while (baseChild != null) { @@ -601,15 +598,14 @@ class RenderEditor extends RenderEditableContainerBox } assert(baseChild != null); - BoxParentData baseParentData = baseChild!.parentData as BoxParentData; - TextSelection baseSelection = + final baseParentData = baseChild!.parentData as BoxParentData; + final baseSelection = localSelection(baseChild.getContainer(), textSelection, true); - TextSelectionPoint basePoint = - baseChild.getBaseEndpointForSelection(baseSelection); + var basePoint = baseChild.getBaseEndpointForSelection(baseSelection); basePoint = TextSelectionPoint( basePoint.point + baseParentData.offset, basePoint.direction); - Node? extentNode = _container.queryChild(textSelection.end, false).node; + final extentNode = _container.queryChild(textSelection.end, false).node; RenderEditableBox? extentChild = baseChild; while (extentChild != null) { if (extentChild.getContainer() == extentNode) { @@ -619,10 +615,10 @@ class RenderEditor extends RenderEditableContainerBox } assert(extentChild != null); - BoxParentData extentParentData = extentChild!.parentData as BoxParentData; - TextSelection extentSelection = + final extentParentData = extentChild!.parentData as BoxParentData; + final extentSelection = localSelection(extentChild.getContainer(), textSelection, true); - TextSelectionPoint extentPoint = + var extentPoint = extentChild.getExtentEndpointForSelection(extentSelection); extentPoint = TextSelectionPoint( extentPoint.point + extentParentData.offset, extentPoint.direction); @@ -643,9 +639,9 @@ class RenderEditor extends RenderEditableContainerBox Offset? to, SelectionChangedCause cause, ) { - TextPosition firstPosition = getPositionForOffset(from); - TextSelection firstWord = selectWordAtPosition(firstPosition); - TextSelection lastWord = + final firstPosition = getPositionForOffset(from); + final firstWord = selectWordAtPosition(firstPosition); + final lastWord = to == null ? firstWord : selectWordAtPosition(getPositionForOffset(to)); _handleSelectionChange( @@ -662,7 +658,7 @@ class RenderEditor extends RenderEditableContainerBox TextSelection nextSelection, SelectionChangedCause cause, ) { - bool focusingEmpty = nextSelection.baseOffset == 0 && + final focusingEmpty = nextSelection.baseOffset == 0 && nextSelection.extentOffset == 0 && !_hasFocus; if (nextSelection == selection && @@ -676,15 +672,15 @@ class RenderEditor extends RenderEditableContainerBox @override void selectWordEdge(SelectionChangedCause cause) { assert(_lastTapDownPosition != null); - TextPosition position = getPositionForOffset(_lastTapDownPosition!); - RenderEditableBox child = childAtPosition(position); - int nodeOffset = child.getContainer().getOffset(); - TextPosition localPosition = TextPosition( + final position = getPositionForOffset(_lastTapDownPosition!); + final child = childAtPosition(position); + final nodeOffset = child.getContainer().getOffset(); + final localPosition = TextPosition( offset: position.offset - nodeOffset, affinity: position.affinity, ); - TextRange localWord = child.getWordBoundary(localPosition); - TextRange word = TextRange( + final localWord = child.getWordBoundary(localPosition); + final word = TextRange( start: localWord.start + nodeOffset, end: localWord.end + nodeOffset, ); @@ -708,17 +704,17 @@ class RenderEditor extends RenderEditableContainerBox Offset? to, SelectionChangedCause cause, ) { - TextPosition fromPosition = getPositionForOffset(from); - TextPosition? toPosition = to == null ? null : getPositionForOffset(to); + final fromPosition = getPositionForOffset(from); + final toPosition = to == null ? null : getPositionForOffset(to); - int baseOffset = fromPosition.offset; - int extentOffset = fromPosition.offset; + var baseOffset = fromPosition.offset; + var extentOffset = fromPosition.offset; if (toPosition != null) { baseOffset = math.min(fromPosition.offset, toPosition.offset); extentOffset = math.max(fromPosition.offset, toPosition.offset); } - TextSelection newSelection = TextSelection( + final newSelection = TextSelection( baseOffset: baseOffset, extentOffset: extentOffset, affinity: fromPosition.affinity, @@ -738,12 +734,12 @@ class RenderEditor extends RenderEditableContainerBox @override TextSelection selectWordAtPosition(TextPosition position) { - RenderEditableBox child = childAtPosition(position); - int nodeOffset = child.getContainer().getOffset(); - TextPosition localPosition = TextPosition( + final child = childAtPosition(position); + final nodeOffset = child.getContainer().getOffset(); + final localPosition = TextPosition( offset: position.offset - nodeOffset, affinity: position.affinity); - TextRange localWord = child.getWordBoundary(localPosition); - TextRange word = TextRange( + final localWord = child.getWordBoundary(localPosition); + final word = TextRange( start: localWord.start + nodeOffset, end: localWord.end + nodeOffset, ); @@ -755,12 +751,12 @@ class RenderEditor extends RenderEditableContainerBox @override TextSelection selectLineAtPosition(TextPosition position) { - RenderEditableBox child = childAtPosition(position); - int nodeOffset = child.getContainer().getOffset(); - TextPosition localPosition = TextPosition( + final child = childAtPosition(position); + final nodeOffset = child.getContainer().getOffset(); + final localPosition = TextPosition( offset: position.offset - nodeOffset, affinity: position.affinity); - TextRange localLineRange = child.getLineBoundary(localPosition); - TextRange line = TextRange( + final localLineRange = child.getLineBoundary(localPosition); + final line = TextRange( start: localLineRange.start + nodeOffset, end: localLineRange.end + nodeOffset, ); @@ -810,19 +806,19 @@ class RenderEditor extends RenderEditableContainerBox @override double preferredLineHeight(TextPosition position) { - RenderEditableBox child = childAtPosition(position); + final child = childAtPosition(position); return child.preferredLineHeight(TextPosition( offset: position.offset - child.getContainer().getOffset())); } @override TextPosition getPositionForOffset(Offset offset) { - Offset local = globalToLocal(offset); - RenderEditableBox child = childAtOffset(local)!; + final local = globalToLocal(offset); + final child = childAtOffset(local)!; - BoxParentData parentData = child.parentData as BoxParentData; - Offset localOffset = local - parentData.offset; - TextPosition localPosition = child.getPositionForOffset(localOffset); + final parentData = child.parentData as BoxParentData; + final localOffset = local - parentData.offset; + final localPosition = child.getPositionForOffset(localOffset); return TextPosition( offset: localPosition.offset + child.getContainer().getOffset(), affinity: localPosition.affinity, @@ -836,12 +832,12 @@ class RenderEditor extends RenderEditableContainerBox /// Returns null if [selection] is already visible. double? getOffsetToRevealCursor( double viewportHeight, double scrollOffset, double offsetInViewport) { - List endpoints = getEndpointsForSelection(selection); - TextSelectionPoint endpoint = endpoints.first; - RenderEditableBox child = childAtPosition(selection.extent); + final endpoints = getEndpointsForSelection(selection); + final endpoint = endpoints.first; + final child = childAtPosition(selection.extent); const kMargin = 8.0; - double caretTop = endpoint.point.dy - + final caretTop = endpoint.point.dy - child.preferredLineHeight(TextPosition( offset: selection.extentOffset - child.getContainer().getOffset())) - @@ -919,7 +915,7 @@ class RenderEditableContainerBox extends RenderBox RenderEditableBox childAtPosition(TextPosition position) { assert(firstChild != null); - Node? targetNode = _container.queryChild(position.offset, false).node; + final targetNode = _container.queryChild(position.offset, false).node; var targetChild = firstChild; while (targetChild != null) { @@ -951,7 +947,8 @@ class RenderEditableContainerBox extends RenderBox } var child = firstChild; - double dx = -offset.dx, dy = _resolvedPadding!.top; + final dx = -offset.dx; + var dy = _resolvedPadding!.top; while (child != null) { if (child.size.contains(offset.translate(dx, -dy))) { return child; @@ -978,15 +975,14 @@ class RenderEditableContainerBox extends RenderBox _resolvePadding(); assert(_resolvedPadding != null); - double mainAxisExtent = _resolvedPadding!.top; + var mainAxisExtent = _resolvedPadding!.top; var child = firstChild; - BoxConstraints innerConstraints = + final innerConstraints = BoxConstraints.tightFor(width: constraints.maxWidth) .deflate(_resolvedPadding!); while (child != null) { child.layout(innerConstraints, parentUsesSize: true); - final EditableContainerParentData childParentData = - child.parentData as EditableContainerParentData; + final childParentData = child.parentData as EditableContainerParentData; childParentData.offset = Offset(_resolvedPadding!.left, mainAxisExtent); mainAxisExtent += child.size.height; assert(child.parentData == childParentData); @@ -999,24 +995,22 @@ class RenderEditableContainerBox extends RenderBox } double _getIntrinsicCrossAxis(double Function(RenderBox child) childSize) { - double extent = 0.0; + var extent = 0.0; var child = firstChild; while (child != null) { extent = math.max(extent, childSize(child)); - EditableContainerParentData childParentData = - child.parentData as EditableContainerParentData; + final childParentData = child.parentData as EditableContainerParentData; child = childParentData.nextSibling; } return extent; } double _getIntrinsicMainAxis(double Function(RenderBox child) childSize) { - double extent = 0.0; + var extent = 0.0; var child = firstChild; while (child != null) { extent += childSize(child); - EditableContainerParentData childParentData = - child.parentData as EditableContainerParentData; + final childParentData = child.parentData as EditableContainerParentData; child = childParentData.nextSibling; } return extent; @@ -1026,7 +1020,7 @@ class RenderEditableContainerBox extends RenderBox double computeMinIntrinsicWidth(double height) { _resolvePadding(); return _getIntrinsicCrossAxis((RenderBox child) { - double childHeight = math.max( + final childHeight = math.max( 0.0, height - _resolvedPadding!.top + _resolvedPadding!.bottom); return child.getMinIntrinsicWidth(childHeight) + _resolvedPadding!.left + @@ -1038,7 +1032,7 @@ class RenderEditableContainerBox extends RenderBox double computeMaxIntrinsicWidth(double height) { _resolvePadding(); return _getIntrinsicCrossAxis((RenderBox child) { - double childHeight = math.max( + final childHeight = math.max( 0.0, height - _resolvedPadding!.top + _resolvedPadding!.bottom); return child.getMaxIntrinsicWidth(childHeight) + _resolvedPadding!.left + @@ -1050,7 +1044,7 @@ class RenderEditableContainerBox extends RenderBox double computeMinIntrinsicHeight(double width) { _resolvePadding(); return _getIntrinsicMainAxis((RenderBox child) { - double childWidth = math.max( + final childWidth = math.max( 0.0, width - _resolvedPadding!.left + _resolvedPadding!.right); return child.getMinIntrinsicHeight(childWidth) + _resolvedPadding!.top + diff --git a/lib/widgets/keyboard_listener.dart b/lib/widgets/keyboard_listener.dart index 7311b345..f952c3dd 100644 --- a/lib/widgets/keyboard_listener.dart +++ b/lib/widgets/keyboard_listener.dart @@ -71,10 +71,10 @@ class KeyboardListener { return false; } - Set keysPressed = + final keysPressed = LogicalKeyboardKey.collapseSynonyms(RawKeyboard.instance.keysPressed); - LogicalKeyboardKey key = event.logicalKey; - bool isMacOS = event.data is RawKeyEventDataMacOs; + final key = event.logicalKey; + final isMacOS = event.data is RawKeyEventDataMacOs; if (!_nonModifierKeys.contains(key) || keysPressed .difference(isMacOS ? _macOsModifierKeys : _modifierKeys) diff --git a/lib/widgets/proxy.dart b/lib/widgets/proxy.dart index 8717d12a..71fc219d 100644 --- a/lib/widgets/proxy.dart +++ b/lib/widgets/proxy.dart @@ -91,8 +91,8 @@ class RenderEmbedProxy extends RenderProxyBox implements RenderContentProxyBox { ]; } - double left = selection.extentOffset == 0 ? 0.0 : size.width; - double right = selection.extentOffset == 0 ? 0.0 : size.width; + final left = selection.extentOffset == 0 ? 0.0 : size.width; + final right = selection.extentOffset == 0 ? 0.0 : size.width; return [ TextBox.fromLTRBD(left, 0.0, right, size.height, TextDirection.ltr) ]; diff --git a/lib/widgets/raw_editor.dart b/lib/widgets/raw_editor.dart index 155a90ff..8fc9babd 100644 --- a/lib/widgets/raw_editor.dart +++ b/lib/widgets/raw_editor.dart @@ -15,9 +15,7 @@ import '../models/documents/attribute.dart'; import '../models/documents/document.dart'; import '../models/documents/nodes/block.dart'; import '../models/documents/nodes/line.dart'; -import '../models/documents/nodes/node.dart'; import '../utils/diff_delta.dart'; -import 'box.dart'; import 'controller.dart'; import 'cursor.dart'; import 'default_styles.dart'; @@ -140,7 +138,7 @@ class RawEditorState extends EditorState bool get _hasFocus => widget.focusNode.hasFocus; TextDirection get _textDirection { - TextDirection result = Directionality.of(context); + final result = Directionality.of(context); return result; } @@ -153,13 +151,13 @@ class RawEditorState extends EditorState if (wordModifier && lineModifier) { return; } - TextSelection selection = widget.controller.selection; + final selection = widget.controller.selection; - TextSelection newSelection = widget.controller.selection; + var newSelection = widget.controller.selection; - String plainText = textEditingValue.text; + final plainText = textEditingValue.text; - bool rightKey = key == LogicalKeyboardKey.arrowRight, + final rightKey = key == LogicalKeyboardKey.arrowRight, leftKey = key == LogicalKeyboardKey.arrowLeft, upKey = key == LogicalKeyboardKey.arrowUp, downKey = key == LogicalKeyboardKey.arrowDown; @@ -184,7 +182,7 @@ class RawEditorState extends EditorState TextSelection _placeCollapsedSelection(TextSelection selection, TextSelection newSelection, bool leftKey, bool rightKey) { - int newOffset = newSelection.extentOffset; + var newOffset = newSelection.extentOffset; if (!selection.isCollapsed) { if (leftKey) { newOffset = newSelection.baseOffset < newSelection.extentOffset @@ -206,34 +204,32 @@ class RawEditorState extends EditorState TextSelection selection, TextSelection newSelection, String plainText) { - TextPosition originPosition = TextPosition( + final originPosition = TextPosition( offset: upKey ? selection.baseOffset : selection.extentOffset); - RenderEditableBox child = - getRenderEditor()!.childAtPosition(originPosition); - TextPosition localPosition = TextPosition( + final child = getRenderEditor()!.childAtPosition(originPosition); + final localPosition = TextPosition( offset: originPosition.offset - child.getContainer().getDocumentOffset()); - TextPosition? position = upKey + var position = upKey ? child.getPositionAbove(localPosition) : child.getPositionBelow(localPosition); if (position == null) { - var sibling = upKey + final sibling = upKey ? getRenderEditor()!.childBefore(child) : getRenderEditor()!.childAfter(child); if (sibling == null) { position = TextPosition(offset: upKey ? 0 : plainText.length - 1); } else { - Offset finalOffset = Offset( + final finalOffset = Offset( child.getOffsetForCaret(localPosition).dx, sibling .getOffsetForCaret(TextPosition( offset: upKey ? sibling.getContainer().length - 1 : 0)) .dy); - TextPosition siblingPosition = - sibling.getPositionForOffset(finalOffset); + final siblingPosition = sibling.getPositionForOffset(finalOffset); position = TextPosition( offset: sibling.getContainer().getDocumentOffset() + siblingPosition.offset); @@ -273,28 +269,28 @@ class RawEditorState extends EditorState bool shift) { if (wordModifier) { if (leftKey) { - TextSelection textSelection = getRenderEditor()!.selectWordAtPosition( + final textSelection = getRenderEditor()!.selectWordAtPosition( TextPosition( offset: _previousCharacter( newSelection.extentOffset, plainText, false))); return newSelection.copyWith(extentOffset: textSelection.baseOffset); } - TextSelection textSelection = getRenderEditor()!.selectWordAtPosition( + final textSelection = getRenderEditor()!.selectWordAtPosition( TextPosition( offset: _nextCharacter(newSelection.extentOffset, plainText, false))); return newSelection.copyWith(extentOffset: textSelection.extentOffset); } else if (lineModifier) { if (leftKey) { - TextSelection textSelection = getRenderEditor()!.selectLineAtPosition( + final textSelection = getRenderEditor()!.selectLineAtPosition( TextPosition( offset: _previousCharacter( newSelection.extentOffset, plainText, false))); return newSelection.copyWith(extentOffset: textSelection.baseOffset); } - int startPoint = newSelection.extentOffset; + final startPoint = newSelection.extentOffset; if (startPoint < plainText.length) { - TextSelection textSelection = getRenderEditor()! + final textSelection = getRenderEditor()! .selectLineAtPosition(TextPosition(offset: startPoint)); return newSelection.copyWith(extentOffset: textSelection.extentOffset); } @@ -302,9 +298,9 @@ class RawEditorState extends EditorState } if (rightKey && newSelection.extentOffset < plainText.length) { - int nextExtent = + final nextExtent = _nextCharacter(newSelection.extentOffset, plainText, true); - int distance = nextExtent - newSelection.extentOffset; + final distance = nextExtent - newSelection.extentOffset; newSelection = newSelection.copyWith(extentOffset: nextExtent); if (shift) { _cursorResetLocation += distance; @@ -313,9 +309,9 @@ class RawEditorState extends EditorState } if (leftKey && newSelection.extentOffset > 0) { - int previousExtent = + final previousExtent = _previousCharacter(newSelection.extentOffset, plainText, true); - int distance = newSelection.extentOffset - previousExtent; + final distance = newSelection.extentOffset - previousExtent; newSelection = newSelection.copyWith(extentOffset: previousExtent); if (shift) { _cursorResetLocation -= distance; @@ -331,8 +327,8 @@ class RawEditorState extends EditorState return string.length; } - int count = 0; - Characters remain = string.characters.skipWhile((String currentString) { + var count = 0; + final remain = string.characters.skipWhile((String currentString) { if (count <= index) { count += currentString.length; return true; @@ -351,9 +347,9 @@ class RawEditorState extends EditorState return 0; } - int count = 0; + var count = 0; int? lastNonWhitespace; - for (String currentString in string.characters) { + for (final currentString in string.characters) { if (!includeWhitespace && !WHITE_SPACE.contains( currentString.characters.first.toString().codeUnitAt(0))) { @@ -411,7 +407,7 @@ class RawEditorState extends EditorState return; } - TextEditingValue actualValue = textEditingValue.copyWith( + final actualValue = textEditingValue.copyWith( composing: _lastKnownRemoteTextEditingValue!.composing, ); @@ -419,7 +415,7 @@ class RawEditorState extends EditorState return; } - bool shouldRemember = + final shouldRemember = textEditingValue.text != _lastKnownRemoteTextEditingValue!.text; _lastKnownRemoteTextEditingValue = actualValue; _textInputConnection!.setEditingState(actualValue); @@ -456,13 +452,12 @@ class RawEditorState extends EditorState return; } - TextEditingValue effectiveLastKnownValue = - _lastKnownRemoteTextEditingValue!; + final effectiveLastKnownValue = _lastKnownRemoteTextEditingValue!; _lastKnownRemoteTextEditingValue = value; - String oldText = effectiveLastKnownValue.text; - String text = value.text; - int cursorPosition = value.selection.extentOffset; - Diff diff = getDiff(oldText, text, cursorPosition); + final oldText = effectiveLastKnownValue.text; + final text = value.text; + final cursorPosition = value.selection.extentOffset; + final diff = getDiff(oldText, text, cursorPosition); widget.controller.replaceText( diff.start, diff.deleted.length, diff.inserted, value.selection); } @@ -513,7 +508,7 @@ class RawEditorState extends EditorState _focusAttachment!.reparent(); super.build(context); - Document _doc = widget.controller.document; + var _doc = widget.controller.document; if (_doc.isEmpty() && !widget.focusNode.hasFocus && widget.placeholder != null) { @@ -540,7 +535,7 @@ class RawEditorState extends EditorState ); if (widget.scrollable) { - EdgeInsets baselinePadding = + final baselinePadding = EdgeInsets.only(top: _styles!.paragraph!.verticalSpacing.item1); child = BaselineProxy( textStyle: _styles!.paragraph!.style, @@ -553,7 +548,7 @@ class RawEditorState extends EditorState ); } - BoxConstraints constraints = widget.expands + final constraints = widget.expands ? const BoxConstraints.expand() : BoxConstraints( minHeight: widget.minHeight ?? 0.0, @@ -584,15 +579,14 @@ class RawEditorState extends EditorState List _buildChildren(Document doc, BuildContext context) { final result = []; - Map indentLevelCounts = {}; - for (Node node in doc.root.children) { + final indentLevelCounts = {}; + for (final node in doc.root.children) { if (node is Line) { - EditableTextLine editableTextLine = - _getEditableTextLineFromNode(node, context); + final editableTextLine = _getEditableTextLineFromNode(node, context); result.add(editableTextLine); } else if (node is Block) { - Map attrs = node.style.attributes; - EditableTextBlock editableTextBlock = EditableTextBlock( + final attrs = node.style.attributes; + final editableTextBlock = EditableTextBlock( node, _textDirection, _getVerticalSpacingForBlock(node, _styles), @@ -617,13 +611,13 @@ class RawEditorState extends EditorState EditableTextLine _getEditableTextLineFromNode( Line node, BuildContext context) { - TextLine textLine = TextLine( + final textLine = TextLine( line: node, textDirection: _textDirection, embedBuilder: widget.embedBuilder, styles: _styles!, ); - EditableTextLine editableTextLine = EditableTextLine( + final editableTextLine = EditableTextLine( node, null, textLine, @@ -641,9 +635,9 @@ class RawEditorState extends EditorState Tuple2 _getVerticalSpacingForLine( Line line, DefaultStyles? defaultStyles) { - Map attrs = line.style.attributes; + final attrs = line.style.attributes; if (attrs.containsKey(Attribute.header.key)) { - int? level = attrs[Attribute.header.key]!.value; + final int? level = attrs[Attribute.header.key]!.value; switch (level) { case 1: return defaultStyles!.h1!.verticalSpacing; @@ -661,7 +655,7 @@ class RawEditorState extends EditorState Tuple2 _getVerticalSpacingForBlock( Block node, DefaultStyles? defaultStyles) { - Map attrs = node.style.attributes; + final attrs = node.style.attributes; if (attrs.containsKey(Attribute.blockQuote.key)) { return defaultStyles!.quote!.verticalSpacing; } else if (attrs.containsKey(Attribute.codeBlock.key)) { @@ -720,8 +714,8 @@ class RawEditorState extends EditorState @override void didChangeDependencies() { super.didChangeDependencies(); - DefaultStyles? parentStyles = QuillStyles.getStyles(context, true); - DefaultStyles defaultStyles = DefaultStyles.getInstance(context); + final parentStyles = QuillStyles.getStyles(context, true); + final defaultStyles = DefaultStyles.getInstance(context); _styles = (parentStyles != null) ? defaultStyles.merge(parentStyles) : defaultStyles; @@ -784,27 +778,26 @@ class RawEditorState extends EditorState } void handleDelete(bool forward) { - TextSelection selection = widget.controller.selection; - String plainText = textEditingValue.text; - int cursorPosition = selection.start; - String textBefore = selection.textBefore(plainText); - String textAfter = selection.textAfter(plainText); + final selection = widget.controller.selection; + final plainText = textEditingValue.text; + var cursorPosition = selection.start; + var textBefore = selection.textBefore(plainText); + var textAfter = selection.textAfter(plainText); if (selection.isCollapsed) { if (!forward && textBefore.isNotEmpty) { - final int characterBoundary = + final characterBoundary = _previousCharacter(textBefore.length, textBefore, true); textBefore = textBefore.substring(0, characterBoundary); cursorPosition = characterBoundary; } if (forward && textAfter.isNotEmpty && textAfter != '\n') { - final int deleteCount = _nextCharacter(0, textAfter, true); + final deleteCount = _nextCharacter(0, textAfter, true); textAfter = textAfter.substring(deleteCount); } } - TextSelection newSelection = - TextSelection.collapsed(offset: cursorPosition); - String newText = textBefore + textAfter; - int size = plainText.length - newText.length; + final newSelection = TextSelection.collapsed(offset: cursorPosition); + final newText = textBefore + textAfter; + final size = plainText.length - newText.length; widget.controller.replaceText( cursorPosition, size, @@ -814,8 +807,8 @@ class RawEditorState extends EditorState } void handleShortcut(InputShortcut? shortcut) async { - TextSelection selection = widget.controller.selection; - String plainText = textEditingValue.text; + final selection = widget.controller.selection; + final plainText = textEditingValue.text; if (shortcut == InputShortcut.COPY) { if (!selection.isCollapsed) { await Clipboard.setData( @@ -844,7 +837,7 @@ class RawEditorState extends EditorState return; } if (shortcut == InputShortcut.PASTE && !widget.readOnly) { - ClipboardData? data = await Clipboard.getData(Clipboard.kTextPlain); + final data = await Clipboard.getData(Clipboard.kTextPlain); if (data != null) { widget.controller.replaceText( selection.start, @@ -1074,8 +1067,8 @@ class RawEditorState extends EditorState value.selection, ); } else { - final TextEditingValue value = textEditingValue; - final ClipboardData? data = await Clipboard.getData(Clipboard.kTextPlain); + final value = textEditingValue; + final data = await Clipboard.getData(Clipboard.kTextPlain); if (data != null) { final length = textEditingValue.selection.end - textEditingValue.selection.start; @@ -1095,7 +1088,7 @@ class RawEditorState extends EditorState } Future __isItCut(TextEditingValue value) async { - ClipboardData? data = await Clipboard.getData(Clipboard.kTextPlain); + final data = await Clipboard.getData(Clipboard.kTextPlain); if (data == null) { return false; } diff --git a/lib/widgets/text_block.dart b/lib/widgets/text_block.dart index 031ecbd5..b9808fad 100644 --- a/lib/widgets/text_block.dart +++ b/lib/widgets/text_block.dart @@ -6,7 +6,6 @@ import 'package:tuple/tuple.dart'; import '../models/documents/attribute.dart'; import '../models/documents/nodes/block.dart'; import '../models/documents/nodes/line.dart'; -import '../models/documents/nodes/node.dart'; import 'box.dart'; import 'cursor.dart'; import 'default_styles.dart'; @@ -79,7 +78,7 @@ class EditableTextBlock extends StatelessWidget { Widget build(BuildContext context) { assert(debugCheckHasMediaQuery(context)); - DefaultStyles? defaultStyles = QuillStyles.getStyles(context, false); + final defaultStyles = QuillStyles.getStyles(context, false); return _EditableBlock( block, textDirection, @@ -91,7 +90,7 @@ class EditableTextBlock extends StatelessWidget { BoxDecoration? _getDecorationForBlock( Block node, DefaultStyles? defaultStyles) { - Map attrs = block.style.attributes; + final attrs = block.style.attributes; if (attrs.containsKey(Attribute.blockQuote.key)) { return defaultStyles!.quote!.decoration; } @@ -103,13 +102,13 @@ class EditableTextBlock extends StatelessWidget { List _buildChildren( BuildContext context, Map indentLevelCounts) { - DefaultStyles? defaultStyles = QuillStyles.getStyles(context, false); - int count = block.children.length; - var children = []; - int index = 0; - for (Line line in Iterable.castFrom(block.children)) { + final defaultStyles = QuillStyles.getStyles(context, false); + final count = block.children.length; + final children = []; + var index = 0; + for (final line in Iterable.castFrom(block.children)) { index++; - EditableTextLine editableTextLine = EditableTextLine( + final editableTextLine = EditableTextLine( line, _buildLeading(context, line, index, indentLevelCounts, count), TextLine( @@ -134,8 +133,8 @@ class EditableTextBlock extends StatelessWidget { Widget? _buildLeading(BuildContext context, Line line, int index, Map indentLevelCounts, int count) { - DefaultStyles? defaultStyles = QuillStyles.getStyles(context, false); - Map attrs = line.style.attributes; + final defaultStyles = QuillStyles.getStyles(context, false); + final attrs = line.style.attributes; if (attrs[Attribute.list.key] == Attribute.ol) { return _NumberPoint( index: index, @@ -183,10 +182,10 @@ class EditableTextBlock extends StatelessWidget { } double _getIndentWidth() { - Map attrs = block.style.attributes; + final attrs = block.style.attributes; - Attribute? indent = attrs[Attribute.indent.key]; - double extraIndent = 0.0; + final indent = attrs[Attribute.indent.key]; + var extraIndent = 0.0; if (indent != null && indent.value != null) { extraIndent = 16.0 * indent.value; } @@ -200,11 +199,11 @@ class EditableTextBlock extends StatelessWidget { Tuple2 _getSpacingForLine( Line node, int index, int count, DefaultStyles? defaultStyles) { - double top = 0.0, bottom = 0.0; + var top = 0.0, bottom = 0.0; - Map attrs = block.style.attributes; + final attrs = block.style.attributes; if (attrs.containsKey(Attribute.header.key)) { - int? level = attrs[Attribute.header.key]!.value; + final level = attrs[Attribute.header.key]!.value; switch (level) { case 1: top = defaultStyles!.h1!.verticalSpacing.item1; @@ -310,8 +309,8 @@ class RenderEditableTextBlock extends RenderEditableContainerBox @override TextRange getLineBoundary(TextPosition position) { - RenderEditableBox child = childAtPosition(position); - TextRange rangeInChild = child.getLineBoundary(TextPosition( + final child = childAtPosition(position); + final rangeInChild = child.getLineBoundary(TextPosition( offset: position.offset - child.getContainer().getOffset(), affinity: position.affinity, )); @@ -323,7 +322,7 @@ class RenderEditableTextBlock extends RenderEditableContainerBox @override Offset getOffsetForCaret(TextPosition position) { - RenderEditableBox child = childAtPosition(position); + final child = childAtPosition(position); return child.getOffsetForCaret(TextPosition( offset: position.offset - child.getContainer().getOffset(), affinity: position.affinity, @@ -333,9 +332,9 @@ class RenderEditableTextBlock extends RenderEditableContainerBox @override TextPosition getPositionForOffset(Offset offset) { - RenderEditableBox child = childAtOffset(offset)!; - BoxParentData parentData = child.parentData as BoxParentData; - TextPosition localPosition = + final child = childAtOffset(offset)!; + final parentData = child.parentData as BoxParentData; + final localPosition = child.getPositionForOffset(offset - parentData.offset); return TextPosition( offset: localPosition.offset + child.getContainer().getOffset(), @@ -345,9 +344,9 @@ class RenderEditableTextBlock extends RenderEditableContainerBox @override TextRange getWordBoundary(TextPosition position) { - RenderEditableBox child = childAtPosition(position); - int nodeOffset = child.getContainer().getOffset(); - TextRange childWord = child + final child = childAtPosition(position); + final nodeOffset = child.getContainer().getOffset(); + final childWord = child .getWordBoundary(TextPosition(offset: position.offset - nodeOffset)); return TextRange( start: childWord.start + nodeOffset, @@ -359,25 +358,25 @@ class RenderEditableTextBlock extends RenderEditableContainerBox TextPosition? getPositionAbove(TextPosition position) { assert(position.offset < getContainer().length); - RenderEditableBox child = childAtPosition(position); - TextPosition childLocalPosition = TextPosition( + final child = childAtPosition(position); + final childLocalPosition = TextPosition( offset: position.offset - child.getContainer().getOffset()); - TextPosition? result = child.getPositionAbove(childLocalPosition); + final result = child.getPositionAbove(childLocalPosition); if (result != null) { return TextPosition( offset: result.offset + child.getContainer().getOffset()); } - RenderEditableBox? sibling = childBefore(child); + final sibling = childBefore(child); if (sibling == null) { return null; } - Offset caretOffset = child.getOffsetForCaret(childLocalPosition); - TextPosition testPosition = + final caretOffset = child.getOffsetForCaret(childLocalPosition); + final testPosition = TextPosition(offset: sibling.getContainer().length - 1); - Offset testOffset = sibling.getOffsetForCaret(testPosition); - Offset finalOffset = Offset(caretOffset.dx, testOffset.dy); + final testOffset = sibling.getOffsetForCaret(testPosition); + final finalOffset = Offset(caretOffset.dx, testOffset.dy); return TextPosition( offset: sibling.getContainer().getOffset() + sibling.getPositionForOffset(finalOffset).offset); @@ -387,24 +386,23 @@ class RenderEditableTextBlock extends RenderEditableContainerBox TextPosition? getPositionBelow(TextPosition position) { assert(position.offset < getContainer().length); - RenderEditableBox child = childAtPosition(position); - TextPosition childLocalPosition = TextPosition( + final child = childAtPosition(position); + final childLocalPosition = TextPosition( offset: position.offset - child.getContainer().getOffset()); - TextPosition? result = child.getPositionBelow(childLocalPosition); + final result = child.getPositionBelow(childLocalPosition); if (result != null) { return TextPosition( offset: result.offset + child.getContainer().getOffset()); } - RenderEditableBox? sibling = childAfter(child); + final sibling = childAfter(child); if (sibling == null) { return null; } - Offset caretOffset = child.getOffsetForCaret(childLocalPosition); - Offset testOffset = - sibling.getOffsetForCaret(const TextPosition(offset: 0)); - Offset finalOffset = Offset(caretOffset.dx, testOffset.dy); + final caretOffset = child.getOffsetForCaret(childLocalPosition); + final testOffset = sibling.getOffsetForCaret(const TextPosition(offset: 0)); + final finalOffset = Offset(caretOffset.dx, testOffset.dy); return TextPosition( offset: sibling.getContainer().getOffset() + sibling.getPositionForOffset(finalOffset).offset); @@ -412,7 +410,7 @@ class RenderEditableTextBlock extends RenderEditableContainerBox @override double preferredLineHeight(TextPosition position) { - RenderEditableBox child = childAtPosition(position); + final child = childAtPosition(position); return child.preferredLineHeight(TextPosition( offset: position.offset - child.getContainer().getOffset())); } @@ -426,7 +424,7 @@ class RenderEditableTextBlock extends RenderEditableContainerBox null); } - Node? baseNode = getContainer().queryChild(selection.start, false).node; + final baseNode = getContainer().queryChild(selection.start, false).node; var baseChild = firstChild; while (baseChild != null) { if (baseChild.getContainer() == baseNode) { @@ -436,7 +434,7 @@ class RenderEditableTextBlock extends RenderEditableContainerBox } assert(baseChild != null); - TextSelectionPoint basePoint = baseChild!.getBaseEndpointForSelection( + final basePoint = baseChild!.getBaseEndpointForSelection( localSelection(baseChild.getContainer(), selection, true)); return TextSelectionPoint( basePoint.point + (baseChild.parentData as BoxParentData).offset, @@ -452,7 +450,7 @@ class RenderEditableTextBlock extends RenderEditableContainerBox null); } - Node? extentNode = getContainer().queryChild(selection.end, false).node; + final extentNode = getContainer().queryChild(selection.end, false).node; var extentChild = firstChild; while (extentChild != null) { @@ -463,7 +461,7 @@ class RenderEditableTextBlock extends RenderEditableContainerBox } assert(extentChild != null); - TextSelectionPoint extentPoint = extentChild!.getExtentEndpointForSelection( + final extentPoint = extentChild!.getExtentEndpointForSelection( localSelection(extentChild.getContainer(), selection, true)); return TextSelectionPoint( extentPoint.point + (extentChild.parentData as BoxParentData).offset, @@ -487,11 +485,11 @@ class RenderEditableTextBlock extends RenderEditableContainerBox void _paintDecoration(PaintingContext context, Offset offset) { _painter ??= _decoration.createBoxPainter(markNeedsPaint); - EdgeInsets decorationPadding = resolvedPadding! - _contentPadding; + final decorationPadding = resolvedPadding! - _contentPadding; - ImageConfiguration filledConfiguration = + final filledConfiguration = configuration.copyWith(size: decorationPadding.deflateSize(size)); - int debugSaveCount = context.canvas.getSaveCount(); + final debugSaveCount = context.canvas.getSaveCount(); final decorationOffset = offset.translate(decorationPadding.left, decorationPadding.top); @@ -572,7 +570,7 @@ class _NumberPoint extends StatelessWidget { @override Widget build(BuildContext context) { - String s = index.toString(); + var s = index.toString(); int? level = 0; if (!attrs.containsKey(Attribute.indent.key) && !indentLevelCounts.containsKey(1)) { @@ -595,7 +593,7 @@ class _NumberPoint extends StatelessWidget { // last visited level is done, going up indentLevelCounts.remove(level + 1); } - int count = (indentLevelCounts[level] ?? 0) + 1; + final count = (indentLevelCounts[level] ?? 0) + 1; indentLevelCounts[level] = count; s = count.toString(); diff --git a/lib/widgets/text_line.dart b/lib/widgets/text_line.dart index c10c6c8e..99075411 100644 --- a/lib/widgets/text_line.dart +++ b/lib/widgets/text_line.dart @@ -11,7 +11,6 @@ import '../models/documents/nodes/leaf.dart' as leaf; import '../models/documents/nodes/leaf.dart'; import '../models/documents/nodes/line.dart'; import '../models/documents/nodes/node.dart'; -import '../models/documents/style.dart'; import '../utils/color.dart'; import 'box.dart'; import 'cursor.dart'; @@ -39,14 +38,14 @@ class TextLine extends StatelessWidget { assert(debugCheckHasMediaQuery(context)); if (line.hasEmbed) { - Embed embed = line.children.single as Embed; + final embed = line.children.single as Embed; return EmbedProxy(embedBuilder(context, embed)); } final textSpan = _buildTextSpan(context); final strutStyle = StrutStyle.fromTextStyle(textSpan.style!); final textAlign = _getTextAlign(); - RichText child = RichText( + final child = RichText( text: textSpan, textAlign: textAlign, textDirection: textDirection, @@ -80,20 +79,20 @@ class TextLine extends StatelessWidget { } TextSpan _buildTextSpan(BuildContext context) { - DefaultStyles defaultStyles = styles; - List children = line.children + final defaultStyles = styles; + final children = line.children .map((node) => _getTextSpanFromNode(defaultStyles, node)) .toList(growable: false); - TextStyle textStyle = const TextStyle(); + var textStyle = const TextStyle(); if (line.style.containsKey(Attribute.placeholder.key)) { textStyle = defaultStyles.placeHolder!.style; return TextSpan(children: children, style: textStyle); } - Attribute? header = line.style.attributes[Attribute.header.key]; - Map m = { + final header = line.style.attributes[Attribute.header.key]; + final m = { Attribute.h1: defaultStyles.h1!.style, Attribute.h2: defaultStyles.h2!.style, Attribute.h3: defaultStyles.h3!.style, @@ -101,7 +100,7 @@ class TextLine extends StatelessWidget { textStyle = textStyle.merge(m[header] ?? defaultStyles.paragraph!.style); - Attribute? block = line.style.getBlockExceptHeader(); + final block = line.style.getBlockExceptHeader(); TextStyle? toMerge; if (block == Attribute.blockQuote) { toMerge = defaultStyles.quote!.style; @@ -117,11 +116,11 @@ class TextLine extends StatelessWidget { } TextSpan _getTextSpanFromNode(DefaultStyles defaultStyles, Node node) { - leaf.Text textNode = node as leaf.Text; - Style style = textNode.style; - TextStyle res = const TextStyle(); + final textNode = node as leaf.Text; + final style = textNode.style; + var res = const TextStyle(); - Map m = { + final m = { Attribute.bold.key: defaultStyles.bold, Attribute.italic.key: defaultStyles.italic, Attribute.link.key: defaultStyles.link, @@ -134,12 +133,12 @@ class TextLine extends StatelessWidget { } }); - Attribute? font = textNode.style.attributes[Attribute.font.key]; + final font = textNode.style.attributes[Attribute.font.key]; if (font != null && font.value != null) { res = res.merge(TextStyle(fontFamily: font.value)); } - Attribute? size = textNode.style.attributes[Attribute.size.key]; + final size = textNode.style.attributes[Attribute.size.key]; if (size != null && size.value != null) { switch (size.value) { case 'small': @@ -152,7 +151,7 @@ class TextLine extends StatelessWidget { res = res.merge(defaultStyles.sizeHuge); break; default: - double? fontSize = double.tryParse(size.value); + final fontSize = double.tryParse(size.value); if (fontSize != null) { res = res.merge(TextStyle(fontSize: fontSize)); } else { @@ -161,7 +160,7 @@ class TextLine extends StatelessWidget { } } - Attribute? color = textNode.style.attributes[Attribute.color.key]; + final color = textNode.style.attributes[Attribute.color.key]; if (color != null && color.value != null) { var textColor = defaultStyles.color; if (color.value is String) { @@ -172,7 +171,7 @@ class TextLine extends StatelessWidget { } } - Attribute? background = textNode.style.attributes[Attribute.background.key]; + final background = textNode.style.attributes[Attribute.background.key]; if (background != null && background.value != null) { final backgroundColor = stringToColor(background.value); res = res.merge(TextStyle(backgroundColor: backgroundColor)); @@ -345,7 +344,7 @@ class RenderEditableTextLine extends RenderEditableBox { return; } - bool containsSelection = containsTextSelection(); + final containsSelection = containsTextSelection(); if (attached && containsCursor()) { cursorCont.removeListener(markNeedsLayout); cursorCont.color.removeListener(markNeedsPaint); @@ -424,7 +423,7 @@ class RenderEditableTextLine extends RenderEditableBox { } List _getBoxes(TextSelection textSelection) { - BoxParentData? parentData = _body!.parentData as BoxParentData?; + final parentData = _body!.parentData as BoxParentData?; return _body!.getBoxesForSelection(textSelection).map((box) { return TextBox.fromLTRBD( box.left + parentData!.offset.dx, @@ -463,9 +462,9 @@ class RenderEditableTextLine extends RenderEditableBox { getOffsetForCaret(textSelection.extent), null); } - List boxes = _getBoxes(textSelection); + final boxes = _getBoxes(textSelection); assert(boxes.isNotEmpty); - TextBox targetBox = first ? boxes.first : boxes.last; + final targetBox = first ? boxes.first : boxes.last; return TextSelectionPoint( Offset(first ? targetBox.start : targetBox.end, targetBox.bottom), targetBox.direction); @@ -473,10 +472,10 @@ class RenderEditableTextLine extends RenderEditableBox { @override TextRange getLineBoundary(TextPosition position) { - double lineDy = getOffsetForCaret(position) + final lineDy = getOffsetForCaret(position) .translate(0.0, 0.5 * preferredLineHeight(position)) .dy; - List lineBoxes = + final lineBoxes = _getBoxes(TextSelection(baseOffset: 0, extentOffset: line.length - 1)) .where((element) => element.top < lineDy && element.bottom > lineDy) .toList(growable: false); @@ -504,7 +503,7 @@ class RenderEditableTextLine extends RenderEditableBox { TextPosition? _getPosition(TextPosition textPosition, double dyScale) { assert(textPosition.offset < line.length); - Offset offset = getOffsetForCaret(textPosition) + final offset = getOffsetForCaret(textPosition) .translate(0, dyScale * preferredLineHeight(textPosition)); if (_body!.size .contains(offset - (_body!.parentData as BoxParentData).offset)) { @@ -574,7 +573,7 @@ class RenderEditableTextLine extends RenderEditableBox { @override void detach() { super.detach(); - for (RenderBox child in _children) { + for (final child in _children) { child.detach(); } if (containsCursor()) { @@ -595,7 +594,7 @@ class RenderEditableTextLine extends RenderEditableBox { @override List debugDescribeChildren() { - var value = []; + final value = []; void add(RenderBox? child, String name) { if (child != null) { value.add(child.toDiagnosticsNode(name: name)); @@ -613,12 +612,12 @@ class RenderEditableTextLine extends RenderEditableBox { @override double computeMinIntrinsicWidth(double height) { _resolvePadding(); - double horizontalPadding = _resolvedPadding!.left + _resolvedPadding!.right; - double verticalPadding = _resolvedPadding!.top + _resolvedPadding!.bottom; - int leadingWidth = _leading == null + final horizontalPadding = _resolvedPadding!.left + _resolvedPadding!.right; + final verticalPadding = _resolvedPadding!.top + _resolvedPadding!.bottom; + final leadingWidth = _leading == null ? 0 : _leading!.getMinIntrinsicWidth(height - verticalPadding) as int; - int bodyWidth = _body == null + final bodyWidth = _body == null ? 0 : _body!.getMinIntrinsicWidth(math.max(0.0, height - verticalPadding)) as int; @@ -628,12 +627,12 @@ class RenderEditableTextLine extends RenderEditableBox { @override double computeMaxIntrinsicWidth(double height) { _resolvePadding(); - double horizontalPadding = _resolvedPadding!.left + _resolvedPadding!.right; - double verticalPadding = _resolvedPadding!.top + _resolvedPadding!.bottom; - int leadingWidth = _leading == null + final horizontalPadding = _resolvedPadding!.left + _resolvedPadding!.right; + final verticalPadding = _resolvedPadding!.top + _resolvedPadding!.bottom; + final leadingWidth = _leading == null ? 0 : _leading!.getMaxIntrinsicWidth(height - verticalPadding) as int; - int bodyWidth = _body == null + final bodyWidth = _body == null ? 0 : _body!.getMaxIntrinsicWidth(math.max(0.0, height - verticalPadding)) as int; @@ -643,8 +642,8 @@ class RenderEditableTextLine extends RenderEditableBox { @override double computeMinIntrinsicHeight(double width) { _resolvePadding(); - double horizontalPadding = _resolvedPadding!.left + _resolvedPadding!.right; - double verticalPadding = _resolvedPadding!.top + _resolvedPadding!.bottom; + final horizontalPadding = _resolvedPadding!.left + _resolvedPadding!.right; + final verticalPadding = _resolvedPadding!.top + _resolvedPadding!.bottom; if (_body != null) { return _body! .getMinIntrinsicHeight(math.max(0.0, width - horizontalPadding)) + @@ -656,8 +655,8 @@ class RenderEditableTextLine extends RenderEditableBox { @override double computeMaxIntrinsicHeight(double width) { _resolvePadding(); - double horizontalPadding = _resolvedPadding!.left + _resolvedPadding!.right; - double verticalPadding = _resolvedPadding!.top + _resolvedPadding!.bottom; + final horizontalPadding = _resolvedPadding!.left + _resolvedPadding!.right; + final verticalPadding = _resolvedPadding!.top + _resolvedPadding!.bottom; if (_body != null) { return _body! .getMaxIntrinsicHeight(math.max(0.0, width - horizontalPadding)) + @@ -849,8 +848,8 @@ class _TextLineElement extends RenderObjectElement { } void _mountChild(Widget? widget, TextLineSlot slot) { - Element? oldChild = _slotToChildren[slot]; - Element? newChild = updateChild(oldChild, widget, slot); + final oldChild = _slotToChildren[slot]; + final newChild = updateChild(oldChild, widget, slot); if (oldChild != null) { _slotToChildren.remove(slot); } @@ -873,8 +872,8 @@ class _TextLineElement extends RenderObjectElement { } void _updateChild(Widget? widget, TextLineSlot slot) { - Element? oldChild = _slotToChildren[slot]; - Element? newChild = updateChild(oldChild, widget, slot); + final oldChild = _slotToChildren[slot]; + final newChild = updateChild(oldChild, widget, slot); if (oldChild != null) { _slotToChildren.remove(slot); } diff --git a/lib/widgets/text_selection.dart b/lib/widgets/text_selection.dart index 7873c99d..cf963d9a 100644 --- a/lib/widgets/text_selection.dart +++ b/lib/widgets/text_selection.dart @@ -12,10 +12,10 @@ import '../models/documents/nodes/node.dart'; import 'editor.dart'; TextSelection localSelection(Node node, TextSelection selection, fromParent) { - int base = fromParent ? node.getOffset() : node.getDocumentOffset(); + final base = fromParent ? node.getOffset() : node.getDocumentOffset(); assert(base <= selection.end && selection.start <= base + node.length - 1); - int offset = fromParent ? node.getOffset() : node.getDocumentOffset(); + final offset = fromParent ? node.getOffset() : node.getDocumentOffset(); return selection.copyWith( baseOffset: math.max(selection.start - offset, 0), extentOffset: math.min(selection.end - offset, node.length - 1)); @@ -55,7 +55,7 @@ class EditorTextSelectionOverlay { this.dragStartBehavior, this.onSelectionHandleTapped, this.clipboardStatus) { - OverlayState overlay = Overlay.of(context, rootOverlay: true)!; + final overlay = Overlay.of(context, rootOverlay: true)!; _toolbarController = AnimationController( duration: const Duration(milliseconds: 150), vsync: overlay); @@ -161,26 +161,25 @@ class EditorTextSelectionOverlay { } Widget _buildToolbar(BuildContext context) { - List endpoints = - renderObject!.getEndpointsForSelection(_selection); + final endpoints = renderObject!.getEndpointsForSelection(_selection); - Rect editingRegion = Rect.fromPoints( + final editingRegion = Rect.fromPoints( renderObject!.localToGlobal(Offset.zero), renderObject!.localToGlobal(renderObject!.size.bottomRight(Offset.zero)), ); - double baseLineHeight = renderObject!.preferredLineHeight(_selection.base); - double extentLineHeight = + final baseLineHeight = renderObject!.preferredLineHeight(_selection.base); + final extentLineHeight = renderObject!.preferredLineHeight(_selection.extent); - double smallestLineHeight = math.min(baseLineHeight, extentLineHeight); - bool isMultiline = endpoints.last.point.dy - endpoints.first.point.dy > + final smallestLineHeight = math.min(baseLineHeight, extentLineHeight); + final isMultiline = endpoints.last.point.dy - endpoints.first.point.dy > smallestLineHeight / 2; - double midX = isMultiline + final midX = isMultiline ? editingRegion.width / 2 : (endpoints.first.point.dx + endpoints.last.point.dx) / 2; - Offset midpoint = Offset( + final midpoint = Offset( midX, endpoints[0].point.dy - baseLineHeight, ); @@ -326,14 +325,14 @@ class _TextSelectionHandleOverlayState void _handleDragStart(DragStartDetails details) {} void _handleDragUpdate(DragUpdateDetails details) { - TextPosition position = + final position = widget.renderObject!.getPositionForOffset(details.globalPosition); if (widget.selection.isCollapsed) { widget.onSelectionHandleChanged(TextSelection.fromPosition(position)); return; } - bool isNormalized = + final isNormalized = widget.selection.extentOffset >= widget.selection.baseOffset; TextSelection? newSelection; switch (widget.position) { @@ -389,27 +388,26 @@ class _TextSelectionHandleOverlayState break; } - TextPosition textPosition = - widget.position == _TextSelectionHandlePosition.START - ? widget.selection.base - : widget.selection.extent; - double lineHeight = widget.renderObject!.preferredLineHeight(textPosition); - Offset handleAnchor = + final textPosition = widget.position == _TextSelectionHandlePosition.START + ? widget.selection.base + : widget.selection.extent; + final lineHeight = widget.renderObject!.preferredLineHeight(textPosition); + final handleAnchor = widget.selectionControls.getHandleAnchor(type!, lineHeight); - Size handleSize = widget.selectionControls.getHandleSize(lineHeight); + final handleSize = widget.selectionControls.getHandleSize(lineHeight); - Rect handleRect = Rect.fromLTWH( + final handleRect = Rect.fromLTWH( -handleAnchor.dx, -handleAnchor.dy, handleSize.width, handleSize.height, ); - Rect interactiveRect = handleRect.expandToInclude( + final interactiveRect = handleRect.expandToInclude( Rect.fromCircle( center: handleRect.center, radius: kMinInteractiveDimension / 2), ); - RelativeRect padding = RelativeRect.fromLTRB( + final padding = RelativeRect.fromLTRB( math.max((interactiveRect.width - handleRect.width) / 2, 0), math.max((interactiveRect.height - handleRect.height) / 2, 0), math.max((interactiveRect.width - handleRect.width) / 2, 0), @@ -656,8 +654,7 @@ class _EditorTextSelectionGestureDetectorState @override Widget build(BuildContext context) { - final Map gestures = - {}; + final gestures = {}; gestures[TapGestureRecognizer] = GestureRecognizerFactoryWithHandlers( diff --git a/lib/widgets/toolbar.dart b/lib/widgets/toolbar.dart index 07bdd421..0941760f 100644 --- a/lib/widgets/toolbar.dart +++ b/lib/widgets/toolbar.dart @@ -215,7 +215,7 @@ class _ToggleStyleButtonState extends State { bool _getIsToggled(Map attrs) { if (widget.attribute.key == Attribute.list.key) { - Attribute? attribute = attrs[widget.attribute.key]; + final attribute = attrs[widget.attribute.key]; if (attribute == null) { return false; } @@ -299,7 +299,7 @@ class _ToggleCheckListButtonState extends State { bool _getIsToggled(Map attrs) { if (widget.attribute.key == Attribute.list.key) { - Attribute? attribute = attrs[widget.attribute.key]; + final attribute = attrs[widget.attribute.key]; if (attribute == null) { return false; } @@ -430,20 +430,20 @@ class _SelectHeaderStyleButtonState extends State { Widget _selectHeadingStyleButtonBuilder(BuildContext context, Attribute? value, ValueChanged onSelected) { - final Map _valueToText = { + final _valueToText = { Attribute.header: 'N', Attribute.h1: 'H1', Attribute.h2: 'H2', Attribute.h3: 'H3', }; - List _valueAttribute = [ + final _valueAttribute = [ Attribute.header, Attribute.h1, Attribute.h2, Attribute.h3 ]; - List _valueString = ['N', 'H1', 'H2', 'H3']; + final _valueString = ['N', 'H1', 'H2', 'H3']; final theme = Theme.of(context); final style = TextStyle( @@ -520,10 +520,10 @@ class _ImageButtonState extends State { final FileType _pickingType = FileType.any; Future _pickImage(ImageSource source) async { - final PickedFile? pickedFile = await _picker.getImage(source: source); + final pickedFile = await _picker.getImage(source: source); if (pickedFile == null) return null; - final File file = File(pickedFile.path); + final file = File(pickedFile.path); return widget.onImagePickCallback!(file); } @@ -536,11 +536,11 @@ class _ImageButtonState extends State { : null, )) ?.files; - var _fileName = + final _fileName = _paths != null ? _paths!.map((e) => e.name).toString() : '...'; if (_paths != null) { - File file = File(_fileName); + final file = File(_fileName); // We simply return the absolute path to selected file. return widget.onImagePickCallback!(file); } else { @@ -550,7 +550,7 @@ class _ImageButtonState extends State { } Future _pickImageDesktop() async { - var filePath = await FilesystemPicker.open( + final filePath = await FilesystemPicker.open( context: context, rootDirectory: await getApplicationDocumentsDirectory(), fsType: FilesystemType.file, @@ -558,7 +558,7 @@ class _ImageButtonState extends State { ); if (filePath != null && filePath.isEmpty) return ''; - final File file = File(filePath!); + final file = File(filePath!); return widget.onImagePickCallback!(file); } @@ -683,19 +683,19 @@ class _ColorButtonState extends State { @override Widget build(BuildContext context) { final theme = Theme.of(context); - Color? iconColor = _isToggledColor && !widget.background && !_isWhite + final iconColor = _isToggledColor && !widget.background && !_isWhite ? stringToColor(_selectionStyle.attributes['color']!.value) : theme.iconTheme.color; - var iconColorBackground = + final iconColorBackground = _isToggledBackground && widget.background && !_isWhitebackground ? stringToColor(_selectionStyle.attributes['background']!.value) : theme.iconTheme.color; - Color fillColor = _isToggledColor && !widget.background && _isWhite + final fillColor = _isToggledColor && !widget.background && _isWhite ? stringToColor('#ffffff') : theme.canvasColor; - Color fillColorBackground = + final fillColorBackground = _isToggledBackground && widget.background && _isWhitebackground ? stringToColor('#ffffff') : theme.canvasColor; @@ -713,7 +713,7 @@ class _ColorButtonState extends State { } void _changeColor(Color color) { - String hex = color.value.toRadixString(16); + var hex = color.value.toRadixString(16); if (hex.startsWith('ff')) { hex = hex.substring(2); } @@ -894,7 +894,7 @@ class _ClearFormatButtonState extends State { icon: Icon(widget.icon, size: iconSize, color: iconColor), fillColor: fillColor, onPressed: () { - for (Attribute k + for (final k in widget.controller.getSelectionStyle().attributes.values) { widget.controller.formatSelection(Attribute.clone(k, null)); }