Compare commits
No commits in common. "feature/game" and "main" have entirely different histories.
feature/ga
...
main
@ -8,21 +8,22 @@ 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) => UserProvider(
|
create: (context) =>
|
||||||
context.read<LocalUserRepository>(),
|
UserProvider(context.read<LocalUserRepository>()),
|
||||||
),
|
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
child: const MainApp(),
|
child: const MainApp(), // Maintenant MainApp a accès aux providers
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -39,6 +40,7 @@ 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(),
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
import 'package:equatable/equatable.dart';
|
|
||||||
|
|
||||||
abstract class Game extends Equatable {}
|
|
@ -32,10 +32,15 @@ class SettingsProvider with ChangeNotifier {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void changeThemeColor(Color color) {
|
void changeThemeColor(Color color) {
|
||||||
_state = _state.copyWith(
|
_state = _state.copyWith(theme: _state.theme.copyWith(primaryColor: color));
|
||||||
theme: _state.theme.copyWith(primaryColor: color),
|
|
||||||
);
|
|
||||||
|
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void reset() {
|
||||||
|
_state = _state.copyWith(theme: ThemeData.dark());
|
||||||
|
_state = _state.copyWith(
|
||||||
|
theme: _state.theme.copyWith(primaryColor: Colors.blue));
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,6 @@ class SettingsState extends Equatable {
|
|||||||
return SettingsState(
|
return SettingsState(
|
||||||
theme: ThemeData.dark().copyWith(
|
theme: ThemeData.dark().copyWith(
|
||||||
primaryColor: Colors.blue,
|
primaryColor: Colors.blue,
|
||||||
pageTransitionsTheme: pageTransitionTheme,
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -19,35 +18,9 @@ class SettingsState extends Equatable {
|
|||||||
@override
|
@override
|
||||||
List<Object?> get props => [theme];
|
List<Object?> get props => [theme];
|
||||||
|
|
||||||
SettingsState copyWith({
|
SettingsState copyWith({ThemeData? theme}) {
|
||||||
ThemeData? theme,
|
|
||||||
}) {
|
|
||||||
return SettingsState(
|
return SettingsState(
|
||||||
theme: theme?.copyWith(pageTransitionsTheme: pageTransitionTheme) ??
|
theme: theme ?? this.theme,
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,261 @@
|
|||||||
|
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';
|
||||||
|
|
||||||
class MyWidget extends StatelessWidget {
|
enum SettingStateEnum { appearance, sound, language }
|
||||||
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 const Center(
|
return Scaffold(
|
||||||
child: Text('Settings - Old'),
|
appBar: AppBar(
|
||||||
|
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'),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user