From c6083b6491b4a96dbf4be6f7ae4338fffc18caab Mon Sep 17 00:00:00 2001 From: Christian Pauly Date: Sun, 18 Apr 2021 09:18:23 +0200 Subject: [PATCH] refactor: MVC settings style --- lib/config/routes.dart | 2 +- lib/views/settings_style.dart | 61 +++++++++++++++++++++++++ lib/views/ui/settings_style_ui.dart | 71 ++++++----------------------- 3 files changed, 76 insertions(+), 58 deletions(-) create mode 100644 lib/views/settings_style.dart diff --git a/lib/config/routes.dart b/lib/config/routes.dart index afddabc9..18daa90d 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -25,7 +25,7 @@ import 'package:fluffychat/views/ui/settings_emotes_ui.dart'; import 'package:fluffychat/views/ui/settings_ignore_list_ui.dart'; import 'package:fluffychat/views/ui/settings_multiple_emotes_ui.dart'; import 'package:fluffychat/views/ui/settings_notifications_ui.dart'; -import 'package:fluffychat/views/ui/settings_style_ui.dart'; +import 'package:fluffychat/views/settings_style.dart'; import 'package:flutter/material.dart'; class FluffyRoutes { diff --git a/lib/views/settings_style.dart b/lib/views/settings_style.dart new file mode 100644 index 00000000..f2b6bfcd --- /dev/null +++ b/lib/views/settings_style.dart @@ -0,0 +1,61 @@ +import 'dart:io'; + +import 'package:adaptive_theme/adaptive_theme.dart'; +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:flutter/material.dart'; +import 'package:image_picker/image_picker.dart'; + +import 'ui/settings_style_ui.dart'; +import 'widgets/matrix.dart'; + +class SettingsStyle extends StatefulWidget { + @override + SettingsStyleController createState() => SettingsStyleController(); +} + +class SettingsStyleController extends State { + void setWallpaperAction() async { + final wallpaper = await ImagePicker().getImage(source: ImageSource.gallery); + if (wallpaper == null) return; + Matrix.of(context).wallpaper = File(wallpaper.path); + await Matrix.of(context) + .store + .setItem(SettingKeys.wallpaper, wallpaper.path); + setState(() => null); + } + + void deleteWallpaperAction() async { + Matrix.of(context).wallpaper = null; + await Matrix.of(context).store.deleteItem(SettingKeys.wallpaper); + setState(() => null); + } + + AdaptiveThemeMode currentTheme; + + void switchTheme(AdaptiveThemeMode newTheme) { + switch (newTheme) { + case AdaptiveThemeMode.light: + AdaptiveTheme.of(context).setLight(); + break; + case AdaptiveThemeMode.dark: + AdaptiveTheme.of(context).setDark(); + break; + case AdaptiveThemeMode.system: + AdaptiveTheme.of(context).setSystem(); + break; + } + setState(() => currentTheme = newTheme); + } + + void changeFontSizeFactor(double d) { + setState(() => AppConfig.fontSizeFactor = d); + Matrix.of(context).store.setItem( + SettingKeys.fontSizeFactor, + AppConfig.fontSizeFactor.toString(), + ); + } + + @override + Widget build(BuildContext context) => SettingsStyleUI(this); +} diff --git a/lib/views/ui/settings_style_ui.dart b/lib/views/ui/settings_style_ui.dart index 271972a7..9a20ae75 100644 --- a/lib/views/ui/settings_style_ui.dart +++ b/lib/views/ui/settings_style_ui.dart @@ -1,57 +1,20 @@ -import 'dart:io'; - import 'package:adaptive_theme/adaptive_theme.dart'; -import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/views/widgets/max_width_body.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:image_picker/image_picker.dart'; import '../../config/app_config.dart'; import '../widgets/matrix.dart'; +import '../settings_style.dart'; -class SettingsStyle extends StatefulWidget { - @override - _SettingsStyleState createState() => _SettingsStyleState(); -} +class SettingsStyleUI extends StatelessWidget { + final SettingsStyleController controller; -class _SettingsStyleState extends State { - void setWallpaperAction(BuildContext context) async { - final wallpaper = await ImagePicker().getImage(source: ImageSource.gallery); - if (wallpaper == null) return; - Matrix.of(context).wallpaper = File(wallpaper.path); - await Matrix.of(context) - .store - .setItem(SettingKeys.wallpaper, wallpaper.path); - setState(() => null); - } - - void deleteWallpaperAction(BuildContext context) async { - Matrix.of(context).wallpaper = null; - await Matrix.of(context).store.deleteItem(SettingKeys.wallpaper); - setState(() => null); - } - - AdaptiveThemeMode _currentTheme; - - void _switchTheme(AdaptiveThemeMode newTheme, BuildContext context) { - switch (newTheme) { - case AdaptiveThemeMode.light: - AdaptiveTheme.of(context).setLight(); - break; - case AdaptiveThemeMode.dark: - AdaptiveTheme.of(context).setDark(); - break; - case AdaptiveThemeMode.system: - AdaptiveTheme.of(context).setSystem(); - break; - } - setState(() => _currentTheme = newTheme); - } + const SettingsStyleUI(this.controller, {Key key}) : super(key: key); @override Widget build(BuildContext context) { - _currentTheme ??= AdaptiveTheme.of(context).mode; + controller.currentTheme ??= AdaptiveTheme.of(context).mode; return Scaffold( appBar: AppBar( leading: BackButton(), @@ -62,22 +25,22 @@ class _SettingsStyleState extends State { child: Column( children: [ RadioListTile( - groupValue: _currentTheme, + groupValue: controller.currentTheme, value: AdaptiveThemeMode.system, title: Text(L10n.of(context).systemTheme), - onChanged: (t) => _switchTheme(t, context), + onChanged: controller.switchTheme, ), RadioListTile( - groupValue: _currentTheme, + groupValue: controller.currentTheme, value: AdaptiveThemeMode.light, title: Text(L10n.of(context).lightTheme), - onChanged: (t) => _switchTheme(t, context), + onChanged: controller.switchTheme, ), RadioListTile( - groupValue: _currentTheme, + groupValue: controller.currentTheme, value: AdaptiveThemeMode.dark, title: Text(L10n.of(context).darkTheme), - onChanged: (t) => _switchTheme(t, context), + onChanged: controller.switchTheme, ), Divider(height: 1), ListTile( @@ -100,13 +63,13 @@ class _SettingsStyleState extends State { Icons.delete_forever_outlined, color: Colors.red, ), - onTap: () => deleteWallpaperAction(context), + onTap: controller.deleteWallpaperAction, ), Builder(builder: (context) { return ListTile( title: Text(L10n.of(context).changeWallpaper), trailing: Icon(Icons.wallpaper_outlined), - onTap: () => setWallpaperAction(context), + onTap: controller.setWallpaperAction, ); }), Divider(height: 1), @@ -145,13 +108,7 @@ class _SettingsStyleState extends State { divisions: 4, value: AppConfig.fontSizeFactor, semanticFormatterCallback: (d) => d.toString(), - onChanged: (d) { - setState(() => AppConfig.fontSizeFactor = d); - Matrix.of(context).store.setItem( - SettingKeys.fontSizeFactor, - AppConfig.fontSizeFactor.toString(), - ); - }, + onChanged: controller.changeFontSizeFactor, ), ], ),