8fffafde47
Translations are provided in *.arb* format. Some keys have descriptions (indicated by leading @-symbol). Descriptions should not be copied into the translation itself. Currently only English is supported (app_en.arb), but German is planned. Apparently weblate merged .arb support at some time, so it would be nice to enable community translations at some point.
86 lines
1.8 KiB
Dart
86 lines
1.8 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:localstore/localstore.dart';
|
|
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
|
|
|
class AppTheme {
|
|
ThemeMode mode;
|
|
|
|
AppTheme(this.mode);
|
|
|
|
String name(BuildContext context) {
|
|
final trans = AppLocalizations.of(context);
|
|
|
|
if (mode == ThemeMode.light) {
|
|
return trans!.themeLight;
|
|
}
|
|
if (mode == ThemeMode.dark) {
|
|
return trans!.themeDark;
|
|
}
|
|
|
|
return trans!.themeSystem;
|
|
}
|
|
|
|
IconData get icon {
|
|
if (mode == ThemeMode.light) {
|
|
return Icons.light_mode;
|
|
}
|
|
if (mode == ThemeMode.dark) {
|
|
return Icons.dark_mode;
|
|
}
|
|
|
|
return Icons.brightness_auto;
|
|
}
|
|
|
|
static get auto {
|
|
return AppTheme(ThemeMode.system);
|
|
}
|
|
|
|
static get light {
|
|
return AppTheme(ThemeMode.light);
|
|
}
|
|
|
|
static get dark {
|
|
return AppTheme(ThemeMode.dark);
|
|
}
|
|
|
|
static List<AppTheme> list() {
|
|
return [AppTheme.auto, AppTheme.light, AppTheme.dark];
|
|
}
|
|
|
|
static listen(Function(Map<String, dynamic>) cb) {
|
|
final db = Localstore.instance;
|
|
final stream = db.collection('settings').stream;
|
|
stream.listen(cb);
|
|
}
|
|
|
|
Future<void> toDisk() async {
|
|
final db = Localstore.instance;
|
|
await db.collection('settings').doc('ui').set({'theme': mode.index});
|
|
}
|
|
|
|
static Future<AppTheme> fromDisk() async {
|
|
final db = Localstore.instance;
|
|
final doc = await db.collection('settings').doc('ui').get();
|
|
try {
|
|
final index = doc?['theme'];
|
|
final mode = ThemeMode.values[index];
|
|
return AppTheme(mode);
|
|
} catch (_) {
|
|
return AppTheme(ThemeMode.system);
|
|
}
|
|
}
|
|
|
|
@override
|
|
bool operator ==(other) {
|
|
if (other.runtimeType == runtimeType) {
|
|
if (other.hashCode == hashCode) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
@override
|
|
int get hashCode => mode.index;
|
|
}
|