diff --git a/android/gradle.properties b/android/gradle.properties index 24d6ef87a0f500a457d89af29b7beaad6d91075f..3c7c2e70ab4354f351f91597ca2347851797bdb8 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,5 +1,5 @@ org.gradle.jvmargs=-Xmx1536M android.useAndroidX=true android.enableJetifier=true -app.versionName=0.1.9 -app.versionCode=33 +app.versionName=0.1.10 +app.versionCode=34 diff --git a/lib/main.dart b/lib/main.dart index 900d8ea449b856418ec92a062a27d67c0979c4ee..7c10b0908914b84e0fd7b0303ffc268f66d4d498 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -5,6 +5,7 @@ import 'package:flutter/services.dart'; import 'provider/data.dart'; import 'screens/home.dart'; import 'screens/game_pick_word.dart'; +import 'screens/game_pick_image.dart'; void main() { WidgetsFlutterBinding.ensureInitialized(); @@ -35,6 +36,13 @@ class MyApp extends StatelessWidget { } break; + case '/game-pick-image': { + return MaterialPageRoute( + builder: (context) => GamePickImagePage(), + ); + } + break; + default: { print("Unknown menu entry"); } break; } diff --git a/lib/screens/game_pick_image.dart b/lib/screens/game_pick_image.dart new file mode 100644 index 0000000000000000000000000000000000000000..da62fe7ff6c389a22c16d6106a34f7cf60986fe5 --- /dev/null +++ b/lib/screens/game_pick_image.dart @@ -0,0 +1,306 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import '../provider/data.dart'; +import '../utils/random_pick_data.dart'; + +class GamePickImagePage extends StatelessWidget { + int _countWords = 4; + int _countImages = 1; + + Future<void> startGame(Data myProvider, String lang) async { + await resetGame(myProvider); + myProvider.updateLang = lang; + await nextWord(myProvider); + } + + Future<void> resetGame(Data myProvider) async { + myProvider.updateLang = ''; + myProvider.updateQuestionsCount = 0; + myProvider.updateGoodAnswers = 0; + myProvider.updateWrongAnswers = 0; + myProvider.updateWord = null; + myProvider.updateImages = null; + } + + Future<void> nextWord(Data myProvider) async { + await pickData(myProvider); + myProvider.updateQuestionsCount = myProvider.questionsCount + 1; + } + + Future<void> pickData(Data myProvider) async { + List words; + RandomPickData randomPickData; + Map word; + + int attempts = 0; + do { + randomPickData = RandomPickData(); + await randomPickData.init(myProvider.lang, _countWords, _countImages); + + if (randomPickData.words != null) { + words = randomPickData.words; + word = words.take(1).toList()[0]; + } + attempts++; + } while (attempts < 3); + + if ((words != null) && (words.length == _countWords)) { + myProvider.updateWord = word; + myProvider.updateImages = words; + } + } + + Future<void> checkWord(Data myProvider, word) async { + if (myProvider.word['key'] == word['key']) { + myProvider.updateGoodAnswers = myProvider.goodAnswers + 1; + nextWord(myProvider); + } else { + myProvider.updateWrongAnswers = myProvider.wrongAnswers + 1; + } + } + + Container _buildScoreItemContainer(String text, Color blockColor) { + Color backgroundColor = blockColor; + + // Darken block color to get border color + double amount = 0.2; + final hsl = HSLColor.fromColor(blockColor); + final hslDark = hsl.withLightness((hsl.lightness - amount).clamp(0.0, 1.0)); + Color borderColor = hslDark.toColor(); + + return Container( + margin: EdgeInsets.symmetric(horizontal: 15), + padding: EdgeInsets.all(5), + decoration: BoxDecoration( + color: backgroundColor, + borderRadius: BorderRadius.circular(4), + border: Border.all( + color: borderColor, + width: 4, + ), + ), + child: Text( + text, + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.w600, + color: Colors.black, + ), + ), + ); + } + + Container _buildScoreContainer(Data myProvider) { + return Container( + padding: EdgeInsets.all(5), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + _buildScoreItemContainer( + 'β ' + myProvider.questionsCount.toString(), + Colors.white, + ), + SizedBox(width: 20), + _buildScoreItemContainer( + 'βΊοΈ ' + myProvider.goodAnswers.toString(), + Colors.green, + ), + SizedBox(width: 20), + _buildScoreItemContainer( + 'π ' + myProvider.wrongAnswers.toString(), + Colors.orange, + ), + ], + ), + ); + } + + Container _buildImageContainer(Data myProvider, Map word) { + double imageSize = 130; + + String imageAsset = 'assets/placeholder.png'; + if ((word['images'] != null) && (word['images'][0] != null)) { + imageAsset = 'assets/images/'+word['images'][0]; + } + + return Container( + child: FlatButton( + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all( + color: Colors.teal, + width: 8, + ), + ), + margin: EdgeInsets.all(2), + child: Image( + image: AssetImage(imageAsset), + width: imageSize, + height: imageSize, + fit: BoxFit.fill + ), + ), + onPressed: () { checkWord(myProvider, word); }, + ), + ); + } + + Column _buildImageItemsBlock(Data myProvider) { + List words = myProvider.images; + + if ((words == null) || (words.length != _countWords)) { + return Column(); + } + + words.sort((a, b) => a['key'].compareTo(b['key'])); + + return Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + _buildImageContainer(myProvider, words[0]), + _buildImageContainer(myProvider, words[1]), + ], + ), + Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + _buildImageContainer(myProvider, words[2]), + _buildImageContainer(myProvider, words[3]), + ], + ) + ], + ); + } + + Column _buildTextItemBlock(Data myProvider) { + Map word = myProvider.word; + + if (word == null) { + return Column(); + } + + return Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + margin: EdgeInsets.all(2), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(6), + border: Border.all( + color: Colors.white, + width: 6, + ), + ), + child: RaisedButton( + color: Colors.green, + padding: EdgeInsets.all(15), + child: Text( + word != null ? word[myProvider.lang] : '', + style: TextStyle( + fontSize: 30, + fontWeight: FontWeight.w600, + color: Colors.white, + ), + ), + ), + ), + ], + ); + } + + Column _buildStartGameBlock(Data myProvider) { + return Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + child: RaisedButton( + color: Colors.teal, + padding: EdgeInsets.all(35), + child: Text( + "π«π·", + style: TextStyle( + fontSize: 60, + color: Colors.black, + ), + ), + onPressed: () => startGame(myProvider, 'fr'), + ), + ), + SizedBox(height: 15), + Container( + child: RaisedButton( + color: Colors.teal, + padding: EdgeInsets.all(35), + child: Text( + "π¬π§", + style: TextStyle( + fontSize: 60, + color: Colors.black, + ), + ), + onPressed: () => startGame(myProvider, 'en'), + ), + ) + ], + ); + } + + @override + Widget build(BuildContext context) { + Data _myProvider = Provider.of<Data>(context); + + Scaffold pageContent = Scaffold( + appBar: AppBar( + elevation: 0, + actions: <Widget>[ + IconButton( + icon: const Icon(Icons.loop), + onPressed: () => resetGame(_myProvider), + ), + ], + ), + backgroundColor: Colors.blue, + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.max, + children: <Widget>[ + _buildTextItemBlock(_myProvider), + SizedBox(height: 2), + ((_myProvider.word == null) || (_myProvider.word['key'] == '')) ? + _buildStartGameBlock(_myProvider) : + _buildScoreContainer(_myProvider), + SizedBox(height: 2), + _buildImageItemsBlock(_myProvider), + ], + ), + ), + ); + + return SizedBox.expand( + child: Container( + child: FittedBox( + fit: BoxFit.contain, + alignment: Alignment.center, + child: SizedBox( + height: (MediaQuery.of(context).size.height), + width: (MediaQuery.of(context).size.width), + child: pageContent, + ) + ) + ) + ); + } +} diff --git a/lib/screens/home.dart b/lib/screens/home.dart index dcda72875720e540257c6d04e12db91ac7599ee8..bbdd1c98ac8aa292c0f840334339f46bdd5b1ae6 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -35,6 +35,23 @@ class Home extends StatelessWidget { ); }, ), + FlatButton( + color: Colors.green, + padding: EdgeInsets.all(15), + child: Text( + 'π¬οΈ β‘οΈ πΌ', + style: Theme.of(context) + .textTheme + .display1 + .copyWith(color: Colors.white), + ), + onPressed: () { + Navigator.pushNamed( + context, + '/game-pick-image', + ); + }, + ), ], ), ),