Selaa lähdekoodia

Initial implementation of Currencies in Database

- Created ACurrencyEntry struct to hold data of a currency entry
- Added Database functions to retreive ACurrencyEntrry
- Removed QSettings based Dates
- Updated logic in FirstRunDialog and added a check for database file existance in main.cpp
- Updated ADatabaseSetup with Currencies table
- Updated CMakeLists.txt and .pro files
Felix Turo 4 vuotta sitten
vanhempi
commit
13e78be9b0

+ 2 - 0
CMakeLists.txt

@@ -22,6 +22,7 @@ find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets Sql Network REQUIRED)
 set(PROJECT_SOURCES
     main.cpp
     mainwindow.cpp
+    src/classes/acurrencyentry.cpp
     src/classes/astyle.cpp
     src/classes/astandardpaths.cpp
     src/classes/aaircraftentry.cpp
@@ -51,6 +52,7 @@ set(PROJECT_SOURCES
     src/testing/atimer.cpp
     
     mainwindow.h
+    src/classes/acurrencyentry.h
     src/classes/astyle.h
     src/classes/astandardpaths.h
     src/classes/aaircraftentry.h

+ 1 - 0
assets/database/templates/changelog.csv

@@ -15,3 +15,4 @@ revision,comment,date
 14,Edited tails and aircraft tables - engineClass and weightClass instead of columns for each element,2020-12-19
 15,Renamed some columns to have consistent naming,2020-12-26
 16,Added CASE for views to account for occasions where aircraft variant is NULL,2021-02-03
+17,Added currencies table,2021-02-12

+ 7 - 0
assets/database/templates/currencies.csv

@@ -0,0 +1,7 @@
+currency_id,description,expiryDate
+1,Licence,
+2,Type Rating,
+3,Line Check,
+4,Medical,
+5,Custom1,
+6,Custom2,

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
assets/opl-icons/icon_backup.svg


+ 1 - 0
assets/templates.qrc

@@ -3,5 +3,6 @@
         <file>database/templates/aircraft.csv</file>
         <file>database/templates/airports.csv</file>
         <file>database/templates/changelog.csv</file>
+        <file>database/templates/currencies.csv</file>
     </qresource>
 </RCC>

+ 13 - 6
main.cpp

@@ -52,12 +52,14 @@ int main(int argc, char *argv[])
 
     AStyle::setup();
 
-    if (!aDB->connect()) {
-        LOG << "Error establishing database connection\n";
-        return 2;
-    }
-
-    if (!ASettings::read(ASettings::Main::SetupComplete).toBool()) {
+    if (ASettings::read(ASettings::Main::SetupComplete).toBool()) {
+        QFileInfo database_file(AStandardPaths::directory(AStandardPaths::Database).
+                                     absoluteFilePath(QStringLiteral("logbook.db")));
+        if (!database_file.exists()) {
+            LOG << "Error: Database file not found\n";
+            return 2;
+        }
+    } else {
         if(FirstRunDialog().exec() == QDialog::Rejected){
             LOG << "Initial setup incomplete or unsuccessfull. Exiting.\n";
             return 3;
@@ -66,6 +68,11 @@ int main(int argc, char *argv[])
         DEB << "Wrote setup_commplete";
     }
 
+    if (!aDB->connect()) {
+        LOG << "Error establishing database connection\n";
+        return 4;
+    }
+
     ARunGuard guard(QStringLiteral("opl_single_key"));
     if ( !guard.tryToRun() ){
         LOG << "Another Instance of openPilotLog is already running. Exiting.\n";

+ 4 - 1
mainwindow.cpp

@@ -131,9 +131,12 @@ void MainWindow::connectWidgets()
                      aircraftWidget, &AircraftWidget::onDisplayModel_dataBaseUpdated);
     QObject::connect(aDB, &ADatabase::dataBaseUpdated,
                      homeWidget, &HomeWidget::onHomeWidget_dataBaseUpdated);
+    QObject::connect(settingsWidget, &SettingsWidget::settingChanged,
+                     homeWidget, &HomeWidget::onHomeWidget_dataBaseUpdated);
 
-    QObject::connect(settingsWidget, &SettingsWidget::viewSelectionChanged,
+    QObject::connect(settingsWidget, &SettingsWidget::settingChanged,
                      logbookWidget, &LogbookWidget::onLogbookWidget_viewSelectionChanged);
+
 }
 
 void MainWindow::on_actionSettings_triggered()

+ 2 - 0
openPilotLog.pro

@@ -20,6 +20,7 @@ DEFINES *= QT_USE_QSTRINGBUILDER
 SOURCES += \
     main.cpp \
     mainwindow.cpp \
+    src/classes/acurrencyentry.cpp \
     src/classes/astyle.cpp \
     src/classes/astandardpaths.cpp \
     src/classes/aaircraftentry.cpp \
@@ -50,6 +51,7 @@ SOURCES += \
 
 HEADERS += \
     mainwindow.h \
+    src/classes/acurrencyentry.h \
     src/classes/astyle.h \
     src/classes/astandardpaths.h \
     src/classes/aaircraftentry.h \

+ 39 - 0
src/classes/acurrencyentry.cpp

@@ -0,0 +1,39 @@
+#include "acurrencyentry.h"
+#include "src/oplconstants.h"
+
+//ACurrencyEntry::ACurrencyEntry()
+//{
+//
+//}
+/*!
+ * \brief ACurrencyEntry::ACurrencyEntry Creates an ACurrenyEntry object.
+ *
+ * The Data Position is initalized by using the strongly typed enum
+ * CurrencyName, which maps to the static row id for the currency.
+ */
+ACurrencyEntry::ACurrencyEntry(ACurrencyEntry::CurrencyName currency_name)
+    : AEntry::AEntry(DataPosition(Opl::Db::TABLE_CURRENCIES, static_cast<int>(currency_name)))
+{}
+
+ACurrencyEntry::ACurrencyEntry(ACurrencyEntry::CurrencyName currency_name, QDate expiration_date)
+    : AEntry::AEntry(DataPosition(Opl::Db::TABLE_CURRENCIES, static_cast<int>(currency_name)))
+{
+    if (expiration_date.isValid()) {
+        tableData.insert(Opl::Db::CURRENCIES_EXPIRYDATE, expiration_date.toString(Qt::ISODate));
+    } else {
+        DEB << "Invalid Date.";
+    }
+}
+
+/*!
+ * \brief ACurrencyEntry::isValid returns true if the object holds a valid expiration date.
+ *
+ * Unless a user has previously entered an expiration date, this will return false.
+ * \return
+ */
+bool ACurrencyEntry::isValid() const
+{
+    return QDate::fromString(
+                tableData.value(Opl::Db::CURRENCIES_EXPIRYDATE).toString(), Qt::ISODate
+                ).isValid();
+}

+ 29 - 0
src/classes/acurrencyentry.h

@@ -0,0 +1,29 @@
+#ifndef ACURRENCYENTRY_H
+#define ACURRENCYENTRY_H
+
+#include "src/classes/aentry.h"
+#include "src/database/adatabasetypes.h"
+
+struct ACurrencyEntry : public AEntry
+{
+public:
+    enum class CurrencyName {
+        Licence     = 1,
+        TypeRating  = 2,
+        LineCheck   = 3,
+        Medical     = 4,
+        Custom1     = 5,
+        Custom2     = 6
+    };
+
+    ACurrencyEntry() = delete;
+    ACurrencyEntry(CurrencyName name);
+    ACurrencyEntry(CurrencyName name, QDate expiration_date);
+
+    ACurrencyEntry(const ACurrencyEntry& te) = default;
+    ACurrencyEntry& operator=(const ACurrencyEntry& te) = default;
+
+    bool isValid() const;
+};
+
+#endif // ACURRENCYENTRY_H

+ 0 - 6
src/classes/asettings.cpp

@@ -43,12 +43,6 @@ QMap<ASettings::UserData, QString> ASettings::userDataMap = {
     {UserData::ShowMedCurrency,         QStringLiteral("showMedCurrency")},
     {UserData::ShowCustom1Currency,     QStringLiteral("showCustom1Currency")},
     {UserData::ShowCustom2Currency,     QStringLiteral("showCustom2Currency")},
-    {UserData::LicCurrencyDate,         QStringLiteral("licCurrencyDate")},
-    {UserData::TrCurrencyDate,          QStringLiteral("trCurrencyDate")},
-    {UserData::LckCurrencyDate,         QStringLiteral("lckCurrencyDate")},
-    {UserData::MedCurrencyDate,         QStringLiteral("medCurrencyDate")},
-    {UserData::Custom1CurrencyDate,     QStringLiteral("custom1CurrencyDate")},
-    {UserData::Custom2CurrencyDate,     QStringLiteral("custom2CurrencyDate")},
     {UserData::Custom1CurrencyName,     QStringLiteral("custom1CurrencyName")},
     {UserData::Custom2CurrencyName,     QStringLiteral("custom2CurrencyName")},
 };

+ 0 - 6
src/classes/asettings.h

@@ -50,12 +50,6 @@ public:
         ShowMedCurrency,
         ShowCustom1Currency,
         ShowCustom2Currency,
-        LicCurrencyDate,
-        TrCurrencyDate,
-        LckCurrencyDate,
-        MedCurrencyDate,
-        Custom1CurrencyDate,
-        Custom2CurrencyDate,
         Custom1CurrencyName,
         Custom2CurrencyName,
     };

+ 7 - 0
src/database/adatabase.cpp

@@ -449,6 +449,13 @@ AFlightEntry ADatabase::getFlightEntry(RowId_T row_id)
     return flight_entry;
 }
 
+ACurrencyEntry ADatabase::getCurrencyEntry(ACurrencyEntry::CurrencyName currency_name)
+{
+    ACurrencyEntry currency_entry(currency_name);
+    currency_entry.setData(getEntryData(currency_entry.getPosition()));
+    return currency_entry;
+}
+
 const QStringList ADatabase::getCompletionList(ADatabaseTarget target)
 {
     QString statement;

+ 6 - 0
src/database/adatabase.h

@@ -38,6 +38,7 @@
 #include "src/classes/aaircraftentry.h"
 #include "src/classes/aflightentry.h"
 #include "src/classes/astandardpaths.h"
+#include "src/classes/acurrencyentry.h"
 
 #define SQLITE_DRIVER QStringLiteral("QSQLITE")
 
@@ -216,6 +217,11 @@ public:
      */
     AFlightEntry getFlightEntry(RowId_T row_id);
 
+    /*!
+     * \brief Retreives a currency entry from the database.
+     */
+    ACurrencyEntry getCurrencyEntry(ACurrencyEntry::CurrencyName currency_name);
+
     /*!
      * \brief getCompletionList returns a QStringList of values for a
      * QCompleter based on database values

+ 47 - 34
src/database/adatabasesetup.cpp

@@ -23,8 +23,9 @@
 #include "src/classes/adownload.h"
 #include "src/oplconstants.h"
 #include "src/functions/adatetime.h"
+#include "src/functions/alog.h"
 
-const auto createTablePilots = QStringLiteral("CREATE TABLE pilots ( "
+const auto createTablePilots = QLatin1String("CREATE TABLE pilots ( "
             " pilot_id       INTEGER NOT NULL, "
             " lastname       TEXT    NOT NULL, "
             " firstname      TEXT, "
@@ -36,7 +37,7 @@ const auto createTablePilots = QStringLiteral("CREATE TABLE pilots ( "
             " PRIMARY KEY(pilot_id AUTOINCREMENT)"
             ")");
 
-const auto createTableTails = QStringLiteral("CREATE TABLE tails ("
+const auto createTableTails = QLatin1String("CREATE TABLE tails ("
             " tail_id        INTEGER NOT NULL,"
             " registration   TEXT NOT NULL,"
             " company        TEXT,"
@@ -50,7 +51,7 @@ const auto createTableTails = QStringLiteral("CREATE TABLE tails ("
             " PRIMARY KEY(tail_id AUTOINCREMENT)"
             ")");
 
-const auto createTableFlights = QStringLiteral("CREATE TABLE flights ("
+const auto createTableFlights = QLatin1String("CREATE TABLE flights ("
             " flight_id      INTEGER NOT NULL, "
             " doft           NUMERIC NOT NULL, "
             " dept           TEXT NOT NULL, "
@@ -87,7 +88,7 @@ const auto createTableFlights = QStringLiteral("CREATE TABLE flights ("
             " PRIMARY KEY(flight_id    AUTOINCREMENT) "
         ")");
 
-const auto createTableAirports = QStringLiteral("CREATE TABLE airports ( "
+const auto createTableAirports = QLatin1String("CREATE TABLE airports ( "
             " airport_id     INTEGER NOT NULL, "
             " icao           TEXT NOT NULL, "
             " iata           TEXT, "
@@ -101,7 +102,7 @@ const auto createTableAirports = QStringLiteral("CREATE TABLE airports ( "
             " PRIMARY KEY(airport_id AUTOINCREMENT) "
             ")");
 
-const auto createTableAircraft = QStringLiteral("CREATE TABLE aircraft ("
+const auto createTableAircraft = QLatin1String("CREATE TABLE aircraft ("
             " aircraft_id   INTEGER NOT NULL,"
             " make          TEXT,"
             " model         TEXT,"
@@ -116,15 +117,22 @@ const auto createTableAircraft = QStringLiteral("CREATE TABLE aircraft ("
             " PRIMARY KEY(aircraft_id AUTOINCREMENT)"
             ")");
 
-const auto createTableChangelog = QStringLiteral("CREATE TABLE changelog ( "
+const auto createTableChangelog = QLatin1String("CREATE TABLE changelog ( "
             " revision   INTEGER NOT NULL, "
             " comment    TEXT, "
             " date       NUMERIC, "
             " PRIMARY KEY(revision) "
             ")");
 
+const auto createTableCurrencies = QLatin1String("CREATE TABLE currencies ( "
+            " currency_id	INTEGER PRIMARY KEY AUTOINCREMENT, "
+            " description	TEXT, "
+            " expiryDate     NUMERIC "
+            ")"
+            );
+
 // Statements for creation of views in the database
-const auto createViewDefault = QStringLiteral("CREATE VIEW viewDefault AS "
+const auto createViewDefault = QLatin1String("CREATE VIEW viewDefault AS "
         " SELECT flight_id, doft as 'Date', "
         " dept AS 'Dept', "
         " printf('%02d',(tofb/60))||':'||printf('%02d',(tofb%60)) AS 'Time', "
@@ -148,7 +156,7 @@ const auto createViewDefault = QStringLiteral("CREATE VIEW viewDefault AS "
         " INNER JOIN tails on flights.acft = tails.tail_id "
         " ORDER BY date DESC ");
 
-const auto createViewEASA = QStringLiteral("CREATE VIEW viewEASA AS "
+const auto createViewEASA = QLatin1String("CREATE VIEW viewEASA AS "
         " SELECT "
         " flight_id, doft as 'Date', "
         " dept AS 'Dept', "
@@ -183,7 +191,7 @@ const auto createViewEASA = QStringLiteral("CREATE VIEW viewEASA AS "
         " INNER JOIN tails on flights.acft = tails.tail_id "
         " ORDER BY date DESC");
 
-const auto createViewTails = QStringLiteral("CREATE VIEW viewTails AS "
+const auto createViewTails = QLatin1String("CREATE VIEW viewTails AS "
         " SELECT "
         " tail_id AS 'ID', "
         " registration AS 'Registration', "
@@ -198,7 +206,7 @@ const auto createViewTails = QStringLiteral("CREATE VIEW viewTails AS "
         " company AS 'Company' "
         " FROM tails WHERE variant IS NOT NULL");
 
-const auto createViewPilots = QStringLiteral("CREATE VIEW viewPilots AS "
+const auto createViewPilots = QLatin1String("CREATE VIEW viewPilots AS "
         " SELECT "
         " pilot_id AS 'ID', "
         " lastname AS 'Last Name', "
@@ -206,14 +214,14 @@ const auto createViewPilots = QStringLiteral("CREATE VIEW viewPilots AS "
         " company AS 'Company' "
         " FROM pilots");
 
-const auto createViewQCompleter = QStringLiteral("CREATE VIEW viewQCompleter AS "
+const auto createViewQCompleter = QLatin1String("CREATE VIEW viewQCompleter AS "
         " SELECT airport_id, icao, iata, tail_id, registration, pilot_id, "
         " lastname||', '||firstname AS 'pilot_name', alias "
         " FROM airports "
         " LEFT JOIN tails ON airports.airport_id = tails.tail_id "
         " LEFT JOIN pilots ON airports.airport_id = pilots.pilot_id");
 
-const auto createViewTotals = QStringLiteral("CREATE VIEW viewTotals AS "
+const auto createViewTotals = QLatin1String("CREATE VIEW viewTotals AS "
         " SELECT "
         " printf(\"%02d\",CAST(SUM(tblk) AS INT)/60)||\":\"||printf(\"%02d\",CAST(SUM(tblk) AS INT)%60) AS \"TOTAL\", "
         " printf(\"%02d\",CAST(SUM(tSPSE) AS INT)/60)||\":\"||printf(\"%02d\",CAST(SUM(tSPSE) AS INT)%60) AS \"SP SE\", "
@@ -237,6 +245,7 @@ const QStringList tables = {
     createTableFlights,
     createTableAircraft,
     createTableAirports,
+    createTableCurrencies,
     createTableChangelog
 };
 const QStringList views = {
@@ -248,14 +257,15 @@ const QStringList views = {
     createViewQCompleter,
 };
 const QStringList userTables = {
-    "flights",
-    "pilots",
-    "tails"
+    QStringLiteral("flights"),
+    QStringLiteral("pilots"),
+    QStringLiteral("tails")
 };
 const QStringList templateTables= {
-    "aircraft",
-    "airports",
-    "changelog"
+    QStringLiteral("aircraft"),
+    QStringLiteral("airports"),
+    QStringLiteral("currencies"),
+    QStringLiteral("changelog")
 };
 
 
@@ -288,13 +298,13 @@ bool ADataBaseSetup::downloadTemplates()
         QEventLoop loop;
         ADownload* dl = new ADownload;
         QObject::connect(dl, &ADownload::done, &loop, &QEventLoop::quit );
-        dl->setTarget(QUrl(TEMPLATE_URL % table % QStringLiteral(".csv")));
-        dl->setFileName(template_dir.absoluteFilePath(table % QStringLiteral(".csv")));
+        dl->setTarget(QUrl(TEMPLATE_URL + table + QLatin1String(".csv")));
+        dl->setFileName(template_dir.absoluteFilePath(table + QLatin1String(".csv")));
         dl->download();
         dl->deleteLater();
         loop.exec(); // event loop waits for download done signal before allowing loop to continue
 
-        QFileInfo downloaded_file(template_dir.filePath(table % QStringLiteral(".csv")));
+        QFileInfo downloaded_file(template_dir.filePath(table + QLatin1String(".csv")));
         if (downloaded_file.size() == 0)
             return false; // ssl/network error
     }
@@ -302,8 +312,10 @@ bool ADataBaseSetup::downloadTemplates()
 }
 bool ADataBaseSetup::backupOldData()
 {
-    DEB << "Backing up old database...";
-    auto database_file = aDB->databaseFile;
+    LOG << "Backing up old database...";
+    QFileInfo database_file(AStandardPaths::directory(AStandardPaths::Database).
+                                       absoluteFilePath(QStringLiteral("logbook.db")));
+    DEB << "File Info:" << database_file;
 
     if(!database_file.exists()) {
         DEB << "No Database to backup, returning.";
@@ -314,16 +326,17 @@ bool ADataBaseSetup::backupOldData()
     auto backup_dir = AStandardPaths::directory(AStandardPaths::Backup);
     QString backup_name = database_file.baseName() + QLatin1String("_bak_")
             + date_string + QLatin1String(".db");
-    QFile file(aDB->databaseFile.absoluteFilePath()); 
+    QFile file(database_file.absoluteFilePath());
+    DEB << "File:" << file;
     if (!file.rename(backup_dir.absoluteFilePath(backup_name))) {
-        DEB << "Unable to backup old database.";
+        LOG << "Unable to backup old database.\n";
         return false;
     }
-    DEB << "Backed up old database as: " << backup_name;
+    LOG << "Backed up old database as: " << backup_name << "\n";
     return true;
 }
 
-bool ADataBaseSetup::importDefaultData(bool use_local_data)
+bool ADataBaseSetup::importDefaultData(bool use_ressource_data)
 {
     QSqlQuery query;
     // reset template tables
@@ -338,20 +351,20 @@ bool ADataBaseSetup::importDefaultData(bool use_local_data)
         QVector<QStringList> data_to_commit;
         QString error_message("Error importing data ");
 
-        if (use_local_data) {
+        if (use_ressource_data) {
             data_to_commit = aReadCsv(QStringLiteral(":templates/database/templates/")
-                                      + table_name + QStringLiteral(".csv"));
-            error_message.append(" (local) ");
+                                      + table_name + QLatin1String(".csv"));
+            error_message.append(" (ressource) ");
         } else {
             data_to_commit = aReadCsv(AStandardPaths::directory(
                                           AStandardPaths::Templates).absoluteFilePath(
-                                          table_name + QStringLiteral(".csv")));
-            error_message.append(" (remote) ");
+                                          table_name + QLatin1String(".csv")));
+            error_message.append(" (downloaded) ");
         }
 
         //fill with data from csv
         if (!commitData(data_to_commit, table_name)) {
-            DEB << error_message;
+            LOG << error_message;
             return false;
         }
     }
@@ -425,7 +438,7 @@ bool ADataBaseSetup::createSchemata(const QStringList &statements)
         }
         return false;
     }
-    DEB << "All schemas added successfully";
+    LOG << "All database tables created successfully\n";
     return true;
 }
 /*!

+ 1 - 1
src/database/adatabasesetup.h

@@ -22,7 +22,7 @@
 #include <QStringBuilder>
 #include <QEventLoop>
 
-#define DATABASE_REVISION 16
+#define DATABASE_REVISION 17
 
 const auto TEMPLATE_URL = QStringLiteral("https://raw.githubusercontent.com/fiffty-50/openpilotlog/develop/assets/database/templates/");
 

+ 31 - 10
src/gui/dialogues/firstrundialog.cpp

@@ -106,6 +106,28 @@ bool FirstRunDialog::finishSetup()
 {
     writeSettings();
 
+    QFileInfo database_file(AStandardPaths::directory(AStandardPaths::Database).
+                                 absoluteFilePath(QStringLiteral("logbook.db")));
+    if (database_file.exists()) {
+        QMessageBox message_box(QMessageBox::Critical, tr("Database found"),
+                                tr("Warning."
+                                   "An existing database file has been detected on your system.<br>"
+                                   "A backup copy of the existing database will be created at this location:<br>"
+                                   "%1").arg(
+                                    QDir::cleanPath(AStandardPaths::directory(AStandardPaths::Backup).canonicalPath())));
+        message_box.exec();
+        ADataBaseSetup::backupOldData();
+    }
+    if (!aDB->connect()) {
+        QMessageBox message_box(QMessageBox::Critical, tr("Database setup failed"),
+                                tr("Errors have ocurred creating the database."
+                                   "Without a working database The application will not be usable.<br>"
+                                   "The following error has ocurred:<br>"
+                                   "Database: Unable to connect"));
+        message_box.exec();
+        return false;
+    }
+
     if (!setupDatabase()) {
         QMessageBox message_box(QMessageBox::Critical, tr("Database setup failed"),
                                 tr("Errors have ocurred creating the database."
@@ -124,6 +146,7 @@ bool FirstRunDialog::finishSetup()
         message_box.exec();
         return false;
     }
+    aDB->disconnect(); // connection will be re-established by main()
     return true;
 }
 
@@ -184,28 +207,24 @@ bool FirstRunDialog::setupDatabase()
     confirm.setDefaultButton(QMessageBox::No);
 
     if (confirm.exec() == QMessageBox::Yes) {
-        useLocalTemplates = false;
+        useRessourceData = false;
         if (!ADataBaseSetup::downloadTemplates()) {
             QMessageBox message_box(this);
             message_box.setText(tr("Downloading latest data has failed.<br><br>Using local data instead."));
             message_box.exec();
-            useLocalTemplates = true; // fall back
-        } else {
-            useLocalTemplates = true;
+            useRessourceData = true; // fall back
         }
+    } else {
+        useRessourceData = true;
     }
 
-    aDB->disconnect();
-    ADataBaseSetup::backupOldData();
-    aDB->connect();
-
     // [F]: todo: handle unsuccessful steps
     if(!ADataBaseSetup::createDatabase())
         return false;
 
     aDB->updateLayout();
 
-    if(!ADataBaseSetup::importDefaultData(useLocalTemplates))
+    if(!ADataBaseSetup::importDefaultData(useRessourceData))
         return false;
     aDB->updateLayout();
     return true;
@@ -286,7 +305,8 @@ void FirstRunDialog::on_currWarningThresholdSpinBox_valueChanged(int arg1)
 {
     ASettings::write(ASettings::UserData::CurrWarningThreshold, arg1);
 }
-
+// [F:] To Do - WIP
+/*
 void FirstRunDialog::on_currLicDateEdit_userDateChanged(const QDate &date)
 {
     ASettings::write(ASettings::UserData::LicCurrencyDate, date);
@@ -316,6 +336,7 @@ void FirstRunDialog::on_currCustom2DateEdit_userDateChanged(const QDate &date)
 {
     ASettings::write(ASettings::UserData::Custom2CurrencyDate, date);
 }
+*/
 
 void FirstRunDialog::on_currCustom1LineEdit_editingFinished()
 {

+ 12 - 12
src/gui/dialogues/firstrundialog.h

@@ -47,17 +47,17 @@ private slots:
 
     void on_currWarningThresholdSpinBox_valueChanged(int arg1);
 
-    void on_currLicDateEdit_userDateChanged(const QDate &date);
-
-    void on_currTrDateEdit_userDateChanged(const QDate &date);
-
-    void on_currLckDateEdit_userDateChanged(const QDate &date);
-
-    void on_currMedDateEdit_userDateChanged(const QDate &date);
-
-    void on_currCustom1DateEdit_userDateChanged(const QDate &date);
-
-    void on_currCustom2DateEdit_userDateChanged(const QDate &date);
+    //void on_currLicDateEdit_userDateChanged(const QDate &date);
+    //
+    //void on_currTrDateEdit_userDateChanged(const QDate &date);
+    //
+    //void on_currLckDateEdit_userDateChanged(const QDate &date);
+    //
+    //void on_currMedDateEdit_userDateChanged(const QDate &date);
+    //
+    //void on_currCustom1DateEdit_userDateChanged(const QDate &date);
+    //
+    //void on_currCustom2DateEdit_userDateChanged(const QDate &date);
 
     void on_currCustom1LineEdit_editingFinished();
 
@@ -65,7 +65,7 @@ private slots:
 
 private:
     Ui::FirstRunDialog *ui;
-    bool useLocalTemplates;
+    bool useRessourceData;
 
     void writeSettings();
     bool setupDatabase();

+ 3 - 1
src/gui/widgets/debugwidget.cpp

@@ -25,6 +25,7 @@
 #include <QtGlobal>
 #include "src/functions/atime.h"
 #include "src/functions/astat.h"
+#include "src/classes/acurrencyentry.h"
 
 DebugWidget::DebugWidget(QWidget *parent) :
     QWidget(parent),
@@ -185,7 +186,8 @@ void DebugWidget::on_importCsvPushButton_clicked()
 
 void DebugWidget::on_debugPushButton_clicked()
 {
-    DEB << "Expiration Date:" << AStat::currencyTakeOffLandingExpiry();
+
+    DEB << ASettings::read(ASettings::UserData::CurrWarningThreshold).toInt();
     // debug space
     //ASettings::write(ASettings::Setup::SetupComplete, false);
 }

+ 29 - 25
src/gui/widgets/homewidget.cpp

@@ -37,6 +37,7 @@ HomeWidget::HomeWidget(QWidget *parent) :
     ui->setupUi(this);
     today = QDate::currentDate();
     currWarningThreshold = ASettings::read(ASettings::UserData::CurrWarningThreshold).toInt();
+    DEB << "Current Warning Threshold:"<< currWarningThreshold;
     ftlWarningThreshold = ASettings::read(ASettings::UserData::FtlWarningThreshold).toDouble();
     auto logo = QPixmap(Opl::Assets::LOGO);
     ui->logoLabel->setPixmap(logo);
@@ -51,7 +52,7 @@ HomeWidget::HomeWidget(QWidget *parent) :
 
     DEB << "Filling Home Widget...";
     fillTotals();
-    fillCurrencies();
+    fillAllCurrencies();
     fillLimitations();
 }
 
@@ -62,11 +63,13 @@ HomeWidget::~HomeWidget()
 
 void HomeWidget::onHomeWidget_dataBaseUpdated()
 {
+    DEB << "Updating HomeWidget...";
+    currWarningThreshold = ASettings::read(ASettings::UserData::CurrWarningThreshold).toInt();
     for (const auto &label : limitationDisplayLabels)
         label->setStyleSheet(QString());
 
     fillTotals();
-    fillCurrencyTakeOffLanding();
+    fillAllCurrencies();
     fillLimitations();
 }
 
@@ -79,51 +82,52 @@ void HomeWidget::fillTotals()
     }
 }
 
-void HomeWidget::fillCurrency(ASettings::UserData date, QLabel* display_label)
+void HomeWidget::fillCurrency(ACurrencyEntry::CurrencyName currency_name, QLabel* display_label)
 {
-    auto currency_date = ASettings::read(date).toDate();
-
-    if (!currency_date.isValid())
-        return;
-
-    display_label->setText(currency_date.toString(Qt::TextDate));
-    if (today.addDays(currWarningThreshold) >= currency_date) { // expires less than 30 days from today
-        setLabelColour(display_label, Colour::Orange);
-    }
-    if (today >= currency_date) { // is expired
-        setLabelColour(display_label, Colour::Red);
+    auto currency_entry = aDB->getCurrencyEntry(currency_name);
+    if (currency_entry.isValid()) {
+        auto currency_date = QDate::fromString(currency_entry.tableData.value(
+                                               Opl::Db::CURRENCIES_EXPIRYDATE).toString(),
+                                               Qt::ISODate);
+        display_label->setText(currency_date.toString(Qt::TextDate));
+        setLabelColour(display_label, Colour::None);
+
+        if (today.addDays(currWarningThreshold) >= currency_date) { // expires less than 30 days from today
+            setLabelColour(display_label, Colour::Orange);
+        }
+        if (today >= currency_date) { // is expired
+            setLabelColour(display_label, Colour::Red);
+        }
+    } else {
+        display_label->setText(tr("Invalid Date"));
     }
 }
 
-void HomeWidget::fillCurrencies()
+void HomeWidget::fillAllCurrencies()
 {
     fillCurrencyTakeOffLanding();
 
     ASettings::read(ASettings::UserData::ShowLicCurrency).toBool() ?
-                fillCurrency(ASettings::UserData::ShowLicCurrency, ui->currLicDisplayLabel)
+                fillCurrency(ACurrencyEntry::CurrencyName::Licence, ui->currLicDisplayLabel)
               : hideLabels(ui->currLicLabel, ui->currLicDisplayLabel);
-
     ASettings::read(ASettings::UserData::ShowTrCurrency).toBool() ?
-                fillCurrency(ASettings::UserData::TrCurrencyDate, ui->currTrDisplayLabel)
+                fillCurrency(ACurrencyEntry::CurrencyName::TypeRating, ui->currTrDisplayLabel)
               : hideLabels(ui->currTrLabel, ui->currTrDisplayLabel);
-
     ASettings::read(ASettings::UserData::ShowLckCurrency).toBool() ?
-                fillCurrency(ASettings::UserData::LckCurrencyDate, ui->currLckDisplayLabel)
+                fillCurrency(ACurrencyEntry::CurrencyName::LineCheck, ui->currLckDisplayLabel)
               : hideLabels(ui->currLckLabel, ui->currLckDisplayLabel);
-
     ASettings::read(ASettings::UserData::ShowMedCurrency).toBool() ?
-                fillCurrency(ASettings::UserData::MedCurrencyDate, ui->currMedDisplayLabel)
+                fillCurrency(ACurrencyEntry::CurrencyName::Medical, ui->currMedDisplayLabel)
               : hideLabels(ui->currMedLabel, ui->currMedDisplayLabel);
 
     ASettings::read(ASettings::UserData::ShowCustom1Currency).toBool() ?
-                fillCurrency(ASettings::UserData::Custom1CurrencyDate, ui->currCustom1DisplayLabel)
+                fillCurrency(ACurrencyEntry::CurrencyName::Custom1, ui->currCustom1DisplayLabel)
               : hideLabels(ui->currCustom1Label, ui->currCustom1DisplayLabel);
     const QString custom1_text = ASettings::read(ASettings::UserData::Custom1CurrencyName).toString();
     if (!custom1_text.isEmpty())
         ui->currCustom1Label->setText(custom1_text);
-
     ASettings::read(ASettings::UserData::ShowCustom2Currency).toBool() ?
-                fillCurrency(ASettings::UserData::Custom2CurrencyDate, ui->currCustom2DisplayLabel)
+                fillCurrency(ACurrencyEntry::CurrencyName::Custom2, ui->currCustom2DisplayLabel)
               : hideLabels(ui->currCustom2Label, ui->currCustom2DisplayLabel);
     const QString custom2_text = ASettings::read(ASettings::UserData::Custom2CurrencyName).toString();
     if (!custom2_text.isEmpty())

+ 16 - 15
src/gui/widgets/homewidget.h

@@ -26,6 +26,7 @@
 #include "src/functions/astat.h"
 #include "src/database/adatabase.h"
 #include "src/classes/asettings.h"
+#include "src/classes/acurrencyentry.h"
 
 namespace Ui {
 class HomeWidget;
@@ -42,28 +43,24 @@ public:
 private:
     Ui::HomeWidget *ui;
 
-    QDate today;
-    int currWarningThreshold;
-    double ftlWarningThreshold;
+    QList<QLabel*> limitationDisplayLabels;
+    QDate          today;
+    int            currWarningThreshold;
+    double         ftlWarningThreshold;
 
     void fillTotals();
-    void fillCurrencies();
+    void fillAllCurrencies();
     void fillCurrencyTakeOffLanding();
+    void fillCurrency(ACurrencyEntry::CurrencyName currency_name, QLabel *display_label);
     void fillLimitations();
 
-
-
-    QList<QLabel*> limitationDisplayLabels;
-    /*!
-     * \brief Retreives the users first name from the database.
-     */
-    const QString userName();
-
-    enum class Colour {Red, Orange};
-
+    enum class Colour {Red, Orange, None};
     inline void setLabelColour(QLabel* label, Colour colour)
     {
         switch (colour) {
+        case Colour::None:
+            label->setStyleSheet(QString());
+            break;
         case Colour::Red:
             label->setStyleSheet(QStringLiteral("color: red"));
             break;
@@ -80,7 +77,11 @@ private:
         label1->hide();
         label2->hide();
     }
-    void fillCurrency(ASettings::UserData date, QLabel *display_label);
+
+    /*!
+     * \brief Retreives the users first name from the database.
+     */
+    const QString userName();
 public slots:
     void onHomeWidget_dataBaseUpdated();
 };

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

@@ -75,7 +75,7 @@ void LogbookWidget::prepareModelAndView(int view_id)
         displayModel->select();
         break;
     case 1:
-        LOG << "Loading Default View...\n";
+        LOG << "Loading EASA View...\n";
         displayModel->setTable(QStringLiteral("viewEASA"));
         displayModel->select();
         break;
@@ -250,9 +250,10 @@ void LogbookWidget::onDisplayModel_dataBaseUpdated()
     view->resizeColumnsToContents();
 }
 
-void LogbookWidget::onLogbookWidget_viewSelectionChanged(int view_id)
+void LogbookWidget::onLogbookWidget_viewSelectionChanged(SettingsWidget::SettingSignal signal)
 {
-    prepareModelAndView(view_id);
+    if (signal == SettingsWidget::SettingSignal::LogbookWidget)
+        prepareModelAndView(ASettings::read(ASettings::Main::LogbookView).toInt());
 }
 
 void LogbookWidget::on_showAllButton_clicked()

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

@@ -25,6 +25,7 @@
 #include <QDebug>
 #include <QMenu>
 #include <QTableView>
+#include "src/gui/widgets/settingswidget.h"
 
 namespace Ui {
 class LogbookWidget;
@@ -53,7 +54,7 @@ private slots:
 
 public slots:
     void onDisplayModel_dataBaseUpdated();
-    void onLogbookWidget_viewSelectionChanged(int);
+    void onLogbookWidget_viewSelectionChanged(SettingsWidget::SettingSignal signal);
 
 private:
     Ui::LogbookWidget *ui;

+ 51 - 28
src/gui/widgets/settingswidget.cpp

@@ -52,6 +52,7 @@ SettingsWidget::SettingsWidget(QWidget *parent) :
     ui->tabWidget->setCurrentIndex(0);
 
     setupComboBoxes();
+    setupDateEdits();
     setupValidators();
     readSettings();
 }
@@ -81,6 +82,30 @@ void SettingsWidget::setupComboBoxes(){
     }
 }
 
+void SettingsWidget::setupDateEdits()
+{
+    const QList<QPair<ACurrencyEntry::CurrencyName, QDateEdit* >> currencies = {
+        {ACurrencyEntry::CurrencyName::Licence,     ui->currLicDateEdit},
+        {ACurrencyEntry::CurrencyName::TypeRating,  ui->currTrDateEdit},
+        {ACurrencyEntry::CurrencyName::LineCheck,   ui->currLckDateEdit},
+        {ACurrencyEntry::CurrencyName::Medical,     ui->currMedDateEdit},
+        {ACurrencyEntry::CurrencyName::Custom1,     ui->currCustom1DateEdit},
+        {ACurrencyEntry::CurrencyName::Custom2,     ui->currCustom2DateEdit}
+    };
+    for (const auto &pair : currencies) {
+        const QSignalBlocker signal_blocker(pair.second);
+        const auto entry = aDB->getCurrencyEntry(pair.first);
+        if (entry.isValid()) { // set date
+            const auto date = QDate::fromString(
+                        entry.tableData.value(Opl::Db::CURRENCIES_EXPIRYDATE).toString(),
+                        Qt::ISODate);
+            pair.second->setDate(date);
+        } else { // set current date
+            pair.second->setDate(QDate::currentDate());
+        }
+    }
+}
+
 void SettingsWidget::readSettings()
 {
     /*
@@ -112,27 +137,16 @@ void SettingsWidget::readSettings()
      * Currencies Tab
      */
     ui->currToLdgCheckBox->setChecked(ASettings::read(ASettings::UserData::ShowToLgdCurrency).toBool());
-
-    ui->currLicDateEdit->setDate(ASettings::read(ASettings::UserData::LicCurrencyDate).toDate());
     ui->currLicCheckBox->setChecked(ASettings::read(ASettings::UserData::ShowLicCurrency).toBool());
-
-    ui->currTrDateEdit->setDate(ASettings::read(ASettings::UserData::TrCurrencyDate).toDate());
     ui->currTrCheckBox->setChecked(ASettings::read(ASettings::UserData::ShowTrCurrency).toBool());
-
-    ui->currLckDateEdit->setDate(ASettings::read(ASettings::UserData::LckCurrencyDate).toDate());
     ui->currLckCheckBox->setChecked(ASettings::read(ASettings::UserData::ShowLckCurrency).toBool());
-
-    ui->currMedDateEdit->setDate(ASettings::read(ASettings::UserData::MedCurrencyDate).toDate());
     ui->currMedCheckBox->setChecked(ASettings::read(ASettings::UserData::ShowMedCurrency).toBool());
-
-    ui->currCustom1DateEdit->setDate(ASettings::read(ASettings::UserData::Custom1CurrencyDate).toDate());
     ui->currCustom1CheckBox->setChecked(ASettings::read(ASettings::UserData::ShowCustom1Currency).toBool());
-
-    ui->currCustom2DateEdit->setDate(ASettings::read(ASettings::UserData::Custom2CurrencyDate).toDate());
     ui->currCustom2CheckBox->setChecked(ASettings::read(ASettings::UserData::ShowCustom2Currency).toBool());
-
-    ui->currWarningCheckBox->setChecked(ASettings::read(ASettings::UserData::CurrWarningEnabled).toBool());
     ui->currWarningThresholdSpinBox->setValue(ASettings::read(ASettings::UserData::CurrWarningThreshold).toInt());
+    ui->currWarningCheckBox->setChecked(ASettings::read(ASettings::UserData::CurrWarningEnabled).toBool());
+    ui->currCustom1LineEdit->setText(ASettings::read(ASettings::UserData::Custom1CurrencyName).toString());
+    ui->currCustom2LineEdit->setText(ASettings::read(ASettings::UserData::Custom2CurrencyName).toString());
 
 
     /*
@@ -300,7 +314,7 @@ void SettingsWidget::on_prefixLineEdit_textChanged(const QString &arg1)
 void SettingsWidget::on_logbookViewComboBox_currentIndexChanged(int index)
 {
     ASettings::write(ASettings::Main::LogbookView, index);
-    emit viewSelectionChanged(index);
+    emit settingChanged(SettingSignal::LogbookWidget);
 }
 void SettingsWidget::on_pilotSortComboBox_currentIndexChanged(int index)
 {
@@ -480,32 +494,39 @@ void SettingsWidget::on_resetStylePushButton_clicked()
 
 void SettingsWidget::on_currLicDateEdit_userDateChanged(const QDate &date)
 {
-    ASettings::write(ASettings::UserData::LicCurrencyDate, date);
+    ACurrencyEntry entry(ACurrencyEntry::CurrencyName::Licence, date);
+    aDB->commit(entry);
+
 }
 
 void SettingsWidget::on_currTrDateEdit_userDateChanged(const QDate &date)
 {
-    ASettings::write(ASettings::UserData::TrCurrencyDate, date);
+    ACurrencyEntry entry(ACurrencyEntry::CurrencyName::TypeRating, date);
+    aDB->commit(entry);
 }
 
 void SettingsWidget::on_currLckDateEdit_userDateChanged(const QDate &date)
 {
-    ASettings::write(ASettings::UserData::LckCurrencyDate, date);
+    ACurrencyEntry entry(ACurrencyEntry::CurrencyName::LineCheck, date);
+    aDB->commit(entry);
 }
 
 void SettingsWidget::on_currMedDateEdit_userDateChanged(const QDate &date)
 {
-    ASettings::write(ASettings::UserData::MedCurrencyDate, date);
+    ACurrencyEntry entry(ACurrencyEntry::CurrencyName::Medical, date);
+    aDB->commit(entry);
 }
 
 void SettingsWidget::on_currCustom1DateEdit_userDateChanged(const QDate &date)
 {
-    ASettings::write(ASettings::UserData::Custom1CurrencyDate, date);
+    ACurrencyEntry entry(ACurrencyEntry::CurrencyName::Custom1, date);
+    aDB->commit(entry);
 }
 
 void SettingsWidget::on_currCustom2DateEdit_userDateChanged(const QDate &date)
 {
-    ASettings::write(ASettings::UserData::Custom2CurrencyDate, date);
+    ACurrencyEntry entry(ACurrencyEntry::CurrencyName::Custom2, date);
+    aDB->commit(entry);
 }
 
 void SettingsWidget::on_currToLdgCheckBox_stateChanged(int arg1)
@@ -520,6 +541,7 @@ void SettingsWidget::on_currToLdgCheckBox_stateChanged(int arg1)
     default:
         break;
     }
+    emit settingChanged(HomeWidget);
 }
 
 void SettingsWidget::on_currLicCheckBox_stateChanged(int arg1)
@@ -534,7 +556,7 @@ void SettingsWidget::on_currLicCheckBox_stateChanged(int arg1)
     default:
         break;
     }
-    ASettings::write(ASettings::UserData::LicCurrencyDate, ui->currLicDateEdit->date());
+    emit settingChanged(HomeWidget);
 }
 
 void SettingsWidget::on_currTrCheckBox_stateChanged(int arg1)
@@ -549,7 +571,7 @@ void SettingsWidget::on_currTrCheckBox_stateChanged(int arg1)
     default:
         break;
     }
-    ASettings::write(ASettings::UserData::TrCurrencyDate, ui->currTrDateEdit->date());
+    emit settingChanged(HomeWidget);
 }
 
 void SettingsWidget::on_currLckCheckBox_stateChanged(int arg1)
@@ -564,7 +586,7 @@ void SettingsWidget::on_currLckCheckBox_stateChanged(int arg1)
     default:
         break;
     }
-    ASettings::write(ASettings::UserData::LckCurrencyDate, ui->currLckDateEdit->date());
+    emit settingChanged(HomeWidget);
 }
 
 void SettingsWidget::on_currMedCheckBox_stateChanged(int arg1)
@@ -579,7 +601,7 @@ void SettingsWidget::on_currMedCheckBox_stateChanged(int arg1)
     default:
         break;
     }
-    ASettings::write(ASettings::UserData::MedCurrencyDate, ui->currMedDateEdit->date());
+    emit settingChanged(HomeWidget);
 }
 
 void SettingsWidget::on_currCustom1CheckBox_stateChanged(int arg1)
@@ -594,7 +616,7 @@ void SettingsWidget::on_currCustom1CheckBox_stateChanged(int arg1)
     default:
         break;
     }
-    ASettings::write(ASettings::UserData::Custom1CurrencyDate, ui->currCustom1DateEdit->date());
+    emit settingChanged(HomeWidget);
 }
 
 void SettingsWidget::on_currCustom2CheckBox_stateChanged(int arg1)
@@ -609,7 +631,7 @@ void SettingsWidget::on_currCustom2CheckBox_stateChanged(int arg1)
     default:
         break;
     }
-    ASettings::write(ASettings::UserData::Custom2CurrencyDate, ui->currCustom2DateEdit->date());
+    emit settingChanged(HomeWidget);
 }
 
 void SettingsWidget::on_currWarningCheckBox_stateChanged(int arg1)
@@ -624,12 +646,13 @@ void SettingsWidget::on_currWarningCheckBox_stateChanged(int arg1)
     default:
         break;
     }
-    ASettings::write(ASettings::UserData::CurrWarningThreshold, arg1);
+    emit settingChanged(HomeWidget);
 }
 
 void SettingsWidget::on_currWarningThresholdSpinBox_valueChanged(int arg1)
 {
     ASettings::write(ASettings::UserData::CurrWarningThreshold, arg1);
+    emit settingChanged(SettingSignal::HomeWidget);
 }
 
 void SettingsWidget::on_currCustom1LineEdit_editingFinished()

+ 13 - 1
src/gui/widgets/settingswidget.h

@@ -38,6 +38,11 @@ public:
     explicit SettingsWidget(QWidget *parent = nullptr);
     ~SettingsWidget();
 
+    /*!
+     * \brief Widgets that need to receive a signal when a setting is updated.
+     */
+    enum SettingSignal {LogbookWidget, HomeWidget};
+
 private slots:
 
 //    void onThemeGroup_buttonClicked(int theme_id);
@@ -113,12 +118,19 @@ private:
 
     void setupComboBoxes();
 
+    void setupDateEdits();
+
     void updatePersonalDetails();
 
     bool usingStylesheet();
 
 signals:
-    void viewSelectionChanged(int view_id);
+
+    /*!
+     * \brief settingChanged is emitted when a setting change shall trigger
+     * an update to another widget.
+     */
+    void settingChanged(SettingSignal widget);
 };
 
 #endif // SETTINGSWIDGET_H

+ 4 - 0
src/oplconstants.h

@@ -104,6 +104,7 @@ static const auto TABLE_PILOTS           = QLatin1String("pilots");
 static const auto TABLE_TAILS            = QLatin1String("tails");
 static const auto TABLE_AIRCRAFT         = QLatin1String("aircraft");
 static const auto TABLE_AIRPORTS         = QLatin1String("airports");
+static const auto TABLE_CURRENCIES       = QLatin1String("currencies");
 
 // Flights table columns
 static const auto FLIGHTS_DOFT           = QLatin1String("doft");
@@ -159,6 +160,9 @@ static const auto PILOTS_EMPLOYEEID      = QLatin1String("employeeid");
 static const auto PILOTS_PHONE           = QLatin1String("phone");
 static const auto PILOTS_EMAIL           = QLatin1String("email");
 
+// Currencies table
+static const auto CURRENCIES_EXPIRYDATE  = QLatin1String("expiryDate");
+
 // all tables
 static const auto ROWID                  = QLatin1String("ROWID");
 static const auto NULL_TIME_hhmm         = QLatin1String("00:00");

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä