diff --git a/lib/main.dart b/lib/main.dart index 3dd8394..b159033 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -8,6 +8,7 @@ import 'package:mensaapp/providers/essenProvider.dart'; import 'package:mensaapp/providers/languageProvider.dart'; import 'package:mensaapp/providers/pageProvider.dart'; import 'package:mensaapp/providers/serviceProvider.dart'; +import 'package:mensaapp/providers/spaceProvider.dart'; import 'package:mensaapp/providers/spezielleErnaehrungProvider.dart'; import 'package:provider/provider.dart'; import 'dart:convert'; @@ -45,6 +46,9 @@ class MyApp extends StatelessWidget { ), ChangeNotifierProvider( create: (context) => LanguageProvider(), + ), + ChangeNotifierProvider( + create: (context) => SpaceProvider(), ) ], child: MaterialApp( @@ -71,46 +75,6 @@ class MyApp extends StatelessWidget { class MyHome extends StatelessWidget { const MyHome({super.key}); - void _showDeleteDialog(BuildContext context) { - showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), - ), - title: Text(Provider.of(context, listen: false).languageData[Provider.of(context, listen: false).language]["floating"]["delete"]["title"]), - content: Text(Provider.of(context, listen: false).languageData[Provider.of(context, listen: false).language]["floating"]["delete"]["info"], - style: TextStyle(fontSize: 18),), - actions: [ - ElevatedButton( - onPressed: () { - Navigator.of(context).pop(); - }, - child: Text(Provider.of(context, listen: false).languageData[Provider.of(context, listen: false).language]["floating"]["delete"]["keep"]), - style: ElevatedButton.styleFrom( - backgroundColor: Theme.of(context).colorScheme.secondary - ), - ), - ElevatedButton( - onPressed: () { - Provider.of(context, listen: false).resetAllFields(); - Provider.of(context, listen: false).resetAllFields(); - Provider.of(context, listen: false).resetAllFields(); - Provider.of(context, listen: false).resetAllFields(); - Provider.of(context, listen: false).resetAllFields(); - Provider.of(context, listen: false).resetSelectedEssen(); - - // Hier Aktion für Löschen ausführen - Navigator.of(context).pop(); // Dialog schließen - }, - child: Text(Provider.of(context, listen: false).languageData[Provider.of(context, listen: false).language]["floating"]["delete"]["del"]), - ) - ], - ); - }, - ); - } @override Widget build(BuildContext context) { diff --git a/lib/pages/pageEssenSelect.dart b/lib/pages/pageEssenSelect.dart index 3ebe0d6..9a1fe1d 100644 --- a/lib/pages/pageEssenSelect.dart +++ b/lib/pages/pageEssenSelect.dart @@ -45,9 +45,9 @@ class PageEssenSelect extends StatelessWidget { children: [ for (int i = 0; i < menus.length; i++) FilledButton.icon( - style: ButtonStyle(padding: WidgetStatePropertyAll(EdgeInsets.all(60))), + style: ButtonStyle(padding: WidgetStatePropertyAll(EdgeInsets.all(40))), icon: const Icon(Icons.fastfood_outlined), - label: Text("Essen ${i + 1}: ${menus[i]}", style: TextStyle(fontSize: 23),), + label: Text("Essen ${i + 1}: ${menus[i]}", style: TextStyle(fontSize: 20),), onPressed: () { Provider.of(context, listen: false).setSelectedEssen(i + 1, "Essen ${i + 1}: ${menus[i]}"); }, diff --git a/lib/providers/spaceProvider.dart b/lib/providers/spaceProvider.dart new file mode 100644 index 0000000..09ef299 --- /dev/null +++ b/lib/providers/spaceProvider.dart @@ -0,0 +1,17 @@ +import 'package:flutter/cupertino.dart'; +import 'package:mensaapp/spaces/spaceHome.dart'; +import 'package:mensaapp/spaces/spaceRate.dart'; + +class SpaceProvider extends ChangeNotifier { + var selectedSpace = 0; + + var spaces = [ + const SpaceHome(), + const SpaceRate() + ]; + + void setSelectedSpace(int index) { + selectedSpace = index; + notifyListeners(); + } +} \ No newline at end of file diff --git a/lib/spaces/spaceHome.dart b/lib/spaces/spaceHome.dart new file mode 100644 index 0000000..511fd9d --- /dev/null +++ b/lib/spaces/spaceHome.dart @@ -0,0 +1,96 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:mensaapp/providers/spaceProvider.dart'; +import 'package:provider/provider.dart'; + +class SpaceHome extends StatefulWidget { + const SpaceHome({super.key}); + + @override + State createState() => _SpaceHomeState(); +} + +class _SpaceHomeState extends State { + //TODO: in languageProvider + var tempTexts = [ + "Bewerte jetzt deine DHBW-Kantine...", + "Rate your DHBW canteen now...", + "Évaluez votre cantine DHBW maintenant..." + ]; + + //TODO: END-TODO + + late Timer _timer; + late String text = ""; + var index = 0; + + @override + void initState() { + text = tempTexts[0]; + super.initState(); + _timer = Timer.periodic( + const Duration(seconds: 5), + (timer) { + setState(() { + text = tempTexts[index]; + index = (index + 1 >= tempTexts.length ? 0 : index + 1); + }); + }, + ); + } + + @override + void dispose() { + _timer.cancel(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: GestureDetector( + onTap: () { + Provider.of(context, listen: false).setSelectedSpace(1); + }, + child: Stack( + children: [ + Center( + child: Container( + width: 1600, + height: 750, + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage("assets/backgrounds/Essen.jpg"), + fit: BoxFit.cover, // Deckt den gesamten Bildschirm ab + colorFilter: ColorFilter.mode( + Colors.white.withOpacity(0.2), + BlendMode.dstATop, + ), + ), + ), + ), + ), + Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + text, + style: TextStyle( + fontSize: 70, + fontWeight: FontWeight.bold, + color: Theme.of(context).colorScheme.primary), + ), + const SizedBox(height: 40,), + Icon(Icons.touch_app, size: 150, color: Colors.black.withOpacity(0.5),) + ], + ), + ) + ], + ), + ), + ); + } +} diff --git a/lib/spaces/spaceRate.dart b/lib/spaces/spaceRate.dart new file mode 100644 index 0000000..36e1106 --- /dev/null +++ b/lib/spaces/spaceRate.dart @@ -0,0 +1,247 @@ +import 'package:flutter/material.dart'; +import 'package:google_nav_bar/google_nav_bar.dart'; +import 'package:mensaapp/providers/spaceProvider.dart'; +import 'package:provider/provider.dart'; + +import '../providers/ambienteProvider.dart'; +import '../providers/anmerkungProvider.dart'; +import '../providers/essenProvider.dart'; +import '../providers/languageProvider.dart'; +import '../providers/pageProvider.dart'; +import '../providers/serviceProvider.dart'; +import '../providers/spezielleErnaehrungProvider.dart'; + +class SpaceRate extends StatelessWidget { + const SpaceRate({super.key}); + + void _showDeleteDialog(BuildContext context) { + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + ), + title: Text(Provider.of(context, listen: false).languageData[Provider.of(context, listen: false).language]["floating"]["delete"]["title"]), + content: Text(Provider.of(context, listen: false).languageData[Provider.of(context, listen: false).language]["floating"]["delete"]["info"], + style: TextStyle(fontSize: 18),), + actions: [ + ElevatedButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: Text(Provider.of(context, listen: false).languageData[Provider.of(context, listen: false).language]["floating"]["delete"]["keep"]), + style: ElevatedButton.styleFrom( + backgroundColor: Theme.of(context).colorScheme.secondary + ), + ), + ElevatedButton( + onPressed: () { + Provider.of(context, listen: false).resetAllFields(); + Provider.of(context, listen: false).resetAllFields(); + Provider.of(context, listen: false).resetAllFields(); + Provider.of(context, listen: false).resetAllFields(); + Provider.of(context, listen: false).resetAllFields(); + Provider.of(context, listen: false).resetSelectedEssen(); + Provider.of(context, listen: false).setSelectedSpace(0); + + // Hier Aktion für Löschen ausführen + Navigator.of(context).pop(); // Dialog schließen + }, + child: Text(Provider.of(context, listen: false).languageData[Provider.of(context, listen: false).language]["floating"]["delete"]["del"]), + ) + ], + ); + }, + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: IconButton( + icon: Icon( + Icons.home_rounded, + size: 36, + color: Theme.of(context).colorScheme.onPrimary, + ), + onPressed: () { + Provider.of(context, listen: false).resetAllFields(); + Provider.of(context, listen: false).resetAllFields(); + Provider.of(context, listen: false).resetAllFields(); + Provider.of(context, listen: false).resetAllFields(); + Provider.of(context, listen: false).resetAllFields(); + Provider.of(context, listen: false).resetSelectedEssen(); + Provider.of(context, listen: false).setSelectedSpace(0); + }, + ), + title: Consumer( + // Consumer verwenden, um den dynamischen Titel anzuzeigen + builder: (context, pageProvider, child) { + return Container( + height: 40, + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.primaryContainer, + borderRadius: BorderRadius.circular(15), + ), + alignment: Alignment.centerLeft, + child: Text( + pageProvider.titleString[pageProvider.selectedPage], + // Hier wird der dynamische Titel angezeigt + style: TextStyle( + color: Theme.of(context).colorScheme.onPrimary, + fontWeight: FontWeight.bold, + ), + ), + ); + }, + ), + backgroundColor: Theme.of(context).colorScheme.primary, + actions: [ + IconButton( + icon: Opacity( + opacity: Provider.of(context).language == "de" + ? 1.0 // Voll sichtbar + : 0.4, // Halb durchsichtig + child: Image.asset( + 'assets/flags/de.png', + width: 34, + height: 24, + fit: BoxFit.cover, + ), + ), + onPressed: () { + Provider.of(context, listen: false) + .setLanguage("de"); + }, + ), + IconButton( + icon: Opacity( + opacity: Provider.of(context).language == "en" + ? 1.0 // Voll sichtbar + : 0.4, // Halb durchsichtig + child: Image.asset( + 'assets/flags/en.png', + width: 34, + height: 24, + fit: BoxFit.cover, + ), + ), + onPressed: () { + Provider.of(context, listen: false) + .setLanguage("en"); + }, + ), + IconButton( + icon: Opacity( + opacity: Provider.of(context).language == "fr" + ? 1.0 // Voll sichtbar + : 0.4, // Halb durchsichtig + child: Image.asset( + 'assets/flags/fr.png', + width: 34, + height: 24, + fit: BoxFit.cover, + ), + ), + onPressed: () { + Provider.of(context, listen: false) + .setLanguage("fr"); + }, + ), + ], + ), + body: Consumer( + builder: (context, pageProvider, child) { + return Stack( + children: [ + pageProvider.pages[pageProvider.selectedPage], + Positioned( + left: 10, + bottom: 10, + child: IconButton.filled( + padding: const EdgeInsets.all(15), + onPressed: () { + _showDeleteDialog(context); // Dialog anzeigen + }, + icon: const Icon( + Icons.delete, + size: 30, + ), + style: ButtonStyle( + shape: WidgetStateProperty.all(RoundedRectangleBorder( + borderRadius: BorderRadius.circular(17))), + backgroundColor: WidgetStateProperty.all( + Theme.of(context).colorScheme.primary, + ), + ), + ), + ) + ], + ); + }, + ), + floatingActionButton: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Text( + "* Pflichtfeld", + style: TextStyle(fontSize: 15), + ), + const SizedBox( + height: 10, + ), + FloatingActionButton.extended( + onPressed: () {}, + label: const Text( + "Absenden", + style: TextStyle(fontSize: 20), + ), + icon: const Icon(Icons.send), + ) + ], + ), + bottomNavigationBar: Container( + color: Theme.of(context).colorScheme.secondary, + child: Padding( + padding: const EdgeInsets.all(5), + child: GNav( + onTabChange: (index) { + Provider.of(context, listen: false) + .changePage(index); + }, + gap: 8, + style: GnavStyle.google, + backgroundColor: Colors.transparent, + color: Theme.of(context).colorScheme.onSurface, + activeColor: Theme.of(context).colorScheme.onPrimary, + tabBackgroundColor: Theme.of(context).colorScheme.primary, + tabs: const [ + GButton( + icon: Icons.fastfood_outlined, + text: "Essen", + ), + GButton( + icon: Icons.chair, /* prev: landscape*/ + text: "Ambiente", + ), + GButton( + icon: Icons.mood, + text: "Service", + ), + GButton( + icon: Icons.feedback, + text: "Anmerkungen", + ), + GButton( + icon: Icons.grass, + text: "Spezielle Ernährung", + ), + ], + ), + ), + ), + ); + } +}