newflight.cpp 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971
  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. #include <QMessageBox>
  22. #include <QDebug>
  23. #include <QCompleter>
  24. #include <QLatin1Char>
  25. #include <QStringList>
  26. #include <QStringListModel>
  27. #include <QSortFilterProxyModel>
  28. #include <QButtonGroup>
  29. /*
  30. * Debug / WIP
  31. */
  32. void NewFlight::on_verifyButton_clicked()//debug
  33. {
  34. /*on_newDoft_editingFinished();// - activate slots in case user has been active in last input before clicking submit
  35. on_newTonb_editingFinished();
  36. on_newTofb_editingFinished();
  37. on_newDept_editingFinished();
  38. on_newDest_editingFinished();
  39. on_newAcft_editingFinished();
  40. on_newPic_editingFinished();
  41. verifyInput();*/
  42. fillExtrasLineEdits();
  43. }
  44. void NewFlight::on_tabWidget_tabBarClicked(int index)
  45. {
  46. if(index == 1){
  47. nope();
  48. }
  49. }
  50. /*
  51. * Initialise variables
  52. */
  53. QDate date(QDate::currentDate());
  54. QString doft(QDate::currentDate().toString(Qt::ISODate));
  55. QString dept;
  56. QString dest;
  57. QTime tofb;
  58. QTime tonb;
  59. QTime tblk;
  60. QString pic;
  61. QString acft;
  62. QVector<QString> flight;
  63. // extras
  64. QString secondPilot;
  65. QString thirdPilot;
  66. QString PilotFunction;
  67. QString PilotTask;
  68. QString TakeOff;
  69. QString Landing;
  70. QString Autoland;
  71. QString ApproachType;
  72. /*
  73. * Window
  74. */
  75. NewFlight::NewFlight(QWidget *parent) :
  76. QDialog(parent),
  77. ui(new Ui::NewFlight)
  78. {
  79. ui->setupUi(this);
  80. ui->newDoft->setDate(QDate::currentDate());
  81. bool hasoldinput = dbFlight::checkScratchpad();
  82. qDebug() << "Hasoldinput? = " << hasoldinput;
  83. if(hasoldinput) // Re-populate the Form
  84. {
  85. flight = dbFlight::retreiveScratchpad();
  86. qDebug() << "Re-Filling Form from Scratchpad";
  87. returnInput(flight);
  88. }
  89. // Validators for Line Edits
  90. QRegExp icao_rx("[a-zA-Z]?[a-zA-Z]?[a-zA-Z]?[a-zA-Z]"); // allow only letters (upper and lower)
  91. QValidator *ICAOvalidator = new QRegExpValidator(icao_rx, this);
  92. ui->newDept->setValidator(ICAOvalidator);
  93. ui->newDest->setValidator(ICAOvalidator);
  94. 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
  95. QValidator *timeInputValidator = new QRegExpValidator(timehhmm, this);
  96. ui->newTofb->setValidator(timeInputValidator);
  97. ui->newTonb->setValidator(timeInputValidator);
  98. ui->spseTimeLineEdit->setValidator(timeInputValidator);
  99. ui->spmeTimeLineEdit->setValidator(timeInputValidator);
  100. ui->mpTimeLineEdit->setValidator(timeInputValidator);
  101. ui->totalTimeLineEdit->setValidator(timeInputValidator);
  102. ui->ifrTimeLineEdit->setValidator(timeInputValidator);
  103. ui->vfrTimeLineEdit->setValidator(timeInputValidator);
  104. ui->nightTimeLineEdit->setValidator(timeInputValidator);
  105. ui->xcTimeLineEdit->setValidator(timeInputValidator);
  106. ui->picTimeLineEdit->setValidator(timeInputValidator);
  107. ui->copTimeLineEdit->setValidator(timeInputValidator);
  108. ui->dualTimeLineEdit->setValidator(timeInputValidator);
  109. ui->fiTimeLineEdit->setValidator(timeInputValidator);
  110. ui->simTimeLineEdit->setValidator(timeInputValidator);
  111. QRegExp picname("^[a-zA-Z_]+,?( [a-zA-Z_]+)*$");// allow only lastname, firstname or lastname firstname with one whitespace
  112. QValidator *picNameValidator = new QRegExpValidator(picname, this);
  113. ui->newPic->setValidator(picNameValidator);
  114. ui->secondPilotLineEdit->setValidator(picNameValidator);
  115. ui->thirdPilotLineEdit->setValidator(picNameValidator);
  116. // Groups for CheckBoxes
  117. QButtonGroup *FlightRulesGroup = new QButtonGroup(this);
  118. FlightRulesGroup->addButton(ui->IfrCheckBox);
  119. FlightRulesGroup->addButton(ui->VfrCheckBox);
  120. QButtonGroup *PilotTaskGroup = new QButtonGroup(this);
  121. PilotTaskGroup->addButton(ui->PilotFlyingCheckBox);
  122. PilotTaskGroup->addButton(ui->PilotMonitoringCheckBox);
  123. restoreSettings();
  124. ui->deptTZ->setFocusPolicy(Qt::NoFocus);
  125. ui->destTZ->setFocusPolicy(Qt::NoFocus);
  126. ui->newDept->setFocus();
  127. }
  128. NewFlight::~NewFlight()
  129. {
  130. delete ui;
  131. }
  132. /*
  133. * Functions
  134. */
  135. void NewFlight::nope()
  136. {
  137. QMessageBox nope(this); //error box
  138. nope.setText("This feature is not yet available!");
  139. nope.exec();
  140. }
  141. /*!
  142. * \brief NewFlight::validateTimeInput verifies user input and formats to hh:mm
  143. * if the output is not a valid time, an empty string is returned.
  144. * \param userinput from a QLineEdit
  145. * \return formatted QString "hh:mm" or Empty String
  146. */
  147. QString NewFlight::validateTimeInput(QString userinput)
  148. {
  149. QString output; //
  150. QTime temptime; //empty time object is invalid by default
  151. bool containsSeperator = userinput.contains(":");
  152. if(userinput.length() == 4 && !containsSeperator)
  153. {
  154. temptime = QTime::fromString(userinput,"hhmm");
  155. }else if(userinput.length() == 3 && !containsSeperator)
  156. {
  157. if(userinput.toInt() < 240) //Qtime is invalid if time is between 000 and 240 for this case
  158. {
  159. QString tempstring = userinput.prepend("0");
  160. temptime = QTime::fromString(tempstring,"hhmm");
  161. }else
  162. {
  163. temptime = QTime::fromString(userinput,"Hmm");
  164. }
  165. }else if(userinput.length() == 4 && containsSeperator)
  166. {
  167. temptime = QTime::fromString(userinput,"h:mm");
  168. }else if(userinput.length() == 5 && containsSeperator)
  169. {
  170. temptime = QTime::fromString(userinput,"hh:mm");
  171. }
  172. output = temptime.toString("hh:mm");
  173. if(output.isEmpty())
  174. {
  175. QMessageBox timeformat(this);
  176. timeformat.setText("Please enter a valid time. Any of these formats is valid:\n845 0845 8:45 08:45");
  177. timeformat.exec();
  178. }
  179. return output;
  180. }
  181. /*!
  182. * \brief NewFlight::fillExtrasLineEdits Fills the flight time line edits according to ui selections
  183. */
  184. void NewFlight::fillExtrasLineEdits()
  185. {
  186. QString blockTime = calc::blocktime(tofb,tonb).toString("hh:mm");
  187. // SP SE
  188. // SP ME
  189. // MP
  190. // TOTAL
  191. ui->totalTimeLineEdit->setText(blockTime);
  192. // IFR
  193. // VFR
  194. // Night
  195. QString deptDate = date.toString(Qt::ISODate) + 'T' + tofb.toString("hh:mm");
  196. QDateTime deptDateTime = QDateTime::fromString(deptDate,"yyyy-MM-ddThh:mm");
  197. int blocktime = calc::time_to_minutes(calc::blocktime(tofb,tonb));
  198. qDebug() << "Blocktime: " << blocktime;
  199. QString nightTime = calc::minutes_to_string(QString::number(calc::calculateNightTime(dept, dest, deptDateTime, blocktime)));
  200. ui->nightTimeLineEdit->setText(nightTime);
  201. // XC - Cross-country flight, if more than 50nm long
  202. if(calc::greatCircleDistanceBetweenAirports(dept,dest) >= 50){
  203. qDebug() << "Cross-country Flight: nm = " << calc::greatCircleDistanceBetweenAirports(dept,dest);
  204. ui->xcTimeLineEdit->setText(blockTime);
  205. }else{
  206. ui->xcTimeLineEdit->setText("00:00");
  207. }
  208. // PIC
  209. // Co-Pilot
  210. // Dual
  211. // FI
  212. // SIM
  213. }
  214. QVector<QString> NewFlight::collectInput()
  215. {
  216. // Collect input from the user fields and return a vector containing the flight information
  217. QString doft = date.toString(Qt::ISODate); // Format Date
  218. QTime tblk = calc::blocktime(tofb,tonb); // Calculate Blocktime
  219. // Prepare Vector for commit to database
  220. flight = dbFlight::createFlightVectorFromInput(doft, dept, tofb, dest, tonb, tblk, pic, acft);
  221. qDebug() << "Created flight vector:" << flight;
  222. return flight;
  223. }
  224. bool NewFlight::verifyInput()
  225. //check if the input is correctly formatted and all required fields are filled
  226. {
  227. bool deptValid = false;
  228. bool tofbValid = false;
  229. bool destValid = false;
  230. bool tonbValid = false;
  231. bool tblkValid = false;
  232. bool picValid = false;
  233. bool acftValid = false;
  234. QTime tblk = calc::blocktime(tofb,tonb);
  235. int checktblk = calc::time_to_minutes(tblk);
  236. bool doftValid = true; //doft assumed to be always valid due to QDateTimeEdit constraints
  237. qDebug() << "NewFlight::verifyInput() says: Date:" << doft << " - Valid?\t" << doftValid;
  238. deptValid = dbAirport::checkICAOValid(dept);
  239. qDebug() << "NewFlight::verifyInput() says: Departure is:\t" << dept << " - Valid?\t" << deptValid;
  240. destValid = dbAirport::checkICAOValid(dest);
  241. qDebug() << "NewFlight::verifyInput() says: Destination is:\t" << dest << " - Valid?\t" << destValid;
  242. 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.
  243. qDebug() << "NewFlight::verifyInput() says: tofb is:\t\t" << tofb.toString("hh:mm") << " - Valid?\t" << tofbValid;
  244. 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
  245. qDebug() << "NewFlight::verifyInput() says: tonb is:\t\t" << tonb.toString("hh:mm")<< " - Valid?\t" << tonbValid;
  246. picValid = (pic.toInt() > 0); // pic should be a pilot_id retreived from the database
  247. qDebug() << "NewFlight::verifyInput() says: pic is pilotd_id:\t" << pic << " - Valid?\t" << picValid;
  248. if(!picValid)
  249. {
  250. QMessageBox msgBox(this);
  251. msgBox.setText("You cannot log a flight without a valid pilot");
  252. msgBox.exec();
  253. }
  254. acftValid = (acft.toInt() > 0);
  255. qDebug() << "NewFlight::verifyInput() says: acft is tail_id:\t" << acft << " - Valid?\t" << acftValid;
  256. if(!acftValid)
  257. {
  258. QMessageBox msgBox(this);
  259. msgBox.setText("You cannot log a flight without a valid aircraft");
  260. msgBox.exec();
  261. }
  262. tblkValid = checktblk != 0;
  263. qDebug() << "NewFlight::verifyInput() says: tblk is:\t\t" << tblk.toString("hh:mm") << " - Valid?\t" << tblkValid;
  264. if(deptValid && tofbValid && destValid && tonbValid
  265. && tblkValid && picValid && acftValid)
  266. {
  267. qDebug() << "====================================================";
  268. qDebug() << "NewFlight::verifyInput() says: All checks passed! Very impressive. ";
  269. return 1;
  270. }else
  271. {
  272. qDebug() << "====================================================";
  273. qDebug() << "NewFlight::verifyInput() says: Flight is invalid.";
  274. qDebug() << "NewFlight::verifyInput() says: I will call the cops.";
  275. return 0;
  276. }
  277. return 0;
  278. }
  279. void NewFlight::returnInput(QVector<QString> flight)
  280. {
  281. // Re-populates the input masks with the selected fields if input was erroneous to allow for corrections to be made
  282. qDebug() << "return Input: " << flight;
  283. ui->newDoft->setDate(QDate::fromString(flight[1],Qt::ISODate));
  284. ui->newDept->setText(flight[2]);
  285. ui->newTofb->setText(flight[3]);
  286. ui->newDest->setText(flight[4]);
  287. ui->newTonb->setText(flight[5]);
  288. // flight[6] is blocktime
  289. ui->newPic->setText(dbPilots::retreivePilotNameFromID(flight[7]));
  290. ui->newAcft->setText(dbAircraft::retreiveRegistration(flight[8]));
  291. }
  292. void NewFlight::storeSettings()
  293. {
  294. qDebug() << "Storing Settings...";
  295. dbSettings::storeSetting(100, ui->FunctionComboBox->currentText());
  296. dbSettings::storeSetting(101, ui->ApproachComboBox->currentText());
  297. dbSettings::storeSetting(102, QString::number(ui->PilotFlyingCheckBox->isChecked()));
  298. dbSettings::storeSetting(103, QString::number(ui->PilotMonitoringCheckBox->isChecked()));
  299. dbSettings::storeSetting(104, QString::number(ui->TakeoffSpinBox->value()));
  300. dbSettings::storeSetting(105, QString::number(ui->TakeoffCheckBox->isChecked()));
  301. dbSettings::storeSetting(106, QString::number(ui->LandingSpinBox->value()));
  302. dbSettings::storeSetting(107, QString::number(ui->LandingCheckBox->isChecked()));
  303. dbSettings::storeSetting(108, QString::number(ui->AutolandSpinBox->value()));
  304. dbSettings::storeSetting(109, QString::number(ui->AutolandCheckBox->isChecked()));
  305. dbSettings::storeSetting(110, QString::number(ui->IfrCheckBox->isChecked()));
  306. dbSettings::storeSetting(111, QString::number(ui->VfrCheckBox->isChecked()));
  307. //dbSettings::storesetting(112, QString::number(ui->autoNightCheckBox->isChecked()));
  308. }
  309. void NewFlight::restoreSettings()
  310. {
  311. qDebug() << "Restoring Settings...";//crashes if db is empty due to QVector index out of range.
  312. ui->FunctionComboBox->setCurrentText(dbSettings::retreiveSetting(100));
  313. ui->ApproachComboBox->setCurrentText(dbSettings::retreiveSetting(101));
  314. ui->PilotFlyingCheckBox->setChecked(dbSettings::retreiveSetting(102).toInt());
  315. ui->PilotMonitoringCheckBox->setChecked(dbSettings::retreiveSetting(103).toInt());
  316. ui->TakeoffSpinBox->setValue(dbSettings::retreiveSetting(104).toInt());
  317. ui->TakeoffCheckBox->setChecked(dbSettings::retreiveSetting(105).toInt());
  318. ui->LandingSpinBox->setValue(dbSettings::retreiveSetting(106).toInt());
  319. ui->LandingCheckBox->setChecked(dbSettings::retreiveSetting(107).toInt());
  320. ui->AutolandSpinBox->setValue(dbSettings::retreiveSetting(108).toInt());
  321. ui->AutolandCheckBox->setChecked(dbSettings::retreiveSetting(109).toInt());
  322. ui->IfrCheckBox->setChecked(dbSettings::retreiveSetting(110).toInt());
  323. ui->VfrCheckBox->setChecked(dbSettings::retreiveSetting(111).toInt());
  324. ui->flightNumberPrefixLabel->setText(dbSettings::retreiveSetting(50) + QLatin1Char('-'));
  325. //ui->autoNightCheckBox->setChecked(dbSettings::retreiveSetting("112")[1].toInt());
  326. //qDebug() << "restore Settings ifr to int: " << dbSettings::retreiveSetting("110")[1].toInt();
  327. /*
  328. *
  329. * QString PilotFunction;
  330. QString PilotTask;
  331. QString TakeOff;
  332. QString Landing;
  333. QString Autoland;
  334. QString ApproachType;
  335. 100 PIC NewFlight::FunctionComboBox
  336. 101 ILS CAT I NewFlight::ApproachComboBox
  337. 102 Qt::Checked NewFlight::PilotFlyingCheckBox
  338. 103 Qt::Unchecked NewFlight::PilotMonitoringCheckBox
  339. 104 1 NewFlight::TakeoffSpinBox
  340. 105 Qt::Checked NewFlight::TakeoffCheckBox
  341. 106 1 NewFlight::LandingSpinBox
  342. 107 Qt::Checked NewFlight::LandingCheckBox
  343. 108 0 NewFlight::AutolandSpinBox
  344. 109 Qt::Unchecked NewFlight::AutolandCheckBox
  345. 110 Qt::Checked NewFlight::IfrCheckBox
  346. 111 Qt::Unchecked NewFlight::VfrCheckBox
  347. */
  348. }
  349. /*
  350. * Slots
  351. */
  352. void NewFlight::on_deptTZ_currentTextChanged(const QString &arg1)
  353. {
  354. if(arg1 == "Local"){nope();}
  355. ui->deptTZ->setCurrentIndex(0);
  356. }
  357. void NewFlight::on_destTZ_currentIndexChanged(const QString &arg1)
  358. {
  359. if(arg1 == "Local"){nope();}
  360. ui->destTZ->setCurrentIndex(0);
  361. }
  362. void NewFlight::on_newDept_textEdited(const QString &arg1)
  363. {
  364. ui->newDept->setText(arg1.toUpper());
  365. if(arg1.length()>2)
  366. {
  367. QStringList deptList = dbAirport::completeIcaoOrIata(arg1);
  368. qDebug() << "deptList = " << deptList;
  369. QCompleter *deptCompleter = new QCompleter(deptList, this);
  370. deptCompleter->setCaseSensitivity(Qt::CaseInsensitive);
  371. deptCompleter->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
  372. ui->newDept->setCompleter(deptCompleter);
  373. }
  374. }
  375. void NewFlight::on_newDept_editingFinished()
  376. {
  377. if(ui->newDept->text().length()<3)
  378. {
  379. QMessageBox msgBox(this);
  380. msgBox.setText("Please enter a 3- or 4-letter code.");
  381. msgBox.exec();
  382. ui->newDept->setText("");
  383. ui->newDept->setFocus();
  384. }
  385. QStringList deptList;
  386. if(ui->newDept->text().length()>1)
  387. {
  388. QStringList deptList = dbAirport::completeIcaoOrIata(ui->newDept->text());
  389. if(deptList.length() != 0)
  390. {
  391. dept = deptList.first();
  392. ui->newDept->setText(dept);
  393. }else
  394. {
  395. QMessageBox msgBox(this);
  396. msgBox.setText("No Airport with that name found.");
  397. msgBox.exec();
  398. ui->newDept->setText("");
  399. ui->newDept->setFocus();
  400. }
  401. }
  402. }
  403. void NewFlight::on_newDest_textEdited(const QString &arg1)
  404. {
  405. ui->newDest->setText(arg1.toUpper());
  406. if(arg1.length()>2)
  407. {
  408. QStringList destList = dbAirport::completeIcaoOrIata(arg1);
  409. QCompleter *destCompleter = new QCompleter(destList, this);
  410. destCompleter->setCaseSensitivity(Qt::CaseInsensitive);
  411. destCompleter->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
  412. ui->newDest->setCompleter(destCompleter);
  413. }
  414. }
  415. void NewFlight::on_newDest_editingFinished()
  416. {
  417. if(ui->newDest->text().length()<3)
  418. {
  419. QMessageBox msgBox(this);
  420. msgBox.setText("Please enter a 3- or 4-letter code.");
  421. msgBox.exec();
  422. ui->newDest->setText("");
  423. ui->newDest->setFocus();
  424. }
  425. QStringList destList;
  426. if(ui->newDest->text().length()>1)
  427. {
  428. QStringList destList = dbAirport::completeIcaoOrIata(ui->newDest->text());
  429. if(destList.length() != 0)
  430. {
  431. dest = destList.first();
  432. ui->newDest->setText(dest);
  433. }else
  434. {
  435. QMessageBox msgBox(this);
  436. msgBox.setText("No Airport with that name found.");
  437. msgBox.exec();
  438. ui->newDest->setText("");
  439. ui->newDest->setFocus();
  440. }
  441. }
  442. }
  443. void NewFlight::on_newDoft_editingFinished()
  444. {
  445. date = ui->newDoft->date();
  446. doft = date.toString(Qt::ISODate);
  447. }
  448. void NewFlight::on_newTofb_editingFinished()
  449. {
  450. ui->newTofb->setText(validateTimeInput(ui->newTofb->text()));
  451. tofb = QTime::fromString(ui->newTofb->text(),"hh:mm");
  452. if(!tofb.isValid()){
  453. ui->newTofb->setStyleSheet("border: 1px solid red");
  454. ui->newTofb->setFocus();
  455. }else{
  456. ui->newTofb->setStyleSheet("");
  457. }
  458. qDebug() << "New Time Off Blocks: " << tofb;
  459. }
  460. void NewFlight::on_newTonb_editingFinished()
  461. {
  462. ui->newTonb->setText(validateTimeInput(ui->newTonb->text()));
  463. tonb = QTime::fromString(ui->newTonb->text(),"hh:mm");
  464. if(!tonb.isValid()){
  465. ui->newTonb->setStyleSheet("border: 1px solid red");
  466. ui->newTonb->setFocus();
  467. }else{
  468. ui->newTonb->setStyleSheet("");
  469. }
  470. qDebug() << "New Time On Blocks: " << tonb;
  471. }
  472. void NewFlight::on_newAcft_textEdited(const QString &arg1)
  473. {
  474. if(arg1.length()>1)
  475. {
  476. QStringList acftList = dbAircraft::newAcftGetString(arg1);
  477. QCompleter *acftCompleter = new QCompleter(acftList, this);
  478. acftCompleter->setCaseSensitivity(Qt::CaseInsensitive);
  479. acftCompleter->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
  480. ui->newAcft->setCompleter(acftCompleter);
  481. }
  482. }
  483. void NewFlight::on_newAcft_editingFinished()
  484. {
  485. acft = "-1";// set invalid
  486. if(ui->newAcft->text().contains(" "))// is input from QCompleter
  487. {
  488. QStringList input = ui->newAcft->text().split(" ");
  489. QString registration = input[0].trimmed();
  490. QStringList result = dbAircraft::newAcftGetString(registration);
  491. if(result.length() > 0)
  492. {
  493. ui->newAcft->setText(result[0]);
  494. acft = dbAircraft::newAcftGetId(registration);
  495. }else
  496. {
  497. acft = "-1";
  498. }
  499. }else // is input from user
  500. {
  501. QString input = ui->newAcft->text();
  502. QStringList result = dbAircraft::newAcftGetString(input);
  503. if(result.length() > 0)
  504. {
  505. ui->newAcft->setText(result[0]);
  506. QStringList input = ui->newAcft->text().split(" ");
  507. QString registration = input[0].trimmed();
  508. acft = dbAircraft::newAcftGetId(registration);
  509. }else
  510. {
  511. acft = "-1";
  512. }
  513. }
  514. if(acft == "-1")
  515. {
  516. QMessageBox::StandardButton reply;
  517. reply = QMessageBox::question(this, "No aircraft found", "No aircraft found.\n Would you like to add a new aircraft to the database?",
  518. QMessageBox::Yes|QMessageBox::No);
  519. if (reply == QMessageBox::Yes) {
  520. NewAcft na(this);
  521. na.exec();
  522. ui->newAcft->setText("");
  523. ui->newAcft->setFocus();
  524. }
  525. }
  526. qDebug() << "Editing finished. Acft: " << acft;
  527. }
  528. void NewFlight::on_newPic_textEdited(const QString &arg1)
  529. {
  530. if(arg1.length()>2)
  531. {
  532. QStringList picList = dbPilots::newPicGetString(arg1);
  533. QCompleter *picCompleter = new QCompleter(picList, this);
  534. picCompleter->setCaseSensitivity(Qt::CaseInsensitive);
  535. picCompleter->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
  536. ui->newPic->setCompleter(picCompleter);
  537. }
  538. }
  539. void NewFlight::on_newPic_editingFinished()
  540. {
  541. pic = "-1"; // set invalid
  542. if(ui->newPic->text() == "self")
  543. {
  544. pic = "1";
  545. }else
  546. {
  547. QString picname;
  548. QStringList picList = dbPilots::newPicGetString(ui->newPic->text());
  549. qDebug() << picList;
  550. if(picList.length()!= 0)
  551. {
  552. picname = picList[0];
  553. ui->newPic->setText(picname);
  554. pic = dbPilots::newPicGetId(picname);
  555. }else
  556. {
  557. QMessageBox::StandardButton reply;
  558. reply = QMessageBox::question(this, "No Pilot found", "No pilot found.\n Would you like to add a new pilot to the database?",
  559. QMessageBox::Yes|QMessageBox::No);
  560. if (reply == QMessageBox::Yes)
  561. {
  562. qDebug() << "Add new pilot selected";
  563. nope();
  564. }
  565. }
  566. }
  567. }
  568. void NewFlight::on_secondPilotLineEdit_textEdited(const QString &arg1)
  569. {
  570. if(arg1.length()>2)
  571. {
  572. QStringList picList = dbPilots::newPicGetString(arg1);
  573. QCompleter *picCompleter = new QCompleter(picList, this);
  574. picCompleter->setCaseSensitivity(Qt::CaseInsensitive);
  575. picCompleter->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
  576. ui->secondPilotLineEdit->setCompleter(picCompleter);
  577. }
  578. }
  579. void NewFlight::on_secondPilotLineEdit_editingFinished()
  580. {
  581. secondPilot = "-1"; // set invalid
  582. if(ui->secondPilotLineEdit->text() == "self")
  583. {
  584. secondPilot = "1";
  585. }else
  586. {
  587. QString picname;
  588. QStringList picList = dbPilots::newPicGetString(ui->secondPilotLineEdit->text());
  589. qDebug() << picList;
  590. if(picList.length()!= 0)
  591. {
  592. picname = picList[0];
  593. ui->secondPilotLineEdit->setText(picname);
  594. secondPilot = dbPilots::newPicGetId(picname);
  595. }else
  596. {
  597. QMessageBox::StandardButton reply;
  598. reply = QMessageBox::question(this, "No Pilot found", "No pilot found.\n Would you like to add a new pilot to the database?",
  599. QMessageBox::Yes|QMessageBox::No);
  600. if (reply == QMessageBox::Yes)
  601. {
  602. qDebug() << "Add new pilot selected";
  603. nope();
  604. }
  605. }
  606. }
  607. }
  608. void NewFlight::on_thirdPilotLineEdit_textEdited(const QString &arg1)
  609. {
  610. if(arg1.length()>2)
  611. {
  612. QStringList picList = dbPilots::newPicGetString(arg1);
  613. QCompleter *picCompleter = new QCompleter(picList, this);
  614. picCompleter->setCaseSensitivity(Qt::CaseInsensitive);
  615. picCompleter->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
  616. ui->thirdPilotLineEdit->setCompleter(picCompleter);
  617. }
  618. }
  619. void NewFlight::on_thirdPilotLineEdit_editingFinished()
  620. {
  621. thirdPilot = "-1"; // set invalid
  622. if(ui->thirdPilotLineEdit->text() == "self")
  623. {
  624. thirdPilot = "1";
  625. }else
  626. {
  627. QString picname;
  628. QStringList picList = dbPilots::newPicGetString(ui->thirdPilotLineEdit->text());
  629. qDebug() << picList;
  630. if(picList.length()!= 0)
  631. {
  632. picname = picList[0];
  633. ui->thirdPilotLineEdit->setText(picname);
  634. thirdPilot = dbPilots::newPicGetId(picname);
  635. }else
  636. {
  637. QMessageBox::StandardButton reply;
  638. reply = QMessageBox::question(this, "No Pilot found", "No pilot found.\n Would you like to add a new pilot to the database?",
  639. QMessageBox::Yes|QMessageBox::No);
  640. if (reply == QMessageBox::Yes)
  641. {
  642. qDebug() << "Add new pilot selected";
  643. nope();
  644. }
  645. }
  646. }
  647. }
  648. void NewFlight::on_FlightNumberLineEdit_editingFinished()
  649. {
  650. qDebug() << "tbd: FlightNumber slot";
  651. // To Do: Store input in variable, perform some checks
  652. // Setting for optional Prefix (e.g. LH, LX etc.)
  653. }
  654. /*
  655. * Extras
  656. */
  657. void NewFlight::on_PilotFlyingCheckBox_stateChanged(int)
  658. {
  659. if(ui->PilotFlyingCheckBox->isChecked()){
  660. ui->TakeoffSpinBox->setValue(1);
  661. ui->TakeoffCheckBox->setCheckState(Qt::Checked);
  662. ui->LandingSpinBox->setValue(1);
  663. ui->LandingCheckBox->setCheckState(Qt::Checked);
  664. }else if(!ui->PilotFlyingCheckBox->isChecked()){
  665. ui->TakeoffSpinBox->setValue(0);
  666. ui->TakeoffCheckBox->setCheckState(Qt::Unchecked);
  667. ui->LandingSpinBox->setValue(0);
  668. ui->LandingCheckBox->setCheckState(Qt::Unchecked);
  669. }
  670. }
  671. void NewFlight::on_setAsDefaultButton_clicked()
  672. {
  673. storeSettings();
  674. }
  675. void NewFlight::on_restoreDefaultButton_clicked()
  676. {
  677. restoreSettings();
  678. }
  679. void NewFlight::on_ApproachComboBox_currentTextChanged(const QString &arg1)
  680. {
  681. if(arg1 == "ILS CAT III"){
  682. ui->AutolandCheckBox->setCheckState(Qt::Checked);
  683. ui->AutolandSpinBox->setValue(1);
  684. }else{
  685. ui->AutolandCheckBox->setCheckState(Qt::Unchecked);
  686. ui->AutolandSpinBox->setValue(0);
  687. }
  688. ApproachType = arg1;
  689. qDebug() << "Approach Type: " << ApproachType;
  690. }
  691. /*
  692. * Times
  693. */
  694. void NewFlight::on_spseTimeLineEdit_editingFinished()
  695. {
  696. ui->spseTimeLineEdit->setText(validateTimeInput(ui->spseTimeLineEdit->text()));
  697. if(ui->spseTimeLineEdit->text() == ""){
  698. ui->spseTimeLineEdit->setStyleSheet("border: 1px solid red");
  699. ui->spseTimeLineEdit->setFocus();
  700. }else{
  701. ui->spseTimeLineEdit->setStyleSheet("");
  702. }
  703. }
  704. void NewFlight::on_spmeTimeLineEdit_editingFinished()
  705. {
  706. ui->spmeTimeLineEdit->setText(validateTimeInput(ui->spmeTimeLineEdit->text()));
  707. if(ui->spmeTimeLineEdit->text() == ""){
  708. ui->spmeTimeLineEdit->setStyleSheet("border: 1px solid red");
  709. ui->spmeTimeLineEdit->setFocus();
  710. }else{
  711. ui->spmeTimeLineEdit->setStyleSheet("");
  712. }
  713. }
  714. void NewFlight::on_mpTimeLineEdit_editingFinished()
  715. {
  716. ui->mpTimeLineEdit->setText(validateTimeInput(ui->mpTimeLineEdit->text()));
  717. if(ui->mpTimeLineEdit->text() == ""){
  718. ui->mpTimeLineEdit->setStyleSheet("border: 1px solid red");
  719. ui->mpTimeLineEdit->setFocus();
  720. }else{
  721. ui->mpTimeLineEdit->setStyleSheet("");
  722. }
  723. }
  724. void NewFlight::on_totalTimeLineEdit_editingFinished()
  725. {
  726. ui->totalTimeLineEdit->setText(validateTimeInput(ui->totalTimeLineEdit->text()));
  727. if(ui->totalTimeLineEdit->text() == ""){
  728. ui->totalTimeLineEdit->setStyleSheet("border: 1px solid red");
  729. ui->totalTimeLineEdit->setFocus();
  730. }else{
  731. ui->totalTimeLineEdit->setStyleSheet("");
  732. }
  733. }
  734. void NewFlight::on_ifrTimeLineEdit_editingFinished()
  735. {
  736. ui->ifrTimeLineEdit->setText(validateTimeInput(ui->ifrTimeLineEdit->text()));
  737. if(ui->ifrTimeLineEdit->text() == ""){
  738. ui->ifrTimeLineEdit->setStyleSheet("border: 1px solid red");
  739. ui->ifrTimeLineEdit->setFocus();
  740. }else{
  741. ui->ifrTimeLineEdit->setStyleSheet("");
  742. }
  743. }
  744. void NewFlight::on_vfrTimeLineEdit_editingFinished()
  745. {
  746. ui->vfrTimeLineEdit->setText(validateTimeInput(ui->vfrTimeLineEdit->text()));
  747. if(ui->vfrTimeLineEdit->text() == ""){
  748. ui->vfrTimeLineEdit->setStyleSheet("border: 1px solid red");
  749. ui->vfrTimeLineEdit->setFocus();
  750. }else{
  751. ui->vfrTimeLineEdit->setStyleSheet("");
  752. }
  753. }
  754. void NewFlight::on_nightTimeLineEdit_editingFinished()
  755. {
  756. ui->nightTimeLineEdit->setText(validateTimeInput(ui->nightTimeLineEdit->text()));
  757. if(ui->nightTimeLineEdit->text() == ""){
  758. ui->nightTimeLineEdit->setStyleSheet("border: 1px solid red");
  759. ui->nightTimeLineEdit->setFocus();
  760. }else{
  761. ui->nightTimeLineEdit->setStyleSheet("");
  762. }
  763. }
  764. void NewFlight::on_xcTimeLineEdit_editingFinished()
  765. {
  766. ui->xcTimeLineEdit->setText(validateTimeInput(ui->xcTimeLineEdit->text()));
  767. if(ui->xcTimeLineEdit->text() == ""){
  768. ui->xcTimeLineEdit->setStyleSheet("border: 1px solid red");
  769. ui->xcTimeLineEdit->setFocus();
  770. }else{
  771. ui->xcTimeLineEdit->setStyleSheet("");
  772. }
  773. }
  774. void NewFlight::on_picTimeLineEdit_editingFinished()
  775. {
  776. ui->picTimeLineEdit->setText(validateTimeInput(ui->picTimeLineEdit->text()));
  777. if(ui->picTimeLineEdit->text() == ""){
  778. ui->picTimeLineEdit->setStyleSheet("border: 1px solid red");
  779. ui->picTimeLineEdit->setFocus();
  780. }else{
  781. ui->picTimeLineEdit->setStyleSheet("");
  782. }
  783. }
  784. void NewFlight::on_copTimeLineEdit_editingFinished()
  785. {
  786. ui->copTimeLineEdit->setText(validateTimeInput(ui->copTimeLineEdit->text()));
  787. if(ui->copTimeLineEdit->text() == ""){
  788. ui->copTimeLineEdit->setStyleSheet("border: 1px solid red");
  789. ui->copTimeLineEdit->setFocus();
  790. }else{
  791. ui->copTimeLineEdit->setStyleSheet("");
  792. }
  793. }
  794. void NewFlight::on_dualTimeLineEdit_editingFinished()
  795. {
  796. ui->dualTimeLineEdit->setText(validateTimeInput(ui->dualTimeLineEdit->text()));
  797. if(ui->dualTimeLineEdit->text() == ""){
  798. ui->dualTimeLineEdit->setStyleSheet("border: 1px solid red");
  799. ui->dualTimeLineEdit->setFocus();
  800. }else{
  801. ui->dualTimeLineEdit->setStyleSheet("");
  802. }
  803. }
  804. void NewFlight::on_fiTimeLineEdit_editingFinished()
  805. {
  806. ui->fiTimeLineEdit->setText(validateTimeInput(ui->fiTimeLineEdit->text()));
  807. if(ui->fiTimeLineEdit->text() == ""){
  808. ui->fiTimeLineEdit->setStyleSheet("border: 1px solid red");
  809. ui->fiTimeLineEdit->setFocus();
  810. }else{
  811. ui->fiTimeLineEdit->setStyleSheet("");
  812. }
  813. }
  814. void NewFlight::on_simTimeLineEdit_editingFinished()
  815. {
  816. ui->simTimeLineEdit->setText(validateTimeInput(ui->simTimeLineEdit->text()));
  817. if(ui->simTimeLineEdit->text() == ""){
  818. ui->simTimeLineEdit->setStyleSheet("border: 1px solid red");
  819. ui->simTimeLineEdit->setFocus();
  820. }else{
  821. ui->simTimeLineEdit->setStyleSheet("");
  822. }
  823. }
  824. /*
  825. * Control Buttons
  826. */
  827. void NewFlight::on_buttonBox_accepted()
  828. {
  829. on_newDoft_editingFinished();// - activate slots in case user has been active in last input before clicking submit
  830. on_newTonb_editingFinished();
  831. on_newTofb_editingFinished();
  832. on_newDept_editingFinished();
  833. on_newDest_editingFinished();
  834. on_newAcft_editingFinished();
  835. on_newPic_editingFinished();
  836. QVector<QString> flight;
  837. flight = collectInput();
  838. if(verifyInput())
  839. {
  840. dbFlight::commitFlight(flight);
  841. qDebug() << flight << "Has been commited.";
  842. QMessageBox msgBox(this);
  843. msgBox.setText("Flight has been commited.");
  844. msgBox.exec();
  845. }else
  846. {
  847. qDebug() << "Invalid Input. No entry has been made in the database.";
  848. dbFlight::commitToScratchpad(flight);
  849. QMessageBox msgBox(this);
  850. msgBox.setText("Invalid entries detected. Please check your input.");
  851. msgBox.exec();
  852. NewFlight nf(this);
  853. nf.exec();
  854. }
  855. }
  856. void NewFlight::on_buttonBox_rejected()
  857. {
  858. qDebug() << "NewFlight: Rejected\n";
  859. }