Browse Source

Merge pull request #45 from fiffty-50/develop-settings-cleanup

Develop settings cleanup
Felix Turowsky 4 years ago
parent
commit
78215534ef

+ 0 - 1
main.cpp

@@ -51,7 +51,6 @@ int main(int argc, char *argv[])
     ASettings::setup();
 
     AStyle::setup();
-
     aDB()->connect();
     if (!ASettings::read(ASettings::Setup::SetupComplete).toBool()) {
         if(FirstRunDialog().exec() == QDialog::Rejected){

+ 2 - 9
src/classes/asettings.cpp

@@ -30,15 +30,8 @@ QMap<ASettings::LogBook, QString> ASettings::logBookMap = {
 };
 
 QMap<ASettings::UserData, QString> ASettings::userDataMap = {
-    {UserData::LastName,          QStringLiteral("lastname")},
-    {UserData::FirstName,         QStringLiteral("firstname") },
-    {UserData::Company,           QStringLiteral("company")},
-    {UserData::EmployeeID,        QStringLiteral("employeeid")},
-    {UserData::Phone,             QStringLiteral("phone")},
-    {UserData::Email,             QStringLiteral("email")},
     {UserData::DisplaySelfAs,     QStringLiteral("displayselfas")},
-    {UserData::Alias,             QStringLiteral("alias")},
-    {UserData::AcSortColumn,      QStringLiteral("acSortColumn")},  // [G]: inconsistent naming
+    {UserData::AcftSortColumn,      QStringLiteral("acSortColumn")},  // [G]: inconsistent naming
     {UserData::PilSortColumn,     QStringLiteral("pilSortColumn")},
     {UserData::AcAllowIncomplete, QStringLiteral("acAllowIncomplete")},
 };
@@ -58,7 +51,7 @@ QMap<ASettings::FlightLogging, QString> ASettings::flightLoggingMap = {
 };
 
 QMap<ASettings::Setup, QString> ASettings::setupMap = {
-    {Setup::SetupComplete, QStringLiteral("setup_complete")},  // inconsistent naming
+    {Setup::SetupComplete, QStringLiteral("setupComplete")}
 };
 
 QMap<ASettings::NewFlight, QString> ASettings::newFlightMap = {

+ 1 - 8
src/classes/asettings.h

@@ -40,15 +40,8 @@ public:
     };
 
     enum class UserData {
-        LastName,
-        FirstName,
-        Company,
-        EmployeeID,
-        Phone,
-        Email,
         DisplaySelfAs,
-        Alias,
-        AcSortColumn, // not sure what ac is
+        AcftSortColumn,
         PilSortColumn,
         AcAllowIncomplete,
     };

+ 32 - 17
src/database/adatabase.cpp

@@ -33,14 +33,41 @@ QString ADatabaseError::text() const
 
 ADatabase* ADatabase::instance = nullptr;
 
+/*!
+ * \brief Return the names of a given table in the database.
+ */
+ColumnNames ADatabase::getTableColumns(TableName table_name) const
+{
+    return tableColumns.value(table_name);
+}
+
+/*!
+ * \brief Return the names of all tables in the database
+ */
 TableNames ADatabase::getTableNames() const
 {
     return tableNames;
 }
 
-TableColumns ADatabase::getTableColumns() const
+/*!
+ * \brief Updates the member variables tableNames and tableColumns with up-to-date layout information
+ * if the database has been altered. This function is normally only required during database setup or maintenance.
+ */
+void ADatabase::updateLayout()
 {
-    return tableColumns;
+    auto db = ADatabase::database();
+    tableNames = db.tables();
+
+    tableColumns.clear();
+    for (const auto &table_name : tableNames) {
+        ColumnNames table_columns;
+        QSqlRecord fields = db.record(table_name);
+        for (int i = 0; i < fields.count(); i++) {
+            table_columns.append(fields.field(i).name());
+        }
+        tableColumns.insert(table_name, table_columns);
+    }
+    emit dataBaseUpdated();
 }
 
 ADatabase* ADatabase::getInstance()
@@ -82,19 +109,7 @@ bool ADatabase::connect()
     DEB << "Database connection established." << db.lastError().text();
     // Enable foreign key restrictions
     QSqlQuery query(QStringLiteral("PRAGMA foreign_keys = ON;"));
-    tableNames = db.tables();
-
-    QStringList column_names;
-    for (const auto &table : tableNames) {
-        column_names.clear();
-        QSqlRecord fields = db.record(table);
-        for (int i = 0; i < fields.count(); i++) {
-            column_names.append(fields.field(i).name());
-            tableColumns.insert(table, column_names);
-        }
-    }
-    DEB << "Database Tables: " << tableNames;
-    DEB << "Tables and Columns: " << tableColumns;
+    updateLayout();
     return true;
 }
 
@@ -337,7 +352,7 @@ bool ADatabase::insert(AEntry new_entry)
 RowData ADatabase::getEntryData(DataPosition data_position)
 {
     // check table exists
-    if (!tableNames.contains(data_position.tableName)) {
+    if (!getTableNames().contains(data_position.tableName)) {
         DEB << data_position.tableName << " not a table in the database. Unable to retreive Entry data.";
         return RowData();
     }
@@ -385,7 +400,7 @@ RowData ADatabase::getEntryData(DataPosition data_position)
     select_query.next();
     RowData entry_data;
 
-    for (const auto &column : tableColumns.value(data_position.tableName)) {
+    for (const auto &column : getTableColumns(data_position.tableName)) {
         entry_data.insert(column, select_query.value(column));
     }
     return entry_data;

+ 6 - 3
src/database/adatabase.h

@@ -77,17 +77,18 @@ public:
 class ADatabase : public QObject {
     Q_OBJECT
 private:
-    TableNames tableNames;
-    TableColumns tableColumns;
     static ADatabase* instance;
     ADatabase();
+    TableNames tableNames;
+    TableColumns tableColumns;
 public:
     // Ensure DB is not copiable or assignable
     ADatabase(const ADatabase&) = delete;
     void operator=(const ADatabase&) = delete;
     static ADatabase* getInstance();
     TableNames getTableNames() const;
-    TableColumns getTableColumns() const;
+    ColumnNames getTableColumns(TableName table_name) const;
+    void updateLayout();
     const QString sqliteVersion();
 
     ADatabaseError lastError;
@@ -237,6 +238,8 @@ public:
 
 
 
+
+
 signals:
     /*!
      * \brief updated is emitted whenever the database contents have been updated.

+ 14 - 15
src/database/adatabasesetup.cpp

@@ -266,8 +266,7 @@ bool ADataBaseSetup::createDatabase()
         return false;
     }
 
-    // call connect again to (re-)populate tableNames and columnNames
-    aDB()->connect();
+    aDB()->updateLayout();
 
     DEB << "Populating tables...";
     if (!importDefaultData()) {
@@ -415,25 +414,25 @@ bool ADataBaseSetup::createSchemata(const QStringList &statements)
  * \param tableName as in the database
  * \return
  */
-bool ADataBaseSetup::commitData(QVector<QStringList> fromCSV, const QString &tableName)
+bool ADataBaseSetup::commitData(QVector<QStringList> from_csv, const QString &table_name)
 {
     DEB << "Table names: " << aDB()->getTableNames();
-    DEB << "Importing Data to" << tableName;
-    if (!aDB()->getTableNames().contains(tableName)){
-        DEB << tableName << "is not a table in the database. Aborting.";
+    DEB << "Importing Data to" << table_name;
+    if (!aDB()->getTableNames().contains(table_name)){
+        DEB << table_name << "is not a table in the database. Aborting.";
         DEB << "Please check input data.";
         return false;
     }
     // create insert statement
-    QString statement = "INSERT INTO " + tableName + " (";
+    QString statement = "INSERT INTO " + table_name + " (";
     QString placeholder = ") VALUES (";
-    for (auto& csvColumn : fromCSV) {
-        if(aDB()->getTableColumns().value(tableName).contains(csvColumn.first())) {
+    for (auto& csvColumn : from_csv) {
+        if(aDB()->getTableColumns(table_name).contains(csvColumn.first())) {
             statement += csvColumn.first() + ',';
             csvColumn.removeFirst();
             placeholder.append("?,");
         } else {
-            DEB << csvColumn.first() << "is not a column of " << tableName << "Aborting.";
+            DEB << csvColumn.first() << "is not a column of " << table_name << "Aborting.";
             DEB << "Please check input data.";
             return false;
         }
@@ -449,12 +448,12 @@ bool ADataBaseSetup::commitData(QVector<QStringList> fromCSV, const QString &tab
      */
     QSqlQuery query;
     query.exec("BEGIN EXCLUSIVE TRANSACTION;");
-    for (int i = 0; i < fromCSV.first().length(); i++){
+    for (int i = 0; i < from_csv.first().length(); i++){
         query.prepare(statement);
-        for(int j = 0; j < fromCSV.length(); j++) {
-             fromCSV[j][i] == QString("") ? // make sure NULL is committed for empty values
+        for(int j = 0; j < from_csv.length(); j++) {
+             from_csv[j][i] == QString("") ? // make sure NULL is committed for empty values
                          query.addBindValue(QVariant(QVariant::String))
-                       : query.addBindValue(fromCSV[j][i]);
+                       : query.addBindValue(from_csv[j][i]);
              //query.addBindValue(fromCSV[j][i]);
          }
         query.exec();
@@ -465,7 +464,7 @@ bool ADataBaseSetup::commitData(QVector<QStringList> fromCSV, const QString &tab
         DEB << "Error:" << query.lastError().text();
         return false;
     } else {
-        qDebug() << tableName << "Database successfully updated!";
+        qDebug() << table_name << "Database successfully updated!";
         return true;
     }
 }

+ 1 - 1
src/database/adatabasesetup.h

@@ -47,7 +47,7 @@ public:
 
     static bool resetToDefault();
 
-    static bool commitData(QVector<QStringList> fromCSV, const QString &tableName);
+    static bool commitData(QVector<QStringList> from_csv, const QString &table_name);
 
 private:
 

+ 0 - 24
src/database/declarations.h

@@ -17,35 +17,11 @@ using TableName = QString;
 using RowId = int;
 
 using TableNames = QStringList;
-// [G]: May lead to some confusion. TableData suggest data for the entire table.
-// but in reallity it is data per column *of single row* (unless i misunderstand)
-// [F]: That's correct. We could maybe call it EntryData or RowData?
 using RowData = QMap<ColName, ColData>;
 using ColumnData = QPair<ColName, ColData>;
 using ColumnNames = QStringList;
 using TableColumns = QMap<TableName, ColumnNames>;
 
-// [G]: Needs some work. Inheriting from QPair may be helpful but
-// may also be overkill. Lets determine the specific uses of DataPosition
-// and provide our own interface i would say.
-// [F]: Good idea! Implementing something similar to first and second methods
-// of QPair would be useful to carry over, or some other way of quickly and
-// unambiguously accessing the elements.
-/*struct DataPosition : QPair<TableName, RowId> {
-    TableName tableName;
-    RowId rowId;
-    DataPosition()
-        : tableName(first), rowId(second)
-    {}
-    DataPosition(TableName table_name, RowId row_id)
-        : QPair<TableName, RowId>::QPair(table_name, row_id),
-          tableName(first), rowId(second)
-    {}
-    DataPosition(const DataPosition& other) = default;
-    DataPosition& operator=(const DataPosition& other) = default;
-};*/
-
-//[F]: How about something like this?
 struct DataPosition {
     TableName tableName;
     RowId rowId;

+ 11 - 17
src/gui/dialogues/firstrundialog.cpp

@@ -86,11 +86,6 @@ void FirstRunDialog::on_nextPushButton_clicked()
 
 bool FirstRunDialog::finish()
 {
-    ASettings::write(ASettings::UserData::LastName, ui->lastnameLineEdit->text());
-    ASettings::write(ASettings::UserData::FirstName, ui->firstnameLineEdit->text());
-    ASettings::write(ASettings::UserData::EmployeeID, ui->employeeidLineEdit->text());
-    ASettings::write(ASettings::UserData::Phone, ui->phoneLineEdit->text());
-    ASettings::write(ASettings::UserData::Email, ui->emailLineEdit->text());
 
     ASettings::write(ASettings::FlightLogging::Function, ui->functionComboBox->currentText());
     ASettings::write(ASettings::FlightLogging::Approach, ui->approachComboBox->currentText());
@@ -104,24 +99,22 @@ bool FirstRunDialog::finish()
 
     QMap<QString, QVariant> data;
     ASettings::write(ASettings::UserData::DisplaySelfAs, ui->aliasComboBox->currentIndex());
-    data.insert(ASettings::stringOfKey(ASettings::UserData::LastName), ui->lastnameLineEdit->text());
-    data.insert(ASettings::stringOfKey(ASettings::UserData::FirstName), ui->firstnameLineEdit->text());
-    data.insert(ASettings::stringOfKey(ASettings::UserData::Alias), "self");
-    data.insert(ASettings::stringOfKey(ASettings::UserData::EmployeeID), ui->employeeidLineEdit->text());
-    data.insert(ASettings::stringOfKey(ASettings::UserData::Phone), ui->phoneLineEdit->text());
-    data.insert(ASettings::stringOfKey(ASettings::UserData::Email), ui->emailLineEdit->text());
+    data.insert(DB_PILOTS_LASTNAME, ui->lastnameLineEdit->text());
+    data.insert(DB_PILOTS_FIRSTNAME, ui->firstnameLineEdit->text());
+    data.insert(DB_PILOTS_ALIAS, QStringLiteral("self"));
+    data.insert(DB_PILOTS_EMPLOYEEID, ui->employeeidLineEdit->text());
+    data.insert(DB_PILOTS_PHONE, ui->phoneLineEdit->text());
+    data.insert(DB_PILOTS_EMAIL, ui->emailLineEdit->text());
 
     auto db_fail_msg_box = QMessageBox(QMessageBox::Critical, QStringLiteral("Database setup failed"),
                                        QStringLiteral("Errors have ocurred creating the database."
                                                       "Without a working database The application will not be usable."));
-    // [G]: Im abit confused on the logic here
-    // why do you write setup complete twice?
     if (!setupDatabase()) {
         db_fail_msg_box.exec();
         return false;
     }
-    aDB()->disconnect(); // reset db connection to refresh layout after initial setup.
-    aDB()->connect();
+
+    aDB()->updateLayout();
 
     auto pilot = APilotEntry(1);
     pilot.setData(data);
@@ -149,10 +142,11 @@ bool FirstRunDialog::setupDatabase()
     aDB()->connect();
 
     // [F]: todo: handle unsuccessful steps
-    // [G]: only two / for comments
-    // three are shorthand for documentation
     if(!ADataBaseSetup::createDatabase())
         return false;
+
+    aDB()->updateLayout();
+
     if(!ADataBaseSetup::importDefaultData())
         return false;
     return true;

+ 4 - 1
src/gui/dialogues/firstrundialog.ui

@@ -30,6 +30,9 @@
    </item>
    <item row="0" column="0" colspan="2">
     <widget class="QStackedWidget" name="stackedWidget">
+     <property name="currentIndex">
+      <number>2</number>
+     </property>
      <widget class="QWidget" name="stackedWidgetPage1">
       <layout class="QGridLayout" name="gridLayout_2">
        <item row="0" column="1">
@@ -397,7 +400,7 @@
        <item row="0" column="0" colspan="2">
         <widget class="QLabel" name="label_4">
          <property name="text">
-          <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;center&quot;&gt;&lt;span style=&quot; font-size:16pt;&quot;&gt;Finish&lt;/span&gt;&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;br/&gt;Almost done! Here you can select the theme to be used for the application.&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;This change will take effect the next time the application is launched.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+          <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;center&quot;&gt;&lt;span style=&quot; font-size:16pt;&quot;&gt;Finish&lt;/span&gt;&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;br/&gt;Almost done! We are now going to create the database for the application.&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;If you want to use the most up-to-date version of the database, an internet connection is required, otherwise you can use the version included in the download.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
          </property>
          <property name="textFormat">
           <enum>Qt::RichText</enum>

+ 2 - 2
src/gui/widgets/aircraftwidget.cpp

@@ -48,7 +48,7 @@ AircraftWidget::~AircraftWidget()
 
 void AircraftWidget::setupModelAndView()
 {
-    sortColumn = ASettings::read(ASettings::UserData::AcSortColumn).toInt();
+    sortColumn = ASettings::read(ASettings::UserData::AcftSortColumn).toInt();
 
     model = new QSqlTableModel(this);
     model->setTable("viewTails");
@@ -199,7 +199,7 @@ void AircraftWidget::tableView_selectionChanged()
 void AircraftWidget::tableView_headerClicked(int column)
 {
     sortColumn = column;
-    ASettings::write(ASettings::UserData::AcSortColumn, column);
+    ASettings::write(ASettings::UserData::AcftSortColumn, column);
 }
 
 void AircraftWidget::acft_editing_finished()

+ 47 - 51
src/gui/widgets/debugwidget.cpp

@@ -1,6 +1,9 @@
 #include "debugwidget.h"
 #include "ui_debugwidget.h"
 #include "src/classes/astandardpaths.h"
+#include "src/gui/widgets/logbookwidget.h"
+#include "src/gui/widgets/pilotswidget.h"
+#include "src/gui/widgets/aircraftwidget.h"
 
 DebugWidget::DebugWidget(QWidget *parent) :
     QWidget(parent),
@@ -24,10 +27,9 @@ void DebugWidget::on_resetUserTablesPushButton_clicked()
     ATimer timer(this);
     QMessageBox result;
     if (ADataBaseSetup::resetToDefault()){
-        result.setText("Database successfully reset.\n\nRestarting app.");
+        result.setText("Database successfully reset");
         result.exec();
-        qApp->quit();
-        QProcess::startDetached(qApp->arguments()[0], qApp->arguments());
+        emit aDB()->dataBaseUpdated();
     } else {
         result.setText("Errors have occurred. Check console for Debug output. ");
         result.exec();
@@ -37,52 +39,47 @@ void DebugWidget::on_resetUserTablesPushButton_clicked()
 void DebugWidget::on_resetDatabasePushButton_clicked()
 {
     ATimer timer(this);
-    QMessageBox mb(this);
-    //check if template dir exists and create if needed.
-    QDir dir("data/templates");
-    DEB << dir.path();
-    if (!dir.exists())
-        dir.mkpath(".");
+    QMessageBox message_box(this);
+
     // download latest csv
-    QStringList templateTables = {"aircraft", "airports", "changelog"};
-    QString linkStub = "https://raw.githubusercontent.com/fiffty-50/openpilotlog/";
-    linkStub.append(ui->branchLineEdit->text());
-    linkStub.append("/assets/database/templates/");
-    for (const auto& table : templateTables) {
+    QString link_stub = "https://raw.githubusercontent.com/fiffty-50/openpilotlog/";
+    link_stub.append(ui->branchLineEdit->text()); // optionally select branch for development
+    link_stub.append("/assets/database/templates/");
+
+    QStringList template_tables = {"aircraft", "airports", "changelog"};
+    QDir template_dir(AStandardPaths::absPathOf(AStandardPaths::Templates));
+    for (const auto& table : template_tables) {
         QEventLoop loop;
         ADownload* dl = new ADownload;
-        connect(dl, &ADownload::done, &loop, &QEventLoop::quit );
-        dl->setTarget(QUrl(linkStub + table + ".csv"));
-        dl->setFileName("data/templates/" + table + ".csv");
+        QObject::connect(dl, &ADownload::done, &loop, &QEventLoop::quit );
+        dl->setTarget(QUrl(link_stub % table % QStringLiteral(".csv")));
+        dl->setFileName(template_dir.filePath(table % QStringLiteral(".csv")));
         dl->download();
         loop.exec(); // event loop waits for download done signal before allowing loop to continue
         dl->deleteLater();
     }
 
-    //close database connection
+    // back up old db
     aDB()->disconnect();
+    ADataBaseSetup::backupOldData();
 
-    // back up and remove old database
-    auto oldDatabase = QFile("data/logbook.db");
-    if (oldDatabase.exists()) {
-        auto dateString = QDateTime::currentDateTime().toString(Qt::ISODate);
-        DEB << "Backing up old database as: " << "logbook-backup-" + dateString + ".db";
-        if (oldDatabase.copy("data/logbook-backup-" + dateString + ".db")) {
-            oldDatabase.remove();
-            DEB << "Old Database removed.";
-        }
-
-    }
     // re-connct and create new database
     aDB()->connect();
-
     if (ADataBaseSetup::createDatabase()) {
-        mb.setText("Database has been successfully reset.\n\nRestarting application.");
-        mb.exec();
-        qApp->quit();
-        QProcess::startDetached(qApp->arguments()[0], qApp->arguments());
+        DEB << "Database has been successfully created.";
     } else {
-        mb.setText("Errors have ocurred. Check console for details.");
+        message_box.setText("Errors have ocurred creating the database.<br>"
+                            "Check console for details.");
+        message_box.exec();
+    }
+    if (ADataBaseSetup::importDefaultData()) {
+        message_box.setText("Database has been successfully reset.");
+        emit aDB()->dataBaseUpdated();
+        message_box.exec();
+    } else {
+        message_box.setText("Errors have ocurred while importing templates.<br>"
+                            "Check console for details.");
+        message_box.exec();
     }
 }
 
@@ -94,24 +91,21 @@ void DebugWidget::downloadFinished()
 void DebugWidget::on_fillUserDataPushButton_clicked()
 {
     ATimer timer(this);
-    QMessageBox mb(this);
-    //check if template dir exists and create if needed.
-    QDir dir("data/templates");
-    DEB << dir.path();
-    if (!dir.exists())
-        dir.mkpath(".");
+    QMessageBox message_box(this);
     // download latest csv
     QStringList userTables = {"pilots", "tails", "flights"};
     QString linkStub = "https://raw.githubusercontent.com/fiffty-50/openpilotlog/";
     linkStub.append(ui->branchLineEdit->text());
     linkStub.append("/assets/database/templates/sample_");
+    QDir template_dir(AStandardPaths::absPathOf(AStandardPaths::Templates));
 
     for (const auto& table : userTables) {
         QEventLoop loop;
         ADownload* dl = new ADownload;
         connect(dl, &ADownload::done, &loop, &QEventLoop::quit );
         dl->setTarget(QUrl(linkStub + table + ".csv"));
-        dl->setFileName("data/templates/sample_" + table + ".csv");
+        dl->setFileName(template_dir.filePath("sample_" + table % QStringLiteral(".csv")));
+        //dl->setFileName("data/templates/sample_" + table + ".csv");
         dl->download();
         loop.exec(); // event loop waits for download done signal before allowing loop to continue
         dl->deleteLater();
@@ -120,26 +114,28 @@ void DebugWidget::on_fillUserDataPushButton_clicked()
     allGood.resize(userTables.size());
 
     for (const auto& table : userTables) {
-        auto data = aReadCsv("data/templates/sample_" + table + ".csv");
+        auto data = aReadCsv(AStandardPaths::absPathOf(AStandardPaths::Templates)
+                             + "/sample_" + table + ".csv");
         allGood.setBit(userTables.indexOf(table), ADataBaseSetup::commitData(data, table));
     }
 
     if (allGood.count(true) != userTables.size()) {
-        mb.setText("Errors have ocurred. Check console for details.");
-        mb.exec();
+        message_box.setText("Errors have ocurred. Check console for details.");
+        message_box.exec();
         return;
     }
 
-    mb.setText("User tables successfully populated.\n\nRestarting app.");
-    mb.exec();
-    qApp->quit();
-    QProcess::startDetached(qApp->arguments()[0], qApp->arguments());
+    message_box.setText("User tables successfully populated.");
+    message_box.exec();
+    emit aDB()->dataBaseUpdated();
 }
 
 void DebugWidget::on_selectCsvPushButton_clicked()
 {
     auto fileName = QFileDialog::getOpenFileName(this,
-                                                 tr("Open CSV File for import"), QDir::homePath(), tr("CSV files (*.csv)"));
+                                                 tr("Open CSV File for import"),
+                                                 AStandardPaths::absPathOf(AStandardPaths::Templates),
+                                                 tr("CSV files (*.csv)"));
     ui->importCsvLineEdit->setText(fileName);
 }
 
@@ -169,7 +165,7 @@ void DebugWidget::on_importCsvPushButton_clicked()
 
 void DebugWidget::on_debugPushButton_clicked()
 {
-    DEB << AStandardPaths::allPaths()[AStandardPaths::Database	];
+
 }
 
 /* //Comparing two functions template

+ 29 - 39
src/gui/widgets/settingswidget.cpp

@@ -22,6 +22,7 @@
 #include "src/classes/asettings.h"
 #include "src/database/adatabase.h"
 #include "src/classes/apilotentry.h"
+#include "src/database/declarations.h"
 
 #include <QStyleFactory>
 
@@ -80,12 +81,17 @@ void SettingsWidget::readSettings()
     /*
      * Personal Tab
      */
-    ui->lastnameLineEdit->setText(ASettings::read(ASettings::UserData::LastName).toString());
-    ui->firstnameLineEdit->setText(ASettings::read(ASettings::UserData::FirstName).toString());
-    ui->companyLineEdit->setText(ASettings::read(ASettings::UserData::Company).toString());
-    ui->employeeidLineEdit->setText(ASettings::read(ASettings::UserData::EmployeeID).toString());
-    ui->phoneLineEdit->setText(ASettings::read(ASettings::UserData::Phone).toString());
-    ui->emailLineEdit->setText(ASettings::read(ASettings::UserData::Email).toString());
+    {
+        const QSignalBlocker blocker(this); // don't emit editing finished for setting these values
+        auto user_data = aDB()->getPilotEntry(1).getData();
+        ui->lastnameLineEdit->setText(user_data.value(DB_PILOTS_LASTNAME).toString());
+        ui->firstnameLineEdit->setText(user_data.value(DB_PILOTS_FIRSTNAME).toString());
+        ui->companyLineEdit->setText(user_data.value(DB_PILOTS_COMPANY).toString());
+        ui->employeeidLineEdit->setText(user_data.value(DB_PILOTS_EMPLOYEEID).toString());
+        ui->phoneLineEdit->setText(user_data.value(DB_PILOTS_PHONE).toString());
+        ui->emailLineEdit->setText(user_data.value(DB_PILOTS_EMAIL).toString());
+    }
+
     /*
      * Flight Logging Tab
      */
@@ -100,7 +106,7 @@ void SettingsWidget::readSettings()
     /*
      * Aircraft Tab
      */
-    ui->acSortComboBox->setCurrentIndex(ASettings::read(ASettings::UserData::AcSortColumn).toInt());
+    ui->acSortComboBox->setCurrentIndex(ASettings::read(ASettings::UserData::AcftSortColumn).toInt());
     ui->pilotSortComboBox->setCurrentIndex(ASettings::read(ASettings::UserData::PilSortColumn).toInt());
     ui->acAllowIncompleteComboBox->setCurrentIndex(ASettings::read(ASettings::UserData::AcAllowIncomplete).toInt());
 }
@@ -122,13 +128,13 @@ void SettingsWidget::setupValidators()
 
 void SettingsWidget::updatePersonalDetails()
 {
-    QMap<QString, QVariant> data;
+    RowData user_data;
     switch (ui->aliasComboBox->currentIndex()) {
     case 0:
-        data.insert("alias", "self");
+        user_data.insert(DB_PILOTS_ALIAS, QStringLiteral("self"));
         break;
     case 1:
-        data.insert("alias","SELF");
+        user_data.insert(DB_PILOTS_ALIAS,QStringLiteral("SELF"));
         break;
     case 2:{
         QString name;
@@ -136,23 +142,23 @@ void SettingsWidget::updatePersonalDetails()
         name.append(QLatin1String(", "));
         name.append(ui->firstnameLineEdit->text().left(1));
         name.append(QLatin1Char('.'));
-        data.insert("alias", name);
+        user_data.insert(DB_PILOTS_ALIAS, name);
     }
         break;
     default:
         break;
     }
-    data.insert("lastname", ui->lastnameLineEdit->text());
-    data.insert("firstname", ui->firstnameLineEdit->text());
-    data.insert("company", ui->companyLineEdit->text());
-    data.insert("employeeid", ui->employeeidLineEdit->text());
-    data.insert("phone", ui->phoneLineEdit->text());
-    data.insert("email", ui->emailLineEdit->text());
+    user_data.insert(DB_PILOTS_LASTNAME, ui->lastnameLineEdit->text());
+    user_data.insert(DB_PILOTS_FIRSTNAME, ui->firstnameLineEdit->text());
+    user_data.insert(DB_PILOTS_COMPANY, ui->companyLineEdit->text());
+    user_data.insert(DB_PILOTS_EMPLOYEEID, ui->employeeidLineEdit->text());
+    user_data.insert(DB_PILOTS_PHONE, ui->phoneLineEdit->text());
+    user_data.insert(DB_PILOTS_EMAIL, ui->emailLineEdit->text());
 
-    auto pic = APilotEntry(1);
-    pic.setData(data);
+    auto user = APilotEntry(1);
+    user.setData(user_data);
 
-    aDB()->commit(pic);
+    aDB()->commit(user);
 }
 
 /*
@@ -166,47 +172,31 @@ void SettingsWidget::updatePersonalDetails()
 
 void SettingsWidget::on_lastnameLineEdit_editingFinished()
 {
-    if(ui->lastnameLineEdit->text().isEmpty()){
-        ui->lastnameLineEdit->setText(ASettings::read(ASettings::UserData::LastName).toString());
-        ui->lastnameLineEdit->setFocus();
-    } else {
-        ASettings::write(ASettings::UserData::LastName, ui->lastnameLineEdit->text());
-        updatePersonalDetails();
-    }
+    updatePersonalDetails();
 }
 
 void SettingsWidget::on_firstnameLineEdit_editingFinished()
 {
-    if(ui->firstnameLineEdit->text().isEmpty()){
-        ui->firstnameLineEdit->setText(ASettings::read(ASettings::UserData::FirstName).toString());
-        ui->firstnameLineEdit->setFocus();
-    } else {
-        ASettings::write(ASettings::UserData::FirstName,ui->firstnameLineEdit->text());
-        updatePersonalDetails();
-    }
+    updatePersonalDetails();
 }
 
 void SettingsWidget::on_companyLineEdit_editingFinished()
 {
-    ASettings::write(ASettings::UserData::Company, ui->companyLineEdit->text());
     updatePersonalDetails();
 }
 
 void SettingsWidget::on_employeeidLineEdit_editingFinished()
 {
-    ASettings::write(ASettings::UserData::EmployeeID, ui->employeeidLineEdit->text());
     updatePersonalDetails();
 }
 
 void SettingsWidget::on_emailLineEdit_editingFinished()
 {
-    ASettings::write(ASettings::UserData::Email, ui->emailLineEdit->text());
     updatePersonalDetails();
 }
 
 void SettingsWidget::on_phoneLineEdit_editingFinished()
 {
-    ASettings::write(ASettings::UserData::Phone, ui->phoneLineEdit->text());
     updatePersonalDetails();
 }
 
@@ -272,7 +262,7 @@ void SettingsWidget::on_pilotSortComboBox_currentIndexChanged(int index)
 
 void SettingsWidget::on_acSortComboBox_currentIndexChanged(int index)
 {
-    ASettings::write(ASettings::UserData::AcSortColumn, index);
+    ASettings::write(ASettings::UserData::AcftSortColumn, index);
 }
 
 void SettingsWidget::on_acAllowIncompleteComboBox_currentIndexChanged(int index)