From d04ebf2d457c6feaddec36c221f7309b700dcfb6 Mon Sep 17 00:00:00 2001 From: Sidney Nimako Date: Thu, 18 Jun 2020 16:19:03 -0500 Subject: [PATCH 1/7] Added loading --- lib/main.dart | 176 ++++++++++++++++++++++++++++---------------------- 1 file changed, 97 insertions(+), 79 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 921a372..e28f6d7 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -12,36 +12,69 @@ class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { - return MaterialApp( - title: 'Four Fours', + title: 'Four Fours', debugShowCheckedModeBanner: false, theme: ThemeData( primarySwatch: Colors.blue, ), - home: MyHomePage(title: 'Four Fours'), + home: Menu() +// home: MyHomePage(title: 'Four Fours'), + ); + } +} + +class Menu extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Container( + color: Color(0xffCED4CC), + child: Column( + children: [ + FlatButton(onPressed: null, child: Text("Play")), + FlatButton(onPressed: null, child: Text("Arcade")), + FlatButton(onPressed: null, child: Text("Help")), + FlatButton(onPressed: null, child: Text("About")), + ], + ), ); } } + +class LoadingScreen extends StatelessWidget { + @override + Widget build(BuildContext context) { + return new Container( + color: Color(0xffCED4CC), + child: Center( + child: Image(image: AssetImage("assets/images/logo.gif"), height: 200.0), + ) + ); + } +} + + class MyHomePage extends StatefulWidget { - MyHomePage({Key key, this.title}) : super(key: key); + MyHomePage({ + Key key, + this.title + }): super(key: key); final String title; @override _MyHomePageState createState() => _MyHomePageState(); } -class _MyHomePageState extends State { +class _MyHomePageState extends State < MyHomePage > { int _counter = 4; String _value = ""; int _goal = 0; int _score; int _computation; - Widget _body; - bool _hide = false; + String _alert = ""; - Color orange = Color(0xffEE6E48); + Color orange = Color(0xffEE6E48); Color darkGrey = Color(0xff565C5C); Color lightGrey = Color(0xffCCD2C6); Timer _timer; @@ -49,12 +82,13 @@ class _MyHomePageState extends State { @override void initState() { super.initState(); - _body = loadingPage(); +// _body = loadingPage(); +// _body = gamePage(); } void _plus() { setState(() { - _value+= "+"; + _value += "+"; }); } @@ -76,7 +110,7 @@ class _MyHomePageState extends State { void _exp() { setState(() { - _value+= "^"; + _value += "^"; }); } @@ -88,19 +122,19 @@ class _MyHomePageState extends State { void _minus() { setState(() { - _value+="-"; + _value += "-"; }); } void _div() { setState(() { - _value+="\u00F7"; + _value += "\u00F7"; }); } void _mult() { setState(() { - _value+="x"; + _value += "x"; }); } @@ -112,13 +146,13 @@ class _MyHomePageState extends State { void _openParen() { setState(() { - _value+="("; + _value += "("; }); } void _closeParen() { setState(() { - _value+=")"; + _value += ")"; }); } @@ -144,8 +178,8 @@ class _MyHomePageState extends State { _updateScore(_goal); _clear(); } else { - if(_counter != 0) { - _alert="You must use 4 fours"; + if (_counter != 0) { + _alert = "You must use 4 fours"; _value += "=$_computation"; } else { _alert = "Try Again!"; @@ -169,62 +203,58 @@ class _MyHomePageState extends State { void _backspace() { setState(() { int len = _value.length; - if (int.tryParse(_value.substring(len-1)) != null) { + if (int.tryParse(_value.substring(len - 1)) != null) { _counter++; } - _value = _value.substring(0, len-1); + _value = _value.substring(0, len - 1); }); } - void hide() { - setState(() { - while(true) { - if (!(_score == null)) { - _hide = false; + Future _minTime = Future.delayed( + Duration(seconds: 4), + () => true + ); - break; - } else { - _hide = true; - } - } - }); - } - - void startTimer(int t) { - _timer = Timer(new Duration(seconds: t), hide); - } @override Widget build(BuildContext context) { Flame.audio.load('correct.mp3'); - _loadPage(); SystemChrome.setEnabledSystemUIOverlays([]); - return new Scaffold( + _loadPage(); + return FutureBuilder( + future: _minTime, + builder: (BuildContext context, AsyncSnapshot snapshot) { + Widget _body; + if (snapshot.hasData) { + _body = gamePage(); + } + else { + _body = new Container( + color: Color(0xffCED4CC), + child: Center( + child: Image(image: AssetImage("assets/images/logo.gif"), height: 200.0), + ) + ); + } + return new Scaffold( backgroundColor: Color(0xffCED4CC), body: _body + ); + }, ); - startTimer(4); -// return new AnimatedOpacity( -// opacity: _hide ? 0.0 : 1.0, -// duration: Duration(milliseconds: 500), -// child: SplashScreen( -// seconds: 4, -// navigateAfterSeconds: new Scaffold( -// backgroundColor: Color(0xffCED4CC), -// body: _body -// ), -// image: new Image(image: AssetImage("assets/images/logo.gif")), -// backgroundColor: Color(0xffCED4CC), -// loaderColor: orange, -// ) -// ); +// startTimer(4); + //return new Scaffold( + //backgroundColor: Color(0xffCED4CC), + //body: gamePage(), + //); + } Widget genRow(String t1, Function f1, String t2, Function f2, String t3, Function f3) { return Row( - children: [ + children: < Widget > [ newButton(t1, f1, lightGrey, darkGrey), newButton(t2, f2, lightGrey, darkGrey), newButton(t3, f3, lightGrey, darkGrey), @@ -239,20 +269,11 @@ class _MyHomePageState extends State { shape: RoundedRectangleBorder( borderRadius: new BorderRadius.circular(18.0)), onPressed: f, - child: Text("$text", style: TextStyle(fontSize: 24, color: textColor),), - padding: EdgeInsets.all(15),); + child: Text("$text", style: TextStyle(fontSize: 24, color: textColor), ), + padding: EdgeInsets.all(15), ); } - Widget loadingPage() { - return new Center( - child: Column( - children: [ - CircularProgressIndicator(), -// Image(image: AssetImage("assets/images/logo.gif")), - ], - ) - ); - } + Widget gamePage() { return Padding( @@ -262,25 +283,25 @@ class _MyHomePageState extends State { .height * 0.08), child: Center( child: Column( -// mainAxisAlignment: MainAxisAlignment.center, - children: [ + // mainAxisAlignment: MainAxisAlignment.center, + children: < Widget > [ Row( - children: [ + children: < Widget > [ Column( - children: [ + children: < Widget > [ Text("Goal:"), Text('$_goal', - style: Theme.of(context).textTheme.display2,), + style: Theme.of(context).textTheme.display2, ), ], ), Column( - children: [ + children: < Widget > [ Text("Highscore:"), Text('$_score', style: Theme .of(context) .textTheme - .display2,), + .display2, ), ], ), ], @@ -327,7 +348,7 @@ class _MyHomePageState extends State { textAlign: TextAlign.center, ), -// Text('$_alert'), + // Text('$_alert'), SizedBox( height: 500, width: MediaQuery @@ -336,7 +357,7 @@ class _MyHomePageState extends State { .width * 0.88, child: Column( mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ + children: < Widget > [ genRow("²", _squared, ".", _decimal, "<", _backspace), genRow("+", _plus, "-", _minus, "(", _openParen), genRow("4", _four, "=", _equals, "C", _clear), @@ -354,9 +375,6 @@ class _MyHomePageState extends State { _loadPage() async { await _getScore(); - setState(() { - _body = gamePage(); - }); } @@ -382,4 +400,4 @@ class _MyHomePageState extends State { super.dispose(); _timer.cancel(); } -} +} \ No newline at end of file From c4f726cf4ac01ed51967583a4a876712bb1aafe9 Mon Sep 17 00:00:00 2001 From: Sidney Nimako Date: Thu, 18 Jun 2020 17:15:35 -0500 Subject: [PATCH 2/7] Navigation dev --- assets/images/logo.png | Bin 0 -> 64213 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/images/logo.png diff --git a/assets/images/logo.png b/assets/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1375a08c61c8f2f8d5d86c06a79e6d578ecfdc8d GIT binary patch literal 64213 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 Date: Thu, 18 Jun 2020 22:36:59 -0500 Subject: [PATCH 3/7] Navigation completed, UI design of menu and help --- lib/MathEngine.dart | 26 ++++---- lib/main.dart | 154 +++++++++++++++++++++++++++++++++++--------- pubspec.yaml | 1 + 3 files changed, 135 insertions(+), 46 deletions(-) diff --git a/lib/MathEngine.dart b/lib/MathEngine.dart index 6cd4d7c..15b9a6b 100644 --- a/lib/MathEngine.dart +++ b/lib/MathEngine.dart @@ -57,6 +57,7 @@ String postfix(String equation) { if (equation.substring(0, 1) == ")") { do { output.addLast(operators.removeFirst()); + output.addLast(" "); } while (operators.first != "("); operators.removeFirst(); @@ -94,7 +95,6 @@ String postfix(String equation) { while (output.isNotEmpty) { out += output.removeFirst(); } - print(out); return out; } @@ -107,7 +107,6 @@ double calculatePostfix(String equation) { //Convert equation to array List < String > eq = equation.split(" "); ListQueue < String > operations = new ListQueue < String > (); - for (int i = 0; i < eq.length; i++) { var el = eq[i]; if (double.tryParse(el) != null) { @@ -122,52 +121,49 @@ double calculatePostfix(String equation) { int iterCount = operations.length; for (int j = 0; j < iterCount; j++) { - - var symbol = operations.removeFirst(); switch (symbol) { case "x": double t1 = terms.removeLast(); double t2 = terms.removeLast(); - terms.addLast(t1 * t2); + terms.addFirst(t1 * t2); break; case "÷": double t1 = terms.removeLast(); double t2 = terms.removeLast(); if (t1 < t2) { - terms.addLast(t2 / t1); + terms.addFirst(t2 / t1); } else { - terms.addLast(t1 / t2); + terms.addFirst(t1 / t2); } break; case "+": double t1 = terms.removeLast(); double t2 = terms.removeLast(); - terms.addLast(t1 + t2); + terms.addFirst(t1 + t2); break; case "-": double t2 = terms.removeLast(); double t1 = terms.removeLast(); if (t2 > t1) { - terms.addLast(t2 - t1); + terms.addFirst(t2 - t1); } else { - terms.addLast(t1 - t2); + terms.addFirst(t1 - t2); } break; case "√": double t = terms.removeLast(); - terms.addLast(sqrt(t).toDouble()); + terms.addFirst(sqrt(t).toDouble()); break; case "²": double t = terms.removeLast(); - terms.addLast(t * t); + terms.addFirst(t * t); break; case "!": double t = terms.removeLast(); - terms.addLast(factorial(t)); + terms.addFirst(factorial(t)); break; } - } return terms.removeLast(); @@ -187,5 +183,5 @@ double mathEngine(String s) { void main() { - print(mathEngine("22+22+4+78")); + print(mathEngine("(4+4)-(4+4)")); } \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index e28f6d7..65e595f 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,13 +1,72 @@ import 'dart:async'; import 'package:flame/flame.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'MathEngine.dart'; import 'package:flutter/services.dart'; -import 'package:splashscreen/splashscreen.dart'; void main() => runApp(MyApp()); +Future _minTime = Future.delayed( + Duration(seconds: 2), + () => true +); + +Color textColor = Color(0xff565C5C); +Color backgroundColor = Color(0xffCCD2C6); + + +Widget newButton(String text, Function f) { + return RaisedButton( + color: backgroundColor, + shape: RoundedRectangleBorder( + borderRadius: new BorderRadius.circular(18.0)), + onPressed: f, + child: Text("$text", style: TextStyle(fontSize: 24, color: textColor), ), + padding: EdgeInsets.all(15), + animationDuration: Duration(microseconds: 0), + ); +} + +Widget helpElement(String head, String content) { + return Card( + color: Color(0xffCED4CC), + child: ListTile ( + title: Text("$head", style: TextStyle(fontSize: 24),), + subtitle: Text("$content", softWrap: true, style: TextStyle(fontSize: 18),), + ) + ); +} + +class Help extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body:Container( + color: Color(0xffCED4CC), + child: ListView( + children: [ + Center( + child: Text("Help", style: TextStyle(fontSize: 48, color: textColor)) + ), + helpElement("+", "Addition"), + helpElement("-", "Subtraction"), + helpElement("x", "Multiplication"), + helpElement("÷", "Division"), + helpElement("<", "Backspace"), + helpElement("!", "The ! or factorial is a single number operation. Unlike addition where you need two numbers, factorial only needs one. n! is equal to all the numbers from 1 to n multiplied. For example, 4! = 1 x 2 x 3 x 4 = 24"), + helpElement("²", "\"²\" or the squared operations is a single number operation. Unlike subtraction where you need two numbers, squaring only needs one. Squaring is part of a type of operations called exponentials. n² is equal to the number times it self. For example, 4² = 4 x 4 = 16. In general, an exponential multiplies the number by itself however many times the little number says. For example, 4³ = 4 x 4 x 4 = 64."), + helpElement("^", "The \"^\" is the symbol for exponentials. It is a lot simpler to write a carat then a little number for computers, so we use the carat. The number after the carat works just like the little number. For example, 4^2 = 4² = 4 x 4 = 16 and 4^3 = 4³ = 4 x 4 x 4 = 64."), + helpElement("√", "The √ or square root symbol is the opposite of the ² symbol. Unlike multiplication where you need two numbers, the square root only needs one. The √ asks what number can be multiplied by itself to equal n. For example √4 = 2 because 2² = 2 x 2 = 4") + ], + ), + ), + ); + } +} + + class MyApp extends StatelessWidget { // This widget is the root of your application. @override @@ -18,7 +77,12 @@ class MyApp extends StatelessWidget { theme: ThemeData( primarySwatch: Colors.blue, ), - home: Menu() + home: Menu(), + routes: { + 'Play': (BuildContext context) => MyHomePage(gameType: 1), + 'Arcade': (BuildContext context) => MyHomePage(gameType: 2), + 'Help': (BuildContext context) => Help(), + }, // home: MyHomePage(title: 'Four Fours'), ); } @@ -27,18 +91,51 @@ class MyApp extends StatelessWidget { class Menu extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( - color: Color(0xffCED4CC), - child: Column( - children: [ - FlatButton(onPressed: null, child: Text("Play")), - FlatButton(onPressed: null, child: Text("Arcade")), - FlatButton(onPressed: null, child: Text("Help")), - FlatButton(onPressed: null, child: Text("About")), - ], - ), - ); - } + return FutureBuilder( + future: _minTime, + builder: (BuildContext context, AsyncSnapshot snapshot) { + Widget _body; + if (snapshot.hasData) { + _body = Container( + color: Color(0xffCED4CC), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Image(image: AssetImage("assets/images/logo.png"), height: 200.0), + Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + newButton("Play", () => + Navigator.of(context).pushNamed('Play') + ), + newButton("Arcade", () => + Navigator.of(context).pushNamed('Arcade') + ), + newButton("Learn", () => { + Navigator.of(context).pushNamed('Help') + }), + + + + ], + ) + ], + ), + ); + } else { + _body = new Scaffold ( + backgroundColor: Color(0xffCED4CC), + body: Container( + color: Color(0xffCED4CC), + child: Center( + child: Image(image: AssetImage("assets/images/logo.gif"), height: 200.0), + ) + ) + ); + } + return _body; + }); +} } @@ -58,9 +155,10 @@ class LoadingScreen extends StatelessWidget { class MyHomePage extends StatefulWidget { MyHomePage({ Key key, - this.title + this.gameType }): super(key: key); - final String title; + + final int gameType; @override _MyHomePageState createState() => _MyHomePageState(); @@ -73,17 +171,13 @@ class _MyHomePageState extends State < MyHomePage > { int _score; int _computation; - String _alert = ""; Color orange = Color(0xffEE6E48); Color darkGrey = Color(0xff565C5C); Color lightGrey = Color(0xffCCD2C6); - Timer _timer; @override void initState() { super.initState(); -// _body = loadingPage(); -// _body = gamePage(); } void _plus() { @@ -179,10 +273,8 @@ class _MyHomePageState extends State < MyHomePage > { _clear(); } else { if (_counter != 0) { - _alert = "You must use 4 fours"; _value += "=$_computation"; } else { - _alert = "Try Again!"; _value += "=$_computation"; } } @@ -192,7 +284,6 @@ class _MyHomePageState extends State < MyHomePage > { void _four() { setState(() { if (_counter == 0) { - _alert = "Only 4 Fours allowed!!"; } else { _value += "4"; _counter--; @@ -210,10 +301,7 @@ class _MyHomePageState extends State < MyHomePage > { }); } - Future _minTime = Future.delayed( - Duration(seconds: 4), - () => true - ); + @@ -265,12 +353,15 @@ class _MyHomePageState extends State < MyHomePage > { Widget newButton(String text, Function f, Color backgroundColor, Color textColor) { - return RaisedButton(color: backgroundColor, + return RaisedButton( + color: backgroundColor, shape: RoundedRectangleBorder( borderRadius: new BorderRadius.circular(18.0)), onPressed: f, child: Text("$text", style: TextStyle(fontSize: 24, color: textColor), ), - padding: EdgeInsets.all(15), ); + padding: EdgeInsets.all(15), + animationDuration: Duration(microseconds: 0), + ); } @@ -375,7 +466,9 @@ class _MyHomePageState extends State < MyHomePage > { _loadPage() async { await _getScore(); - + if (widget.gameType == 1) { //Normal + _goal = _score + 1; + } } _getScore() async { @@ -398,6 +491,5 @@ class _MyHomePageState extends State < MyHomePage > { @override void dispose() { super.dispose(); - _timer.cancel(); } } \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index f3233b1..57ee753 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -78,3 +78,4 @@ flutter: assets: - assets/audio/correct.mp3 - assets/images/logo.gif + - assets/images/logo.png From 9171d2a9fa380f2b5a99cabf4ea24247802839da Mon Sep 17 00:00:00 2001 From: Sidney NiBo Date: Sat, 20 Jun 2020 17:22:41 -0500 Subject: [PATCH 4/7] Final --- .flutter-plugins-dependencies | 2 +- .gitignore | 144 +-- .metadata | 20 +- README.md | 32 +- android/app/build.gradle | 134 +-- android/app/src/debug/AndroidManifest.xml | 14 +- android/app/src/main/AndroidManifest.xml | 70 +- .../main/kotlin/snibo/four/MainActivity.kt | 26 +- .../main/res/drawable/launch_background.xml | 24 +- android/app/src/main/res/values/styles.xml | 16 +- android/app/src/profile/AndroidManifest.xml | 14 +- android/build.gradle | 62 +- android/gradle.properties | 4 +- .../gradle/wrapper/gradle-wrapper.properties | 12 +- android/settings.gradle | 30 +- ios/Flutter/AppFrameworkInfo.plist | 52 +- ios/Flutter/Debug.xcconfig | 2 +- ios/Flutter/Release.xcconfig | 2 +- ios/Flutter/flutter_export_environment.sh | 11 + ios/Runner.xcodeproj/project.pbxproj | 1042 ++++++++-------- .../contents.xcworkspacedata | 14 +- .../xcshareddata/xcschemes/Runner.xcscheme | 182 +-- .../contents.xcworkspacedata | 14 +- ios/Runner/AppDelegate.swift | 26 +- .../AppIcon.appiconset/Contents.json | 244 ++-- .../LaunchImage.imageset/Contents.json | 46 +- .../LaunchImage.imageset/README.md | 8 +- ios/Runner/Base.lproj/LaunchScreen.storyboard | 74 +- ios/Runner/Base.lproj/Main.storyboard | 52 +- ios/Runner/Info.plist | 90 +- lib/MathEngine.dart | 434 ++++--- lib/MathString.dart | 394 +++---- lib/Old UI.dart | 90 +- lib/app_state.dart | 30 +- lib/app_state_container.dart | 138 +-- lib/audio.dart | 46 +- lib/dataAccess.dart | 100 +- lib/db.dart | 76 +- lib/main.dart | 1047 +++++++++-------- lib/storage.dart | 26 +- pubspec.lock | 169 ++- pubspec.yaml | 162 +-- test/widget_test.dart | 60 +- 43 files changed, 2728 insertions(+), 2507 deletions(-) create mode 100644 ios/Flutter/flutter_export_environment.sh diff --git a/.flutter-plugins-dependencies b/.flutter-plugins-dependencies index 8b70634..d144e75 100644 --- a/.flutter-plugins-dependencies +++ b/.flutter-plugins-dependencies @@ -1 +1 @@ -{"_info":"// This is a generated file; do not edit or check into version control.","dependencyGraph":[{"name":"audioplayers","dependencies":["path_provider"]},{"name":"path_provider","dependencies":[]},{"name":"shared_preferences","dependencies":["shared_preferences_macos","shared_preferences_web"]},{"name":"shared_preferences_macos","dependencies":[]},{"name":"shared_preferences_web","dependencies":[]}]} \ No newline at end of file +{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"audioplayers","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\audioplayers-0.15.1\\\\","dependencies":["path_provider"]},{"name":"path_provider","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\path_provider-1.6.11\\\\","dependencies":[]},{"name":"shared_preferences","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences-0.5.7+3\\\\","dependencies":[]},{"name":"url_launcher","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\url_launcher-5.4.11\\\\","dependencies":[]}],"android":[{"name":"audioplayers","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\audioplayers-0.15.1\\\\","dependencies":["path_provider"]},{"name":"path_provider","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\path_provider-1.6.11\\\\","dependencies":[]},{"name":"shared_preferences","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences-0.5.7+3\\\\","dependencies":[]},{"name":"url_launcher","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\url_launcher-5.4.11\\\\","dependencies":[]}],"macos":[{"name":"audioplayers","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\audioplayers-0.15.1\\\\","dependencies":[]},{"name":"path_provider_macos","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\path_provider_macos-0.0.4+3\\\\","dependencies":[]},{"name":"shared_preferences_macos","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences_macos-0.0.1+10\\\\","dependencies":[]},{"name":"url_launcher_macos","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\url_launcher_macos-0.0.1+7\\\\","dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\path_provider_linux-0.0.1+1\\\\","dependencies":[]}],"windows":[],"web":[{"name":"audioplayers","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\audioplayers-0.15.1\\\\","dependencies":[]},{"name":"shared_preferences_web","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences_web-0.1.2+7\\\\","dependencies":[]},{"name":"url_launcher_web","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\url_launcher_web-0.1.1+6\\\\","dependencies":[]}]},"dependencyGraph":[{"name":"audioplayers","dependencies":["path_provider"]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"shared_preferences","dependencies":["shared_preferences_macos","shared_preferences_web"]},{"name":"shared_preferences_macos","dependencies":[]},{"name":"shared_preferences_web","dependencies":[]},{"name":"url_launcher","dependencies":["url_launcher_web","url_launcher_macos"]},{"name":"url_launcher_macos","dependencies":[]},{"name":"url_launcher_web","dependencies":[]}],"date_created":"2020-06-20 17:17:14.422157","version":"1.17.4"} \ No newline at end of file diff --git a/.gitignore b/.gitignore index ac4a906..aa35107 100644 --- a/.gitignore +++ b/.gitignore @@ -1,72 +1,72 @@ -# Miscellaneous -*.class -*.log -*.pyc -*.swp -.DS_Store -.atom/ -.buildlog/ -.history -.svn/ - -# IntelliJ related -*.iml -*.ipr -*.iws -.idea/ - -# The .vscode folder contains launch configuration and tasks you configure in -# VS Code which you may wish to be included in version control, so this line -# is commented out by default. -#.vscode/ - -# Flutter/Dart/Pub related -**/doc/api/ -.dart_tool/ -.flutter-plugins -.packages -.pub-cache/ -.pub/ -/build/ - -# Android related -**/android/**/gradle-wrapper.jar -**/android/.gradle -**/android/captures/ -**/android/gradlew -**/android/gradlew.bat -**/android/local.properties -**/android/**/GeneratedPluginRegistrant.java - -# iOS/XCode related -**/ios/**/*.mode1v3 -**/ios/**/*.mode2v3 -**/ios/**/*.moved-aside -**/ios/**/*.pbxuser -**/ios/**/*.perspectivev3 -**/ios/**/*sync/ -**/ios/**/.sconsign.dblite -**/ios/**/.tags* -**/ios/**/.vagrant/ -**/ios/**/DerivedData/ -**/ios/**/Icon? -**/ios/**/Pods/ -**/ios/**/.symlinks/ -**/ios/**/profile -**/ios/**/xcuserdata -**/ios/.generated/ -**/ios/Flutter/App.framework -**/ios/Flutter/Flutter.framework -**/ios/Flutter/Generated.xcconfig -**/ios/Flutter/app.flx -**/ios/Flutter/app.zip -**/ios/Flutter/flutter_assets/ -**/ios/ServiceDefinitions.json -**/ios/Runner/GeneratedPluginRegistrant.* - -# Exceptions to above rules. -!**/ios/**/default.mode1v3 -!**/ios/**/default.mode2v3 -!**/ios/**/default.pbxuser -!**/ios/**/default.perspectivev3 -!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +.dart_tool/ +.flutter-plugins +.packages +.pub-cache/ +.pub/ +/build/ + +# Android related +**/android/**/gradle-wrapper.jar +**/android/.gradle +**/android/captures/ +**/android/gradlew +**/android/gradlew.bat +**/android/local.properties +**/android/**/GeneratedPluginRegistrant.java + +# iOS/XCode related +**/ios/**/*.mode1v3 +**/ios/**/*.mode2v3 +**/ios/**/*.moved-aside +**/ios/**/*.pbxuser +**/ios/**/*.perspectivev3 +**/ios/**/*sync/ +**/ios/**/.sconsign.dblite +**/ios/**/.tags* +**/ios/**/.vagrant/ +**/ios/**/DerivedData/ +**/ios/**/Icon? +**/ios/**/Pods/ +**/ios/**/.symlinks/ +**/ios/**/profile +**/ios/**/xcuserdata +**/ios/.generated/ +**/ios/Flutter/App.framework +**/ios/Flutter/Flutter.framework +**/ios/Flutter/Generated.xcconfig +**/ios/Flutter/app.flx +**/ios/Flutter/app.zip +**/ios/Flutter/flutter_assets/ +**/ios/ServiceDefinitions.json +**/ios/Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!**/ios/**/default.mode1v3 +!**/ios/**/default.mode2v3 +!**/ios/**/default.pbxuser +!**/ios/**/default.perspectivev3 +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages diff --git a/.metadata b/.metadata index 2abb5c9..5d6df35 100644 --- a/.metadata +++ b/.metadata @@ -1,10 +1,10 @@ -# This file tracks properties of this Flutter project. -# Used by Flutter tool to assess capabilities and perform upgrades etc. -# -# This file should be version controlled and should not be manually edited. - -version: - revision: 20e59316b8b8474554b38493b8ca888794b0234a - channel: beta - -project_type: app +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 20e59316b8b8474554b38493b8ca888794b0234a + channel: beta + +project_type: app diff --git a/README.md b/README.md index dcf62c6..aa93243 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,16 @@ -# four - -Four fours game - -## Getting Started - -This project is a starting point for a Flutter application. - -A few resources to get you started if this is your first Flutter project: - -- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) -- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) - -For help getting started with Flutter, view our -[online documentation](https://flutter.dev/docs), which offers tutorials, -samples, guidance on mobile development, and a full API reference. +# four + +Four fours game + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) + +For help getting started with Flutter, view our +[online documentation](https://flutter.dev/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/android/app/build.gradle b/android/app/build.gradle index 0c573a9..1d9140c 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,67 +1,67 @@ -def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') -if (localPropertiesFile.exists()) { - localPropertiesFile.withReader('UTF-8') { reader -> - localProperties.load(reader) - } -} - -def flutterRoot = localProperties.getProperty('flutter.sdk') -if (flutterRoot == null) { - throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") -} - -def flutterVersionCode = localProperties.getProperty('flutter.versionCode') -if (flutterVersionCode == null) { - flutterVersionCode = '1' -} - -def flutterVersionName = localProperties.getProperty('flutter.versionName') -if (flutterVersionName == null) { - flutterVersionName = '1.0' -} - -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" - -android { - compileSdkVersion 28 - - sourceSets { - main.java.srcDirs += 'src/main/kotlin' - } - - lintOptions { - disable 'InvalidPackage' - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "snibo.four" - minSdkVersion 16 - targetSdkVersion 28 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig signingConfigs.debug - } - } -} - -flutter { - source '../..' -} - -dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - testImplementation 'junit:junit:4.12' - androidTestImplementation 'com.android.support.test:runner:1.0.2' - androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' -} +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterRoot = localProperties.getProperty('flutter.sdk') +if (flutterRoot == null) { + throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 28 + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + lintOptions { + disable 'InvalidPackage' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "snibo.four" + minSdkVersion 16 + targetSdkVersion 28 + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.debug + } + } +} + +flutter { + source '../..' +} + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.2' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' +} diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml index 66bc9f1..2c4316f 100644 --- a/android/app/src/debug/AndroidManifest.xml +++ b/android/app/src/debug/AndroidManifest.xml @@ -1,7 +1,7 @@ - - - - + + + + diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 9fdd4f0..060e365 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,35 +1,35 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + diff --git a/android/app/src/main/kotlin/snibo/four/MainActivity.kt b/android/app/src/main/kotlin/snibo/four/MainActivity.kt index 3add216..6bbe4ed 100644 --- a/android/app/src/main/kotlin/snibo/four/MainActivity.kt +++ b/android/app/src/main/kotlin/snibo/four/MainActivity.kt @@ -1,13 +1,13 @@ -package snibo.four - -import android.os.Bundle - -import io.flutter.app.FlutterActivity -import io.flutter.plugins.GeneratedPluginRegistrant - -class MainActivity: FlutterActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - GeneratedPluginRegistrant.registerWith(this) - } -} +package snibo.four + +import android.os.Bundle + +import io.flutter.app.FlutterActivity +import io.flutter.plugins.GeneratedPluginRegistrant + +class MainActivity: FlutterActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + GeneratedPluginRegistrant.registerWith(this) + } +} diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml index 304732f..8403758 100644 --- a/android/app/src/main/res/drawable/launch_background.xml +++ b/android/app/src/main/res/drawable/launch_background.xml @@ -1,12 +1,12 @@ - - - - - - - - + + + + + + + + diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml index 00fa441..4c57322 100644 --- a/android/app/src/main/res/values/styles.xml +++ b/android/app/src/main/res/values/styles.xml @@ -1,8 +1,8 @@ - - - - + + + + diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml index 66bc9f1..2c4316f 100644 --- a/android/app/src/profile/AndroidManifest.xml +++ b/android/app/src/profile/AndroidManifest.xml @@ -1,7 +1,7 @@ - - - - + + + + diff --git a/android/build.gradle b/android/build.gradle index b7faad8..cf83cb9 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,31 +1,31 @@ -buildscript { - ext.kotlin_version = '1.2.71' - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.2.1' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - -allprojects { - repositories { - google() - jcenter() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -task clean(type: Delete) { - delete rootProject.buildDir -} +buildscript { + ext.kotlin_version = '1.2.71' + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.2.1' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/android/gradle.properties b/android/gradle.properties index 7be3d8b..5b1f143 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,2 +1,2 @@ -org.gradle.jvmargs=-Xmx1536M -android.enableR8=true +org.gradle.jvmargs=-Xmx1536M +android.enableR8=true diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 2819f02..d3b2d27 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Fri Jun 23 08:50:38 CEST 2017 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip diff --git a/android/settings.gradle b/android/settings.gradle index 5a2f14f..4f14f8e 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,15 +1,15 @@ -include ':app' - -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() - -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } -} - -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory -} +include ':app' + +def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() + +def plugins = new Properties() +def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') +if (pluginsFile.exists()) { + pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } +} + +plugins.each { name, path -> + def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() + include ":$name" + project(":$name").projectDir = pluginDirectory +} diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist index 6b4c0f7..58e65f9 100644 --- a/ios/Flutter/AppFrameworkInfo.plist +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -1,26 +1,26 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - MinimumOSVersion - 8.0 - - + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 8.0 + + diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig index 592ceee..0b2d479 100644 --- a/ios/Flutter/Debug.xcconfig +++ b/ios/Flutter/Debug.xcconfig @@ -1 +1 @@ -#include "Generated.xcconfig" +#include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig index 592ceee..0b2d479 100644 --- a/ios/Flutter/Release.xcconfig +++ b/ios/Flutter/Release.xcconfig @@ -1 +1 @@ -#include "Generated.xcconfig" +#include "Generated.xcconfig" diff --git a/ios/Flutter/flutter_export_environment.sh b/ios/Flutter/flutter_export_environment.sh new file mode 100644 index 0000000..e751f7e --- /dev/null +++ b/ios/Flutter/flutter_export_environment.sh @@ -0,0 +1,11 @@ +#!/bin/sh +# This is a generated file; do not edit or check into version control. +export "FLUTTER_ROOT=C:\Users\nimak\flutter" +export "FLUTTER_APPLICATION_PATH=C:\Users\nimak\Documents\Programming\four" +export "FLUTTER_TARGET=lib\main.dart" +export "FLUTTER_BUILD_DIR=build" +export "SYMROOT=${SOURCE_ROOT}/../build\ios" +export "OTHER_LDFLAGS=$(inherited) -framework Flutter" +export "FLUTTER_FRAMEWORK_DIR=C:\Users\nimak\flutter\bin\cache\artifacts\engine\ios" +export "FLUTTER_BUILD_NAME=1.0.0" +export "FLUTTER_BUILD_NUMBER=1" diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 8957a7e..6d0df96 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -1,521 +1,521 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 9705A1C41CF9048500538489 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; - 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; - 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; - 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; - 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; }; - 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 9740EEB11CF90186004384FC /* Flutter */ = { - isa = PBXGroup; - children = ( - 3B80C3931E831B6300D905FE /* App.framework */, - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEBA1CF902C7004384FC /* Flutter.framework */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 9740EEB31CF90195004384FC /* Generated.xcconfig */, - ); - name = Flutter; - sourceTree = ""; - }; - 97C146E51CF9000F007C117D = { - isa = PBXGroup; - children = ( - 9740EEB11CF90186004384FC /* Flutter */, - 97C146F01CF9000F007C117D /* Runner */, - 97C146EF1CF9000F007C117D /* Products */, - ); - sourceTree = ""; - }; - 97C146EF1CF9000F007C117D /* Products */ = { - isa = PBXGroup; - children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, - ); - name = Products; - sourceTree = ""; - }; - 97C146F01CF9000F007C117D /* Runner */ = { - isa = PBXGroup; - children = ( - 97C146FA1CF9000F007C117D /* Main.storyboard */, - 97C146FD1CF9000F007C117D /* Assets.xcassets */, - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, - 97C147021CF9000F007C117D /* Info.plist */, - 97C146F11CF9000F007C117D /* Supporting Files */, - 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, - 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, - 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, - 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, - ); - path = Runner; - sourceTree = ""; - }; - 97C146F11CF9000F007C117D /* Supporting Files */ = { - isa = PBXGroup; - children = ( - ); - name = "Supporting Files"; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 97C146ED1CF9000F007C117D /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Runner; - productName = Runner; - productReference = 97C146EE1CF9000F007C117D /* Runner.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 97C146E61CF9000F007C117D /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 1020; - ORGANIZATIONNAME = "The Chromium Authors"; - TargetAttributes = { - 97C146ED1CF9000F007C117D = { - CreatedOnToolsVersion = 7.3.1; - LastSwiftMigration = 0910; - }; - }; - }; - buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 97C146E51CF9000F007C117D; - productRefGroup = 97C146EF1CF9000F007C117D /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 97C146ED1CF9000F007C117D /* Runner */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 97C146EC1CF9000F007C117D /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Thin Binary"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin"; - }; - 9740EEB61CF901F6004384FC /* Run Script */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Run Script"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 97C146EA1CF9000F007C117D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 97C146FA1CF9000F007C117D /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C146FB1CF9000F007C117D /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C147001CF9000F007C117D /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 249021D3217E4FDB00AE95B9 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Profile; - }; - 249021D4217E4FDB00AE95B9 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = S8QB4VV633; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = snibo.four; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 4.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Profile; - }; - 97C147031CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 97C147041CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 97C147061CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = snibo.four; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_SWIFT3_OBJC_INFERENCE = On; - SWIFT_VERSION = 4.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Debug; - }; - 97C147071CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = snibo.four; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_SWIFT3_OBJC_INFERENCE = On; - SWIFT_VERSION = 4.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147031CF9000F007C117D /* Debug */, - 97C147041CF9000F007C117D /* Release */, - 249021D3217E4FDB00AE95B9 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147061CF9000F007C117D /* Debug */, - 97C147071CF9000F007C117D /* Release */, - 249021D4217E4FDB00AE95B9 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - - }; - rootObject = 97C146E61CF9000F007C117D /* Project object */; -} +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; + 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; + 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, + 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, + 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B80C3931E831B6300D905FE /* App.framework */, + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEBA1CF902C7004384FC /* Flutter.framework */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 97C146F11CF9000F007C117D /* Supporting Files */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; + 97C146F11CF9000F007C117D /* Supporting Files */ = { + isa = PBXGroup; + children = ( + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = "The Chromium Authors"; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 0910; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = S8QB4VV633; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = snibo.four; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 4.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = snibo.four; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = snibo.four; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 1d526a1..59c6d39 100644 --- a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index a28140c..be0b92e 100644 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,91 +1,91 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata index 1d526a1..59c6d39 100644 --- a/ios/Runner.xcworkspace/contents.xcworkspacedata +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift index 71cc41e..52252fc 100644 --- a/ios/Runner/AppDelegate.swift +++ b/ios/Runner/AppDelegate.swift @@ -1,13 +1,13 @@ -import UIKit -import Flutter - -@UIApplicationMain -@objc class AppDelegate: FlutterAppDelegate { - override func application( - _ application: UIApplication, - didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]? - ) -> Bool { - GeneratedPluginRegistrant.register(with: self) - return super.application(application, didFinishLaunchingWithOptions: launchOptions) - } -} +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json index d36b1fa..1950fd8 100644 --- a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,122 +1,122 @@ -{ - "images" : [ - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@3x.png", - "scale" : "3x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@3x.png", - "scale" : "3x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@3x.png", - "scale" : "3x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@2x.png", - "scale" : "2x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@3x.png", - "scale" : "3x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@1x.png", - "scale" : "1x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@1x.png", - "scale" : "1x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@1x.png", - "scale" : "1x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@2x.png", - "scale" : "2x" - }, - { - "size" : "83.5x83.5", - "idiom" : "ipad", - "filename" : "Icon-App-83.5x83.5@2x.png", - "scale" : "2x" - }, - { - "size" : "1024x1024", - "idiom" : "ios-marketing", - "filename" : "Icon-App-1024x1024@1x.png", - "scale" : "1x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json index 0bedcf2..d08a4de 100644 --- a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -1,23 +1,23 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "LaunchImage.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "LaunchImage@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "LaunchImage@3x.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md index 89c2725..65a94b5 100644 --- a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -1,5 +1,5 @@ -# Launch Screen Assets - -You can customize the launch screen with your own desired assets by replacing the image files in this directory. - +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/ios/Runner/Base.lproj/LaunchScreen.storyboard index f2e259c..497371e 100644 --- a/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ b/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -1,37 +1,37 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/Base.lproj/Main.storyboard b/ios/Runner/Base.lproj/Main.storyboard index f3c2851..bbb83ca 100644 --- a/ios/Runner/Base.lproj/Main.storyboard +++ b/ios/Runner/Base.lproj/Main.storyboard @@ -1,26 +1,26 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 9900004..7bb9d28 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -1,45 +1,45 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - four - CFBundlePackageType - APPL - CFBundleShortVersionString - $(FLUTTER_BUILD_NAME) - CFBundleSignature - ???? - CFBundleVersion - $(FLUTTER_BUILD_NUMBER) - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - - + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + four + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/lib/MathEngine.dart b/lib/MathEngine.dart index 15b9a6b..dbf8026 100644 --- a/lib/MathEngine.dart +++ b/lib/MathEngine.dart @@ -1,187 +1,247 @@ -import 'dart:collection'; -import 'dart:math'; -//TODO: Implement place value multiplication for numbers greater than 9 -String postfix(String equation) { - var operatorPrecedenceInStack = { - "(": 0, - "!": 7, - "²": 5, - "√": 5, - "x": 4, - "÷": 4, - "+": 2, - "-": 2 - }; - var operatorPrecedenceToStack = { - "(": 10, - "!": 8, - "²": 6, - "√": 6, - "x": 3, - "÷": 3, - "+": 1, - "-": 1 - }; - - ListQueue operators = new ListQueue(); //Functioning as a queue - ListQueue output = new ListQueue(); //Functioning as a stack - //Cleaning input - equation = equation.replaceAll(" ", ""); - - //Iterating over equation - while (equation.length > 0) { - int numIndex = 0; - //Keep increasing number range until failure - while (numIndex + 1 <= equation.length && double.tryParse(equation.substring(0, numIndex + 1)) != null) { - numIndex++; - } - - if (numIndex != 0) { //Substring represents a number and not an operation - //Queue push - //Add the number to the end of the output list - output.addLast(equation.substring(0, numIndex)); - //Add a space - output.addLast(" "); - //Remove the first string from the equation (SIDE EFFECT) - //Truncation - equation = equation.substring(numIndex); - } else { - //For the first operator - if (operators.isEmpty) { - //Stack push - operators.addFirst(equation.substring(0, 1)); - //Remove the first character from the equation (SIDE EFFECT) - equation = equation.substring(1); - } else { //If not the first operator - //If its a closing parenthesis - if (equation.substring(0, 1) == ")") { - do { - output.addLast(operators.removeFirst()); - output.addLast(" "); - } - while (operators.first != "("); - operators.removeFirst(); - //Remove the first string from the equation (SIDE EFFECT) - equation = equation.substring(1); - continue; - } - if (operatorPrecedenceToStack[equation.substring(0, 1)] > operatorPrecedenceInStack[operators.first]) { - //Stack push - operators.addFirst(equation.substring(0, 1)); - //Remove the first string from the equation (SIDE EFFECT) - equation = equation.substring(1); - } else { - while (operatorPrecedenceToStack[equation.substring(0, 1)] < operatorPrecedenceInStack[operators.first] && operators.isNotEmpty) { - - //Pop all operators with higher precedence to the output - output.addLast(operators.removeFirst()); - //Space after operators - output.addLast(" "); - if (operators.isEmpty) { - break; - } - } - operators.addFirst(equation.substring(0, 1)); - //Remove the first string from the equation (SIDE EFFECT) - equation = equation.substring(1); - } - } - } - } - String out = ""; - while (operators.isNotEmpty) { - output.addLast(operators.removeFirst()); - } - while (output.isNotEmpty) { - out += output.removeFirst(); - } - return out; -} - - - -double calculatePostfix(String equation) { - ListQueue terms = new ListQueue(); //Functioning as a stack - int symbolIndex = 0; - //print(equation); - //Convert equation to array - List < String > eq = equation.split(" "); - ListQueue < String > operations = new ListQueue < String > (); - for (int i = 0; i < eq.length; i++) { - var el = eq[i]; - if (double.tryParse(el) != null) { - terms.addLast(double.tryParse(el)); - } else { - operations.addLast(el); - } - } - - var symbol; - - int iterCount = operations.length; - - for (int j = 0; j < iterCount; j++) { - var symbol = operations.removeFirst(); - switch (symbol) { - case "x": - double t1 = terms.removeLast(); - double t2 = terms.removeLast(); - terms.addFirst(t1 * t2); - break; - case "÷": - double t1 = terms.removeLast(); - double t2 = terms.removeLast(); - if (t1 < t2) { - terms.addFirst(t2 / t1); - } else { - terms.addFirst(t1 / t2); - } - break; - case "+": - double t1 = terms.removeLast(); - double t2 = terms.removeLast(); - terms.addFirst(t1 + t2); - break; - case "-": - double t2 = terms.removeLast(); - double t1 = terms.removeLast(); - if (t2 > t1) { - terms.addFirst(t2 - t1); - } else { - terms.addFirst(t1 - t2); - } - break; - case "√": - double t = terms.removeLast(); - terms.addFirst(sqrt(t).toDouble()); - break; - case "²": - double t = terms.removeLast(); - terms.addFirst(t * t); - break; - case "!": - double t = terms.removeLast(); - terms.addFirst(factorial(t)); - break; - } - } - return terms.removeLast(); - -} - -double factorial(double f) { - if (f == 0) { - return 1.0; - } - return f * factorial(f - 1); -} - -double mathEngine(String s) { - //print(postfix(s)); - return calculatePostfix(postfix(s)); -} - - -void main() { - print(mathEngine("(4+4)-(4+4)")); -} \ No newline at end of file +import 'dart:collection'; +import 'dart:math'; + +String postfix(String equation) { + var operatorPrecedenceInStack = { + "(": 0, + "!": 7, + "²": 5, + "√": 5, + "x": 4, + "÷": 4, + "+": 2, + "-": 2 + }; + var operatorPrecedenceToStack = { + "(": 10, + "!": 8, + "²": 6, + "√": 6, + "x": 3, + "÷": 3, + "+": 1, + "-": 1 + }; + + ListQueue operators = new ListQueue(); //Functioning as a queue + ListQueue output = new ListQueue(); //Functioning as a stack + //Cleaning input + equation = equation.replaceAll(" ", ""); + + //Iterating over equation + while (equation.length > 0) { + int numIndex = 0; + //Keep increasing number range until failure + while (numIndex + 1 <= equation.length && + double.tryParse(equation.substring(0, numIndex + 1)) != null) { + numIndex++; + } + + if (numIndex != 0) { + //Substring represents a number and not an operation + //Queue push + //Add the number to the end of the output list + output.addLast(equation.substring(0, numIndex)); + //Add a space + output.addLast(" "); + //Remove the first string from the equation (SIDE EFFECT) + //Truncation + equation = equation.substring(numIndex); + } else { + //For the first operator + if (operators.isEmpty) { + //Stack push + operators.addFirst(equation.substring(0, 1)); + //Remove the first character from the equation (SIDE EFFECT) + equation = equation.substring(1); + } else { + //If not the first operator + //If its a closing parenthesis + if (equation.substring(0, 1) == ")") { + do { + output.addLast(operators.removeFirst()); + output.addLast(" "); + } while (operators.first != "("); + operators.removeFirst(); + //Remove the first string from the equation (SIDE EFFECT) + equation = equation.substring(1); + continue; + } + if (operatorPrecedenceToStack[equation.substring(0, 1)] > + operatorPrecedenceInStack[operators.first]) { + //Stack push + operators.addFirst(equation.substring(0, 1)); + //Remove the first string from the equation (SIDE EFFECT) + equation = equation.substring(1); + } else { + while (operatorPrecedenceToStack[equation.substring(0, 1)] < + operatorPrecedenceInStack[operators.first] && + operators.isNotEmpty) { + //Pop all operators with higher precedence to the output + output.addLast(operators.removeFirst()); + //Space after operators + output.addLast(" "); + if (operators.isEmpty) { + break; + } + } + operators.addFirst(equation.substring(0, 1)); + //Remove the first string from the equation (SIDE EFFECT) + equation = equation.substring(1); + } + } + } + } + String out = ""; + while (operators.isNotEmpty) { + output.addLast(operators.removeFirst()); + } + while (output.isNotEmpty) { + out += output.removeFirst(); + } + return out; +} + +double calculate(String e) { + ListQueue stack = new ListQueue(); + ListQueue equation = new ListQueue.from(e.split(" ")); + + print(equation); + + int size = equation.length; + + for (int i = 0; i < size; i++) { + var element = equation.removeFirst(); + if (double.tryParse(element) != null) { + stack.addLast(double.tryParse(element)); + } else { + switch (element) { + case '+': + double term1 = stack.removeFirst(); + double term2 = stack.removeFirst(); + stack.addLast(term1 + term2); + break; + case '-': + double term1 = stack.removeFirst(); + double term2 = stack.removeFirst(); + stack.addLast(term1 - term2); + break; + case 'x': + double term1 = stack.removeFirst(); + double term2 = stack.removeFirst(); + stack.addLast(term1 * term2); + break; + case '÷': + double term1 = stack.removeFirst(); + double term2 = stack.removeFirst(); + stack.addLast(term1 / term2); + break; + case '√': + double term1 = stack.removeLast(); + stack.addLast(sqrt(term1).toDouble()); + break; + case '!': + double term1 = stack.removeFirst(); + stack.addLast(factorial(term1)); + break; + case '²': + double term1 = stack.removeFirst(); + stack.addLast(term1 * term1); + break; + case '^': + double term1 = stack.removeFirst(); + double term2 = stack.removeFirst(); + stack.addLast(pow(term1, term2)); + break; + } + } + print(stack); + } + + return stack.removeFirst(); +} + +double calculatePostfix(String equation) { + ListQueue terms = new ListQueue(); //Functioning as a stack + int symbolIndex = 0; + //print(equation); + //Convert equation to array +// ListQueue eq = ListQueue.from(equation.split(" ")); + List eq = equation.split(" "); + ListQueue operations = new ListQueue(); + for (int i = 0; i < eq.length; i++) { + var el = eq[i]; + if (double.tryParse(el) != null) { + terms.addLast(double.tryParse(el)); + } else { + operations.addLast(el); + } + } + + var symbol; + + int iterCount = operations.length; + + for (int j = 0; j < iterCount; j++) { + var symbol = operations.removeFirst(); + switch (symbol) { + case "x": + double t1 = terms.removeLast(); + double t2 = terms.removeLast(); + terms.addFirst(t1 * t2); + break; + case "÷": + double t1 = terms.removeLast(); + double t2 = terms.removeLast(); + if (t1 < t2) { + terms.addFirst(t2 / t1); + } else { + terms.addFirst(t1 / t2); + } + break; + case "+": + double t1 = terms.removeLast(); + double t2 = terms.removeLast(); + terms.addFirst(t1 + t2); + break; + case "-": + double t2 = terms.removeLast(); + double t1 = terms.removeLast(); + if (t2 > t1) { + terms.addFirst(t2 - t1); + } else { + terms.addFirst(t1 - t2); + } + break; + case "√": + double t = terms.removeLast(); + terms.addFirst(sqrt(t).toDouble()); + break; + case "²": + double t = terms.removeLast(); + terms.addFirst(t * t); + break; + case "!": + double t = terms.removeLast(); + terms.addFirst(factorial(t)); + break; + } + } + return terms.removeLast(); +} + +double factorial(double f) { + if (f == 0) { + return 1.0; + } + return f * factorial(f - 1); +} + +double mathEngine(String s) { + //print(postfix(s)); + return calculate(postfix(s)); +} + +void main() { + print(mathEngine("√4 + √4 - (4 ÷ 4 )")); +} diff --git a/lib/MathString.dart b/lib/MathString.dart index 5066316..f9cd9be 100644 --- a/lib/MathString.dart +++ b/lib/MathString.dart @@ -1,198 +1,198 @@ -void main() { - print(parseEquation("4x4")); - print(parseEquation("(4x4)")); - print(parseEquation("16÷16")); - print(parseEquation("(4x4)÷(4x4)")); - //print(parseEquation("4+4-√4-√4")); - print(parseEquation("(4+4)-(4+4)")); - -} - -int parseEquation(String equation) { - var values = []; - int val = 0; - if (!equation.contains("(")) { - return oop(equation); - } - while (equation.contains('(')) { - values.add(oop(equation.substring(equation.indexOf('(')+1, equation.indexOf(')')))); - var temp = values[values.length-1]; - equation = equation.replaceRange(equation.indexOf('('), equation.indexOf(')')+1,"$temp"); - } - if(int.tryParse(equation) == null) { - return parseEquation(equation); - } else { - for (int i = 0; i < values.length; i++) { - val += values[i]; - } - return val; - } - -} - -int calculate(int opIndex, String subEquation) { - //Remove all spaces - subEquation = subEquation.replaceAll(" ",""); - //Value to be returned - int val = int.parse(subEquation.substring(0,opIndex)); - //Iterate through the subEquation performing operations as seen - while(subEquation.length >= 1) { - switch (subEquation.substring(0,1)) { - case '÷': - val ~/= int.parse(subEquation.substring(opIndex-1)); - break; - case 'x': - val *= int.parse(subEquation.substring(opIndex)); - break; - case '+': - val += int.parse(subEquation.substring(opIndex)); - break; - case '-': - val -= int.parse(subEquation.substring(opIndex)); - break; - } - //Remove the first character in the equation - subEquation = subEquation.substring(1); - } - - //Return the computed value - return val; -} - -int oop(String subEquation) { - var values = []; - int val = 0; - while (subEquation.contains('\u221a')) { - subEquation = subEquation.replaceRange(subEquation.indexOf('\u221a'), subEquation.indexOf('\u221a')+2,"2"); - } - subEquation = oopPair(subEquation,"\u00F7", "x"); - subEquation = oopPair(subEquation,"+", "-"); - return int.parse(subEquation); -} - -List digOp(String op, String equation) { - List vals = []; - int startIndex = 1; - int opIndex = equation.indexOf(op); - int endIndex = opIndex + 1; - if (opIndex - 2 >= 0 && int.tryParse(equation.substring(opIndex -2, opIndex)) != null) { - startIndex = opIndex - 2; - } - if (opIndex + 3 <= equation.length && int.tryParse(equation.substring(opIndex+1, opIndex+3)) != null) { - endIndex = opIndex + 3; - } - return [startIndex, endIndex]; -} -bool isDoubleDigit(String s, int index) { - if (int.tryParse(s.substring(index, index+3)) != null) { - return true; - } - return false; -} - -int calculate2(String subEquation) { - //Remove all spaces - subEquation = subEquation.replaceAll(" ",""); - //Value to be returned - int val; - //Array of values for order of operations - var values = []; - //If the first number is two digits - if (int.tryParse(subEquation.substring(0,2)) != null) { - val = int.parse(subEquation.substring(0,2)); - } - else { - val = int.parse(subEquation.substring(0,1)); - } - //Iterate through the subEquation performing operations as seen - while(subEquation.length >= 1) { - switch (subEquation.substring(0,1)) { - case '/': - val ~/= int.parse(subEquation.substring(1,2)); - subEquation = subEquation.substring(1); - break; - case 'x': - val *= int.parse(subEquation.substring(1,2)); - subEquation = subEquation.substring(1); - break; - case '+': - val += int.parse(subEquation.substring(1,2)); - subEquation = subEquation.substring(1); - break; - case '-': - val -= int.parse(subEquation.substring(1,2)); - subEquation = subEquation.substring(1); - break; - } - //Remove the first character in the equation - subEquation = subEquation.substring(1); - } - - //Return the computed value - return val; -} - -String oopPair(String subEquation, String char1, String char2) { - int temp; - while(subEquation.contains(char1) || subEquation.contains(char2)) { - if (subEquation.contains(char2)) { - if (subEquation.contains(char1)) { - if(subEquation.indexOf(char2) < subEquation.indexOf(char1)) { - if (subEquation.length > 3) { - List indeces = digOp(char2, subEquation); - temp = calculate(subEquation.indexOf(char2), subEquation.substring(indeces[0], indeces[1])); - subEquation = subEquation.replaceRange(indeces[0],indeces[1],"$temp"); - } else { - temp = calculate2(subEquation.substring(subEquation.indexOf(char2)-1, subEquation.indexOf(char2)+2)); - subEquation = subEquation.replaceRange(subEquation.indexOf(char2)-1, subEquation.indexOf(char2)+2,"$temp"); - } - } - else { - if (subEquation.length > 3) { - List indeces = digOp(char1, subEquation); - temp = calculate(subEquation.indexOf(char1), subEquation.substring(indeces[0], indeces[1])); - subEquation = subEquation.replaceRange(indeces[0],indeces[1],"$temp"); - } else { - temp = calculate2(subEquation.substring(subEquation.indexOf(char1)-1, subEquation.indexOf(char1)+2)); - subEquation = subEquation.replaceRange(subEquation.indexOf(char1)-1, subEquation.indexOf(char1)+2,"$temp"); - } - } - } - else { - if (subEquation.length > 3) { - List indeces = digOp(char2, subEquation); - - temp = calculate(subEquation.indexOf(char2), subEquation.substring(indeces[0], indeces[1])); - subEquation = subEquation.replaceRange(indeces[0],indeces[1],"$temp"); - } else { - temp = calculate2(subEquation.substring(subEquation.indexOf(char2)-1, subEquation.indexOf(char2)+2)); - subEquation = subEquation.replaceRange(subEquation.indexOf(char2)-1, subEquation.indexOf(char2)+2,"$temp"); - } - } - } - else { - if (subEquation.length > 3) { - List indeces = digOp(char1, subEquation); - temp = calculate(subEquation.indexOf(char1), subEquation.substring(indeces[0], indeces[1])); - subEquation = subEquation.replaceRange(indeces[0],indeces[1],"$temp"); - } else { - temp = calculate2(subEquation.substring(subEquation.indexOf(char1)-1, subEquation.indexOf(char1)+2)); - subEquation = subEquation.replaceRange(subEquation.indexOf(char1)-1, subEquation.indexOf(char1)+2,"$temp"); - } - } - } - return subEquation; -} -String regex(String string) { - RegExp re = new RegExp('\\d{0,2}'); - Iterable terms = re.allMatches(string); - int startIndex = terms.first.start; - int endIndex = terms.last.end; - return string.substring(startIndex, endIndex); -} - -Iterable regex1(String string) { - RegExp re = new RegExp('\\d{0,2}'); - Iterable terms = re.allMatches(string); - return terms; +void main() { + print(parseEquation("4x4")); + print(parseEquation("(4x4)")); + print(parseEquation("16÷16")); + print(parseEquation("(4x4)÷(4x4)")); + //print(parseEquation("4+4-√4-√4")); + print(parseEquation("(4+4)-(4+4)")); + +} + +int parseEquation(String equation) { + var values = []; + int val = 0; + if (!equation.contains("(")) { + return oop(equation); + } + while (equation.contains('(')) { + values.add(oop(equation.substring(equation.indexOf('(')+1, equation.indexOf(')')))); + var temp = values[values.length-1]; + equation = equation.replaceRange(equation.indexOf('('), equation.indexOf(')')+1,"$temp"); + } + if(int.tryParse(equation) == null) { + return parseEquation(equation); + } else { + for (int i = 0; i < values.length; i++) { + val += values[i]; + } + return val; + } + +} + +int calculate(int opIndex, String subEquation) { + //Remove all spaces + subEquation = subEquation.replaceAll(" ",""); + //Value to be returned + int val = int.parse(subEquation.substring(0,opIndex)); + //Iterate through the subEquation performing operations as seen + while(subEquation.length >= 1) { + switch (subEquation.substring(0,1)) { + case '÷': + val ~/= int.parse(subEquation.substring(opIndex-1)); + break; + case 'x': + val *= int.parse(subEquation.substring(opIndex)); + break; + case '+': + val += int.parse(subEquation.substring(opIndex)); + break; + case '-': + val -= int.parse(subEquation.substring(opIndex)); + break; + } + //Remove the first character in the equation + subEquation = subEquation.substring(1); + } + + //Return the computed value + return val; +} + +int oop(String subEquation) { + var values = []; + int val = 0; + while (subEquation.contains('\u221a')) { + subEquation = subEquation.replaceRange(subEquation.indexOf('\u221a'), subEquation.indexOf('\u221a')+2,"2"); + } + subEquation = oopPair(subEquation,"\u00F7", "x"); + subEquation = oopPair(subEquation,"+", "-"); + return int.parse(subEquation); +} + +List digOp(String op, String equation) { + List vals = []; + int startIndex = 1; + int opIndex = equation.indexOf(op); + int endIndex = opIndex + 1; + if (opIndex - 2 >= 0 && int.tryParse(equation.substring(opIndex -2, opIndex)) != null) { + startIndex = opIndex - 2; + } + if (opIndex + 3 <= equation.length && int.tryParse(equation.substring(opIndex+1, opIndex+3)) != null) { + endIndex = opIndex + 3; + } + return [startIndex, endIndex]; +} +bool isDoubleDigit(String s, int index) { + if (int.tryParse(s.substring(index, index+3)) != null) { + return true; + } + return false; +} + +int calculate2(String subEquation) { + //Remove all spaces + subEquation = subEquation.replaceAll(" ",""); + //Value to be returned + int val; + //Array of values for order of operations + var values = []; + //If the first number is two digits + if (int.tryParse(subEquation.substring(0,2)) != null) { + val = int.parse(subEquation.substring(0,2)); + } + else { + val = int.parse(subEquation.substring(0,1)); + } + //Iterate through the subEquation performing operations as seen + while(subEquation.length >= 1) { + switch (subEquation.substring(0,1)) { + case '/': + val ~/= int.parse(subEquation.substring(1,2)); + subEquation = subEquation.substring(1); + break; + case 'x': + val *= int.parse(subEquation.substring(1,2)); + subEquation = subEquation.substring(1); + break; + case '+': + val += int.parse(subEquation.substring(1,2)); + subEquation = subEquation.substring(1); + break; + case '-': + val -= int.parse(subEquation.substring(1,2)); + subEquation = subEquation.substring(1); + break; + } + //Remove the first character in the equation + subEquation = subEquation.substring(1); + } + + //Return the computed value + return val; +} + +String oopPair(String subEquation, String char1, String char2) { + int temp; + while(subEquation.contains(char1) || subEquation.contains(char2)) { + if (subEquation.contains(char2)) { + if (subEquation.contains(char1)) { + if(subEquation.indexOf(char2) < subEquation.indexOf(char1)) { + if (subEquation.length > 3) { + List indeces = digOp(char2, subEquation); + temp = calculate(subEquation.indexOf(char2), subEquation.substring(indeces[0], indeces[1])); + subEquation = subEquation.replaceRange(indeces[0],indeces[1],"$temp"); + } else { + temp = calculate2(subEquation.substring(subEquation.indexOf(char2)-1, subEquation.indexOf(char2)+2)); + subEquation = subEquation.replaceRange(subEquation.indexOf(char2)-1, subEquation.indexOf(char2)+2,"$temp"); + } + } + else { + if (subEquation.length > 3) { + List indeces = digOp(char1, subEquation); + temp = calculate(subEquation.indexOf(char1), subEquation.substring(indeces[0], indeces[1])); + subEquation = subEquation.replaceRange(indeces[0],indeces[1],"$temp"); + } else { + temp = calculate2(subEquation.substring(subEquation.indexOf(char1)-1, subEquation.indexOf(char1)+2)); + subEquation = subEquation.replaceRange(subEquation.indexOf(char1)-1, subEquation.indexOf(char1)+2,"$temp"); + } + } + } + else { + if (subEquation.length > 3) { + List indeces = digOp(char2, subEquation); + + temp = calculate(subEquation.indexOf(char2), subEquation.substring(indeces[0], indeces[1])); + subEquation = subEquation.replaceRange(indeces[0],indeces[1],"$temp"); + } else { + temp = calculate2(subEquation.substring(subEquation.indexOf(char2)-1, subEquation.indexOf(char2)+2)); + subEquation = subEquation.replaceRange(subEquation.indexOf(char2)-1, subEquation.indexOf(char2)+2,"$temp"); + } + } + } + else { + if (subEquation.length > 3) { + List indeces = digOp(char1, subEquation); + temp = calculate(subEquation.indexOf(char1), subEquation.substring(indeces[0], indeces[1])); + subEquation = subEquation.replaceRange(indeces[0],indeces[1],"$temp"); + } else { + temp = calculate2(subEquation.substring(subEquation.indexOf(char1)-1, subEquation.indexOf(char1)+2)); + subEquation = subEquation.replaceRange(subEquation.indexOf(char1)-1, subEquation.indexOf(char1)+2,"$temp"); + } + } + } + return subEquation; +} +String regex(String string) { + RegExp re = new RegExp('\\d{0,2}'); + Iterable terms = re.allMatches(string); + int startIndex = terms.first.start; + int endIndex = terms.last.end; + return string.substring(startIndex, endIndex); +} + +Iterable regex1(String string) { + RegExp re = new RegExp('\\d{0,2}'); + Iterable terms = re.allMatches(string); + return terms; } \ No newline at end of file diff --git a/lib/Old UI.dart b/lib/Old UI.dart index 84b4d38..ce6b1b5 100644 --- a/lib/Old UI.dart +++ b/lib/Old UI.dart @@ -1,46 +1,46 @@ -import 'package:flutter/material.dart'; -Widget UI() {return Row( -children: [ -Expanded ( -flex: 3, -child: Padding( -padding: EdgeInsets.only(left: 10, right: 10), -child: RaisedButton( -color: Color(0xffEE6E48), -shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30)), -onPressed: _four, child: Text("4", style: TextStyle(fontSize: 25, color: Color(0xff565C5C))),padding: EdgeInsets.all(11.5),)), -), -Expanded ( -flex: 3, -child: Padding( -padding: EdgeInsets.only(left: 10, right: 10), -child: RaisedButton( -color: Color(0xffEE6E48), -shape: RoundedRectangleBorder(borderRadius: -BorderRadius.circular(30)), -onPressed: _equals, -child: Text("=", style: TextStyle(fontSize: 28, color: Color(0xff565C5C)),), -padding: EdgeInsets.all(10),)) -), -], -mainAxisAlignment: MainAxisAlignment.spaceEvenly -), -Row(children: [ -RaisedButton(color: Color(0xffCCD2C6), shape: CircleBorder(), onPressed: _plus, child: Text("+", style: TextStyle(fontSize: 24, color: Color(0xff565C5C)),), padding: EdgeInsets.all(15),), -RaisedButton(color: Color(0xffCCD2C6), shape: CircleBorder(), onPressed: _minus, child: Text("-", style: TextStyle(fontSize: 24, color: Color(0xff565C5C)),), padding: EdgeInsets.all(15),), -RaisedButton(color: Color(0xffCCD2C6), shape: CircleBorder(), onPressed: _backspace, child: Text("DEL", style: TextStyle(fontSize: 24, color: Color(0xff565C5C)),), padding: EdgeInsets.all(15),), -],mainAxisAlignment: MainAxisAlignment.spaceEvenly,), -Row(children: [ -RaisedButton(color: Color(0xffCCD2C6),shape: CircleBorder(), onPressed: _mult, child: Text("x", style: TextStyle(fontSize: 24, color: Color(0xff565C5C)),), padding: EdgeInsets.all(15),), -RaisedButton(color: Color(0xffCCD2C6),shape: CircleBorder(), onPressed: _div, child: Text("\u00F7", style: TextStyle(fontSize: 24, color: Color(0xff565C5C)),), padding: EdgeInsets.all(15),), -RaisedButton(color: Color(0xffCCD2C6),shape: CircleBorder(), onPressed: _clear, child: Text("C", style: TextStyle(fontSize: 24, color: Color(0xff565C5C)),), padding: EdgeInsets.all(15),), - -],mainAxisAlignment: MainAxisAlignment.spaceEvenly,), - -Row(children: [ -RaisedButton(color: Color(0xffCCD2C6),shape: CircleBorder(), onPressed: _sqrt, child: Text("\u221a", style: TextStyle(fontSize: 24, color: Color(0xff565C5C)),), padding: EdgeInsets.all(15),), -RaisedButton(color: Color(0xffCCD2C6),shape: CircleBorder(), onPressed: _openParen, child: Text("(" , style: TextStyle(fontSize: 24, color: Color(0xff565C5C)),), padding: EdgeInsets.all(15),), -RaisedButton(color: Color(0xffCCD2C6),shape: CircleBorder(), onPressed: _closeParen, child: Text(")", style: TextStyle(fontSize: 24, color: Color(0xff565C5C)),), padding: EdgeInsets.all(15),), -],mainAxisAlignment: MainAxisAlignment.spaceEvenly,), -], +import 'package:flutter/material.dart'; +Widget UI() {return Row( +children: [ +Expanded ( +flex: 3, +child: Padding( +padding: EdgeInsets.only(left: 10, right: 10), +child: RaisedButton( +color: Color(0xffEE6E48), +shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30)), +onPressed: _four, child: Text("4", style: TextStyle(fontSize: 25, color: Color(0xff565C5C))),padding: EdgeInsets.all(11.5),)), +), +Expanded ( +flex: 3, +child: Padding( +padding: EdgeInsets.only(left: 10, right: 10), +child: RaisedButton( +color: Color(0xffEE6E48), +shape: RoundedRectangleBorder(borderRadius: +BorderRadius.circular(30)), +onPressed: _equals, +child: Text("=", style: TextStyle(fontSize: 28, color: Color(0xff565C5C)),), +padding: EdgeInsets.all(10),)) +), +], +mainAxisAlignment: MainAxisAlignment.spaceEvenly +), +Row(children: [ +RaisedButton(color: Color(0xffCCD2C6), shape: CircleBorder(), onPressed: _plus, child: Text("+", style: TextStyle(fontSize: 24, color: Color(0xff565C5C)),), padding: EdgeInsets.all(15),), +RaisedButton(color: Color(0xffCCD2C6), shape: CircleBorder(), onPressed: _minus, child: Text("-", style: TextStyle(fontSize: 24, color: Color(0xff565C5C)),), padding: EdgeInsets.all(15),), +RaisedButton(color: Color(0xffCCD2C6), shape: CircleBorder(), onPressed: _backspace, child: Text("DEL", style: TextStyle(fontSize: 24, color: Color(0xff565C5C)),), padding: EdgeInsets.all(15),), +],mainAxisAlignment: MainAxisAlignment.spaceEvenly,), +Row(children: [ +RaisedButton(color: Color(0xffCCD2C6),shape: CircleBorder(), onPressed: _mult, child: Text("x", style: TextStyle(fontSize: 24, color: Color(0xff565C5C)),), padding: EdgeInsets.all(15),), +RaisedButton(color: Color(0xffCCD2C6),shape: CircleBorder(), onPressed: _div, child: Text("\u00F7", style: TextStyle(fontSize: 24, color: Color(0xff565C5C)),), padding: EdgeInsets.all(15),), +RaisedButton(color: Color(0xffCCD2C6),shape: CircleBorder(), onPressed: _clear, child: Text("C", style: TextStyle(fontSize: 24, color: Color(0xff565C5C)),), padding: EdgeInsets.all(15),), + +],mainAxisAlignment: MainAxisAlignment.spaceEvenly,), + +Row(children: [ +RaisedButton(color: Color(0xffCCD2C6),shape: CircleBorder(), onPressed: _sqrt, child: Text("\u221a", style: TextStyle(fontSize: 24, color: Color(0xff565C5C)),), padding: EdgeInsets.all(15),), +RaisedButton(color: Color(0xffCCD2C6),shape: CircleBorder(), onPressed: _openParen, child: Text("(" , style: TextStyle(fontSize: 24, color: Color(0xff565C5C)),), padding: EdgeInsets.all(15),), +RaisedButton(color: Color(0xffCCD2C6),shape: CircleBorder(), onPressed: _closeParen, child: Text(")", style: TextStyle(fontSize: 24, color: Color(0xff565C5C)),), padding: EdgeInsets.all(15),), +],mainAxisAlignment: MainAxisAlignment.spaceEvenly,), +], )} \ No newline at end of file diff --git a/lib/app_state.dart b/lib/app_state.dart index 96d2753..62c487b 100644 --- a/lib/app_state.dart +++ b/lib/app_state.dart @@ -1,15 +1,15 @@ -class AppState { - bool isLoading; - String user; - - //Constructor - AppState({this.isLoading = false, this.user}); - - //A constructor for when the app is loading - factory AppState.loading() => new AppState(isLoading: true); - - @override - String toString() { - return 'AppState(isLoading: $isLoading, user: $user'; - } -} +class AppState { + bool isLoading; + String user; + + //Constructor + AppState({this.isLoading = false, this.user}); + + //A constructor for when the app is loading + factory AppState.loading() => new AppState(isLoading: true); + + @override + String toString() { + return 'AppState(isLoading: $isLoading, user: $user'; + } +} diff --git a/lib/app_state_container.dart b/lib/app_state_container.dart index de59bee..d5df114 100644 --- a/lib/app_state_container.dart +++ b/lib/app_state_container.dart @@ -1,69 +1,69 @@ -import 'app_state.dart'; -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; -import 'dart:async'; - -class AppStateContainer extends StatefulWidget { - //Container that allows for loading state management - final AppState state; - final Widget child; - - AppStateContainer({ - @required this.child, - this.state, - }); - - //Method to allow universal access to state management - static _AppStateContainerState of(BuildContext context) { - return (context.inheritFromWidgetOfExactType(_InheritedStateContainer) - as _InheritedStateContainer) - .data; - } - - @override - _AppStateContainerState createState() => _AppStateContainerState(); -} - -class _AppStateContainerState extends State { - AppState state; - - @override - void initState() { - super.initState(); - if (widget.state != null) { - state = widget.state; - } else { - state = new AppState.loading(); - startCountdown(); - } - } - - Future startCountdown() async { - const timeOut = const Duration(seconds: 2); - new Timer(timeOut, () { - setState(() { - state.isLoading = false; - }); - }); - } - - @override - Widget build(BuildContext context) { - return new _InheritedStateContainer(data: this, child: widget.child); - } -} - -class _InheritedStateContainer extends InheritedWidget { - //Data to pass down - final _AppStateContainerState data; - - _InheritedStateContainer({ - Key key, - @required this.data, - @required Widget child, - }) : super(key: key, child: child); - - //Method called by default when this widget data is changed - @override - bool updateShouldNotify(InheritedWidget oldWidget) => true; -} +import 'app_state.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'dart:async'; + +class AppStateContainer extends StatefulWidget { + //Container that allows for loading state management + final AppState state; + final Widget child; + + AppStateContainer({ + @required this.child, + this.state, + }); + + //Method to allow universal access to state management + static _AppStateContainerState of(BuildContext context) { + return (context.inheritFromWidgetOfExactType(_InheritedStateContainer) + as _InheritedStateContainer) + .data; + } + + @override + _AppStateContainerState createState() => _AppStateContainerState(); +} + +class _AppStateContainerState extends State { + AppState state; + + @override + void initState() { + super.initState(); + if (widget.state != null) { + state = widget.state; + } else { + state = new AppState.loading(); + startCountdown(); + } + } + + Future startCountdown() async { + const timeOut = const Duration(seconds: 2); + new Timer(timeOut, () { + setState(() { + state.isLoading = false; + }); + }); + } + + @override + Widget build(BuildContext context) { + return new _InheritedStateContainer(data: this, child: widget.child); + } +} + +class _InheritedStateContainer extends InheritedWidget { + //Data to pass down + final _AppStateContainerState data; + + _InheritedStateContainer({ + Key key, + @required this.data, + @required Widget child, + }) : super(key: key, child: child); + + //Method called by default when this widget data is changed + @override + bool updateShouldNotify(InheritedWidget oldWidget) => true; +} diff --git a/lib/audio.dart b/lib/audio.dart index e705019..8adbd83 100644 --- a/lib/audio.dart +++ b/lib/audio.dart @@ -1,24 +1,24 @@ -import 'dart:io'; - -import 'package:audioplayers/audioplayers.dart'; -import 'package:audioplayers/audio_cache.dart'; - -class Audio { - AudioCache audioCache = AudioCache(prefix: 'audio/'); - - /// Plays a single run of the given [file] - Future play(String file, {volume = 1.0}) { - return audioCache.play(file, volume: volume, mode: PlayerMode.LOW_LATENCY); - } - - - /// Prefetch an audio in the cache - Future load(String file) { - return audioCache.load(file); - } - - /// Clears all the audios in the cache - void clearAll() { - audioCache.clearCache(); - } +import 'dart:io'; + +import 'package:audioplayers/audioplayers.dart'; +import 'package:audioplayers/audio_cache.dart'; + +class Audio { + AudioCache audioCache = AudioCache(prefix: 'audio/'); + + /// Plays a single run of the given [file] + Future play(String file, {volume = 1.0}) { + return audioCache.play(file, volume: volume, mode: PlayerMode.LOW_LATENCY); + } + + + /// Prefetch an audio in the cache + Future load(String file) { + return audioCache.load(file); + } + + /// Clears all the audios in the cache + void clearAll() { + audioCache.clearCache(); + } } \ No newline at end of file diff --git a/lib/dataAccess.dart b/lib/dataAccess.dart index 9008e2f..dab3747 100644 --- a/lib/dataAccess.dart +++ b/lib/dataAccess.dart @@ -1,51 +1,51 @@ -import 'dart:async'; -import 'package:sqflite/sqflite.dart'; - -final String listTable = "MonitorLists"; -final String dataTable = "MonitorData"; - -class DataAccess { - static final DataAccess _instance = DataAccess._internal(); - Database _monitorLists; - Database _monitorData; - - factory DataAccess() { - return _instance; - } - - DataAccess._internal(); - - Future open() async { - var databasePath = await getDatabasesPath(); - String listPath = databasePath + "\\mLists.db"; - String dataPath = databasePath + "\\dList.db"; - - _monitorLists = await openDatabase(listPath, version: 1, - onCreate: (Database db, int version) async { - await db.execute(''' - create table MonitorLists ( - id interger primary key autoincrement, - listName text not null, - unit text not null - ); - '''); - }); - - _monitorData = await openDatabase(dataPath, version: 1, - onCreate: (Database db, int version) async { - await db.execute(''' - create table MonitorData ( - id integer primary key autoincrement, - listId integer not null, - value int not null, - date date not null, - foreign key (listId) references MonitorLists(id) - ); - '''); - }); - } - - Future> getLists() async { - var data = await _monitorLists.query("") - } +import 'dart:async'; +import 'package:sqflite/sqflite.dart'; + +final String listTable = "MonitorLists"; +final String dataTable = "MonitorData"; + +class DataAccess { + static final DataAccess _instance = DataAccess._internal(); + Database _monitorLists; + Database _monitorData; + + factory DataAccess() { + return _instance; + } + + DataAccess._internal(); + + Future open() async { + var databasePath = await getDatabasesPath(); + String listPath = databasePath + "\\mLists.db"; + String dataPath = databasePath + "\\dList.db"; + + _monitorLists = await openDatabase(listPath, version: 1, + onCreate: (Database db, int version) async { + await db.execute(''' + create table MonitorLists ( + id interger primary key autoincrement, + listName text not null, + unit text not null + ); + '''); + }); + + _monitorData = await openDatabase(dataPath, version: 1, + onCreate: (Database db, int version) async { + await db.execute(''' + create table MonitorData ( + id integer primary key autoincrement, + listId integer not null, + value int not null, + date date not null, + foreign key (listId) references MonitorLists(id) + ); + '''); + }); + } + + Future> getLists() async { + var data = await _monitorLists.query("") + } } \ No newline at end of file diff --git a/lib/db.dart b/lib/db.dart index 6ab3166..1a0700c 100644 --- a/lib/db.dart +++ b/lib/db.dart @@ -1,38 +1,38 @@ -import 'dart:async'; -import 'package:sqflite/sqflite.dart'; - -final String scoreTable = "Score"; - -class DataAccess { - static final DataAccess _instance = DataAccess._internal(); - Database _db; - - factory DataAccess() { - return _instance; - } - - DataAccess._internal(); - - Future open() async { - var databasePath = await getDatabasesPath(); - String path = databasePath + "\td.db"; - - _db = await openDatabase(path, version: 1, - onCreate: (Database db, int version) async { - await db.execute(''' - create table $scoreTable ( - score int default 0 - ); - '''); - }); - } - - Future getScore() async { - var res = await _db.query(scoreTable); - return res[0]; - } - - Future updateScore(int s) async { - return _db.update(scoreTable, s); - } -} +import 'dart:async'; +import 'package:sqflite/sqflite.dart'; + +final String scoreTable = "Score"; + +class DataAccess { + static final DataAccess _instance = DataAccess._internal(); + Database _db; + + factory DataAccess() { + return _instance; + } + + DataAccess._internal(); + + Future open() async { + var databasePath = await getDatabasesPath(); + String path = databasePath + "\td.db"; + + _db = await openDatabase(path, version: 1, + onCreate: (Database db, int version) async { + await db.execute(''' + create table $scoreTable ( + score int default 0 + ); + '''); + }); + } + + Future getScore() async { + var res = await _db.query(scoreTable); + return res[0]; + } + + Future updateScore(int s) async { + return _db.update(scoreTable, s); + } +} diff --git a/lib/main.dart b/lib/main.dart index 65e595f..41b8b1b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,495 +1,554 @@ -import 'dart:async'; -import 'package:flame/flame.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:shared_preferences/shared_preferences.dart'; -import 'MathEngine.dart'; -import 'package:flutter/services.dart'; - -void main() => runApp(MyApp()); - -Future _minTime = Future.delayed( - Duration(seconds: 2), - () => true -); - -Color textColor = Color(0xff565C5C); -Color backgroundColor = Color(0xffCCD2C6); - - -Widget newButton(String text, Function f) { - return RaisedButton( - color: backgroundColor, - shape: RoundedRectangleBorder( - borderRadius: new BorderRadius.circular(18.0)), - onPressed: f, - child: Text("$text", style: TextStyle(fontSize: 24, color: textColor), ), - padding: EdgeInsets.all(15), - animationDuration: Duration(microseconds: 0), - ); -} - -Widget helpElement(String head, String content) { - return Card( - color: Color(0xffCED4CC), - child: ListTile ( - title: Text("$head", style: TextStyle(fontSize: 24),), - subtitle: Text("$content", softWrap: true, style: TextStyle(fontSize: 18),), - ) - ); -} - -class Help extends StatelessWidget { - @override - Widget build(BuildContext context) { - return Scaffold( - body:Container( - color: Color(0xffCED4CC), - child: ListView( - children: [ - Center( - child: Text("Help", style: TextStyle(fontSize: 48, color: textColor)) - ), - helpElement("+", "Addition"), - helpElement("-", "Subtraction"), - helpElement("x", "Multiplication"), - helpElement("÷", "Division"), - helpElement("<", "Backspace"), - helpElement("!", "The ! or factorial is a single number operation. Unlike addition where you need two numbers, factorial only needs one. n! is equal to all the numbers from 1 to n multiplied. For example, 4! = 1 x 2 x 3 x 4 = 24"), - helpElement("²", "\"²\" or the squared operations is a single number operation. Unlike subtraction where you need two numbers, squaring only needs one. Squaring is part of a type of operations called exponentials. n² is equal to the number times it self. For example, 4² = 4 x 4 = 16. In general, an exponential multiplies the number by itself however many times the little number says. For example, 4³ = 4 x 4 x 4 = 64."), - helpElement("^", "The \"^\" is the symbol for exponentials. It is a lot simpler to write a carat then a little number for computers, so we use the carat. The number after the carat works just like the little number. For example, 4^2 = 4² = 4 x 4 = 16 and 4^3 = 4³ = 4 x 4 x 4 = 64."), - helpElement("√", "The √ or square root symbol is the opposite of the ² symbol. Unlike multiplication where you need two numbers, the square root only needs one. The √ asks what number can be multiplied by itself to equal n. For example √4 = 2 because 2² = 2 x 2 = 4") - ], - ), - ), - ); - } -} - - -class MyApp extends StatelessWidget { - // This widget is the root of your application. - @override - Widget build(BuildContext context) { - return MaterialApp( - title: 'Four Fours', - debugShowCheckedModeBanner: false, - theme: ThemeData( - primarySwatch: Colors.blue, - ), - home: Menu(), - routes: { - 'Play': (BuildContext context) => MyHomePage(gameType: 1), - 'Arcade': (BuildContext context) => MyHomePage(gameType: 2), - 'Help': (BuildContext context) => Help(), - }, -// home: MyHomePage(title: 'Four Fours'), - ); - } -} - -class Menu extends StatelessWidget { - @override - Widget build(BuildContext context) { - return FutureBuilder( - future: _minTime, - builder: (BuildContext context, AsyncSnapshot snapshot) { - Widget _body; - if (snapshot.hasData) { - _body = Container( - color: Color(0xffCED4CC), - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Image(image: AssetImage("assets/images/logo.png"), height: 200.0), - Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - newButton("Play", () => - Navigator.of(context).pushNamed('Play') - ), - newButton("Arcade", () => - Navigator.of(context).pushNamed('Arcade') - ), - newButton("Learn", () => { - Navigator.of(context).pushNamed('Help') - }), - - - - ], - ) - ], - ), - ); - } else { - _body = new Scaffold ( - backgroundColor: Color(0xffCED4CC), - body: Container( - color: Color(0xffCED4CC), - child: Center( - child: Image(image: AssetImage("assets/images/logo.gif"), height: 200.0), - ) - ) - ); - } - return _body; - }); -} -} - - -class LoadingScreen extends StatelessWidget { - @override - Widget build(BuildContext context) { - return new Container( - color: Color(0xffCED4CC), - child: Center( - child: Image(image: AssetImage("assets/images/logo.gif"), height: 200.0), - ) - ); - } -} - - -class MyHomePage extends StatefulWidget { - MyHomePage({ - Key key, - this.gameType - }): super(key: key); - - final int gameType; - - @override - _MyHomePageState createState() => _MyHomePageState(); -} - -class _MyHomePageState extends State < MyHomePage > { - int _counter = 4; - String _value = ""; - int _goal = 0; - int _score; - int _computation; - - Color orange = Color(0xffEE6E48); - Color darkGrey = Color(0xff565C5C); - Color lightGrey = Color(0xffCCD2C6); - - @override - void initState() { - super.initState(); - } - - void _plus() { - setState(() { - _value += "+"; - }); - } - - void correctSound() { - Flame.audio.play("correct.mp3"); - } - - void squared() { - setState(() { - _value += '\u00B2'; - }); - } - - void _factorial() { - setState(() { - _value += '!'; - }); - } - - void _exp() { - setState(() { - _value += "^"; - }); - } - - void _squared() { - setState(() { - _value += "²"; - }); - } - - void _minus() { - setState(() { - _value += "-"; - }); - } - - void _div() { - setState(() { - _value += "\u00F7"; - }); - } - - void _mult() { - setState(() { - _value += "x"; - }); - } - - void _sqrt() { - setState(() { - _value += '\u221a'; - }); - } - - void _openParen() { - setState(() { - _value += "("; - }); - } - - void _closeParen() { - setState(() { - _value += ")"; - }); - } - - void _decimal() { - setState(() { - _value += "."; - }); - } - - void _clear() { - setState(() { - _value = ""; - _counter = 4; - }); - } - - void _equals() { - setState(() { - _computation = mathEngine(_value).round(); - if (_computation == _goal && _counter == 0) { - _goal++; - correctSound(); - _updateScore(_goal); - _clear(); - } else { - if (_counter != 0) { - _value += "=$_computation"; - } else { - _value += "=$_computation"; - } - } - }); - } - - void _four() { - setState(() { - if (_counter == 0) { - } else { - _value += "4"; - _counter--; - } - }); - } - - void _backspace() { - setState(() { - int len = _value.length; - if (int.tryParse(_value.substring(len - 1)) != null) { - _counter++; - } - _value = _value.substring(0, len - 1); - }); - } - - - - - - @override - Widget build(BuildContext context) { - Flame.audio.load('correct.mp3'); - SystemChrome.setEnabledSystemUIOverlays([]); - _loadPage(); - return FutureBuilder( - future: _minTime, - builder: (BuildContext context, AsyncSnapshot snapshot) { - Widget _body; - if (snapshot.hasData) { - _body = gamePage(); - } - else { - _body = new Container( - color: Color(0xffCED4CC), - child: Center( - child: Image(image: AssetImage("assets/images/logo.gif"), height: 200.0), - ) - ); - } - return new Scaffold( - backgroundColor: Color(0xffCED4CC), - body: _body - ); - }, - ); -// startTimer(4); - //return new Scaffold( - //backgroundColor: Color(0xffCED4CC), - //body: gamePage(), - //); - - } - - Widget genRow(String t1, Function f1, String t2, Function f2, String t3, - Function f3) { - return Row( - children: < Widget > [ - newButton(t1, f1, lightGrey, darkGrey), - newButton(t2, f2, lightGrey, darkGrey), - newButton(t3, f3, lightGrey, darkGrey), - ], - mainAxisAlignment: MainAxisAlignment.spaceAround, - ); - } - - Widget newButton(String text, Function f, Color backgroundColor, - Color textColor) { - return RaisedButton( - color: backgroundColor, - shape: RoundedRectangleBorder( - borderRadius: new BorderRadius.circular(18.0)), - onPressed: f, - child: Text("$text", style: TextStyle(fontSize: 24, color: textColor), ), - padding: EdgeInsets.all(15), - animationDuration: Duration(microseconds: 0), - ); - } - - - - Widget gamePage() { - return Padding( - padding: EdgeInsets.only(top: MediaQuery - .of(context) - .size - .height * 0.08), - child: Center( - child: Column( - // mainAxisAlignment: MainAxisAlignment.center, - children: < Widget > [ - Row( - children: < Widget > [ - Column( - children: < Widget > [ - Text("Goal:"), - Text('$_goal', - style: Theme.of(context).textTheme.display2, ), - ], - ), - Column( - children: < Widget > [ - Text("Highscore:"), - Text('$_score', - style: Theme - .of(context) - .textTheme - .display2, ), - ], - ), - ], - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - ), - - - Container( - color: Colors.transparent, - child: Container( - child: SizedBox( - width: MediaQuery - .of(context) - .size - .width * 0.9, - height: MediaQuery - .of(context) - .size - .height * 0.1, - child: Center( - child: Text( - '$_value', - style: Theme - .of(context) - .textTheme - .display1, - textAlign: TextAlign.center, - ), - ) - ), - decoration: BoxDecoration( - color: Color(0xff8D9687), - borderRadius: BorderRadius.circular(MediaQuery - .of(context) - .size - .width * 0.04) - ), - ) - - ), - - Text( - "Fours Remaining: $_counter", - textAlign: TextAlign.center, - ), - - // Text('$_alert'), - SizedBox( - height: 500, - width: MediaQuery - .of(context) - .size - .width * 0.88, - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: < Widget > [ - genRow("²", _squared, ".", _decimal, "<", _backspace), - genRow("+", _plus, "-", _minus, "(", _openParen), - genRow("4", _four, "=", _equals, "C", _clear), - genRow("÷", _div, "x", _mult, ")", _closeParen), - genRow("!", _factorial, "^", _exp, "√", _sqrt) - ], - ), - ), - - ] - ) - ) - ); - } - - _loadPage() async { - await _getScore(); - if (widget.gameType == 1) { //Normal - _goal = _score + 1; - } - } - - _getScore() async { - SharedPreferences prefs = await SharedPreferences.getInstance(); - if (!prefs.containsKey("score")) { - await prefs.setInt("score", _goal); - } - _score = prefs.getInt("score"); - } - - _updateScore(int score) async { - SharedPreferences prefs = await SharedPreferences.getInstance(); - if (score > _score) { - _getScore(); - await prefs.setInt('score', score); - await prefs.commit(); - } - } - - @override - void dispose() { - super.dispose(); - } +import 'dart:async'; +import 'package:flame/flame.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'MathEngine.dart'; +import 'package:flutter/services.dart'; +import 'package:url_launcher/url_launcher.dart'; +void main() => runApp(MyApp()); + +Future _minTime = Future.delayed( + Duration(seconds: 4), + () => true +); + +Color textColor = Color(0xff565C5C); +Color backgroundColor = Color(0xffCCD2C6); + + +class About extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + + Text("Created by Sidney Nimako"), + FlatButton( + child: Text("snibo.me", style: TextStyle(decoration: TextDecoration.underline),), + onPressed: () => _launchSite("http://snibo.me"), + ), + FlatButton( + child: Text("Support me", style: TextStyle(decoration: TextDecoration.underline)), + onPressed: () => _launchSite("https://www.paypal.me/snibo/4444"), + ) + + ], + ), + ), + ); + } +} + +Future _launchSite(String url) async { + + if (await canLaunch(url)) { + await launch(url); + } else { + throw "Cannot open URL"; + } +} + +Widget newButton(String text, Function f) { + return RaisedButton( + color: backgroundColor, + shape: RoundedRectangleBorder( + borderRadius: new BorderRadius.circular(18.0)), + onPressed: f, + child: Text("$text", style: TextStyle(fontSize: 24, color: textColor), ), + padding: EdgeInsets.all(15), + animationDuration: Duration(microseconds: 1), + ); +} + +Widget helpElement(String head, String content) { + return Padding( + padding: EdgeInsets.all(15.0), + child: Card( + elevation: 0.0, + color: Color(0xffCED4CC), + child: ListTile ( + title: Text("$head", style: TextStyle(fontSize: 24),), + subtitle: Text("$content", softWrap: true, style: TextStyle(fontSize: 18),), + ) + ), + ); +} + +class Help extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body:Container( + color: Color(0xffCED4CC), + child: ListView( + children: [ + Center( + child: Padding( + padding: EdgeInsets.all(15.0), + child: Text("Learn", style: TextStyle(fontSize: 48, color: textColor)), + ) + ), + +// Padding( +// padding: EdgeInsets.symmetric(vertical: 7.5), +// child: Text("Operations", style: TextStyle(fontSize: 36, color: textColor),), +// ), +// helpElement("+", "Addition"), +// helpElement("-", "Subtraction"), +// helpElement("x", "Multiplication"), +// helpElement("÷", "Division"), +// helpElement("<", "Backspace"), + helpElement("!", "The ! or factorial is a single number operation.\nUnlike addition where you need two numbers, factorial only needs one.\n n! is equal to all the numbers from 1 to n multiplied.\n For example, 4! = 1 x 2 x 3 x 4 = 24"), + helpElement("²", "\"²\" or the squared operations is a single number operation.\nUnlike subtraction where you need two numbers, squaring only needs one.\nSquaring is part of a type of operations called exponentials.\nn² is equal to the number times it self.\nFor example, 4² = 4 x 4 = 16.\nIn general, an exponential multiplies the number by itself however many times the little number says.\nFor example, 4³ = 4 x 4 x 4 = 64."), + helpElement("^", "The \"^\" is the symbol for exponentials.\nIt is a lot simpler to write a carat then a little number for computers, so we use the carat.\nThe number after the carat works just like the little number.\nFor example, 4^2 = 4² = 4 x 4 = 16 and 4^3 = 4³ = 4 x 4 x 4 = 64."), + helpElement("√", "The √ or square root symbol is the opposite of the ² symbol.\nUnlike multiplication where you need two numbers, the square root only needs one.\nThe √ asks what number can be multiplied by itself to equal n.\nFor example √4 = 2 because 2² = 2 x 2 = 4") + ], + ), + ), + ); + } +} + + +class MyApp extends StatelessWidget { + // This widget is the root of your application. + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Four Fours', + debugShowCheckedModeBanner: false, + theme: ThemeData( + primarySwatch: Colors.blue, + ), + home: Menu(), + routes: { + 'Play': (BuildContext context) => MyHomePage(gameType: 1), + 'Arcade': (BuildContext context) => MyHomePage(gameType: 2), + 'Help': (BuildContext context) => Help(), + 'About': (BuildContext context) => About() + }, +// home: MyHomePage(title: 'Four Fours'), + ); + } +} + +class Menu extends StatelessWidget { + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: _minTime, + builder: (BuildContext context, AsyncSnapshot snapshot) { + Widget _body; + if (snapshot.hasData) { + _body = Container( + color: Color(0xffCED4CC), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Image(image: AssetImage("assets/images/logo.png"), height: 200.0), + Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: EdgeInsets.symmetric(vertical: 15.0), + child:newButton("Play", () => + Navigator.of(context).pushNamed('Play') + )), + Padding( + padding: EdgeInsets.symmetric(vertical: 15.0), + child: + newButton("Arcade", () => + Navigator.of(context).pushNamed('Arcade') + )), + Padding( + padding: EdgeInsets.symmetric(vertical: 15.0), + child: newButton("Learn", () => + Navigator.of(context).pushNamed('Help') + ), + ), + Padding( + padding: EdgeInsets.symmetric(vertical: 15.0), + child: newButton("About", () => + Navigator.of(context).pushNamed('About') + ), + ), + ], + ) + ], + ), + ); + } else { + _body = new Scaffold ( + backgroundColor: Color(0xffCED4CC), + body: Container( + color: Color(0xffCED4CC), + child: Center( + child: Image(image: AssetImage("assets/images/logo.gif"), height: 200.0), + ) + ) + ); + } + return _body; + }); +} +} + + +class LoadingScreen extends StatelessWidget { + @override + Widget build(BuildContext context) { + return new Container( + color: Color(0xffCED4CC), + child: Center( + child: Image(image: AssetImage("assets/images/logo.gif"), height: 200.0), + ) + ); + } +} + + +class MyHomePage extends StatefulWidget { + MyHomePage({ + Key key, + this.gameType + }): super(key: key); + + final int gameType; + + @override + _MyHomePageState createState() => _MyHomePageState(); +} + +class _MyHomePageState extends State < MyHomePage > { + int _counter = 4; + String _value = ""; + int _goal = 0; + int _score; + int _computation; + + Color orange = Color(0xffEE6E48); + Color darkGrey = Color(0xff565C5C); + Color lightGrey = Color(0xffCCD2C6); + + @override + void initState() { + super.initState(); + } + + void _plus() { + setState(() { + _value += "+"; + }); + } + + void correctSound() { + Flame.audio.play("correct.mp3"); + } + + void squared() { + setState(() { + _value += '\u00B2'; + }); + } + + void _factorial() { + setState(() { + _value += '!'; + }); + } + + void _exp() { + setState(() { + _value += "^"; + }); + } + + void _squared() { + setState(() { + _value += "²"; + }); + } + + void _minus() { + setState(() { + _value += "-"; + }); + } + + void _div() { + setState(() { + _value += "\u00F7"; + }); + } + + void _mult() { + setState(() { + _value += "x"; + }); + } + + void _sqrt() { + setState(() { + _value += '\u221a'; + }); + } + + void _openParen() { + setState(() { + _value += "("; + }); + } + + void _closeParen() { + setState(() { + _value += ")"; + }); + } + + void _decimal() { + setState(() { + _value += "."; + }); + } + + void _clear() { + setState(() { + _value = ""; + _counter = 4; + }); + } + + void _equals() { + setState(() { + _computation = mathEngine(_value).round(); + if (_computation == _goal && _counter == 0) { + _goal++; + correctSound(); + _updateScore(_goal); + _clear(); + } else { + if (_counter != 0) { + _value += "=$_computation"; + } else { + _value += "=$_computation"; + } + } + }); + } + + void _four() { + setState(() { + if (_counter == 0) { + } else { + _value += "4"; + _counter--; + } + }); + } + + void _backspace() { + setState(() { + int len = _value.length; + if (int.tryParse(_value.substring(len - 1)) != null) { + _counter++; + } + _value = _value.substring(0, len - 1); + }); + } + + + + + + @override + Widget build(BuildContext context) { + Flame.audio.load('correct.mp3'); + SystemChrome.setEnabledSystemUIOverlays([]); + _loadPage(); + return FutureBuilder( + future: _minTime, + builder: (BuildContext context, AsyncSnapshot snapshot) { + Widget _body; + if (snapshot.hasData) { + _body = gamePage(); + } + else { + _body = new Container( + color: Color(0xffCED4CC), + child: Center( + child: Image(image: AssetImage("assets/images/logo.gif"), height: 200.0), + ) + ); + } + return new Scaffold( + backgroundColor: Color(0xffCED4CC), + body: _body + ); + }, + ); +// startTimer(4); + //return new Scaffold( + //backgroundColor: Color(0xffCED4CC), + //body: gamePage(), + //); + + } + + Widget genRow(String t1, Function f1, String t2, Function f2, String t3, + Function f3) { + return Row( + children: < Widget > [ + newButton(t1, f1, lightGrey, darkGrey), + newButton(t2, f2, lightGrey, darkGrey), + newButton(t3, f3, lightGrey, darkGrey), + ], + mainAxisAlignment: MainAxisAlignment.spaceAround, + ); + } + + Widget newButton(String text, Function f, Color backgroundColor, + Color textColor) { + return RaisedButton( + color: backgroundColor, + shape: RoundedRectangleBorder( + borderRadius: new BorderRadius.circular(18.0)), + onPressed: f, + child: Text("$text", style: TextStyle(fontSize: 24, color: textColor), ), + padding: EdgeInsets.all(15), + animationDuration: Duration(microseconds: 0), + ); + } + + + + Widget gamePage() { + return Padding( + padding: EdgeInsets.only(top: MediaQuery + .of(context) + .size + .height * 0.08), + child: Center( + child: Column( + // mainAxisAlignment: MainAxisAlignment.center, + children: < Widget > [ + Row( + children: < Widget > [ + Column( + children: < Widget > [ + Text("Goal:"), + Text('$_goal', + style: Theme.of(context).textTheme.display2, ), + ], + ), + Column( + children: < Widget > [ + Text("Highscore:"), + Text('$_score', + style: Theme + .of(context) + .textTheme + .display2, ), + ], + ), + ], + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + ), + + + Container( + color: Colors.transparent, + child: Container( + child: SizedBox( + width: MediaQuery + .of(context) + .size + .width * 0.9, + height: MediaQuery + .of(context) + .size + .height * 0.1, + child: Center( + child: Text( + '$_value', + style: Theme + .of(context) + .textTheme + .display1, + textAlign: TextAlign.center, + ), + ) + ), + decoration: BoxDecoration( + color: Color(0xff8D9687), + borderRadius: BorderRadius.circular(MediaQuery + .of(context) + .size + .width * 0.04) + ), + ) + + ), + + Text( + "Fours Remaining: $_counter", + textAlign: TextAlign.center, + ), + + // Text('$_alert'), + SizedBox( + height: 500, + width: MediaQuery + .of(context) + .size + .width * 0.88, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: < Widget > [ + genRow("²", _squared, ".", _decimal, "<", _backspace), + genRow("+", _plus, "-", _minus, "(", _openParen), + genRow("4", _four, "=", _equals, "C", _clear), + genRow("÷", _div, "x", _mult, ")", _closeParen), + genRow("!", _factorial, "^", _exp, "√", _sqrt) + ], + ), + ), + + ] + ) + ) + ); + } + + _loadPage() async { + await _getScore(); + if (widget.gameType == 1) { //Normal + _goal = _score + 1; + } + } + + _getScore() async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + if (!prefs.containsKey("score")) { + await prefs.setInt("score", _goal); + } + _score = prefs.getInt("score"); + } + + _updateScore(int score) async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + if (score > _score) { + _getScore(); + await prefs.setInt('score', score); + await prefs.commit(); + } + } + + @override + void dispose() { + super.dispose(); + } } \ No newline at end of file diff --git a/lib/storage.dart b/lib/storage.dart index aacbc8e..039a345 100644 --- a/lib/storage.dart +++ b/lib/storage.dart @@ -1,14 +1,14 @@ -String _generateKey -( - -String id = 1, - String -key) { -return "$id/$key"; -} - -@override -void saveString(String userId, String key, int score) async { - final prefs = await SharedPreferences.getInstance(); - await pres._setString("Highscore", score) +String _generateKey +( + +String id = 1, + String +key) { +return "$id/$key"; +} + +@override +void saveString(String userId, String key, int score) async { + final prefs = await SharedPreferences.getInstance(); + await pres._setString("Highscore", score) } \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index 880918d..c7fb000 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -7,56 +7,56 @@ packages: name: archive url: "https://pub.dartlang.org" source: hosted - version: "2.0.11" + version: "2.0.13" args: dependency: transitive description: name: args url: "https://pub.dartlang.org" source: hosted - version: "1.5.2" + version: "1.6.0" async: dependency: transitive description: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.4.0" + version: "2.4.1" audioplayers: dependency: "direct main" description: name: audioplayers url: "https://pub.dartlang.org" source: hosted - version: "0.13.1" + version: "0.15.1" boolean_selector: dependency: transitive description: name: boolean_selector url: "https://pub.dartlang.org" source: hosted - version: "1.0.5" + version: "2.0.0" box2d_flame: dependency: transitive description: name: box2d_flame url: "https://pub.dartlang.org" source: hosted - version: "0.4.4" + version: "0.4.6" charcode: dependency: transitive description: name: charcode url: "https://pub.dartlang.org" source: hosted - version: "1.1.2" + version: "1.1.3" collection: dependency: transitive description: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.14.11" + version: "1.14.12" convert: dependency: transitive description: @@ -70,35 +70,42 @@ packages: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "2.1.3" + version: "2.1.4" cupertino_icons: dependency: "direct main" description: name: cupertino_icons url: "https://pub.dartlang.org" source: hosted - version: "0.1.2" + version: "0.1.3" + file: + dependency: transitive + description: + name: file + url: "https://pub.dartlang.org" + source: hosted + version: "5.2.0" flame: dependency: "direct main" description: name: flame url: "https://pub.dartlang.org" source: hosted - version: "0.15.1" + version: "0.20.2" flare_dart: dependency: transitive description: name: flare_dart url: "https://pub.dartlang.org" source: hosted - version: "1.4.4" + version: "2.3.4" flare_flutter: dependency: transitive description: name: flare_flutter url: "https://pub.dartlang.org" source: hosted - version: "1.5.5" + version: "2.0.3" flutter: dependency: "direct main" description: flutter @@ -110,7 +117,7 @@ packages: name: flutter_svg url: "https://pub.dartlang.org" source: hosted - version: "0.14.0" + version: "0.17.4" flutter_test: dependency: "direct dev" description: flutter @@ -127,7 +134,14 @@ packages: name: image url: "https://pub.dartlang.org" source: hosted - version: "2.1.4" + version: "2.1.12" + intl: + dependency: transitive + description: + name: intl + url: "https://pub.dartlang.org" + source: hosted + version: "0.16.1" matcher: dependency: transitive description: @@ -148,7 +162,7 @@ packages: name: ordered_set url: "https://pub.dartlang.org" source: hosted - version: "1.1.2" + version: "2.0.0" path: dependency: transitive description: @@ -176,14 +190,28 @@ packages: name: path_provider url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" - pedantic: + version: "1.6.11" + path_provider_linux: dependency: transitive description: - name: pedantic + name: path_provider_linux url: "https://pub.dartlang.org" source: hosted - version: "1.8.0+1" + version: "0.0.1+1" + path_provider_macos: + dependency: transitive + description: + name: path_provider_macos + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.4+3" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" petitparser: dependency: transitive description: @@ -191,41 +219,76 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.4.0" + platform: + dependency: transitive + description: + name: platform + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.1" + platform_detect: + dependency: transitive + description: + name: platform_detect + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.0" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" + process: + dependency: transitive + description: + name: process + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.13" + pub_semver: + dependency: transitive + description: + name: pub_semver + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.4" quiver: dependency: transitive description: name: quiver url: "https://pub.dartlang.org" source: hosted - version: "2.0.5" + version: "2.1.3" shared_preferences: dependency: "direct main" description: name: shared_preferences url: "https://pub.dartlang.org" source: hosted - version: "0.5.6" + version: "0.5.7+3" shared_preferences_macos: dependency: transitive description: name: shared_preferences_macos url: "https://pub.dartlang.org" source: hosted - version: "0.0.1+3" + version: "0.0.1+10" shared_preferences_platform_interface: dependency: transitive description: name: shared_preferences_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "1.0.4" shared_preferences_web: dependency: transitive description: name: shared_preferences_web url: "https://pub.dartlang.org" source: hosted - version: "0.1.2+2" + version: "0.1.2+7" sky_engine: dependency: transitive description: flutter @@ -237,14 +300,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.5.5" - splashscreen: - dependency: "direct main" - description: - name: splashscreen - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" + version: "1.7.0" stack_trace: dependency: transitive description: @@ -272,7 +328,7 @@ packages: name: synchronized url: "https://pub.dartlang.org" source: hosted - version: "2.1.0+1" + version: "2.2.0" term_glyph: dependency: transitive description: @@ -286,7 +342,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.11" + version: "0.2.15" tiled: dependency: transitive description: @@ -301,13 +357,41 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.6" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + url: "https://pub.dartlang.org" + source: hosted + version: "5.4.11" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.1+7" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.7" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.1+6" uuid: dependency: transitive description: name: uuid url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.1.0" vector_math: dependency: transitive description: @@ -315,13 +399,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.8" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.0" xml: dependency: transitive description: name: xml url: "https://pub.dartlang.org" source: hosted - version: "3.5.0" + version: "3.6.1" sdks: - dart: ">=2.4.0 <3.0.0" - flutter: ">=1.12.13+hotfix.4 <2.0.0" + dart: ">=2.6.0 <3.0.0" + flutter: ">=1.12.13+hotfix.5 <2.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index 57ee753..b05a245 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,81 +1,81 @@ -name: four -description: Four fours game - -# The following defines the version and build number for your application. -# A version number is three numbers separated by dots, like 1.2.43 -# followed by an optional build number separated by a +. -# Both the version and the builder number may be overridden in flutter -# build by specifying --build-name and --build-number, respectively. -# In Android, build-name is used as versionName while build-number used as versionCode. -# Read more about Android versioning at https://developer.android.com/studio/publish/versioning -# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. -# Read more about iOS versioning at -# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 1.0.0+1 - -environment: - sdk: ">=2.1.0 <3.0.0" - -dependencies: - audioplayers: ^0.13.0 - path_provider: ^1.1.0 - shared_preferences: ^0.5.6 - splashscreen: ^1.2.0 - flame: ^0.15.1 - flutter: - sdk: flutter - - # The following adds the Cupertino Icons font to your application. - # Use with the CupertinoIcons class for iOS style icons. - cupertino_icons: ^0.1.2 - -dev_dependencies: - flutter_test: - sdk: flutter - - -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec - -# The following section is specific to Flutter. -flutter: - - # The following line ensures that the Material Icons font is - # included with your application, so that you can use the icons in - # the material Icons class. - uses-material-design: true - - # To add assets to your application, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/assets-and-images/#resolution-aware. - - # For details regarding adding assets from package dependencies, see - # https://flutter.dev/assets-and-images/#from-packages - - # To add custom fonts to your application, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts from package dependencies, - # see https://flutter.dev/custom-fonts/#from-packages - assets: - - assets/audio/correct.mp3 - - assets/images/logo.gif - - assets/images/logo.png +name: four +description: Four fours game + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +version: 1.0.0+1 + +environment: + sdk: ">=2.1.0 <3.0.0" + +dependencies: + audioplayers: ^0.15.1 + path_provider: ^1.1.0 + shared_preferences: ^0.5.6 + flame: ^0.20.1 + url_launcher: ^5.4.11 + flutter: + sdk: flutter + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^0.1.2 + +dev_dependencies: + flutter_test: + sdk: flutter + + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter. +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + + # To add assets to your application, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware. + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/assets-and-images/#from-packages + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/custom-fonts/#from-packages + assets: + - assets/audio/correct.mp3 + - assets/images/logo.gif + - assets/images/logo.png diff --git a/test/widget_test.dart b/test/widget_test.dart index ac0c21b..6083cca 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -1,30 +1,30 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. For example, you can send tap and scroll -// gestures. You can also use WidgetTester to find child widgets in the widget -// tree, read text, and verify that the values of widget properties are correct. - -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import 'package:four/main.dart'; - -void main() { - testWidgets('Counter increments smoke test', (WidgetTester tester) async { - // Build our app and trigger a frame. - await tester.pumpWidget(MyApp()); - - // Verify that our counter starts at 0. - expect(find.text('0'), findsOneWidget); - expect(find.text('1'), findsNothing); - - // Tap the '+' icon and trigger a frame. - await tester.tap(find.byIcon(Icons.add)); - await tester.pump(); - - // Verify that our counter has incremented. - expect(find.text('0'), findsNothing); - expect(find.text('1'), findsOneWidget); - }); -} +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility that Flutter provides. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'package:four/main.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(MyApp()); + + // Verify that our counter starts at 0. + expect(find.text('0'), findsOneWidget); + expect(find.text('1'), findsNothing); + + // Tap the '+' icon and trigger a frame. + await tester.tap(find.byIcon(Icons.add)); + await tester.pump(); + + // Verify that our counter has incremented. + expect(find.text('0'), findsNothing); + expect(find.text('1'), findsOneWidget); + }); +} From 57f2a6a92c71d598f065f97ea34c3790ca43913b Mon Sep 17 00:00:00 2001 From: Sidney NiBo Date: Sat, 20 Jun 2020 18:29:48 -0500 Subject: [PATCH 5/7] Reorganization --- lib/About.dart | 28 +++ lib/Game.dart | 343 ++++++++++++++++++++++++++++++ lib/Help.dart | 27 +++ lib/Menu.dart | 70 +++++++ lib/Themes.dart | 17 ++ lib/main.dart | 540 +----------------------------------------------- lib/utils.dart | 44 ++++ 7 files changed, 538 insertions(+), 531 deletions(-) create mode 100644 lib/About.dart create mode 100644 lib/Game.dart create mode 100644 lib/Help.dart create mode 100644 lib/Menu.dart create mode 100644 lib/Themes.dart create mode 100644 lib/utils.dart diff --git a/lib/About.dart b/lib/About.dart new file mode 100644 index 0000000..7c9108b --- /dev/null +++ b/lib/About.dart @@ -0,0 +1,28 @@ +import 'package:flutter/material.dart'; +import 'utils.dart'; + +class About extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + + Text("Created by Sidney Nimako"), + FlatButton( + child: Text("snibo.me", style: TextStyle(decoration: TextDecoration.underline),), + onPressed: () => launchSite("http://snibo.me"), + ), + FlatButton( + child: Text("Support me", style: TextStyle(decoration: TextDecoration.underline)), + onPressed: () => launchSite("https://www.paypal.me/snibo/4444"), + ) + + ], + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/Game.dart b/lib/Game.dart new file mode 100644 index 0000000..3694e85 --- /dev/null +++ b/lib/Game.dart @@ -0,0 +1,343 @@ +import 'package:flutter/material.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:flame/flame.dart'; +import 'package:flutter/services.dart'; + +import 'MathEngine.dart'; +import 'utils.dart'; + +class GamePage extends StatefulWidget { + GamePage({ + Key key, + this.gameType + }): super(key: key); + + final int gameType; + + @override + _GamePageState createState() => _GamePageState(); +} + +class _GamePageState extends State < GamePage > { + int _counter = 4; + String _value = ""; + int _goal = 0; + int _score; + int _computation; + + @override + void initState() { + super.initState(); + } + + void _plus() { + setState(() { + _value += "+"; + }); + } + + void correctSound() { + Flame.audio.play("correct.mp3"); + } + + void squared() { + setState(() { + _value += '\u00B2'; + }); + } + + void _factorial() { + setState(() { + _value += '!'; + }); + } + + void _exp() { + setState(() { + _value += "^"; + }); + } + + void _squared() { + setState(() { + _value += "²"; + }); + } + + void _minus() { + setState(() { + _value += "-"; + }); + } + + void _div() { + setState(() { + _value += "\u00F7"; + }); + } + + void _mult() { + setState(() { + _value += "x"; + }); + } + + void _sqrt() { + setState(() { + _value += '\u221a'; + }); + } + + void _openParen() { + setState(() { + _value += "("; + }); + } + + void _closeParen() { + setState(() { + _value += ")"; + }); + } + + void _decimal() { + setState(() { + _value += "."; + }); + } + + void _clear() { + setState(() { + _value = ""; + _counter = 4; + }); + } + + void _equals() { + setState(() { + _computation = mathEngine(_value).round(); + if (_computation == _goal && _counter == 0) { + _goal++; + correctSound(); + _updateScore(_goal); + _clear(); + } else { + if (_counter != 0) { + _value += "=$_computation"; + } else { + _value += "=$_computation"; + } + } + }); + } + + void _four() { + setState(() { + if (_counter == 0) { + } else { + _value += "4"; + _counter--; + } + }); + } + + void _backspace() { + setState(() { + int len = _value.length; + if (int.tryParse(_value.substring(len - 1)) != null) { + _counter++; + } + _value = _value.substring(0, len - 1); + }); + } + + + + + + @override + Widget build(BuildContext context) { + Flame.audio.load('correct.mp3'); + SystemChrome.setEnabledSystemUIOverlays([]); + _loadPage(); + return FutureBuilder( + future: + Future.delayed( + Duration(seconds: minTime), + () => true + ), + builder: (BuildContext context, AsyncSnapshot snapshot) { + Widget _body; + if (snapshot.hasData) { + _body = gamePage(); + } + else { + _body = new Container( + color: Theme.of(context).accentColor, + child: Center( + child: Image(image: AssetImage("assets/images/logo.gif"), height: 200.0), + ) + ); + } + return new Scaffold( + backgroundColor: Theme.of(context).accentColor, + body: _body + ); + }, + ); +// startTimer(4); + //return new Scaffold( + //backgroundColor: Color(0xffCED4CC), + //body: gamePage(), + //); + + } + + Widget genRow(String t1, Function f1, String t2, Function f2, String t3, + Function f3) { + return Row( + children: < Widget > [ + newButton(t1, f1, Theme.of(context).backgroundColor, Theme.of(context).textTheme.bodyText1.color), + newButton(t2, f2, Theme.of(context).backgroundColor, Theme.of(context).textTheme.bodyText1.color), + newButton(t3, f3, Theme.of(context).backgroundColor, Theme.of(context).textTheme.bodyText1.color), + ], + mainAxisAlignment: MainAxisAlignment.spaceAround, + ); + } + + Widget newButton(String text, Function f, Color backgroundColor, + Color textColor) { + return RaisedButton( + color: backgroundColor, + shape: RoundedRectangleBorder( + borderRadius: new BorderRadius.circular(18.0)), + onPressed: f, + child: Text("$text", style: TextStyle(fontSize: 24, color: Theme.of(context).textTheme.bodyText1.color), ), + padding: EdgeInsets.all(15), + animationDuration: Duration(microseconds: 0), + ); + } + + + + Widget gamePage() { + return Padding( + padding: EdgeInsets.only(top: MediaQuery + .of(context) + .size + .height * 0.08), + child: Center( + child: Column( + // mainAxisAlignment: MainAxisAlignment.center, + children: < Widget > [ + Row( + children: < Widget > [ + Column( + children: < Widget > [ + Text("Goal:"), + Text('$_goal', + style: Theme.of(context).textTheme.headline3), + ], + ), + Column( + children: < Widget > [ + Text("Highscore:"), + Text('$_score', style: Theme.of(context).textTheme.headline3,), + ], + ), + ], + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + ), + + + Container( + color: Colors.transparent, + child: Container( + child: SizedBox( + width: MediaQuery + .of(context) + .size + .width * 0.9, + height: MediaQuery + .of(context) + .size + .height * 0.1, + child: Center( + child: Text( + '$_value', + style: Theme + .of(context) + .textTheme + .headline4, + textAlign: TextAlign.center, + ), + ) + ), + decoration: BoxDecoration( + color: Theme.of(context).primaryColorDark, + borderRadius: BorderRadius.circular(MediaQuery + .of(context) + .size + .width * 0.04) + ), + ) + + ), + + Text( + "Fours Remaining: $_counter", + textAlign: TextAlign.center, + ), + + SizedBox( + height: 500, + width: MediaQuery + .of(context) + .size + .width * 0.88, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: < Widget > [ + genRow("²", _squared, ".", _decimal, "<", _backspace), + genRow("+", _plus, "-", _minus, "(", _openParen), + genRow("4", _four, "=", _equals, "C", _clear), + genRow("÷", _div, "x", _mult, ")", _closeParen), + genRow("!", _factorial, "^", _exp, "√", _sqrt) + ], + ), + ), + + ] + ) + ) + ); + } + + _loadPage() async { + await _getScore(); + if (widget.gameType == 1) { //Normal + _goal = _score + 1; + } + } + + _getScore() async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + if (!prefs.containsKey("score")) { + await prefs.setInt("score", _goal); + } + _score = prefs.getInt("score"); + } + + _updateScore(int score) async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + if (score > _score) { + _getScore(); + await prefs.setInt('score', score); + } + } + + @override + void dispose() { + super.dispose(); + } +} \ No newline at end of file diff --git a/lib/Help.dart b/lib/Help.dart new file mode 100644 index 0000000..24abce3 --- /dev/null +++ b/lib/Help.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; +import 'utils.dart'; + +class Help extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body:Container( + color: Color(0xffCED4CC), + child: ListView( + children: [ + Center( + child: Padding( + padding: EdgeInsets.all(15.0), + child: Text("Learn", style: TextStyle(fontSize: 48, color: Theme.of(context).textTheme.bodyText1.color)), + ) + ), + helpElement("!", "The ! or factorial is a single number operation.\nUnlike addition where you need two numbers, factorial only needs one.\n n! is equal to all the numbers from 1 to n multiplied.\n For example, 4! = 1 x 2 x 3 x 4 = 24", context), + helpElement("²", "\"²\" or the squared operations is a single number operation.\nUnlike subtraction where you need two numbers, squaring only needs one.\nSquaring is part of a type of operations called exponentials.\nn² is equal to the number times it self.\nFor example, 4² = 4 x 4 = 16.\nIn general, an exponential multiplies the number by itself however many times the little number says.\nFor example, 4³ = 4 x 4 x 4 = 64.", context), + helpElement("^", "The \"^\" is the symbol for exponentials.\nIt is a lot simpler to write a carat then a little number for computers, so we use the carat.\nThe number after the carat works just like the little number.\nFor example, 4^2 = 4² = 4 x 4 = 16 and 4^3 = 4³ = 4 x 4 x 4 = 64.", context), + helpElement("√", "The √ or square root symbol is the opposite of the ² symbol.\nUnlike multiplication where you need two numbers, the square root only needs one.\nThe √ asks what number can be multiplied by itself to equal n.\nFor example √4 = 2 because 2² = 2 x 2 = 4", context) + ], + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/Menu.dart b/lib/Menu.dart new file mode 100644 index 0000000..eef952f --- /dev/null +++ b/lib/Menu.dart @@ -0,0 +1,70 @@ +import 'package:flutter/material.dart'; +import 'utils.dart'; + +class Menu extends StatelessWidget { + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: Future.delayed( + Duration(seconds: minTime), + () => true + ), + builder: (BuildContext context, AsyncSnapshot snapshot) { + Widget _body; + if (snapshot.hasData) { + _body = Container( + color: Color(0xffCED4CC), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Image(image: AssetImage("assets/images/logo.png"), height: 200.0), + Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: EdgeInsets.symmetric(vertical: 15.0), + child:newButton("Play", () => + Navigator.of(context).pushNamed('Play'), + context + ),), + Padding( + padding: EdgeInsets.symmetric(vertical: 15.0), + child: + newButton("Arcade", () => + Navigator.of(context).pushNamed('Arcade'), + context + ),), + Padding( + padding: EdgeInsets.symmetric(vertical: 15.0), + child: newButton("Learn", () => + Navigator.of(context).pushNamed('Help'), + context + ), + ), + Padding( + padding: EdgeInsets.symmetric(vertical: 15.0), + child: newButton("About", () => + Navigator.of(context).pushNamed('About'), + context + ), + ), + ], + ) + ], + ), + ); + } else { + _body = new Scaffold ( + backgroundColor: Color(0xffCED4CC), + body: Container( + color: Color(0xffCED4CC), + child: Center( + child: Image(image: AssetImage("assets/images/logo.gif"), height: 200.0), + ) + ) + ); + } + return _body; + }); + } +} diff --git a/lib/Themes.dart b/lib/Themes.dart new file mode 100644 index 0000000..f67af58 --- /dev/null +++ b/lib/Themes.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; + +int theme = 0; + +List themes = [theme1]; + + +ThemeData theme1 = new ThemeData( + backgroundColor: Color(0xffCCD2C6), //Dark grey + accentColor: Color(0xffCED4CC), //Light grey + primaryColor: Color(0xffEE6E48), //Logo and Accents + primaryColorDark: Color(0xff8D9687), //Window color + textTheme: TextTheme( + bodyText1: TextStyle(color: Color(0xff565C5C)) //Text Color + ) + +); \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index 41b8b1b..1986e79 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,118 +1,14 @@ -import 'dart:async'; -import 'package:flame/flame.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:shared_preferences/shared_preferences.dart'; -import 'MathEngine.dart'; -import 'package:flutter/services.dart'; -import 'package:url_launcher/url_launcher.dart'; -void main() => runApp(MyApp()); - -Future _minTime = Future.delayed( - Duration(seconds: 4), - () => true -); - -Color textColor = Color(0xff565C5C); -Color backgroundColor = Color(0xffCCD2C6); - - -class About extends StatelessWidget { - @override - Widget build(BuildContext context) { - return Scaffold( - body: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - - Text("Created by Sidney Nimako"), - FlatButton( - child: Text("snibo.me", style: TextStyle(decoration: TextDecoration.underline),), - onPressed: () => _launchSite("http://snibo.me"), - ), - FlatButton( - child: Text("Support me", style: TextStyle(decoration: TextDecoration.underline)), - onPressed: () => _launchSite("https://www.paypal.me/snibo/4444"), - ) - - ], - ), - ), - ); - } -} - -Future _launchSite(String url) async { - - if (await canLaunch(url)) { - await launch(url); - } else { - throw "Cannot open URL"; - } -} -Widget newButton(String text, Function f) { - return RaisedButton( - color: backgroundColor, - shape: RoundedRectangleBorder( - borderRadius: new BorderRadius.circular(18.0)), - onPressed: f, - child: Text("$text", style: TextStyle(fontSize: 24, color: textColor), ), - padding: EdgeInsets.all(15), - animationDuration: Duration(microseconds: 1), - ); -} -Widget helpElement(String head, String content) { - return Padding( - padding: EdgeInsets.all(15.0), - child: Card( - elevation: 0.0, - color: Color(0xffCED4CC), - child: ListTile ( - title: Text("$head", style: TextStyle(fontSize: 24),), - subtitle: Text("$content", softWrap: true, style: TextStyle(fontSize: 18),), - ) - ), - ); -} +import 'About.dart'; +import 'Game.dart'; +import 'Menu.dart'; +import 'Help.dart'; +import 'Themes.dart'; -class Help extends StatelessWidget { - @override - Widget build(BuildContext context) { - return Scaffold( - body:Container( - color: Color(0xffCED4CC), - child: ListView( - children: [ - Center( - child: Padding( - padding: EdgeInsets.all(15.0), - child: Text("Learn", style: TextStyle(fontSize: 48, color: textColor)), - ) - ), - -// Padding( -// padding: EdgeInsets.symmetric(vertical: 7.5), -// child: Text("Operations", style: TextStyle(fontSize: 36, color: textColor),), -// ), -// helpElement("+", "Addition"), -// helpElement("-", "Subtraction"), -// helpElement("x", "Multiplication"), -// helpElement("÷", "Division"), -// helpElement("<", "Backspace"), - helpElement("!", "The ! or factorial is a single number operation.\nUnlike addition where you need two numbers, factorial only needs one.\n n! is equal to all the numbers from 1 to n multiplied.\n For example, 4! = 1 x 2 x 3 x 4 = 24"), - helpElement("²", "\"²\" or the squared operations is a single number operation.\nUnlike subtraction where you need two numbers, squaring only needs one.\nSquaring is part of a type of operations called exponentials.\nn² is equal to the number times it self.\nFor example, 4² = 4 x 4 = 16.\nIn general, an exponential multiplies the number by itself however many times the little number says.\nFor example, 4³ = 4 x 4 x 4 = 64."), - helpElement("^", "The \"^\" is the symbol for exponentials.\nIt is a lot simpler to write a carat then a little number for computers, so we use the carat.\nThe number after the carat works just like the little number.\nFor example, 4^2 = 4² = 4 x 4 = 16 and 4^3 = 4³ = 4 x 4 x 4 = 64."), - helpElement("√", "The √ or square root symbol is the opposite of the ² symbol.\nUnlike multiplication where you need two numbers, the square root only needs one.\nThe √ asks what number can be multiplied by itself to equal n.\nFor example √4 = 2 because 2² = 2 x 2 = 4") - ], - ), - ), - ); - } -} +void main() => runApp(MyApp()); class MyApp extends StatelessWidget { // This widget is the root of your application. @@ -121,434 +17,16 @@ class MyApp extends StatelessWidget { return MaterialApp( title: 'Four Fours', debugShowCheckedModeBanner: false, - theme: ThemeData( - primarySwatch: Colors.blue, - ), + theme: themes[theme], home: Menu(), routes: { - 'Play': (BuildContext context) => MyHomePage(gameType: 1), - 'Arcade': (BuildContext context) => MyHomePage(gameType: 2), + 'Play': (BuildContext context) => GamePage(gameType: 1), + 'Arcade': (BuildContext context) => GamePage(gameType: 2), 'Help': (BuildContext context) => Help(), 'About': (BuildContext context) => About() }, -// home: MyHomePage(title: 'Four Fours'), ); } } -class Menu extends StatelessWidget { - @override - Widget build(BuildContext context) { - return FutureBuilder( - future: _minTime, - builder: (BuildContext context, AsyncSnapshot snapshot) { - Widget _body; - if (snapshot.hasData) { - _body = Container( - color: Color(0xffCED4CC), - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Image(image: AssetImage("assets/images/logo.png"), height: 200.0), - Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Padding( - padding: EdgeInsets.symmetric(vertical: 15.0), - child:newButton("Play", () => - Navigator.of(context).pushNamed('Play') - )), - Padding( - padding: EdgeInsets.symmetric(vertical: 15.0), - child: - newButton("Arcade", () => - Navigator.of(context).pushNamed('Arcade') - )), - Padding( - padding: EdgeInsets.symmetric(vertical: 15.0), - child: newButton("Learn", () => - Navigator.of(context).pushNamed('Help') - ), - ), - Padding( - padding: EdgeInsets.symmetric(vertical: 15.0), - child: newButton("About", () => - Navigator.of(context).pushNamed('About') - ), - ), - ], - ) - ], - ), - ); - } else { - _body = new Scaffold ( - backgroundColor: Color(0xffCED4CC), - body: Container( - color: Color(0xffCED4CC), - child: Center( - child: Image(image: AssetImage("assets/images/logo.gif"), height: 200.0), - ) - ) - ); - } - return _body; - }); -} -} - - -class LoadingScreen extends StatelessWidget { - @override - Widget build(BuildContext context) { - return new Container( - color: Color(0xffCED4CC), - child: Center( - child: Image(image: AssetImage("assets/images/logo.gif"), height: 200.0), - ) - ); - } -} - - -class MyHomePage extends StatefulWidget { - MyHomePage({ - Key key, - this.gameType - }): super(key: key); - - final int gameType; - - @override - _MyHomePageState createState() => _MyHomePageState(); -} - -class _MyHomePageState extends State < MyHomePage > { - int _counter = 4; - String _value = ""; - int _goal = 0; - int _score; - int _computation; - - Color orange = Color(0xffEE6E48); - Color darkGrey = Color(0xff565C5C); - Color lightGrey = Color(0xffCCD2C6); - - @override - void initState() { - super.initState(); - } - - void _plus() { - setState(() { - _value += "+"; - }); - } - - void correctSound() { - Flame.audio.play("correct.mp3"); - } - - void squared() { - setState(() { - _value += '\u00B2'; - }); - } - - void _factorial() { - setState(() { - _value += '!'; - }); - } - - void _exp() { - setState(() { - _value += "^"; - }); - } - - void _squared() { - setState(() { - _value += "²"; - }); - } - void _minus() { - setState(() { - _value += "-"; - }); - } - - void _div() { - setState(() { - _value += "\u00F7"; - }); - } - - void _mult() { - setState(() { - _value += "x"; - }); - } - - void _sqrt() { - setState(() { - _value += '\u221a'; - }); - } - - void _openParen() { - setState(() { - _value += "("; - }); - } - - void _closeParen() { - setState(() { - _value += ")"; - }); - } - - void _decimal() { - setState(() { - _value += "."; - }); - } - - void _clear() { - setState(() { - _value = ""; - _counter = 4; - }); - } - - void _equals() { - setState(() { - _computation = mathEngine(_value).round(); - if (_computation == _goal && _counter == 0) { - _goal++; - correctSound(); - _updateScore(_goal); - _clear(); - } else { - if (_counter != 0) { - _value += "=$_computation"; - } else { - _value += "=$_computation"; - } - } - }); - } - - void _four() { - setState(() { - if (_counter == 0) { - } else { - _value += "4"; - _counter--; - } - }); - } - - void _backspace() { - setState(() { - int len = _value.length; - if (int.tryParse(_value.substring(len - 1)) != null) { - _counter++; - } - _value = _value.substring(0, len - 1); - }); - } - - - - - - @override - Widget build(BuildContext context) { - Flame.audio.load('correct.mp3'); - SystemChrome.setEnabledSystemUIOverlays([]); - _loadPage(); - return FutureBuilder( - future: _minTime, - builder: (BuildContext context, AsyncSnapshot snapshot) { - Widget _body; - if (snapshot.hasData) { - _body = gamePage(); - } - else { - _body = new Container( - color: Color(0xffCED4CC), - child: Center( - child: Image(image: AssetImage("assets/images/logo.gif"), height: 200.0), - ) - ); - } - return new Scaffold( - backgroundColor: Color(0xffCED4CC), - body: _body - ); - }, - ); -// startTimer(4); - //return new Scaffold( - //backgroundColor: Color(0xffCED4CC), - //body: gamePage(), - //); - - } - - Widget genRow(String t1, Function f1, String t2, Function f2, String t3, - Function f3) { - return Row( - children: < Widget > [ - newButton(t1, f1, lightGrey, darkGrey), - newButton(t2, f2, lightGrey, darkGrey), - newButton(t3, f3, lightGrey, darkGrey), - ], - mainAxisAlignment: MainAxisAlignment.spaceAround, - ); - } - - Widget newButton(String text, Function f, Color backgroundColor, - Color textColor) { - return RaisedButton( - color: backgroundColor, - shape: RoundedRectangleBorder( - borderRadius: new BorderRadius.circular(18.0)), - onPressed: f, - child: Text("$text", style: TextStyle(fontSize: 24, color: textColor), ), - padding: EdgeInsets.all(15), - animationDuration: Duration(microseconds: 0), - ); - } - - - - Widget gamePage() { - return Padding( - padding: EdgeInsets.only(top: MediaQuery - .of(context) - .size - .height * 0.08), - child: Center( - child: Column( - // mainAxisAlignment: MainAxisAlignment.center, - children: < Widget > [ - Row( - children: < Widget > [ - Column( - children: < Widget > [ - Text("Goal:"), - Text('$_goal', - style: Theme.of(context).textTheme.display2, ), - ], - ), - Column( - children: < Widget > [ - Text("Highscore:"), - Text('$_score', - style: Theme - .of(context) - .textTheme - .display2, ), - ], - ), - ], - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - ), - - - Container( - color: Colors.transparent, - child: Container( - child: SizedBox( - width: MediaQuery - .of(context) - .size - .width * 0.9, - height: MediaQuery - .of(context) - .size - .height * 0.1, - child: Center( - child: Text( - '$_value', - style: Theme - .of(context) - .textTheme - .display1, - textAlign: TextAlign.center, - ), - ) - ), - decoration: BoxDecoration( - color: Color(0xff8D9687), - borderRadius: BorderRadius.circular(MediaQuery - .of(context) - .size - .width * 0.04) - ), - ) - - ), - - Text( - "Fours Remaining: $_counter", - textAlign: TextAlign.center, - ), - - // Text('$_alert'), - SizedBox( - height: 500, - width: MediaQuery - .of(context) - .size - .width * 0.88, - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: < Widget > [ - genRow("²", _squared, ".", _decimal, "<", _backspace), - genRow("+", _plus, "-", _minus, "(", _openParen), - genRow("4", _four, "=", _equals, "C", _clear), - genRow("÷", _div, "x", _mult, ")", _closeParen), - genRow("!", _factorial, "^", _exp, "√", _sqrt) - ], - ), - ), - - ] - ) - ) - ); - } - - _loadPage() async { - await _getScore(); - if (widget.gameType == 1) { //Normal - _goal = _score + 1; - } - } - - _getScore() async { - SharedPreferences prefs = await SharedPreferences.getInstance(); - if (!prefs.containsKey("score")) { - await prefs.setInt("score", _goal); - } - _score = prefs.getInt("score"); - } - - _updateScore(int score) async { - SharedPreferences prefs = await SharedPreferences.getInstance(); - if (score > _score) { - _getScore(); - await prefs.setInt('score', score); - await prefs.commit(); - } - } - - @override - void dispose() { - super.dispose(); - } -} \ No newline at end of file diff --git a/lib/utils.dart b/lib/utils.dart new file mode 100644 index 0000000..eafa86a --- /dev/null +++ b/lib/utils.dart @@ -0,0 +1,44 @@ +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'package:url_launcher/url_launcher.dart'; + + +int minTime = 4; + + + Future launchSite(String url) async { + + if (await canLaunch(url)) { + await launch(url); + } else { + throw "Cannot open URL"; + } + return; + } + + Widget newButton(String text, Function f, BuildContext context) { + return RaisedButton( + color: Theme.of(context).backgroundColor, + shape: RoundedRectangleBorder( + borderRadius: new BorderRadius.circular(18.0)), + onPressed: f, + child: Text("$text", style: TextStyle(fontSize: 24, color: Theme.of(context).textTheme.bodyText1.color), ), + padding: EdgeInsets.all(15), + animationDuration: Duration(microseconds: 1), + ); + } + + Widget helpElement(String head, String content, BuildContext context) { + return Padding( + padding: EdgeInsets.all(15.0), + child: Card( + elevation: 0.0, + color: Theme.of(context).accentColor, + child: ListTile ( + title: Text("$head", style: TextStyle(fontSize: 24),), + subtitle: Text("$content", softWrap: true, style: TextStyle(fontSize: 18),), + ) + ), + ); + } +} \ No newline at end of file From cc9253145697c0f11b4e311f215054d681627420 Mon Sep 17 00:00:00 2001 From: Sidney NiBo Date: Sat, 20 Jun 2020 19:22:22 -0500 Subject: [PATCH 6/7] Refactored for color schemes --- .flutter-plugins-dependencies | 2 +- assets/images/logo1.gif | Bin 0 -> 74540 bytes assets/images/logo1.png | Bin 0 -> 64213 bytes lib/About.dart | 13 ++- lib/Game.dart | 211 ++++++++++++++-------------------- lib/Help.dart | 36 ++++-- lib/MathEngine.dart | 5 +- lib/Menu.dart | 63 +++++----- lib/Themes.dart | 36 ++++-- lib/main.dart | 40 ++++--- lib/utils.dart | 76 ++++++------ pubspec.yaml | 6 +- 12 files changed, 250 insertions(+), 238 deletions(-) create mode 100644 assets/images/logo1.gif create mode 100644 assets/images/logo1.png diff --git a/.flutter-plugins-dependencies b/.flutter-plugins-dependencies index d144e75..6fb3ae6 100644 --- a/.flutter-plugins-dependencies +++ b/.flutter-plugins-dependencies @@ -1 +1 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"audioplayers","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\audioplayers-0.15.1\\\\","dependencies":["path_provider"]},{"name":"path_provider","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\path_provider-1.6.11\\\\","dependencies":[]},{"name":"shared_preferences","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences-0.5.7+3\\\\","dependencies":[]},{"name":"url_launcher","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\url_launcher-5.4.11\\\\","dependencies":[]}],"android":[{"name":"audioplayers","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\audioplayers-0.15.1\\\\","dependencies":["path_provider"]},{"name":"path_provider","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\path_provider-1.6.11\\\\","dependencies":[]},{"name":"shared_preferences","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences-0.5.7+3\\\\","dependencies":[]},{"name":"url_launcher","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\url_launcher-5.4.11\\\\","dependencies":[]}],"macos":[{"name":"audioplayers","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\audioplayers-0.15.1\\\\","dependencies":[]},{"name":"path_provider_macos","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\path_provider_macos-0.0.4+3\\\\","dependencies":[]},{"name":"shared_preferences_macos","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences_macos-0.0.1+10\\\\","dependencies":[]},{"name":"url_launcher_macos","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\url_launcher_macos-0.0.1+7\\\\","dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\path_provider_linux-0.0.1+1\\\\","dependencies":[]}],"windows":[],"web":[{"name":"audioplayers","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\audioplayers-0.15.1\\\\","dependencies":[]},{"name":"shared_preferences_web","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences_web-0.1.2+7\\\\","dependencies":[]},{"name":"url_launcher_web","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\url_launcher_web-0.1.1+6\\\\","dependencies":[]}]},"dependencyGraph":[{"name":"audioplayers","dependencies":["path_provider"]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"shared_preferences","dependencies":["shared_preferences_macos","shared_preferences_web"]},{"name":"shared_preferences_macos","dependencies":[]},{"name":"shared_preferences_web","dependencies":[]},{"name":"url_launcher","dependencies":["url_launcher_web","url_launcher_macos"]},{"name":"url_launcher_macos","dependencies":[]},{"name":"url_launcher_web","dependencies":[]}],"date_created":"2020-06-20 17:17:14.422157","version":"1.17.4"} \ No newline at end of file +{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"audioplayers","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\audioplayers-0.15.1\\\\","dependencies":["path_provider"]},{"name":"path_provider","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\path_provider-1.6.11\\\\","dependencies":[]},{"name":"shared_preferences","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences-0.5.7+3\\\\","dependencies":[]},{"name":"url_launcher","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\url_launcher-5.4.11\\\\","dependencies":[]}],"android":[{"name":"audioplayers","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\audioplayers-0.15.1\\\\","dependencies":["path_provider"]},{"name":"path_provider","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\path_provider-1.6.11\\\\","dependencies":[]},{"name":"shared_preferences","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences-0.5.7+3\\\\","dependencies":[]},{"name":"url_launcher","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\url_launcher-5.4.11\\\\","dependencies":[]}],"macos":[{"name":"audioplayers","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\audioplayers-0.15.1\\\\","dependencies":[]},{"name":"path_provider_macos","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\path_provider_macos-0.0.4+3\\\\","dependencies":[]},{"name":"shared_preferences_macos","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences_macos-0.0.1+10\\\\","dependencies":[]},{"name":"url_launcher_macos","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\url_launcher_macos-0.0.1+7\\\\","dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\path_provider_linux-0.0.1+1\\\\","dependencies":[]}],"windows":[],"web":[{"name":"audioplayers","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\audioplayers-0.15.1\\\\","dependencies":[]},{"name":"shared_preferences_web","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences_web-0.1.2+7\\\\","dependencies":[]},{"name":"url_launcher_web","path":"C:\\\\Users\\\\nimak\\\\AppData\\\\Roaming\\\\Pub\\\\Cache\\\\hosted\\\\pub.dartlang.org\\\\url_launcher_web-0.1.1+6\\\\","dependencies":[]}]},"dependencyGraph":[{"name":"audioplayers","dependencies":["path_provider"]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"shared_preferences","dependencies":["shared_preferences_macos","shared_preferences_web"]},{"name":"shared_preferences_macos","dependencies":[]},{"name":"shared_preferences_web","dependencies":[]},{"name":"url_launcher","dependencies":["url_launcher_web","url_launcher_macos"]},{"name":"url_launcher_macos","dependencies":[]},{"name":"url_launcher_web","dependencies":[]}],"date_created":"2020-06-20 19:19:52.385954","version":"1.17.4"} \ No newline at end of file diff --git a/assets/images/logo1.gif b/assets/images/logo1.gif new file mode 100644 index 0000000000000000000000000000000000000000..f535bfe5711b47383d6532a01cf9ce40d607ea68 GIT binary patch literal 74540 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[ - Text("Created by Sidney Nimako"), FlatButton( - child: Text("snibo.me", style: TextStyle(decoration: TextDecoration.underline),), + child: Text( + "snibo.me", + style: TextStyle(decoration: TextDecoration.underline), + ), onPressed: () => launchSite("http://snibo.me"), ), FlatButton( - child: Text("Support me", style: TextStyle(decoration: TextDecoration.underline)), + child: Text("Support me", + style: TextStyle(decoration: TextDecoration.underline)), onPressed: () => launchSite("https://www.paypal.me/snibo/4444"), ) - ], ), ), ); } -} \ No newline at end of file +} diff --git a/lib/Game.dart b/lib/Game.dart index 3694e85..6ceb833 100644 --- a/lib/Game.dart +++ b/lib/Game.dart @@ -5,12 +5,10 @@ import 'package:flutter/services.dart'; import 'MathEngine.dart'; import 'utils.dart'; +import 'Themes.dart'; class GamePage extends StatefulWidget { - GamePage({ - Key key, - this.gameType - }): super(key: key); + GamePage({Key key, this.gameType}) : super(key: key); final int gameType; @@ -18,7 +16,7 @@ class GamePage extends StatefulWidget { _GamePageState createState() => _GamePageState(); } -class _GamePageState extends State < GamePage > { +class _GamePageState extends State { int _counter = 4; String _value = ""; int _goal = 0; @@ -151,38 +149,27 @@ class _GamePageState extends State < GamePage > { }); } - - - - @override Widget build(BuildContext context) { Flame.audio.load('correct.mp3'); SystemChrome.setEnabledSystemUIOverlays([]); _loadPage(); return FutureBuilder( - future: - Future.delayed( - Duration(seconds: minTime), - () => true - ), + future: Future.delayed(Duration(seconds: minTime), () => true), builder: (BuildContext context, AsyncSnapshot snapshot) { Widget _body; if (snapshot.hasData) { _body = gamePage(); - } - else { + } else { _body = new Container( color: Theme.of(context).accentColor, child: Center( - child: Image(image: AssetImage("assets/images/logo.gif"), height: 200.0), - ) - ); + child: Image( + image: AssetImage(logosLoading[theme]), height: 200.0), + )); } return new Scaffold( - backgroundColor: Theme.of(context).accentColor, - body: _body - ); + backgroundColor: Theme.of(context).accentColor, body: _body); }, ); // startTimer(4); @@ -190,132 +177,112 @@ class _GamePageState extends State < GamePage > { //backgroundColor: Color(0xffCED4CC), //body: gamePage(), //); - } - Widget genRow(String t1, Function f1, String t2, Function f2, String t3, - Function f3) { + Widget genRow( + String t1, Function f1, String t2, Function f2, String t3, Function f3) { return Row( - children: < Widget > [ - newButton(t1, f1, Theme.of(context).backgroundColor, Theme.of(context).textTheme.bodyText1.color), - newButton(t2, f2, Theme.of(context).backgroundColor, Theme.of(context).textTheme.bodyText1.color), - newButton(t3, f3, Theme.of(context).backgroundColor, Theme.of(context).textTheme.bodyText1.color), + children: [ + newButton(t1, f1, Theme.of(context).accentColor, + Theme.of(context).textTheme.bodyText1.color), + newButton(t2, f2, Theme.of(context).accentColor, + Theme.of(context).textTheme.bodyText1.color), + newButton(t3, f3, Theme.of(context).accentColor, + Theme.of(context).textTheme.bodyText1.color), ], mainAxisAlignment: MainAxisAlignment.spaceAround, ); } - Widget newButton(String text, Function f, Color backgroundColor, - Color textColor) { + Widget newButton( + String text, Function f, Color backgroundColor, Color textColor) { return RaisedButton( color: backgroundColor, - shape: RoundedRectangleBorder( - borderRadius: new BorderRadius.circular(18.0)), + shape: + RoundedRectangleBorder(borderRadius: new BorderRadius.circular(18.0)), onPressed: f, - child: Text("$text", style: TextStyle(fontSize: 24, color: Theme.of(context).textTheme.bodyText1.color), ), + child: Text( + "$text", + style: TextStyle( + fontSize: 24, color: Theme.of(context).textTheme.bodyText1.color), + ), padding: EdgeInsets.all(15), animationDuration: Duration(microseconds: 0), ); } - - Widget gamePage() { return Padding( - padding: EdgeInsets.only(top: MediaQuery - .of(context) - .size - .height * 0.08), + padding: + EdgeInsets.only(top: MediaQuery.of(context).size.height * 0.08), child: Center( child: Column( - // mainAxisAlignment: MainAxisAlignment.center, - children: < Widget > [ - Row( - children: < Widget > [ - Column( - children: < Widget > [ - Text("Goal:"), - Text('$_goal', - style: Theme.of(context).textTheme.headline3), - ], - ), - Column( - children: < Widget > [ - Text("Highscore:"), - Text('$_score', style: Theme.of(context).textTheme.headline3,), - ], - ), + // mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + children: [ + Column( + children: [ + Text("Goal:"), + Text('$_goal', + style: Theme.of(context).textTheme.headline3), ], - mainAxisAlignment: MainAxisAlignment.spaceEvenly, ), - - - Container( - color: Colors.transparent, - child: Container( - child: SizedBox( - width: MediaQuery - .of(context) - .size - .width * 0.9, - height: MediaQuery - .of(context) - .size - .height * 0.1, - child: Center( - child: Text( - '$_value', - style: Theme - .of(context) - .textTheme - .headline4, - textAlign: TextAlign.center, - ), - ) - ), - decoration: BoxDecoration( - color: Theme.of(context).primaryColorDark, - borderRadius: BorderRadius.circular(MediaQuery - .of(context) - .size - .width * 0.04) - ), - ) - - ), - - Text( - "Fours Remaining: $_counter", - textAlign: TextAlign.center, - ), - - SizedBox( - height: 500, - width: MediaQuery - .of(context) - .size - .width * 0.88, - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: < Widget > [ - genRow("²", _squared, ".", _decimal, "<", _backspace), - genRow("+", _plus, "-", _minus, "(", _openParen), - genRow("4", _four, "=", _equals, "C", _clear), - genRow("÷", _div, "x", _mult, ")", _closeParen), - genRow("!", _factorial, "^", _exp, "√", _sqrt) - ], - ), + Column( + children: [ + Text("Highscore:"), + Text( + '$_score', + style: Theme.of(context).textTheme.headline3, + ), + ], ), - - ] - ) - ) - ); + ], + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + ), + Container( + color: Colors.transparent, + child: Container( + child: SizedBox( + width: MediaQuery.of(context).size.width * 0.9, + height: MediaQuery.of(context).size.height * 0.1, + child: Center( + child: Text( + '$_value', + style: Theme.of(context).textTheme.headline4, + textAlign: TextAlign.center, + ), + )), + decoration: BoxDecoration( + color: Theme.of(context).primaryColorDark, + borderRadius: BorderRadius.circular( + MediaQuery.of(context).size.width * 0.04)), + )), + Text( + "Fours Remaining: $_counter", + textAlign: TextAlign.center, + ), + SizedBox( + height: 500, + width: MediaQuery.of(context).size.width * 0.88, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + genRow("²", _squared, ".", _decimal, "<", _backspace), + genRow("+", _plus, "-", _minus, "(", _openParen), + genRow("4", _four, "=", _equals, "C", _clear), + genRow("÷", _div, "x", _mult, ")", _closeParen), + genRow("!", _factorial, "^", _exp, "√", _sqrt) + ], + ), + ), + ]))); } _loadPage() async { await _getScore(); - if (widget.gameType == 1) { //Normal + if (widget.gameType == 1) { + //Normal _goal = _score + 1; } } @@ -340,4 +307,4 @@ class _GamePageState extends State < GamePage > { void dispose() { super.dispose(); } -} \ No newline at end of file +} diff --git a/lib/Help.dart b/lib/Help.dart index 24abce3..bea260c 100644 --- a/lib/Help.dart +++ b/lib/Help.dart @@ -5,23 +5,37 @@ class Help extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - body:Container( - color: Color(0xffCED4CC), + body: Container( + color: Theme.of(context).accentColor, child: ListView( children: [ Center( child: Padding( - padding: EdgeInsets.all(15.0), - child: Text("Learn", style: TextStyle(fontSize: 48, color: Theme.of(context).textTheme.bodyText1.color)), - ) - ), - helpElement("!", "The ! or factorial is a single number operation.\nUnlike addition where you need two numbers, factorial only needs one.\n n! is equal to all the numbers from 1 to n multiplied.\n For example, 4! = 1 x 2 x 3 x 4 = 24", context), - helpElement("²", "\"²\" or the squared operations is a single number operation.\nUnlike subtraction where you need two numbers, squaring only needs one.\nSquaring is part of a type of operations called exponentials.\nn² is equal to the number times it self.\nFor example, 4² = 4 x 4 = 16.\nIn general, an exponential multiplies the number by itself however many times the little number says.\nFor example, 4³ = 4 x 4 x 4 = 64.", context), - helpElement("^", "The \"^\" is the symbol for exponentials.\nIt is a lot simpler to write a carat then a little number for computers, so we use the carat.\nThe number after the carat works just like the little number.\nFor example, 4^2 = 4² = 4 x 4 = 16 and 4^3 = 4³ = 4 x 4 x 4 = 64.", context), - helpElement("√", "The √ or square root symbol is the opposite of the ² symbol.\nUnlike multiplication where you need two numbers, the square root only needs one.\nThe √ asks what number can be multiplied by itself to equal n.\nFor example √4 = 2 because 2² = 2 x 2 = 4", context) + padding: EdgeInsets.all(15.0), + child: Text("Learn", + style: TextStyle( + fontSize: 48, + color: Theme.of(context).textTheme.bodyText1.color)), + )), + helpElement( + "!", + "The ! or factorial is a single number operation.\nUnlike addition where you need two numbers, factorial only needs one.\n n! is equal to all the numbers from 1 to n multiplied.\n For example, 4! = 1 x 2 x 3 x 4 = 24", + context), + helpElement( + "²", + "\"²\" or the squared operations is a single number operation.\nUnlike subtraction where you need two numbers, squaring only needs one.\nSquaring is part of a type of operations called exponentials.\nn² is equal to the number times it self.\nFor example, 4² = 4 x 4 = 16.\nIn general, an exponential multiplies the number by itself however many times the little number says.\nFor example, 4³ = 4 x 4 x 4 = 64.", + context), + helpElement( + "^", + "The \"^\" is the symbol for exponentials.\nIt is a lot simpler to write a carat then a little number for computers, so we use the carat.\nThe number after the carat works just like the little number.\nFor example, 4^2 = 4² = 4 x 4 = 16 and 4^3 = 4³ = 4 x 4 x 4 = 64.", + context), + helpElement( + "√", + "The √ or square root symbol is the opposite of the ² symbol.\nUnlike multiplication where you need two numbers, the square root only needs one.\nThe √ asks what number can be multiplied by itself to equal n.\nFor example √4 = 2 because 2² = 2 x 2 = 4", + context) ], ), ), ); } -} \ No newline at end of file +} diff --git a/lib/MathEngine.dart b/lib/MathEngine.dart index dbf8026..7fb5e20 100644 --- a/lib/MathEngine.dart +++ b/lib/MathEngine.dart @@ -75,7 +75,7 @@ String postfix(String equation) { equation = equation.substring(1); } else { while (operatorPrecedenceToStack[equation.substring(0, 1)] < - operatorPrecedenceInStack[operators.first] && + operatorPrecedenceInStack[operators.first] && operators.isNotEmpty) { //Pop all operators with higher precedence to the output output.addLast(operators.removeFirst()); @@ -242,6 +242,3 @@ double mathEngine(String s) { return calculate(postfix(s)); } -void main() { - print(mathEngine("√4 + √4 - (4 ÷ 4 )")); -} diff --git a/lib/Menu.dart b/lib/Menu.dart index eef952f..c60d76e 100644 --- a/lib/Menu.dart +++ b/lib/Menu.dart @@ -1,52 +1,51 @@ import 'package:flutter/material.dart'; import 'utils.dart'; +import 'Themes.dart'; class Menu extends StatelessWidget { @override Widget build(BuildContext context) { return FutureBuilder( - future: Future.delayed( - Duration(seconds: minTime), - () => true - ), + future: Future.delayed(Duration(seconds: minTime), () => true), builder: (BuildContext context, AsyncSnapshot snapshot) { Widget _body; if (snapshot.hasData) { _body = Container( - color: Color(0xffCED4CC), + color: Theme.of(context).accentColor, child: Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - Image(image: AssetImage("assets/images/logo.png"), height: 200.0), + Image(image: AssetImage(logos[theme]), height: 200.0), Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Padding( - padding: EdgeInsets.symmetric(vertical: 15.0), - child:newButton("Play", () => - Navigator.of(context).pushNamed('Play'), - context - ),), + padding: EdgeInsets.symmetric(vertical: 15.0), + child: newButton( + "Play", + () => Navigator.of(context).pushNamed('Play'), + context), + ), Padding( - padding: EdgeInsets.symmetric(vertical: 15.0), - child: - newButton("Arcade", () => - Navigator.of(context).pushNamed('Arcade'), - context - ),), + padding: EdgeInsets.symmetric(vertical: 15.0), + child: newButton( + "Arcade", + () => Navigator.of(context).pushNamed('Arcade'), + context), + ), Padding( padding: EdgeInsets.symmetric(vertical: 15.0), - child: newButton("Learn", () => - Navigator.of(context).pushNamed('Help'), - context - ), + child: newButton( + "Learn", + () => Navigator.of(context).pushNamed('Help'), + context), ), Padding( padding: EdgeInsets.symmetric(vertical: 15.0), - child: newButton("About", () => - Navigator.of(context).pushNamed('About'), - context - ), + child: newButton( + "About", + () => Navigator.of(context).pushNamed('About'), + context), ), ], ) @@ -54,15 +53,15 @@ class Menu extends StatelessWidget { ), ); } else { - _body = new Scaffold ( - backgroundColor: Color(0xffCED4CC), + _body = new Scaffold( + backgroundColor: Theme.of(context).accentColor, body: Container( - color: Color(0xffCED4CC), + color: Theme.of(context).accentColor, child: Center( - child: Image(image: AssetImage("assets/images/logo.gif"), height: 200.0), - ) - ) - ); + child: Image( + image: AssetImage(logosLoading[theme]), + height: 200.0), + ))); } return _body; }); diff --git a/lib/Themes.dart b/lib/Themes.dart index f67af58..80c6744 100644 --- a/lib/Themes.dart +++ b/lib/Themes.dart @@ -1,17 +1,33 @@ import 'package:flutter/material.dart'; +import 'dart:async'; +import 'package:shared_preferences/shared_preferences.dart'; -int theme = 0; + +int theme; + +Future getTheme() async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + if (!prefs.containsKey("theme")) { + await prefs.setInt("theme", 0); + } + theme = prefs.getInt("theme"); + return theme; +} List themes = [theme1]; +List logosLoading = ["assets/images/logo1.gif"]; +List logos = ["assets/images/logo1.png"]; ThemeData theme1 = new ThemeData( - backgroundColor: Color(0xffCCD2C6), //Dark grey - accentColor: Color(0xffCED4CC), //Light grey - primaryColor: Color(0xffEE6E48), //Logo and Accents - primaryColorDark: Color(0xff8D9687), //Window color - textTheme: TextTheme( - bodyText1: TextStyle(color: Color(0xff565C5C)) //Text Color - ) - -); \ No newline at end of file + backgroundColor: Color(0xffCCD2C6), + //Dark grey + accentColor: Color(0xffCED4CC), + //Light grey + primaryColor: Color(0xffEE6E48), + //Logo and Accents + primaryColorDark: Color(0xff8D9687), + //Window color + textTheme: + TextTheme(bodyText1: TextStyle(color: Color(0xff565C5C)) //Text Color + )); diff --git a/lib/main.dart b/lib/main.dart index 1986e79..ac8059d 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,32 +1,42 @@ import 'package:flutter/material.dart'; - import 'About.dart'; import 'Game.dart'; import 'Menu.dart'; import 'Help.dart'; import 'Themes.dart'; - void main() => runApp(MyApp()); -class MyApp extends StatelessWidget { +class MyApp extends StatefulWidget { // This widget is the root of your application. + @override + _MyAppState createState() => _MyAppState(); +} + +class _MyAppState extends State { @override Widget build(BuildContext context) { - return MaterialApp( - title: 'Four Fours', - debugShowCheckedModeBanner: false, - theme: themes[theme], - home: Menu(), - routes: { - 'Play': (BuildContext context) => GamePage(gameType: 1), - 'Arcade': (BuildContext context) => GamePage(gameType: 2), - 'Help': (BuildContext context) => Help(), - 'About': (BuildContext context) => About() + return FutureBuilder( + future: getTheme(), + builder: (BuildContext context, AsyncSnapshot snapshot) { + if (snapshot.hasData) { + return MaterialApp( + title: 'Four Fours', + debugShowCheckedModeBanner: false, + theme: themes[theme], + home: Menu(), + routes: { + 'Play': (BuildContext context) => GamePage(gameType: 1), + 'Arcade': (BuildContext context) => GamePage(gameType: 2), + 'Help': (BuildContext context) => Help(), + 'About': (BuildContext context) => About() + }, + ); + } else { + return Container(); + } }, ); } } - - diff --git a/lib/utils.dart b/lib/utils.dart index eafa86a..51b425f 100644 --- a/lib/utils.dart +++ b/lib/utils.dart @@ -2,43 +2,49 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:url_launcher/url_launcher.dart'; - int minTime = 4; - - Future launchSite(String url) async { - - if (await canLaunch(url)) { - await launch(url); - } else { - throw "Cannot open URL"; - } - return; +Future launchSite(String url) async { + if (await canLaunch(url)) { + await launch(url); + } else { + throw "Cannot open URL"; } + return; +} - Widget newButton(String text, Function f, BuildContext context) { - return RaisedButton( - color: Theme.of(context).backgroundColor, - shape: RoundedRectangleBorder( - borderRadius: new BorderRadius.circular(18.0)), - onPressed: f, - child: Text("$text", style: TextStyle(fontSize: 24, color: Theme.of(context).textTheme.bodyText1.color), ), - padding: EdgeInsets.all(15), - animationDuration: Duration(microseconds: 1), - ); - } +Widget newButton(String text, Function f, BuildContext context) { + return RaisedButton( + color: Theme.of(context).accentColor, + shape: + RoundedRectangleBorder(borderRadius: new BorderRadius.circular(18.0)), + onPressed: f, + child: Text( + "$text", + style: TextStyle( + fontSize: 24, color: Theme.of(context).textTheme.bodyText1.color), + ), + padding: EdgeInsets.all(15), + animationDuration: Duration(microseconds: 1), + ); +} - Widget helpElement(String head, String content, BuildContext context) { - return Padding( - padding: EdgeInsets.all(15.0), - child: Card( - elevation: 0.0, - color: Theme.of(context).accentColor, - child: ListTile ( - title: Text("$head", style: TextStyle(fontSize: 24),), - subtitle: Text("$content", softWrap: true, style: TextStyle(fontSize: 18),), - ) - ), - ); - } -} \ No newline at end of file +Widget helpElement(String head, String content, BuildContext context) { + return Padding( + padding: EdgeInsets.all(15.0), + child: Card( + elevation: 0.0, + color: Theme.of(context).accentColor, + child: ListTile( + title: Text( + "$head", + style: TextStyle(fontSize: 24), + ), + subtitle: Text( + "$content", + softWrap: true, + style: TextStyle(fontSize: 18), + ), + )), + ); +} diff --git a/pubspec.yaml b/pubspec.yaml index b05a245..bc4528f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -76,6 +76,6 @@ flutter: # For details regarding fonts from package dependencies, # see https://flutter.dev/custom-fonts/#from-packages assets: - - assets/audio/correct.mp3 - - assets/images/logo.gif - - assets/images/logo.png + - assets/audio/correct.mp3 + - assets/images/logo1.gif + - assets/images/logo1.png From 73140c9624ea683afd53fd027c6e7d977492e381 Mon Sep 17 00:00:00 2001 From: Sidney NiBo Date: Sun, 21 Jun 2020 15:50:03 -0500 Subject: [PATCH 7/7] Adding themes --- lib/About.dart | 6 +- lib/Game.dart | 33 ++++-- lib/Help.dart | 4 +- lib/MathString.dart | 198 ----------------------------------- lib/Menu.dart | 8 +- lib/Themes.dart | 148 ++++++++++++++++++++++++-- lib/app_state.dart | 15 --- lib/app_state_container.dart | 69 ------------ lib/dataAccess.dart | 51 --------- lib/db.dart | 38 ------- lib/storage.dart | 14 --- lib/utils.dart | 2 +- 12 files changed, 176 insertions(+), 410 deletions(-) delete mode 100644 lib/MathString.dart delete mode 100644 lib/app_state.dart delete mode 100644 lib/app_state_container.dart delete mode 100644 lib/dataAccess.dart delete mode 100644 lib/db.dart delete mode 100644 lib/storage.dart diff --git a/lib/About.dart b/lib/About.dart index a4a6891..e11b002 100644 --- a/lib/About.dart +++ b/lib/About.dart @@ -1,11 +1,13 @@ import 'package:flutter/material.dart'; import 'utils.dart'; +import 'package:flutter/services.dart'; class About extends StatelessWidget { @override Widget build(BuildContext context) { + SystemChrome.setEnabledSystemUIOverlays([]); return Scaffold( - backgroundColor: Theme.of(context).accentColor, + backgroundColor: Theme.of(context).backgroundColor, body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, @@ -14,7 +16,7 @@ class About extends StatelessWidget { FlatButton( child: Text( "snibo.me", - style: TextStyle(decoration: TextDecoration.underline), + style: TextStyle(decoration: TextDecoration.underline, color: Theme.of(context).primaryColor), ), onPressed: () => launchSite("http://snibo.me"), ), diff --git a/lib/Game.dart b/lib/Game.dart index 6ceb833..bcfba80 100644 --- a/lib/Game.dart +++ b/lib/Game.dart @@ -162,14 +162,14 @@ class _GamePageState extends State { _body = gamePage(); } else { _body = new Container( - color: Theme.of(context).accentColor, + color: Theme.of(context).backgroundColor, child: Center( child: Image( image: AssetImage(logosLoading[theme]), height: 200.0), )); } return new Scaffold( - backgroundColor: Theme.of(context).accentColor, body: _body); + backgroundColor: Theme.of(context).backgroundColor, body: _body); }, ); // startTimer(4); @@ -181,6 +181,19 @@ class _GamePageState extends State { Widget genRow( String t1, Function f1, String t2, Function f2, String t3, Function f3) { + if (t2 == "=") { + return Row( + children: [ + newButton(t1, f1, Theme.of(context).accentColor, + Theme.of(context).textTheme.bodyText1.color), + newButton(t2, f2, Theme.of(context).primaryColor, + Theme.of(context).textTheme.headline3.color), + newButton(t3, f3, Theme.of(context).accentColor, + Theme.of(context).textTheme.bodyText1.color), + ], + mainAxisAlignment: MainAxisAlignment.spaceAround, + ); + } return Row( children: [ newButton(t1, f1, Theme.of(context).accentColor, @@ -214,23 +227,22 @@ class _GamePageState extends State { Widget gamePage() { return Padding( padding: - EdgeInsets.only(top: MediaQuery.of(context).size.height * 0.08), + EdgeInsets.only(top: MediaQuery.of(context).size.height * 0.06), child: Center( child: Column( - // mainAxisAlignment: MainAxisAlignment.center, children: [ Row( children: [ Column( children: [ - Text("Goal:"), + Text("Goal:", style: Theme.of(context).textTheme.bodyText1), Text('$_goal', style: Theme.of(context).textTheme.headline3), ], ), Column( children: [ - Text("Highscore:"), + Text("Highscore:", style: Theme.of(context).textTheme.bodyText1), Text( '$_score', style: Theme.of(context).textTheme.headline3, @@ -240,8 +252,9 @@ class _GamePageState extends State { ], mainAxisAlignment: MainAxisAlignment.spaceEvenly, ), - Container( - color: Colors.transparent, + Padding( + padding: EdgeInsets.fromLTRB(0,2.0,0,15.0), +// color: Colors.transparent, child: Container( child: SizedBox( width: MediaQuery.of(context).size.width * 0.9, @@ -257,10 +270,12 @@ class _GamePageState extends State { color: Theme.of(context).primaryColorDark, borderRadius: BorderRadius.circular( MediaQuery.of(context).size.width * 0.04)), - )), + ) + ), Text( "Fours Remaining: $_counter", textAlign: TextAlign.center, + style: TextStyle(color: Theme.of(context).textTheme.bodyText1.color), ), SizedBox( height: 500, diff --git a/lib/Help.dart b/lib/Help.dart index bea260c..104a317 100644 --- a/lib/Help.dart +++ b/lib/Help.dart @@ -1,12 +1,14 @@ import 'package:flutter/material.dart'; import 'utils.dart'; +import 'package:flutter/services.dart'; class Help extends StatelessWidget { @override Widget build(BuildContext context) { + SystemChrome.setEnabledSystemUIOverlays([]); return Scaffold( body: Container( - color: Theme.of(context).accentColor, + color: Theme.of(context).backgroundColor, child: ListView( children: [ Center( diff --git a/lib/MathString.dart b/lib/MathString.dart deleted file mode 100644 index f9cd9be..0000000 --- a/lib/MathString.dart +++ /dev/null @@ -1,198 +0,0 @@ -void main() { - print(parseEquation("4x4")); - print(parseEquation("(4x4)")); - print(parseEquation("16÷16")); - print(parseEquation("(4x4)÷(4x4)")); - //print(parseEquation("4+4-√4-√4")); - print(parseEquation("(4+4)-(4+4)")); - -} - -int parseEquation(String equation) { - var values = []; - int val = 0; - if (!equation.contains("(")) { - return oop(equation); - } - while (equation.contains('(')) { - values.add(oop(equation.substring(equation.indexOf('(')+1, equation.indexOf(')')))); - var temp = values[values.length-1]; - equation = equation.replaceRange(equation.indexOf('('), equation.indexOf(')')+1,"$temp"); - } - if(int.tryParse(equation) == null) { - return parseEquation(equation); - } else { - for (int i = 0; i < values.length; i++) { - val += values[i]; - } - return val; - } - -} - -int calculate(int opIndex, String subEquation) { - //Remove all spaces - subEquation = subEquation.replaceAll(" ",""); - //Value to be returned - int val = int.parse(subEquation.substring(0,opIndex)); - //Iterate through the subEquation performing operations as seen - while(subEquation.length >= 1) { - switch (subEquation.substring(0,1)) { - case '÷': - val ~/= int.parse(subEquation.substring(opIndex-1)); - break; - case 'x': - val *= int.parse(subEquation.substring(opIndex)); - break; - case '+': - val += int.parse(subEquation.substring(opIndex)); - break; - case '-': - val -= int.parse(subEquation.substring(opIndex)); - break; - } - //Remove the first character in the equation - subEquation = subEquation.substring(1); - } - - //Return the computed value - return val; -} - -int oop(String subEquation) { - var values = []; - int val = 0; - while (subEquation.contains('\u221a')) { - subEquation = subEquation.replaceRange(subEquation.indexOf('\u221a'), subEquation.indexOf('\u221a')+2,"2"); - } - subEquation = oopPair(subEquation,"\u00F7", "x"); - subEquation = oopPair(subEquation,"+", "-"); - return int.parse(subEquation); -} - -List digOp(String op, String equation) { - List vals = []; - int startIndex = 1; - int opIndex = equation.indexOf(op); - int endIndex = opIndex + 1; - if (opIndex - 2 >= 0 && int.tryParse(equation.substring(opIndex -2, opIndex)) != null) { - startIndex = opIndex - 2; - } - if (opIndex + 3 <= equation.length && int.tryParse(equation.substring(opIndex+1, opIndex+3)) != null) { - endIndex = opIndex + 3; - } - return [startIndex, endIndex]; -} -bool isDoubleDigit(String s, int index) { - if (int.tryParse(s.substring(index, index+3)) != null) { - return true; - } - return false; -} - -int calculate2(String subEquation) { - //Remove all spaces - subEquation = subEquation.replaceAll(" ",""); - //Value to be returned - int val; - //Array of values for order of operations - var values = []; - //If the first number is two digits - if (int.tryParse(subEquation.substring(0,2)) != null) { - val = int.parse(subEquation.substring(0,2)); - } - else { - val = int.parse(subEquation.substring(0,1)); - } - //Iterate through the subEquation performing operations as seen - while(subEquation.length >= 1) { - switch (subEquation.substring(0,1)) { - case '/': - val ~/= int.parse(subEquation.substring(1,2)); - subEquation = subEquation.substring(1); - break; - case 'x': - val *= int.parse(subEquation.substring(1,2)); - subEquation = subEquation.substring(1); - break; - case '+': - val += int.parse(subEquation.substring(1,2)); - subEquation = subEquation.substring(1); - break; - case '-': - val -= int.parse(subEquation.substring(1,2)); - subEquation = subEquation.substring(1); - break; - } - //Remove the first character in the equation - subEquation = subEquation.substring(1); - } - - //Return the computed value - return val; -} - -String oopPair(String subEquation, String char1, String char2) { - int temp; - while(subEquation.contains(char1) || subEquation.contains(char2)) { - if (subEquation.contains(char2)) { - if (subEquation.contains(char1)) { - if(subEquation.indexOf(char2) < subEquation.indexOf(char1)) { - if (subEquation.length > 3) { - List indeces = digOp(char2, subEquation); - temp = calculate(subEquation.indexOf(char2), subEquation.substring(indeces[0], indeces[1])); - subEquation = subEquation.replaceRange(indeces[0],indeces[1],"$temp"); - } else { - temp = calculate2(subEquation.substring(subEquation.indexOf(char2)-1, subEquation.indexOf(char2)+2)); - subEquation = subEquation.replaceRange(subEquation.indexOf(char2)-1, subEquation.indexOf(char2)+2,"$temp"); - } - } - else { - if (subEquation.length > 3) { - List indeces = digOp(char1, subEquation); - temp = calculate(subEquation.indexOf(char1), subEquation.substring(indeces[0], indeces[1])); - subEquation = subEquation.replaceRange(indeces[0],indeces[1],"$temp"); - } else { - temp = calculate2(subEquation.substring(subEquation.indexOf(char1)-1, subEquation.indexOf(char1)+2)); - subEquation = subEquation.replaceRange(subEquation.indexOf(char1)-1, subEquation.indexOf(char1)+2,"$temp"); - } - } - } - else { - if (subEquation.length > 3) { - List indeces = digOp(char2, subEquation); - - temp = calculate(subEquation.indexOf(char2), subEquation.substring(indeces[0], indeces[1])); - subEquation = subEquation.replaceRange(indeces[0],indeces[1],"$temp"); - } else { - temp = calculate2(subEquation.substring(subEquation.indexOf(char2)-1, subEquation.indexOf(char2)+2)); - subEquation = subEquation.replaceRange(subEquation.indexOf(char2)-1, subEquation.indexOf(char2)+2,"$temp"); - } - } - } - else { - if (subEquation.length > 3) { - List indeces = digOp(char1, subEquation); - temp = calculate(subEquation.indexOf(char1), subEquation.substring(indeces[0], indeces[1])); - subEquation = subEquation.replaceRange(indeces[0],indeces[1],"$temp"); - } else { - temp = calculate2(subEquation.substring(subEquation.indexOf(char1)-1, subEquation.indexOf(char1)+2)); - subEquation = subEquation.replaceRange(subEquation.indexOf(char1)-1, subEquation.indexOf(char1)+2,"$temp"); - } - } - } - return subEquation; -} -String regex(String string) { - RegExp re = new RegExp('\\d{0,2}'); - Iterable terms = re.allMatches(string); - int startIndex = terms.first.start; - int endIndex = terms.last.end; - return string.substring(startIndex, endIndex); -} - -Iterable regex1(String string) { - RegExp re = new RegExp('\\d{0,2}'); - Iterable terms = re.allMatches(string); - return terms; -} \ No newline at end of file diff --git a/lib/Menu.dart b/lib/Menu.dart index c60d76e..4231034 100644 --- a/lib/Menu.dart +++ b/lib/Menu.dart @@ -1,17 +1,19 @@ import 'package:flutter/material.dart'; import 'utils.dart'; import 'Themes.dart'; +import 'package:flutter/services.dart'; class Menu extends StatelessWidget { @override Widget build(BuildContext context) { + SystemChrome.setEnabledSystemUIOverlays([]); return FutureBuilder( future: Future.delayed(Duration(seconds: minTime), () => true), builder: (BuildContext context, AsyncSnapshot snapshot) { Widget _body; if (snapshot.hasData) { _body = Container( - color: Theme.of(context).accentColor, + color: Theme.of(context).backgroundColor, child: Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ @@ -54,9 +56,9 @@ class Menu extends StatelessWidget { ); } else { _body = new Scaffold( - backgroundColor: Theme.of(context).accentColor, + backgroundColor: Theme.of(context).backgroundColor, body: Container( - color: Theme.of(context).accentColor, + color: Theme.of(context).backgroundColor, child: Center( child: Image( image: AssetImage(logosLoading[theme]), diff --git a/lib/Themes.dart b/lib/Themes.dart index 80c6744..00f5d9e 100644 --- a/lib/Themes.dart +++ b/lib/Themes.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'dart:async'; import 'package:shared_preferences/shared_preferences.dart'; - int theme; Future getTheme() async { @@ -14,20 +13,151 @@ Future getTheme() async { return theme; } -List themes = [theme1]; +List themes = [theme9]; List logosLoading = ["assets/images/logo1.gif"]; List logos = ["assets/images/logo1.png"]; +//TI Datamouth 2500 ThemeData theme1 = new ThemeData( - backgroundColor: Color(0xffCCD2C6), - //Dark grey accentColor: Color(0xffCED4CC), - //Light grey - primaryColor: Color(0xffEE6E48), + //Buttons + backgroundColor: Color(0xffCED4CC), + //Background + + primaryColor: Color(0xffF6AC2D), //Logo and Accents primaryColorDark: Color(0xff8D9687), //Window color - textTheme: - TextTheme(bodyText1: TextStyle(color: Color(0xff565C5C)) //Text Color - )); + textTheme: TextTheme( + bodyText1: TextStyle(color: Color(0xff565C5C)), + headline3: TextStyle(color: Color(0xff565C5C)), + headline4: TextStyle(color: Color(0xff565C5C)))); + +//TI 81 +ThemeData theme2 = new ThemeData( + accentColor: Color(0xff1F3037), + backgroundColor: Color(0xff172432), + primaryColor: Color(0xff226BC1), + primaryColorDark: Color(0xff83CCDF), + textTheme: TextTheme( + bodyText1: TextStyle(color: Color(0xff35A2DF)), + headline3: TextStyle(color: Colors.white), + headline4: TextStyle(color: Color(0xff172432)), + ), +); + +//Snow Storm +ThemeData theme3 = new ThemeData( + accentColor: Color(0xff3b3b37), + //Buttons + backgroundColor: Color(0xff2b2b2b), + //Background + primaryColor: Color(0xff004D0D), + //Logo and =s + primaryColorDark: Color(0xff004D0D), + //Window + textTheme: TextTheme( + bodyText1: TextStyle(color: Color(0xff8a8a81)), //Text + headline3: TextStyle(color: Color(0xff219e21)), //Scores + headline4: TextStyle(color: Color(0xff219e21)), //Value + ), +); + +//Unmarked Ocean +ThemeData theme4 = new ThemeData( + accentColor: Color(0xff144B59), + //Buttons + backgroundColor: Color(0xff3B6571), + //Background + primaryColor: Color(0xff144B59), + //Logo and =s + primaryColorDark: Color(0xffBDE8E5), + //Window + textTheme: TextTheme( + bodyText1: TextStyle(color: Color(0xffBDE8E5)), //Text + headline3: TextStyle(color: Color(0xffBDE8E5)), //Scores + headline4: TextStyle(color: Color(0xff144B59)), //Value + ), +); + +ThemeData theme5 = new ThemeData( + accentColor: Color(0xff9C1125), + //Buttons + backgroundColor: Color(0xff800000), + //Background + primaryColor: Color(0xff9C1125), + //Logo and =s + primaryColorDark: Color(0xff9C1125), + //Window + textTheme: TextTheme( + bodyText1: TextStyle(color: Colors.white), //Text + headline3: TextStyle(color: Colors.white), //Scores + headline4: TextStyle(color: Color(0xffC0C0C0)), //Value + ), +); + +ThemeData theme6 = new ThemeData( + accentColor: Color(0xffEAA021), + //Buttons + backgroundColor: Color(0xffF5C24A), + //Background + primaryColor: Color(0xff504E52), + //Logo and =s + primaryColorDark: Color(0xffEAA021), + //Window + textTheme: TextTheme( + bodyText1: TextStyle(color: Colors.white), //Text + headline3: TextStyle(color: Colors.white), //Scores + headline4: TextStyle(color: Colors.white), //Value + ), +); + +ThemeData theme7 = new ThemeData( + accentColor: Color(0xffD6E9F3), + //Buttons + backgroundColor: Color(0xff282C34), + //Background + primaryColor: Color(0xffE06C75), + //Logo and =s + primaryColorDark: Color(0xffD6E9F3), + //Window + textTheme: TextTheme( + bodyText1: TextStyle(color: Color(0xff55606D)), //Text + headline3: TextStyle(color: Color(0xff55606D)), //Scores + headline4: TextStyle(color: Color(0xff282C34)), //Value + ), +); + +ThemeData theme8 = new ThemeData( + accentColor: Color(0xff919BE5), + //Buttons + backgroundColor: Color(0xff232434), + //Background + primaryColor: Color(0xff6CB49F), + //Logo and =s + primaryColorDark: Color(0xff363E7E), + //Window + textTheme: TextTheme( + bodyText1: TextStyle(color: Color(0xff363E7E)), //Text + headline3: TextStyle(color: Color(0xff919BE5)), //Scores + headline4: TextStyle(color: Color(0xff919BE5)), //Value + ), +); + +//BMO +ThemeData theme9 = new ThemeData( + accentColor: Color(0xffCCFFDC), + //Buttons + backgroundColor: Color(0xff5CB19E), + //Background + primaryColor: Color(0xff6CB49F), + //Logo and =s + primaryColorDark: Color(0xffCCFFDC), + //Window + textTheme: TextTheme( + bodyText1: TextStyle(color: Color(0xff001029)), //Text + headline3: TextStyle(color: Color(0xff001029)), //Scores + headline4: TextStyle(color: Color(0xff5EE177)), //Value + ), +); diff --git a/lib/app_state.dart b/lib/app_state.dart deleted file mode 100644 index 62c487b..0000000 --- a/lib/app_state.dart +++ /dev/null @@ -1,15 +0,0 @@ -class AppState { - bool isLoading; - String user; - - //Constructor - AppState({this.isLoading = false, this.user}); - - //A constructor for when the app is loading - factory AppState.loading() => new AppState(isLoading: true); - - @override - String toString() { - return 'AppState(isLoading: $isLoading, user: $user'; - } -} diff --git a/lib/app_state_container.dart b/lib/app_state_container.dart deleted file mode 100644 index d5df114..0000000 --- a/lib/app_state_container.dart +++ /dev/null @@ -1,69 +0,0 @@ -import 'app_state.dart'; -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; -import 'dart:async'; - -class AppStateContainer extends StatefulWidget { - //Container that allows for loading state management - final AppState state; - final Widget child; - - AppStateContainer({ - @required this.child, - this.state, - }); - - //Method to allow universal access to state management - static _AppStateContainerState of(BuildContext context) { - return (context.inheritFromWidgetOfExactType(_InheritedStateContainer) - as _InheritedStateContainer) - .data; - } - - @override - _AppStateContainerState createState() => _AppStateContainerState(); -} - -class _AppStateContainerState extends State { - AppState state; - - @override - void initState() { - super.initState(); - if (widget.state != null) { - state = widget.state; - } else { - state = new AppState.loading(); - startCountdown(); - } - } - - Future startCountdown() async { - const timeOut = const Duration(seconds: 2); - new Timer(timeOut, () { - setState(() { - state.isLoading = false; - }); - }); - } - - @override - Widget build(BuildContext context) { - return new _InheritedStateContainer(data: this, child: widget.child); - } -} - -class _InheritedStateContainer extends InheritedWidget { - //Data to pass down - final _AppStateContainerState data; - - _InheritedStateContainer({ - Key key, - @required this.data, - @required Widget child, - }) : super(key: key, child: child); - - //Method called by default when this widget data is changed - @override - bool updateShouldNotify(InheritedWidget oldWidget) => true; -} diff --git a/lib/dataAccess.dart b/lib/dataAccess.dart deleted file mode 100644 index dab3747..0000000 --- a/lib/dataAccess.dart +++ /dev/null @@ -1,51 +0,0 @@ -import 'dart:async'; -import 'package:sqflite/sqflite.dart'; - -final String listTable = "MonitorLists"; -final String dataTable = "MonitorData"; - -class DataAccess { - static final DataAccess _instance = DataAccess._internal(); - Database _monitorLists; - Database _monitorData; - - factory DataAccess() { - return _instance; - } - - DataAccess._internal(); - - Future open() async { - var databasePath = await getDatabasesPath(); - String listPath = databasePath + "\\mLists.db"; - String dataPath = databasePath + "\\dList.db"; - - _monitorLists = await openDatabase(listPath, version: 1, - onCreate: (Database db, int version) async { - await db.execute(''' - create table MonitorLists ( - id interger primary key autoincrement, - listName text not null, - unit text not null - ); - '''); - }); - - _monitorData = await openDatabase(dataPath, version: 1, - onCreate: (Database db, int version) async { - await db.execute(''' - create table MonitorData ( - id integer primary key autoincrement, - listId integer not null, - value int not null, - date date not null, - foreign key (listId) references MonitorLists(id) - ); - '''); - }); - } - - Future> getLists() async { - var data = await _monitorLists.query("") - } -} \ No newline at end of file diff --git a/lib/db.dart b/lib/db.dart deleted file mode 100644 index 1a0700c..0000000 --- a/lib/db.dart +++ /dev/null @@ -1,38 +0,0 @@ -import 'dart:async'; -import 'package:sqflite/sqflite.dart'; - -final String scoreTable = "Score"; - -class DataAccess { - static final DataAccess _instance = DataAccess._internal(); - Database _db; - - factory DataAccess() { - return _instance; - } - - DataAccess._internal(); - - Future open() async { - var databasePath = await getDatabasesPath(); - String path = databasePath + "\td.db"; - - _db = await openDatabase(path, version: 1, - onCreate: (Database db, int version) async { - await db.execute(''' - create table $scoreTable ( - score int default 0 - ); - '''); - }); - } - - Future getScore() async { - var res = await _db.query(scoreTable); - return res[0]; - } - - Future updateScore(int s) async { - return _db.update(scoreTable, s); - } -} diff --git a/lib/storage.dart b/lib/storage.dart deleted file mode 100644 index 039a345..0000000 --- a/lib/storage.dart +++ /dev/null @@ -1,14 +0,0 @@ -String _generateKey -( - -String id = 1, - String -key) { -return "$id/$key"; -} - -@override -void saveString(String userId, String key, int score) async { - final prefs = await SharedPreferences.getInstance(); - await pres._setString("Highscore", score) -} \ No newline at end of file diff --git a/lib/utils.dart b/lib/utils.dart index 51b425f..541b867 100644 --- a/lib/utils.dart +++ b/lib/utils.dart @@ -34,7 +34,7 @@ Widget helpElement(String head, String content, BuildContext context) { padding: EdgeInsets.all(15.0), child: Card( elevation: 0.0, - color: Theme.of(context).accentColor, + color: Theme.of(context).backgroundColor, child: ListTile( title: Text( "$head",