Skip to content

Commit f31cad0

Browse files
author
Alexandr Zhuravlev
authored
Merge pull request #16373 from [BEAM-13515] [Playground] Hiding lines in an example that are not necessary
* [BEAM-13515] Implemented structure of initial scroll in CodeField * [BEAM-13515] Changed scroll mechanics * [BEAM-13515] Moved values to consts, changed quotes to single * [BEAM-13515] Changed RegExp for Java, moved RegExp strings to consts * [BEAM-13515] Clarified variable declaration
1 parent 2d1157e commit f31cad0

1 file changed

Lines changed: 59 additions & 0 deletions

File tree

playground/frontend/lib/modules/editor/components/editor_textarea.dart

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,15 @@ import 'package:playground/modules/examples/models/example_model.dart';
3131
import 'package:playground/modules/sdk/models/sdk.dart';
3232
import 'package:provider/provider.dart';
3333

34+
const kNumberOfStringsToSkip = 16;
35+
const kJavaRegExp = r'import\s[A-z.0-9]*\;\n\n[(\/\*\*)|(public)|(class)]';
36+
const kPythonRegExp = r'[^\S\r\n](import|as)[^\S\r\n][A-z]*\n\n';
37+
const kGoRegExp = r'[^\S\r\n]+\'
38+
r'"'
39+
r'.*'
40+
r'"'
41+
r'\n\)\n\n';
42+
3443
class EditorTextArea extends StatefulWidget {
3544
final SDK sdk;
3645
final ExampleModel? example;
@@ -51,6 +60,7 @@ class EditorTextArea extends StatefulWidget {
5160

5261
class _EditorTextAreaState extends State<EditorTextArea> {
5362
CodeController? _codeController;
63+
var focusNode = FocusNode();
5464

5565
@override
5666
void initState() {
@@ -71,13 +81,17 @@ class _EditorTextAreaState extends State<EditorTextArea> {
7181
},
7282
webSpaceFix: false,
7383
);
84+
85+
_setTextScrolling();
86+
7487
super.didChangeDependencies();
7588
}
7689

7790
@override
7891
void dispose() {
7992
super.dispose();
8093
_codeController?.dispose();
94+
focusNode.dispose();
8195
}
8296

8397
@override
@@ -90,6 +104,7 @@ class _EditorTextAreaState extends State<EditorTextArea> {
90104
readOnly: widget.enabled,
91105
label: AppLocalizations.of(context)!.codeTextArea,
92106
child: CodeField(
107+
focusNode: focusNode,
93108
enabled: widget.enabled,
94109
controller: _codeController!,
95110
textStyle: getCodeFontStyle(
@@ -105,6 +120,50 @@ class _EditorTextAreaState extends State<EditorTextArea> {
105120
);
106121
}
107122

123+
_setTextScrolling() {
124+
focusNode.requestFocus();
125+
if (_codeController!.text.isNotEmpty) {
126+
_codeController!.selection = TextSelection.fromPosition(
127+
TextPosition(offset: _findOffset()),
128+
);
129+
}
130+
}
131+
132+
_findOffset() {
133+
return _codeController!.text.indexOf(
134+
_skipStrings(kNumberOfStringsToSkip),
135+
_getPositionAfterImportsAndLicenses(widget.sdk),
136+
);
137+
}
138+
139+
String _skipStrings(int qntOfStrings) {
140+
List<String> strings = _codeController!.text
141+
.substring(_getPositionAfterImportsAndLicenses(widget.sdk))
142+
.split('\n');
143+
String result =
144+
strings.length > qntOfStrings ? strings[qntOfStrings] : strings.last;
145+
if (result == '') {
146+
return _skipStrings(qntOfStrings - 1);
147+
} else {
148+
return result;
149+
}
150+
}
151+
152+
int _getPositionAfterImportsAndLicenses(SDK sdk) {
153+
switch (sdk) {
154+
case SDK.java:
155+
return _codeController!.text.lastIndexOf(RegExp(kJavaRegExp));
156+
case SDK.python:
157+
return _codeController!.text.lastIndexOf(RegExp(kPythonRegExp));
158+
case SDK.go:
159+
return _codeController!.text.lastIndexOf(RegExp(kGoRegExp));
160+
case SDK.scio:
161+
return _codeController!.text.indexOf(
162+
_codeController!.text.split('\n')[0],
163+
);
164+
}
165+
}
166+
108167
_getLanguageFromSdk() {
109168
switch (widget.sdk) {
110169
case SDK.java:

0 commit comments

Comments
 (0)