mirror of
https://github.com/ALEZ-DEV/Babylonia-terminal.git
synced 2025-12-16 01:18:50 +00:00
some refactor and added settings panel
This commit is contained in:
parent
6d4087539e
commit
94f3128932
102
babylonia_terminal_launcher/lib/app.dart
Normal file
102
babylonia_terminal_launcher/lib/app.dart
Normal 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),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -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),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
85
babylonia_terminal_launcher/lib/models/settings.dart
Normal file
85
babylonia_terminal_launcher/lib/models/settings.dart
Normal 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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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"),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
@ -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];
|
||||
}
|
||||
|
||||
@ -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'),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -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"),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -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();
|
||||
}
|
||||
@ -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],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -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(),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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:
|
||||
|
||||
Loading…
Reference in New Issue
Block a user