Skip to content

Commit 648a64c

Browse files
committed
File autosaving done
Files will be autosaved after 1 second of idle time
1 parent ee09043 commit 648a64c

File tree

3 files changed

+83
-44
lines changed

3 files changed

+83
-44
lines changed

lib/editor.dart

Lines changed: 44 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1+
import 'dart:async';
12
import '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;
45
import 'package:corecoder_develop/editor_drawer.dart';
56
import 'package:corecoder_develop/util/theme_manager.dart';
67
import 'package:tabbed_view/tabbed_view.dart';
@@ -10,7 +11,7 @@ import 'package:path/path.dart' as path;
1011
import 'package:url_launcher/url_launcher.dart';
1112
import 'util/cc_project_structure.dart';
1213
import 'filebrowser/models/document.dart';
13-
14+
import 'package:async/async.dart' show RestartableTimer;
1415
class 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
),

lib/util/cc_project_structure.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class CCSolution {
3131

3232
void run() async {
3333

34-
if (Platform.isWindows) {
34+
if (Platform.isWindows && currentRunConfig < runConfig.length) {
3535
debugPrint(
3636
"[CC Debug] starting project on windows config `${runConfig[currentRunConfig].executable}` on $slnFolderPath");
3737
if (runConfig[currentRunConfig].type == "process") {

lib/util/custom_code_box.dart

Lines changed: 38 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ class _CustomCodeBoxState extends State<CustomCodeBox> {
103103
language: language!,
104104
theme: theme,
105105
source: source!,
106+
filePath: "",
106107
);
107108
// return Column(children: [
108109
// dropdowns,
@@ -113,30 +114,28 @@ class _CustomCodeBoxState extends State<CustomCodeBox> {
113114
}
114115

115116
class InnerField extends StatefulWidget {
116-
final String language;
117-
final Map<String, TextStyle> theme;
118-
final String source;
119-
120-
const InnerField({Key? key, required this.language, required this.theme, required this.source})
121-
: super(key: key);
122-
123-
@override
124-
_InnerFieldState createState() => _InnerFieldState();
125-
}
117+
late CodeController codeController;
126118

127-
class _InnerFieldState extends State<InnerField> {
128-
CodeController? _codeController;
129119

130-
void setSource(String source){
131-
_codeController!.text = source;
132-
}
120+
static of(BuildContext context, {bool root = false}) => root
121+
? context.findRootAncestorStateOfType<InnerFieldState>()
122+
: context.findAncestorStateOfType<InnerFieldState>();
133123

134-
@override
135-
void initState() {
136-
super.initState();
137-
_codeController = CodeController(
138-
onChange: (String source) {},
139-
text: widget.source,
124+
final String language;
125+
final Map<String, TextStyle> theme;
126+
final String source;
127+
Function(String filePath, String source)? onChange;
128+
final String filePath;
129+
130+
InnerField({Key? key, required this.language, required this.theme, required this.source, required this.filePath, this.onChange})
131+
: super(key: key){
132+
codeController = CodeController(
133+
onChange: (String source) {
134+
if(onChange != null){
135+
onChange!.call(filePath, codeController.rawText);
136+
}
137+
},
138+
text: source,
140139
params: EditorParams(tabSpaces: 4),
141140
patternMap: {
142141
r"\B#[a-zA-Z0-9]+\b": TextStyle(color: Colors.red),
@@ -145,26 +144,39 @@ class _InnerFieldState extends State<InnerField> {
145144
color: Colors.blue,
146145
),
147146
r"\B![a-zA-Z0-9]+\b":
148-
TextStyle(color: Colors.yellow, fontStyle: FontStyle.italic),
147+
TextStyle(color: Colors.yellow, fontStyle: FontStyle.italic),
149148
},
150149
stringMap: {
151150
"bev": TextStyle(color: Colors.indigo),
152151
},
153-
language: allLanguages[widget.language],
154-
theme: widget.theme,
152+
language: allLanguages[language],
153+
theme: theme,
155154
);
156155
}
157156

157+
@override
158+
InnerFieldState createState() => InnerFieldState();
159+
160+
}
161+
162+
class InnerFieldState extends State<InnerField> {
163+
164+
@override
165+
void initState() {
166+
super.initState();
167+
168+
}
169+
158170
@override
159171
void dispose() {
160-
_codeController?.dispose();
172+
// widget._codeController?.dispose();
161173
super.dispose();
162174
}
163175

164176
@override
165177
Widget build(BuildContext context) {
166178
return CodeField(
167-
controller: _codeController!,
179+
controller: widget.codeController,
168180
textStyle: TextStyle(fontFamily: 'SourceCode'),
169181

170182
);

0 commit comments

Comments
 (0)