Explorar el Código

Tweaked NewFlightDialog

Reworked NewFlightDialog with focus on snappiness. Opening the NewFlightDialog in App was sluggish, due to the need to retrieve data from the DB  to create QCompleters and input mapping. This is now done outside the Dialog itself. The required data is retreived on application start, and then provided to the NF Dialog when it is constructed. This makes for a much better user experience when using the app. Increased app startup time but this is preferable over sluggish behaviour once the app is running.
Felix Turo hace 3 años
padre
commit
8b29e8b752

+ 34 - 1
mainwindow.cpp

@@ -36,6 +36,9 @@ MainWindow::MainWindow(QWidget *parent)
         WARN(tr("Error establishing database connection."));
     }
 
+    // retreive completion lists and maps
+    updateCompleters();
+
     // Create a spacer for the toolbar to separate left and right parts
     auto *spacer = new QWidget();
     spacer->setMinimumWidth(1);
@@ -149,8 +152,38 @@ void MainWindow::on_actionHome_triggered()
 
 void MainWindow::on_actionNewFlight_triggered()
 {
-    NewFlightDialog nf(this);
+    auto old_state = aDB->getUserDataState();
+    NewFlightDialog nf(pilotsIdMap,
+                       tailsIdMap,
+                       airportIcaoIdMap,
+                       airportIataIdMap,
+                       airportNameIdMap,
+                       pilotList,
+                       tailsList,
+                       airportList,
+                       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);
+    }
 }
 
 void MainWindow::on_actionLogbook_triggered()

+ 17 - 0
mainwindow.h

@@ -100,6 +100,23 @@ 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);
+
 protected:
     /*!
      * \brief Shows the debug widget by pressing <ctrl + t>

+ 23 - 3
src/database/adatabase.cpp

@@ -80,6 +80,22 @@ QStringList ADatabase::getTemplateTableNames()
     return templateTableNames;
 }
 
+UserDataState ADatabase::getUserDataState()
+{
+    QSqlQuery q;
+    q.prepare(QStringLiteral("SELECT COUNT (*) FROM tails"));
+    q.exec();
+    q.first();
+    int tails = q.value(0).toInt();
+
+    q.prepare(QStringLiteral("SELECT COUNT (*) FROM pilots"));
+    q.exec();
+    q.first();
+    int pilots = q.value(0).toInt();
+
+    return UserDataState(tails, pilots);
+}
+
 QStringList ADatabase::getUserTableNames()
 {
     return userTableNames;
@@ -553,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)
 {
@@ -585,7 +601,11 @@ QMap<QString, RowId_T> ADatabase::getIdMap(ADatabaseTarget target)
         return {};
     }
 
-    auto query = QSqlQuery(statement);
+    QSqlQuery query;
+    query.setForwardOnly(true);
+    query.prepare(statement);
+    query.exec();
+    //auto query = QSqlQuery(statement);
     if (!query.isActive()) {
         DEB << "No result found. Check Query and Error.";
         DEB << "Query: " << statement;
@@ -593,10 +613,10 @@ QMap<QString, RowId_T> ADatabase::getIdMap(ADatabaseTarget target)
         lastError = query.lastError();
         return {};
     }
-
     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;
 }

+ 30 - 0
src/database/adatabase.h

@@ -88,6 +88,29 @@ enum class ADatabaseSummaryKey {
     total_time,
 };
 
+/*!
+ * \brief The UserDateState struct caches the current number of entries in relevant database tables
+ * for fast access
+ * \param numTails - Number of tails in the database
+ * \param numPilots - Number of pilots in the database
+ */
+struct UserDataState {
+    UserDataState(int numTails_, int numPilots_)
+        : numTails(numTails_), numPilots(numPilots_){}
+
+    bool operator==(const UserDataState& other)
+    {
+        return numTails == other.numTails && numPilots == other.numPilots;
+    }
+    bool operator!=(const UserDataState& other)
+    {
+        return numTails != other.numTails || numPilots != other.numPilots;
+    }
+
+    int numTails;
+    int numPilots;
+};
+
 /*!
  * \brief Custom Database Error derived from QSqlError.
  * Extends text() adding "Database Error: " before the text.
@@ -358,6 +381,13 @@ public:
      */
     QStringList getTemplateTableNames();
 
+    /*!
+     * \brief getUserDataState returns a struct containing the current amount of entries in the tails and
+     * pilots tables.
+     * \return
+     */
+    UserDataState getUserDataState();
+
     /*!
      * \brief getMinimumDatabaseRevision returns the minimum required database revision number required by the application.
      */

+ 29 - 11
src/gui/dialogues/newflightdialog.cpp

@@ -130,9 +130,26 @@ 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(QWidget *parent) :
-    QDialog(parent),
-    ui(new Ui::NewFlight)
+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_,
+                                 QWidget *parent)
+    : QDialog(parent),
+      ui(new Ui::NewFlight),
+      pilotList(pilotList_),
+      tailsList(tailsList_),
+      airportList(airportList_),
+      pilotsIdMap(pilotsIdMap_),
+      tailsIdMap(tailsIdMap_),
+      airportIcaoIdMap(airportIcaoIdMap_),
+      airportIataIdMap(airportIataIdMap_),
+      airportNameIdMap(airportNameIdMap_)
 {
     ui->setupUi(this);
     flightEntry = AFlightEntry();
@@ -241,16 +258,17 @@ 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);
+    //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);
+    //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>

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

@@ -49,7 +49,7 @@ public:
     /*!
      * \brief NewFlightDialog create a new flight and add it to the logbook.
      */
-    explicit NewFlightDialog(QWidget *parent = nullptr);
+    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);
     /*!
      * \brief NewFlightDialog Edit an existing logbook entry.
      */

+ 4 - 24
src/gui/widgets/debugwidget.cpp

@@ -35,30 +35,10 @@
 void DebugWidget::on_debugPushButton_clicked()
 {
     // Debug
-    QFileInfo check_file("/home/felix/.local/share/opl/openPilotLog/templates/changelog.json");
-    AHash hash(check_file);
-
-    QFileInfo md5_file("/home/felix/.local/share/opl/openPilotLog/templates/changelog.md5");
-    DEB << "Sums are equal?" << hash.compare(md5_file);
-    //test_file2.open(QFile::ReadOnly);
-    //QTextStream in(&test_file2);
-    //auto read = in.read(32);
-    //auto array = read.toUtf8();
-    //test_file2.close();
-    //DEB << read;
-    //DEB << (read == hash.hashToHex());
-    //DEB << array;
-
-
-    //for (const auto &table_name : aDB->getTemplateTableNames()) {
-    //    //json_files.append(QFile(AStandardPaths::asChildOfDir(AStandardPaths::Templates, table_name)));
-    //    QString json_path = AStandardPaths::asChildOfDir(AStandardPaths::Templates, table_name) + QLatin1String(".json");
-    //    QString md5_path = AStandardPaths::asChildOfDir(AStandardPaths::Templates, table_name) + QLatin1String(".md5");
-    //    DEB << json_path << md5_path;
-    //    QFileInfo json_fi(json_path);
-    //    QFileInfo md5_fi(md5_path);
-    //    DEB << "Exists? " << json_fi.exists() << md5_fi.exists();
-    //}
+    auto state = aDB->getUserDataState();
+    DEB << "Tails:" << state.numTails << "Pilots:" << state.numPilots;
+    UserDataState state2 = aDB->getUserDataState();
+    DEB << "inequal?" << (state != state2);
 
 }
 

+ 4 - 4
src/gui/widgets/logbookwidget.cpp

@@ -136,10 +136,10 @@ void LogbookWidget::flightsTableView_selectionChanged()
  */
 void LogbookWidget::on_newFlightButton_clicked()
 {
-    auto nf = new NewFlightDialog(this);
-    nf->setAttribute(Qt::WA_DeleteOnClose);
-    nf->exec();
-    displayModel->select();
+    //auto nf = new NewFlightDialog(this);
+    //nf->setAttribute(Qt::WA_DeleteOnClose);
+    //nf->exec();
+    //displayModel->select();
 }
 
 /*!