Browse Source

Improved Data Flow of Completer and Mapping Data

Encapsulated completion data in ACompletionData class which handles initial retrieval from database as well as updating if required. The ACompletionData object can be shared by all recipients that require completion data, reducing DB access to a minimum.
Felix Turo 3 years ago
parent
commit
1017f212df

+ 2 - 0
CMakeLists.txt

@@ -23,6 +23,7 @@ find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets Sql Network LinguistTools
 set(PROJECT_SOURCES
 set(PROJECT_SOURCES
     main.cpp
     main.cpp
     mainwindow.cpp
     mainwindow.cpp
+    src/classes/acompletiondata.cpp
     src/classes/acurrencyentry.cpp
     src/classes/acurrencyentry.cpp
     src/classes/astyle.cpp
     src/classes/astyle.cpp
     src/classes/astandardpaths.cpp
     src/classes/astandardpaths.cpp
@@ -60,6 +61,7 @@ set(PROJECT_SOURCES
     
     
     src/opl.h
     src/opl.h
     mainwindow.h
     mainwindow.h
+    src/classes/acompletiondata.h
     src/classes/acurrencyentry.h
     src/classes/acurrencyentry.h
     src/classes/astyle.h
     src/classes/astyle.h
     src/classes/astandardpaths.h
     src/classes/astandardpaths.h

+ 0 - 0
openPilotLog.pro → DEPRECATED_INOP_openPilotLog.pro


+ 4 - 29
mainwindow.cpp

@@ -37,7 +37,7 @@ MainWindow::MainWindow(QWidget *parent)
     }
     }
 
 
     // retreive completion lists and maps
     // retreive completion lists and maps
-    updateCompleters();
+    completionData = ACompletionData();
 
 
     // Create a spacer for the toolbar to separate left and right parts
     // Create a spacer for the toolbar to separate left and right parts
     auto *spacer = new QWidget();
     auto *spacer = new QWidget();
@@ -64,7 +64,7 @@ MainWindow::MainWindow(QWidget *parent)
     // Construct Widgets
     // Construct Widgets
     homeWidget = new HomeWidget(this);
     homeWidget = new HomeWidget(this);
     ui->stackedWidget->addWidget(homeWidget);
     ui->stackedWidget->addWidget(homeWidget);
-    logbookWidget = new LogbookWidget(this);
+    logbookWidget = new LogbookWidget(completionData, this);
     ui->stackedWidget->addWidget(logbookWidget);
     ui->stackedWidget->addWidget(logbookWidget);
     aircraftWidget = new AircraftWidget(this);
     aircraftWidget = new AircraftWidget(this);
     ui->stackedWidget->addWidget(aircraftWidget);
     ui->stackedWidget->addWidget(aircraftWidget);
@@ -153,37 +153,12 @@ void MainWindow::on_actionHome_triggered()
 void MainWindow::on_actionNewFlight_triggered()
 void MainWindow::on_actionNewFlight_triggered()
 {
 {
     auto old_state = aDB->getUserDataState();
     auto old_state = aDB->getUserDataState();
-    NewFlightDialog nf(pilotsIdMap,
-                       tailsIdMap,
-                       airportIcaoIdMap,
-                       airportIataIdMap,
-                       airportNameIdMap,
-                       pilotList,
-                       tailsList,
-                       airportList,
+    NewFlightDialog nf(completionData,
                        this);
                        this);
     nf.exec();
     nf.exec();
     auto new_state = aDB->getUserDataState();
     auto new_state = aDB->getUserDataState();
     if (old_state != new_state)
     if (old_state != new_state)
-        updateCompleters(false); // partial update only
-}
-
-void MainWindow::updateCompleters(bool full_update)
-{
-    DEB << "Retreiving completion data. Full Update?" << full_update;
-    // retreive user modifiable data
-    pilotList   = aDB->getCompletionList(ADatabaseTarget::pilots);
-    tailsList   = aDB->getCompletionList(ADatabaseTarget::registrations);
-    pilotsIdMap = aDB->getIdMap(ADatabaseTarget::pilots);
-    tailsIdMap  = aDB->getIdMap(ADatabaseTarget::tails);
-
-    // retreive default data
-    if (full_update) {
-        airportIcaoIdMap = aDB->getIdMap(ADatabaseTarget::airport_identifier_icao);
-        airportIataIdMap = aDB->getIdMap(ADatabaseTarget::airport_identifier_iata);
-        airportNameIdMap = aDB->getIdMap(ADatabaseTarget::airport_names);
-        airportList      = aDB->getCompletionList(ADatabaseTarget::airport_identifier_all);
-    }
+        completionData.update();
 }
 }
 
 
 void MainWindow::on_actionLogbook_triggered()
 void MainWindow::on_actionLogbook_triggered()

+ 4 - 16
mainwindow.h

@@ -39,8 +39,10 @@
 #include "src/gui/dialogues/newpilotdialog.h"
 #include "src/gui/dialogues/newpilotdialog.h"
 #include "src/gui/dialogues/newflightdialog.h"
 #include "src/gui/dialogues/newflightdialog.h"
 #include "src/classes/arunguard.h"
 #include "src/classes/arunguard.h"
+#include "src/classes/acompletiondata.h"
 #include "src/testing/atimer.h"
 #include "src/testing/atimer.h"
 
 
+
 QT_BEGIN_NAMESPACE
 QT_BEGIN_NAMESPACE
 namespace Ui {
 namespace Ui {
 class MainWindow;
 class MainWindow;
@@ -100,22 +102,8 @@ private:
 
 
     void connectWidgets();
     void connectWidgets();
 
 
-    // Completion Lists for children
-    QMap<PilotName_T, PilotRowId_T> pilotsIdMap;
-    QMap<TailRegistration_T, TailId_T> tailsIdMap;
-    QMap<AirportICAO_T, AirportId_T> airportIcaoIdMap;
-    QMap<AirportIATA_T, AirportId_T> airportIataIdMap;
-    QMap<AirportName_T, AirportId_T> airportNameIdMap;
-    QStringList pilotList;
-    QStringList tailsList;
-    QStringList airportList;
-
-    /*!
-     * \brief Retreives template and user data used for QCompleters and key to entry mapping
-     * from the database. Full update retreives all needed data, partial update only refreshes
-     * data from the user modifiable tables
-     */
-    void updateCompleters(bool full_update = true);
+    // Completion Data for QCompleters and Mapping
+    ACompletionData completionData;
 
 
 protected:
 protected:
     /*!
     /*!

+ 38 - 0
src/classes/acompletiondata.cpp

@@ -0,0 +1,38 @@
+#include "acompletiondata.h"
+
+ACompletionData::ACompletionData()
+{
+    // retreive user modifiable data
+    pilotList   = aDB->getCompletionList(ADatabaseTarget::pilots);
+    tailsList   = aDB->getCompletionList(ADatabaseTarget::registrations);
+    pilotsIdMap = aDB->getIdMap(ADatabaseTarget::pilots);
+    tailsIdMap  = aDB->getIdMap(ADatabaseTarget::tails);
+
+    // retreive default data
+    airportIcaoIdMap = aDB->getIdMap(ADatabaseTarget::airport_identifier_icao);
+    airportIataIdMap = aDB->getIdMap(ADatabaseTarget::airport_identifier_iata);
+    airportNameIdMap = aDB->getIdMap(ADatabaseTarget::airport_names);
+    airportList      = aDB->getCompletionList(ADatabaseTarget::airport_identifier_all);
+
+}
+
+void ACompletionData::update()
+{
+    // retreive user modifiable data
+    pilotList   = aDB->getCompletionList(ADatabaseTarget::pilots);
+    tailsList   = aDB->getCompletionList(ADatabaseTarget::registrations);
+    pilotsIdMap = aDB->getIdMap(ADatabaseTarget::pilots);
+    tailsIdMap  = aDB->getIdMap(ADatabaseTarget::tails);
+}
+
+void ACompletionData::updateTails()
+{
+    tailsIdMap  = aDB->getIdMap(ADatabaseTarget::tails);
+    tailsList   = aDB->getCompletionList(ADatabaseTarget::registrations);
+}
+
+void ACompletionData::updatePilots()
+{
+    pilotsIdMap  = aDB->getIdMap(ADatabaseTarget::pilots);
+    pilotList    = aDB->getCompletionList(ADatabaseTarget::pilots);
+}

+ 36 - 0
src/classes/acompletiondata.h

@@ -0,0 +1,36 @@
+#ifndef ACOMPLETIONDATA_H
+#define ACOMPLETIONDATA_H
+#include "src/database/adatabase.h"
+
+/*!
+ * \brief The ACompletionData class provides data to QCompleters and QMaps used
+ * for mapping user input to database keys. It retreives the completer targets
+ * and mapping data from the database and caches it for fast access without the
+ * need to query the database.
+ */
+class ACompletionData
+{
+public:
+    ACompletionData();
+
+    /*!
+     * \brief updates data from the user modifiable tables
+     */
+    void update();
+    void updateTails();
+    void updatePilots();
+
+
+    // Maps for input mapping DB key - user input
+    QMap<PilotName_T, PilotRowId_T> pilotsIdMap;
+    QMap<TailRegistration_T, TailId_T> tailsIdMap;
+    QMap<AirportICAO_T, AirportId_T> airportIcaoIdMap;
+    QMap<AirportIATA_T, AirportId_T> airportIataIdMap;
+    QMap<AirportName_T, AirportId_T> airportNameIdMap;
+    // Lists for QCompleter
+    QStringList pilotList;
+    QStringList tailsList;
+    QStringList airportList;
+};
+
+#endif // ACOMPLETIONDATA_H

+ 1 - 2
src/database/adatabase.cpp

@@ -569,7 +569,7 @@ const QStringList ADatabase::getCompletionList(ADatabaseTarget target)
 
 
     return completer_list;
     return completer_list;
 }
 }
-#include "src/testing/atimer.h"
+
 const
 const
 QMap<QString, RowId_T> ADatabase::getIdMap(ADatabaseTarget target)
 QMap<QString, RowId_T> ADatabase::getIdMap(ADatabaseTarget target)
 {
 {
@@ -616,7 +616,6 @@ QMap<QString, RowId_T> ADatabase::getIdMap(ADatabaseTarget target)
     auto id_map = QMap<QString, RowId_T>();
     auto id_map = QMap<QString, RowId_T>();
     while (query.next()) {
     while (query.next()) {
         id_map.insert(query.value(1).toString(), query.value(0).toInt());
         id_map.insert(query.value(1).toString(), query.value(0).toInt());
-        continue;
     }
     }
     return id_map;
     return id_map;
 }
 }

+ 35 - 60
src/gui/dialogues/newflightdialog.cpp

@@ -130,26 +130,11 @@ QLineEdit* NewFlightDialog::MandatoryLineEdits::operator[] (int idx)
 /// noticeable in the UI and not an acceptable user experience. Using QStringLists and QMaps
 /// noticeable in the UI and not an acceptable user experience. Using QStringLists and QMaps
 /// this goes down to around 5ms.
 /// this goes down to around 5ms.
 
 
-NewFlightDialog::NewFlightDialog(
-                                 QMap<PilotName_T, PilotRowId_T> pilotsIdMap_,
-                                 QMap<TailRegistration_T, TailId_T> tailsIdMap_,
-                                 QMap<AirportICAO_T, AirportId_T> airportIcaoIdMap_,
-                                 QMap<AirportIATA_T, AirportId_T> airportIataIdMap_,
-                                 QMap<AirportName_T, AirportId_T> airportNameIdMap_,
-                                 QStringList pilotList_,
-                                 QStringList tailsList_,
-                                 QStringList airportList_,
+NewFlightDialog::NewFlightDialog(ACompletionData &completion_data,
                                  QWidget *parent)
                                  QWidget *parent)
     : QDialog(parent),
     : QDialog(parent),
       ui(new Ui::NewFlight),
       ui(new Ui::NewFlight),
-      pilotList(pilotList_),
-      tailsList(tailsList_),
-      airportList(airportList_),
-      pilotsIdMap(pilotsIdMap_),
-      tailsIdMap(tailsIdMap_),
-      airportIcaoIdMap(airportIcaoIdMap_),
-      airportIataIdMap(airportIataIdMap_),
-      airportNameIdMap(airportNameIdMap_)
+      completionData(completion_data)
 {
 {
     ui->setupUi(this);
     ui->setupUi(this);
     flightEntry = AFlightEntry();
     flightEntry = AFlightEntry();
@@ -164,9 +149,12 @@ NewFlightDialog::NewFlightDialog(
     }
     }
 }
 }
 
 
-NewFlightDialog::NewFlightDialog(int row_id, QWidget *parent) :
-    QDialog(parent),
-    ui(new Ui::NewFlight)
+NewFlightDialog::NewFlightDialog(ACompletionData &completion_data,
+                                 int row_id,
+                                 QWidget *parent)
+    : QDialog(parent),
+      ui(new Ui::NewFlight),
+      completionData(completion_data)
 {
 {
     ui->setupUi(this);
     ui->setupUi(this);
     flightEntry = aDB->getFlightEntry(row_id);
     flightEntry = aDB->getFlightEntry(row_id);
@@ -258,25 +246,14 @@ void NewFlightDialog::setupButtonGroups()
 
 
 void NewFlightDialog::setupRawInputValidation()
 void NewFlightDialog::setupRawInputValidation()
 {
 {
-    // [F] Now done outside NewFlightDialog for more snappiness in application
-    // get Maps
-    //pilotsIdMap      = aDB->getIdMap(ADatabaseTarget::pilots);
-    //tailsIdMap       = aDB->getIdMap(ADatabaseTarget::tails);
-    //airportIcaoIdMap = aDB->getIdMap(ADatabaseTarget::airport_identifier_icao);
-    //airportIataIdMap = aDB->getIdMap(ADatabaseTarget::airport_identifier_iata);
-    //airportNameIdMap = aDB->getIdMap(ADatabaseTarget::airport_names);
-    //get Completer Lists
-    //pilotList   = aDB->getCompletionList(ADatabaseTarget::pilots);
-    //tailsList   = aDB->getCompletionList(ADatabaseTarget::registrations);
-    //airportList = aDB->getCompletionList(ADatabaseTarget::airport_identifier_all);
     auto tempList = QStringList();
     auto tempList = QStringList();
     // define tuples
     // define tuples
     const std::tuple<QString, QStringList*, QRegularExpression>
     const std::tuple<QString, QStringList*, QRegularExpression>
-            location_line_edit_settings {QStringLiteral("Loc"), &airportList, LOC_VALID_RGX};
+            location_line_edit_settings {QStringLiteral("Loc"), &completionData.airportList, LOC_VALID_RGX};
     const std::tuple<QString, QStringList*, QRegularExpression>
     const std::tuple<QString, QStringList*, QRegularExpression>
-            name_line_edit_settings {QStringLiteral("Name"), &pilotList, NAME_VALID_RGX};
+            name_line_edit_settings {QStringLiteral("Name"), &completionData.pilotList, NAME_VALID_RGX};
     const std::tuple<QString, QStringList*, QRegularExpression>
     const std::tuple<QString, QStringList*, QRegularExpression>
-            acft_line_edit_settings {QStringLiteral("acft"), &tailsList, AIRCRAFT_VALID_RGX};
+            acft_line_edit_settings {QStringLiteral("acft"), &completionData.tailsList, AIRCRAFT_VALID_RGX};
     const std::tuple<QString, QStringList*, QRegularExpression>
     const std::tuple<QString, QStringList*, QRegularExpression>
             time_line_edit_settings {QStringLiteral("Time"), &tempList, TIME_VALID_RGX};
             time_line_edit_settings {QStringLiteral("Time"), &tempList, TIME_VALID_RGX};
     const QList<std::tuple<QString, QStringList*, QRegularExpression>> line_edit_settings = {
     const QList<std::tuple<QString, QStringList*, QRegularExpression>> line_edit_settings = {
@@ -426,7 +403,7 @@ void NewFlightDialog::fillDeductibleData()
 
 
     ui->tblkTimeLineEdit->setText(block_time_string);
     ui->tblkTimeLineEdit->setText(block_time_string);
     // get acft data and fill deductible entries
     // get acft data and fill deductible entries
-    auto acft = aDB->getTailEntry(tailsIdMap.value(ui->acftLineEdit->text()));
+    auto acft = aDB->getTailEntry(completionData.tailsIdMap.value(ui->acftLineEdit->text()));
     if (acft.getData().isEmpty())
     if (acft.getData().isEmpty())
         DEB << "Error: No valid aircraft object available, unable to deterime auto times.";
         DEB << "Error: No valid aircraft object available, unable to deterime auto times.";
 
 
@@ -519,11 +496,11 @@ RowData_T NewFlightDialog::collectInput()
     newData.insert(Opl::Db::FLIGHTS_TONB, ATime::toMinutes(tonb));
     newData.insert(Opl::Db::FLIGHTS_TONB, ATime::toMinutes(tonb));
     newData.insert(Opl::Db::FLIGHTS_TBLK, block_minutes);
     newData.insert(Opl::Db::FLIGHTS_TBLK, block_minutes);
     // Aircraft
     // Aircraft
-    newData.insert(Opl::Db::FLIGHTS_ACFT, tailsIdMap.value(ui->acftLineEdit->text()));
+    newData.insert(Opl::Db::FLIGHTS_ACFT, completionData.tailsIdMap.value(ui->acftLineEdit->text()));
     // Pilots
     // Pilots
-    newData.insert(Opl::Db::FLIGHTS_PIC, pilotsIdMap.value(ui->picNameLineEdit->text()));
-    newData.insert(Opl::Db::FLIGHTS_SECONDPILOT, pilotsIdMap.value(ui->secondPilotNameLineEdit->text()));
-    newData.insert(Opl::Db::FLIGHTS_THIRDPILOT, pilotsIdMap.value(ui->thirdPilotNameLineEdit->text()));
+    newData.insert(Opl::Db::FLIGHTS_PIC, completionData.pilotsIdMap.value(ui->picNameLineEdit->text()));
+    newData.insert(Opl::Db::FLIGHTS_SECONDPILOT, completionData.pilotsIdMap.value(ui->secondPilotNameLineEdit->text()));
+    newData.insert(Opl::Db::FLIGHTS_THIRDPILOT, completionData.pilotsIdMap.value(ui->thirdPilotNameLineEdit->text()));
 
 
     // Extra Times
     // Extra Times
     ui->tSPSETimeLineEdit->text().isEmpty() ?
     ui->tSPSETimeLineEdit->text().isEmpty() ?
@@ -711,8 +688,8 @@ void NewFlightDialog::formFiller()
             if(rx.match(leName).hasMatch())  {
             if(rx.match(leName).hasMatch())  {
                 auto line_edits = this->findChild<QLineEdit *>(leName);
                 auto line_edits = this->findChild<QLineEdit *>(leName);
                 if(line_edits != nullptr){
                 if(line_edits != nullptr){
-                    DEB << pilotsIdMap.key(1);
-                    line_edits->setText(pilotsIdMap.key(flightEntry.getData().value(data_key).toInt()));
+                    DEB << completionData.pilotsIdMap.key(1);
+                    line_edits->setText(completionData.pilotsIdMap.key(flightEntry.getData().value(data_key).toInt()));
                     line_edits_names.removeOne(leName);
                     line_edits_names.removeOne(leName);
                 }
                 }
                 break;
                 break;
@@ -823,13 +800,12 @@ void NewFlightDialog::addNewTail(QLineEdit *parent_line_edit)
         NewTailDialog na(ui->acftLineEdit->text(), this);
         NewTailDialog na(ui->acftLineEdit->text(), this);
         na.exec();
         na.exec();
         // update map and list, set line edit
         // update map and list, set line edit
-        tailsIdMap  = aDB->getIdMap(ADatabaseTarget::tails);
-        tailsList   = aDB->getCompletionList(ADatabaseTarget::registrations);
+        completionData.updateTails();
 
 
         DEB << "New Entry added. Id:" << aDB->getLastEntry(ADatabaseTable::tails);
         DEB << "New Entry added. Id:" << aDB->getLastEntry(ADatabaseTable::tails);
-        DEB << "AC Map: " << tailsIdMap;
+        DEB << "AC Map: " << completionData.tailsIdMap;
 
 
-        parent_line_edit->setText(tailsIdMap.key(aDB->getLastEntry(ADatabaseTable::tails)));
+        parent_line_edit->setText(completionData.tailsIdMap.key(aDB->getLastEntry(ADatabaseTable::tails)));
         emit parent_line_edit->editingFinished();
         emit parent_line_edit->editingFinished();
     } else {
     } else {
         parent_line_edit->setText(QString());
         parent_line_edit->setText(QString());
@@ -856,10 +832,9 @@ void NewFlightDialog::addNewPilot(QLineEdit *parent_line_edit)
         NewPilotDialog np(this);
         NewPilotDialog np(this);
         np.exec();
         np.exec();
         // update map and list, set line edit
         // update map and list, set line edit
-        pilotsIdMap  = aDB->getIdMap(ADatabaseTarget::pilots);
-        pilotList    = aDB->getCompletionList(ADatabaseTarget::pilots);
-        DEB << "Setting new entry: " << pilotsIdMap.key(aDB->getLastEntry(ADatabaseTable::pilots));
-        parent_line_edit->setText(pilotsIdMap.key(aDB->getLastEntry(ADatabaseTable::pilots)));
+        completionData.updatePilots();
+        DEB << "Setting new entry: " << completionData.pilotsIdMap.key(aDB->getLastEntry(ADatabaseTable::pilots));
+        parent_line_edit->setText(completionData.pilotsIdMap.key(aDB->getLastEntry(ADatabaseTable::pilots)));
         emit parent_line_edit->editingFinished();
         emit parent_line_edit->editingFinished();
     } else {
     } else {
         parent_line_edit->setText(QString());
         parent_line_edit->setText(QString());
@@ -1075,9 +1050,9 @@ void NewFlightDialog::onLocationEditingFinished(QLineEdit *line_edit, QLabel *na
 
 
     // try to map iata or icao code to airport id;
     // try to map iata or icao code to airport id;
     if (text.length() == 3) {
     if (text.length() == 3) {
-        airport_id = airportIataIdMap.value(text);
+        airport_id = completionData.airportIataIdMap.value(text);
     } else {
     } else {
-        airport_id = airportIcaoIdMap.value(text);
+        airport_id = completionData.airportIcaoIdMap.value(text);
     }
     }
     // check result
     // check result
     if (airport_id == 0) {
     if (airport_id == 0) {
@@ -1086,8 +1061,8 @@ void NewFlightDialog::onLocationEditingFinished(QLineEdit *line_edit, QLabel *na
         onBadInputReceived(line_edit);
         onBadInputReceived(line_edit);
         return;
         return;
     }
     }
-    line_edit->setText(airportIcaoIdMap.key(airport_id));
-    name_label->setText(airportNameIdMap.key(airport_id));
+    line_edit->setText(completionData.airportIcaoIdMap.key(airport_id));
+    name_label->setText(completionData.airportNameIdMap.key(airport_id));
     onGoodInputReceived(line_edit);
     onGoodInputReceived(line_edit);
 }
 }
 
 
@@ -1128,9 +1103,9 @@ void NewFlightDialog::on_acftLineEdit_editingFinished()
     auto line_edit = ui->acftLineEdit;
     auto line_edit = ui->acftLineEdit;
     //DEB << line_edit->objectName() << "Editing Finished!" << line_edit->text());
     //DEB << line_edit->objectName() << "Editing Finished!" << line_edit->text());
 
 
-    if (tailsIdMap.value(line_edit->text()) != 0) {
-        DEB << "Mapped: " << line_edit->text() << tailsIdMap.value(line_edit->text());
-        auto acft = aDB->getTailEntry(tailsIdMap.value(line_edit->text()));
+    if (completionData.tailsIdMap.value(line_edit->text()) != 0) {
+        DEB << "Mapped: " << line_edit->text() << completionData.tailsIdMap.value(line_edit->text());
+        auto acft = aDB->getTailEntry(completionData.tailsIdMap.value(line_edit->text()));
         ui->acftTypeLabel->setText(acft.type());
         ui->acftTypeLabel->setText(acft.type());
         onGoodInputReceived(line_edit);
         onGoodInputReceived(line_edit);
         return;
         return;
@@ -1163,16 +1138,16 @@ void NewFlightDialog::onPilotNameLineEdit_editingFinished()
 
 
     if(line_edit->text().contains(SELF_RX)) {
     if(line_edit->text().contains(SELF_RX)) {
         DEB << "self recognized.";
         DEB << "self recognized.";
-        line_edit->setText(pilotsIdMap.key(1));
+        line_edit->setText(completionData.pilotsIdMap.key(1));
         auto pilot = aDB->getPilotEntry(1);
         auto pilot = aDB->getPilotEntry(1);
         ui->picCompanyLabel->setText(pilot.getData().value(Opl::Db::TAILS_COMPANY).toString());
         ui->picCompanyLabel->setText(pilot.getData().value(Opl::Db::TAILS_COMPANY).toString());
         onGoodInputReceived(line_edit);
         onGoodInputReceived(line_edit);
         return;
         return;
     }
     }
 
 
-    if(pilotsIdMap.value(line_edit->text()) != 0) {
-        DEB << "Mapped: " << line_edit->text() << pilotsIdMap.value(line_edit->text());
-        auto pilot = aDB->getPilotEntry(pilotsIdMap.value(line_edit->text()));
+    if(completionData.pilotsIdMap.value(line_edit->text()) != 0) {
+        DEB << "Mapped: " << line_edit->text() << completionData.pilotsIdMap.value(line_edit->text());
+        auto pilot = aDB->getPilotEntry(completionData.pilotsIdMap.value(line_edit->text()));
         ui->picCompanyLabel->setText(pilot.getData().value(Opl::Db::TAILS_COMPANY).toString());
         ui->picCompanyLabel->setText(pilot.getData().value(Opl::Db::TAILS_COMPANY).toString());
         onGoodInputReceived(line_edit);
         onGoodInputReceived(line_edit);
         return;
         return;

+ 5 - 15
src/gui/dialogues/newflightdialog.h

@@ -37,6 +37,7 @@
 #include "src/classes/apilotentry.h"
 #include "src/classes/apilotentry.h"
 #include "src/classes/atailentry.h"
 #include "src/classes/atailentry.h"
 #include "src/database/adatabase.h"
 #include "src/database/adatabase.h"
+#include "src/classes/acompletiondata.h"
 
 
 namespace Ui {
 namespace Ui {
 class NewFlight;
 class NewFlight;
@@ -49,11 +50,11 @@ public:
     /*!
     /*!
      * \brief NewFlightDialog create a new flight and add it to the logbook.
      * \brief NewFlightDialog create a new flight and add it to the logbook.
      */
      */
-    explicit NewFlightDialog(QMap<PilotName_T, PilotRowId_T> pilotsIdMap, QMap<TailRegistration_T, TailId_T> tailsIdMap, QMap<AirportICAO_T, AirportId_T> airportIcaoIdMap, QMap<AirportIATA_T, AirportId_T> airportIataIdMap, QMap<AirportName_T, AirportId_T> airportNameIdMap, QStringList pilotList, QStringList tailsList, QStringList airportList, QWidget *parent = nullptr);
+    explicit NewFlightDialog(ACompletionData &completion_data, QWidget *parent = nullptr);
     /*!
     /*!
      * \brief NewFlightDialog Edit an existing logbook entry.
      * \brief NewFlightDialog Edit an existing logbook entry.
      */
      */
-    explicit NewFlightDialog(int row_id, QWidget *parent = nullptr);
+    explicit NewFlightDialog(ACompletionData &completion_data, int row_id, QWidget *parent = nullptr);
     ~NewFlightDialog();
     ~NewFlightDialog();
 
 
 private slots:
 private slots:
@@ -93,7 +94,6 @@ private:
      */
      */
     AFlightEntry flightEntry;
     AFlightEntry flightEntry;
 
 
-    // [G]: Initial refactoring based on previous use.
     /*!
     /*!
      * \brief Wrapper around Vector of mandatory line edits and their corresponding
      * \brief Wrapper around Vector of mandatory line edits and their corresponding
      * "ok" QBitArray.
      * "ok" QBitArray.
@@ -121,20 +121,10 @@ private:
     QVector<QLineEdit*> pilotsLineEdits;
     QVector<QLineEdit*> pilotsLineEdits;
 
 
     /*!
     /*!
-     * To be used by the QCompleters
+     * Completion data for QCompleters and mapping user input
      */
      */
-    QStringList pilotList;
-    QStringList tailsList;
-    QStringList airportList;
+    ACompletionData completionData;
 
 
-    /*!
-     * \brief Used to map user input to database keys
-     */
-    QMap<PilotName_T, PilotRowId_T> pilotsIdMap;
-    QMap<TailRegistration_T, TailId_T> tailsIdMap;
-    QMap<AirportICAO_T, AirportId_T> airportIcaoIdMap;
-    QMap<AirportIATA_T, AirportId_T> airportIataIdMap;
-    QMap<AirportName_T, AirportId_T> airportNameIdMap;
 
 
     Opl::Time::FlightTimeFormat flightTimeFormat;
     Opl::Time::FlightTimeFormat flightTimeFormat;
 
 

+ 21 - 7
src/gui/widgets/logbookwidget.cpp

@@ -34,9 +34,10 @@ const QMap<int, QString> FILTER_MAP = {
 };
 };
 const auto NON_WORD_CHAR = QRegularExpression("\\W");
 const auto NON_WORD_CHAR = QRegularExpression("\\W");
 
 
-LogbookWidget::LogbookWidget(QWidget *parent) :
+LogbookWidget::LogbookWidget(ACompletionData& completion_data, QWidget *parent) :
     QWidget(parent),
     QWidget(parent),
-    ui(new Ui::LogbookWidget)
+    ui(new Ui::LogbookWidget),
+    completionData(completion_data)
 {
 {
     ui->setupUi(this);
     ui->setupUi(this);
     ui->newFlightButton->setFocus();
     ui->newFlightButton->setFocus();
@@ -136,10 +137,17 @@ void LogbookWidget::flightsTableView_selectionChanged()
  */
  */
 void LogbookWidget::on_newFlightButton_clicked()
 void LogbookWidget::on_newFlightButton_clicked()
 {
 {
-    //auto nf = new NewFlightDialog(this);
-    //nf->setAttribute(Qt::WA_DeleteOnClose);
-    //nf->exec();
-    //displayModel->select();
+    auto old_state = aDB->getUserDataState();
+
+    NewFlightDialog nf(completionData, this);
+    nf.setAttribute(Qt::WA_DeleteOnClose);
+    nf.exec();
+
+    auto new_state = aDB->getUserDataState();
+    if (old_state != new_state)
+        completionData.update();
+
+    displayModel->select();
 }
 }
 
 
 /*!
 /*!
@@ -149,9 +157,15 @@ void LogbookWidget::on_newFlightButton_clicked()
 void LogbookWidget::on_editFlightButton_clicked()
 void LogbookWidget::on_editFlightButton_clicked()
 {
 {
     if(selectedFlights.length() == 1){
     if(selectedFlights.length() == 1){
-        auto ef = new NewFlightDialog(selectedFlights.first(), this);
+        auto old_state = aDB->getUserDataState();
+
+        auto ef = new NewFlightDialog(completionData, selectedFlights.first(), this);
         ef->setAttribute(Qt::WA_DeleteOnClose);
         ef->setAttribute(Qt::WA_DeleteOnClose);
         ef->exec();
         ef->exec();
+
+        auto new_state = aDB->getUserDataState();
+        if (old_state != new_state)
+            completionData.update();
         displayModel->select();
         displayModel->select();
     } else if (selectedFlights.isEmpty()) {
     } else if (selectedFlights.isEmpty()) {
         WARN(tr("<br>No flight selected.<br>"));
         WARN(tr("<br>No flight selected.<br>"));

+ 4 - 1
src/gui/widgets/logbookwidget.h

@@ -26,6 +26,7 @@
 #include <QMenu>
 #include <QMenu>
 #include <QTableView>
 #include <QTableView>
 #include "src/gui/widgets/settingswidget.h"
 #include "src/gui/widgets/settingswidget.h"
+#include "src/classes/acompletiondata.h"
 
 
 namespace Ui {
 namespace Ui {
 class LogbookWidget;
 class LogbookWidget;
@@ -47,7 +48,7 @@ class LogbookWidget : public QWidget
     Q_OBJECT
     Q_OBJECT
 
 
 public:
 public:
-    explicit LogbookWidget(QWidget *parent = nullptr);
+    explicit LogbookWidget(ACompletionData &completion_data, QWidget *parent = nullptr);
     ~LogbookWidget();
     ~LogbookWidget();
 
 
 private slots:
 private slots:
@@ -84,6 +85,8 @@ private:
     void setupModelAndView(int view_id);
     void setupModelAndView(int view_id);
     void connectSignalsAndSlots();
     void connectSignalsAndSlots();
 
 
+    ACompletionData completionData;
+
 protected:
 protected:
     /*!
     /*!
      * \brief Handles change events, like updating the UI to new localisation
      * \brief Handles change events, like updating the UI to new localisation