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