-
Notifications
You must be signed in to change notification settings - Fork 76
Issue192 paired symbols, issue199 yaml support #231
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
f927042
4293fc0
d8521ae
0e561b4
b82fe42
24cc670
ef71caf
27e6156
4756920
da174e2
523b72c
962aae2
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
import 'package:flutter/services.dart'; | ||
|
||
import '../code_field/editor_params.dart'; | ||
import 'code_modifier.dart'; | ||
|
||
class InsertionCodeModifier extends CodeModifier { | ||
final String openChar; | ||
final String closeString; | ||
|
||
const InsertionCodeModifier({ | ||
required this.openChar, | ||
required this.closeString, | ||
}) : super(openChar); | ||
|
||
static const backticks = | ||
InsertionCodeModifier(openChar: '`', closeString: '`'); | ||
|
||
static const braces = InsertionCodeModifier(openChar: '{', closeString: '}'); | ||
|
||
static const brackets = | ||
InsertionCodeModifier(openChar: '[', closeString: ']'); | ||
|
||
static const doubleQuotes = | ||
InsertionCodeModifier(openChar: '"', closeString: '"'); | ||
|
||
static const parentheses = | ||
InsertionCodeModifier(openChar: '(', closeString: ')'); | ||
|
||
static const singleQuotes = | ||
InsertionCodeModifier(openChar: '\'', closeString: '\''); | ||
|
||
@override | ||
TextEditingValue? updateString( | ||
String text, | ||
TextSelection sel, | ||
EditorParams params, | ||
) { | ||
final replaced = replace(text, sel.start, sel.end, '$openChar$closeString'); | ||
|
||
return replaced.copyWith( | ||
selection: TextSelection( | ||
baseOffset: replaced.selection.baseOffset - closeString.length, | ||
extentOffset: replaced.selection.extentOffset - closeString.length, | ||
), | ||
); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -7,7 +7,7 @@ class PopupController extends ChangeNotifier { | |
bool shouldShow = false; | ||
bool enabled = true; | ||
|
||
final ItemScrollController itemScrollController = ItemScrollController(); | ||
ItemScrollController itemScrollController = ItemScrollController(); | ||
final ItemPositionsListener itemPositionsListener = | ||
ItemPositionsListener.create(); | ||
|
||
|
@@ -23,6 +23,10 @@ class PopupController extends ChangeNotifier { | |
|
||
int get selectedIndex => _selectedIndex; | ||
|
||
void reset() { | ||
itemScrollController = ItemScrollController(); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What is the desired effect of this? Scroll to the top? If so, can you manually scroll to the top? Replacing the controller has the drawbacks:
|
||
} | ||
|
||
void show(List<String> suggestions) { | ||
if (enabled == false) { | ||
return; | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,149 @@ | ||
import 'package:flutter/material.dart'; | ||
import 'package:flutter_code_editor/flutter_code_editor.dart'; | ||
import 'package:flutter_test/flutter_test.dart'; | ||
|
||
void main() { | ||
test('Insertion modifier test', () { | ||
const examples = [ | ||
// | ||
_Example( | ||
'Add backticks', | ||
initialValue: TextEditingValue( | ||
text: 'dict', | ||
// \ cursor | ||
selection: TextSelection.collapsed(offset: 0), | ||
), | ||
expected: TextEditingValue( | ||
text: '``dict', | ||
// \ cursor | ||
selection: TextSelection.collapsed(offset: 1), | ||
), | ||
inputChar: '`', | ||
), | ||
|
||
_Example( | ||
'Add char at the start of the string (braces)', | ||
initialValue: TextEditingValue( | ||
text: 'dict', | ||
// \ cursor | ||
selection: TextSelection.collapsed(offset: 0), | ||
), | ||
expected: TextEditingValue( | ||
text: '{}dict', | ||
// \ cursor | ||
selection: TextSelection.collapsed(offset: 1), | ||
), | ||
inputChar: '{', | ||
), | ||
|
||
_Example( | ||
'Add char in the middle of the string (parentheses)', | ||
initialValue: TextEditingValue( | ||
text: 'print', | ||
// \ cursor | ||
selection: TextSelection.collapsed(offset: 3), | ||
), | ||
expected: TextEditingValue( | ||
text: 'pri()nt', | ||
// \ cursor | ||
selection: TextSelection.collapsed(offset: 4), | ||
), | ||
inputChar: '(', | ||
), | ||
|
||
_Example( | ||
'Add char at the end of the string (brackets)', | ||
initialValue: TextEditingValue( | ||
text: 'print', | ||
// \ cursor | ||
selection: TextSelection.collapsed(offset: 5), | ||
), | ||
expected: TextEditingValue( | ||
text: 'print[]', | ||
// \ cursor | ||
selection: TextSelection.collapsed(offset: 6), | ||
), | ||
inputChar: '[', | ||
), | ||
|
||
_Example( | ||
'Add close char before same close char (double quotes)', | ||
initialValue: TextEditingValue( | ||
text: 'string"', | ||
// \ cursor | ||
selection: TextSelection.collapsed(offset: 6), | ||
), | ||
expected: TextEditingValue( | ||
text: 'string"""', | ||
// \ cursor | ||
selection: TextSelection.collapsed(offset: 7), | ||
), | ||
inputChar: '"', | ||
), | ||
|
||
_Example( | ||
'Empty initial string (single quotes)', | ||
initialValue: TextEditingValue( | ||
// ignore: avoid_redundant_argument_values | ||
text: '', | ||
// \ cursor | ||
selection: TextSelection.collapsed(offset: 0), | ||
), | ||
expected: TextEditingValue( | ||
text: '\'\'', | ||
// \ cursor | ||
selection: TextSelection.collapsed(offset: 1), | ||
), | ||
inputChar: '\'', | ||
), | ||
]; | ||
|
||
for (final example in examples) { | ||
final controller = CodeController(); | ||
controller.value = example.initialValue; | ||
controller.value = _addCharToSelectedPosition( | ||
controller.value, | ||
example.inputChar, | ||
); | ||
|
||
expect( | ||
controller.value, | ||
example.expected, | ||
reason: example.name, | ||
); | ||
} | ||
}); | ||
} | ||
|
||
TextEditingValue _addCharToSelectedPosition( | ||
TextEditingValue value, | ||
String char, | ||
) { | ||
final selection = value.selection; | ||
final text = value.text; | ||
|
||
final newText = text.substring(0, selection.start) + | ||
char + | ||
text.substring(selection.start); | ||
|
||
return TextEditingValue( | ||
text: newText, | ||
selection: TextSelection.collapsed( | ||
offset: selection.start + char.length, | ||
), | ||
); | ||
} | ||
|
||
class _Example { | ||
final String name; | ||
final TextEditingValue initialValue; | ||
final TextEditingValue expected; | ||
final String inputChar; | ||
|
||
const _Example( | ||
this.name, { | ||
required this.initialValue, | ||
required this.expected, | ||
required this.inputChar, | ||
}); | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
import 'package:flutter/services.dart'; | ||
import 'package:flutter_code_editor/src/code_field/editor_params.dart'; | ||
import 'package:flutter_code_editor/src/code_modifiers/insertion.dart'; | ||
import 'package:flutter_test/flutter_test.dart'; | ||
|
||
void main() { | ||
test('inserts at the start of string correctly', () { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
const modifier = InsertionCodeModifier(openChar: '1', closeString: '23'); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Make global? |
||
const text = 'Hello World'; | ||
final selection = TextSelection.fromPosition(const TextPosition(offset: 0)); | ||
const editorParams = EditorParams(); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Make global? |
||
|
||
final result = modifier.updateString(text, selection, editorParams); | ||
|
||
expect(result!.text, '123Hello World'); | ||
expect(result.selection.baseOffset, 1); | ||
expect(result.selection.extentOffset, 1); | ||
}); | ||
|
||
test('inserts in the middle of string correctly', () { | ||
const modifier = InsertionCodeModifier(openChar: '1', closeString: '23'); | ||
const text = 'Hello World'; | ||
final selection = TextSelection.fromPosition(const TextPosition(offset: 5)); | ||
const editorParams = EditorParams(); | ||
|
||
final result = modifier.updateString(text, selection, editorParams); | ||
|
||
expect(result!.text, 'Hello123 World'); | ||
expect(result.selection.baseOffset, 6); | ||
expect(result.selection.extentOffset, 6); | ||
}); | ||
|
||
test('inserts at the end of string correctly', () { | ||
const modifier = InsertionCodeModifier(openChar: '1', closeString: '23'); | ||
const text = 'Hello World'; | ||
final selection = | ||
TextSelection.fromPosition(const TextPosition(offset: text.length)); | ||
const editorParams = EditorParams(); | ||
|
||
final result = modifier.updateString(text, selection, editorParams); | ||
|
||
expect(result!.text, 'Hello World123'); | ||
expect(result.selection.baseOffset, text.length + 1); | ||
expect(result.selection.extentOffset, text.length + 1); | ||
}); | ||
|
||
test('inserts in the middle of string with selection correctly', () { | ||
const modifier = InsertionCodeModifier(openChar: '1', closeString: '23'); | ||
const text = 'Hello World'; | ||
const selection = TextSelection( | ||
baseOffset: 5, | ||
extentOffset: 7, | ||
); | ||
const editorParams = EditorParams(); | ||
|
||
final result = modifier.updateString(text, selection, editorParams); | ||
|
||
expect(result!.text, 'Hello123orld'); | ||
expect(result.selection.baseOffset, 6); | ||
expect(result.selection.extentOffset, 6); | ||
}); | ||
|
||
test('inserts at empty string correctly', () { | ||
const modifier = InsertionCodeModifier(openChar: '1', closeString: '23'); | ||
const text = ''; | ||
final selection = TextSelection.fromPosition(const TextPosition(offset: 0)); | ||
const editorParams = EditorParams(); | ||
|
||
final result = modifier.updateString(text, selection, editorParams); | ||
|
||
expect(result!.text, '123'); | ||
expect(result.selection.baseOffset, 1); | ||
expect(result.selection.extentOffset, 1); | ||
}); | ||
} |
Uh oh!
There was an error while loading. Please reload this page.