@@ -2,8 +2,8 @@ import 'package:corecoder_develop/main.dart';
22import 'package:corecoder_develop/plugins_browser.dart' ;
33import 'package:corecoder_develop/util/modules_manager.dart' ;
44import 'package:corecoder_develop/util/theme_manager.dart' ;
5- import 'package:flutter/cupertino.dart' ;
65import 'package:flutter/material.dart' ;
6+ import 'package:shared_preferences/shared_preferences.dart' ;
77
88import 'util/plugins_manager.dart' ;
99
@@ -16,60 +16,103 @@ class Settings {
1616}
1717
1818enum SettingsPageItemType {
19- TypeString ,
20- TypeStringList ,
21- TypeBoolean ,
22- TypeInteger ,
23- TypeFloat
19+ typeString ,
20+ typeStringList ,
21+ typeBoolean ,
22+ typeInteger ,
23+ typeFloat
2424}
2525
2626class SettingsPageItem {
27- Function (dynamic val) onSet;
27+ Function (SettingsPageItem item, dynamic val) onSet;
28+ Function (SettingsPageItem item) onInitialized;
2829 String name;
2930 String description;
3031 SettingsPageItemType type;
3132 dynamic provided; // the string list for list type
3233 dynamic defaultVal;
3334 dynamic currentVal;
3435
35- SettingsPageItem (this .name, this .description, this .onSet, this .type,
36- this .provided, this .defaultVal);
36+ SettingsPageItem (
37+ {required this .name,
38+ required this .description,
39+ required this .onSet,
40+ required this .onInitialized,
41+ required this .type,
42+ this .provided,
43+ this .defaultVal});
3744}
3845
3946class SettingsPage extends StatefulWidget {
4047 final ModulesManager modulesManager;
41- const SettingsPage (this .modulesManager,{Key ? key}) : super (key: key);
48+
49+ const SettingsPage (this .modulesManager, {Key ? key}) : super (key: key);
50+
4251 @override
4352 State <StatefulWidget > createState () => SettingsPageState ();
4453}
54+
4555class SettingsPageState extends State <SettingsPage > {
56+ static final Future <SharedPreferences > _pref =
57+ SharedPreferences .getInstance ();
4658 static var routeName = "/SettingsPage" ;
4759 var tabs = < Widget > [
48- const Tab (text: "General" ,),
60+ const Tab (
61+ text: "General" ,
62+ ),
4963 const Tab (text: "Plugins" ),
5064 const Tab (text: "About" ),
5165 ];
66+
5267 Widget getSettingsTabContent (BuildContext context) {
5368 return Column (
5469 children: List .generate (items.length, (index) {
70+
5571 return generateListItem (index, context);
5672 }));
5773 }
5874
5975 List <SettingsPageItem > items = [
6076 SettingsPageItem (
61- "Theme" ,
62- "The theme for entire app" ,
63- (dynamic val) => {ThemeManager .setTheme (val)},
64- SettingsPageItemType .TypeStringList ,
65- < String > ["core-coder-dark" , "core-coder-light" ],
66- ThemeManager .currentTheme.value)
77+ name: "Theme" ,
78+ description: "The theme for entire app" ,
79+ onSet: (SettingsPageItem item, dynamic val) async {
80+ ThemeManager .setTheme (val);
81+
82+ // Set the value to be stored
83+ (await _pref).setString ("theme" , val);
84+ },
85+ onInitialized: (SettingsPageItem item)async {
86+ // Get the item value from prefs
87+ var val = (await _pref).getString ("theme" );
88+ item.currentVal ?? = val;
89+ },
90+ type: SettingsPageItemType .typeStringList,
91+ provided: < String > ["core-coder-dark" , "core-coder-light" ],
92+ defaultVal: ThemeManager .currentTheme.value),
93+ SettingsPageItem (
94+ name: "Open last project on startup" ,
95+ description: "Open last project when the app started" ,
96+ onSet: (SettingsPageItem item, dynamic val) async {
97+ item.currentVal = val;
98+ // Set the value to be stored
99+ (await _pref).setBool ("openLastProjectOnStartup" , val);
100+ },
101+ onInitialized: (SettingsPageItem item)async {
102+ // Get the item value from prefs
103+ var val = (await _pref).getBool ("openLastProjectOnStartup" );
104+ item.currentVal ?? = val;
105+ },
106+ type: SettingsPageItemType .typeBoolean,
107+ provided: < bool > [true , false ],
108+ defaultVal: true )
67109 ];
68110
69111 Widget generateListItem (int index, BuildContext context) {
70112 SettingsPageItem item = items[index];
113+ item.onInitialized (item);
71114 switch (item.type) {
72- case SettingsPageItemType .TypeStringList :
115+ case SettingsPageItemType .typeStringList :
73116 var list = (item.provided as List <String >);
74117 return ListTile (
75118 title: Text (item.name),
@@ -88,7 +131,7 @@ class SettingsPageState extends State<SettingsPage> {
88131 return ListTile (
89132 title: Text (list[index]),
90133 onTap: () {
91- item.onSet (list[index]);
134+ item.onSet (item, list[index]);
92135 item.currentVal = list[index];
93136 },
94137 );
@@ -108,17 +151,24 @@ class SettingsPageState extends State<SettingsPage> {
108151 );
109152 },
110153 );
111- break ;
112- case SettingsPageItemType .TypeString :
113- // TODO: Handle this case.
114- break ;
115- case SettingsPageItemType .TypeBoolean :
154+ case SettingsPageItemType .typeString:
116155 // TODO: Handle this case.
117156 break ;
118- case SettingsPageItemType .TypeInteger :
157+ case SettingsPageItemType .typeBoolean:
158+ return CheckboxListTile (
159+ title: Text (item.name),
160+ subtitle: Text (item.description),
161+ value: item.currentVal ?? item.defaultVal,
162+ onChanged: (bool ? val) {
163+ item.onSet (item, val);
164+ setState (() {
165+ item.currentVal = val;
166+ });
167+ });
168+ case SettingsPageItemType .typeInteger:
119169 // TODO: Handle this case.
120170 break ;
121- case SettingsPageItemType .TypeFloat :
171+ case SettingsPageItemType .typeFloat :
122172 // TODO: Handle this case.
123173 break ;
124174 }
@@ -136,48 +186,59 @@ class SettingsPageState extends State<SettingsPage> {
136186 tabs: tabs,
137187 ),
138188 ),
139- body: FutureBuilder (builder: (BuildContext context,
140- AsyncSnapshot <String > snapshot,){
141- return TabBarView (
142- children: [
143- /// General Page
144- getSettingsTabContent (context),
145- /// Plugins Page
146- Column (children: [
147- if (snapshot.hasData)
148- Visibility (
149- visible: snapshot.hasData,
150- child: Text (
151- snapshot.data! ,
189+ body: FutureBuilder (
190+ builder: (
191+ BuildContext context,
192+ AsyncSnapshot <String > snapshot,
193+ ) {
194+ return TabBarView (
195+ children: [
196+ /// General Page
197+ getSettingsTabContent (context),
198+
199+ /// Plugins Page
200+ Column (children: [
201+ if (snapshot.hasData)
202+ Visibility (
203+ visible: snapshot.hasData,
204+ child: Text (
205+ snapshot.data! ,
206+ ),
207+ ),
208+ ListTile (
209+ leading: const Icon (
210+ Icons .download,
211+ size: 48 ,
212+ ),
213+ title: const Text ("Download Plugins" ),
214+ subtitle: const Text ("Get plugins from the internet" ),
215+ onTap: () {
216+ Navigator .pushNamed (
217+ context, PluginsBrowser .routeName);
218+ },
152219 ),
153- ),
154- ListTile (
155- leading: const Icon (Icons .download,size: 48 ,),
156- title: const Text ("Download Plugins" ),
157- subtitle: const Text ("Get plugins from the internet" ),
158- onTap: () {
159- Navigator .pushNamed (context, PluginsBrowser .routeName);
160- },
161- ),
162- ListTile (
163- leading: const Icon (Icons .refresh,size: 48 ,),
164- title: const Text ("Reload Plugins" ),
165- subtitle: const Text ("Reload plugins from the disk" ),
166- onTap: () {
167- widget.modulesManager.initialize (context);
168- setState (() {});
169- },
170- ),
171- const Text ("Installed Plugins" ),
172- Column (children: List .generate (ModulesManager .modules.length, (index) {
173- var mod = ModulesManager .modules[index];
174- return ListTile (
175- onTap: () {
176- },
220+ ListTile (
221+ leading: const Icon (
222+ Icons .refresh,
223+ size: 48 ,
224+ ),
225+ title: const Text ("Reload Plugins" ),
226+ subtitle: const Text ("Reload plugins from the disk" ),
227+ onTap: () {
228+ widget.modulesManager.initialize (context);
229+ setState (() {});
230+ },
231+ ),
232+ const Text ("Installed Plugins" ),
233+ Column (
234+ children: List .generate (ModulesManager .modules.length,
235+ (index) {
236+ var mod = ModulesManager .modules[index];
237+ return ListTile (
238+ onTap: () {},
177239 leading: mod.icon,
178240 title: Text (mod.name),
179- subtitle: Text (
180- mod.desc + " version:" + mod.version),
241+ subtitle: Text (mod.desc + " version:" + mod.version),
181242 // trailing: PopupMenuButton<String>(
182243 // onSelected: (String result) {
183244 // switch (result) {
@@ -248,17 +309,20 @@ class SettingsPageState extends State<SettingsPage> {
248309 // ),
249310 // ],
250311 // ))
251- );
252- }))
253- ]),
254- /// About page
255- ListTile (
256- leading: Image .asset ("assets/logo.png" ),
257- title: const Text ("CoreCoder Develop" ),
258- subtitle: const Text (CoreCoderApp .version),
259- )
260- ],
261- );
262- },future: PluginsManager .pluginsPath,)));
312+ );
313+ }))
314+ ]),
315+
316+ /// About page
317+ ListTile (
318+ leading: Image .asset ("assets/logo.png" ),
319+ title: const Text ("CoreCoder Develop" ),
320+ subtitle: const Text (CoreCoderApp .version),
321+ )
322+ ],
323+ );
324+ },
325+ future: PluginsManager .pluginsPath,
326+ )));
263327 }
264328}
0 commit comments