Compare commits

..

2 Commits

Author SHA1 Message Date
e3695ff96a Start the abstract class game 2024-11-20 15:30:43 +01:00
92927bd1c4 pubspec + remove transition 2024-11-19 21:20:33 +01:00
5 changed files with 43 additions and 269 deletions

View File

@ -8,22 +8,21 @@ void main() {
runApp( runApp(
MultiProvider( MultiProvider(
providers: [ providers: [
// Ton provider UserRepository
Provider( Provider(
create: (context) => LocalUserRepository( create: (context) => LocalUserRepository(
keyValueStorage: KeyValueStorage(), keyValueStorage: KeyValueStorage(),
), ),
), ),
// Providers pour la gestion de l'état
ChangeNotifierProvider(create: (context) => CellListProvider()), ChangeNotifierProvider(create: (context) => CellListProvider()),
ChangeNotifierProvider(create: (context) => ArticleListProvider()), ChangeNotifierProvider(create: (context) => ArticleListProvider()),
ChangeNotifierProvider(create: (context) => SettingsProvider()), ChangeNotifierProvider(create: (context) => SettingsProvider()),
ChangeNotifierProvider( ChangeNotifierProvider(
create: (context) => create: (context) => UserProvider(
UserProvider(context.read<LocalUserRepository>()), context.read<LocalUserRepository>(),
),
), ),
], ],
child: const MainApp(), // Maintenant MainApp a accès aux providers child: const MainApp(),
), ),
); );
} }
@ -40,7 +39,6 @@ class MainApp extends StatelessWidget {
routes: { routes: {
'/': (context) => const LoginScreen(), '/': (context) => const LoginScreen(),
'/lobby': (context) => const Lobby(), '/lobby': (context) => const Lobby(),
'/settings': (context) => const Settings(),
'/blog': (context) => const Blog(), '/blog': (context) => const Blog(),
}, },
); );

View File

@ -0,0 +1,3 @@
import 'package:equatable/equatable.dart';
abstract class Game extends Equatable {}

View File

@ -32,15 +32,10 @@ class SettingsProvider with ChangeNotifier {
} }
void changeThemeColor(Color color) { void changeThemeColor(Color color) {
_state = _state.copyWith(theme: _state.theme.copyWith(primaryColor: color));
notifyListeners();
}
void reset() {
_state = _state.copyWith(theme: ThemeData.dark());
_state = _state.copyWith( _state = _state.copyWith(
theme: _state.theme.copyWith(primaryColor: Colors.blue)); theme: _state.theme.copyWith(primaryColor: color),
);
notifyListeners(); notifyListeners();
} }
} }

View File

@ -11,6 +11,7 @@ class SettingsState extends Equatable {
return SettingsState( return SettingsState(
theme: ThemeData.dark().copyWith( theme: ThemeData.dark().copyWith(
primaryColor: Colors.blue, primaryColor: Colors.blue,
pageTransitionsTheme: pageTransitionTheme,
), ),
); );
} }
@ -18,9 +19,35 @@ class SettingsState extends Equatable {
@override @override
List<Object?> get props => [theme]; List<Object?> get props => [theme];
SettingsState copyWith({ThemeData? theme}) { SettingsState copyWith({
ThemeData? theme,
}) {
return SettingsState( return SettingsState(
theme: theme ?? this.theme, theme: theme?.copyWith(pageTransitionsTheme: pageTransitionTheme) ??
this.theme.copyWith(pageTransitionsTheme: pageTransitionTheme),
); );
} }
static var pageTransitionTheme = PageTransitionsTheme(
builders: {
TargetPlatform.android: NoTransitionsBuilder(),
TargetPlatform.iOS: NoTransitionsBuilder(),
TargetPlatform.windows: NoTransitionsBuilder(),
TargetPlatform.linux: NoTransitionsBuilder(),
TargetPlatform.macOS: NoTransitionsBuilder(),
},
);
}
class NoTransitionsBuilder extends PageTransitionsBuilder {
@override
Widget buildTransitions<T>(
PageRoute<T> route,
BuildContext context,
Animation<double> animation,
Animation<double> secondaryAnimation,
Widget child,
) {
return child;
}
} }

View File

@ -1,261 +1,12 @@
import 'package:board_game/src/providers/providers.dart';
import 'package:board_game/src/widgets/color_picker.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
enum SettingStateEnum { appearance, sound, language } class MyWidget extends StatelessWidget {
const MyWidget({super.key});
class Settings extends StatefulWidget {
const Settings({super.key});
@override
State<Settings> createState() => _SettingsState();
}
class _SettingsState extends State<Settings> {
final _formKey = GlobalKey<FormState>();
SettingStateEnum _state = SettingStateEnum.appearance;
bool themeValue = true;
bool soundNotification = true;
bool languageRegionUS = true;
final TextStyle _textStyle = const TextStyle(fontSize: 16.0);
void _resetSettings() {
if (!themeValue) {
context.read<SettingsProvider>().reset();
}
// setState(() {
// themeValue = true;
// soundNotification = true;
// languageRegionUS = true;
// });
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return const Center(
appBar: AppBar( child: Text('Settings - Old'),
backgroundColor: Theme.of(context).primaryColor,
title: Text('Little Strategy Settings', style: _textStyle),
actions: [
IconButton(
icon: const Icon(Icons.save),
onPressed: () {
Navigator.of(context).pop();
},
),
],
leading: IconButton(
icon: const Icon(Icons.arrow_back),
onPressed: () {
Navigator.of(context).pop();
},
),
),
drawer: MediaQuery.of(context).size.width < 768 ? Drawer(child: _buildMenu()) : null,
body: LayoutBuilder(
builder: (context, constraints) {
if (constraints.maxWidth >= 768) {
return Row(
children: [
Expanded(
flex: 1,
child: _buildMenu(),
),
const VerticalDivider(),
Expanded(
flex: 3,
child: _buildContentColumn(),
),
],
);
} else {
return Column(
children: [
Expanded(child: _buildContentColumn()),
],
);
}
},
),
);
}
Widget _buildMenu() {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ListTile(
title: Text('Appearance',
style: _state == SettingStateEnum.appearance
? _textStyle.copyWith(fontWeight: FontWeight.bold)
: _textStyle),
onTap: () => setState(() => _state = SettingStateEnum.appearance),
),
ListTile(
title: Text('Sound',
style: _state == SettingStateEnum.sound
? _textStyle.copyWith(fontWeight: FontWeight.bold)
: _textStyle),
onTap: () => setState(() => _state = SettingStateEnum.sound),
),
ListTile(
title: Text('Language',
style: _state == SettingStateEnum.language
? _textStyle.copyWith(fontWeight: FontWeight.bold)
: _textStyle),
onTap: () => setState(() => _state = SettingStateEnum.language),
),
],
);
}
Widget _buildContentColumn() {
return AnimatedSwitcher(
duration: const Duration(milliseconds: 300),
child: _state == SettingStateEnum.appearance
? _buildAppearanceSettings()
: _state == SettingStateEnum.sound
? _buildSoundSettings()
: _buildLanguageSettings(),
);
}
Widget _buildAppearanceSettings() {
return ListView(
key: const ValueKey('appearance'),
padding: const EdgeInsets.all(16.0),
children: [
ListTile(
title: Text('Theme Settings',
style: _textStyle.copyWith(fontSize: 18.0, fontWeight: FontWeight.bold)),
),
SwitchListTile(
title: const Text('Dark Mode'),
value: context.watch<SettingsProvider>().state.theme.brightness == Brightness.dark,
onChanged: (v) {
context.read<SettingsProvider>().toggleTheme();
setState(() {
themeValue = v;
});
},
),
ListTile(
title: const Text('Theme Color'),
trailing: const Icon(Icons.color_lens, color: Colors.blue),
onTap: () {
showDialog(
context: context,
builder: (context) {
return const AlertDialog(
title: Text('Choose a color'),
content: SingleChildScrollView(
child: ColorPicker(),
),
);
},
);
},
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 8.0),
child: TextButton(
onPressed: _resetSettings,
style: TextButton.styleFrom(
padding: const EdgeInsets.symmetric(horizontal: 12.0, vertical: 8.0),
backgroundColor: Colors.grey[200],
foregroundColor: Colors.black,
),
child: const Text('Réinitialiser les paramètres'),
),
),
],
);
}
Widget _buildSoundSettings() {
return ListView(
key: const ValueKey('sound'),
padding: const EdgeInsets.all(16.0),
children: [
ListTile(
title: Text('Sound Settings',
style: _textStyle.copyWith(fontSize: 18.0, fontWeight: FontWeight.bold)),
),
ListTile(
title: const Text('Volume'),
trailing: const Icon(Icons.volume_up),
onTap: () {},
),
SwitchListTile(
title: const Text('Notifications'),
value: soundNotification,
onChanged: (value) {
setState(() {
soundNotification = value;
});
},
),
ListTile(
title: const Text('Ringtone'),
trailing: const Icon(Icons.music_note),
onTap: () {},
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 8.0),
child: TextButton(
onPressed: _resetSettings,
style: TextButton.styleFrom(
padding: const EdgeInsets.symmetric(horizontal: 12.0, vertical: 8.0),
backgroundColor: Colors.grey[200],
foregroundColor: Colors.black,
),
child: const Text('Réinitialiser les paramètres'),
),
),
],
);
}
Widget _buildLanguageSettings() {
return ListView(
key: const ValueKey('language'),
padding: const EdgeInsets.all(16.0),
children: [
ListTile(
title: Text('Language Settings',
style: _textStyle.copyWith(fontSize: 18.0, fontWeight: FontWeight.bold)),
),
ListTile(
title: const Text('App Language'),
trailing: Text('English', style: _textStyle),
onTap: () {},
),
SwitchListTile(
title: const Text('Preferred Region: US'),
value: languageRegionUS,
onChanged: (value) {
setState(() {
languageRegionUS = value;
});
},
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 8.0),
child: TextButton(
onPressed: _resetSettings,
style: TextButton.styleFrom(
padding: const EdgeInsets.symmetric(horizontal: 12.0, vertical: 8.0),
backgroundColor: Colors.grey[200],
foregroundColor: Colors.black,
),
child: const Text('Réinitialiser les paramètres'),
),
),
],
); );
} }
} }