Skip to content

Commit 74eac49

Browse files
committed
Theming
1 parent 6d8bd28 commit 74eac49

File tree

3 files changed

+71
-4
lines changed

3 files changed

+71
-4
lines changed

lib/addons.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@ import 'dart:async';
44

55
import 'package:dictionaries/addons.dart';
66
import 'package:dictionaries/main.dart';
7+
import 'package:dictionaries/src/theme.dart';
78
import 'package:flutter/material.dart';
89
import 'package:styled_logger/styled_logger.dart';
910

1011
export 'package:dictionaries/src/widgetframework.dart';
1112
export 'package:dictionaries/src/menubar.dart' show DictionariesMenuBarEntry;
1213
export 'package:dictionaries/src/nodes.dart' show RootNode;
14+
export 'package:dictionaries/src/theme.dart' show DictionariesTheme;
1315

1416
/// This class is what you base your entire addon around.
1517
/// You will make a new class that inherits this class and provides the info and permissions.
@@ -154,4 +156,10 @@ class AddonLogger {
154156
class AddonContext {
155157
final String id;
156158
const AddonContext.fromId(this.id);
159+
}
160+
161+
extension DictionariesThemeInjection on DictionariesTheme {
162+
void inject(AddonContext context, String id) {
163+
addTheme("${context.id}.$id", this);
164+
}
157165
}

lib/main.dart

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@ import 'package:dictionaries/src/addonloader.dart';
77
import 'package:dictionaries/src/editor.dart';
88
import 'package:dictionaries/src/main.dart';
99
import 'package:dictionaries/src/nodes.dart';
10+
import 'package:dictionaries/src/theme.dart';
1011
import 'package:file_picker/file_picker.dart';
1112
import 'package:flutter/foundation.dart';
1213
import 'package:flutter/material.dart';
1314
import 'package:http/http.dart' as http;
1415
import 'package:localpkg_flutter/localpkg.dart';
1516
import 'package:path_provider/path_provider.dart';
17+
import 'package:shared_preferences/shared_preferences.dart';
1618
import 'package:styled_logger/styled_logger.dart';
1719
import 'package:dictionaries/files/files.dart';
1820

@@ -54,19 +56,27 @@ Future<void> main() async {
5456

5557
Logger.print("Found application directory as ${(await maindir).path}");
5658
await loadAddons();
59+
SharedPreferences prefs = await SharedPreferences.getInstance();
60+
defaultThemes();
61+
applyTheme(prefs.getString("theme") ?? DictionariesTheme.defaultTheme);
5762
runApp(const MainApp());
5863
}
5964

60-
class MainApp extends StatelessWidget {
65+
class MainApp extends StatefulWidget {
6166
const MainApp({super.key});
6267

68+
@override
69+
State<MainApp> createState() => MainAppState();
70+
}
71+
72+
class MainAppState extends State<MainApp> {
6373
@override
6474
Widget build(BuildContext context) {
6575
var app = MaterialApp(
6676
debugShowCheckedModeBanner: false,
67-
theme: ThemeData.light(),
68-
darkTheme: ThemeData.dark(),
69-
themeMode: ThemeMode.system,
77+
theme: activeTheme?.$2.lightTheme ?? ThemeData.light(),
78+
darkTheme: activeTheme?.$2.darkTheme ?? ThemeData.dark(),
79+
themeMode: activeTheme?.$2.lightTheme != null ? (activeTheme?.$2.darkTheme != null ? ThemeMode.system : ThemeMode.light) : (activeTheme?.$2.darkTheme != null ? ThemeMode.dark : ThemeMode.system),
7080
home: Home(),
7181
title: "Dictionaries",
7282
);

lib/src/theme.dart

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import 'package:collection/collection.dart';
2+
import 'package:flutter/material.dart';
3+
import 'package:flutter_highlight/themes/atom-one-light.dart';
4+
import 'package:flutter_highlight/themes/gruvbox-dark.dart';
5+
import 'package:styled_logger/styled_logger.dart';
6+
7+
class DictionariesTheme {
8+
final String name;
9+
final Map<String, TextStyle> Function(Brightness brightness) codeTheme;
10+
final ThemeData? lightTheme;
11+
final ThemeData? darkTheme;
12+
13+
const DictionariesTheme(this.name, {
14+
required this.codeTheme,
15+
required this.lightTheme,
16+
required this.darkTheme,
17+
});
18+
19+
static const String defaultTheme = "com.calebh101.dictionaries.basic";
20+
static final Map<String, TextStyle> Function(Brightness brightness) defaultCodeTheme = (brightness) => brightness == Brightness.light ? atomOneLightTheme : gruvboxDarkTheme;
21+
}
22+
23+
List<(String id, DictionariesTheme)> themes = [];
24+
(String id, DictionariesTheme)? activeTheme;
25+
26+
void addTheme(String id, DictionariesTheme theme) {
27+
if (!themes.any((x) => x.$1 == id)) themes.add((id, theme));
28+
}
29+
30+
void defaultThemes() => [
31+
("basic", DictionariesTheme(
32+
"Basic Theme",
33+
codeTheme: DictionariesTheme.defaultCodeTheme,
34+
lightTheme: ThemeData.light(),
35+
darkTheme: ThemeData.dark(),
36+
)),
37+
].map((x) => addTheme("com.calebh101.dictionaries.${x.$1}", x.$2));
38+
39+
void applyTheme(String target) {
40+
var o = themes.firstWhereOrNull((x) => x.$1 == target);
41+
activeTheme = o;
42+
43+
if (o == null) {
44+
Logger.warn("Invalid theme: $target");
45+
if (target != DictionariesTheme.defaultTheme) applyTheme(DictionariesTheme.defaultTheme);
46+
} else {
47+
Logger.print("Activated theme: $target");
48+
}
49+
}

0 commit comments

Comments
 (0)