12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124 |
- /*
- *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 "dbman.cpp"
- #define DEBUG(expr) \
- qDebug() << "~DEBUG" << __func__ << expr
- /*
- * Debug / WIP
- */
- void NewFlight::on_verifyButton_clicked()//debug
- {
- /*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();
- }
- void NewFlight::on_tabWidget_tabBarClicked(int index)
- {
- if(index == 1){
- nope();
- }
- }
- /// Raw Input validation
- const QString TIME_REGEX_PATTERN = "([01]?[0-9]?|2[0-3]):?[0-5][0-9]?";// We only want to allow inputs that make sense as a time, e.g. 99:99 is not a valid time
- const QString IATA = "[\\w]{3}";
- const QString ICAO = "[\\w0-9]{4}";
- const QString LOC_REGEX_PATTERN = IATA + "|" + ICAO;
- const QString AIRCRAFT_REGEX_PATTERN = "([\\w0-9]+-)?[\\w0-9]+";
- const QString PILOT_NAME_REGEX_PATTERN = "[\\w]+ [\\w]+";
- /// Invalid characters (validators keep text even if it returns Invalid, see `onInputRejected` below)
- const QString TIME_INVALID_RGX = "[^\\d:]";
- const QString LOC_INVALID_RGX = "[^\\w0-9]";
- const QString AIRCRAFT_INVALID_RGX = "[^A-Z0-9\\-]";
- const QString PILOT_NAME_INVALID_RGX = "[^a-zA-Z ]";
- /// Input max lengths
- const qint8 TIME_MAX_LENGTH = 5; //to allow for ':' e.g. "08:45"
- const qint8 LOC_MAX_LENGTH = 4;
- const qint8 AIRCRAFT_MAX_LENGTH = 10;
- const qint8 PILOT_NAME_MAX_LENGTH = 15;
- /// Initialising variables used for storing user input
- QVector<QString> flight;
- 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;
- // extras
- QString secondPilot;
- QString thirdPilot;
- QString pilotFunction;
- QString pilotTask;
- QString takeoff;
- QString landing;
- QString autoland;
- QString approachType;
- bool hasOldInput = dbFlight::checkScratchpad();
- /*!
- * \brief setLineEditValidator set Validators for QLineEdits that end with Time, Loc,
- * Aircraft or Name
- */
- static inline void setLineEditValidator(QLineEdit* line_edit)
- {
- auto line_edit_objectName = line_edit->objectName();
- DEBUG("Setting validators for " << line_edit_objectName);
- static const
- QVector<QPair<QRegularExpression, QRegularExpression>> objectName_inputValidation_regexes = {
- {QRegularExpression("\\w+Time"), QRegularExpression(TIME_REGEX_PATTERN)},
- {QRegularExpression("\\w+Loc"), QRegularExpression(LOC_REGEX_PATTERN)},
- {QRegularExpression("\\w+Aircraft"), QRegularExpression(AIRCRAFT_REGEX_PATTERN)},
- {QRegularExpression("\\w+Name"), QRegularExpression(PILOT_NAME_REGEX_PATTERN)},
- };
- auto validator = new StrictRegularExpressionValidator();
- for(auto pair : objectName_inputValidation_regexes)
- {
- if(pair.first.match(line_edit_objectName).hasMatch()) {
- validator->setRegularExpression(pair.second);
- line_edit->setValidator(validator);
- return;
- }
- }
- DEBUG("Couldnt find QLineEdit" << line_edit_objectName);
- }
- /*!
- * \brief setLineEditMaxLength set Max Length for QLineEdits that end with Time, Loc,
- * Aircraft or Name
- */
- static inline void setLineEditMaxLength(QLineEdit* line_edit)
- {
- auto line_edit_objectName = line_edit->objectName();
- DEBUG("Setting Max Length for " << line_edit_objectName);
- static const
- QVector<QPair<QRegularExpression, int>> objectName_inputValidation_regexes = {
- {QRegularExpression("\\w+TimeLineEdit"), TIME_MAX_LENGTH},
- {QRegularExpression("\\w+LocLineEdit"), LOC_MAX_LENGTH},
- {QRegularExpression("\\w+AircraftLineEdit"), AIRCRAFT_MAX_LENGTH},
- {QRegularExpression("\\w+NameLineEdit"), PILOT_NAME_MAX_LENGTH},
- };
- for(auto pair : objectName_inputValidation_regexes)
- {
- if(pair.first.match(line_edit_objectName).hasMatch())
- {
- line_edit->setMaxLength(pair.second);
- return;
- }
- }
- DEBUG("Couldnt find QLineEdit" << line_edit_objectName);
- }
- /*
- * Window
- */
- NewFlight::NewFlight(QWidget *parent) :
- QDialog(parent),
- ui(new Ui::NewFlight)
- {
- ui->setupUi(this);
- ui->newDoft->setDate(QDate::currentDate());
- qDebug() << "Hasoldinput? = " << hasOldInput;
- if(hasOldInput) // Re-populate the Form
- {
- flight = dbFlight::retreiveScratchpad();
- qDebug() << "Re-Filling Form from Scratchpad";
- returnInput(flight);
- }
- for(auto line_edits = ui->flightDataTab->findChildren<QLineEdit*>();
- auto line_edit : line_edits)
- {
- setLineEditValidator(line_edit);
- setLineEditMaxLength(line_edit);
- }
- for(auto line_edits = ui->extraTimes->findChildren<QLineEdit*>();
- auto line_edit : line_edits)
- {
- setLineEditValidator(line_edit);
- setLineEditMaxLength(line_edit);
- }
- // 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);
- // Visually mark mandatory fields
- ui->newDeptLocLineEdit->setStyleSheet("border: 1px solid orange");
- ui->newDestLocLineEdit->setStyleSheet("border: 1px solid orange");
- ui->newDeptTimeLineEdit->setStyleSheet("border: 1px solid orange");
- ui->newDestTimeLineEdit->setStyleSheet("border: 1px solid orange");
- ui->newPic->setStyleSheet("border: 1px solid orange");
- ui->newAcft->setStyleSheet("border: 1px solid orange");
- ui->newDeptLocLineEdit->setFocus();
- }
- NewFlight::~NewFlight()
- {
- delete ui;
- }
- /*
- * Functions
- */
- /// Input Validation
- /*!
- * \brief onInputRejected Set `line_edit`'s border to red and check if `rgx` matches
- * in order to keep text on line.
- */
- static void onInputRejected(QLineEdit* line_edit, QRegularExpression rgx){
- DEBUG("Input rejected" << line_edit->text());
- line_edit->setStyleSheet("border: 1px solid red");
- if(auto text = line_edit->text();
- rgx.match(text).hasMatch() == false)
- {
- line_edit->setText(line_edit->text());
- }
- }
- /*!
- * \brief onEditingFinished signal is emitted if input passed raw validation
- */
- static void onEditingFinished(QLineEdit* line_edit){
- DEBUG("Input accepted" << line_edit->text() << line_edit->metaObject()->className());
- line_edit->setStyleSheet("");
- }
- /*!
- * \brief NewFlight::nope for features that are not yet implemented
- */
- void NewFlight::nope()
- {
- QMessageBox nope(this); //error box
- nope.setText("This feature is not yet available!");
- nope.exec();
- }
- /*!
- * \brief NewFlight::fillExtrasLineEdits Fills the flight time line edits according to ui selections
- */
- void NewFlight::fillExtrasLineEdits()
- {
- QString blockTime = calc::blocktime(tofb,tonb).toString("hh:mm");
- // SP SE
- // SP ME
- // MP
- // TOTAL
- ui->totalTimeLineEdit->setText(blockTime);
- // IFR
- // VFR
- // Night
- QString deptDate = date.toString(Qt::ISODate) + 'T' + tofb.toString("hh:mm");
- QDateTime deptDateTime = QDateTime::fromString(deptDate,"yyyy-MM-ddThh:mm");
- int blocktime = calc::time_to_minutes(calc::blocktime(tofb,tonb));
- qDebug() << "Blocktime: " << blocktime;
- QString nightTime = calc::minutes_to_string(QString::number(calc::calculateNightTime(dept, dest, deptDateTime, blocktime)));
- ui->nightTimeLineEdit->setText(nightTime);
- // XC - Cross-country flight, if more than 50nm long
- if(calc::greatCircleDistanceBetweenAirports(dept,dest) >= 50){
- qDebug() << "Cross-country Flight: nm = " << calc::greatCircleDistanceBetweenAirports(dept,dest);
- ui->xcTimeLineEdit->setText(blockTime);
- }else{
- ui->xcTimeLineEdit->setText("00:00");
- }
- // 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 = dbFlight::createFlightVectorFromInput(doft, dept, tofb, dest, tonb, tblk, pic, acft);
- qDebug() << "Created flight vector:" << flight;
- return flight;
- }
- /*!
- * \brief NewFlight::verifyInput checks if input exists in database.
- * \return
- */
- bool NewFlight::verifyInput()
- {
- 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 = dbAirport::checkICAOValid(dept);
- qDebug() << "NewFlight::verifyInput() says: Departure is:\t" << dept << " - Valid?\t" << deptValid;
- destValid = dbAirport::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.";
- 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
- qDebug() << "return Input: " << flight;
- ui->newDoft->setDate(QDate::fromString(flight[1],Qt::ISODate));
- ui->newDeptLocLineEdit->setText(flight[2]);
- ui->newDeptTimeLineEdit->setText(flight[3]);
- ui->newDestLocLineEdit->setText(flight[4]);
- ui->newDestTimeLineEdit->setText(flight[5]);
- // flight[6] is blocktime
- ui->newPic->setText(dbPilots::retreivePilotNameFromID(flight[7]));
- ui->newAcft->setText(dbAircraft::retreiveRegistration(flight[8]));
- }
- void NewFlight::storeSettings()
- {
- qDebug() << "Storing Settings...";
- dbSettings::storeSetting(100, ui->FunctionComboBox->currentText());
- dbSettings::storeSetting(101, ui->ApproachComboBox->currentText());
- dbSettings::storeSetting(102, QString::number(ui->PilotFlyingCheckBox->isChecked()));
- dbSettings::storeSetting(103, QString::number(ui->PilotMonitoringCheckBox->isChecked()));
- dbSettings::storeSetting(104, QString::number(ui->TakeoffSpinBox->value()));
- dbSettings::storeSetting(105, QString::number(ui->TakeoffCheckBox->isChecked()));
- dbSettings::storeSetting(106, QString::number(ui->LandingSpinBox->value()));
- dbSettings::storeSetting(107, QString::number(ui->LandingCheckBox->isChecked()));
- dbSettings::storeSetting(108, QString::number(ui->AutolandSpinBox->value()));
- dbSettings::storeSetting(109, QString::number(ui->AutolandCheckBox->isChecked()));
- dbSettings::storeSetting(110, QString::number(ui->IfrCheckBox->isChecked()));
- dbSettings::storeSetting(111, QString::number(ui->VfrCheckBox->isChecked()));
- //dbSettings::storesetting(112, QString::number(ui->autoNightCheckBox->isChecked()));
- }
- void NewFlight::restoreSettings()
- {
- qDebug() << "Restoring Settings...";//crashes if db is empty due to QVector index out of range.
- ui->FunctionComboBox->setCurrentText(dbSettings::retreiveSetting(100));
- ui->ApproachComboBox->setCurrentText(dbSettings::retreiveSetting(101));
- ui->PilotFlyingCheckBox->setChecked(dbSettings::retreiveSetting(102).toInt());
- ui->PilotMonitoringCheckBox->setChecked(dbSettings::retreiveSetting(103).toInt());
- ui->TakeoffSpinBox->setValue(dbSettings::retreiveSetting(104).toInt());
- ui->TakeoffCheckBox->setChecked(dbSettings::retreiveSetting(105).toInt());
- ui->LandingSpinBox->setValue(dbSettings::retreiveSetting(106).toInt());
- ui->LandingCheckBox->setChecked(dbSettings::retreiveSetting(107).toInt());
- ui->AutolandSpinBox->setValue(dbSettings::retreiveSetting(108).toInt());
- ui->AutolandCheckBox->setChecked(dbSettings::retreiveSetting(109).toInt());
- ui->IfrCheckBox->setChecked(dbSettings::retreiveSetting(110).toInt());
- ui->VfrCheckBox->setChecked(dbSettings::retreiveSetting(111).toInt());
- ui->flightNumberPrefixLabel->setText(dbSettings::retreiveSetting(50) + QLatin1Char('-'));
- }
- /*
- * 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);
- }
- /// newDeptLocLineEdit
- void NewFlight::on_newDeptLocLineEdit_inputRejected()
- {
- onInputRejected(ui->newDeptLocLineEdit, QRegularExpression(LOC_INVALID_RGX));
- }
- void NewFlight::on_newDeptLocLineEdit_textEdited(const QString &arg1)
- {
- ui->newDeptLocLineEdit->setText(arg1.toUpper());
- if(arg1.length()>2)
- {
- QStringList deptList = dbAirport::completeIcaoOrIata(arg1);
- qDebug() << "deptList = " << deptList;
- QCompleter *deptCompleter = new QCompleter(deptList, this);
- deptCompleter->setCaseSensitivity(Qt::CaseInsensitive);
- deptCompleter->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
- ui->newDeptLocLineEdit->setCompleter(deptCompleter);
- }
- }
- void NewFlight::on_newDeptLocLineEdit_editingFinished()
- {
- QStringList deptList;
- if(ui->newDeptLocLineEdit->text().length()>1)
- {
- auto line_edit = ui->newDeptLocLineEdit;
- onEditingFinished(line_edit);
- QStringList deptList = dbAirport::completeIcaoOrIata(line_edit->text());
- if(deptList.length() != 0) {//exists in database
- dept = deptList.first();
- line_edit->setText(dept);
- }else{
- qWarning() << "Departure Location not in database. ";
- emit onInputRejected(line_edit, QRegularExpression(LOC_INVALID_RGX));
- }
- }
- }
- /// newDeptLocLineEdit
- void NewFlight::on_newDestLocLineEdit_inputRejected()
- {
- onInputRejected(ui->newDestLocLineEdit, QRegularExpression(LOC_INVALID_RGX));
- }
- void NewFlight::on_newDestLocLineEdit_textEdited(const QString &arg1)
- {
- ui->newDestLocLineEdit->setText(arg1.toUpper());
- if(arg1.length()>2)
- {
- QStringList destList = dbAirport::completeIcaoOrIata(arg1);
- QCompleter *destCompleter = new QCompleter(destList, this);
- destCompleter->setCaseSensitivity(Qt::CaseInsensitive);
- destCompleter->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
- ui->newDestLocLineEdit->setCompleter(destCompleter);
- }
- }
- void NewFlight::on_newDestLocLineEdit_editingFinished()
- {
- QStringList destList;
- if(ui->newDestLocLineEdit->text().length()>1)
- {
- auto line_edit = ui->newDestLocLineEdit;
- onEditingFinished(line_edit);
- QStringList destList = dbAirport::completeIcaoOrIata(line_edit->text());
- if(destList.length() != 0) {
- dept = destList.first();
- ui->newDestLocLineEdit->setText(dept);
- }else{
- qWarning() << "Destination location not in database. ";
- emit onInputRejected(line_edit, QRegularExpression(LOC_INVALID_RGX));
- }
- }
- }
- /*
- void NewFlight::on_newDept_textEdited(const QString &arg1)
- {
- ui->newDept->setText(arg1.toUpper());
- if(arg1.length()>2)
- {
- QStringList deptList = dbAirport::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 = dbAirport::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 = dbAirport::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 = dbAirport::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);
- }
- /// newDeptTimeLineEdit
- void NewFlight::on_newDeptTimeLineEdit_inputRejected()
- {
- onInputRejected(ui->newDeptTimeLineEdit, QRegularExpression(TIME_INVALID_RGX));
- }
- void NewFlight::on_newDeptTimeLineEdit_editingFinished()
- {
- ui->newDeptTimeLineEdit->setText(calc::formatTimeInput(ui->newDeptTimeLineEdit->text()));
- tofb = QTime::fromString(ui->newDeptTimeLineEdit->text(),"hh:mm");
- auto line_edit = ui->newDeptTimeLineEdit;
- onEditingFinished(line_edit);
- if(tofb.isValid()){
- // continue
- DEBUG("Time Off Blocks is valid:" << tofb);
- }else{
- emit line_edit->inputRejected();
- }
- }
- /// newDestTimeLineEdit
- void NewFlight::on_newDestTimeLineEdit_inputRejected()
- {
- onInputRejected(ui->newDestTimeLineEdit, QRegularExpression(TIME_INVALID_RGX));
- }
- void NewFlight::on_newDestTimeLineEdit_editingFinished()
- {
- ui->newDestTimeLineEdit->setText(calc::formatTimeInput(ui->newDestTimeLineEdit->text()));
- tonb = QTime::fromString(ui->newDestTimeLineEdit->text(),"hh:mm");
- auto line_edit = ui->newDestTimeLineEdit;
- onEditingFinished(line_edit);
- if(tonb.isValid()){
- // continue
- DEBUG("Time On Blocks is valid:" << tonb);
- }else{
- emit line_edit->inputRejected();
- }
- }
- void NewFlight::on_newAcft_textEdited(const QString &arg1)
- {
- if(arg1.length()>1)
- {
- QStringList acftList = dbAircraft::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 = dbAircraft::newAcftGetString(registration);
- if(result.length() > 0)
- {
- ui->newAcft->setText(result[0]);
- acft = dbAircraft::newAcftGetId(registration);
- }else
- {
- acft = "-1";
- }
- }else // is input from user
- {
- QString input = ui->newAcft->text();
- QStringList result = dbAircraft::newAcftGetString(input);
- if(result.length() > 0)
- {
- ui->newAcft->setText(result[0]);
- QStringList input = ui->newAcft->text().split(" ");
- QString registration = input[0].trimmed();
- acft = dbAircraft::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 = dbPilots::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 = dbPilots::newPicGetString(ui->newPic->text());
- qDebug() << picList;
- if(picList.length()!= 0)
- {
- picname = picList[0];
- ui->newPic->setText(picname);
- pic = dbPilots::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();
- }
- }
- }
- }
- void NewFlight::on_secondPilotLineEdit_textEdited(const QString &arg1)
- {
- if(arg1.length()>2)
- {
- QStringList picList = dbPilots::newPicGetString(arg1);
- QCompleter *picCompleter = new QCompleter(picList, this);
- picCompleter->setCaseSensitivity(Qt::CaseInsensitive);
- picCompleter->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
- ui->secondPilotLineEdit->setCompleter(picCompleter);
- }
- }
- void NewFlight::on_secondPilotLineEdit_editingFinished()
- {
- secondPilot = "-1"; // set invalid
- if(ui->secondPilotLineEdit->text() == "self")
- {
- secondPilot = "1";
- }else
- {
- QString picname;
- QStringList picList = dbPilots::newPicGetString(ui->secondPilotLineEdit->text());
- qDebug() << picList;
- if(picList.length()!= 0)
- {
- picname = picList[0];
- ui->secondPilotLineEdit->setText(picname);
- secondPilot = dbPilots::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();
- }
- }
- }
- }
- void NewFlight::on_thirdPilotLineEdit_textEdited(const QString &arg1)
- {
- if(arg1.length()>2)
- {
- QStringList picList = dbPilots::newPicGetString(arg1);
- QCompleter *picCompleter = new QCompleter(picList, this);
- picCompleter->setCaseSensitivity(Qt::CaseInsensitive);
- picCompleter->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
- ui->thirdPilotLineEdit->setCompleter(picCompleter);
- }
- }
- void NewFlight::on_thirdPilotLineEdit_editingFinished()
- {
- thirdPilot = "-1"; // set invalid
- if(ui->thirdPilotLineEdit->text() == "self")
- {
- thirdPilot = "1";
- }else
- {
- QString picname;
- QStringList picList = dbPilots::newPicGetString(ui->thirdPilotLineEdit->text());
- qDebug() << picList;
- if(picList.length()!= 0)
- {
- picname = picList[0];
- ui->thirdPilotLineEdit->setText(picname);
- thirdPilot = dbPilots::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();
- }
- }
- }
- }
- void NewFlight::on_FlightNumberLineEdit_editingFinished()
- {
- qDebug() << "tbd: FlightNumber slot";
- // To Do: Store input in variable, perform some checks
- // Setting for optional Prefix (e.g. LH, LX etc.)
- }
- /*
- * Extras
- */
- void NewFlight::on_PilotFlyingCheckBox_stateChanged(int)
- {
- 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_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;
- }
- /*
- * Extra Times
- */
- void NewFlight::on_spseTimeLineEdit_editingFinished()
- {
- ui->spseTimeLineEdit->setText(calc::formatTimeInput(ui->spseTimeLineEdit->text()));
- if(ui->spseTimeLineEdit->text() == ""){
- ui->spseTimeLineEdit->setStyleSheet("border: 1px solid red");
- ui->spseTimeLineEdit->setFocus();
- }else{
- ui->spseTimeLineEdit->setStyleSheet("");
- }
- }
- void NewFlight::on_spmeTimeLineEdit_editingFinished()
- {
- ui->spmeTimeLineEdit->setText(calc::formatTimeInput(ui->spmeTimeLineEdit->text()));
- if(ui->spmeTimeLineEdit->text() == ""){
- ui->spmeTimeLineEdit->setStyleSheet("border: 1px solid red");
- ui->spmeTimeLineEdit->setFocus();
- }else{
- ui->spmeTimeLineEdit->setStyleSheet("");
- }
- }
- void NewFlight::on_mpTimeLineEdit_editingFinished()
- {
- ui->mpTimeLineEdit->setText(calc::formatTimeInput(ui->mpTimeLineEdit->text()));
- if(ui->mpTimeLineEdit->text() == ""){
- ui->mpTimeLineEdit->setStyleSheet("border: 1px solid red");
- ui->mpTimeLineEdit->setFocus();
- }else{
- ui->mpTimeLineEdit->setStyleSheet("");
- }
- }
- void NewFlight::on_totalTimeLineEdit_editingFinished()
- {
- ui->totalTimeLineEdit->setText(calc::formatTimeInput(ui->totalTimeLineEdit->text()));
- if(ui->totalTimeLineEdit->text() == ""){
- ui->totalTimeLineEdit->setStyleSheet("border: 1px solid red");
- ui->totalTimeLineEdit->setFocus();
- }else{
- ui->totalTimeLineEdit->setStyleSheet("");
- }
- }
- void NewFlight::on_ifrTimeLineEdit_editingFinished()
- {
- ui->ifrTimeLineEdit->setText(calc::formatTimeInput(ui->ifrTimeLineEdit->text()));
- if(ui->ifrTimeLineEdit->text() == ""){
- ui->ifrTimeLineEdit->setStyleSheet("border: 1px solid red");
- ui->ifrTimeLineEdit->setFocus();
- }else{
- ui->ifrTimeLineEdit->setStyleSheet("");
- }
- }
- void NewFlight::on_vfrTimeLineEdit_editingFinished()
- {
- ui->vfrTimeLineEdit->setText(calc::formatTimeInput(ui->vfrTimeLineEdit->text()));
- if(ui->vfrTimeLineEdit->text() == ""){
- ui->vfrTimeLineEdit->setStyleSheet("border: 1px solid red");
- ui->vfrTimeLineEdit->setFocus();
- }else{
- ui->vfrTimeLineEdit->setStyleSheet("");
- }
- }
- void NewFlight::on_nightTimeLineEdit_editingFinished()
- {
- ui->nightTimeLineEdit->setText(calc::formatTimeInput(ui->nightTimeLineEdit->text()));
- if(ui->nightTimeLineEdit->text() == ""){
- ui->nightTimeLineEdit->setStyleSheet("border: 1px solid red");
- ui->nightTimeLineEdit->setFocus();
- }else{
- ui->nightTimeLineEdit->setStyleSheet("");
- }
- }
- void NewFlight::on_xcTimeLineEdit_editingFinished()
- {
- ui->xcTimeLineEdit->setText(calc::formatTimeInput(ui->xcTimeLineEdit->text()));
- if(ui->xcTimeLineEdit->text() == ""){
- ui->xcTimeLineEdit->setStyleSheet("border: 1px solid red");
- ui->xcTimeLineEdit->setFocus();
- }else{
- ui->xcTimeLineEdit->setStyleSheet("");
- }
- }
- void NewFlight::on_picTimeLineEdit_editingFinished()
- {
- ui->picTimeLineEdit->setText(calc::formatTimeInput(ui->picTimeLineEdit->text()));
- if(ui->picTimeLineEdit->text() == ""){
- ui->picTimeLineEdit->setStyleSheet("border: 1px solid red");
- ui->picTimeLineEdit->setFocus();
- }else{
- ui->picTimeLineEdit->setStyleSheet("");
- }
- }
- void NewFlight::on_copTimeLineEdit_editingFinished()
- {
- ui->copTimeLineEdit->setText(calc::formatTimeInput(ui->copTimeLineEdit->text()));
- if(ui->copTimeLineEdit->text() == ""){
- ui->copTimeLineEdit->setStyleSheet("border: 1px solid red");
- ui->copTimeLineEdit->setFocus();
- }else{
- ui->copTimeLineEdit->setStyleSheet("");
- }
- }
- void NewFlight::on_dualTimeLineEdit_editingFinished()
- {
- ui->dualTimeLineEdit->setText(calc::formatTimeInput(ui->dualTimeLineEdit->text()));
- if(ui->dualTimeLineEdit->text() == ""){
- ui->dualTimeLineEdit->setStyleSheet("border: 1px solid red");
- ui->dualTimeLineEdit->setFocus();
- }else{
- ui->dualTimeLineEdit->setStyleSheet("");
- }
- }
- void NewFlight::on_fiTimeLineEdit_editingFinished()
- {
- ui->fiTimeLineEdit->setText(calc::formatTimeInput(ui->fiTimeLineEdit->text()));
- if(ui->fiTimeLineEdit->text() == ""){
- ui->fiTimeLineEdit->setStyleSheet("border: 1px solid red");
- ui->fiTimeLineEdit->setFocus();
- }else{
- ui->fiTimeLineEdit->setStyleSheet("");
- }
- }
- void NewFlight::on_simTimeLineEdit_editingFinished()
- {
- ui->simTimeLineEdit->setText(calc::formatTimeInput(ui->simTimeLineEdit->text()));
- if(ui->simTimeLineEdit->text() == ""){
- ui->simTimeLineEdit->setStyleSheet("border: 1px solid red");
- ui->simTimeLineEdit->setFocus();
- }else{
- ui->simTimeLineEdit->setStyleSheet("");
- }
- }
- /*
- * Control Buttons
- */
- 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())
- {
- dbFlight::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.";
- dbFlight::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";
- }
|