some refactor and added settings panel

This commit is contained in:
ALEZ-DEV 2024-05-15 21:14:14 +02:00
parent 6d4087539e
commit 94f3128932
13 changed files with 438 additions and 121 deletions

View File

@ -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<Menu> createState() => _MenuState();
}
class _MenuState extends State<Menu> {
int _selectedIndex = 0;
@override
Widget build(BuildContext context) {
List<Widget> 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),
);
}
}

View File

@ -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<Menu> createState() => _MenuState();
}
class _MenuState extends State<Menu> {
int _selectedIndex = 0;
@override
Widget build(BuildContext context) {
List<Widget> 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),
);
}
}

View File

@ -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<BackgroundType> 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;
}
}

View File

@ -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;
}
}

View File

@ -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<SettingsProvider>(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"),
),
),
),
],
),
),
),
],
),
),
),

View File

@ -5,7 +5,7 @@ import 'package:yaru/icons.dart';
import 'package:babylonia_terminal_launcher/screens/home_screen.dart';
class Screens {
static final screens = <Widget, (Widget, Widget, String)>{
static final _screens = <Widget, (Widget, Widget, String)>{
const HomeScreen(): (
const Icon(YaruIcons.home_filled),
const Icon(YaruIcons.home),
@ -21,16 +21,16 @@ class Screens {
static List<Widget> 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];
}

View File

@ -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'),
);
}
}

View File

@ -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"),
);
}
}

View File

@ -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 = <Widget, (Widget, String)>{
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<Widget> 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<Widget> getPages() => SettingsPage._pages.keys.toList();
}

View File

@ -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<StyleSettingsPage> createState() => _StyleSettingsPageState();
}
class _StyleSettingsPageState extends State<StyleSettingsPage> {
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<SettingsProvider>(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],
),
),
),
],
),
),
);
}
}

View File

@ -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<SettingsScreen> createState() => _SettingsScreenState();
}
class _SettingsScreenState extends State<SettingsScreen>
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(),
),
),
],
),
);
}
}

View File

@ -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<Background> {
@override
Widget build(BuildContext context) {
final provider = Provider.of<SettingsProvider>(context);
player.play();
return Video(
controller: controller,
controls: NoVideoControls,
wakelock: false,
fit: BoxFit.cover,
fit: Settings.getBoxFitFromBackgroundType(
provider.getSelectedBackgroundType,
),
);
}
}

View File

@ -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: