1+ import 'dart:async' ;
12import 'dart:io' ;
23
3- import 'package:corecoder_develop/util/custom_code_box.dart' ;
4+ import 'package:corecoder_develop/util/custom_code_box.dart' show InnerField, InnerFieldState ;
45import 'package:corecoder_develop/editor_drawer.dart' ;
56import 'package:corecoder_develop/util/theme_manager.dart' ;
67import 'package:tabbed_view/tabbed_view.dart' ;
@@ -10,7 +11,7 @@ import 'package:path/path.dart' as path;
1011import 'package:url_launcher/url_launcher.dart' ;
1112import 'util/cc_project_structure.dart' ;
1213import 'filebrowser/models/document.dart' ;
13-
14+ import 'package:async/async.dart' show RestartableTimer;
1415class EditorPage extends StatefulWidget {
1516 static const String routeName = "/EditorPage" ;
1617
@@ -28,6 +29,7 @@ class _EditorPageState extends State<EditorPage> {
2829 @override
2930 void initState () {
3031 super .initState ();
32+ autoSaveTimer = RestartableTimer (const Duration (seconds: 1 ), onAutoSave);
3133 }
3234
3335 @override
@@ -144,8 +146,34 @@ class _EditorPageState extends State<EditorPage> {
144146 // List<Node> fileBrowserNodes = <Node>[];
145147 List <Tab > editorTabs = < Tab > [];
146148 List <Tab > tempTabs = < Tab > [];
149+ List <InnerField > codeFields = < InnerField > [];
150+ late RestartableTimer autoSaveTimer;
151+
152+ void onAutoSave () async {
153+ debugPrint ("autosave" );
154+ for (var tab in tabs) {
155+ var field = (((tab.content as SingleChildScrollView ).child as Container )
156+ .child as InnerField );
157+
158+ //TODO: better saving function
159+ await File (field.filePath).writeAsString (field.codeController.rawText);
160+ }
161+ }
162+
163+ TabData createFileTab (
164+ String title, String source, String language, String filePath) {
165+ GlobalKey <InnerFieldState > _innerFieldState = GlobalKey <InnerFieldState >();
166+ var field = InnerField (key: _innerFieldState,
167+ language: language,
168+ theme: ThemeManager .getHighlighting (),
169+ source: source,
170+ filePath: filePath,
171+ onChange : (String filePath, String source){
172+ autoSaveTimer.reset ();
173+ }
174+ );
147175
148- TabData createFileTab ( String title, String source, String language) {
176+ codeFields. add (field);
149177 return TabData (
150178 text: title,
151179 closable: true ,
@@ -155,10 +183,7 @@ class _EditorPageState extends State<EditorPage> {
155183 child: Container (
156184 constraints: BoxConstraints (
157185 minHeight: MediaQuery .of (context).size.height * 2 ),
158- child: InnerField (
159- language: language,
160- theme: ThemeManager .getHighlighting (),
161- source: source),
186+ child: field,
162187 )));
163188 }
164189
@@ -169,13 +194,13 @@ class _EditorPageState extends State<EditorPage> {
169194 content = content.replaceAll ("\t " , " " );
170195 setState (() {
171196 var language = 'javascript' ;
172- if (filename.endsWith (".json" )){
197+ if (filename.endsWith (".json" )) {
173198 language = 'json' ;
174199 }
175- if (filename.endsWith (".lua" )){
200+ if (filename.endsWith (".lua" )) {
176201 language = 'lua' ;
177202 }
178- tabs.add (createFileTab (filename, content, language));
203+ tabs.add (createFileTab (filename, content, language, filepath ));
179204 });
180205 }
181206
@@ -192,14 +217,15 @@ class _EditorPageState extends State<EditorPage> {
192217 child: tabs.isNotEmpty
193218 ? TabbedViewTheme (
194219 data: getTabTheme (),
195- child: TabbedView (onTabClose: (tabIndex, tabData) {
196- setState (() {
197- /// Just refresh the state
198- });
199- },
220+ child: TabbedView (
221+ onTabClose: (tabIndex, tabData) {
222+ setState (() {
223+ /// Just refresh the state
224+ });
225+ },
200226 controller: TabbedViewController (tabs),
201227 ))
202- : const Center (child: Text ("No file opened" ))),
228+ : const Center (child: Text ("No file opened" ))),
203229 ]);
204230
205231 return Scaffold (
@@ -222,7 +248,8 @@ class _EditorPageState extends State<EditorPage> {
222248 tooltip: "Close Project" ,
223249 ),
224250 IconButton (
225- onPressed: () => {}, icon: const Icon (FontAwesomeIcons .ellipsisV)),
251+ onPressed: () => {},
252+ icon: const Icon (FontAwesomeIcons .ellipsisV)),
226253 const SizedBox (width: 16.0 ),
227254 ],
228255 ),
0 commit comments