Skip to content

Commit

Permalink
added wide-selection editing and paste support
Browse files Browse the repository at this point in the history
  • Loading branch information
drooxie committed May 24, 2023
1 parent 7e58eb5 commit 372a448
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 18 deletions.
32 changes: 17 additions & 15 deletions lib/core/controllers/colored_text_editing_controller.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:collection_ext/ranges.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:languagetool_textfield/core/enums/mistake_type.dart';
Expand Down Expand Up @@ -55,8 +56,8 @@ class ColoredTextEditingController extends TextEditingController {

/// Replaces mistake with given replacement
void replaceMistake(Mistake mistake, String replacement) {
text = text.replaceRange(mistake.offset, mistake.endOffset, replacement);
_mistakes.remove(mistake);
text = text.replaceRange(mistake.offset, mistake.endOffset, replacement);
selection = TextSelection.fromPosition(
TextPosition(offset: mistake.offset + replacement.length),
);
Expand All @@ -69,23 +70,26 @@ class ColoredTextEditingController extends TextEditingController {
///so this check avoid cleaning Mistake list when text wasn't really changed
if (newText == text) return;

// do not display mistake that was changed during text input
final selectionRange = IntRange(selection.start, selection.end).toSet();
_mistakes.removeWhere((mistake) {
final mistakeRange = IntRange(
mistake.offset,
mistake.endOffset,
).toSet();

return selectionRange.intersection(mistakeRange).isNotEmpty;
});

// list containing mistakes with updated offset
final List<Mistake> newMistakes = [];
final lengthDifference = newText.length - text.length;
for (final mistake in _mistakes) {
// do not display mistake that was changed during text input
final bool _mistakeTextChanged = selection.start >= mistake.offset &&
selection.start <= mistake.endOffset;
if (_mistakeTextChanged) {
continue;
}

int newOffset = mistake.offset;
// move mistake if it located by the right side of cursor
if (selection.start <= mistake.offset) {
final bool _isTextExtended = newText.length > text.length;
_isTextExtended ? newOffset += 1 : newOffset -= 1;
newOffset += lengthDifference;
}

newMistakes.add(
Mistake(
message: mistake.message,
Expand All @@ -95,13 +99,11 @@ class ColoredTextEditingController extends TextEditingController {
),
);
}
// update current mistakes list with the moved one
_mistakes = newMistakes;

final mistakes = await languageCheckService.findMistakes(newText);
// findMistakes() future returns empty list if debouncing
// so in that case we don't need to update it
if (mistakes.isNotEmpty) {
// null is returned in case of debouncing when API isn't truly queried
if (mistakes != null) {
_mistakes = mistakes;
}

Expand Down
3 changes: 2 additions & 1 deletion lib/domain/language_check_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,6 @@ abstract class LanguageCheckService {
const LanguageCheckService();

/// Returns found mistakes in the given [text].
Future<List<Mistake>> findMistakes(String text);
/// Returns null if API wasn't queried, i.e when using debouncing
Future<List<Mistake>?> findMistakes(String text);
}
4 changes: 2 additions & 2 deletions lib/implementations/debounce_lang_tool_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ class DebounceLangToolService extends LanguageCheckService {
) : debouncing = Debouncing(duration: debouncingDuration);

@override
Future<List<Mistake>> findMistakes(String text) async {
Future<List<Mistake>?> findMistakes(String text) async {
final value = await debouncing.debounce(() {
return baseService.findMistakes(text);
}) as List<Mistake>?;

return value ?? [];
return value;
}
}
1 change: 1 addition & 0 deletions pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ environment:
flutter: ">=1.17.0"

dependencies:
collection_ext: ^1.0.0
flutter:
sdk: flutter
language_tool: ^2.1.1
Expand Down

0 comments on commit 372a448

Please sign in to comment.