diff --git a/README.md b/README.md index 70f8c39..1dc0d2b 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,16 @@ -# IFR Buddy +# ifrbuddy -**IFR Buddy** is a Flutter-based web application designed to help pilots and aviation enthusiasts easily record Instrument Flight Rules (IFR) clearances without the need for a pen. Featuring seamless navigation between input fields, dark mode, and a user-friendly interface, IFR Buddy simplifies the process of entering essential IFR details such as Clearance Limit, Route/SID, Altitude, Squawk Code, and Departure Frequency. +A new Flutter project. -## Features +## Getting Started -- **Seamless Navigation:** Move between input fields using keyboard buttons. -- **Dark Mode:** Toggle between light and dark themes for comfortable usage in any lighting condition. -- **Efficient Data Entry:** Quickly input and manage Clearance Limit, Route/SID, Altitude, Squawk Code, and Departure Frequency. +This project is a starting point for a Flutter application. -## License +A few resources to get you started if this is your first Flutter project: -This project is licensed under the MIT License. +- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 1755479..26881df 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -2,7 +2,7 @@ + android:icon="@mipmap/ic_launcher"> - - diff --git a/android/app/src/main/res/mipmap-hdpi/launcher_icon.png b/android/app/src/main/res/mipmap-hdpi/launcher_icon.png deleted file mode 100644 index 87a30b7..0000000 Binary files a/android/app/src/main/res/mipmap-hdpi/launcher_icon.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-mdpi/launcher_icon.png b/android/app/src/main/res/mipmap-mdpi/launcher_icon.png deleted file mode 100644 index a18bfec..0000000 Binary files a/android/app/src/main/res/mipmap-mdpi/launcher_icon.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png b/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png deleted file mode 100644 index c5d237e..0000000 Binary files a/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png b/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png deleted file mode 100644 index 1914d75..0000000 Binary files a/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png b/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png deleted file mode 100644 index 6a3d564..0000000 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png and /dev/null differ diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index dea7f91..f3021a1 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -539,7 +539,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -596,7 +596,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json index d0d98aa..d36b1fa 100644 --- a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1 +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":"57x57","idiom":"iphone","filename":"Icon-App-57x57@1x.png","scale":"1x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@2x.png","scale":"2x"},{"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":"50x50","idiom":"ipad","filename":"Icon-App-50x50@1x.png","scale":"1x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@2x.png","scale":"2x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@1x.png","scale":"1x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@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"}} \ No newline at end of file +{ + "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/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png index 8d58bb8..dc9ada4 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png index 61c19cb..7353c41 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png index 5596174..797d452 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png index e64f749..6ed2d93 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png index bfb1412..4cd7b00 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png index 86c31e2..fe73094 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png index 59d8296..321773c 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png index 5596174..797d452 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png index ca94326..502f463 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png index 7a9b8e4..0ec3034 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png deleted file mode 100644 index 1f75225..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png deleted file mode 100644 index 6c04b3b..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png deleted file mode 100644 index 0410109..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png deleted file mode 100644 index 22ffd39..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png index 7a9b8e4..0ec3034 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png index 96e3208..e9f5fea 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png deleted file mode 100644 index 87a30b7..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png deleted file mode 100644 index 1914d75..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png index 2efc136..84ac32a 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png index 38d6565..8953cba 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png index 995231f..0467bf1 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ diff --git a/lib/screens/comparison_page.dart b/lib/screens/comparison_page.dart index fe5aa62..20fb4ab 100644 --- a/lib/screens/comparison_page.dart +++ b/lib/screens/comparison_page.dart @@ -12,7 +12,8 @@ class ComparisonPage extends StatefulWidget { final bool isDarkMode; final Function toggleDarkMode; - const ComparisonPage({super.key, + const ComparisonPage({ + super.key, required this.expectedClearanceLimit, required this.expectedRoute, required this.expectedAltitude, @@ -159,130 +160,130 @@ class ComparisonPageState extends State { ); } -@override -Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: const Text('IFR Buddy'), // Global title - actions: [ - IconButton( - icon: Icon(widget.isDarkMode ? Icons.dark_mode : Icons.light_mode), - onPressed: () { - widget.toggleDarkMode(); - }, - ), - ], - ), - body: Padding( - padding: const EdgeInsets.all(16.0), - child: ListView( - children: [ - // Explanation Text Card - const Card( - elevation: 2, - child: Padding( - padding: EdgeInsets.all(16.0), - child: Text( - 'Use this Page while receiving your clearance. The arrow button copies the excpected value. Same if left empty.', - style: TextStyle(fontSize: 16), - textAlign: TextAlign.center, - ), - ), - ), - const SizedBox(height: 16), - - // Main content side-by-side - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Expected Clearance Column - Expanded( - child: Card( - elevation: 2, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const Text( - 'Expected', - style: TextStyle(fontSize: 22, fontWeight: FontWeight.bold), - ), - const Divider(), - buildExpectedClearanceField('Clearance Limit', widget.expectedClearanceLimit), - buildExpectedClearanceField('Route', widget.expectedRoute), - buildExpectedClearanceField('Altitude', widget.expectedAltitude), - buildExpectedClearanceField('Transponder (Squawk)', widget.expectedSquawk), - buildExpectedClearanceField('Frequency', widget.expectedFrequency), - ], - ), - ), - ), - ), - const SizedBox(width: 16), // Spacer between columns - - // Actual Clearance Column - Expanded( - child: Card( - elevation: 2, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const Text( - 'Clearance', - style: TextStyle(fontSize: 22, fontWeight: FontWeight.bold), - ), - const Divider(), - buildActualClearanceField( - 'Clearance Limit', - _actualClearanceLimitController, - widget.expectedClearanceLimit, - ), - buildActualClearanceField( - 'Route', - _actualRouteController, - widget.expectedRoute, - ), - buildActualClearanceField( - 'Altitude', - _actualAltitudeController, - widget.expectedAltitude, - focusNode: _actualAltitudeFocusNode, - ), - buildActualClearanceField( - 'Transponder (Squawk)', - _actualSquawkController, - widget.expectedSquawk, - formatterList: [ - FilteringTextInputFormatter.allow(RegExp(r'[0-7]')), - LengthLimitingTextInputFormatter(4), - ], - ), - buildActualClearanceField( - 'Frequency', - _actualFrequencyController, - widget.expectedFrequency, - formatterList: [FrequencyInputFormatter()], - ), - ], - ), - ), - ), - ), - ], - ), - const SizedBox(height: 20), - - // Proceed Button - ElevatedButton( - onPressed: _navigateToFinalClearance, - child: const Text('Proceed to Clearance Display'), + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('IFR Buddy'), // Global title + actions: [ + IconButton( + icon: Icon(widget.isDarkMode ? Icons.dark_mode : Icons.light_mode), + onPressed: () { + widget.toggleDarkMode(); + }, ), ], ), - ), - ); -} + body: Padding( + padding: const EdgeInsets.all(16.0), + child: ListView( + children: [ + // Explanation Text Card + const Card( + elevation: 2, + child: Padding( + padding: EdgeInsets.all(16.0), + child: Text( + 'Use this Page while receiving your clearance. The arrow button copies the expected value. Same if left empty.', + style: TextStyle(fontSize: 16), + textAlign: TextAlign.center, + ), + ), + ), + const SizedBox(height: 16), + + // Main content side-by-side + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Expected Clearance Column + Expanded( + child: Card( + elevation: 2, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + 'Expected', + style: TextStyle(fontSize: 22, fontWeight: FontWeight.bold), + ), + const Divider(), + buildExpectedClearanceField('Clearance Limit', widget.expectedClearanceLimit), + buildExpectedClearanceField('Route', widget.expectedRoute), + buildExpectedClearanceField('Altitude', widget.expectedAltitude), + buildExpectedClearanceField('Frequency', widget.expectedFrequency), + buildExpectedClearanceField('Transponder (Squawk)', widget.expectedSquawk), + ], + ), + ), + ), + ), + const SizedBox(width: 16), // Spacer between columns + + // Actual Clearance Column + Expanded( + child: Card( + elevation: 2, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + 'Clearance', + style: TextStyle(fontSize: 22, fontWeight: FontWeight.bold), + ), + const Divider(), + buildActualClearanceField( + 'Clearance Limit', + _actualClearanceLimitController, + widget.expectedClearanceLimit, + ), + buildActualClearanceField( + 'Route', + _actualRouteController, + widget.expectedRoute, + ), + buildActualClearanceField( + 'Altitude', + _actualAltitudeController, + widget.expectedAltitude, + focusNode: _actualAltitudeFocusNode, + ), + buildActualClearanceField( + 'Frequency', + _actualFrequencyController, + widget.expectedFrequency, + formatterList: [FrequencyInputFormatter()], + ), + buildActualClearanceField( + 'Transponder (Squawk)', + _actualSquawkController, + widget.expectedSquawk, + formatterList: [ + FilteringTextInputFormatter.allow(RegExp(r'[0-7]')), + LengthLimitingTextInputFormatter(4), + ], + ), + ], + ), + ), + ), + ), + ], + ), + const SizedBox(height: 20), + + // Proceed Button + ElevatedButton( + onPressed: _navigateToFinalClearance, + child: const Text('Proceed to Clearance Display'), + ), + ], + ), + ), + ); + } } \ No newline at end of file diff --git a/lib/screens/expectation_input_page.dart b/lib/screens/expectation_input_page.dart index 3c2e880..8530900 100644 --- a/lib/screens/expectation_input_page.dart +++ b/lib/screens/expectation_input_page.dart @@ -1,9 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:keyboard_actions/keyboard_actions.dart'; // Correct package import import 'comparison_page.dart'; import 'final_clearance_page.dart'; // Import final clearance page -import '../utils/frequency_input_formatter.dart'; +import '../utils/frequency_input_formatter.dart'; // Ensure this path is correct class ExpectationInputPage extends StatefulWidget { final bool isDarkMode; @@ -32,7 +31,7 @@ class ExpectationInputPageState extends State { final TextEditingController _expectedFrequencyController = TextEditingController(); - // Reintroduce FocusNodes + // FocusNodes for each field final FocusNode _clearanceLimitFocusNode = FocusNode(); final FocusNode _routeFocusNode = FocusNode(); final FocusNode _altitudeFocusNode = FocusNode(); @@ -93,7 +92,7 @@ class ExpectationInputPageState extends State { } } - // Updated method to build a text field with optional input + // Method to build a text field with optional input and standard keyboard Widget buildTextField({ required String label, required TextEditingController controller, @@ -120,20 +119,15 @@ class ExpectationInputPageState extends State { enableIMEPersonalizedLearning: enableIMEPersonalizedLearning, onFieldSubmitted: (_) { if (isLastField) { - // If it's the last field, unfocus to close the keyboard + // If it's the last field, unfocus to close the keyboard and submit currentFocus.unfocus(); - // Optionally, you can trigger form submission here - // _navigateToComparisonPage(); + _navigateToComparisonPage(); } else if (nextFocus != null) { FocusScope.of(context).requestFocus(nextFocus); } }, - // Updated validator to allow empty inputs + // Validator allows empty inputs but validates if input is present validator: (value) { - // If you want to perform validation only when input is not empty, - // you can add conditional checks here. - - // Example: Validate numerical fields if they are not empty if (value != null && value.isNotEmpty) { if (keyboardType == TextInputType.number || keyboardType == const TextInputType.numberWithOptions(decimal: true)) { @@ -144,7 +138,7 @@ class ExpectationInputPageState extends State { // Add more specific validations if needed } - // Example: Validate Transponder (Squawk) field + // Validate Transponder (Squawk) field if (label == 'Transponder (Squawk)') { if (!RegExp(r'^[0-7]{1,4}$').hasMatch(value)) { return 'Squawk must be 1-4 digits between 0 and 7'; @@ -165,105 +159,6 @@ class ExpectationInputPageState extends State { ); } - // Configure KeyboardActions - KeyboardActionsConfig _buildConfig(BuildContext context) { - return KeyboardActionsConfig( - keyboardSeparatorColor: Colors.grey, // Optional: Customize the separator color - nextFocus: true, // Automatically handle next focus - actions: [ - // Define actions for each FocusNode - KeyboardActionsItem( - focusNode: _clearanceLimitFocusNode, - toolbarButtons: [ - (node) { - return GestureDetector( - onTap: () => node.nextFocus(), - child: const Padding( - padding: EdgeInsets.all(8.0), - child: Text( - "Next", - style: TextStyle(color: Colors.blue, fontSize: 16), - ), - ), - ); - } - ], - ), - KeyboardActionsItem( - focusNode: _routeFocusNode, - toolbarButtons: [ - (node) { - return GestureDetector( - onTap: () => node.nextFocus(), - child: const Padding( - padding: EdgeInsets.all(8.0), - child: Text( - "Next", - style: TextStyle(color: Colors.blue, fontSize: 16), - ), - ), - ); - } - ], - ), - KeyboardActionsItem( - focusNode: _altitudeFocusNode, - toolbarButtons: [ - (node) { - return GestureDetector( - onTap: () => node.nextFocus(), - child: const Padding( - padding: EdgeInsets.all(8.0), - child: Text( - "Next", - style: TextStyle(color: Colors.blue, fontSize: 16), - ), - ), - ); - } - ], - ), - KeyboardActionsItem( - focusNode: _squawkFocusNode, - toolbarButtons: [ - (node) { - return GestureDetector( - onTap: () => node.nextFocus(), - child: const Padding( - padding: EdgeInsets.all(8.0), - child: Text( - "Next", - style: TextStyle(color: Colors.blue, fontSize: 16), - ), - ), - ); - } - ], - ), - KeyboardActionsItem( - focusNode: _frequencyFocusNode, - toolbarButtons: [ - (node) { - return GestureDetector( - onTap: () { - node.unfocus(); // Dismiss the keyboard - _navigateToComparisonPage(); // Optionally, submit the form - }, - child: const Padding( - padding: EdgeInsets.all(8.0), - child: Text( - "Done", - style: TextStyle(color: Colors.blue, fontSize: 16), - ), - ), - ); - } - ], - ), - ], - ); - } - @override Widget build(BuildContext context) { return Scaffold( @@ -282,142 +177,151 @@ class ExpectationInputPageState extends State { body: GestureDetector( // Dismiss the keyboard when tapping outside onTap: () => FocusScope.of(context).unfocus(), - child: KeyboardActions( - config: _buildConfig(context), // Apply KeyboardActionsConfig - child: SingleChildScrollView( - padding: const EdgeInsets.all(16.0), - child: Column( - children: [ - const Card( - elevation: 2, - child: Padding( - padding: EdgeInsets.all(16.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'Welcome to IFR Buddy!', - style: TextStyle( - fontSize: 18, fontWeight: FontWeight.bold), - textAlign: TextAlign.left, - ), - SizedBox(height: 10), - Text( - 'Just an easy tool for writing down IFR clearances without a pen.', - style: TextStyle(fontSize: 16), - textAlign: TextAlign.left, - ), - ], - ), + child: SingleChildScrollView( + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + const Card( + elevation: 2, + child: Padding( + padding: EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Welcome to IFR Buddy!', + style: TextStyle( + fontSize: 18, fontWeight: FontWeight.bold), + textAlign: TextAlign.left, + ), + SizedBox(height: 10), + Text( + 'Just an easy tool for writing down IFR clearances without a pen.', + style: TextStyle(fontSize: 16), + textAlign: TextAlign.left, + ), + ], ), ), - const SizedBox(height: 16), - Card( - elevation: 2, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const Text( - 'Expected Clearance', - style: TextStyle( - fontSize: 22, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 16), + Card( + elevation: 2, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + 'Expected Clearance', + style: TextStyle( + fontSize: 22, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 10), + const Text( + 'Enter your expected clearance information below. ' + 'Use the listening page or skip to the readback page.', + style: TextStyle(fontSize: 16), + textAlign: TextAlign.left, + ), + const SizedBox(height: 16), + Form( + key: _formKey, + child: Column( + children: [ + buildTextField( + label: 'Clearance Limit', + controller: _expectedClearanceLimitController, + currentFocus: _clearanceLimitFocusNode, + nextFocus: _routeFocusNode, + keyboardType: TextInputType.text, // Standard keyboard + inputFormatters: [ + // Allow letters, numbers, spaces, and hyphens + FilteringTextInputFormatter.allow( + RegExp(r'[A-Za-z0-9\s\-]')), + ], + enableAutocorrect: false, // Disable autocorrect + enableSuggestions: false, // Disable suggestions + enableIMEPersonalizedLearning: + false, // iOS-specific + ), + buildTextField( + label: 'Route/Sid', + controller: _expectedRouteController, + currentFocus: _routeFocusNode, + nextFocus: _altitudeFocusNode, + keyboardType: TextInputType.text, // Standard keyboard + inputFormatters: [ + // Allow letters, numbers, spaces, and hyphens + FilteringTextInputFormatter.allow( + RegExp(r'[A-Za-z0-9\s\-]')), + ], + enableAutocorrect: false, // Disable autocorrect + enableSuggestions: false, // Disable suggestions + enableIMEPersonalizedLearning: + false, // iOS-specific + ), + buildTextField( + label: 'Altitude', + controller: _expectedAltitudeController, + currentFocus: _altitudeFocusNode, + nextFocus: _squawkFocusNode, + keyboardType: TextInputType.text, // Standard keyboard + inputFormatters: null, // No restrictions + enableAutocorrect: false, // Disable autocorrect + enableSuggestions: false, // Disable suggestions + enableIMEPersonalizedLearning: + false, // iOS-specific + ), + buildTextField( + label: 'Transponder (Squawk)', + controller: _expectedSquawkController, + currentFocus: _squawkFocusNode, + nextFocus: _frequencyFocusNode, + keyboardType: TextInputType.text, // Standard keyboard + inputFormatters: [ + // Allow only digits 0-7 and limit to 4 characters + FilteringTextInputFormatter.allow( + RegExp(r'[0-7]')), + LengthLimitingTextInputFormatter(4), + ], + enableAutocorrect: false, // Disable autocorrect + enableSuggestions: false, // Disable suggestions + enableIMEPersonalizedLearning: + false, // iOS-specific + ), + buildTextField( + label: 'Departure Frequency', + controller: _expectedFrequencyController, + currentFocus: _frequencyFocusNode, + isLastField: true, + keyboardType: TextInputType.text, // Standard keyboard + inputFormatters: [ + FrequencyInputFormatter(), // Handles decimal inputs + ], + enableAutocorrect: false, // Disable autocorrect + enableSuggestions: false, // Disable suggestions + enableIMEPersonalizedLearning: + false, // iOS-specific + ), + const SizedBox(height: 20), + ElevatedButton( + onPressed: _navigateToComparisonPage, + child: const Text('Next'), + ), + const SizedBox(height: 10), + TextButton( + onPressed: _skipReadback, + child: const Text('Skip to end'), + ), + ], ), - const SizedBox(height: 10), - const Text( - 'Enter your expected clearance information below. ' - 'Use the listening page or skip to the readback page.', - style: TextStyle(fontSize: 16), - textAlign: TextAlign.left, - ), - const SizedBox(height: 16), - Form( - key: _formKey, - child: Column( - children: [ - buildTextField( - label: 'Clearance Limit', - controller: _expectedClearanceLimitController, - currentFocus: _clearanceLimitFocusNode, - nextFocus: _routeFocusNode, - enableAutocorrect: false, // Disable autocorrect - enableSuggestions: false, // Disable suggestions - enableIMEPersonalizedLearning: - false, // iOS-specific - ), - buildTextField( - label: 'Route/Sid', - controller: _expectedRouteController, - currentFocus: _routeFocusNode, - nextFocus: _altitudeFocusNode, - enableAutocorrect: false, // Disable autocorrect - enableSuggestions: false, // Disable suggestions - enableIMEPersonalizedLearning: - false, // iOS-specific - ), - buildTextField( - label: 'Altitude', - controller: _expectedAltitudeController, - currentFocus: _altitudeFocusNode, - nextFocus: _squawkFocusNode, - keyboardType: TextInputType.number, - inputFormatters: [ - FilteringTextInputFormatter.digitsOnly - ], - enableAutocorrect: false, // Disable autocorrect - enableSuggestions: false, // Disable suggestions - enableIMEPersonalizedLearning: - false, // iOS-specific - ), - buildTextField( - label: 'Transponder (Squawk)', - controller: _expectedSquawkController, - currentFocus: _squawkFocusNode, - nextFocus: _frequencyFocusNode, - keyboardType: TextInputType.number, - inputFormatters: [ - FilteringTextInputFormatter.allow( - RegExp(r'[0-7]')), - LengthLimitingTextInputFormatter(4), - ], - enableAutocorrect: false, // Disable autocorrect - enableSuggestions: false, // Disable suggestions - enableIMEPersonalizedLearning: - false, // iOS-specific - ), - buildTextField( - label: 'Departure Frequency', - controller: _expectedFrequencyController, - currentFocus: _frequencyFocusNode, - isLastField: true, - keyboardType: - const TextInputType.numberWithOptions(decimal: true), - inputFormatters: [FrequencyInputFormatter()], - enableAutocorrect: false, // Disable autocorrect - enableSuggestions: false, // Disable suggestions - enableIMEPersonalizedLearning: - false, // iOS-specific - ), - const SizedBox(height: 20), - ElevatedButton( - onPressed: _skipReadback, - child: const Text('Skip to Readback'), - ), - const SizedBox(height: 10), - ElevatedButton( - onPressed: _navigateToComparisonPage, - child: const Text('Navigate to Comparison Page'), - ), - ], - ), - ), - ], - ), + ), + ], ), ), - ], - ), + ), + ], ), ), ), diff --git a/lib/screens/final_clearance_page.dart b/lib/screens/final_clearance_page.dart index 9db5ede..8c3366d 100644 --- a/lib/screens/final_clearance_page.dart +++ b/lib/screens/final_clearance_page.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'expectation_input_page.dart'; -import 'edit_clearance_page.dart'; // Import the edit clearance page +// Import the edit clearance page import '../widgets/clearance_field.dart'; class FinalClearanceDisplay extends StatefulWidget { @@ -44,33 +44,6 @@ class FinalClearanceDisplayState extends State { } // Navigate to Edit Clearance Page and handle returned data - Future _navigateToEditClearance() async { - final result = await Navigator.push( - context, - MaterialPageRoute( - builder: (context) => EditClearancePage( - clearanceLimit: clearanceLimit, - route: route, - altitude: altitude, - squawk: squawk, - frequency: frequency, - isDarkMode: widget.isDarkMode, - toggleDarkMode: widget.toggleDarkMode, - ), - ), - ); - - // If the result contains updated data, update the state with the new values - if (result != null && mounted) { - setState(() { - clearanceLimit = result['clearanceLimit']; - route = result['route']; - altitude = result['altitude']; - squawk = result['squawk']; - frequency = result['frequency']; - }); - } - } // Navigate back to the first page (ExpectationInputPage) void _navigateHome(BuildContext context) { @@ -97,18 +70,7 @@ class FinalClearanceDisplayState extends State { _navigateHome(context); }, ), - actions: [ - IconButton( - icon: const Icon(Icons.edit), // Edit button - onPressed: _navigateToEditClearance, - ), - IconButton( - icon: Icon(widget.isDarkMode ? Icons.dark_mode : Icons.light_mode), - onPressed: () { - widget.toggleDarkMode(); - }, - ), - ], + actions: const [], ), body: Center( child: SingleChildScrollView( diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json index 96d3fee..a2ec33f 100644 --- a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,68 +1,68 @@ { - "info": { - "version": 1, - "author": "xcode" + "images" : [ + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_16.png", + "scale" : "1x" }, - "images": [ - { - "size": "16x16", - "idiom": "mac", - "filename": "app_icon_16.png", - "scale": "1x" - }, - { - "size": "16x16", - "idiom": "mac", - "filename": "app_icon_32.png", - "scale": "2x" - }, - { - "size": "32x32", - "idiom": "mac", - "filename": "app_icon_32.png", - "scale": "1x" - }, - { - "size": "32x32", - "idiom": "mac", - "filename": "app_icon_64.png", - "scale": "2x" - }, - { - "size": "128x128", - "idiom": "mac", - "filename": "app_icon_128.png", - "scale": "1x" - }, - { - "size": "128x128", - "idiom": "mac", - "filename": "app_icon_256.png", - "scale": "2x" - }, - { - "size": "256x256", - "idiom": "mac", - "filename": "app_icon_256.png", - "scale": "1x" - }, - { - "size": "256x256", - "idiom": "mac", - "filename": "app_icon_512.png", - "scale": "2x" - }, - { - "size": "512x512", - "idiom": "mac", - "filename": "app_icon_512.png", - "scale": "1x" - }, - { - "size": "512x512", - "idiom": "mac", - "filename": "app_icon_1024.png", - "scale": "2x" - } - ] -} \ No newline at end of file + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "2x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_64.png", + "scale" : "2x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_128.png", + "scale" : "1x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "2x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "1x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "2x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_1024.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png index 8d58bb8..82b6f9d 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png index 515e58b..13b35eb 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png index f59e813..0a3f5fa 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png index 69f0bd4..bdb5722 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png index 636344a..f083318 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png index 6f3872e..326c0e7 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png index 918897d..2f1632c 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png differ diff --git a/pubspec.lock b/pubspec.lock index 133bee5..bf7cd81 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,22 +1,6 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: - archive: - dependency: transitive - description: - name: archive - sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d - url: "https://pub.dev" - source: hosted - version: "3.6.1" - args: - dependency: transitive - description: - name: args - sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6 - url: "https://pub.dev" - source: hosted - version: "2.6.0" async: dependency: transitive description: @@ -41,22 +25,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.0" - checked_yaml: - dependency: transitive - description: - name: checked_yaml - sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff - url: "https://pub.dev" - source: hosted - version: "2.0.3" - cli_util: - dependency: transitive - description: - name: cli_util - sha256: c05b7406fdabc7a49a3929d4af76bcaccbbffcbcdcf185b082e1ae07da323d19 - url: "https://pub.dev" - source: hosted - version: "0.4.1" clock: dependency: transitive description: @@ -73,14 +41,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.18.0" - crypto: - dependency: transitive - description: - name: crypto - sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" - url: "https://pub.dev" - source: hosted - version: "3.0.6" cupertino_icons: dependency: "direct main" description: @@ -118,14 +78,6 @@ packages: description: flutter source: sdk version: "0.0.0" - flutter_launcher_icons: - dependency: "direct main" - description: - name: flutter_launcher_icons - sha256: "619817c4b65b322b5104b6bb6dfe6cda62d9729bd7ad4303ecc8b4e690a67a77" - url: "https://pub.dev" - source: hosted - version: "0.14.1" flutter_lints: dependency: "direct dev" description: @@ -160,46 +112,22 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.2" - image: - dependency: transitive - description: - name: image - sha256: f31d52537dc417fdcde36088fdf11d191026fd5e4fae742491ebd40e5a8bea7d - url: "https://pub.dev" - source: hosted - version: "4.3.0" - json_annotation: - dependency: transitive - description: - name: json_annotation - sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" - url: "https://pub.dev" - source: hosted - version: "4.9.0" - keyboard_actions: - dependency: "direct main" - description: - name: keyboard_actions - sha256: "31e0ab2a706ac8f58887efa60efc1f19aecdf37d8ab0f665a0f156d1fbeab650" - url: "https://pub.dev" - source: hosted - version: "4.2.0" leak_tracker: dependency: transitive description: name: leak_tracker - sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" url: "https://pub.dev" source: hosted - version: "10.0.4" + version: "10.0.5" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.5" leak_tracker_testing: dependency: transitive description: @@ -228,18 +156,18 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.8.0" + version: "0.11.1" meta: dependency: transitive description: name: meta - sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.15.0" path: dependency: transitive description: @@ -272,14 +200,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.0" - petitparser: - dependency: transitive - description: - name: petitparser - sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 - url: "https://pub.dev" - source: hosted - version: "6.0.2" platform: dependency: transitive description: @@ -401,10 +321,10 @@ packages: dependency: transitive description: name: test_api - sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" url: "https://pub.dev" source: hosted - version: "0.7.0" + version: "0.7.2" typed_data: dependency: transitive description: @@ -425,10 +345,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" + sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" url: "https://pub.dev" source: hosted - version: "14.2.1" + version: "14.2.5" web: dependency: transitive description: @@ -445,22 +365,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.0" - xml: - dependency: transitive - description: - name: xml - sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 - url: "https://pub.dev" - source: hosted - version: "6.5.0" - yaml: - dependency: transitive - description: - name: yaml - sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" - url: "https://pub.dev" - source: hosted - version: "3.1.2" sdks: dart: ">=3.4.3 <4.0.0" flutter: ">=3.22.0" diff --git a/pubspec.yaml b/pubspec.yaml index 8b7073b..c077a66 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -36,9 +36,6 @@ dependencies: cupertino_icons: ^1.0.6 http: ^1.2.2 shared_preferences: ^2.3.2 - keyboard_actions: ^4.2.0 - flutter_launcher_icons: ^0.14.1 - dev_dependencies: flutter_test: sdk: flutter diff --git a/web/favicon.png b/web/favicon.png index f59e813..d872e27 100644 Binary files a/web/favicon.png and b/web/favicon.png differ diff --git a/web/icons/Icon-192.png b/web/icons/Icon-192.png index 6a3d564..93743cb 100644 Binary files a/web/icons/Icon-192.png and b/web/icons/Icon-192.png differ diff --git a/web/icons/Icon-512.png b/web/icons/Icon-512.png index 6f3872e..e71c24a 100644 Binary files a/web/icons/Icon-512.png and b/web/icons/Icon-512.png differ diff --git a/web/icons/Icon-maskable-192.png b/web/icons/Icon-maskable-192.png deleted file mode 100644 index 6a3d564..0000000 Binary files a/web/icons/Icon-maskable-192.png and /dev/null differ diff --git a/web/icons/Icon-maskable-512.png b/web/icons/Icon-maskable-512.png deleted file mode 100644 index 6f3872e..0000000 Binary files a/web/icons/Icon-maskable-512.png and /dev/null differ diff --git a/web/icons/favicon.png b/web/icons/favicon.png deleted file mode 100644 index f59e813..0000000 Binary files a/web/icons/favicon.png and /dev/null differ diff --git a/web/index.html b/web/index.html index 88357f5..effcf5c 100644 --- a/web/index.html +++ b/web/index.html @@ -18,7 +18,7 @@ - + @@ -29,7 +29,7 @@ - + diff --git a/web/manifest.json b/web/manifest.json index b69a065..49ca7fe 100644 --- a/web/manifest.json +++ b/web/manifest.json @@ -1,11 +1,11 @@ { - "name": "ifrbuddy", - "short_name": "ifrbuddy", + "name": "IFR Buddy", + "short_name": "IFR Buddy", "start_url": ".", "display": "standalone", - "background_color": "#hexcode", - "theme_color": "#hexcode", - "description": "A new Flutter project.", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "Write down IFR Clearances easily", "orientation": "portrait-primary", "prefer_related_applications": false, "icons": [ @@ -32,4 +32,4 @@ "purpose": "maskable" } ] -} \ No newline at end of file +} diff --git a/windows/runner/resources/app_icon.ico b/windows/runner/resources/app_icon.ico index fb481b6..c04e20c 100644 Binary files a/windows/runner/resources/app_icon.ico and b/windows/runner/resources/app_icon.ico differ