This commit is contained in:
2024-10-18 02:27:08 +02:00
commit 977df83c36
140 changed files with 6523 additions and 0 deletions

View File

@@ -0,0 +1,204 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import '../utils/frequency_input_formatter.dart';
class EditClearancePage extends StatefulWidget {
final String clearanceLimit;
final String route;
final String altitude;
final String squawk;
final String frequency;
final bool isDarkMode;
final Function toggleDarkMode;
const EditClearancePage({super.key,
required this.clearanceLimit,
required this.route,
required this.altitude,
required this.squawk,
required this.frequency,
required this.isDarkMode,
required this.toggleDarkMode,
});
@override
EditClearancePageState createState() => EditClearancePageState();
}
class EditClearancePageState extends State<EditClearancePage> {
final _formKey = GlobalKey<FormState>();
late TextEditingController _clearanceLimitController;
late TextEditingController _routeController;
late TextEditingController _altitudeController;
late TextEditingController _squawkController;
late TextEditingController _frequencyController;
final FocusNode _altitudeFocusNode = FocusNode();
@override
void initState() {
super.initState();
_clearanceLimitController = TextEditingController(text: widget.clearanceLimit);
_routeController = TextEditingController(text: widget.route);
_altitudeController = TextEditingController(text: widget.altitude);
_squawkController = TextEditingController(text: widget.squawk);
_frequencyController = TextEditingController(text: widget.frequency);
_altitudeFocusNode.addListener(() {
if (!_altitudeFocusNode.hasFocus) {
_formatAltitude(_altitudeController);
}
});
}
@override
void dispose() {
_clearanceLimitController.dispose();
_routeController.dispose();
_altitudeController.dispose();
_squawkController.dispose();
_frequencyController.dispose();
_altitudeFocusNode.dispose();
super.dispose();
}
void _formatAltitude(TextEditingController controller) {
String text = controller.text.trim();
if (text.isEmpty) {
return;
}
if (text.startsWith('FL') || text.endsWith('ft')) {
return;
}
if (RegExp(r'^\d{2,3}$').hasMatch(text)) {
controller.text = 'FL$text';
} else if (RegExp(r'^\d{4,}$').hasMatch(text)) {
controller.text = '$text ft';
}
}
void _submitForm() {
Navigator.pop(
context,
{
'clearanceLimit': _clearanceLimitController.text,
'route': _routeController.text,
'altitude': _altitudeController.text,
'squawk': _squawkController.text,
'frequency': _frequencyController.text,
},
);
}
Widget buildTextField(String label, TextEditingController controller) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 10),
child: TextFormField(
controller: controller,
decoration: InputDecoration(
labelText: label,
border: const OutlineInputBorder(),
),
),
);
}
Widget buildAltitudeField(TextEditingController controller, FocusNode focusNode) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 10),
child: TextFormField(
controller: controller,
focusNode: focusNode,
keyboardType: TextInputType.number,
decoration: const InputDecoration(
labelText: 'Altitude',
border: OutlineInputBorder(),
),
inputFormatters: [
FilteringTextInputFormatter.digitsOnly,
],
),
);
}
Widget buildSquawkField(TextEditingController controller) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 10),
child: TextFormField(
controller: controller,
keyboardType: TextInputType.number,
decoration: const InputDecoration(
labelText: 'Transponder (Squawk)',
border: OutlineInputBorder(),
),
inputFormatters: [
FilteringTextInputFormatter.allow(RegExp(r'[0-7]')),
LengthLimitingTextInputFormatter(4),
],
),
);
}
Widget buildFrequencyField(TextEditingController controller) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 10),
child: TextFormField(
controller: controller,
keyboardType: const TextInputType.numberWithOptions(decimal: true),
decoration: const InputDecoration(
labelText: 'Frequency',
border: OutlineInputBorder(),
),
inputFormatters: [
FrequencyInputFormatter(),
],
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('IFR Buddy'),
actions: [
IconButton(
icon: Icon(widget.isDarkMode ? Icons.dark_mode : Icons.light_mode),
onPressed: () {
widget.toggleDarkMode();
},
),
],
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Card(
elevation: 4,
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Form(
key: _formKey,
child: ListView(
children: [
buildTextField('Clearance Limit', _clearanceLimitController),
buildTextField('Route', _routeController),
buildAltitudeField(_altitudeController, _altitudeFocusNode),
buildSquawkField(_squawkController),
buildFrequencyField(_frequencyController),
const SizedBox(height: 20),
ElevatedButton(
onPressed: _submitForm,
child: const Text('Submit Edited Clearance'),
),
],
),
),
),
),
),
);
}
}