|
@@ -0,0 +1,720 @@
|
|
|
+/*
|
|
|
+ *openPilot Log - A FOSS Pilot Logbook Application
|
|
|
+ *Copyright (C) 2020 Felix Turowsky
|
|
|
+ *
|
|
|
+ *This program is free software: you can redistribute it and/or modify
|
|
|
+ *it under the terms of the GNU General Public License as published by
|
|
|
+ *the Free Software Foundation, either version 3 of the License, or
|
|
|
+ *(at your option) any later version.
|
|
|
+ *
|
|
|
+ *This program is distributed in the hope that it will be useful,
|
|
|
+ *but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+ *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
+ *GNU General Public License for more details.
|
|
|
+ *
|
|
|
+ *You should have received a copy of the GNU General Public License
|
|
|
+ *along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
+ */
|
|
|
+#include "newflight.h"
|
|
|
+#include "ui_newflight.h"
|
|
|
+#include "newacft.h"
|
|
|
+#include "calc.h"
|
|
|
+#include "dbman.cpp"
|
|
|
+#include <QMessageBox>
|
|
|
+#include <QDebug>
|
|
|
+#include <QCompleter>
|
|
|
+#include <QStringList>
|
|
|
+#include <QStringListModel>
|
|
|
+#include <QSortFilterProxyModel>
|
|
|
+#include <QButtonGroup>
|
|
|
+
|
|
|
+
|
|
|
+void NewFlight::on_verifyButton_clicked()
|
|
|
+{
|
|
|
+ /*on_newDoft_editingFinished();// - activate slots in case user has been active in last input before clicking submit
|
|
|
+ on_newTonb_editingFinished();
|
|
|
+ on_newTofb_editingFinished();
|
|
|
+ on_newDept_editingFinished();
|
|
|
+ on_newDest_editingFinished();
|
|
|
+ on_newAcft_editingFinished();
|
|
|
+ on_newPic_editingFinished();
|
|
|
+ verifyInput();*/
|
|
|
+ fillExtrasLineEdits();
|
|
|
+
|
|
|
+}
|
|
|
+/*
|
|
|
+ * Initialise variables
|
|
|
+ */
|
|
|
+QDate date(QDate::currentDate());
|
|
|
+QString doft(QDate::currentDate().toString(Qt::ISODate));
|
|
|
+QString dept;
|
|
|
+QString dest;
|
|
|
+QTime tofb;
|
|
|
+QTime tonb;
|
|
|
+QTime tblk;
|
|
|
+QString pic;
|
|
|
+QString acft;
|
|
|
+QVector<QString> flight;
|
|
|
+// extras
|
|
|
+QString PilotFunction;
|
|
|
+QString PilotTask;
|
|
|
+QString TakeOff;
|
|
|
+QString Landing;
|
|
|
+QString Autoland;
|
|
|
+QString ApproachType;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+/*
|
|
|
+ * Window
|
|
|
+ */
|
|
|
+
|
|
|
+NewFlight::NewFlight(QWidget *parent) :
|
|
|
+ QDialog(parent),
|
|
|
+ ui(new Ui::NewFlight)
|
|
|
+{
|
|
|
+ ui->setupUi(this);
|
|
|
+ ui->newDoft->setDate(QDate::currentDate());
|
|
|
+
|
|
|
+ bool hasoldinput = db::CheckScratchpad();
|
|
|
+ qDebug() << "Hasoldinput? = " << hasoldinput;
|
|
|
+ if(hasoldinput) // Re-populate the Form
|
|
|
+ {
|
|
|
+ flight = db::RetreiveScratchpad();
|
|
|
+ qDebug() << "Re-Filling Form from Scratchpad";
|
|
|
+ returnInput(flight);
|
|
|
+ }
|
|
|
+
|
|
|
+ // Validators for Line Edits
|
|
|
+ QRegExp icao_rx("[a-zA-Z]?[a-zA-Z]?[a-zA-Z]?[a-zA-Z]"); // allow only letters (upper and lower)
|
|
|
+ QValidator *ICAOvalidator = new QRegExpValidator(icao_rx, this);
|
|
|
+ ui->newDept->setValidator(ICAOvalidator);
|
|
|
+ ui->newDest->setValidator(ICAOvalidator);
|
|
|
+ QRegExp timehhmm("([01]?[0-9]|2[0-3]):?[0-5][0-9]"); //allows time in 24h format with optional leading 0 and with or without seperator
|
|
|
+ QValidator *timeInputValidator = new QRegExpValidator(timehhmm, this);
|
|
|
+ ui->newTofb->setValidator(timeInputValidator);
|
|
|
+ ui->newTonb->setValidator(timeInputValidator);
|
|
|
+ ui->spseTimeLineEdit->setValidator(timeInputValidator);
|
|
|
+ ui->spmeTimeLineEdit->setValidator(timeInputValidator);
|
|
|
+ ui->mpTimeLineEdit->setValidator(timeInputValidator);
|
|
|
+ ui->totalTimeLineEdit->setValidator(timeInputValidator);
|
|
|
+ ui->ifrTimeLineEdit->setValidator(timeInputValidator);
|
|
|
+ ui->vfrTimeLineEdit->setValidator(timeInputValidator);
|
|
|
+ ui->nightTimeLineEdit->setValidator(timeInputValidator);
|
|
|
+ ui->xcTimeLineEdit->setValidator(timeInputValidator);
|
|
|
+ ui->picTimeLineEdit->setValidator(timeInputValidator);
|
|
|
+ ui->copTimeLineEdit->setValidator(timeInputValidator);
|
|
|
+ ui->dualTimeLineEdit->setValidator(timeInputValidator);
|
|
|
+ ui->fiTimeLineEdit->setValidator(timeInputValidator);
|
|
|
+ ui->simTimeLineEdit->setValidator(timeInputValidator);
|
|
|
+ QRegExp picname("^[a-zA-Z_]+,?( [a-zA-Z_]+)*$");// allow only lastname, firstname or lastname firstname with one whitespace
|
|
|
+ QValidator *picNameValidator = new QRegExpValidator(picname, this);
|
|
|
+ ui->newPic->setValidator(picNameValidator);
|
|
|
+
|
|
|
+ // Groups for CheckBoxes
|
|
|
+ QButtonGroup *FlightRulesGroup = new QButtonGroup(this);
|
|
|
+ FlightRulesGroup->addButton(ui->IfrCheckBox);
|
|
|
+ FlightRulesGroup->addButton(ui->VfrCheckBox);
|
|
|
+
|
|
|
+ QButtonGroup *PilotTaskGroup = new QButtonGroup(this);
|
|
|
+ PilotTaskGroup->addButton(ui->PilotFlyingCheckBox);
|
|
|
+ PilotTaskGroup->addButton(ui->PilotMonitoringCheckBox);
|
|
|
+
|
|
|
+ restoreSettings();
|
|
|
+ ui->deptTZ->setFocusPolicy(Qt::NoFocus);
|
|
|
+ ui->destTZ->setFocusPolicy(Qt::NoFocus);
|
|
|
+ ui->newDept->setFocus();
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+NewFlight::~NewFlight()
|
|
|
+{
|
|
|
+ delete ui;
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Functions
|
|
|
+ */
|
|
|
+
|
|
|
+void NewFlight::nope()
|
|
|
+{
|
|
|
+ QMessageBox nope(this); //error box
|
|
|
+ nope.setText("This feature is not yet available!");
|
|
|
+ nope.exec();
|
|
|
+}
|
|
|
+
|
|
|
+/*!
|
|
|
+ * \brief NewFlight::validateTimeInput verifies user input and formats to hh:mm
|
|
|
+ * \param userinput from a QLineEdit
|
|
|
+ * \return formatted QString "hh:mm"
|
|
|
+ */
|
|
|
+QString NewFlight::validateTimeInput(QString userinput)
|
|
|
+{
|
|
|
+ QString output;
|
|
|
+ QTime temptime;
|
|
|
+
|
|
|
+ if(userinput.length() <3)
|
|
|
+ {
|
|
|
+ QMessageBox timeformat(this);
|
|
|
+ timeformat.setText("Please enter a valid time. Any of these formats is valid:\n845 0845 8:45 08:45");
|
|
|
+ timeformat.exec();
|
|
|
+ }
|
|
|
+
|
|
|
+ bool containsSeperator = userinput.contains(":");
|
|
|
+ if(userinput.length() == 4 && !containsSeperator)
|
|
|
+ {
|
|
|
+ temptime = QTime::fromString(userinput,"hhmm");
|
|
|
+ }else if(userinput.length() == 3 && !containsSeperator)
|
|
|
+ {
|
|
|
+ if(userinput.toInt() < 240) //Qtime is invalid if time is between 000 and 240 for this case
|
|
|
+ {
|
|
|
+ QString tempstring = userinput.prepend("0");
|
|
|
+ temptime = QTime::fromString(tempstring,"hhmm");
|
|
|
+ }else
|
|
|
+ {
|
|
|
+ temptime = QTime::fromString(userinput,"Hmm");
|
|
|
+ }
|
|
|
+ }else if(userinput.length() == 4 && containsSeperator)
|
|
|
+ {
|
|
|
+ temptime = QTime::fromString(userinput,"h:mm");
|
|
|
+ }else if(userinput.length() == 5 && containsSeperator)
|
|
|
+ {
|
|
|
+ temptime = QTime::fromString(userinput,"hh:mm");
|
|
|
+ }
|
|
|
+
|
|
|
+ return temptime.toString("hh:mm");
|
|
|
+}
|
|
|
+
|
|
|
+/*!
|
|
|
+ * \brief NewFlight::fillExtrasLineEdits Fills the flight time line edits according to ui selections
|
|
|
+ */
|
|
|
+void NewFlight::fillExtrasLineEdits()
|
|
|
+{
|
|
|
+ // SP SE
|
|
|
+ // SP ME
|
|
|
+ // MP
|
|
|
+ // TOTAL
|
|
|
+ if(tofb.isValid() && tonb.isValid()) {
|
|
|
+ ui->totalTimeLineEdit->setText(calc::blocktime(tofb,tonb).toString("hh:mm"));
|
|
|
+ }
|
|
|
+ // IFR
|
|
|
+ // VFR
|
|
|
+ // Night
|
|
|
+ if(ui->autoNightCheckBox->isChecked() && tofb.isValid() && tonb.isValid() && dept.length() == 4 && dest.length() == 4) {
|
|
|
+ QString deptDate = date.toString(Qt::ISODate) + 'T' + tofb.toString("hh:mm");
|
|
|
+ qDebug() << "Departure Date: " << deptDate;
|
|
|
+ QDateTime deptDateTime = QDateTime::fromString(deptDate,"yyyy-MM-ddThh:mm");
|
|
|
+ qDebug() << "Departure DateTime " << deptDateTime;
|
|
|
+ int blocktime = calc::time_to_minutes(calc::blocktime(tofb,tonb));
|
|
|
+ qDebug() << "Blocktime: " << blocktime;
|
|
|
+ //qDebug() << calc::calculateNightTime(dept, dest, deptDateTime, blocktime);
|
|
|
+ //qDebug() << calc::minutes_to_string(QString::number(calc::calculateNightTime(dept, dest, deptDateTime, blocktime)));
|
|
|
+ ui->nightTimeLineEdit->setText(calc::minutes_to_string(QString::number(calc::calculateNightTime(dept, dest, deptDateTime, blocktime))));
|
|
|
+ }else if(!ui->autoNightCheckBox->isChecked()) {
|
|
|
+ ui->nightTimeLineEdit->setText("");
|
|
|
+ }
|
|
|
+ // XC
|
|
|
+ // PIC
|
|
|
+ // Co-Pilot
|
|
|
+ // Dual
|
|
|
+ // FI
|
|
|
+ // SIM
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+QVector<QString> NewFlight::collectInput()
|
|
|
+{
|
|
|
+ // Collect input from the user fields and return a vector containing the flight information
|
|
|
+ QString doft = date.toString(Qt::ISODate); // Format Date
|
|
|
+ QTime tblk = calc::blocktime(tofb,tonb); // Calculate Blocktime
|
|
|
+
|
|
|
+
|
|
|
+ // Prepare Vector for commit to database
|
|
|
+ flight = db::CreateFlightVectorFromInput(doft, dept, tofb, dest, tonb, tblk, pic, acft);
|
|
|
+ qDebug() << "Created flight vector:" << flight;
|
|
|
+
|
|
|
+ return flight;
|
|
|
+}
|
|
|
+
|
|
|
+bool NewFlight::verifyInput()
|
|
|
+ //check if the input is correctly formatted and all required fields are filled
|
|
|
+{
|
|
|
+
|
|
|
+ bool deptValid = false;
|
|
|
+ bool tofbValid = false;
|
|
|
+ bool destValid = false;
|
|
|
+ bool tonbValid = false;
|
|
|
+ bool tblkValid = false;
|
|
|
+ bool picValid = false;
|
|
|
+ bool acftValid = false;
|
|
|
+
|
|
|
+ QTime tblk = calc::blocktime(tofb,tonb);
|
|
|
+ int checktblk = calc::time_to_minutes(tblk);
|
|
|
+
|
|
|
+ bool doftValid = true; //doft assumed to be always valid due to QDateTimeEdit constraints
|
|
|
+ qDebug() << "NewFlight::verifyInput() says: Date:" << doft << " - Valid?\t" << doftValid;
|
|
|
+
|
|
|
+ deptValid = db::CheckICAOValid(dept);
|
|
|
+ qDebug() << "NewFlight::verifyInput() says: Departure is:\t" << dept << " - Valid?\t" << deptValid;
|
|
|
+
|
|
|
+ destValid = db::CheckICAOValid(dest);
|
|
|
+ qDebug() << "NewFlight::verifyInput() says: Destination is:\t" << dest << " - Valid?\t" << destValid;
|
|
|
+
|
|
|
+ tofbValid = (unsigned)(calc::time_to_minutes(tofb)-0) <= (1440-0) && tofb.toString("hh:mm") != ""; // Make sure time is within range, DB 1 day = 1440 minutes. 0 is allowed (midnight) & that it is not empty.
|
|
|
+ qDebug() << "NewFlight::verifyInput() says: tofb is:\t\t" << tofb.toString("hh:mm") << " - Valid?\t" << tofbValid;
|
|
|
+
|
|
|
+ tonbValid = (unsigned)(calc::time_to_minutes(tonb)-0) <= (1440-0) && tonb.toString("hh:mm") != ""; // Make sure time is within range, DB 1 day = 1440 minutes
|
|
|
+ qDebug() << "NewFlight::verifyInput() says: tonb is:\t\t" << tonb.toString("hh:mm")<< " - Valid?\t" << tonbValid;
|
|
|
+
|
|
|
+ picValid = (pic.toInt() > 0); // pic should be a pilot_id retreived from the database
|
|
|
+ qDebug() << "NewFlight::verifyInput() says: pic is pilotd_id:\t" << pic << " - Valid?\t" << picValid;
|
|
|
+ if(!picValid)
|
|
|
+ {
|
|
|
+ QMessageBox msgBox(this);
|
|
|
+ msgBox.setText("You cannot log a flight without a valid pilot");
|
|
|
+ msgBox.exec();
|
|
|
+ }
|
|
|
+
|
|
|
+ acftValid = (acft.toInt() > 0);
|
|
|
+ qDebug() << "NewFlight::verifyInput() says: acft is tail_id:\t" << acft << " - Valid?\t" << acftValid;
|
|
|
+ if(!acftValid)
|
|
|
+ {
|
|
|
+ QMessageBox msgBox(this);
|
|
|
+ msgBox.setText("You cannot log a flight without a valid aircraft");
|
|
|
+ msgBox.exec();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ tblkValid = checktblk != 0;
|
|
|
+ qDebug() << "NewFlight::verifyInput() says: tblk is:\t\t" << tblk.toString("hh:mm") << " - Valid?\t" << tblkValid;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ if(deptValid && tofbValid && destValid && tonbValid
|
|
|
+ && tblkValid && picValid && acftValid)
|
|
|
+ {
|
|
|
+ qDebug() << "====================================================";
|
|
|
+ qDebug() << "NewFlight::verifyInput() says: All checks passed! Very impressive. ";
|
|
|
+ return 1;
|
|
|
+ }else
|
|
|
+ {
|
|
|
+ qDebug() << "====================================================";
|
|
|
+ qDebug() << "NewFlight::verifyInput() says: Flight is invalid.";
|
|
|
+ qDebug() << "NewFlight::verifyInput() says: I will call the cops.";
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+void NewFlight::returnInput(QVector<QString> flight)
|
|
|
+{
|
|
|
+ // Re-populates the input masks with the selected fields if input was erroneous to allow for corrections to be made
|
|
|
+ ui->newDoft->setDate(QDate::fromString(flight[1],Qt::ISODate));
|
|
|
+ ui->newDept->setText(flight[2]);
|
|
|
+ ui->newTofb->setText(flight[3]);
|
|
|
+ ui->newDest->setText(flight[4]);
|
|
|
+ ui->newTonb->setText(flight[5]);
|
|
|
+ // flight[6] is blocktime
|
|
|
+ ui->newPic->setText(db::RetreivePilotNameFromID(flight[7]));
|
|
|
+ ui->newAcft->setText(db::RetreiveRegistration(flight[8]));
|
|
|
+}
|
|
|
+
|
|
|
+void NewFlight::storeSettings()
|
|
|
+{
|
|
|
+ qDebug() << "Storing Settings...";
|
|
|
+ db::storesetting(100, ui->FunctionComboBox->currentText());
|
|
|
+ db::storesetting(101, ui->ApproachComboBox->currentText());
|
|
|
+ db::storesetting(102, QString::number(ui->PilotFlyingCheckBox->isChecked()));
|
|
|
+ db::storesetting(103, QString::number(ui->PilotMonitoringCheckBox->isChecked()));
|
|
|
+ db::storesetting(104, QString::number(ui->TakeoffSpinBox->value()));
|
|
|
+ db::storesetting(105, QString::number(ui->TakeoffCheckBox->isChecked()));
|
|
|
+ db::storesetting(106, QString::number(ui->LandingSpinBox->value()));
|
|
|
+ db::storesetting(107, QString::number(ui->LandingCheckBox->isChecked()));
|
|
|
+ db::storesetting(108, QString::number(ui->AutolandSpinBox->value()));
|
|
|
+ db::storesetting(109, QString::number(ui->AutolandCheckBox->isChecked()));
|
|
|
+ db::storesetting(110, QString::number(ui->IfrCheckBox->isChecked()));
|
|
|
+ db::storesetting(111, QString::number(ui->VfrCheckBox->isChecked()));
|
|
|
+ db::storesetting(112, QString::number(ui->autoNightCheckBox->isChecked()));
|
|
|
+}
|
|
|
+void NewFlight::restoreSettings()
|
|
|
+{
|
|
|
+ qDebug() << "Restoring Settings...";
|
|
|
+ ui->FunctionComboBox->setCurrentText(db::retreiveSetting("100")[1]);
|
|
|
+ ui->ApproachComboBox->setCurrentText(db::retreiveSetting("101")[1]);
|
|
|
+ ui->PilotFlyingCheckBox->setChecked(db::retreiveSetting("102")[1].toInt());
|
|
|
+ ui->PilotMonitoringCheckBox->setChecked(db::retreiveSetting("103")[1].toInt());
|
|
|
+ ui->TakeoffSpinBox->setValue(db::retreiveSetting("104")[1].toInt());
|
|
|
+ ui->TakeoffCheckBox->setChecked(db::retreiveSetting("105")[1].toInt());
|
|
|
+ ui->LandingSpinBox->setValue(db::retreiveSetting("106")[1].toInt());
|
|
|
+ ui->LandingCheckBox->setChecked(db::retreiveSetting("107")[1].toInt());
|
|
|
+ ui->AutolandSpinBox->setValue(db::retreiveSetting("108")[1].toInt());
|
|
|
+ ui->AutolandCheckBox->setChecked(db::retreiveSetting("109")[1].toInt());
|
|
|
+ ui->IfrCheckBox->setChecked(db::retreiveSetting("110")[1].toInt());
|
|
|
+ ui->VfrCheckBox->setChecked(db::retreiveSetting("111")[1].toInt());
|
|
|
+ ui->autoNightCheckBox->setChecked(db::retreiveSetting("112")[1].toInt());
|
|
|
+ //qDebug() << "restore Settings ifr to int: " << db::retreiveSetting("110")[1].toInt();
|
|
|
+
|
|
|
+/*
|
|
|
+ *
|
|
|
+ * QString PilotFunction;
|
|
|
+QString PilotTask;
|
|
|
+QString TakeOff;
|
|
|
+QString Landing;
|
|
|
+QString Autoland;
|
|
|
+QString ApproachType;
|
|
|
+100 PIC NewFlight::FunctionComboBox
|
|
|
+101 ILS CAT I NewFlight::ApproachComboBox
|
|
|
+102 Qt::Checked NewFlight::PilotFlyingCheckBox
|
|
|
+103 Qt::Unchecked NewFlight::PilotMonitoringCheckBox
|
|
|
+104 1 NewFlight::TakeoffSpinBox
|
|
|
+105 Qt::Checked NewFlight::TakeoffCheckBox
|
|
|
+106 1 NewFlight::LandingSpinBox
|
|
|
+107 Qt::Checked NewFlight::LandingCheckBox
|
|
|
+108 0 NewFlight::AutolandSpinBox
|
|
|
+109 Qt::Unchecked NewFlight::AutolandCheckBox
|
|
|
+110 Qt::Checked NewFlight::IfrCheckBox
|
|
|
+111 Qt::Unchecked NewFlight::VfrCheckBox
|
|
|
+*/
|
|
|
+}
|
|
|
+/*
|
|
|
+ * Slots
|
|
|
+ */
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+void NewFlight::on_deptTZ_currentTextChanged(const QString &arg1)
|
|
|
+{
|
|
|
+ if(arg1 == "Local"){nope();}
|
|
|
+ ui->deptTZ->setCurrentIndex(0);
|
|
|
+}
|
|
|
+
|
|
|
+void NewFlight::on_destTZ_currentIndexChanged(const QString &arg1)
|
|
|
+{
|
|
|
+ if(arg1 == "Local"){nope();}
|
|
|
+ ui->destTZ->setCurrentIndex(0);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+void NewFlight::on_newDept_textEdited(const QString &arg1)
|
|
|
+{
|
|
|
+ ui->newDept->setText(arg1.toUpper());
|
|
|
+ if(arg1.length()>2)
|
|
|
+ {
|
|
|
+ QStringList deptList = db::CompleteIcaoOrIata(arg1);
|
|
|
+ qDebug() << "deptList = " << deptList;
|
|
|
+ QCompleter *deptCompleter = new QCompleter(deptList, this);
|
|
|
+ deptCompleter->setCaseSensitivity(Qt::CaseInsensitive);
|
|
|
+ deptCompleter->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
|
|
|
+ ui->newDept->setCompleter(deptCompleter);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void NewFlight::on_newDept_editingFinished()
|
|
|
+{
|
|
|
+ if(ui->newDept->text().length()<3)
|
|
|
+ {
|
|
|
+ QMessageBox msgBox(this);
|
|
|
+ msgBox.setText("Please enter a 3- or 4-letter code.");
|
|
|
+ msgBox.exec();
|
|
|
+ ui->newDept->setText("");
|
|
|
+ ui->newDept->setFocus();
|
|
|
+ }
|
|
|
+
|
|
|
+ QStringList deptList;
|
|
|
+
|
|
|
+ if(ui->newDept->text().length()>1)
|
|
|
+ {
|
|
|
+ QStringList deptList = db::CompleteIcaoOrIata(ui->newDept->text());
|
|
|
+ if(deptList.length() != 0)
|
|
|
+ {
|
|
|
+ dept = deptList.first();
|
|
|
+ ui->newDept->setText(dept);
|
|
|
+
|
|
|
+ }else
|
|
|
+ {
|
|
|
+ QMessageBox msgBox(this);
|
|
|
+ msgBox.setText("No Airport with that name found.");
|
|
|
+ msgBox.exec();
|
|
|
+ ui->newDept->setText("");
|
|
|
+ ui->newDept->setFocus();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+void NewFlight::on_newDest_textEdited(const QString &arg1)
|
|
|
+{
|
|
|
+ ui->newDest->setText(arg1.toUpper());
|
|
|
+ if(arg1.length()>2)
|
|
|
+ {
|
|
|
+ QStringList destList = db::CompleteIcaoOrIata(arg1);
|
|
|
+ QCompleter *destCompleter = new QCompleter(destList, this);
|
|
|
+ destCompleter->setCaseSensitivity(Qt::CaseInsensitive);
|
|
|
+ destCompleter->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
|
|
|
+ ui->newDest->setCompleter(destCompleter);
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+void NewFlight::on_newDest_editingFinished()
|
|
|
+{
|
|
|
+ if(ui->newDest->text().length()<3)
|
|
|
+ {
|
|
|
+ QMessageBox msgBox(this);
|
|
|
+ msgBox.setText("Please enter a 3- or 4-letter code.");
|
|
|
+ msgBox.exec();
|
|
|
+ ui->newDest->setText("");
|
|
|
+ ui->newDest->setFocus();
|
|
|
+ }
|
|
|
+ QStringList destList;
|
|
|
+ if(ui->newDest->text().length()>1)
|
|
|
+ {
|
|
|
+ QStringList destList = db::CompleteIcaoOrIata(ui->newDest->text());
|
|
|
+ if(destList.length() != 0)
|
|
|
+ {
|
|
|
+ dest = destList.first();
|
|
|
+ ui->newDest->setText(dest);
|
|
|
+ }else
|
|
|
+ {
|
|
|
+ QMessageBox msgBox(this);
|
|
|
+ msgBox.setText("No Airport with that name found.");
|
|
|
+ msgBox.exec();
|
|
|
+ ui->newDest->setText("");
|
|
|
+ ui->newDest->setFocus();
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+void NewFlight::on_newDoft_editingFinished()
|
|
|
+{
|
|
|
+ date = ui->newDoft->date();
|
|
|
+ doft = date.toString(Qt::ISODate);
|
|
|
+}
|
|
|
+
|
|
|
+void NewFlight::on_newTofb_editingFinished()
|
|
|
+{
|
|
|
+ ui->newTofb->setText(validateTimeInput(ui->newTofb->text()));
|
|
|
+ tofb = QTime::fromString(ui->newTofb->text(),"hh:mm");
|
|
|
+ qDebug() << "New Time Off Blocks: " << tofb;
|
|
|
+}
|
|
|
+
|
|
|
+void NewFlight::on_newTonb_editingFinished()
|
|
|
+{
|
|
|
+ ui->newTonb->setText(validateTimeInput(ui->newTonb->text()));
|
|
|
+ tonb = QTime::fromString(ui->newTonb->text(),"hh:mm");
|
|
|
+ qDebug() << "New Time On Blocks: " << tonb;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+void NewFlight::on_newAcft_textEdited(const QString &arg1)
|
|
|
+{
|
|
|
+ if(arg1.length()>1)
|
|
|
+ {
|
|
|
+ QStringList acftList = db::newAcftGetString(arg1);
|
|
|
+ QCompleter *acftCompleter = new QCompleter(acftList, this);
|
|
|
+ acftCompleter->setCaseSensitivity(Qt::CaseInsensitive);
|
|
|
+ acftCompleter->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
|
|
|
+ ui->newAcft->setCompleter(acftCompleter);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void NewFlight::on_newAcft_editingFinished()
|
|
|
+{
|
|
|
+ acft = "-1";// set invalid
|
|
|
+
|
|
|
+ if(ui->newAcft->text().contains(" "))// is input from QCompleter
|
|
|
+ {
|
|
|
+ QStringList input = ui->newAcft->text().split(" ");
|
|
|
+ QString registration = input[0].trimmed();
|
|
|
+ QStringList result = db::newAcftGetString(registration);
|
|
|
+ if(result.length() > 0)
|
|
|
+ {
|
|
|
+ ui->newAcft->setText(result[0]);
|
|
|
+ acft = db::newAcftGetId(registration);
|
|
|
+ }else
|
|
|
+ {
|
|
|
+ acft = "-1";
|
|
|
+ }
|
|
|
+ }else // is input from user
|
|
|
+ {
|
|
|
+ QString input = ui->newAcft->text();
|
|
|
+ QStringList result = db::newAcftGetString(input);
|
|
|
+ if(result.length() > 0)
|
|
|
+ {
|
|
|
+ ui->newAcft->setText(result[0]);
|
|
|
+
|
|
|
+ QStringList input = ui->newAcft->text().split(" ");
|
|
|
+ QString registration = input[0].trimmed();
|
|
|
+ acft = db::newAcftGetId(registration);
|
|
|
+ }else
|
|
|
+ {
|
|
|
+ acft = "-1";
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if(acft == "-1")
|
|
|
+ {
|
|
|
+ QMessageBox::StandardButton reply;
|
|
|
+ reply = QMessageBox::question(this, "No aircraft found", "No aircraft found.\n Would you like to add a new aircraft to the database?",
|
|
|
+ QMessageBox::Yes|QMessageBox::No);
|
|
|
+ if (reply == QMessageBox::Yes) {
|
|
|
+ NewAcft na(this);
|
|
|
+ na.exec();
|
|
|
+ ui->newAcft->setText("");
|
|
|
+ ui->newAcft->setFocus();
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ qDebug() << "Editing finished. Acft: " << acft;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+void NewFlight::on_newPic_textEdited(const QString &arg1)
|
|
|
+{
|
|
|
+ if(arg1.length()>2)
|
|
|
+ {
|
|
|
+ QStringList picList = db::newPicGetString(arg1);
|
|
|
+ QCompleter *picCompleter = new QCompleter(picList, this);
|
|
|
+ picCompleter->setCaseSensitivity(Qt::CaseInsensitive);
|
|
|
+ picCompleter->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
|
|
|
+ ui->newPic->setCompleter(picCompleter);
|
|
|
+ }
|
|
|
+}
|
|
|
+void NewFlight::on_newPic_editingFinished()
|
|
|
+{
|
|
|
+ pic = "-1"; // set invalid
|
|
|
+ if(ui->newPic->text() == "self")
|
|
|
+ {
|
|
|
+ pic = "1";
|
|
|
+ }else
|
|
|
+ {
|
|
|
+ QString picname;
|
|
|
+ QStringList picList = db::newPicGetString(ui->newPic->text());
|
|
|
+ qDebug() << picList;
|
|
|
+ if(picList.length()!= 0)
|
|
|
+ {
|
|
|
+ picname = picList[0];
|
|
|
+ ui->newPic->setText(picname);
|
|
|
+ pic = db::newPicGetId(picname);
|
|
|
+ }else
|
|
|
+ {
|
|
|
+ QMessageBox::StandardButton reply;
|
|
|
+ reply = QMessageBox::question(this, "No Pilot found", "No pilot found.\n Would you like to add a new pilot to the database?",
|
|
|
+ QMessageBox::Yes|QMessageBox::No);
|
|
|
+ if (reply == QMessageBox::Yes)
|
|
|
+ {
|
|
|
+ qDebug() << "Add new pilot selected";
|
|
|
+ nope();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+/*
|
|
|
+ * Extras
|
|
|
+ */
|
|
|
+
|
|
|
+void NewFlight::on_PilotFlyingCheckBox_stateChanged(int)//0, unchecked, 2 checked
|
|
|
+{
|
|
|
+ if(ui->PilotFlyingCheckBox->isChecked()){
|
|
|
+ ui->TakeoffSpinBox->setValue(1);
|
|
|
+ ui->TakeoffCheckBox->setCheckState(Qt::Checked);
|
|
|
+ ui->LandingSpinBox->setValue(1);
|
|
|
+ ui->LandingCheckBox->setCheckState(Qt::Checked);
|
|
|
+
|
|
|
+ }else if(!ui->PilotFlyingCheckBox->isChecked()){
|
|
|
+ ui->TakeoffSpinBox->setValue(0);
|
|
|
+ ui->TakeoffCheckBox->setCheckState(Qt::Unchecked);
|
|
|
+ ui->LandingSpinBox->setValue(0);
|
|
|
+ ui->LandingCheckBox->setCheckState(Qt::Unchecked);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+void NewFlight::on_setAsDefaultButton_clicked()
|
|
|
+{
|
|
|
+ storeSettings();
|
|
|
+}
|
|
|
+
|
|
|
+void NewFlight::on_restoreDefaultButton_clicked()
|
|
|
+{
|
|
|
+ restoreSettings();
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+void NewFlight::on_buttonBox_accepted()
|
|
|
+{
|
|
|
+ on_newDoft_editingFinished();// - activate slots in case user has been active in last input before clicking submit
|
|
|
+ on_newTonb_editingFinished();
|
|
|
+ on_newTofb_editingFinished();
|
|
|
+ on_newDept_editingFinished();
|
|
|
+ on_newDest_editingFinished();
|
|
|
+ on_newAcft_editingFinished();
|
|
|
+ on_newPic_editingFinished();
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ QVector<QString> flight;
|
|
|
+ flight = collectInput();
|
|
|
+ if(verifyInput())
|
|
|
+ {
|
|
|
+ db::CommitFlight(flight);
|
|
|
+ qDebug() << flight << "Has been commited.";
|
|
|
+ QMessageBox msgBox(this);
|
|
|
+ msgBox.setText("Flight has been commited.");
|
|
|
+ msgBox.exec();
|
|
|
+ }else
|
|
|
+ {
|
|
|
+ qDebug() << "Invalid Input. No entry has been made in the database.";
|
|
|
+ db::CommitToScratchpad(flight);
|
|
|
+ QMessageBox msgBox(this);
|
|
|
+ msgBox.setText("Invalid entries detected. Please check your input.");
|
|
|
+ msgBox.exec();
|
|
|
+ NewFlight nf(this);
|
|
|
+ nf.exec();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+void NewFlight::on_buttonBox_rejected()
|
|
|
+{
|
|
|
+ qDebug() << "NewFlight: Rejected\n";
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+void NewFlight::on_ApproachComboBox_currentTextChanged(const QString &arg1)
|
|
|
+{
|
|
|
+ if(arg1 == "ILS CAT III"){
|
|
|
+ ui->AutolandCheckBox->setCheckState(Qt::Checked);
|
|
|
+ ui->AutolandSpinBox->setValue(1);
|
|
|
+ }else{
|
|
|
+ ui->AutolandCheckBox->setCheckState(Qt::Unchecked);
|
|
|
+ ui->AutolandSpinBox->setValue(0);
|
|
|
+ }
|
|
|
+ ApproachType = arg1;
|
|
|
+ qDebug() << "Approach Type: " << ApproachType;
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Times
|
|
|
+ */
|
|
|
+
|
|
|
+
|
|
|
+void NewFlight::on_nightTimeLineEdit_editingFinished()
|
|
|
+{
|
|
|
+ ui->nightTimeLineEdit->setText(validateTimeInput(ui->nightTimeLineEdit->text()));
|
|
|
+}
|