Преглед на файлове

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 години
родител
ревизия
1017f212df

+ 2 - 0
CMakeLists.txt

@@ -23,6 +23,7 @@ find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets Sql Network LinguistTools
 set(PROJECT_SOURCES
     main.cpp
     mainwindow.cpp
+    src/classes/acompletiondata.cpp
     src/classes/acurrencyentry.cpp
     src/classes/astyle.cpp
     src/classes/astandardpaths.cpp
@@ -60,6 +61,7 @@ set(PROJECT_SOURCES
     
     src/opl.h
     mainwindow.h
+    src/classes/acompletiondata.h
     src/classes/acurrencyentry.h
     src/classes/astyle.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
-    updateCompleters();
+    completionData = ACompletionData();
 
     // Create a spacer for the toolbar to separate left and right parts
     auto *spacer = new QWidget();
@@ -64,7 +64,7 @@ MainWindow::MainWindow(QWidget *parent)
     // Construct Widgets
     homeWidget = new HomeWidget(this);
     ui->stackedWidget->addWidget(homeWidget);
-    logbookWidget = new LogbookWidget(this);
+    logbookWidget = new LogbookWidget(completionData, this);
     ui->stackedWidget->addWidget(logbookWidget);
     aircraftWidget = new AircraftWidget(this);
     ui->stackedWidget->addWidget(aircraftWidget);
@@ -153,37 +153,12 @@ void MainWindow::on_actionHome_triggered()
 void MainWindow::on_actionNewFlight_triggered()
 {
     auto old_state = aDB->getUserDataState();
-    NewFlightDialog nf(pilotsIdMap,
-                       tailsIdMap,
-                       airportIcaoIdMap,
-                       airportIataIdMap,
-                       airportNameIdMap,
-                       pilotList,
-                       tailsList,
-                       airportList,
+    NewFlightDialog nf(completionData,
                        this);
     nf.exec();
     auto new_state = aDB->getUserDataState();
     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()

+ 4 - 16
mainwindow.h

@@ -39,8 +39,10 @@
 #include "src/gui/dialogues/newpilotdialog.h"
 #include "src/gui/dialogues/newflightdialog.h"
 #include "src/classes/arunguard.h"
+#include "src/classes/acompletiondata.h"
 #include "src/testing/atimer.h"
 
+
 QT_BEGIN_NAMESPACE
 namespace Ui {
 class MainWindow;
@@ -100,22 +102,8 @@ private:
 
     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:
     /*!

+ 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;
 }
-#include "src/testing/atimer.h"
+
 const
 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>();
     while (query.next()) {
         id_map.insert(query.value(1).toString(), query.value(0).toInt());
-        continue;
     }
     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
 /// 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)
     : QDialog(parent),
       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);
     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);
     flightEntry = aDB->getFlightEntry(row_id);
@@ -258,25 +246,14 @@ void NewFlightDialog::setupButtonGroups()
 
 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();
     // define tuples
     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>
-            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>
-            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>
             time_line_edit_settings {QStringLiteral("Time"), &tempList, TIME_VALID_RGX};
     const QList<std::tuple<QString, QStringList*, QRegularExpression>> line_edit_settings = {
@@ -426,7 +403,7 @@ void NewFlightDialog::fillDeductibleData()
 
     ui->tblkTimeLineEdit->setText(block_time_string);
     // 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())
         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_TBLK, block_minutes);
     // 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
-    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
     ui->tSPSETimeLineEdit->text().isEmpty() ?
@@ -711,8 +688,8 @@ void NewFlightDialog::formFiller()
             if(rx.match(leName).hasMatch())  {
                 auto line_edits = this->findChild<QLineEdit *>(leName);
                 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);
                 }
                 break;
@@ -823,13 +800,12 @@ void NewFlightDialog::addNewTail(QLineEdit *parent_line_edit)
         NewTailDialog na(ui->acftLineEdit->text(), this);
         na.exec();
         // 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 << "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();
     } else {
         parent_line_edit->setText(QString());
@@ -856,10 +832,9 @@ void NewFlightDialog::addNewPilot(QLineEdit *parent_line_edit)
         NewPilotDialog np(this);
         np.exec();
         // 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();
     } else {
         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;
     if (text.length() == 3) {
-        airport_id = airportIataIdMap.value(text);
+        airport_id = completionData.airportIataIdMap.value(text);
     } else {
-        airport_id = airportIcaoIdMap.value(text);
+        airport_id = completionData.airportIcaoIdMap.value(text);
     }
     // check result
     if (airport_id == 0) {
@@ -1086,8 +1061,8 @@ void NewFlightDialog::onLocationEditingFinished(QLineEdit *line_edit, QLabel *na
         onBadInputReceived(line_edit);
         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);
 }
 
@@ -1128,9 +1103,9 @@ void NewFlightDialog::on_acftLineEdit_editingFinished()
     auto line_edit = ui->acftLineEdit;
     //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());
         onGoodInputReceived(line_edit);
         return;
@@ -1163,16 +1138,16 @@ void NewFlightDialog::onPilotNameLineEdit_editingFinished()
 
     if(line_edit->text().contains(SELF_RX)) {
         DEB << "self recognized.";
-        line_edit->setText(pilotsIdMap.key(1));
+        line_edit->setText(completionData.pilotsIdMap.key(1));
         auto pilot = aDB->getPilotEntry(1);
         ui->picCompanyLabel->setText(pilot.getData().value(Opl::Db::TAILS_COMPANY).toString());
         onGoodInputReceived(line_edit);
         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());
         onGoodInputReceived(line_edit);
         return;

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

@@ -37,6 +37,7 @@
 #include "src/classes/apilotentry.h"
 #include "src/classes/atailentry.h"
 #include "src/database/adatabase.h"
+#include "src/classes/acompletiondata.h"
 
 namespace Ui {
 class NewFlight;
@@ -49,11 +50,11 @@ public:
     /*!
      * \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.
      */
-    explicit NewFlightDialog(int row_id, QWidget *parent = nullptr);
+    explicit NewFlightDialog(ACompletionData &completion_data, int row_id, QWidget *parent = nullptr);
     ~NewFlightDialog();
 
 private slots:
@@ -93,7 +94,6 @@ private:
      */
     AFlightEntry flightEntry;
 
-    // [G]: Initial refactoring based on previous use.
     /*!
      * \brief Wrapper around Vector of mandatory line edits and their corresponding
      * "ok" QBitArray.
@@ -121,20 +121,10 @@ private:
     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;
 

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

@@ -34,9 +34,10 @@ const QMap<int, QString> FILTER_MAP = {
 };
 const auto NON_WORD_CHAR = QRegularExpression("\\W");
 
-LogbookWidget::LogbookWidget(QWidget *parent) :
+LogbookWidget::LogbookWidget(ACompletionData& completion_data, QWidget *parent) :
     QWidget(parent),
-    ui(new Ui::LogbookWidget)
+    ui(new Ui::LogbookWidget),
+    completionData(completion_data)
 {
     ui->setupUi(this);
     ui->newFlightButton->setFocus();
@@ -136,10 +137,17 @@ void LogbookWidget::flightsTableView_selectionChanged()
  */
 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()
 {
     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->exec();
+
+        auto new_state = aDB->getUserDataState();
+        if (old_state != new_state)
+            completionData.update();
         displayModel->select();
     } else if (selectedFlights.isEmpty()) {
         WARN(tr("<br>No flight selected.<br>"));

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

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