Просмотр исходного кода

addNewPilot and addNewTail in NewNewFlightDialog

- implemented adding new pilots and tails to the NNF Dialog
- addad a resizeEvent() override in MainWindow to dynamically resize the Toolbar according to the window size
- added a QString() overload to AEntry to enable QDebug compatibility
Felix Turo 3 лет назад
Родитель
Сommit
1930d6fefd

+ 0 - 7
mainwindow.cpp

@@ -32,10 +32,6 @@ void MainWindow::doDebugStuff()
 {
     NewNewFlightDialog nf(completionData, this);
     nf.exec();
-    //QString location = "KJFK";
-    //QString time = "22:40";
-    //QDateTime date_time = ADateTime::fromString(QDate::currentDate().toString(Qt::ISODate) + time);
-    //DEB << "Night at " << location << " at " << date_time << ACalc::isNight(location, date_time, -6);
 }
 MainWindow::MainWindow(QWidget *parent)
     : QMainWindow(parent)
@@ -131,9 +127,6 @@ MainWindow::MainWindow(QWidget *parent)
     toolBar->addAction(ui->actionSettings);
     ui->actionQuit->setIcon(QIcon(Opl::Assets::ICON_TOOLBAR_QUIT));
     toolBar->addAction(ui->actionQuit);
-
-    int icon_size = (this->height() / 8) * 0.95;
-    toolBar->setIconSize(QSize(icon_size, icon_size));
     toolBar->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum);
     addToolBar(Qt::ToolBarArea::LeftToolBarArea, toolBar);
 

+ 11 - 0
mainwindow.h

@@ -27,6 +27,7 @@
 #include <QDir>
 #include <QFile>
 #include <QKeyEvent>
+#include <QToolBar>
 
 #include "src/gui/widgets/homewidget.h"
 #include "src/gui/widgets/settingswidget.h"
@@ -126,5 +127,15 @@ protected:
             }
         }
     }
+
+    /*!
+     * \brief resizeEvent Resize the Toolbar's icon size to match the window height
+     */
+    void resizeEvent(QResizeEvent *event) override
+    {
+        int icon_size = (this->height() / 12);
+        auto tool_bar = this->findChild<QToolBar*>();
+        tool_bar->setIconSize(QSize(icon_size, icon_size));
+    }
 };
 #endif // MAINWINDOW_H

+ 8 - 2
mainwindow.ui

@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>1024</width>
-    <height>768</height>
+    <width>1280</width>
+    <height>800</height>
    </rect>
   </property>
   <property name="sizePolicy">
@@ -16,6 +16,12 @@
     <verstretch>0</verstretch>
    </sizepolicy>
   </property>
+  <property name="minimumSize">
+   <size>
+    <width>1280</width>
+    <height>800</height>
+   </size>
+  </property>
   <property name="maximumSize">
    <size>
     <width>16777215</width>

+ 43 - 0
src/classes/aentry.cpp

@@ -48,3 +48,46 @@ const RowData_T& AEntry::getData() const
 {
     return tableData;
 }
+
+AEntry::operator QString() const
+{
+    QString out("\033[32m[Entry Data]:\t\033[m\n");
+    int item_count = 0;
+    QMap<ColName_T, ColData_T>::const_iterator i;
+    for (i = tableData.constBegin(); i!= tableData.constEnd(); ++i) {
+        QString spacer(":");
+        int spaces = (14 - i.key().length());
+        if (spaces > 0)
+            for (int i = 0; i < spaces ; i++)
+                spacer += QLatin1Char(' ');
+        if (i.value().toString().isEmpty()) {
+            out.append(QLatin1String("\t\033[m") + i.key()
+                       + spacer
+                       + QLatin1String("\033[35m----"));
+            spaces = (14 - i.value().toString().length());
+            spacer = QString();
+            if (spaces > 0)
+                for (int i = 0; i < spaces ; i++)
+                    spacer += QLatin1Char(' ');
+            out.append(spacer);
+        } else {
+            out.append(QLatin1String("\t\033[m") + i.key()
+                       + spacer
+                       + QLatin1String("\033[35m")
+                       + i.value().toString());
+
+            spaces = (14 - i.value().toString().length());
+            spacer = QString();
+            if (spaces > 0)
+                for (int i = 0; i < spaces ; i++)
+                    spacer += QLatin1Char(' ');
+            out.append(spacer);
+        }
+        item_count ++;
+        if (item_count % 4 == 0)
+            out.append(QLatin1String("\n"));
+    }
+    out.append(QLatin1String("\n"));
+    QTextStream(stdout) << out;
+    return QString();
+}

+ 6 - 0
src/classes/aentry.h

@@ -49,6 +49,12 @@ public:
     const DataPosition& getPosition() const;
     const RowData_T& getData() const;
 
+    /*!
+     * \brief operator QString provides compatibilty with QDebug() - prints
+     * the tableData in a readable formatting to stdout
+     */
+    operator QString() const;
+
 };
 
 #endif // AENTRY_H

+ 134 - 18
src/gui/dialogues/newnewflightdialog.cpp

@@ -6,6 +6,8 @@
 #include "src/classes/asettings.h"
 #include "src/functions/acalc.h"
 #include "src/functions/adatetime.h"
+#include "src/gui/dialogues/newtaildialog.h"
+#include "src/gui/dialogues/newpilotdialog.h"
 #include <QDateTime>
 #include <QCompleter>
 #include <QKeyEvent>
@@ -17,7 +19,23 @@ NewNewFlightDialog::NewNewFlightDialog(ACompletionData &completion_data,
       completionData(completion_data)
 {
     ui->setupUi(this);
+    flightEntry = AFlightEntry();
     init();
+    // Set up UI (New Flight)
+    LOG << ASettings::read(ASettings::FlightLogging::Function);
+    if(ASettings::read(ASettings::FlightLogging::Function).toString() == QLatin1String("PIC")){
+        ui->picNameLineEdit->setText(self);
+        ui->functionComboBox->setCurrentIndex(0);
+        emit ui->picNameLineEdit->editingFinished();
+    }
+    if (ASettings::read(ASettings::FlightLogging::Function).toString() == QLatin1String("SIC")) {
+        ui->sicNameLineEdit->setText(self);
+        ui->functionComboBox->setCurrentIndex(2);
+        emit ui->sicNameLineEdit->editingFinished();
+    }
+
+    ui->doftLineEdit->setText(QDate::currentDate().toString(Qt::ISODate));
+    emit ui->doftLineEdit->editingFinished();
 }
 
 NewNewFlightDialog::~NewNewFlightDialog()
@@ -47,9 +65,6 @@ void NewNewFlightDialog::init()
     setupRawInputValidation();
     setupSignalsAndSlots();
     readSettings();
-
-    ui->doftLineEdit->setText(QDate::currentDate().toString(Qt::ISODate));
-    emit ui->doftLineEdit->editingFinished();
 }
 
 /*!
@@ -154,6 +169,85 @@ void NewNewFlightDialog::updateBlockTimeLabel()
     ui->tblkDisplayLabel->setText(ATime::toString(tblk));
 }
 
+/*!
+ * \brief NewNewFlightDialog::addNewTail If the user input is not in the aircraftList, the user
+ * is prompted if he wants to add a new entry to the database
+ */
+void NewNewFlightDialog::addNewTail(QLineEdit& parent_line_edit)
+{
+    QMessageBox::StandardButton reply;
+    reply = QMessageBox::question(this, tr("No Aircraft found"),
+                                  tr("No aircraft with this registration found.<br>"
+                                     "If this is the first time you log a flight with this aircraft, "
+                                     "you have to add the registration to the database first."
+                                     "<br><br>Would you like to add a new aircraft to the database?"),
+                                  QMessageBox::Yes|QMessageBox::No);
+    if (reply == QMessageBox::Yes) {
+        // create and open new aircraft dialog
+        NewTailDialog nt(ui->acftLineEdit->text(), this);
+        int ret = nt.exec();
+        // update map and list, set line edit
+        if (ret == QDialog::Accepted) {
+            DEB << "New Tail Entry added:";
+            DEB << aDB->getTailEntry(aDB->getLastEntry(ADatabaseTable::tails));
+
+            // update completion Data and Completer
+            completionData.updateTails();
+            auto new_model = new QStringListModel(completionData.tailsList, parent_line_edit.completer());
+            parent_line_edit.completer()->setModel(new_model); //setModel deletes old model if it has the completer as parent
+
+            // update Line Edit
+            parent_line_edit.setText(completionData.tailsIdMap.value(aDB->getLastEntry(ADatabaseTable::tails)));
+            emit parent_line_edit.editingFinished();
+        } else {
+            parent_line_edit.setText(QString());
+            parent_line_edit.setFocus();
+        }
+    } else {
+        parent_line_edit.setText(QString());
+        parent_line_edit.setFocus();
+    }
+}
+
+/*!
+ * \brief NewNewFlightDialog::addNewPilot If the user input is not in the pilotNameList, the user
+ * is prompted if he wants to add a new entry to the database
+ */
+void NewNewFlightDialog::addNewPilot(QLineEdit& parent_line_edit)
+{
+    QMessageBox::StandardButton reply;
+    reply = QMessageBox::question(this, tr("No Pilot found"),
+                                  tr("No pilot found.<br>Please enter the Name as"
+                                     "<br><br><center><b>Lastname, Firstname</b></center><br><br>"
+                                     "If this is the first time you log a flight with this pilot, "
+                                     "you have to add the pilot to the database first."
+                                     "<br><br>Would you like to add a new pilot to the database?"),
+                                  QMessageBox::Yes|QMessageBox::No);
+    if (reply == QMessageBox::Yes) {
+        // create and open new pilot dialog
+        NewPilotDialog np(this);
+        int ret = np.exec();
+        // update map and list, set line edit
+        if (ret == QDialog::Accepted) {
+            DEB << "New Pilot Entry added:";
+            DEB << aDB->getPilotEntry(aDB->getLastEntry(ADatabaseTable::pilots));
+            // update completion Data and Completer
+            completionData.updatePilots();
+            auto new_model = new QStringListModel(completionData.pilotList, parent_line_edit.completer());
+            parent_line_edit.completer()->setModel(new_model); //setModel deletes old model if it has the completer as parent
+
+            // update Line Edit
+            parent_line_edit.setText(completionData.pilotsIdMap.value(aDB->getLastEntry(ADatabaseTable::pilots)));
+            emit parent_line_edit.editingFinished();
+        } else {
+            parent_line_edit.setText(QString());
+            parent_line_edit.setFocus();
+        }
+    } else {
+        parent_line_edit.setText(QString());
+    }
+}
+
 RowData_T NewNewFlightDialog::prepareFlightEntryData()
 {
     if(!validationState.allValid())
@@ -242,11 +336,9 @@ RowData_T NewNewFlightDialog::prepareFlightEntryData()
     new_data.insert(Opl::Db::FLIGHTS_APPROACHTYPE, ui->approachComboBox->currentText());
     new_data.insert(Opl::Db::FLIGHTS_FLIGHTNUMBER, ui->flightNumberLineEdit->text());
     new_data.insert(Opl::Db::FLIGHTS_REMARKS, ui->remarksLineEdit->text());
-    DEB << "New Flight Data: " << new_data;
     return new_data;
 }
 
-
 /*!
  * \brief NewNewFlightDialog::updateNightCheckBoxes updates the check boxes for take-off and landing
  * at night. Returns the number of minutes of night time.
@@ -313,12 +405,18 @@ void NewNewFlightDialog::onPilotNameLineEdit_editingFinshed()
     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);
+
         onGoodInputReceived(line_edit);
         return;
     }
 
-    if(completionData.pilotsIdMap.key(line_edit->text()) != 0) {
-        DEB << "Mapped: " << line_edit->text() << completionData.pilotsIdMap.key(line_edit->text());
+    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;
     }
@@ -335,8 +433,7 @@ void NewNewFlightDialog::onPilotNameLineEdit_editingFinshed()
     }
 
     onBadInputReceived(line_edit);
-    TODO << "Add new Pilot...";
-    //addNewPilot(line_edit);
+    addNewPilot(*line_edit);
 }
 
 void NewNewFlightDialog::onLocationLineEdit_editingFinished()
@@ -395,7 +492,8 @@ void NewNewFlightDialog::on_acftLineEdit_editingFinished()
     // Mark as bad input and prompt for adding new tail
     onBadInputReceived(line_edit);
     ui->acftDisplayLabel->setText(tr("Unknown Registration."));
-    TODO << "Add new tail..";
+    if (!(line_edit->text() == QString()))
+        addNewTail(*line_edit);
 }
 
 void NewNewFlightDialog::on_doftLineEdit_editingFinished()
@@ -403,7 +501,6 @@ void NewNewFlightDialog::on_doftLineEdit_editingFinished()
     const auto line_edit = ui->doftLineEdit;
     auto text = ui->doftLineEdit->text();
     auto label = ui->doftDisplayLabel;
-    //DEB << line_edit->objectName() << "Editing finished - " << text;
 
     TODO << "Non-default Date formats not implemented yet.";
     Opl::Date::ADateFormat date_format = Opl::Date::ADateFormat::ISODate;
@@ -436,13 +533,30 @@ void NewNewFlightDialog::on_approachComboBox_currentTextChanged(const QString &a
         INFO(tr("Please specify the approach type in the remarks field."));
 }
 
-void NewNewFlightDialog::on_buttonBox_accepted()
+/*!
+ * \brief NewNewFlightDialog::on_functionComboBox_currentIndexChanged
+ * If the Function Combo Box is selected to be either PIC or SIC, fill the corresponding
+ * nameLineEdit with the logbook owner's name, then check for duplication.
+ */
+void NewNewFlightDialog::on_functionComboBox_currentIndexChanged(int index)
 {
-    // emit editing finished for all mandatory line edits to trigger input verification
-    //for (const auto &line_edit : *mandatoryLineEdits) {
-    //    emit line_edit->editingFinished();
-    //}
+    if (index == 0) {
+        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) {
+        ui->sicNameLineEdit->setText(self);
+        emit ui->sicNameLineEdit->editingFinished();
+        if (completionData.pilotsIdMap.key(ui->picNameLineEdit->text())
+         == completionData.pilotsIdMap.key(ui->sicNameLineEdit->text()))
+            ui->picNameLineEdit->setText(QString());
+    }
+}
 
+void NewNewFlightDialog::on_buttonBox_accepted()
+{
     // If input verification is passed, continue, otherwise prompt user to correct
     if (!validationState.allValid()) {
         const auto display_names = QMap<ValidationItem, QString> {
@@ -470,9 +584,11 @@ void NewNewFlightDialog::on_buttonBox_accepted()
 
     // If input verification passed, collect input and submit to database
     auto newData = prepareFlightEntryData();
+
     //DEB << "Setting Data for flightEntry...";
-    //flightEntry.setData(newData);
-    //DEB << "Committing...";
+    flightEntry.setData(newData);
+    DEB << "Committing: ";
+    DEB << flightEntry;
     //if (!aDB->commit(flightEntry)) {
     //    WARN(tr("The following error has ocurred:"
     //                           "<br><br>%1<br><br>"

+ 20 - 10
src/gui/dialogues/newnewflightdialog.h

@@ -44,14 +44,15 @@ public:
 
     // Debug
     void printValidationStatus(){
-        QString deb_string("Validation State:\tdoft\tdept\tdest\ttofb\ttonb\tpic\tacft\n");
-        deb_string += "\t\t\t\t\t" + QString::number(validationArray[0]);
-        deb_string += "\t" + QString::number(validationArray[1]);
-        deb_string += "\t" + QString::number(validationArray[2]);
-        deb_string += "\t" + QString::number(validationArray[3]);
-        deb_string += "\t" + QString::number(validationArray[4]);
-        deb_string += "\t" + QString::number(validationArray[5]);
-        deb_string += "\t" + QString::number(validationArray[6]);
+        QString deb_string("\033[mValidation State:\tdoft\tdept\tdest\ttofb\ttonb\tpic\tacft\n");
+        deb_string += "\t\t\t\t";
+        for (int i = 0; i < 7; i++) { //\033[32m
+            if (validationArray[i])
+                deb_string += "\t\033[32m" + QString::number(validationArray[i]);
+            else
+                deb_string += "\t\033[31m" + QString::number(validationArray[i]);
+        }
+        deb_string += QLatin1String("\u001b[38;5;75m"); // return to default DEB
         qDebug().noquote() << deb_string;
     }
 private:
@@ -87,6 +88,7 @@ class NewNewFlightDialog : public QDialog
     Q_OBJECT
 
 public:
+
     explicit NewNewFlightDialog(ACompletionData& completion_data, QWidget *parent = nullptr);
     ~NewNewFlightDialog();
 
@@ -95,6 +97,13 @@ private:
     ACompletionData completionData;
     ValidationState validationState;
 
+    /*!
+     * \brief a AFlightEntry object that is used to store either position data
+     * from an old entry, is used to fill the form for editing an entry, or is
+     * filled with new data for adding a new entry to the logbook.
+     */
+    AFlightEntry flightEntry;
+
     static const inline QList<QLineEdit*>* timeLineEdits;
     static const inline QList<QLineEdit*>* locationLineEdits;
     static const inline QList<QLineEdit*>* pilotNameLineEdits;
@@ -113,8 +122,8 @@ private:
     void setNightCheckboxes();
     void updateBlockTimeLabel();
 
-    void addNewTail();
-    void addNewPilot(QLineEdit* line_edit);
+    void addNewTail(QLineEdit& parent_line_edit);
+    void addNewPilot(QLineEdit& parent_line_edit);
 
     RowData_T prepareFlightEntryData();
 
@@ -129,6 +138,7 @@ private slots:
     void on_buttonBox_accepted();
     void on_pilotFlyingCheckBox_stateChanged(int arg1);
     void on_approachComboBox_currentTextChanged(const QString &arg1);
+    void on_functionComboBox_currentIndexChanged(int index);
 };