part of '../../main.dart'; class LookAndFeelSettingsPage extends StatefulWidget { LookAndFeelSettingsPage({Key key, this.title}) : super(key: key); final String title; @override _LookAndFeelSettingsPageState createState() => new _LookAndFeelSettingsPageState(); } class _LookAndFeelSettingsPageState extends State { AppTheme _currentTheme; bool _scrollBadges = false; DisplayMode _displayMode; @override void initState() { super.initState(); _loadSettings(); } _loadSettings() async { SharedPreferences prefs = await SharedPreferences.getInstance(); await prefs.reload(); SharedPreferences.getInstance().then((prefs) { setState(() { _currentTheme = AppTheme.values[prefs.getInt('app-theme') ?? AppTheme.defaultTheme.index]; _displayMode = DisplayMode.values[prefs.getInt('display-mode') ?? DisplayMode.normal.index]; _scrollBadges = prefs.getBool('scroll-badges') ?? true; }); }); } _saveTheme(AppTheme theme) { SharedPreferences.getInstance().then((prefs) { prefs.setInt('app-theme', theme.index); prefs.setBool('scroll-badges', _scrollBadges); setState(() { _currentTheme = theme; eventBus.fire(ChangeThemeEvent(_currentTheme)); }); }); } Future _saveBadgesSettings() async { SharedPreferences prefs = await SharedPreferences.getInstance(); AppSettings().scrollBadges = _scrollBadges; await prefs.setBool('scroll-badges', _scrollBadges); } Future _saveDisplayMode(DisplayMode mode) async { SharedPreferences prefs = await SharedPreferences.getInstance(); AppSettings().displayMode = mode; await prefs.setInt('display-mode', mode.index); if (mode == DisplayMode.fullscreen) { SystemChrome.setEnabledSystemUIOverlays([]); } else { SystemChrome.setEnabledSystemUIOverlays(SystemUiOverlay.values); } } Map appThemeName = { AppTheme.defaultTheme: 'Default', AppTheme.haTheme: 'Home Assistant theme', AppTheme.darkTheme: 'Dark theme' }; Map DisplayModeName = { DisplayMode.normal: 'Normal', DisplayMode.fullscreen: 'Fullscreen' }; @override Widget build(BuildContext context) { return ListView( scrollDirection: Axis.vertical, padding: const EdgeInsets.all(20.0), children: [ Text("Application theme:", style: Theme.of(context).textTheme.body2), Container(height: Sizes.rowPadding), DropdownButton( value: _currentTheme, iconSize: 30.0, isExpanded: true, style: Theme.of(context).textTheme.title, items: AppTheme.values.map((value) { return new DropdownMenuItem( value: value, child: Text('${appThemeName[value]}'), ); }).toList(), onChanged: (theme) => _saveTheme(theme), ), Container(height: Sizes.doubleRowPadding), Text("Badges display:", style: Theme.of(context).textTheme.body2), Container(height: Sizes.rowPadding), DropdownButton( value: _scrollBadges, iconSize: 30.0, isExpanded: true, style: Theme.of(context).textTheme.title, items: [true, false].map((value) { return new DropdownMenuItem( value: value, child: Text('${value ? 'Horizontal scroll' : 'In rows'}'), ); }).toList(), onChanged: (val) { setState(() { _scrollBadges = val; }); _saveBadgesSettings(); }, ), Container(height: Sizes.doubleRowPadding), Text("Display mode:", style: Theme.of(context).textTheme.body2), Container(height: Sizes.rowPadding), DropdownButton( value: _displayMode, iconSize: 30.0, isExpanded: true, style: Theme.of(context).textTheme.title, items: DisplayMode.values.map((value) { return new DropdownMenuItem( value: value, child: Text('${DisplayModeName[value]}'), ); }).toList(), onChanged: (DisplayMode val) { setState(() { _displayMode = val; }); _saveDisplayMode(val); }, ), ] ); } @override void dispose() { super.dispose(); } }