newflight.cpp 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179
  1. /*
  2. *openPilot Log - A FOSS Pilot Logbook Application
  3. *Copyright (C) 2020 Felix Turowsky
  4. *
  5. *This program is free software: you can redistribute it and/or modify
  6. *it under the terms of the GNU General Public License as published by
  7. *the Free Software Foundation, either version 3 of the License, or
  8. *(at your option) any later version.
  9. *
  10. *This program is distributed in the hope that it will be useful,
  11. *but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. *GNU General Public License for more details.
  14. *
  15. *You should have received a copy of the GNU General Public License
  16. *along with this program. If not, see <https://www.gnu.org/licenses/>.
  17. */
  18. #include "newflight.h"
  19. #include "ui_newflight.h"
  20. #include "dbman.cpp"
  21. #define DEBUG(expr) \
  22. qDebug() << "~DEBUG" << __func__ << expr
  23. /*
  24. * Debug / WIP
  25. */
  26. void NewFlight::on_verifyButton_clicked()//debug
  27. {
  28. /*on_newDoft_editingFinished();// - activate slots in case user has been active in last input before clicking submit
  29. on_newTonb_editingFinished();
  30. on_newTofb_editingFinished();
  31. on_newDept_editingFinished();
  32. on_newDest_editingFinished();
  33. on_newAcft_editingFinished();
  34. on_newPic_editingFinished();
  35. verifyInput();*/
  36. fillExtrasLineEdits();
  37. }
  38. void NewFlight::on_tabWidget_tabBarClicked(int index)
  39. {
  40. if(index == 1){
  41. nope();
  42. }
  43. }
  44. /// Raw Input validation
  45. 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
  46. const QString IATA = "[\\w]{3}";
  47. const QString ICAO = "[\\w0-9]{4}";
  48. const QString LOC_REGEX_PATTERN = IATA + "|" + ICAO;
  49. const QString AIRCRAFT_REGEX_PATTERN = "([\\w0-9]+-)?[\\w0-9]+";
  50. const QString PILOT_NAME_REGEX_PATTERN = "[\\w]+ [\\w]+";
  51. /// Invalid characters (validators keep text even if it returns Invalid, see `onInputRejected` below)
  52. const QString TIME_INVALID_RGX = "[^\\d:]";
  53. const QString LOC_INVALID_RGX = "[^\\w0-9]";
  54. const QString AIRCRAFT_INVALID_RGX = "[^A-Z0-9\\-]";
  55. const QString PILOT_NAME_INVALID_RGX = "[^a-zA-Z ]";
  56. /// Input max lengths
  57. const qint8 TIME_MAX_LENGTH = 5; //to allow for ':' e.g. "08:45"
  58. const qint8 LOC_MAX_LENGTH = 4;
  59. const qint8 AIRCRAFT_MAX_LENGTH = 10;
  60. const qint8 PILOT_NAME_MAX_LENGTH = 15;
  61. /// Initialising variables used for storing user input
  62. /// Variables are initalised invalid to later fill them with
  63. /// meaningful inputs once they have been validated
  64. QVector<QString> flight;
  65. QDate date(QDate::currentDate());
  66. QString doft(QDate::currentDate().toString(Qt::ISODate));
  67. QString dept = "INVA";
  68. QString dest = "INVA";
  69. QTime tofb; //QTime is initalised invalid
  70. QTime tonb;
  71. QTime tblk;
  72. QString pic = "-1";
  73. QString acft = "-1";
  74. // extras
  75. QString secondPilot = "-1";
  76. QString thirdPilot = "-1";
  77. QString pilotFunction = "-1";
  78. QString pilotTask = "-1";
  79. QString takeoff = "0";
  80. QString landing = "0";
  81. QString autoland = "0";
  82. QString approachType = "-1";
  83. // extra times
  84. QString tSPSE = "00:00";
  85. QString tSPME = "00:00";
  86. QString tMP = "00:00";
  87. bool hasOldInput = dbFlight::checkScratchpad();
  88. /*!
  89. * \brief setLineEditValidator set Validators for QLineEdits that end with Time, Loc,
  90. * Aircraft or Name
  91. */
  92. static inline void setLineEditValidator(QLineEdit* line_edit)
  93. {
  94. auto line_edit_objectName = line_edit->objectName();
  95. DEBUG("Setting validators for " << line_edit_objectName);
  96. static const
  97. QVector<QPair<QRegularExpression, QRegularExpression>> objectName_inputValidation_regexes = {
  98. {QRegularExpression("\\w+Time"), QRegularExpression(TIME_REGEX_PATTERN)},
  99. {QRegularExpression("\\w+Loc"), QRegularExpression(LOC_REGEX_PATTERN)},
  100. {QRegularExpression("\\w+Aircraft"), QRegularExpression(AIRCRAFT_REGEX_PATTERN)},
  101. {QRegularExpression("\\w+Name"), QRegularExpression(PILOT_NAME_REGEX_PATTERN)},
  102. };
  103. auto validator = new StrictRegularExpressionValidator();
  104. for(auto pair : objectName_inputValidation_regexes)
  105. {
  106. if(pair.first.match(line_edit_objectName).hasMatch()) {
  107. validator->setRegularExpression(pair.second);
  108. line_edit->setValidator(validator);
  109. return;
  110. }
  111. }
  112. DEBUG("Couldnt find QLineEdit" << line_edit_objectName);
  113. }
  114. /*!
  115. * \brief setLineEditMaxLength set Max Length for QLineEdits that end with Time, Loc,
  116. * Aircraft or Name
  117. */
  118. static inline void setLineEditMaxLength(QLineEdit* line_edit)
  119. {
  120. auto line_edit_objectName = line_edit->objectName();
  121. DEBUG("Setting Max Length for " << line_edit_objectName);
  122. static const
  123. QVector<QPair<QRegularExpression, int>> objectName_inputValidation_regexes = {
  124. {QRegularExpression("\\w+TimeLineEdit"), TIME_MAX_LENGTH},
  125. {QRegularExpression("\\w+LocLineEdit"), LOC_MAX_LENGTH},
  126. {QRegularExpression("\\w+AircraftLineEdit"), AIRCRAFT_MAX_LENGTH},
  127. {QRegularExpression("\\w+NameLineEdit"), PILOT_NAME_MAX_LENGTH},
  128. };
  129. for(auto pair : objectName_inputValidation_regexes)
  130. {
  131. if(pair.first.match(line_edit_objectName).hasMatch())
  132. {
  133. line_edit->setMaxLength(pair.second);
  134. return;
  135. }
  136. }
  137. DEBUG("Couldnt find QLineEdit" << line_edit_objectName);
  138. }
  139. /*
  140. * Window
  141. */
  142. NewFlight::NewFlight(QWidget *parent) :
  143. QDialog(parent),
  144. ui(new Ui::NewFlight)
  145. {
  146. ui->setupUi(this);
  147. ui->newDoft->setDate(QDate::currentDate());
  148. qDebug() << "Hasoldinput? = " << hasOldInput;
  149. if(hasOldInput) // Re-populate the Form
  150. {
  151. flight = dbFlight::retreiveScratchpad();
  152. qDebug() << "Re-Filling Form from Scratchpad";
  153. returnInput(flight);
  154. }
  155. for(auto line_edits = ui->flightDataTab->findChildren<QLineEdit*>();
  156. auto line_edit : line_edits)
  157. {
  158. setLineEditValidator(line_edit);
  159. setLineEditMaxLength(line_edit);
  160. }
  161. for(auto line_edits = ui->extraTimes->findChildren<QLineEdit*>();
  162. auto line_edit : line_edits)
  163. {
  164. setLineEditValidator(line_edit);
  165. setLineEditMaxLength(line_edit);
  166. }
  167. // Groups for CheckBoxes
  168. QButtonGroup *FlightRulesGroup = new QButtonGroup(this);
  169. FlightRulesGroup->addButton(ui->IfrCheckBox);
  170. FlightRulesGroup->addButton(ui->VfrCheckBox);
  171. QButtonGroup *PilotTaskGroup = new QButtonGroup(this);
  172. PilotTaskGroup->addButton(ui->PilotFlyingCheckBox);
  173. PilotTaskGroup->addButton(ui->PilotMonitoringCheckBox);
  174. restoreSettings();
  175. ui->deptTZ->setFocusPolicy(Qt::NoFocus);
  176. ui->destTZ->setFocusPolicy(Qt::NoFocus);
  177. // Visually mark mandatory fields
  178. ui->newDeptLocLineEdit->setStyleSheet("border: 1px solid orange");
  179. ui->newDestLocLineEdit->setStyleSheet("border: 1px solid orange");
  180. ui->newDeptTimeLineEdit->setStyleSheet("border: 1px solid orange");
  181. ui->newDestTimeLineEdit->setStyleSheet("border: 1px solid orange");
  182. ui->newPic->setStyleSheet("border: 1px solid orange");
  183. ui->newAcft->setStyleSheet("border: 1px solid orange");
  184. ui->newDeptLocLineEdit->setFocus();
  185. }
  186. NewFlight::~NewFlight()
  187. {
  188. delete ui;
  189. }
  190. /*
  191. * Functions
  192. */
  193. /// Input Validation
  194. /*!
  195. * \brief onInputRejected Set `line_edit`'s border to red and check if `rgx` matches
  196. * in order to keep text on line.
  197. */
  198. static void onInputRejected(QLineEdit* line_edit, QRegularExpression rgx){
  199. DEBUG("Input rejected" << line_edit->text());
  200. line_edit->setStyleSheet("border: 1px solid red");
  201. if(auto text = line_edit->text();
  202. rgx.match(text).hasMatch() == false)
  203. {
  204. line_edit->setText(line_edit->text());
  205. }
  206. }
  207. /*!
  208. * \brief onEditingFinished signal is emitted if input passed raw validation
  209. */
  210. static void onEditingFinished(QLineEdit* line_edit){
  211. DEBUG("Input accepted" << line_edit->text() << line_edit->metaObject()->className());
  212. line_edit->setStyleSheet("");
  213. }
  214. /*!
  215. * \brief NewFlight::nope for features that are not yet implemented
  216. */
  217. void NewFlight::nope()
  218. {
  219. QMessageBox nope(this); //error box
  220. nope.setText("This feature is not yet available!");
  221. nope.exec();
  222. }
  223. /*!
  224. * \brief NewFlight::fillExtrasLineEdits Fills the flight time line edits according to ui selections
  225. */
  226. void NewFlight::fillExtrasLineEdits()
  227. {
  228. QString blockTime = calc::blocktime(tofb,tonb).toString("hh:mm");
  229. DEBUG(blockTime);
  230. QVector<QString> aircraftDetails = dbAircraft::retreiveAircraftDetails(dbAircraft::retreiveAircraftId(acft));
  231. DEBUG("aircraftDetails: " << aircraftDetails);
  232. if(!aircraftDetails.isEmpty()){// valid aircraft
  233. // SP SE
  234. if(aircraftDetails[0] == "1" && aircraftDetails[2] == "1"){
  235. DEBUG("SPSE yes");
  236. tSPSE = blockTime;
  237. ui->spseTimeLineEdit->setText(blockTime);
  238. }
  239. // SP ME
  240. if(aircraftDetails[0] == "1" && aircraftDetails[3] == "1"){
  241. DEBUG("SP ME yes");
  242. tSPME = blockTime;
  243. ui->spmeTimeLineEdit->setText(blockTime);
  244. }
  245. // MP
  246. if(aircraftDetails[1] == "1"){
  247. DEBUG("Multipilot yes");
  248. tMP = blockTime;
  249. ui->mpTimeLineEdit->setText(blockTime);
  250. }
  251. }else{DEBUG("Aircraft Details Empty");}//invalid aircraft
  252. // TOTAL
  253. ui->totalTimeLineEdit->setText(blockTime);
  254. // IFR
  255. if(ui->IfrCheckBox->isChecked()){
  256. ui->ifrTimeLineEdit->setText(blockTime);
  257. ui->vfrTimeLineEdit->setText("");
  258. }
  259. // VFR
  260. if(ui->VfrCheckBox->isChecked()){
  261. ui->vfrTimeLineEdit->setText(blockTime);
  262. ui->ifrTimeLineEdit->setText("");
  263. }
  264. // Night
  265. QString deptDate = date.toString(Qt::ISODate) + 'T' + tofb.toString("hh:mm");
  266. QDateTime deptDateTime = QDateTime::fromString(deptDate,"yyyy-MM-ddThh:mm");
  267. int tblk = calc::time_to_minutes(calc::blocktime(tofb,tonb));
  268. QString nightTime = calc::minutes_to_string(
  269. QString::number(
  270. calc::calculateNightTime(
  271. dept, dest, deptDateTime, tblk)));
  272. ui->nightTimeLineEdit->setText(nightTime);
  273. // XC - Cross-country flight, if more than 50nm long
  274. if(calc::greatCircleDistanceBetweenAirports(dept,dest) >= 50){
  275. qDebug() << "Cross-country Flight: nm = " << calc::greatCircleDistanceBetweenAirports(dept,dest);
  276. ui->xcTimeLineEdit->setText(blockTime);
  277. }else{ui->xcTimeLineEdit->setText("00:00");}
  278. // Function times
  279. switch (ui->FunctionComboBox->currentIndex()) {
  280. case 0://PIC
  281. ui->picTimeLineEdit->setText(blockTime);
  282. ui->copTimeLineEdit->setText("");
  283. ui->dualTimeLineEdit->setText("");
  284. ui->fiTimeLineEdit->setText("");
  285. break;
  286. case 1://Co-Pilot
  287. ui->picTimeLineEdit->setText("");
  288. ui->copTimeLineEdit->setText(blockTime);
  289. ui->dualTimeLineEdit->setText("");
  290. ui->fiTimeLineEdit->setText("");
  291. break;
  292. case 2://Dual
  293. ui->picTimeLineEdit->setText("");
  294. ui->copTimeLineEdit->setText("");
  295. ui->dualTimeLineEdit->setText(blockTime);
  296. ui->fiTimeLineEdit->setText("");
  297. break;
  298. case 3://Instructor
  299. ui->picTimeLineEdit->setText("");
  300. ui->copTimeLineEdit->setText("");
  301. ui->dualTimeLineEdit->setText("");
  302. ui->fiTimeLineEdit->setText(blockTime);
  303. }
  304. // SIM
  305. }
  306. QVector<QString> NewFlight::collectInput()
  307. {
  308. // Collect input from the user fields and return a vector containing the flight information
  309. QString doft = date.toString(Qt::ISODate); // Format Date
  310. QTime tblk = calc::blocktime(tofb,tonb); // Calculate Blocktime
  311. // Prepare Vector for commit to database
  312. flight = dbFlight::createFlightVectorFromInput(doft, dept, tofb, dest, tonb, tblk, pic, acft);
  313. qDebug() << "Created flight vector:" << flight;
  314. return flight;
  315. }
  316. /*!
  317. * \brief NewFlight::verifyInput checks if input exists in database.
  318. * \return
  319. */
  320. bool NewFlight::verifyInput()
  321. {
  322. bool deptValid = false;
  323. bool tofbValid = false;
  324. bool destValid = false;
  325. bool tonbValid = false;
  326. bool tblkValid = false;
  327. bool picValid = false;
  328. bool acftValid = false;
  329. QTime tblk = calc::blocktime(tofb,tonb);
  330. int checktblk = calc::time_to_minutes(tblk);
  331. bool doftValid = true; //doft assumed to be always valid due to QDateTimeEdit constraints
  332. qDebug() << "NewFlight::verifyInput() says: Date:" << doft << " - Valid?\t" << doftValid;
  333. deptValid = dbAirport::checkICAOValid(dept);
  334. qDebug() << "NewFlight::verifyInput() says: Departure is:\t" << dept << " - Valid?\t" << deptValid;
  335. destValid = dbAirport::checkICAOValid(dest);
  336. qDebug() << "NewFlight::verifyInput() says: Destination is:\t" << dest << " - Valid?\t" << destValid;
  337. 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.
  338. qDebug() << "NewFlight::verifyInput() says: tofb is:\t\t" << tofb.toString("hh:mm") << " - Valid?\t" << tofbValid;
  339. 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
  340. qDebug() << "NewFlight::verifyInput() says: tonb is:\t\t" << tonb.toString("hh:mm")<< " - Valid?\t" << tonbValid;
  341. picValid = (pic.toInt() > 0); // pic should be a pilot_id retreived from the database
  342. qDebug() << "NewFlight::verifyInput() says: pic is pilotd_id:\t" << pic << " - Valid?\t" << picValid;
  343. if(!picValid)
  344. {
  345. QMessageBox msgBox(this);
  346. msgBox.setText("You cannot log a flight without a valid pilot");
  347. msgBox.exec();
  348. }
  349. acftValid = (acft.toInt() > 0);
  350. qDebug() << "NewFlight::verifyInput() says: acft is tail_id:\t" << acft << " - Valid?\t" << acftValid;
  351. if(!acftValid)
  352. {
  353. QMessageBox msgBox(this);
  354. msgBox.setText("You cannot log a flight without a valid aircraft");
  355. msgBox.exec();
  356. }
  357. tblkValid = checktblk != 0;
  358. qDebug() << "NewFlight::verifyInput() says: tblk is:\t\t" << tblk.toString("hh:mm") << " - Valid?\t" << tblkValid;
  359. if(deptValid && tofbValid && destValid && tonbValid
  360. && tblkValid && picValid && acftValid)
  361. {
  362. qDebug() << "====================================================";
  363. qDebug() << "NewFlight::verifyInput() says: All checks passed! Very impressive. ";
  364. return 1;
  365. }else
  366. {
  367. qDebug() << "====================================================";
  368. qDebug() << "NewFlight::verifyInput() says: Flight is invalid.";
  369. return 0;
  370. }
  371. return 0;
  372. }
  373. void NewFlight::returnInput(QVector<QString> flight)
  374. {
  375. // Re-populates the input masks with the selected fields if input was erroneous to allow for corrections to be made
  376. qDebug() << "return Input: " << flight;
  377. ui->newDoft->setDate(QDate::fromString(flight[1],Qt::ISODate));
  378. ui->newDeptLocLineEdit->setText(flight[2]);
  379. ui->newDeptTimeLineEdit->setText(flight[3]);
  380. ui->newDestLocLineEdit->setText(flight[4]);
  381. ui->newDestTimeLineEdit->setText(flight[5]);
  382. // flight[6] is blocktime
  383. ui->newPic->setText(dbPilots::retreivePilotNameFromID(flight[7]));
  384. ui->newAcft->setText(dbAircraft::retreiveRegistration(flight[8]));
  385. }
  386. void NewFlight::storeSettings()
  387. {
  388. qDebug() << "Storing Settings...";
  389. dbSettings::storeSetting(100, ui->FunctionComboBox->currentText());
  390. dbSettings::storeSetting(101, ui->ApproachComboBox->currentText());
  391. dbSettings::storeSetting(102, QString::number(ui->PilotFlyingCheckBox->isChecked()));
  392. dbSettings::storeSetting(103, QString::number(ui->PilotMonitoringCheckBox->isChecked()));
  393. dbSettings::storeSetting(104, QString::number(ui->TakeoffSpinBox->value()));
  394. dbSettings::storeSetting(105, QString::number(ui->TakeoffCheckBox->isChecked()));
  395. dbSettings::storeSetting(106, QString::number(ui->LandingSpinBox->value()));
  396. dbSettings::storeSetting(107, QString::number(ui->LandingCheckBox->isChecked()));
  397. dbSettings::storeSetting(108, QString::number(ui->AutolandSpinBox->value()));
  398. dbSettings::storeSetting(109, QString::number(ui->AutolandCheckBox->isChecked()));
  399. dbSettings::storeSetting(110, QString::number(ui->IfrCheckBox->isChecked()));
  400. dbSettings::storeSetting(111, QString::number(ui->VfrCheckBox->isChecked()));
  401. //dbSettings::storesetting(112, QString::number(ui->autoNightCheckBox->isChecked()));
  402. }
  403. void NewFlight::restoreSettings()
  404. {
  405. qDebug() << "Restoring Settings...";//crashes if db is empty due to QVector index out of range.
  406. ui->FunctionComboBox->setCurrentText(dbSettings::retreiveSetting(100));
  407. ui->ApproachComboBox->setCurrentText(dbSettings::retreiveSetting(101));
  408. ui->PilotFlyingCheckBox->setChecked(dbSettings::retreiveSetting(102).toInt());
  409. ui->PilotMonitoringCheckBox->setChecked(dbSettings::retreiveSetting(103).toInt());
  410. ui->TakeoffSpinBox->setValue(dbSettings::retreiveSetting(104).toInt());
  411. ui->TakeoffCheckBox->setChecked(dbSettings::retreiveSetting(105).toInt());
  412. ui->LandingSpinBox->setValue(dbSettings::retreiveSetting(106).toInt());
  413. ui->LandingCheckBox->setChecked(dbSettings::retreiveSetting(107).toInt());
  414. ui->AutolandSpinBox->setValue(dbSettings::retreiveSetting(108).toInt());
  415. ui->AutolandCheckBox->setChecked(dbSettings::retreiveSetting(109).toInt());
  416. ui->IfrCheckBox->setChecked(dbSettings::retreiveSetting(110).toInt());
  417. ui->VfrCheckBox->setChecked(dbSettings::retreiveSetting(111).toInt());
  418. ui->flightNumberPrefixLabel->setText(dbSettings::retreiveSetting(50) + QLatin1Char('-'));
  419. }
  420. /*
  421. * Slots
  422. */
  423. void NewFlight::on_deptTZ_currentTextChanged(const QString &arg1)
  424. {
  425. if(arg1 == "Local"){nope();}
  426. ui->deptTZ->setCurrentIndex(0);
  427. }
  428. void NewFlight::on_destTZ_currentIndexChanged(const QString &arg1)
  429. {
  430. if(arg1 == "Local"){nope();}
  431. ui->destTZ->setCurrentIndex(0);
  432. }
  433. /// newDeptLocLineEdit
  434. void NewFlight::on_newDeptLocLineEdit_inputRejected()
  435. {
  436. onInputRejected(ui->newDeptLocLineEdit, QRegularExpression(LOC_INVALID_RGX));
  437. }
  438. void NewFlight::on_newDeptLocLineEdit_textEdited(const QString &arg1)
  439. {
  440. ui->newDeptLocLineEdit->setText(arg1.toUpper());
  441. if(arg1.length()>2)
  442. {
  443. QStringList deptList = dbAirport::completeIcaoOrIata(arg1);
  444. qDebug() << "deptList = " << deptList;
  445. QCompleter *deptCompleter = new QCompleter(deptList, this);
  446. deptCompleter->setCaseSensitivity(Qt::CaseInsensitive);
  447. deptCompleter->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
  448. ui->newDeptLocLineEdit->setCompleter(deptCompleter);
  449. }
  450. }
  451. void NewFlight::on_newDeptLocLineEdit_editingFinished()
  452. {
  453. auto line_edit = ui->newDeptLocLineEdit;
  454. QStringList deptList;
  455. if(line_edit->text().length()>1)
  456. {
  457. QStringList deptList = dbAirport::completeIcaoOrIata(line_edit->text());
  458. if(deptList.length() != 0) {//exists in database
  459. dept = deptList.first();
  460. line_edit->setText(dept);
  461. DEBUG("Departure set: " << dept);
  462. }else{
  463. qWarning() << "Departure Location not in database. ";
  464. emit onInputRejected(line_edit, QRegularExpression(LOC_INVALID_RGX));
  465. }
  466. }
  467. onEditingFinished(line_edit);
  468. }
  469. /// newDeptLocLineEdit
  470. void NewFlight::on_newDestLocLineEdit_inputRejected()
  471. {
  472. onInputRejected(ui->newDestLocLineEdit, QRegularExpression(LOC_INVALID_RGX));
  473. }
  474. void NewFlight::on_newDestLocLineEdit_textEdited(const QString &arg1)
  475. {
  476. ui->newDestLocLineEdit->setText(arg1.toUpper());
  477. if(arg1.length()>2)
  478. {
  479. QStringList destList = dbAirport::completeIcaoOrIata(arg1);
  480. QCompleter *destCompleter = new QCompleter(destList, this);
  481. destCompleter->setCaseSensitivity(Qt::CaseInsensitive);
  482. destCompleter->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
  483. ui->newDestLocLineEdit->setCompleter(destCompleter);
  484. }
  485. }
  486. void NewFlight::on_newDestLocLineEdit_editingFinished()
  487. {
  488. auto line_edit = ui->newDestLocLineEdit;
  489. QStringList destList;
  490. if(line_edit->text().length()>1)
  491. {
  492. QStringList destList = dbAirport::completeIcaoOrIata(line_edit->text());
  493. if(destList.length() != 0) {
  494. dest = destList.first();
  495. ui->newDestLocLineEdit->setText(dest);
  496. DEBUG("Destination set: " << dest);
  497. }else{
  498. qWarning() << "Destination location not in database. ";
  499. emit onInputRejected(line_edit, QRegularExpression(LOC_INVALID_RGX));
  500. }
  501. }
  502. onEditingFinished(line_edit);
  503. }
  504. /*
  505. void NewFlight::on_newDept_textEdited(const QString &arg1)
  506. {
  507. ui->newDept->setText(arg1.toUpper());
  508. if(arg1.length()>2)
  509. {
  510. QStringList deptList = dbAirport::completeIcaoOrIata(arg1);
  511. qDebug() << "deptList = " << deptList;
  512. QCompleter *deptCompleter = new QCompleter(deptList, this);
  513. deptCompleter->setCaseSensitivity(Qt::CaseInsensitive);
  514. deptCompleter->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
  515. ui->newDept->setCompleter(deptCompleter);
  516. }
  517. }
  518. void NewFlight::on_newDept_editingFinished()
  519. {
  520. if(ui->newDept->text().length()<3)
  521. {
  522. QMessageBox msgBox(this);
  523. msgBox.setText("Please enter a 3- or 4-letter code.");
  524. msgBox.exec();
  525. ui->newDept->setText("");
  526. ui->newDept->setFocus();
  527. }
  528. QStringList deptList;
  529. if(ui->newDept->text().length()>1)
  530. {
  531. QStringList deptList = dbAirport::completeIcaoOrIata(ui->newDept->text());
  532. if(deptList.length() != 0)
  533. {
  534. dept = deptList.first();
  535. ui->newDept->setText(dept);
  536. }else
  537. {
  538. QMessageBox msgBox(this);
  539. msgBox.setText("No Airport with that name found.");
  540. msgBox.exec();
  541. ui->newDept->setText("");
  542. ui->newDept->setFocus();
  543. }
  544. }
  545. }
  546. void NewFlight::on_newDest_textEdited(const QString &arg1)
  547. {
  548. ui->newDest->setText(arg1.toUpper());
  549. if(arg1.length()>2)
  550. {
  551. QStringList destList = dbAirport::completeIcaoOrIata(arg1);
  552. QCompleter *destCompleter = new QCompleter(destList, this);
  553. destCompleter->setCaseSensitivity(Qt::CaseInsensitive);
  554. destCompleter->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
  555. ui->newDest->setCompleter(destCompleter);
  556. }
  557. }
  558. void NewFlight::on_newDest_editingFinished()
  559. {
  560. if(ui->newDest->text().length()<3)
  561. {
  562. QMessageBox msgBox(this);
  563. msgBox.setText("Please enter a 3- or 4-letter code.");
  564. msgBox.exec();
  565. ui->newDest->setText("");
  566. ui->newDest->setFocus();
  567. }
  568. QStringList destList;
  569. if(ui->newDest->text().length()>1)
  570. {
  571. QStringList destList = dbAirport::completeIcaoOrIata(ui->newDest->text());
  572. if(destList.length() != 0)
  573. {
  574. dest = destList.first();
  575. ui->newDest->setText(dest);
  576. }else
  577. {
  578. QMessageBox msgBox(this);
  579. msgBox.setText("No Airport with that name found.");
  580. msgBox.exec();
  581. ui->newDest->setText("");
  582. ui->newDest->setFocus();
  583. }
  584. }
  585. }
  586. */
  587. void NewFlight::on_newDoft_editingFinished()
  588. {
  589. date = ui->newDoft->date();
  590. doft = date.toString(Qt::ISODate);
  591. }
  592. /// newDeptTimeLineEdit
  593. void NewFlight::on_newDeptTimeLineEdit_inputRejected()
  594. {
  595. onInputRejected(ui->newDeptTimeLineEdit, QRegularExpression(TIME_INVALID_RGX));
  596. }
  597. void NewFlight::on_newDeptTimeLineEdit_editingFinished()
  598. {
  599. ui->newDeptTimeLineEdit->setText(calc::formatTimeInput(ui->newDeptTimeLineEdit->text()));
  600. tofb = QTime::fromString(ui->newDeptTimeLineEdit->text(),"hh:mm");
  601. auto line_edit = ui->newDeptTimeLineEdit;
  602. onEditingFinished(line_edit);
  603. if(tofb.isValid()){
  604. // continue
  605. DEBUG("Time Off Blocks is valid:" << tofb);
  606. }else{
  607. emit line_edit->inputRejected();
  608. }
  609. }
  610. /// newDestTimeLineEdit
  611. void NewFlight::on_newDestTimeLineEdit_inputRejected()
  612. {
  613. onInputRejected(ui->newDestTimeLineEdit, QRegularExpression(TIME_INVALID_RGX));
  614. }
  615. void NewFlight::on_newDestTimeLineEdit_editingFinished()
  616. {
  617. ui->newDestTimeLineEdit->setText(calc::formatTimeInput(ui->newDestTimeLineEdit->text()));
  618. tonb = QTime::fromString(ui->newDestTimeLineEdit->text(),"hh:mm");
  619. auto line_edit = ui->newDestTimeLineEdit;
  620. onEditingFinished(line_edit);
  621. if(tonb.isValid()){
  622. // continue
  623. DEBUG("Time On Blocks is valid:" << tonb);
  624. }else{
  625. emit line_edit->inputRejected();
  626. }
  627. }
  628. void NewFlight::on_newAcft_textEdited(const QString &arg1)
  629. {
  630. if(arg1.length()>1)
  631. {
  632. QStringList acftList = dbAircraft::newAcftGetString(arg1);
  633. QCompleter *acftCompleter = new QCompleter(acftList, this);
  634. acftCompleter->setCaseSensitivity(Qt::CaseInsensitive);
  635. acftCompleter->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
  636. ui->newAcft->setCompleter(acftCompleter);
  637. }
  638. }
  639. void NewFlight::on_newAcft_editingFinished()
  640. {
  641. acft = "-1";// set invalid
  642. if(ui->newAcft->text().contains(" "))// is input from QCompleter
  643. {
  644. QStringList input = ui->newAcft->text().split(" ");
  645. QString registration = input[0].trimmed();
  646. QStringList result = dbAircraft::newAcftGetString(registration);
  647. if(result.length() > 0)
  648. {
  649. ui->newAcft->setText(result[0]);
  650. acft = dbAircraft::retreiveTailId(registration);
  651. }else
  652. {
  653. acft = "-1";
  654. }
  655. }else // is input from user
  656. {
  657. QString input = ui->newAcft->text();
  658. QStringList result = dbAircraft::newAcftGetString(input);
  659. if(result.length() > 0)
  660. {
  661. ui->newAcft->setText(result[0]);
  662. QStringList input = ui->newAcft->text().split(" ");
  663. QString registration = input[0].trimmed();
  664. acft = dbAircraft::retreiveTailId(registration);
  665. }else
  666. {
  667. acft = "-1";
  668. }
  669. }
  670. if(acft == "-1")
  671. {
  672. QMessageBox::StandardButton reply;
  673. reply = QMessageBox::question(this, "No aircraft found", "No aircraft found.\n Would you like to add a new aircraft to the database?",
  674. QMessageBox::Yes|QMessageBox::No);
  675. if (reply == QMessageBox::Yes) {
  676. NewAcft na(this);
  677. na.exec();
  678. ui->newAcft->setText("");
  679. ui->newAcft->setFocus();
  680. }
  681. }
  682. qDebug() << "Editing finished. Acft: " << acft;
  683. }
  684. void NewFlight::on_newPic_textEdited(const QString &arg1)
  685. {
  686. if(arg1.length()>2)
  687. {
  688. QStringList picList = dbPilots::newPicGetString(arg1);
  689. QCompleter *picCompleter = new QCompleter(picList, this);
  690. picCompleter->setCaseSensitivity(Qt::CaseInsensitive);
  691. picCompleter->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
  692. ui->newPic->setCompleter(picCompleter);
  693. }
  694. }
  695. void NewFlight::on_newPic_editingFinished()
  696. {
  697. pic = "-1"; // set invalid
  698. if(ui->newPic->text() == "self")
  699. {
  700. pic = "1";
  701. }else
  702. {
  703. QString picname;
  704. QStringList picList = dbPilots::newPicGetString(ui->newPic->text());
  705. qDebug() << picList;
  706. if(picList.length()!= 0)
  707. {
  708. picname = picList[0];
  709. ui->newPic->setText(picname);
  710. pic = dbPilots::newPicGetId(picname);
  711. }else
  712. {
  713. QMessageBox::StandardButton reply;
  714. reply = QMessageBox::question(this, "No Pilot found", "No pilot found.\n Would you like to add a new pilot to the database?",
  715. QMessageBox::Yes|QMessageBox::No);
  716. if (reply == QMessageBox::Yes)
  717. {
  718. qDebug() << "Add new pilot selected";
  719. nope();
  720. }
  721. }
  722. }
  723. }
  724. void NewFlight::on_secondPilotLineEdit_textEdited(const QString &arg1)
  725. {
  726. if(arg1.length()>2)
  727. {
  728. QStringList picList = dbPilots::newPicGetString(arg1);
  729. QCompleter *picCompleter = new QCompleter(picList, this);
  730. picCompleter->setCaseSensitivity(Qt::CaseInsensitive);
  731. picCompleter->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
  732. ui->secondPilotLineEdit->setCompleter(picCompleter);
  733. }
  734. }
  735. void NewFlight::on_secondPilotLineEdit_editingFinished()
  736. {
  737. secondPilot = "-1"; // set invalid
  738. if(ui->secondPilotLineEdit->text() == "self")
  739. {
  740. secondPilot = "1";
  741. }else
  742. {
  743. QString picname;
  744. QStringList picList = dbPilots::newPicGetString(ui->secondPilotLineEdit->text());
  745. qDebug() << picList;
  746. if(picList.length()!= 0)
  747. {
  748. picname = picList[0];
  749. ui->secondPilotLineEdit->setText(picname);
  750. secondPilot = dbPilots::newPicGetId(picname);
  751. }else
  752. {
  753. ui->secondPilotLineEdit->setStyleSheet("border: 1px solid red");
  754. /*QMessageBox::StandardButton reply;
  755. reply = QMessageBox::question(this, "No Pilot found", "No pilot found.\n Would you like to add a new pilot to the database?",
  756. QMessageBox::Yes|QMessageBox::No);
  757. if (reply == QMessageBox::Yes)
  758. {
  759. qDebug() << "Add new pilot selected";
  760. nope();
  761. }*/
  762. }
  763. }
  764. }
  765. void NewFlight::on_thirdPilotLineEdit_textEdited(const QString &arg1)
  766. {
  767. if(arg1.length()>2)
  768. {
  769. QStringList picList = dbPilots::newPicGetString(arg1);
  770. QCompleter *picCompleter = new QCompleter(picList, this);
  771. picCompleter->setCaseSensitivity(Qt::CaseInsensitive);
  772. picCompleter->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
  773. ui->thirdPilotLineEdit->setCompleter(picCompleter);
  774. }
  775. }
  776. void NewFlight::on_thirdPilotLineEdit_editingFinished()
  777. {
  778. thirdPilot = "-1"; // set invalid
  779. if(ui->thirdPilotLineEdit->text() == "self")
  780. {
  781. thirdPilot = "1";
  782. }else
  783. {
  784. QString picname;
  785. QStringList picList = dbPilots::newPicGetString(ui->thirdPilotLineEdit->text());
  786. qDebug() << picList;
  787. if(picList.length()!= 0)
  788. {
  789. picname = picList[0];
  790. ui->thirdPilotLineEdit->setText(picname);
  791. thirdPilot = dbPilots::newPicGetId(picname);
  792. }else
  793. {
  794. ui->thirdPilotLineEdit->setStyleSheet("border: 1px solid red");
  795. /*QMessageBox::StandardButton reply;
  796. reply = QMessageBox::question(this, "No Pilot found", "No pilot found.\n Would you like to add a new pilot to the database?",
  797. QMessageBox::Yes|QMessageBox::No);
  798. if (reply == QMessageBox::Yes)
  799. {
  800. qDebug() << "Add new pilot selected";
  801. nope();
  802. }*/
  803. }
  804. }
  805. }
  806. void NewFlight::on_FlightNumberLineEdit_editingFinished()
  807. {
  808. qDebug() << "tbd: FlightNumber slot";
  809. // To Do: Store input in variable, perform some checks
  810. // Setting for optional Prefix (e.g. LH, LX etc.)
  811. }
  812. /*
  813. * Extras
  814. */
  815. void NewFlight::on_PilotFlyingCheckBox_stateChanged(int)
  816. {
  817. if(ui->PilotFlyingCheckBox->isChecked()){
  818. ui->TakeoffSpinBox->setValue(1);
  819. ui->TakeoffCheckBox->setCheckState(Qt::Checked);
  820. ui->LandingSpinBox->setValue(1);
  821. ui->LandingCheckBox->setCheckState(Qt::Checked);
  822. }else if(!ui->PilotFlyingCheckBox->isChecked()){
  823. ui->TakeoffSpinBox->setValue(0);
  824. ui->TakeoffCheckBox->setCheckState(Qt::Unchecked);
  825. ui->LandingSpinBox->setValue(0);
  826. ui->LandingCheckBox->setCheckState(Qt::Unchecked);
  827. }
  828. }
  829. void NewFlight::on_setAsDefaultButton_clicked()
  830. {
  831. storeSettings();
  832. }
  833. void NewFlight::on_restoreDefaultButton_clicked()
  834. {
  835. restoreSettings();
  836. }
  837. void NewFlight::on_ApproachComboBox_currentTextChanged(const QString &arg1)
  838. {
  839. if(arg1 == "ILS CAT III"){
  840. ui->AutolandCheckBox->setCheckState(Qt::Checked);
  841. ui->AutolandSpinBox->setValue(1);
  842. }else{
  843. ui->AutolandCheckBox->setCheckState(Qt::Unchecked);
  844. ui->AutolandSpinBox->setValue(0);
  845. }
  846. approachType = arg1;
  847. qDebug() << "Approach Type: " << approachType;
  848. }
  849. /*
  850. * Extra Times
  851. */
  852. void NewFlight::on_spseTimeLineEdit_editingFinished()
  853. {
  854. ui->spseTimeLineEdit->setText(calc::formatTimeInput(ui->spseTimeLineEdit->text()));
  855. if(ui->spseTimeLineEdit->text() == ""){
  856. ui->spseTimeLineEdit->setStyleSheet("border: 1px solid red");
  857. ui->spseTimeLineEdit->setFocus();
  858. }else{
  859. ui->spseTimeLineEdit->setStyleSheet("");
  860. }
  861. }
  862. void NewFlight::on_spmeTimeLineEdit_editingFinished()
  863. {
  864. ui->spmeTimeLineEdit->setText(calc::formatTimeInput(ui->spmeTimeLineEdit->text()));
  865. if(ui->spmeTimeLineEdit->text() == ""){
  866. ui->spmeTimeLineEdit->setStyleSheet("border: 1px solid red");
  867. ui->spmeTimeLineEdit->setFocus();
  868. }else{
  869. ui->spmeTimeLineEdit->setStyleSheet("");
  870. }
  871. }
  872. void NewFlight::on_mpTimeLineEdit_editingFinished()
  873. {
  874. ui->mpTimeLineEdit->setText(calc::formatTimeInput(ui->mpTimeLineEdit->text()));
  875. if(ui->mpTimeLineEdit->text() == ""){
  876. ui->mpTimeLineEdit->setStyleSheet("border: 1px solid red");
  877. ui->mpTimeLineEdit->setFocus();
  878. }else{
  879. ui->mpTimeLineEdit->setStyleSheet("");
  880. }
  881. }
  882. void NewFlight::on_totalTimeLineEdit_editingFinished()
  883. {
  884. ui->totalTimeLineEdit->setText(calc::formatTimeInput(ui->totalTimeLineEdit->text()));
  885. if(ui->totalTimeLineEdit->text() == ""){
  886. ui->totalTimeLineEdit->setStyleSheet("border: 1px solid red");
  887. ui->totalTimeLineEdit->setFocus();
  888. }else{
  889. ui->totalTimeLineEdit->setStyleSheet("");
  890. }
  891. }
  892. void NewFlight::on_ifrTimeLineEdit_editingFinished()
  893. {
  894. ui->ifrTimeLineEdit->setText(calc::formatTimeInput(ui->ifrTimeLineEdit->text()));
  895. if(ui->ifrTimeLineEdit->text() == ""){
  896. ui->ifrTimeLineEdit->setStyleSheet("border: 1px solid red");
  897. ui->ifrTimeLineEdit->setFocus();
  898. }else{
  899. ui->ifrTimeLineEdit->setStyleSheet("");
  900. }
  901. }
  902. void NewFlight::on_vfrTimeLineEdit_editingFinished()
  903. {
  904. ui->vfrTimeLineEdit->setText(calc::formatTimeInput(ui->vfrTimeLineEdit->text()));
  905. if(ui->vfrTimeLineEdit->text() == ""){
  906. ui->vfrTimeLineEdit->setStyleSheet("border: 1px solid red");
  907. ui->vfrTimeLineEdit->setFocus();
  908. }else{
  909. ui->vfrTimeLineEdit->setStyleSheet("");
  910. }
  911. }
  912. void NewFlight::on_nightTimeLineEdit_editingFinished()
  913. {
  914. ui->nightTimeLineEdit->setText(calc::formatTimeInput(ui->nightTimeLineEdit->text()));
  915. if(ui->nightTimeLineEdit->text() == ""){
  916. ui->nightTimeLineEdit->setStyleSheet("border: 1px solid red");
  917. ui->nightTimeLineEdit->setFocus();
  918. }else{
  919. ui->nightTimeLineEdit->setStyleSheet("");
  920. }
  921. }
  922. void NewFlight::on_xcTimeLineEdit_editingFinished()
  923. {
  924. ui->xcTimeLineEdit->setText(calc::formatTimeInput(ui->xcTimeLineEdit->text()));
  925. if(ui->xcTimeLineEdit->text() == ""){
  926. ui->xcTimeLineEdit->setStyleSheet("border: 1px solid red");
  927. ui->xcTimeLineEdit->setFocus();
  928. }else{
  929. ui->xcTimeLineEdit->setStyleSheet("");
  930. }
  931. }
  932. void NewFlight::on_picTimeLineEdit_editingFinished()
  933. {
  934. ui->picTimeLineEdit->setText(calc::formatTimeInput(ui->picTimeLineEdit->text()));
  935. if(ui->picTimeLineEdit->text() == ""){
  936. ui->picTimeLineEdit->setStyleSheet("border: 1px solid red");
  937. ui->picTimeLineEdit->setFocus();
  938. }else{
  939. ui->picTimeLineEdit->setStyleSheet("");
  940. }
  941. }
  942. void NewFlight::on_copTimeLineEdit_editingFinished()
  943. {
  944. ui->copTimeLineEdit->setText(calc::formatTimeInput(ui->copTimeLineEdit->text()));
  945. if(ui->copTimeLineEdit->text() == ""){
  946. ui->copTimeLineEdit->setStyleSheet("border: 1px solid red");
  947. ui->copTimeLineEdit->setFocus();
  948. }else{
  949. ui->copTimeLineEdit->setStyleSheet("");
  950. }
  951. }
  952. void NewFlight::on_dualTimeLineEdit_editingFinished()
  953. {
  954. ui->dualTimeLineEdit->setText(calc::formatTimeInput(ui->dualTimeLineEdit->text()));
  955. if(ui->dualTimeLineEdit->text() == ""){
  956. ui->dualTimeLineEdit->setStyleSheet("border: 1px solid red");
  957. ui->dualTimeLineEdit->setFocus();
  958. }else{
  959. ui->dualTimeLineEdit->setStyleSheet("");
  960. }
  961. }
  962. void NewFlight::on_fiTimeLineEdit_editingFinished()
  963. {
  964. ui->fiTimeLineEdit->setText(calc::formatTimeInput(ui->fiTimeLineEdit->text()));
  965. if(ui->fiTimeLineEdit->text() == ""){
  966. ui->fiTimeLineEdit->setStyleSheet("border: 1px solid red");
  967. ui->fiTimeLineEdit->setFocus();
  968. }else{
  969. ui->fiTimeLineEdit->setStyleSheet("");
  970. }
  971. }
  972. void NewFlight::on_simTimeLineEdit_editingFinished()
  973. {
  974. ui->simTimeLineEdit->setText(calc::formatTimeInput(ui->simTimeLineEdit->text()));
  975. if(ui->simTimeLineEdit->text() == ""){
  976. ui->simTimeLineEdit->setStyleSheet("border: 1px solid red");
  977. ui->simTimeLineEdit->setFocus();
  978. }else{
  979. ui->simTimeLineEdit->setStyleSheet("");
  980. }
  981. }
  982. /*
  983. * Control Buttons
  984. */
  985. void NewFlight::on_buttonBox_accepted()
  986. {
  987. on_newDoft_editingFinished();// - activate slots in case user has been active in last input before clicking submit
  988. //on_newTonb_editingFinished();
  989. //on_newTofb_editingFinished();
  990. //on_newDept_editingFinished();
  991. //on_newDest_editingFinished();
  992. on_newAcft_editingFinished();
  993. on_newPic_editingFinished();
  994. QVector<QString> flight;
  995. flight = collectInput();
  996. if(verifyInput())
  997. {
  998. dbFlight::commitFlight(flight);
  999. qDebug() << flight << "Has been commited.";
  1000. QMessageBox msgBox(this);
  1001. msgBox.setText("Flight has been commited.");
  1002. msgBox.exec();
  1003. }else
  1004. {
  1005. qDebug() << "Invalid Input. No entry has been made in the database.";
  1006. dbFlight::commitToScratchpad(flight);
  1007. QMessageBox msgBox(this);
  1008. msgBox.setText("Invalid entries detected. Please check your input.");
  1009. msgBox.exec();
  1010. NewFlight nf(this);
  1011. nf.exec();
  1012. }
  1013. }
  1014. void NewFlight::on_buttonBox_rejected()
  1015. {
  1016. qDebug() << "NewFlight: Rejected\n";
  1017. }