From 94f3128932803769d2c4f87b6e2af5c01137b836 Mon Sep 17 00:00:00 2001 From: ALEZ-DEV Date: Wed, 15 May 2024 21:14:14 +0200 Subject: [PATCH] some refactor and added settings panel --- babylonia_terminal_launcher/lib/app.dart | 102 ++++++++++++++++++ babylonia_terminal_launcher/lib/main.dart | 96 +---------------- .../lib/models/settings.dart | 85 +++++++++++++++ .../lib/providers/settings_provider.dart | 16 +++ .../lib/screens/home_screen.dart | 75 ++++++++++--- .../lib/screens/screens.dart | 12 +-- .../screens/settings/game_settings_page.dart | 12 +++ .../settings/general_settings_page.dart | 12 +++ .../lib/screens/settings/settings_pages.dart | 33 ++++++ .../screens/settings/style_settings_page.dart | 60 +++++++++++ .../lib/screens/settings_screen.dart | 45 +++++++- .../lib/widgets/background.dart | 10 +- babylonia_terminal_launcher/pubspec.yaml | 1 + 13 files changed, 438 insertions(+), 121 deletions(-) create mode 100644 babylonia_terminal_launcher/lib/app.dart create mode 100644 babylonia_terminal_launcher/lib/models/settings.dart create mode 100644 babylonia_terminal_launcher/lib/providers/settings_provider.dart create mode 100644 babylonia_terminal_launcher/lib/screens/settings/game_settings_page.dart create mode 100644 babylonia_terminal_launcher/lib/screens/settings/general_settings_page.dart create mode 100644 babylonia_terminal_launcher/lib/screens/settings/settings_pages.dart create mode 100644 babylonia_terminal_launcher/lib/screens/settings/style_settings_page.dart diff --git a/babylonia_terminal_launcher/lib/app.dart b/babylonia_terminal_launcher/lib/app.dart new file mode 100644 index 0000000..feaba19 --- /dev/null +++ b/babylonia_terminal_launcher/lib/app.dart @@ -0,0 +1,102 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:yaru/yaru.dart'; + +import './screens/screens.dart'; + +import './providers/settings_provider.dart'; + +class BabyloniaLauncher extends StatelessWidget { + const BabyloniaLauncher({super.key}); + + @override + Widget build(BuildContext context) { + return ChangeNotifierProvider( + create: (context) => SettingsProvider(), + child: YaruTheme( + builder: (context, yaru, child) => MaterialApp( + title: "Babylonia Terminal", + debugShowCheckedModeBanner: false, + theme: yaru.theme, + darkTheme: yaru.darkTheme, + themeMode: ThemeMode.system, + highContrastTheme: yaruHighContrastLight, + highContrastDarkTheme: yaruHighContrastDark, + home: const Menu(), + ), + ), + ); + } +} + +class Menu extends StatefulWidget { + const Menu({super.key}); + + @override + State createState() => _MenuState(); +} + +class _MenuState extends State { + int _selectedIndex = 0; + + @override + Widget build(BuildContext context) { + List items = Screens.drawerItem( + selectedIndex: _selectedIndex, + onSelected: (index) { + setState(() => _selectedIndex = index); + Navigator.of(context).pop(); + }, + ); + items.insert( + 0, + Center( + child: Container( + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.surface, + border: Border( + bottom: BorderSide( + color: Theme.of(context).colorScheme.outline, + ), + ), + ), + child: Center( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric( + vertical: 8.0, + horizontal: 50.0, + ), + child: Image.asset( + 'assets/images/Lee6.png', + ), + ), + const Text( + "Babylonia Terminal", + style: TextStyle(fontSize: 24), + ), + ], + ), + ), + ), + ), + ), + ); + + return Scaffold( + drawer: Drawer( + child: ListView( + children: items, + ), + ), + appBar: AppBar( + title: const Text("Babylonia Terminal"), + centerTitle: true, + ), + body: Screens.getCurrent(_selectedIndex), + ); + } +} diff --git a/babylonia_terminal_launcher/lib/main.dart b/babylonia_terminal_launcher/lib/main.dart index 3475bd3..a281b30 100644 --- a/babylonia_terminal_launcher/lib/main.dart +++ b/babylonia_terminal_launcher/lib/main.dart @@ -1,105 +1,11 @@ -import 'package:babylonia_terminal_launcher/screens/screens.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:media_kit/media_kit.dart'; -import 'package:yaru/theme.dart'; -import './screens/screens.dart'; +import './app.dart'; void main() { WidgetsFlutterBinding.ensureInitialized(); MediaKit.ensureInitialized(); runApp(const BabyloniaLauncher()); } - -class BabyloniaLauncher extends StatelessWidget { - const BabyloniaLauncher({super.key}); - - @override - Widget build(BuildContext context) { - return YaruTheme( - builder: (context, yaru, child) => MaterialApp( - title: "Babylonia Terminal", - debugShowCheckedModeBanner: false, - theme: yaru.theme, - darkTheme: yaru.darkTheme, - themeMode: ThemeMode.system, - highContrastTheme: yaruHighContrastLight, - highContrastDarkTheme: yaruHighContrastDark, - home: const Menu(), - ), - ); - } -} - -class Menu extends StatefulWidget { - const Menu({super.key}); - - @override - State createState() => _MenuState(); -} - -class _MenuState extends State { - int _selectedIndex = 0; - - @override - Widget build(BuildContext context) { - List items = Screens.drawerItem( - selectedIndex: _selectedIndex, - onSelected: (index) { - setState(() => _selectedIndex = index); - Navigator.of(context).pop(); - }, - ); - items.insert( - 0, - Center( - child: Container( - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.surface, - border: Border( - bottom: BorderSide( - color: Theme.of(context).colorScheme.outline, - ), - ), - ), - child: Center( - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - children: [ - Padding( - padding: const EdgeInsets.symmetric( - vertical: 8.0, - horizontal: 50.0, - ), - child: Image.asset( - 'assets/images/Lee6.png', - ), - ), - const Text( - "Babylonia Terminal", - style: TextStyle(fontSize: 24), - ), - ], - ), - ), - ), - ), - ), - ); - - return Scaffold( - drawer: Drawer( - child: ListView( - children: items, - ), - ), - appBar: AppBar( - title: const Text("Babylonia Terminal"), - centerTitle: true, - ), - body: Screens.getCurrent(_selectedIndex), - ); - } -} diff --git a/babylonia_terminal_launcher/lib/models/settings.dart b/babylonia_terminal_launcher/lib/models/settings.dart new file mode 100644 index 0000000..602fef6 --- /dev/null +++ b/babylonia_terminal_launcher/lib/models/settings.dart @@ -0,0 +1,85 @@ +import 'package:flutter/material.dart'; + +enum BackgroundType { + contain, + fill, + cover, + fitHeight, + fitWidth, + disable, +} + +class Settings { + BackgroundType _backgroundType = BackgroundType.cover; + + static final List backgoundList = [ + BackgroundType.contain, + BackgroundType.fill, + BackgroundType.cover, + BackgroundType.fitHeight, + BackgroundType.fitWidth, + BackgroundType.disable, + ]; + + static String getStringNameOfBackgroundType(BackgroundType backgroundType) { + switch (backgroundType) { + case BackgroundType.contain: + return 'contain'; + case BackgroundType.fill: + return 'fill'; + case BackgroundType.cover: + return 'cover'; + case BackgroundType.fitHeight: + return 'fitHeight'; + case BackgroundType.fitWidth: + return 'fitWidth'; + case BackgroundType.disable: + return 'disable'; + } + } + + static BackgroundType getBackgroundTypeFromString(String background) { + switch (background) { + case 'contain': + return BackgroundType.contain; + case 'fill': + return BackgroundType.fill; + case 'cover': + return BackgroundType.cover; + case 'fitHeight': + return BackgroundType.fitHeight; + case 'fitWidth': + return BackgroundType.fitWidth; + case 'disable': + return BackgroundType.disable; + default: + throw FormatException('Can\'t convert String to Enum BackgroundType!'); + } + } + + static BoxFit getBoxFitFromBackgroundType(BackgroundType backgroundType) { + switch (backgroundType) { + case BackgroundType.contain: + return BoxFit.contain; + case BackgroundType.fill: + return BoxFit.fill; + case BackgroundType.cover: + return BoxFit.cover; + case BackgroundType.fitHeight: + return BoxFit.fitHeight; + case BackgroundType.fitWidth: + return BoxFit.fitWidth; + case BackgroundType.disable: + throw FormatException( + 'Can\'t convert BackgroundType to widget BoxFit!'); + } + } + + BackgroundType get selectedBackgroundType { + return _backgroundType; + } + + set selectedBackgroundType(BackgroundType selectedBackground) { + _backgroundType = selectedBackground; + } +} diff --git a/babylonia_terminal_launcher/lib/providers/settings_provider.dart b/babylonia_terminal_launcher/lib/providers/settings_provider.dart new file mode 100644 index 0000000..bd74114 --- /dev/null +++ b/babylonia_terminal_launcher/lib/providers/settings_provider.dart @@ -0,0 +1,16 @@ +import 'package:flutter/material.dart'; + +import './../models/settings.dart'; + +class SettingsProvider with ChangeNotifier { + final Settings _settings = Settings(); + + set setSelectedBackgroundType(BackgroundType selectedBackground) { + _settings.selectedBackgroundType = selectedBackground; + notifyListeners(); + } + + get getSelectedBackgroundType { + return _settings.selectedBackgroundType; + } +} diff --git a/babylonia_terminal_launcher/lib/screens/home_screen.dart b/babylonia_terminal_launcher/lib/screens/home_screen.dart index c7b43c2..dd83c32 100644 --- a/babylonia_terminal_launcher/lib/screens/home_screen.dart +++ b/babylonia_terminal_launcher/lib/screens/home_screen.dart @@ -1,6 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import './../widgets/background.dart'; +import './../providers/settings_provider.dart'; +import './../models/settings.dart'; class HomeScreen extends StatelessWidget { const HomeScreen({super.key}); @@ -9,25 +12,65 @@ class HomeScreen extends StatelessWidget { Widget build(BuildContext context) { return Stack( children: [ - const Background(), - SizedBox( - child: Align( - alignment: Alignment.bottomRight, - child: Padding( - padding: const EdgeInsets.only(right: 50, bottom: 50), - child: ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Colors.blue[500], + if (Provider.of(context).getSelectedBackgroundType != + BackgroundType.disable) + const Background() + else + Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + height: 300, + child: Image.asset('assets/images/Lee6.png'), ), - onPressed: () {}, - child: const SizedBox( - width: 300, - height: 25, - child: Center( - child: Text("Download"), + const Center( + child: Padding( + padding: EdgeInsets.all(8.0), + child: Text( + 'Babylonia Terminal', + style: TextStyle( + fontSize: 34, + ), + ), + ), + ) + ], + ), + ), + SizedBox( + child: Padding( + padding: const EdgeInsets.all(50.0), + child: Row( + children: [ + const Expanded( + child: SizedBox(), + ), + const Expanded( + child: SizedBox(), + ), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + ConstrainedBox( + constraints: const BoxConstraints( + maxHeight: 50, + ), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Colors.blue[500], + ), + onPressed: () {}, + child: const Center( + child: Text("Download"), + ), + ), + ), + ], ), ), - ), + ], ), ), ), diff --git a/babylonia_terminal_launcher/lib/screens/screens.dart b/babylonia_terminal_launcher/lib/screens/screens.dart index 7490dd9..4ff2b93 100644 --- a/babylonia_terminal_launcher/lib/screens/screens.dart +++ b/babylonia_terminal_launcher/lib/screens/screens.dart @@ -5,7 +5,7 @@ import 'package:yaru/icons.dart'; import 'package:babylonia_terminal_launcher/screens/home_screen.dart'; class Screens { - static final screens = { + static final _screens = { const HomeScreen(): ( const Icon(YaruIcons.home_filled), const Icon(YaruIcons.home), @@ -21,16 +21,16 @@ class Screens { static List drawerItem( {required Function(int) onSelected, required int selectedIndex}) => [ - for (int i = 0; i < Screens.screens.values.length; i++) + for (int i = 0; i < Screens._screens.values.length; i++) ListTile( selected: i == selectedIndex, leading: i == selectedIndex - ? Screens.screens.values.elementAt(i).$1 - : Screens.screens.values.elementAt(i).$2, - title: Text(Screens.screens.values.elementAt(i).$3), + ? Screens._screens.values.elementAt(i).$1 + : Screens._screens.values.elementAt(i).$2, + title: Text(Screens._screens.values.elementAt(i).$3), onTap: () => onSelected(i), ), ]; - static Widget getCurrent(int index) => Screens.screens.keys.toList()[index]; + static Widget getCurrent(int index) => Screens._screens.keys.toList()[index]; } diff --git a/babylonia_terminal_launcher/lib/screens/settings/game_settings_page.dart b/babylonia_terminal_launcher/lib/screens/settings/game_settings_page.dart new file mode 100644 index 0000000..6d64543 --- /dev/null +++ b/babylonia_terminal_launcher/lib/screens/settings/game_settings_page.dart @@ -0,0 +1,12 @@ +import 'package:flutter/material.dart'; + +class GameSettingsPage extends StatelessWidget { + const GameSettingsPage({super.key}); + + @override + Widget build(BuildContext context) { + return const Center( + child: Text('Game settings'), + ); + } +} diff --git a/babylonia_terminal_launcher/lib/screens/settings/general_settings_page.dart b/babylonia_terminal_launcher/lib/screens/settings/general_settings_page.dart new file mode 100644 index 0000000..5c10a7c --- /dev/null +++ b/babylonia_terminal_launcher/lib/screens/settings/general_settings_page.dart @@ -0,0 +1,12 @@ +import 'package:flutter/material.dart'; + +class GeneralSettingsPage extends StatelessWidget { + const GeneralSettingsPage({super.key}); + + @override + Widget build(BuildContext context) { + return const Center( + child: Text("General settings"), + ); + } +} diff --git a/babylonia_terminal_launcher/lib/screens/settings/settings_pages.dart b/babylonia_terminal_launcher/lib/screens/settings/settings_pages.dart new file mode 100644 index 0000000..89b618e --- /dev/null +++ b/babylonia_terminal_launcher/lib/screens/settings/settings_pages.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; +import 'package:yaru/yaru.dart'; + +import './general_settings_page.dart'; +import './game_settings_page.dart'; +import './style_settings_page.dart'; + +class SettingsPage { + static final _pages = { + const GeneralSettingsPage(): ( + const Icon(YaruIcons.gears), + 'General', + ), + const GameSettingsPage(): ( + const Icon(YaruIcons.game_controller_filled), + 'Game', + ), + const StyleSettingsPage(): ( + const Icon(YaruIcons.desktop_appearance_filled), + 'Style', + ), + }; + + static List tabItems() => [ + for (int i = 0; i < SettingsPage._pages.values.length; i++) + YaruTab( + icon: SettingsPage._pages.values.elementAt(i).$1, + label: SettingsPage._pages.values.elementAt(i).$2, + ), + ]; + + static List getPages() => SettingsPage._pages.keys.toList(); +} diff --git a/babylonia_terminal_launcher/lib/screens/settings/style_settings_page.dart b/babylonia_terminal_launcher/lib/screens/settings/style_settings_page.dart new file mode 100644 index 0000000..5799cb7 --- /dev/null +++ b/babylonia_terminal_launcher/lib/screens/settings/style_settings_page.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:yaru/yaru.dart'; + +import './../../providers/settings_provider.dart'; +import './../../models/settings.dart'; + +class StyleSettingsPage extends StatefulWidget { + const StyleSettingsPage({super.key}); + + @override + State createState() => _StyleSettingsPageState(); +} + +class _StyleSettingsPageState extends State { + late int _radioValue; + + void setBackgroundValue( + BuildContext context, + SettingsProvider provider, + int? value, + ) { + if (value != null) { + provider.setSelectedBackgroundType = Settings.backgoundList[value]; + setState(() { + _radioValue = value; + }); + } + } + + @override + Widget build(BuildContext context) { + final provider = Provider.of(context, listen: false); + _radioValue = Settings.backgoundList.indexWhere( + (element) => element == provider.getSelectedBackgroundType, + ); + + return Center( + child: YaruSection( + headline: const Text('Background video'), + child: Column( + children: [ + for (int i = 0; i < Settings.backgoundList.length; i++) + YaruRadioListTile( + value: i, + groupValue: _radioValue, + onChanged: (v) => setBackgroundValue(context, provider, v), + toggleable: true, + title: Text( + Settings.getStringNameOfBackgroundType( + Settings.backgoundList[i], + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/babylonia_terminal_launcher/lib/screens/settings_screen.dart b/babylonia_terminal_launcher/lib/screens/settings_screen.dart index 4b978c5..d35c313 100644 --- a/babylonia_terminal_launcher/lib/screens/settings_screen.dart +++ b/babylonia_terminal_launcher/lib/screens/settings_screen.dart @@ -1,12 +1,51 @@ import 'package:flutter/material.dart'; +import 'package:yaru/yaru.dart'; -class SettingsScreen extends StatelessWidget { +import './settings/settings_pages.dart'; + +class SettingsScreen extends StatefulWidget { const SettingsScreen({super.key}); + @override + State createState() => _SettingsScreenState(); +} + +class _SettingsScreenState extends State + with TickerProviderStateMixin { + late TabController tabController; + + @override + void initState() { + super.initState(); + tabController = + TabController(length: SettingsPage.getPages().length, vsync: this); + } + + @override + void dispose() { + super.dispose(); + tabController.dispose(); + } + @override Widget build(BuildContext context) { - return const Center( - child: Text('Settings screen'), + return Center( + child: Column( + children: [ + SizedBox( + child: YaruTabBar( + tabController: tabController, + tabs: SettingsPage.tabItems(), + ), + ), + Expanded( + child: TabBarView( + controller: tabController, + children: SettingsPage.getPages(), + ), + ), + ], + ), ); } } diff --git a/babylonia_terminal_launcher/lib/widgets/background.dart b/babylonia_terminal_launcher/lib/widgets/background.dart index a0cfc6f..4d9cb8e 100644 --- a/babylonia_terminal_launcher/lib/widgets/background.dart +++ b/babylonia_terminal_launcher/lib/widgets/background.dart @@ -1,6 +1,10 @@ import 'package:flutter/material.dart'; import 'package:media_kit/media_kit.dart'; import 'package:media_kit_video/media_kit_video.dart'; +import 'package:provider/provider.dart'; + +import './../providers/settings_provider.dart'; +import './../models/settings.dart'; class Background extends StatefulWidget { const Background({super.key}); @@ -34,12 +38,16 @@ class _BackgroundState extends State { @override Widget build(BuildContext context) { + final provider = Provider.of(context); + player.play(); return Video( controller: controller, controls: NoVideoControls, wakelock: false, - fit: BoxFit.cover, + fit: Settings.getBoxFitFromBackgroundType( + provider.getSelectedBackgroundType, + ), ); } } diff --git a/babylonia_terminal_launcher/pubspec.yaml b/babylonia_terminal_launcher/pubspec.yaml index 3eb6dc3..bc4f0f3 100644 --- a/babylonia_terminal_launcher/pubspec.yaml +++ b/babylonia_terminal_launcher/pubspec.yaml @@ -43,6 +43,7 @@ dependencies: media_kit_video: any media_kit_libs_video: any media_kit_native_event_loop: any + provider: ^6.1.2 dependency_overrides: media_kit: