Procházet zdrojové kódy

Some optimisations / fixes for NewFlightDialog

- Added some checks for incompatible selections of pilot functions, cross-checking PIC name and the value of pilotFunctionComboBox. This fixes #85
- Removed unneeded emissions of editingFinished() Signal
Felix Turo před 3 roky
rodič
revize
080b52818f

+ 1 - 1
src/functions/adate.h

@@ -6,7 +6,7 @@ const static auto ISO = QStringLiteral("yyyy-MM-dd");
 const static auto DE = QStringLiteral("dd.MM.yyyy");
 const static auto EN = QStringLiteral("MM/dd/yyyy");
 
-const static QHash<OPL::DateFormat, QString> ADATEFORMATSMAP = {
+const static QMap<OPL::DateFormat, QString> ADATEFORMATSMAP = {
     {OPL::DateFormat::ISODate, ISO},
     {OPL::DateFormat::DE,      DE },
     {OPL::DateFormat::EN,      EN },

+ 47 - 18
src/gui/dialogues/newflightdialog.cpp

@@ -209,9 +209,6 @@ void NewFlightDialog::fillWithEntryData()
     ui->sicNameLineEdit->setText(completionData.pilotsIdMap.value(flightEntry.getData().value(OPL::Db::FLIGHTS_SECONDPILOT).toInt()));
     ui->thirdPilotNameLineEdit->setText(completionData.pilotsIdMap.value(flightEntry.getData().value(OPL::Db::FLIGHTS_THIRDPILOT).toInt()));
 
-    for (const auto& le : *mandatoryLineEdits)
-        emit le->editingFinished();
-
     //Function
     const QHash<int, QString> functions = {
         {0, OPL::Db::FLIGHTS_TPIC},
@@ -264,7 +261,6 @@ void NewFlightDialog::onGoodInputReceived(QLineEdit *line_edit)
         if (validationState.nightDataValid())
             updateNightCheckBoxes();
     }
-        validationState.printValidationStatus();
 }
 
 void NewFlightDialog::onBadInputReceived(QLineEdit *line_edit)
@@ -429,6 +425,7 @@ RowData_T NewFlightDialog::prepareFlightEntryData()
     const int& function_index = ui->functionComboBox->currentIndex();
     switch (function_index) {
     case 4:
+        LOG << "Function FI";
         for (int i = 0; i < 5; i++){
             if(i == 0 || i == 4)
                 new_data.insert(function_times[i], block_minutes);
@@ -537,23 +534,19 @@ void NewFlightDialog::onPilotNameLineEdit_editingFinshed()
     auto line_edit = this->findChild<QLineEdit*>(sender()->objectName());
     DEB << line_edit->objectName() << "Editing Finished -" << line_edit->text();
 
+    int pilot_id = 0;
+
+    // Check for self and try mapping to rowid
     if(line_edit->text().contains(self, Qt::CaseInsensitive)) {
         DEB << "self recognized.";
         line_edit->setText(completionData.pilotsIdMap.value(1));
-        if (line_edit->objectName() == QLatin1String("picNameLineEdit"))
-            ui->functionComboBox->setCurrentIndex(0);
-        else if (line_edit->objectName() == QLatin1String("sicNameLineEdit"))
-            ui->functionComboBox->setCurrentIndex(2);
+        pilot_id = 1;
+    } else
+        pilot_id = completionData.pilotsIdMap.key(line_edit->text());
 
-        onGoodInputReceived(line_edit);
-        return;
-    }
 
-    int pilot_id = completionData.pilotsIdMap.key(line_edit->text());
     if(pilot_id != 0) {
         DEB << "Mapped: " << line_edit->text() << pilot_id;
-        if (line_edit->objectName() == QLatin1String("picNameLineEdit") && pilot_id == 1)
-            ui->functionComboBox->setCurrentIndex(0);
         onGoodInputReceived(line_edit);
         return;
     }
@@ -571,6 +564,7 @@ void NewFlightDialog::onPilotNameLineEdit_editingFinshed()
         return;
     }
 
+    // Fall through to adding new pilot to database
     if(!addNewPilot(*line_edit))
         onBadInputReceived(line_edit);
 }
@@ -675,13 +669,14 @@ void NewFlightDialog::on_approachComboBox_currentTextChanged(const QString &arg1
  */
 void NewFlightDialog::on_functionComboBox_currentIndexChanged(int index)
 {
-    if (index == 0) {
+    DEB << "Current Index: " << index;
+    if (index == OPL::PilotFunction::PIC) {
         ui->picNameLineEdit->setText(self);
         emit ui->picNameLineEdit->editingFinished();
         if (completionData.pilotsIdMap.key(ui->picNameLineEdit->text())
          == completionData.pilotsIdMap.key(ui->sicNameLineEdit->text()))
                 ui->sicNameLineEdit->setText(QString());
-    } else if (index == 2) {
+    } else if (index == OPL::PilotFunction::SIC) {
         ui->sicNameLineEdit->setText(self);
         emit ui->sicNameLineEdit->editingFinished();
         if (completionData.pilotsIdMap.key(ui->picNameLineEdit->text())
@@ -690,6 +685,37 @@ void NewFlightDialog::on_functionComboBox_currentIndexChanged(int index)
     }
 }
 
+/*!
+ * \brief NewFlightDialog::checkPilotFunctionsValid checks if there are incompatible selections made on Pilot Function.
+ * \details Checks for 2 cases in which there might be a discrepancy between the PilotNameLineEdit and the functionComboBox:
+ * - If the pilotNameLineEdit's value is self, but the functionComboBox has been manually selected to be different from either
+ * PIC or FI
+ * - If the functionComboBox has been set to PIC but the pilotNameLineEdit is not self
+ * \param error_msg - the error string displayed to the user
+ * \return
+ */
+bool NewFlightDialog::checkPilotFunctionsValid()
+{
+    int pic_id = completionData.pilotsIdMap.key(ui->picNameLineEdit->text());
+    int function_index = ui->functionComboBox->currentIndex();
+
+    if (pic_id == 1) {
+        if (!(function_index == OPL::PilotFunction::PIC || function_index == OPL::PilotFunction::FI)) {
+            INFO(tr("The PIC is set to %1 but the Pilot Function is set to %2")
+                    .arg(ui->picNameLineEdit->text(), ui->functionComboBox->currentText()));
+            return false;
+        }
+    } else {
+        if (function_index == OPL::PilotFunction::PIC || function_index == OPL::PilotFunction::FI) {
+            INFO(tr("The Pilot Function is set to %1, but the PIC is set to %2")
+                    .arg(ui->functionComboBox->currentText(), ui->picNameLineEdit->text()));
+            return false;
+        }
+    }
+
+    return true;
+}
+
 /*!
  * \brief NewFlightDialog::on_buttonBox_accepted - checks for validity and commits the form data to the database
  * \details When the user is ready to submit a flight entry, a final check for valid entries is made, and the user
@@ -699,8 +725,8 @@ void NewFlightDialog::on_functionComboBox_currentIndexChanged(int index)
  */
 void NewFlightDialog::on_buttonBox_accepted()
 {
-    for (const auto& line_edit : *mandatoryLineEdits)
-        emit line_edit->editingFinished();
+    // Debug
+    validationState.printValidationStatus();
     // If input verification is passed, continue, otherwise prompt user to correct
     if (!validationState.allValid()) {
         const auto display_names = QHash<ValidationItem, QString> {
@@ -725,6 +751,9 @@ void NewFlightDialog::on_buttonBox_accepted()
         return;
     }
 
+    if(!checkPilotFunctionsValid())
+        return;
+
     // If input verification passed, collect input and submit to database
     auto newData = prepareFlightEntryData();
     DEB << "Old Data: ";

+ 3 - 1
src/gui/dialogues/newflightdialog.h

@@ -173,13 +173,15 @@ private:
      */
     void onBadInputReceived(QLineEdit *line_edit);
 
+    void updateBlockTimeLabel();
     void updateNightCheckBoxes();
     void setNightCheckboxes();
-    void updateBlockTimeLabel();
 
     bool addNewTail(QLineEdit& parent_line_edit);
     bool addNewPilot(QLineEdit& parent_line_edit);
 
+
+    bool checkPilotFunctionsValid();
     RowData_T prepareFlightEntryData();
 
 

+ 3 - 0
src/gui/dialogues/newflightdialog.ui

@@ -155,6 +155,9 @@
            <height>16777215</height>
           </size>
          </property>
+         <property name="placeholderText">
+          <string>YYYY-MM-DD</string>
+         </property>
         </widget>
        </item>
        <item row="2" column="0">