Skip to content

Commit 5e45b7b

Browse files
authored
Get edit result fix (akvelon#222)
* backspace and delete checks added * lint * tests added * lint * adjustments * check moved into _code.getEditResult * changes after review
1 parent 6faced5 commit 5e45b7b

File tree

2 files changed

+81
-0
lines changed

2 files changed

+81
-0
lines changed

lib/src/code/code.dart

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,23 @@ class Code {
375375
),
376376
);
377377

378+
final firstChangedLine = lines.characterIndexToLineIndex(rangeBefore.start);
379+
final lastChangedLine = lines.characterIndexToLineIndex(rangeBefore.end);
380+
381+
// If there is any folded block that is going to be removed
382+
// because of `backspace` or `delete`, return unchanged text.
383+
if (oldSelection.isCollapsed &&
384+
foldedBlocks.any(
385+
(element) =>
386+
element.lastLine >= firstChangedLine &&
387+
element.lastLine <= lastChangedLine,
388+
)) {
389+
return CodeEditResult(
390+
fullTextAfter: text,
391+
linesChanged: const TextRange(start: 0, end: 0),
392+
);
393+
}
394+
378395
final fullTextAfter = rangeBefore.textBefore(text) +
379396
visibleRangeAfter.textInside(visibleAfter.text) +
380397
rangeBefore.textAfter(text);
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import 'package:flutter/services.dart';
2+
import 'package:flutter_test/flutter_test.dart';
3+
4+
import '../common/create_app.dart';
5+
6+
void main() {
7+
testWidgets(
8+
'Backspace or delete at a folded block collapse point '
9+
'=> Do nothing.', (wt) async {
10+
final examples = [
11+
//
12+
const _Example(
13+
'Backspace after newline after folded block',
14+
initialFullText: 'int main(){\n}\n',
15+
// \
16+
initialSelection: TextSelection.collapsed(offset: 12),
17+
foldedBlocks: [0],
18+
finalVisibleText: 'int main(){\n',
19+
key: LogicalKeyboardKey.backspace,
20+
),
21+
22+
const _Example(
23+
'Delete at the collapsed position of a folded block',
24+
initialFullText: 'int main(){\n}\n',
25+
// \
26+
initialSelection: TextSelection.collapsed(offset: 11),
27+
foldedBlocks: [0],
28+
finalVisibleText: 'int main(){\n',
29+
key: LogicalKeyboardKey.delete,
30+
),
31+
];
32+
33+
for (final example in examples) {
34+
final controller = await pumpController(wt, example.initialFullText);
35+
// ignore: prefer_foreach
36+
for (final foldingLineIndex in example.foldedBlocks) {
37+
controller.foldAt(foldingLineIndex);
38+
}
39+
40+
controller.selection = example.initialSelection;
41+
await wt.sendKeyEvent(example.key);
42+
43+
expect(controller.value.text, example.finalVisibleText);
44+
}
45+
});
46+
}
47+
48+
class _Example {
49+
final String name;
50+
final String initialFullText;
51+
final TextSelection initialSelection;
52+
final List<int> foldedBlocks;
53+
final String finalVisibleText;
54+
final LogicalKeyboardKey key;
55+
56+
const _Example(
57+
this.name, {
58+
required this.initialFullText,
59+
required this.foldedBlocks,
60+
required this.finalVisibleText,
61+
required this.key,
62+
required this.initialSelection,
63+
});
64+
}

0 commit comments

Comments
 (0)