Skip to content

Commit 2406689

Browse files
committed
Theme Manager implemented + Settings page
1 parent b6322c1 commit 2406689

File tree

5 files changed

+105
-15
lines changed

5 files changed

+105
-15
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,3 +67,4 @@ fastlane/test_output
6767
fastlane/readme.md
6868
.flutter-plugins-dependencies
6969
.flutter-plugins-dependencies
70+
.flutter-plugins-dependencies

lib/main.dart

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import 'util/cc_project_structure.dart';
1818
import 'editor_drawer.dart';
1919

2020
void main() {
21-
runApp(MyApp());
21+
runApp(CoreCoderApp());
2222
}
2323

2424
void loadSolution(
@@ -53,14 +53,34 @@ class RecentProjectsManager {
5353
}
5454
}
5555

56-
class MyApp extends StatelessWidget {
56+
class CoreCoderApp extends StatefulWidget {
57+
const CoreCoderApp({Key? key}) : super(key: key);
58+
59+
@override
60+
State<StatefulWidget> createState() {
61+
return CoreCoderAppState();
62+
}
63+
}
64+
65+
class CoreCoderAppState extends State<CoreCoderApp>{
66+
String themeName = "atom-one-dark";
67+
@override
68+
void initState(){
69+
super.initState();
70+
ThemeManager.currentTheme.addListener(() {
71+
setState(() {
72+
themeName = ThemeManager.currentTheme.value;
73+
});
74+
});
75+
}
76+
5777
@override
5878
Widget build(BuildContext context) {
5979
return MultiProvider(
6080
child: MaterialApp(
6181
debugShowCheckedModeBanner: false,
6282
title: 'CoreCoder Develop',
63-
theme: ThemeManager.getThemeData(name:"atom-one-dark"),
83+
theme: ThemeManager.getThemeData(name:themeName),
6484
//home: HomePage(),
6585
initialRoute: "/",
6686
routes: {

lib/settings.dart

Lines changed: 72 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'package:corecoder_develop/util/theme_manager.dart';
12
import 'package:flutter/material.dart';
23

34
class AppSettings {
@@ -22,19 +23,86 @@ class SettingsPageItem {
2223
String description;
2324
SettingsPageItemType type;
2425
dynamic provided; // the string list for list type
26+
dynamic defaultVal;
27+
dynamic currentVal;
2528

26-
SettingsPageItem(this.name, this.description, this.onSet, this.type);
29+
SettingsPageItem(this.name, this.description, this.onSet, this.type,
30+
this.provided, this.defaultVal);
2731
}
2832

2933
class SettingsPage extends StatelessWidget {
3034
static var routeName = "/SettingsPage";
3135

3236
SettingsPage({Key? key}) : super(key: key);
3337
List<SettingsPageItem> items = [
34-
SettingsPageItem("Theme", "The theme for entire app", (dynamic val) => {},
35-
SettingsPageItemType.TypeStringList)
38+
SettingsPageItem(
39+
"Theme",
40+
"The theme for entire app",
41+
(dynamic val) => {ThemeManager.setTheme(val)},
42+
SettingsPageItemType.TypeStringList,
43+
<String>["atom-one-dark", "atom-one-light"],
44+
"Atom One Dark")
3645
];
3746

47+
Widget generateListItem(int index, BuildContext context) {
48+
SettingsPageItem item = items[index];
49+
switch (item.type) {
50+
case SettingsPageItemType.TypeStringList:
51+
var list = (item.provided as List<String>);
52+
return ListTile(
53+
title: Text(item.name),
54+
subtitle: Text(item.description),
55+
onTap: () {
56+
showDialog<String>(
57+
context: context,
58+
barrierDismissible: false, // user must tap button!
59+
builder: (BuildContext context) {
60+
return AlertDialog(
61+
title: Text(item.name),
62+
content: SingleChildScrollView(
63+
child: ListBody(
64+
children: List.generate(list.length, (index) {
65+
return ListTile(
66+
title: Text(list[index]),
67+
onTap: () {
68+
item.onSet(list[index]);
69+
item.currentVal = list[index];
70+
},
71+
);
72+
}),
73+
),
74+
),
75+
actions: <Widget>[
76+
TextButton(
77+
child: const Text('Cancel'),
78+
onPressed: () {
79+
Navigator.of(context).pop();
80+
},
81+
),
82+
],
83+
);
84+
},
85+
);
86+
},
87+
trailing: Text((item.currentVal ?? item.defaultVal).toString()),
88+
);
89+
break;
90+
case SettingsPageItemType.TypeString:
91+
// TODO: Handle this case.
92+
break;
93+
case SettingsPageItemType.TypeBoolean:
94+
// TODO: Handle this case.
95+
break;
96+
case SettingsPageItemType.TypeInteger:
97+
// TODO: Handle this case.
98+
break;
99+
case SettingsPageItemType.TypeFloat:
100+
// TODO: Handle this case.
101+
break;
102+
}
103+
return const SizedBox.shrink(); // Empty widget
104+
}
105+
38106
@override
39107
Widget build(BuildContext context) {
40108
return Scaffold(
@@ -45,11 +113,7 @@ class SettingsPage extends StatelessWidget {
45113
controller: ScrollController(),
46114
child: Column(
47115
children: List.generate(items.length, (index) {
48-
return ListTile(
49-
title: Text(items[index].name),
50-
subtitle: Text(items[index].description),
51-
onTap: () => print("ListTile")
52-
);
116+
return generateListItem(index, context);
53117
})),
54118
),
55119
);

lib/util/theme_manager.dart

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
import 'package:flutter/material.dart';
2+
import '../main.dart';
23
import './themes.dart';
34

45
class ThemeManager {
5-
static String currentTheme = "atom-one-dark";
6+
static ValueNotifier<String> currentTheme = ValueNotifier<String>("atom-one-dark");
7+
static void setTheme(String name){
8+
currentTheme.value = name;
9+
debugPrint("Set theme: $name");
10+
}
611
static ThemeData getThemeData({String? name}) {
7-
name ??= currentTheme; // if name is not mentioned
12+
name ??= currentTheme.value; // if name is not mentioned
813
var editor = editorThemes[name];
914
var scheme = editor!["scheme"] as Map<String, Color>;
1015
var isDark = editor["brightness"] == "dark";
@@ -407,7 +412,7 @@ class ThemeManager {
407412
if(name != null) {
408413
return editorThemes[name]!["highlight"];
409414
}else{
410-
return editorThemes[currentTheme]!["highlight"];
415+
return editorThemes[currentTheme.value]!["highlight"];
411416
}
412417
}
413418
}

test/widget_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import 'package:flutter_test/flutter_test.dart';
1212
void main() {
1313
testWidgets('Counter increments smoke test', (WidgetTester tester) async {
1414
// Build our app and trigger a frame.
15-
await tester.pumpWidget(MyApp());
15+
await tester.pumpWidget(CoreCoderApp());
1616

1717
// Verify that our counter starts at 0.
1818
expect(find.text('0'), findsOneWidget);

0 commit comments

Comments
 (0)