Skip to content

Commit da3e7dd

Browse files
Merge pull request #2 from MarvinQuevedo/stable_desktop
Stable desktop
2 parents 0bdf0de + 143b8df commit da3e7dd

20 files changed

+819
-215
lines changed

lib/src/app.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class _MyAppState extends State<MyApp> {
3232
ChangeNotifierProvider.value(
3333
value: Get.find<ProjectsHandlerProvider>(),
3434
),
35-
Provider.value(
35+
ChangeNotifierProvider.value(
3636
value: Get.find<PuzzleUncompressersProvider>(),
3737
),
3838
ChangeNotifierProvider.value(

lib/src/features/editor/data/temp_repository.dart

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,18 @@ class TempRepository {
1515
Timer? _timer;
1616
Directory? _appDocDic;
1717
TempRepository._();
18-
final _temp = <String, String>{};
18+
final _temp = <String, String>{};
1919

2020
void set(String key, String value) {
2121
_temp[key] = value;
22+
_writeData();
23+
}
24+
25+
void _writeData() {
2226
if (_timer != null) {
2327
_timer!.cancel();
2428
}
25-
_timer = Timer(const Duration(seconds: 2), () async {
29+
_timer = Timer(const Duration(milliseconds: 750), () async {
2630
/* _lastSaved = DateTime.now();
2731
_lastSavedData = value; */
2832
final watch = Stopwatch()..start();
@@ -69,5 +73,8 @@ class TempRepository {
6973

7074
String? get(String key) => _temp[key];
7175

72-
void remove(String key) => _temp.remove(key);
76+
void remove(String key) {
77+
_temp.remove(key);
78+
_writeData();
79+
}
7380
}

lib/src/features/editor/presentation/pages/editor_page.dart

Lines changed: 71 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import '../../utils/dir_splitter.dart';
1515
import '../../utils/monokai_sublime_theme_with_font.dart';
1616
import '../../utils/save_file_dialog.dart';
1717
import '../../utils/snackbar.dart';
18-
import '../widgets/editor_drawer.dart';
18+
import '../widgets/mobile_editor_drawer.dart';
1919
import 'result_controls_page.dart';
2020

2121
class EditorPage extends StatefulWidget {
@@ -39,6 +39,7 @@ class EditorPageState extends State<EditorPage> with EditorActionHelper {
3939
late final FocusNode _editorFocusNode;
4040
bool _editorInitialized = false;
4141
late final PlaygroundProvider _playProvider;
42+
ProjectData? _projectData;
4243

4344
@override
4445
Widget build(BuildContext context) {
@@ -87,7 +88,7 @@ class EditorPageState extends State<EditorPage> with EditorActionHelper {
8788
child: Scaffold(
8889
backgroundColor: theme['root']!.backgroundColor,
8990
appBar: appBar2,
90-
drawer: const EditorDrawer(),
91+
drawer: const MobileEditorDrawer(),
9192
body: ListView(
9293
padding: const EdgeInsets.only(top: 0),
9394
children: [
@@ -191,7 +192,7 @@ class EditorPageState extends State<EditorPage> with EditorActionHelper {
191192
}
192193

193194
@override
194-
void openRunPage() async {
195+
void openRunPage({bool isDesktop = false}) async {
195196
final activeProject = _playProvider.activeProject;
196197

197198
if (activeProject == null) {
@@ -201,19 +202,48 @@ class EditorPageState extends State<EditorPage> with EditorActionHelper {
201202
fileName(activeProject.path),
202203
_controller.text,
203204
);
204-
205-
Navigator.push(
206-
context,
207-
MaterialPageRoute(
208-
builder: (context) => ChangeNotifierProvider.value(
209-
value: _playProvider,
210-
child: Builder(
211-
builder: (context) => ResultControlsPage(
212-
code: _controller.text,
213-
theme: theme,
205+
if (isDesktop) {
206+
showGeneralDialog(
207+
barrierColor: const Color(0x80000000),
208+
context: context,
209+
barrierDismissible: true,
210+
barrierLabel: "close",
211+
pageBuilder: (context, a, b) {
212+
return Align(
213+
alignment: Alignment.topRight,
214+
child: Dialog(
215+
elevation: 5,
216+
shadowColor: Colors.white,
217+
backgroundColor: Colors.transparent,
218+
insetPadding: EdgeInsets.zero,
219+
child: SizedBox(
220+
width: 450,
221+
child: ChangeNotifierProvider.value(
222+
value: _playProvider,
223+
child: Builder(
224+
builder: (context) => ResultControlsPage(
225+
code: _controller.text,
226+
theme: theme,
227+
),
228+
)),
214229
),
215-
)),
216-
));
230+
),
231+
);
232+
});
233+
} else {
234+
Navigator.push(
235+
context,
236+
MaterialPageRoute(
237+
builder: (context) => ChangeNotifierProvider.value(
238+
value: _playProvider,
239+
child: Builder(
240+
builder: (context) => ResultControlsPage(
241+
code: _controller.text,
242+
theme: theme,
243+
),
244+
)),
245+
));
246+
}
217247
}
218248
}
219249

@@ -231,6 +261,8 @@ class EditorPageState extends State<EditorPage> with EditorActionHelper {
231261
await _playProvider.saveProject(
232262
fileName(activeProject.path), _controller.text);
233263
// ignore: use_build_context_synchronously
264+
265+
// ignore: use_build_context_synchronously
234266
ScaffoldMessenger.of(context).showSnackBar(const MeSnackbar(
235267
content: Text("File saved", style: TextStyle(color: Colors.white)),
236268
));
@@ -270,6 +302,8 @@ class EditorPageState extends State<EditorPage> with EditorActionHelper {
270302
context,
271303
listen: false,
272304
);
305+
_projectData = proHandler.currentProject;
306+
puzzlesProvider.addListener(_puzzlesUpdated);
273307
projectsProvider.addListener(_updateProjectsNames);
274308
_playProvider
275309
.init(
@@ -282,10 +316,10 @@ class EditorPageState extends State<EditorPage> with EditorActionHelper {
282316
_controller.autocompleter.setCustomWords(_playProvider.includeFilesNames);
283317
_editorFocusNode.addListener(_forceInitializedEditor);
284318
FocusScope.of(context).requestFocus(_editorFocusNode);
319+
_playProvider.savedNotifier.addListener(_onTextChanged);
320+
_controller.addListener(_onTextChanged);
285321
});
286322

287-
_playProvider.savedNotifier.addListener(_onTextChanged);
288-
_controller.addListener(_onTextChanged);
289323
EditorActionsProvider.of(context, listen: false).editorActionHelper = this;
290324
}
291325

@@ -305,21 +339,35 @@ class EditorPageState extends State<EditorPage> with EditorActionHelper {
305339
}
306340

307341
void _onTextChanged() {
342+
if (!mounted) return;
308343
final proHandler = Provider.of<ProjectsHandlerProvider>(
309344
context,
310345
listen: false,
311346
);
312-
final saved = _playProvider.savedNotifier.value;
347+
var saved = _playProvider.savedNotifier.value;
348+
349+
if (_controller.text == _playProvider.activeProjectCode) {
350+
saved = true;
351+
} else {
352+
saved = false;
353+
}
313354

314-
final activeProject = proHandler.currentProject;
315-
if (activeProject != null) {
355+
if (_projectData != null) {
316356
proHandler.onChangeText(
317-
projectData: activeProject, value: _controller.text);
318-
proHandler.updateValue(activeProject.copyWith(
357+
projectData: _projectData!,
358+
value: _controller.text,
319359
saved: saved,
320-
));
360+
);
321361
}
322362
}
363+
364+
void _puzzlesUpdated() {
365+
final puzzlesProvider = Provider.of<PuzzleUncompressersProvider>(
366+
context,
367+
listen: false,
368+
);
369+
_playProvider.updatePuzzlesNames(puzzlesProvider.puzzlesFilesNames);
370+
}
323371
}
324372

325373
class _ActionButton extends StatelessWidget {

lib/src/features/editor/presentation/pages/projects_page.dart

Lines changed: 22 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
import 'dart:io';
22

3-
import 'package:chialisp_playground/src/features/editor/providers/playground_provider.dart';
4-
import 'package:chialisp_playground/src/features/editor/providers/projects_provider.dart';
3+
import '../../providers/projects_provider.dart';
54
import 'package:flutter/material.dart';
65
import 'package:provider/provider.dart';
76

8-
import '../../../home/presentation/pages/home_page.dart';
7+
import '../../providers/projects_handler_provider.dart';
98
import '../../utils/dir_splitter.dart';
109

1110
class ProjectsPage extends StatefulWidget {
@@ -40,42 +39,35 @@ class _ProjectsPageState extends State<ProjectsPage> {
4039
itemCount: provider.projects!.length,
4140
itemBuilder: (context, index) {
4241
return ListTile(
43-
title: Text(fileName(provider.projects![index].path)),
44-
subtitle:
45-
Text(formatFileDate(provider.projects![index])),
46-
onTap: () {
47-
_openProject(provider.projects![index], context);
48-
},
49-
trailing: IconButton(
50-
icon: const Icon(Icons.keyboard_arrow_right),
51-
onPressed: () {
52-
_openProject(provider.projects![index], context);
42+
title: Text(fileName(provider.projects![index].path)),
43+
subtitle: Text(
44+
formatFileDate(
45+
provider.projects![index],
46+
),
47+
style: const TextStyle(
48+
color: Colors.grey, fontSize: 12),
49+
),
50+
onTap: () {
51+
_openProject(context, provider.projects![index]);
5352
},
54-
)
55-
);
53+
trailing: IconButton(
54+
icon: const Icon(Icons.keyboard_arrow_right),
55+
onPressed: () {
56+
_openProject(context, provider.projects![index]);
57+
},
58+
));
5659
},
5760
));
5861
},
5962
);
6063
}
6164

62-
void _openProject(File file, BuildContext context) async{
63-
final provider = Provider.of<PlaygroundProvider>(context, listen: false);
64-
65-
await provider.loadProject(file);
66-
_goToHomePage();
67-
}
68-
69-
void _goToHomePage() {
70-
Navigator.of(context).pushAndRemoveUntil(
71-
MaterialPageRoute(
72-
builder: (context) => const HomePage(),
73-
),
74-
(route) => false);
65+
_openProject(BuildContext context, File file) {
66+
Provider.of<ProjectsHandlerProvider>(context, listen: false)
67+
.openProject(file, false);
68+
Navigator.maybePop(context);
7569
}
7670

77-
78-
7971
String formatFileDate(File file) {
8072
final date = file.lastModifiedSync();
8173
return "${date.year}-${date.month}-${date.day} ${date.hour}:${date.minute}:${date.second}";

lib/src/features/editor/presentation/widgets/editor_drawer.dart renamed to lib/src/features/editor/presentation/widgets/mobile_editor_drawer.dart

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
1+
12
import 'package:flutter/material.dart';
23
import 'package:flutter_svg/svg.dart';
34
import 'package:provider/provider.dart';
4-
5-
import '../../../home/presentation/pages/home_page.dart';
6-
import '../../providers/playground_provider.dart';
5+
6+
import '../../providers/projects_handler_provider.dart';
77
import '../../utils/save_file_dialog.dart';
8+
import '../../utils/show_install_cypher_libs.dart';
89
import '../pages/projects_page.dart';
910

10-
class EditorDrawer extends StatelessWidget {
11-
const EditorDrawer({super.key});
11+
class MobileEditorDrawer extends StatelessWidget {
12+
const MobileEditorDrawer({super.key});
1213

1314
@override
1415
Widget build(BuildContext context) {
@@ -44,7 +45,7 @@ class EditorDrawer extends StatelessWidget {
4445
style: TextStyle(color: Colors.white, fontSize: 20),
4546
),
4647
const Text(
47-
"v0.0.1",
48+
"v0.0.5",
4849
style: TextStyle(color: Colors.white, fontSize: 10),
4950
),
5051
],
@@ -60,13 +61,22 @@ class EditorDrawer extends StatelessWidget {
6061
),
6162
ListTile(
6263
leading: const Icon(Icons.list, color: Colors.white),
63-
title: const Text("Files", style: TextStyle(color: Colors.white)),
64+
title: const Text("Projects", style: TextStyle(color: Colors.white)),
6465
trailing: const Icon(
6566
Icons.keyboard_arrow_right,
6667
color: Colors.white,
6768
),
6869
onTap: () => _openProjectsPage(context),
6970
),
71+
ListTile(
72+
leading: const Icon(Icons.install_mobile, color: Colors.white),
73+
title: const Text("Install Cypher", style: TextStyle(color: Colors.white)),
74+
trailing: const Icon(
75+
Icons.keyboard_arrow_right,
76+
color: Colors.white,
77+
),
78+
onTap: () => showInstallCipherLibs(context),
79+
),
7080
]),
7181
);
7282
}
@@ -79,16 +89,13 @@ class EditorDrawer extends StatelessWidget {
7989
_createNewProject(BuildContext context) {
8090
showSaveFileDialog(context, "", title: "Create new file").then((result) {
8191
if (result != null) {
82-
final playProvider =
83-
Provider.of<PlaygroundProvider>(context, listen: false);
84-
playProvider.loadProjectWithFilename(result).then((value) {
85-
Navigator.of(context).pushAndRemoveUntil(
86-
MaterialPageRoute(
87-
builder: (context) => const HomePage(),
88-
),
89-
(route) => false);
90-
});
92+
Provider.of<ProjectsHandlerProvider>(context, listen: false)
93+
.openProjectWithName(result, false);
94+
Navigator.maybePop(context);
9195
}
9296
});
9397
}
98+
99+
100+
94101
}

lib/src/features/editor/providers/editor_actions_provider.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ abstract class EditorActionHelper {
77
void undoCode( );
88
void redoCode( );
99
void saveFile( {String title = 'Save file'});
10-
void openRunPage( );
10+
void openRunPage({bool isDesktop = false});
1111
}
1212

1313
class EditorActionsProvider extends ChangeNotifier{

0 commit comments

Comments
 (0)