From f72e0258174367a80dda0eee20491aa51298551c Mon Sep 17 00:00:00 2001 From: Yannick Mauray Date: Tue, 9 Nov 2021 22:32:08 +0100 Subject: [PATCH] Fixed version number in settings menu, added theme switcher. --- lib/main.dart | 13 +++++- lib/src/app.dart | 13 ++++-- .../{version_mixin.dart => app_version.dart} | 2 +- lib/src/model/app_theme.dart | 11 +++++ lib/src/pages/main_page.dart | 2 - lib/src/widgets/left_menu.dart | 41 ++++++++++++++----- pubspec.yaml | 1 + 7 files changed, 63 insertions(+), 20 deletions(-) rename lib/src/mixins/{version_mixin.dart => app_version.dart} (93%) create mode 100644 lib/src/model/app_theme.dart diff --git a/lib/main.dart b/lib/main.dart index 42b3674..4598d76 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,6 +1,10 @@ import 'dart:io'; import 'package:flutter/material.dart'; +import 'package:package_info_plus/package_info_plus.dart'; +import 'package:provider/provider.dart'; import 'package:quickgui/src/app.dart'; +import 'package:quickgui/src/mixins/app_version.dart'; +import 'package:quickgui/src/model/app_theme.dart'; import 'package:quickgui/src/model/operating_system.dart'; import 'package:quickgui/src/model/option.dart'; import 'package:quickgui/src/model/version.dart'; @@ -47,6 +51,11 @@ void main() async { setWindowMinSize(const Size(692, 580)); setWindowMaxSize(const Size(692, 580)); gOperatingSystems = await loadOperatingSystems(false); - - runApp(const App()); + AppVersion.packageInfo = await PackageInfo.fromPlatform(); + runApp(MultiProvider( + providers: [ + ChangeNotifierProvider(create: (_) => AppTheme()), + ], + builder: (context, _) => const App(), + )); } diff --git a/lib/src/app.dart b/lib/src/app.dart index 2308476..caee144 100644 --- a/lib/src/app.dart +++ b/lib/src/app.dart @@ -1,4 +1,6 @@ import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:quickgui/src/model/app_theme.dart'; import 'package:quickgui/src/pages/main_page.dart'; class App extends StatefulWidget { @@ -11,10 +13,13 @@ class App extends StatefulWidget { class _AppState extends State { @override Widget build(BuildContext context) { - return MaterialApp( - theme: ThemeData(primarySwatch: Colors.pink), - darkTheme: ThemeData.dark(), - home: const MainPage(title: 'Quickgui - A Flutter frontend for Quickget and Quickemu'), + return Consumer( + builder: (context, appTheme, _) => MaterialApp( + theme: ThemeData(primarySwatch: Colors.pink), + darkTheme: ThemeData.dark(), + themeMode: appTheme.themeMode, + home: const MainPage(title: 'Quickgui - A Flutter frontend for Quickget and Quickemu'), + ), ); } } diff --git a/lib/src/mixins/version_mixin.dart b/lib/src/mixins/app_version.dart similarity index 93% rename from lib/src/mixins/version_mixin.dart rename to lib/src/mixins/app_version.dart index d7aa6d8..6151a22 100644 --- a/lib/src/mixins/version_mixin.dart +++ b/lib/src/mixins/app_version.dart @@ -1,6 +1,6 @@ import 'package:package_info_plus/package_info_plus.dart'; -mixin VersionMixin { +class AppVersion { static PackageInfo? packageInfo; String get appName => packageInfo?.appName ?? ''; diff --git a/lib/src/model/app_theme.dart b/lib/src/model/app_theme.dart new file mode 100644 index 0000000..88afb71 --- /dev/null +++ b/lib/src/model/app_theme.dart @@ -0,0 +1,11 @@ +import 'package:flutter/material.dart'; + +class AppTheme extends ChangeNotifier { + ThemeMode? _themeMode; + + ThemeMode get themeMode => _themeMode ?? ThemeMode.system; + set useDarkMode(bool useDarkMode) { + _themeMode = useDarkMode ? ThemeMode.dark : ThemeMode.light; + notifyListeners(); + } +} diff --git a/lib/src/pages/main_page.dart b/lib/src/pages/main_page.dart index 0eeb772..a8df25b 100644 --- a/lib/src/pages/main_page.dart +++ b/lib/src/pages/main_page.dart @@ -1,5 +1,3 @@ -import 'dart:io'; - import 'package:flutter/material.dart'; import 'package:quickgui/src/widgets/home_page/logo.dart'; import 'package:quickgui/src/widgets/home_page/main_menu.dart'; diff --git a/lib/src/widgets/left_menu.dart b/lib/src/widgets/left_menu.dart index ae49130..9495fd1 100644 --- a/lib/src/widgets/left_menu.dart +++ b/lib/src/widgets/left_menu.dart @@ -1,20 +1,39 @@ +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:quickgui/src/mixins/version_mixin.dart'; +import 'package:provider/provider.dart'; +import 'package:quickgui/src/mixins/app_version.dart'; +import 'package:quickgui/src/model/app_theme.dart'; -class LeftMenu extends StatelessWidget with VersionMixin { +class LeftMenu extends StatelessWidget { const LeftMenu({Key? key}) : super(key: key); @override Widget build(BuildContext context) { - var _version = version + ' (' + buildNumber + ')'; - return Drawer( - child: ListView( - children: [ - ListTile( - title: Text("quickgui $_version", style: Theme.of(context).textTheme.headline6), - ), - const Divider(), - ], + var _version = AppVersion.packageInfo!.version; + return Consumer( + builder: (context, appTheme, _) => Drawer( + child: ListView( + children: [ + ListTile( + title: Text("quickgui $_version", style: Theme.of(context).textTheme.headline6), + ), + const Divider(), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Row( + children: [ + const Text('Use dark mode'), + Switch( + value: Theme.of(context).brightness == Brightness.dark, + onChanged: (value) { + appTheme.useDarkMode = value; + }, + ), + ], + ), + ) + ], + ), ), ); } diff --git a/pubspec.yaml b/pubspec.yaml index 8050455..b8e4479 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -44,6 +44,7 @@ dependencies: file_picker: ^4.1.6 shared_preferences: ^2.0.8 package_info_plus: ^1.3.0 + provider: ^6.0.1 dev_dependencies: flutter_test: