Browse Source

Merge pull request #55 from fiffty-50/develop-issue#51-2

closes #51 and closes #53
Felix Turowsky 4 years ago
parent
commit
a5331f306d

+ 3 - 0
openPilotLog.pro

@@ -65,8 +65,10 @@ HEADERS += \
     src/database/adatabasesetup.h \
     src/database/declarations.h \
     src/functions/acalc.h \
+    src/functions/adatetime.h \
     src/functions/areadcsv.h \
     src/functions/astat.h \
+    src/functions/atime.h \
     src/gui/dialogues/firstrundialog.h \
     src/gui/dialogues/newflightdialog.h \
     src/gui/dialogues/newpilotdialog.h \
@@ -78,6 +80,7 @@ HEADERS += \
     src/gui/widgets/pilotswidget.h \
     src/gui/widgets/settingswidget.h \
     src/gui/widgets/totalswidget.h \
+    src/oplconstants.h \
     src/testing/abenchmark.h \
     src/testing/adebug.h \
     src/testing/atimer.h

+ 2 - 1
src/classes/aaircraftentry.cpp

@@ -16,13 +16,14 @@
  *along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 #include "aaircraftentry.h"
+#include "src/oplconstants.h"
 
 AAircraftEntry::AAircraftEntry()
     : AEntry::AEntry(DEFAULT_AIRCRAFT_POSITION)
 {}
 
 AAircraftEntry::AAircraftEntry(RowId row_id)
-    : AEntry::AEntry(DataPosition(DB_TABLE_AIRCRAFT, row_id))
+    : AEntry::AEntry(DataPosition(Opl::Db::TABLE_AIRCRAFT, row_id))
 {}
 
 AAircraftEntry::AAircraftEntry(RowData table_data)

+ 16 - 10
src/classes/aflightentry.cpp

@@ -17,13 +17,16 @@
  */
 #include "aflightentry.h"
 #include "src/database/adatabase.h"
+#include "src/oplconstants.h"
+#include "src/functions/atime.h"
+#include "src/classes/asettings.h"
 
 AFlightEntry::AFlightEntry()
     : AEntry::AEntry(DEFAULT_FLIGHT_POSITION)
 {}
 
 AFlightEntry::AFlightEntry(RowId row_id)
-    : AEntry::AEntry(DataPosition(DB_TABLE_FLIGHTS, row_id))
+    : AEntry::AEntry(DataPosition(Opl::Db::TABLE_FLIGHTS, row_id))
 {}
 
 AFlightEntry::AFlightEntry(RowData table_data)
@@ -36,18 +39,21 @@ const QString AFlightEntry::summary()
         return QString();
 
     QString flight_summary;
-    flight_summary.append(tableData.value(DB_FLIGHTS_DOFT).toString() + " ");
-    flight_summary.append(tableData.value(DB_FLIGHTS_DEPT).toString() + " ");
-    flight_summary.append(ACalc::minutesToString(tableData.value(DB_FLIGHTS_TOFB).toString()) + " ");
-    flight_summary.append(ACalc::minutesToString(tableData.value(DB_FLIGHTS_TONB).toString()) + " ");
-    flight_summary.append(tableData.value(DB_FLIGHTS_DEST).toString() + " ");
+    auto space = QStringLiteral(" ");
+    flight_summary.append(tableData.value(Opl::Db::FLIGHTS_DOFT).toString() + space);
+    flight_summary.append(tableData.value(Opl::Db::FLIGHTS_DEPT).toString() + space);
+    flight_summary.append(ATime::toString(tableData.value(Opl::Db::FLIGHTS_TOFB).toInt())
+                          + space);
+    flight_summary.append(ATime::toString(tableData.value(Opl::Db::FLIGHTS_TONB).toInt())
+                          + space);
+    flight_summary.append(tableData.value(Opl::Db::FLIGHTS_DEST).toString());
 
     return flight_summary;
 }
 
 const QString AFlightEntry::getRegistration()
 {
-    ATailEntry acft = aDB->resolveForeignTail(tableData.value(DB_FLIGHTS_ACFT).toInt());
+    ATailEntry acft = aDB->resolveForeignTail(tableData.value(Opl::Db::FLIGHTS_ACFT).toInt());
     return acft.registration();
 }
 
@@ -55,16 +61,16 @@ const QString AFlightEntry::getPilotName(pilotPosition pilot_)
 {
     switch (pilot_) {
     case pilotPosition::pic: {
-        auto foreign_pilot = aDB->resolveForeignPilot(tableData.value(DB_FLIGHTS_PIC).toInt());
+        auto foreign_pilot = aDB->resolveForeignPilot(tableData.value(Opl::Db::FLIGHTS_PIC).toInt());
         return foreign_pilot.name();
         break;
     }
     case pilotPosition::secondPilot: {
-        auto foreign_pilot = aDB->resolveForeignPilot(tableData.value(DB_FLIGHTS_SECONDPILOT).toInt());
+        auto foreign_pilot = aDB->resolveForeignPilot(tableData.value(Opl::Db::FLIGHTS_SECONDPILOT).toInt());
         return foreign_pilot.name();
     }
     case pilotPosition::thirdPilot: {
-        auto foreign_pilot = aDB->resolveForeignPilot(tableData.value(DB_FLIGHTS_THIRDPILOT).toInt());
+        auto foreign_pilot = aDB->resolveForeignPilot(tableData.value(Opl::Db::FLIGHTS_THIRDPILOT).toInt());
         return foreign_pilot.name();
         break;
     } // case scope

+ 0 - 1
src/classes/aflightentry.h

@@ -19,7 +19,6 @@
 #define AFLIGHTENTRY_H
 
 #include "src/classes/aentry.h"
-#include "src/functions/acalc.h"
 
 class AFlightEntry : public AEntry {
 public:

+ 5 - 4
src/classes/apilotentry.cpp

@@ -16,13 +16,14 @@
  *along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 #include "apilotentry.h"
+#include "src/oplconstants.h"
 
 APilotEntry::APilotEntry()
     : AEntry::AEntry(DEFAULT_PILOT_POSITION)
 {}
 
 APilotEntry::APilotEntry(RowId row_id)
-    : AEntry::AEntry(DataPosition(DB_TABLE_PILOTS, row_id))
+    : AEntry::AEntry(DataPosition(Opl::Db::TABLE_PILOTS, row_id))
 {}
 
 APilotEntry::APilotEntry(RowData table_data)
@@ -32,8 +33,8 @@ APilotEntry::APilotEntry(RowData table_data)
 const QString APilotEntry::name()
 {
     if (tableData.isEmpty())
-        return DB_NULL;
+        return QString();
 
-    return tableData.value(DB_PILOTS_LASTNAME).toString() + ','
-           +tableData.value(DB_PILOTS_FIRSTNAME).toString().left(1) + '.';
+    return tableData.value(Opl::Db::PILOTS_LASTNAME).toString() + ','
+           +tableData.value(Opl::Db::PILOTS_FIRSTNAME).toString().left(1) + '.';
 }

+ 1 - 0
src/classes/asettings.cpp

@@ -48,6 +48,7 @@ QMap<ASettings::FlightLogging, QString> ASettings::flightLoggingMap = {
     {FlightLogging::PilotFlying,        QStringLiteral("pilotFlying")},
     {FlightLogging::NightAngle,         QStringLiteral("nightangle")},
     {FlightLogging::Rules,              QStringLiteral("rules")},
+    {FlightLogging::FlightTimeFormat,   QStringLiteral("flightTimeFormat")}
 };
 
 QMap<ASettings::Setup, QString> ASettings::setupMap = {

+ 1 - 0
src/classes/asettings.h

@@ -58,6 +58,7 @@ public:
         PilotFlying,
         NightAngle,
         Rules,
+        FlightTimeFormat
     };
 
     enum class NewFlight {

+ 0 - 3
src/classes/astyle.cpp

@@ -5,8 +5,6 @@
 #include "src/testing/adebug.h"
 #include "src/classes/asettings.h"
 
-// this was throwing hundreds of warnings on 5.9.5, fusion is a good default for all platforms, let's
-// stick with that for now.
 const QString AStyle::defaultStyle = QStringLiteral("Fusion");
 
 const QString AStyle::defaultStyleSheet = QStringLiteral("");
@@ -72,7 +70,6 @@ void AStyle::setStyle(const QString style)
 
 void AStyle::setStyleSheet(const StyleSheet stylesheet)
 {
-    // [F]: qt 5.9.5 compatibility
     DEB << "Setting stylesheet to:" << defaultStyleSheets[stylesheet].baseName();
     qApp->setStyleSheet(read_stylesheet(stylesheet));
     ASettings::write(ASettings::Main::StyleSheet, stylesheet);

+ 3 - 3
src/classes/astyle.h

@@ -13,9 +13,9 @@ class AStyle
 {
 public:
     enum StyleSheet{
-        Dark = 0,
-        Light,
-        Default,
+        Default = 0,
+        Dark,
+        Light
     };
 private:
     static QString currentStyle;

+ 9 - 8
src/classes/atailentry.cpp

@@ -16,13 +16,14 @@
  *along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 #include "atailentry.h"
+#include "src/oplconstants.h"
 
 ATailEntry::ATailEntry()
     : AEntry::AEntry(DEFAULT_TAIL_POSITION)
 {}
 
 ATailEntry::ATailEntry(RowId row_id)
-    : AEntry::AEntry(DataPosition(DB_TABLE_TAILS, row_id))
+    : AEntry::AEntry(DataPosition(Opl::Db::TABLE_TAILS, row_id))
 {}
 
 ATailEntry::ATailEntry(RowData table_data)
@@ -31,18 +32,18 @@ ATailEntry::ATailEntry(RowData table_data)
 
 const QString ATailEntry::registration()
 {
-    return getData().value(DB_TAILS_REGISTRATION).toString();
+    return getData().value(Opl::Db::TAILS_REGISTRATION).toString();
 }
 
 const QString ATailEntry::type()
 {
     QString type_string;
-    if (!tableData.value(DB_TAILS_MAKE).toString().isEmpty())
-        type_string.append(getData().value(DB_TAILS_MAKE).toString() + ' ');
-    if (!tableData.value(DB_TAILS_MODEL).toString().isEmpty())
-        type_string.append(getData().value(DB_TAILS_MODEL).toString());
-    if (!tableData.value(DB_TAILS_VARIANT).toString().isEmpty())
-        type_string.append('-' + getData().value(DB_TAILS_VARIANT).toString() + ' ');
+    if (!tableData.value(Opl::Db::TAILS_MAKE).toString().isEmpty())
+        type_string.append(getData().value(Opl::Db::TAILS_MAKE).toString() + ' ');
+    if (!tableData.value(Opl::Db::TAILS_MODEL).toString().isEmpty())
+        type_string.append(getData().value(Opl::Db::TAILS_MODEL).toString());
+    if (!tableData.value(Opl::Db::TAILS_VARIANT).toString().isEmpty())
+        type_string.append('-' + getData().value(Opl::Db::TAILS_VARIANT).toString() + ' ');
 
     return type_string;
 }

+ 4 - 3
src/database/adatabase.cpp

@@ -18,6 +18,7 @@
 #include "adatabase.h"
 #include "src/testing/adebug.h"
 #include "src/classes/astandardpaths.h"
+#include "src/oplconstants.h"
 
 
 ADatabaseError::ADatabaseError(QString msg_)
@@ -544,13 +545,13 @@ int ADatabase::getLastEntry(ADatabaseTarget target)
 
     switch (target) {
     case ADatabaseTarget::pilots:
-        statement.append(DB_TABLE_PILOTS);
+        statement.append(Opl::Db::TABLE_PILOTS);
         break;
     case ADatabaseTarget::aircraft:
-        statement.append(DB_TABLE_AIRCRAFT);
+        statement.append(Opl::Db::TABLE_AIRCRAFT);
         break;
     case ADatabaseTarget::tails:
-        statement.append(DB_TABLE_TAILS);
+        statement.append(Opl::Db::TABLE_TAILS);
         break;
     default:
         DEB << "Not a valid completer target for this function.";

+ 6 - 3
src/database/adatabasesetup.cpp

@@ -21,6 +21,8 @@
 #include "src/functions/areadcsv.h"
 #include "src/classes/astandardpaths.h"
 #include "src/classes/adownload.h"
+#include "src/oplconstants.h"
+#include "src/functions/adatetime.h"
 
 // Statements for creation of database tables, Revision 15
 
@@ -302,10 +304,11 @@ bool ADataBaseSetup::backupOldData()
         return true;
     }
 
-    auto date_string = QDateTime::currentDateTime().toString(Qt::ISODate);
+    auto date_string = ADateTime::toString(QDateTime::currentDateTime(),
+                                           Opl::Datetime::Backup);
     auto backup_dir = QDir(AStandardPaths::absPathOf(AStandardPaths::DatabaseBackup));
     auto backup_name = database_file.baseName() + "_bak_" + date_string + ".db";
-    auto file = QFile(aDB->databaseFile.absoluteFilePath());
+    QFile file(aDB->databaseFile.absoluteFilePath());
 
     if (!file.rename(backup_dir.absolutePath() + '/' + backup_name)) {
         DEB << "Unable to backup old database.";
@@ -398,7 +401,7 @@ bool ADataBaseSetup::createSchemata(const QStringList &statements)
 
     if (!errors.isEmpty()) {
         DEB_SRC << "The following errors have ocurred: ";
-        for (const auto& error : errors) {
+        for (const auto& error : qAsConst(errors)) {
             DEB_RAW << error;
         }
         return false;

+ 5 - 86
src/database/declarations.h

@@ -2,6 +2,7 @@
 #define DECLARATIONS_H
 
 #include <QtCore>
+#include "src/oplconstants.h"
 #include "src/testing/adebug.h"
 
 /*!
@@ -41,92 +42,10 @@ struct DataPosition {
          )
 };
 
-// [F]:
-// In many places throughout the application, we have to programatically access or write data
-// to or from the database using column names as identifiers, doing something like this:
-//
-// newData.insert("dept", ui->deptLocLineEdit->text());
-// newData.value("multipilot") // do stuff
-//
-// Declaring the literals here avoids memory allocation at runtime for construction of temporary qstrings
-// like ("dept"). See https://doc.qt.io/qt-5/qstring.html#QStringLiteral
-//
-
-// Table names
-static const auto DB_TABLE_FLIGHTS  = QStringLiteral("flights");
-static const auto DB_TABLE_PILOTS   = QStringLiteral("pilots");
-static const auto DB_TABLE_TAILS    = QStringLiteral("tails");
-static const auto DB_TABLE_AIRCRAFT = QStringLiteral("aircraft");
-static const auto DB_TABLE_AIRPORTS = QStringLiteral("airports");
 // Default Positions
-static auto const DEFAULT_FLIGHT_POSITION   = DataPosition(DB_TABLE_FLIGHTS, 0);
-static auto const DEFAULT_PILOT_POSITION    = DataPosition(DB_TABLE_PILOTS, 0);
-static auto const DEFAULT_TAIL_POSITION     = DataPosition(DB_TABLE_TAILS, 0);
-static auto const DEFAULT_AIRCRAFT_POSITION = DataPosition(DB_TABLE_AIRCRAFT, 0);
-// Flights table columns
-static const auto DB_FLIGHTS_DOFT           = QStringLiteral("doft");
-static const auto DB_FLIGHTS_DEPT           = QStringLiteral("dept");
-static const auto DB_FLIGHTS_DEST           = QStringLiteral("dest");
-static const auto DB_FLIGHTS_TOFB           = QStringLiteral("tofb");
-static const auto DB_FLIGHTS_TONB           = QStringLiteral("tonb");
-static const auto DB_FLIGHTS_PIC            = QStringLiteral("pic");
-static const auto DB_FLIGHTS_ACFT           = QStringLiteral("acft");
-static const auto DB_FLIGHTS_TBLK           = QStringLiteral("tblk");
-static const auto DB_FLIGHTS_TSPSE          = QStringLiteral("tSPSE");
-static const auto DB_FLIGHTS_TSPME           = QStringLiteral("tSPME");
-static const auto DB_FLIGHTS_TMP            = QStringLiteral("tMP");
-static const auto DB_FLIGHTS_TNIGHT         = QStringLiteral("tNIGHT");
-static const auto DB_FLIGHTS_TIFR           = QStringLiteral("tIFR");
-static const auto DB_FLIGHTS_TPIC           = QStringLiteral("tPIC");
-static const auto DB_FLIGHTS_TPICUS         = QStringLiteral("tPICUS");
-static const auto DB_FLIGHTS_TSIC           = QStringLiteral("tSIC");
-static const auto DB_FLIGHTS_TDUAL          = QStringLiteral("tDUAL");
-static const auto DB_FLIGHTS_TFI            = QStringLiteral("tFI");
-static const auto DB_FLIGHTS_TSIM           = QStringLiteral("tSIM");
-static const auto DB_FLIGHTS_PILOTFLYING    = QStringLiteral("pilotFlying");
-static const auto DB_FLIGHTS_TODAY          = QStringLiteral("toDay");
-static const auto DB_FLIGHTS_TONIGHT        = QStringLiteral("toNight");
-static const auto DB_FLIGHTS_LDGDAY         = QStringLiteral("ldgDay");
-static const auto DB_FLIGHTS_LDGNIGHT       = QStringLiteral("ldgNight");
-static const auto DB_FLIGHTS_AUTOLAND       = QStringLiteral("autoland");
-static const auto DB_FLIGHTS_SECONDPILOT    = QStringLiteral("secondPilot");
-static const auto DB_FLIGHTS_THIRDPILOT     = QStringLiteral("thirdPilot");
-static const auto DB_FLIGHTS_APPROACHTYPE   = QStringLiteral("approachType");
-static const auto DB_FLIGHTS_FLIGHTNUMBER   = QStringLiteral("flightNumber");
-static const auto DB_FLIGHTS_REMARKS        = QStringLiteral("remarks");
-
-// tails table
-
-static const auto DB_TAILS_REGISTRATION   = QStringLiteral("registration");
-static const auto DB_TAILS_COMPANY        = QStringLiteral("company");
-static const auto DB_TAILS_MAKE           = QStringLiteral("make");
-static const auto DB_TAILS_MODEL          = QStringLiteral("model");
-static const auto DB_TAILS_VARIANT        = QStringLiteral("variant");
-static const auto DB_TAILS_MULTIPILOT     = QStringLiteral("multipilot");
-static const auto DB_TAILS_MULTIENGINE    = QStringLiteral("multiengine");
-static const auto DB_TAILS_ENGINETYPE     = QStringLiteral("engineType");
-static const auto DB_TAILS_WEIGHTCLASS    = QStringLiteral("weightClass");
-
-// pilots table
-
-static const auto DB_PILOTS_LASTNAME       = QStringLiteral("lastname");
-static const auto DB_PILOTS_FIRSTNAME      = QStringLiteral("firstname");
-static const auto DB_PILOTS_ALIAS          = QStringLiteral("alias");
-static const auto DB_PILOTS_COMPANY        = QStringLiteral("company");
-static const auto DB_PILOTS_EMPLOYEEID     = QStringLiteral("employeeid");
-static const auto DB_PILOTS_PHONE          = QStringLiteral("phone");
-static const auto DB_PILOTS_EMAIL          = QStringLiteral("email");
-
-// all tables
-
-static const auto DB_ROWID          = QStringLiteral("ROWID");
-static const auto DB_NULL           = QStringLiteral("");
-static const auto DB_NULL_hhmm      = QStringLiteral("00:00");
-/*static const auto DB_               = QStringLiteral("");
-static const auto DB_               = QStringLiteral("");
-static const auto DB_               = QStringLiteral("");
-static const auto DB_               = QStringLiteral("");
-static const auto DB_               = QStringLiteral("");*/
-
+static auto const DEFAULT_FLIGHT_POSITION   = DataPosition(Opl::Db::TABLE_FLIGHTS, 0);
+static auto const DEFAULT_PILOT_POSITION    = DataPosition(Opl::Db::TABLE_PILOTS, 0);
+static auto const DEFAULT_TAIL_POSITION     = DataPosition(Opl::Db::TABLE_TAILS, 0);
+static auto const DEFAULT_AIRCRAFT_POSITION = DataPosition(Opl::Db::TABLE_AIRCRAFT, 0);
 
 #endif // DECLARATIONS_H

+ 22 - 20
src/functions/acalc.cpp

@@ -2,6 +2,7 @@
 #include "src/testing/adebug.h"
 #include "src/database/adatabase.h"
 #include "src/classes/asettings.h"
+#include "src/oplconstants.h"
 
 using namespace ACalc;
 
@@ -12,6 +13,7 @@ using namespace ACalc;
  * \param userinput from a QLineEdit
  * \return formatted QString "hh:mm" or Empty String
  */
+QT_DEPRECATED
 QString ACalc::formatTimeInput(QString user_input)
 {
     QString output; //
@@ -275,23 +277,23 @@ void ACalc::updateAutoTimes(int acft_id)
         auto flight = aDB->getFlightEntry(item.toInt());
         auto flight_data = flight.getData();
 
-        if(acft_data.value(DB_TAILS_MULTIPILOT).toInt() == 0
-                && acft_data.value(DB_TAILS_MULTIENGINE) == 0) {
+        if(acft_data.value(Opl::Db::TAILS_MULTIPILOT).toInt() == 0
+                && acft_data.value(Opl::Db::TAILS_MULTIENGINE) == 0) {
             DEB << "SPSE";
-            flight_data.insert(DB_FLIGHTS_TSPSE, flight_data.value(DB_FLIGHTS_TBLK));
-            flight_data.insert(DB_FLIGHTS_TSPME, DB_NULL);
-            flight_data.insert(DB_FLIGHTS_TMP, DB_NULL);
-        } else if ((acft_data.value(DB_TAILS_MULTIPILOT) == 0
-                    && acft.getData().value(DB_TAILS_MULTIENGINE) == 1)) {
+            flight_data.insert(Opl::Db::FLIGHTS_TSPSE, flight_data.value(Opl::Db::FLIGHTS_TBLK));
+            flight_data.insert(Opl::Db::FLIGHTS_TSPME, QStringLiteral(""));
+            flight_data.insert(Opl::Db::FLIGHTS_TMP, QStringLiteral(""));
+        } else if ((acft_data.value(Opl::Db::TAILS_MULTIPILOT) == 0
+                    && acft.getData().value(Opl::Db::TAILS_MULTIENGINE) == 1)) {
             DEB << "SPME";
-            flight_data.insert(DB_FLIGHTS_TSPME, flight_data.value(DB_FLIGHTS_TBLK));
-            flight_data.insert(DB_FLIGHTS_TSPSE, DB_NULL);
-            flight_data.insert(DB_FLIGHTS_TMP, DB_NULL);
-        } else if ((acft_data.value(DB_TAILS_MULTIPILOT) == 1)) {
+            flight_data.insert(Opl::Db::FLIGHTS_TSPME, flight_data.value(Opl::Db::FLIGHTS_TBLK));
+            flight_data.insert(Opl::Db::FLIGHTS_TSPSE, QStringLiteral(""));
+            flight_data.insert(Opl::Db::FLIGHTS_TMP, QStringLiteral(""));
+        } else if ((acft_data.value(Opl::Db::TAILS_MULTIPILOT) == 1)) {
             DEB << "MPME";
-            flight_data.insert(DB_FLIGHTS_TMP, flight_data.value(DB_FLIGHTS_TBLK));
-            flight_data.insert(DB_FLIGHTS_TSPSE, DB_NULL);
-            flight_data.insert(DB_FLIGHTS_TSPME, DB_NULL);
+            flight_data.insert(Opl::Db::FLIGHTS_TMP, flight_data.value(Opl::Db::FLIGHTS_TBLK));
+            flight_data.insert(Opl::Db::FLIGHTS_TSPSE, QStringLiteral(""));
+            flight_data.insert(Opl::Db::FLIGHTS_TSPME, QStringLiteral(""));
         }
         flight.setData(flight_data);
         aDB->commit(flight);
@@ -319,14 +321,14 @@ void ACalc::updateNightTimes()
 
         auto flt = aDB->getFlightEntry(item.toInt());
         auto data = flt.getData();
-        auto dateTime = QDateTime(QDate::fromString(data.value(DB_FLIGHTS_DOFT).toString(), Qt::ISODate),
-                                  QTime().addSecs(data.value(DB_FLIGHTS_TOFB).toInt() * 60),
+        auto dateTime = QDateTime(QDate::fromString(data.value(Opl::Db::FLIGHTS_DOFT).toString(), Qt::ISODate),
+                                  QTime().addSecs(data.value(Opl::Db::FLIGHTS_TOFB).toInt() * 60),
                                   Qt::UTC);
-        data.insert(DB_FLIGHTS_TNIGHT,
-                    calculateNightTime(data.value(DB_FLIGHTS_DEPT).toString(),
-                                       data.value(DB_FLIGHTS_DEST).toString(),
+        data.insert(Opl::Db::FLIGHTS_TNIGHT,
+                    calculateNightTime(data.value(Opl::Db::FLIGHTS_DEPT).toString(),
+                                       data.value(Opl::Db::FLIGHTS_DEST).toString(),
                                        dateTime,
-                                       data.value(DB_FLIGHTS_TBLK).toInt(),
+                                       data.value(Opl::Db::FLIGHTS_TBLK).toInt(),
                                        night_angle));
         flt.setData(data);
         aDB->commit(flt);

+ 10 - 1
src/functions/acalc.h

@@ -1,9 +1,13 @@
 #ifndef ACALC_H
 #define ACALC_H
 
-#include <QDateTime>
+#ifdef _MSC_VER
+#define _USE_MATH_DEFINES
+#endif
 #include <cmath>
+#include <QDateTime>
 #include <QDebug>
+#include "src/testing/adebug.h"
 /*!
  * \brief The ACalc namespace provides various functions for calculations that are performed
  * outside of the database. This includes tasks like converting different units and formats,
@@ -18,6 +22,7 @@ namespace ACalc {
  * \param tonb QTime Time On Blocks
  * \return Block Time in minutes
  */
+QT_DEPRECATED
 inline QTime blocktime(QTime tofb, QTime tonb)
 {
     QTime blocktime_out(0, 0); // initialise return value at midnight
@@ -39,6 +44,7 @@ inline QTime blocktime(QTime tofb, QTime tonb)
  * \param blockminutes from database
  * \return String hh:mm
  */
+QT_DEPRECATED
 inline QString minutesToString(QString block_minutes)
 {
     int minutes = block_minutes.toInt();
@@ -54,6 +60,7 @@ inline QString minutesToString(QString block_minutes)
     return block_time;
 };
 
+QT_DEPRECATED
 inline QString minutesToString(int block_minutes)
 {
     QString hour = QString::number(block_minutes / 60);
@@ -73,6 +80,7 @@ inline QString minutesToString(int block_minutes)
  * \param time QTime
  * \return int time as number of minutes
  */
+QT_DEPRECATED
 inline int QTimeToMinutes(QTime time)
 {
     QString timestring = time.toString("hh:mm");
@@ -86,6 +94,7 @@ inline int QTimeToMinutes(QTime time)
  * \param timestring "hh:mm"
  * \return String number of minutes
  */
+QT_DEPRECATED
 inline int stringToMinutes(QString timestring)
 {
     int minutes = (timestring.left(2).toInt()) * 60;

+ 25 - 0
src/functions/adatetime.h

@@ -0,0 +1,25 @@
+#ifndef ADATETIME_H
+#define ADATETIME_H
+#include <QtCore>
+#include "src/oplconstants.h"
+
+namespace ADateTime {
+
+/*!
+ * \brief toString formats a QDateTime object into a string in a uniform way.
+ * \return
+ */
+inline const QString toString (const QDateTime date_time, Opl::Datetime::DateTimeFormat format) {
+    switch (format) {
+    case Opl::Datetime::Default:
+        return date_time.toString(Qt::ISODate);
+    case Opl::Datetime::Backup:
+        return date_time.toString(QStringLiteral("yyyy_MM_dd_T_hh_mm"));
+    default:
+        return QString();
+    }
+}
+
+}
+
+#endif // ADATETIME_H

+ 164 - 0
src/functions/atime.h

@@ -0,0 +1,164 @@
+#ifndef ATIME_H
+#define ATIME_H
+
+#include <QtCore>
+#include <QTime>
+#include "src/oplconstants.h"
+#include "src/testing/adebug.h"
+
+namespace ATime {
+
+/*!
+ * \brief Converts a QTime to a String to be used in the UI
+ */
+inline const QString toString(const QTime &time, Opl::Time::FlightTimeFormat format = Opl::Time::Default)
+{
+    switch (format) {
+    case Opl::Time::Default:
+        return time.toString(QStringLiteral("hh:mm"));
+        break;
+    case Opl::Time::Decimal:
+        return QString::number(((time.hour() * 60 + time.minute() )/60.0), 'f', 2);
+        break;
+    default:
+        return QString();
+    }
+}
+
+/*!
+ * \brief Converts an integer of minutes as received from the Datbase to a String
+ */
+inline const QString toString(int minutes_in, Opl::Time::FlightTimeFormat format = Opl::Time::Default)
+{
+    switch (format) {
+    case Opl::Time::Default:
+    {
+        QString hour = QString::number(minutes_in / 60);
+        if (hour.size() < 2) {
+            hour.prepend(QStringLiteral("0"));
+        }
+        QString minute = QString::number(minutes_in % 60);
+        if (minute.size() < 2) {
+            minute.prepend(QStringLiteral("0"));
+        }
+        return hour + ':' + minute;
+    }
+    case Opl::Time::Decimal:
+    {
+        int hour = minutes_in / 60;
+        double minute = (minutes_in % 60) / 60.0;
+        return QString::number((hour + minute), 'f', 2);
+    }
+    default:
+        return QString();
+    }
+
+}
+
+inline double toDecimalHours(const QTime &time){
+    return (time.hour() * 60 + time.minute()) / 60.0;
+}
+
+inline int toMinutes(const QTime &time) {return time.hour() * 60 + time.minute();}
+
+inline QTime fromMinutes(int total_minutes)
+{
+    int minute = total_minutes % 60;
+    int hour = total_minutes / 60;
+
+    return QTime(hour, minute, 0);
+}
+
+inline const QTime fromString(QString time_string, Opl::Time::FlightTimeFormat format = Opl::Time::Default)
+{
+    switch (format) {
+    case Opl::Time::Default:
+        return QTime::fromString(time_string, QStringLiteral("hh:mm"));
+        break;
+    case Opl::Time::Decimal:
+    {
+        double decimal_time = time_string.toDouble();
+        int hour = decimal_time;
+        int minute = round((decimal_time - hour) * 60);
+        return QTime(hour, minute, 0);
+        break;
+    }
+    default:
+        return QTime();
+    }
+}
+
+inline const QTime fromString(const char* time_string, Opl::Time::FlightTimeFormat format = Opl::Time::Default)
+{
+    switch (format) {
+    case Opl::Time::Default:
+        return QTime::fromString(time_string, QStringLiteral("hh:mm"));
+        break;
+    case Opl::Time::Decimal:
+    {
+        double decimal_time = QString(time_string).toDouble();
+        int hour = decimal_time;
+        int minute = round((decimal_time - hour) * 60);
+        return QTime(hour, minute, 0);
+        break;
+    }
+    default:
+        return QTime();
+    }
+}
+
+inline QTime blocktime(const QTime &tofb, const QTime &tonb)
+{
+    QTime blocktime_out(0, 0); // initialise return value at midnight
+
+    if (tonb > tofb) { // landing same day
+        int block_seconds = tofb.secsTo(tonb);
+        blocktime_out = blocktime_out.addSecs(block_seconds);
+    } else { // landing next day
+        QTime midnight(0, 0);
+        int seconds = tofb.secsTo(midnight);
+        blocktime_out = blocktime_out.addSecs(seconds);
+        seconds = midnight.secsTo(tonb);
+        blocktime_out = blocktime_out.addSecs(seconds);
+    }
+    return blocktime_out;
+}
+
+/*!
+ * \brief verifies user input and formats to hh:mm
+ * if the output is not a valid time, an empty string is returned. Accepts
+ * input as hh:mm, h:mm, hhmm or hmm.
+ * \param userinput from a QLineEdit
+ * \return formatted QString "hh:mm" or Empty String
+ */
+inline const QString formatTimeInput(QString user_input)
+{
+    QTime temp_time; //empty time object is invalid by default
+
+    bool contains_seperator = user_input.contains(':');
+    if (user_input.length() == 4 && !contains_seperator) {
+        temp_time = QTime::fromString(user_input, QStringLiteral("hhmm"));
+    } else if (user_input.length() == 3 && !contains_seperator) {
+        if (user_input.toInt() < 240) { //Qtime is invalid if time is between 000 and 240 for this case
+            QString tempstring = user_input.prepend(QStringLiteral("0"));
+            temp_time = QTime::fromString(tempstring, QStringLiteral("hhmm"));
+        } else {
+            temp_time = QTime::fromString(user_input, QStringLiteral("Hmm"));
+        }
+    } else if (user_input.length() == 4 && contains_seperator) {
+        temp_time = QTime::fromString(user_input, QStringLiteral("h:mm"));
+    } else if (user_input.length() == 5 && contains_seperator) {
+        temp_time = QTime::fromString(user_input, QStringLiteral("hh:mm"));
+    }
+
+    auto output = temp_time.toString(QStringLiteral("hh:mm"));
+
+    if (output.isEmpty()) {
+        DEB << "Time input is invalid.";
+    }
+    return output;
+}
+
+} // namespace ATime
+
+#endif // ATIME_H

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

@@ -7,6 +7,7 @@
 #include "src/classes/adownload.h"
 #include "src/classes/asettings.h"
 #include "src/classes/astandardpaths.h"
+#include "src/oplconstants.h"
 #include <QErrorMessage>
 
 FirstRunDialog::FirstRunDialog(QWidget *parent) :
@@ -19,6 +20,10 @@ FirstRunDialog::FirstRunDialog(QWidget *parent) :
     ui->previousPushButton->setEnabled(false);
     ui->nightComboBox->setCurrentIndex(1);
 
+    for (const auto &approach : Opl::ApproachTypes){
+        ui->approachComboBox->addItem(approach);
+    }
+
 //    auto *themeGroup = new QButtonGroup;
 //    themeGroup->addButton(ui->systemThemeCheckBox, 0);
 //    themeGroup->addButton(ui->lightThemeCheckBox, 1);
@@ -96,17 +101,18 @@ bool FirstRunDialog::finish()
     ASettings::write(ASettings::FlightLogging::NumberLandings, 1);
     ASettings::write(ASettings::FlightLogging::PopupCalendar, true);
     ASettings::write(ASettings::FlightLogging::PilotFlying, true);
+    ASettings::write(ASettings::FlightLogging::FlightTimeFormat, Opl::Time::Default);
 
     QMap<QString, QVariant> data;
     ASettings::write(ASettings::UserData::DisplaySelfAs, ui->aliasComboBox->currentIndex());
-    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"),
+    data.insert(Opl::Db::PILOTS_LASTNAME, ui->lastnameLineEdit->text());
+    data.insert(Opl::Db::PILOTS_FIRSTNAME, ui->firstnameLineEdit->text());
+    data.insert(Opl::Db::PILOTS_ALIAS, QStringLiteral("self"));
+    data.insert(Opl::Db::PILOTS_EMPLOYEEID, ui->employeeidLineEdit->text());
+    data.insert(Opl::Db::PILOTS_PHONE, ui->phoneLineEdit->text());
+    data.insert(Opl::Db::PILOTS_EMAIL, ui->emailLineEdit->text());
+
+    QMessageBox db_fail_msg_box(QMessageBox::Critical, QStringLiteral("Database setup failed"),
                                        QStringLiteral("Errors have ocurred creating the database."
                                                       "Without a working database The application will not be usable."));
     if (!setupDatabase()) {
@@ -127,7 +133,7 @@ bool FirstRunDialog::finish()
 
 bool FirstRunDialog::setupDatabase()
 {
-    auto confirm = QMessageBox(QMessageBox::Question, QStringLiteral("Create Database"),
+    QMessageBox confirm(QMessageBox::Question, QStringLiteral("Create Database"),
                                QStringLiteral("We are now going to create the database.<br>"  // [G]: Why both <br> and \n ?
                                               "Would you like to download the latest database information?"
                                               "<br>(Recommended, Internet connection required)"),
@@ -154,7 +160,7 @@ bool FirstRunDialog::setupDatabase()
 
 void FirstRunDialog::reject()
 {
-    auto confirm = QMessageBox(QMessageBox::Critical,
+    QMessageBox confirm(QMessageBox::Critical,
                                QStringLiteral("Setup incomplete"),
                                QStringLiteral("Without completing the initial setup"
                                               " you cannot use the application.<br><br>"

+ 2 - 108
src/gui/dialogues/firstrundialog.ui

@@ -31,7 +31,7 @@
    <item row="0" column="0" colspan="2">
     <widget class="QStackedWidget" name="stackedWidget">
      <property name="currentIndex">
-      <number>2</number>
+      <number>1</number>
      </property>
      <widget class="QWidget" name="stackedWidgetPage1">
       <layout class="QGridLayout" name="gridLayout_2">
@@ -242,113 +242,7 @@
         </widget>
        </item>
        <item row="4" column="1">
-        <widget class="QComboBox" name="approachComboBox">
-         <item>
-          <property name="text">
-           <string>VISUAL</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>ILS CAT I</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>ILS CAT II</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>ILS CAT III</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>GLS</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>MLS</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>LOC</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>LOC/DME</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>RNAV</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>RNAV (LNAV)</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>RNAV (LNAV/VNAV)</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>RNAV (LPV)</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>RNAV (RNP)</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>RNAV (RNP-AR)</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>VOR</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>VOR/DME</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>NDB</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>NDB/DME</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>TACAN</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>SRA</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>PAR</string>
-          </property>
-         </item>
-        </widget>
+        <widget class="QComboBox" name="approachComboBox"/>
        </item>
        <item row="5" column="0">
         <widget class="QLabel" name="nightLabel">

+ 5 - 95
src/gui/dialogues/newflight.ui

@@ -17,7 +17,7 @@
    <item row="0" column="0" colspan="2">
     <widget class="QTabWidget" name="flightDataTabWidget">
      <property name="currentIndex">
-      <number>0</number>
+      <number>1</number>
      </property>
      <widget class="QWidget" name="flightDataTab">
       <attribute name="title">
@@ -790,7 +790,8 @@
          </property>
          <property name="font">
           <font>
-           <pointsize>16</pointsize>
+           <family>DejaVu Sans</family>
+           <pointsize>10</pointsize>
            <weight>75</weight>
            <bold>true</bold>
           </font>
@@ -799,7 +800,7 @@
           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Once all the required items are filled out, the total time of flight will be displayed here.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
          </property>
          <property name="styleSheet">
-          <string notr="true">color: rgb(237, 212, 0);</string>
+          <string notr="true"/>
          </property>
          <property name="frameShape">
           <enum>QFrame::NoFrame</enum>
@@ -840,30 +841,6 @@
          </property>
         </widget>
        </item>
-       <item row="10" column="3">
-        <widget class="QLabel" name="submissionReadyTextLabel">
-         <property name="text">
-          <string>Status:</string>
-         </property>
-        </widget>
-       </item>
-       <item row="10" column="4">
-        <widget class="QLabel" name="submissonReadyLabel">
-         <property name="font">
-          <font>
-           <pointsize>16</pointsize>
-           <weight>75</weight>
-           <bold>true</bold>
-          </font>
-         </property>
-         <property name="styleSheet">
-          <string notr="true">color: rgb(237, 212, 0);</string>
-         </property>
-         <property name="text">
-          <string>INCOMPLETE</string>
-         </property>
-        </widget>
-       </item>
       </layout>
       <zorder>placeLabel2</zorder>
       <zorder>deptLocLineEdit</zorder>
@@ -920,8 +897,6 @@
       <zorder>placeLabel1</zorder>
       <zorder>calendarCheckBox</zorder>
       <zorder>picCompanyLabel</zorder>
-      <zorder>submissionReadyTextLabel</zorder>
-      <zorder>submissonReadyLabel</zorder>
      </widget>
      <widget class="QWidget" name="autoLoggingTab">
       <attribute name="title">
@@ -1012,73 +987,8 @@
           </size>
          </property>
          <property name="currentText">
-          <string>ILS CAT I</string>
+          <string/>
          </property>
-         <item>
-          <property name="text">
-           <string>ILS CAT I</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>ILS CAT II</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>ILS CAT III</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>Visual</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>RNAV</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>RNAV (RNP)</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>RNAV (RNP AR)</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>VOR</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>NDB</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>LOC</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>GLS</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>MLS</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>SRA</string>
-          </property>
-         </item>
         </widget>
        </item>
        <item row="1" column="4">

+ 217 - 194
src/gui/dialogues/newflightdialog.cpp

@@ -22,7 +22,7 @@
 #include "src/functions/acalc.h"
 #include "src/testing/atimer.h"
 #include "src/database/adatabase.h"
-
+#include "src/oplconstants.h"
 
 #include "src/testing/adebug.h"
 
@@ -30,7 +30,7 @@
 ///                                         constants                                           ///
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-static const auto TIME_FORMAT = QLatin1String("hh:mm");
+static const auto EMPTY_STRING=QStringLiteral("");
 static const auto NAME_RX     = QLatin1String("((\\p{L}+)?('|\\-|,)?(\\p{L}+)?)");
 static const auto ADD_NAME_RX = QLatin1String("(\\s?(\\p{L}+('|\\-|,)?\\p{L}+?))?");
 
@@ -99,7 +99,7 @@ NewFlightDialog::NewFlightDialog(QWidget *parent) :
     flightEntry = AFlightEntry();
     setup();
     if (ASettings::read(ASettings::NewFlight::FunctionComboBox).toString() == "SIC") {
-        ui->picNameLineEdit->setText(DB_NULL);
+        ui->picNameLineEdit->setText(QStringLiteral(""));
         ui->secondPilotNameLineEdit->setText("self");
     }
     if(ASettings::read(ASettings::NewFlight::FunctionComboBox).toString() == "PIC"){
@@ -129,6 +129,9 @@ NewFlightDialog::~NewFlightDialog()
 
 void NewFlightDialog::setup()
 {
+    for (const auto & approach : Opl::ApproachTypes){
+        ui->ApproachComboBox->addItem(approach);
+    }
     updateEnabled = true;
     setupButtonGroups();
     setupRawInputValidation();
@@ -172,6 +175,13 @@ void NewFlightDialog::readSettings()
     ui->FlightNumberLineEdit->setText(ASettings::read(ASettings::FlightLogging::FlightNumberPrefix).toString());
     ui->calendarCheckBox->setChecked(ASettings::read(ASettings::FlightLogging::PopupCalendar).toBool());
 
+    // Debug
+    ASettings::write(ASettings::FlightLogging::FlightTimeFormat, Opl::Time::Default);
+    //[F]: Support for Decimal Logging is not implemented yet.
+    flightTimeFormat = static_cast<Opl::Time::FlightTimeFormat>(
+                ASettings::read(ASettings::FlightLogging::FlightTimeFormat).toInt());
+
+
 }
 
 void NewFlightDialog::writeSettings()
@@ -213,13 +223,13 @@ void NewFlightDialog::setupRawInputValidation()
     auto tempList = QStringList();
     // define tuples
     const std::tuple<QString, QStringList*, QRegularExpression>
-            location_line_edit_settings = {"Loc", &airportList, LOC_VALID_RGX};
+            location_line_edit_settings = {QStringLiteral("Loc"), &airportList, LOC_VALID_RGX};
     const std::tuple<QString, QStringList*, QRegularExpression>
-            name_line_edit_settings = {"Name", &pilotList, NAME_VALID_RGX};
+            name_line_edit_settings = {QStringLiteral("Name"), &pilotList, NAME_VALID_RGX};
     const std::tuple<QString, QStringList*, QRegularExpression>
-            acft_line_edit_settings = {"acft", &tailsList, AIRCRAFT_VALID_RGX};
+            acft_line_edit_settings = {QStringLiteral("acft"), &tailsList, AIRCRAFT_VALID_RGX};
     const std::tuple<QString, QStringList*, QRegularExpression>
-            time_line_edit_settings = {"Time", &tempList, TIME_VALID_RGX};
+            time_line_edit_settings = {QStringLiteral("Time"), &tempList, TIME_VALID_RGX};
     const QList<std::tuple<QString, QStringList*, QRegularExpression>> line_edit_settings = {
         location_line_edit_settings,
         name_line_edit_settings,
@@ -274,31 +284,33 @@ void NewFlightDialog::setupSignalsAndSlots()
 
     for (const auto &line_edit : line_edits){
         line_edit->installEventFilter(this);
-        if(line_edit->objectName().contains("Loc")){
+        if(line_edit->objectName().contains(QStringLiteral("Loc"))){
             QObject::connect(line_edit, &QLineEdit::textChanged,
                              this, &NewFlightDialog::onToUpperTriggered_textChanged);
         }
-        if(line_edit->objectName().contains("acft")){
+        if(line_edit->objectName().contains(QStringLiteral("acft"))){
             QObject::connect(line_edit, &QLineEdit::textChanged,
                              this, &NewFlightDialog::onToUpperTriggered_textChanged);
         }
-        if(line_edit->objectName().contains("Name")){
+        if(line_edit->objectName().contains(QStringLiteral("Name"))){
             QObject::connect(line_edit, &QLineEdit::editingFinished,
                              this, &NewFlightDialog::onPilotNameLineEdit_editingFinished);
         }
-        if(line_edit->objectName().contains("Time")){
+        if(line_edit->objectName().contains(QStringLiteral("Time"))){
             QObject::connect(line_edit, &QLineEdit::editingFinished,
                              this, &NewFlightDialog::onTimeLineEdit_editingFinished);
         }
     }
-    for (const auto &line_edit : mandatoryLineEdits) {
-        if(line_edit->objectName().contains("doft"))
+#if QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)
+    for (const auto &line_edit : qAsConst(mandatoryLineEdits)) {
+        if(line_edit->objectName().contains(QStringLiteral("doft")))
             break;
         QObject::connect(line_edit->completer(), QOverload<const QString &>::of(&QCompleter::highlighted),
                          this, &NewFlightDialog::onCompleter_highlighted);
         QObject::connect(line_edit->completer(), QOverload<const QString &>::of(&QCompleter::activated),
                          this, &NewFlightDialog::onCompleter_activated);
     }
+#endif
 }
 
 
@@ -384,14 +396,16 @@ void NewFlightDialog::fillDeductibleData()
                               ui->tDUALTimeLineEdit, ui->tFITimeLineEdit,};
     QList<QLabel*>      LB = {ui->tSPSELabel, ui->tSPMELabel,  ui->tMPLabel,  ui->tIFRLabel,  ui->tNIGHTLabel,
                               ui->tPICLabel,  ui->tPICUSLabel, ui->tSICLabel, ui->tDUALLabel, ui->tFILabel};
-    for(const auto& widget : LE) {widget->setText(DB_NULL);}
-    for(const auto& widget : LB) {widget->setText(DB_NULL_hhmm);}
+    for(const auto& widget : LE) {widget->setText(EMPTY_STRING);}
+    for(const auto& widget : LB) {widget->setText(Opl::Db::NULL_TIME_hhmm);}
     //Calculate block time
-    auto tofb = QTime::fromString(ui->tofbTimeLineEdit->text(), TIME_FORMAT);
-    auto tonb = QTime::fromString(ui->tonbTimeLineEdit->text(), TIME_FORMAT);
-    QString block_time = ACalc::blocktime(tofb, tonb).toString(TIME_FORMAT);
-    QString block_minutes = QString::number(ACalc::stringToMinutes(block_time));
-    ui->tblkTimeLineEdit->setText(block_time);
+    const auto tofb = ATime::fromString(ui->tofbTimeLineEdit->text());
+    const auto tonb = ATime::fromString(ui->tonbTimeLineEdit->text());
+    const auto tblk = ATime::blocktime(tofb, tonb);
+    const auto block_time_string = ATime::toString(tblk, flightTimeFormat);
+    const auto block_minutes = ATime::toMinutes(tblk);
+
+    ui->tblkTimeLineEdit->setText(block_time_string);
     // get acft data and fill deductible entries
     auto acft = aDB->getTailEntry(tailsIdMap.value(ui->acftLineEdit->text()));
     if (acft.getData().isEmpty())
@@ -399,72 +413,69 @@ void NewFlightDialog::fillDeductibleData()
 
 
     // SP SE
-    if(acft.getData().value(DB_TAILS_MULTIPILOT).toInt() == 0
-            && acft.getData().value(DB_TAILS_MULTIENGINE).toInt() == 0){
-        ui->tSPSETimeLineEdit->setText(block_time);
-        ui->tSPSELabel->setText(block_time);
+    if(acft.getData().value(Opl::Db::TAILS_MULTIPILOT).toInt() == 0
+            && acft.getData().value(Opl::Db::TAILS_MULTIENGINE).toInt() == 0){
+        ui->tSPSETimeLineEdit->setText(block_time_string);
+        ui->tSPSELabel->setText(block_time_string);
     }
     // SP ME
-    if(acft.getData().value(DB_TAILS_MULTIPILOT).toInt() == 0
-            && acft.getData().value(DB_TAILS_MULTIENGINE).toInt() == 1){
-        ui->tSPMETimeLineEdit->setText(block_time);
-        ui->tSPMELabel->setText(block_time);
+    if(acft.getData().value(Opl::Db::TAILS_MULTIPILOT).toInt() == 0
+            && acft.getData().value(Opl::Db::TAILS_MULTIENGINE).toInt() == 1){
+        ui->tSPMETimeLineEdit->setText(block_time_string);
+        ui->tSPMELabel->setText(block_time_string);
     }
     // MP
-    if(acft.getData().value(DB_TAILS_MULTIPILOT).toInt() == 1){
-        ui->tMPTimeLineEdit->setText(block_time);
-        ui->tMPLabel->setText(block_time);
+    if(acft.getData().value(Opl::Db::TAILS_MULTIPILOT).toInt() == 1){
+        ui->tMPTimeLineEdit->setText(block_time_string);
+        ui->tMPLabel->setText(block_time_string);
     }
     // TOTAL
-    ui->tblkLabel->setText("<b>" + block_time + "</b>");
-    ui->tblkLabel->setStyleSheet("color: green;");
-    ui->submissonReadyLabel->setText("Ready for Submission");
-    ui->submissonReadyLabel->setStyleSheet("color: green;");
+    ui->tblkLabel->setText("<b>" + block_time_string + "</b>");
     // IFR
     if(ui->IfrCheckBox->isChecked()){
-        ui->tIFRTimeLineEdit->setText(block_time);
-        ui->tIFRLabel->setText(block_time);
+        ui->tIFRTimeLineEdit->setText(block_time_string);
+        ui->tIFRLabel->setText(block_time_string);
     }
     // Night
-    QString dept_date = ui->doftLineEdit->text() + 'T' + tofb.toString(TIME_FORMAT);
-    QDateTime dept_date_time = QDateTime::fromString(dept_date,"yyyy-MM-ddThh:mm");
-    int tblk = block_minutes.toInt();
+    auto dept_date = ui->doftLineEdit->text() + 'T'
+            + ATime::toString(tofb);
+    auto dept_date_time = QDateTime::fromString(dept_date, QStringLiteral("yyyy-MM-ddThh:mm"));
     const int night_angle = ASettings::read(ASettings::FlightLogging::NightAngle).toInt();
-    QString night_minutes = QString::number(
-                ACalc::calculateNightTime(
-                    ui->deptLocLineEdit->text(),
-                    ui->destLocLineEdit->text(),
-                    dept_date_time,
-                    tblk,
-                    night_angle));
-
-    ui->tNIGHTTimeLineEdit->setText(ACalc::minutesToString(night_minutes));
-    ui->tNIGHTLabel->setText(ACalc::minutesToString(night_minutes));
+    auto night_time = ATime::fromMinutes(ACalc::calculateNightTime(
+                                             ui->deptLocLineEdit->text(),
+                                             ui->destLocLineEdit->text(),
+                                             dept_date_time,
+                                             block_minutes,
+                                             night_angle));
+
+    ui->tNIGHTTimeLineEdit->setText(ATime::toString(night_time, flightTimeFormat));
+    ui->tNIGHTLabel->setText(ATime::toString(night_time, flightTimeFormat));
     // Function times
     switch (ui->FunctionComboBox->currentIndex()) {
     case 0://PIC
-        ui->tPICTimeLineEdit->setText(block_time);
-        ui->tPICLabel->setText(block_time);
+        ui->tPICTimeLineEdit->setText(block_time_string);
+        ui->tPICLabel->setText(block_time_string);
         break;
     case 1://PICus
-        ui->tPICUSTimeLineEdit->setText(block_time);
-        ui->tPICUSLabel->setText(block_time);
+        ui->tPICUSTimeLineEdit->setText(block_time_string);
+        ui->tPICUSLabel->setText(block_time_string);
         break;
     case 2://Co-Pilot
-        ui->tSICTimeLineEdit->setText(block_time);
-        ui->tSICLabel->setText(block_time);
+        ui->tSICTimeLineEdit->setText(block_time_string);
+        ui->tSICLabel->setText(block_time_string);
         break;
     case 3://Dual
-        ui->tDUALTimeLineEdit->setText(block_time);
-        ui->tDUALLabel->setText(block_time);
+        ui->tDUALTimeLineEdit->setText(block_time_string);
+        ui->tDUALLabel->setText(block_time_string);
         break;
     case 4://Instructor
-        ui->tFITimeLineEdit->setText(block_time);
-        ui->tFILabel->setText(block_time);
-        ui->tPICTimeLineEdit->setText(block_time);
-        ui->tPICLabel->setText(block_time);
+        ui->tFITimeLineEdit->setText(block_time_string);
+        ui->tFILabel->setText(block_time_string);
+        ui->tPICTimeLineEdit->setText(block_time_string);
+        ui->tPICLabel->setText(block_time_string);
     }
 }
+
 /*!
  * \brief Collect input and create a Data map for the entry object.
  *
@@ -476,144 +487,148 @@ RowData NewFlightDialog::collectInput()
 {
     RowData newData;
     DEB << "Collecting Input...";
-    // Mandatory data
-    newData.insert(DB_FLIGHTS_DOFT, ui->doftLineEdit->text());
-    newData.insert(DB_FLIGHTS_DEPT, ui->deptLocLineEdit->text());
-    newData.insert(DB_FLIGHTS_TOFB, ACalc::stringToMinutes(ui->tofbTimeLineEdit->text()));
-    newData.insert(DB_FLIGHTS_DEST, ui->destLocLineEdit->text());
-    newData.insert(DB_FLIGHTS_TONB, ACalc::stringToMinutes(ui->tonbTimeLineEdit->text()));
     //Block Time
-    const auto tofb = QTime::fromString(ui->tofbTimeLineEdit->text(), TIME_FORMAT);
-    const auto tonb = QTime::fromString(ui->tonbTimeLineEdit->text(), TIME_FORMAT);
-    const QString block_time = ACalc::blocktime(tofb, tonb).toString(TIME_FORMAT);
-    const int block_minutes = ACalc::stringToMinutes(block_time);
-
-    newData.insert(DB_FLIGHTS_TBLK, block_minutes);
+    const auto tofb = ATime::fromString(ui->tofbTimeLineEdit->text());
+    const auto tonb = ATime::fromString(ui->tonbTimeLineEdit->text());
+    const auto tblk = ATime::blocktime(tofb, tonb);
+    const auto block_minutes = ATime::toMinutes(tblk);
+    // Mandatory data
+    newData.insert(Opl::Db::FLIGHTS_DOFT, ui->doftLineEdit->text());
+    newData.insert(Opl::Db::FLIGHTS_DEPT, ui->deptLocLineEdit->text());
+    newData.insert(Opl::Db::FLIGHTS_TOFB, ATime::toMinutes(tofb));
+    newData.insert(Opl::Db::FLIGHTS_DEST, ui->destLocLineEdit->text());
+    newData.insert(Opl::Db::FLIGHTS_TONB, ATime::toMinutes(tonb));
+    newData.insert(Opl::Db::FLIGHTS_TBLK, block_minutes);
     // Aircraft
-    newData.insert(DB_FLIGHTS_ACFT, tailsIdMap.value(ui->acftLineEdit->text()));
+    newData.insert(Opl::Db::FLIGHTS_ACFT, tailsIdMap.value(ui->acftLineEdit->text()));
     // Pilots
-    newData.insert(DB_FLIGHTS_PIC, pilotsIdMap.value(ui->picNameLineEdit->text()));
-    newData.insert(DB_FLIGHTS_SECONDPILOT, pilotsIdMap.value(ui->secondPilotNameLineEdit->text()));
-    newData.insert(DB_FLIGHTS_THIRDPILOT, pilotsIdMap.value(ui->thirdPilotNameLineEdit->text()));
+    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()));
 
     // Extra Times
     ui->tSPSETimeLineEdit->text().isEmpty() ?
-                newData.insert(DB_FLIGHTS_TSPSE, DB_NULL)
-              : newData.insert(DB_FLIGHTS_TSPSE, ACalc::stringToMinutes(ui->tSPSETimeLineEdit->text()));
+                newData.insert(Opl::Db::FLIGHTS_TSPSE, EMPTY_STRING)
+              : newData.insert(Opl::Db::FLIGHTS_TSPSE, stringToMinutes(
+                                   ui->tSPSETimeLineEdit->text(), flightTimeFormat));
 
     ui->tSPMETimeLineEdit->text().isEmpty() ?
-                newData.insert(DB_FLIGHTS_TSPME, DB_NULL)
-              : newData.insert(DB_FLIGHTS_TSPME, ACalc::stringToMinutes(ui->tSPMETimeLineEdit->text()));
+                newData.insert(Opl::Db::FLIGHTS_TSPME, EMPTY_STRING)
+              : newData.insert(Opl::Db::FLIGHTS_TSPME, stringToMinutes(
+                                   ui->tSPMETimeLineEdit->text(), flightTimeFormat));
     ui->tMPTimeLineEdit->text().isEmpty() ?
-                newData.insert(DB_FLIGHTS_TMP, DB_NULL)
-              : newData.insert(DB_FLIGHTS_TMP, ACalc::stringToMinutes(ui->tMPTimeLineEdit->text()));
+                newData.insert(Opl::Db::FLIGHTS_TMP, EMPTY_STRING)
+              : newData.insert(Opl::Db::FLIGHTS_TMP, stringToMinutes(
+                                   ui->tMPTimeLineEdit->text(), flightTimeFormat));
 
     if (ui->IfrCheckBox->isChecked()) {
-        newData.insert(DB_FLIGHTS_TIFR, block_minutes);
+        newData.insert(Opl::Db::FLIGHTS_TIFR, block_minutes);
     } else {
-        newData.insert(DB_FLIGHTS_TIFR, DB_NULL);
+        newData.insert(Opl::Db::FLIGHTS_TIFR, EMPTY_STRING);
     }
     // Night
-    const auto dept_date = ui->doftLineEdit->text() + QStringLiteral("T") + tofb.toString(TIME_FORMAT);
+    const auto dept_date = ui->doftLineEdit->text() + 'T'
+            + ATime::toString(tofb);
     const auto dept_date_time = QDateTime::fromString(dept_date, QStringLiteral("yyyy-MM-ddThh:mm"));
-
-    const auto night_angle = ASettings::read(ASettings::FlightLogging::NightAngle).toInt();
-    const auto night_minutes = ACalc::calculateNightTime(
-                    ui->deptLocLineEdit->text(),
-                    ui->destLocLineEdit->text(),
-                    dept_date_time,
-                    block_minutes,
-                    night_angle);
-    newData.insert(DB_FLIGHTS_TNIGHT, night_minutes);
+    const int night_angle = ASettings::read(ASettings::FlightLogging::NightAngle).toInt();
+    const auto night_time = ATime::fromMinutes(ACalc::calculateNightTime(
+                                             ui->deptLocLineEdit->text(),
+                                             ui->destLocLineEdit->text(),
+                                             dept_date_time,
+                                             block_minutes,
+                                             night_angle));
+    const auto night_minutes = ATime::toMinutes(night_time);
+    newData.insert(Opl::Db::FLIGHTS_TNIGHT, night_minutes);
 
     // Function times - This is a little explicit but these are mutually exclusive so its better to be safe than sorry here.
     switch (ui->FunctionComboBox->currentIndex()) {
     case 0://PIC
-        newData.insert(DB_FLIGHTS_TPIC, block_minutes);
-        newData.insert(DB_FLIGHTS_TPICUS, DB_NULL);
-        newData.insert(DB_FLIGHTS_TSIC, DB_NULL);
-        newData.insert(DB_FLIGHTS_TDUAL, DB_NULL);
-        newData.insert(DB_FLIGHTS_TFI, DB_NULL);
+        newData.insert(Opl::Db::FLIGHTS_TPIC, block_minutes);
+        newData.insert(Opl::Db::FLIGHTS_TPICUS, EMPTY_STRING);
+        newData.insert(Opl::Db::FLIGHTS_TSIC, EMPTY_STRING);
+        newData.insert(Opl::Db::FLIGHTS_TDUAL, EMPTY_STRING);
+        newData.insert(Opl::Db::FLIGHTS_TFI, EMPTY_STRING);
         break;
     case 1://PICUS
-        newData.insert(DB_FLIGHTS_TPIC, DB_NULL);
-        newData.insert(DB_FLIGHTS_TPICUS, block_minutes);
-        newData.insert(DB_FLIGHTS_TSIC, DB_NULL);
-        newData.insert(DB_FLIGHTS_TDUAL, DB_NULL);
-        newData.insert(DB_FLIGHTS_TFI, DB_NULL);
+        newData.insert(Opl::Db::FLIGHTS_TPIC, EMPTY_STRING);
+        newData.insert(Opl::Db::FLIGHTS_TPICUS, block_minutes);
+        newData.insert(Opl::Db::FLIGHTS_TSIC, EMPTY_STRING);
+        newData.insert(Opl::Db::FLIGHTS_TDUAL, EMPTY_STRING);
+        newData.insert(Opl::Db::FLIGHTS_TFI, EMPTY_STRING);
         break;
     case 2://Co-Pilot
-        newData.insert(DB_FLIGHTS_TPIC, DB_NULL);
-        newData.insert(DB_FLIGHTS_TPICUS, DB_NULL);
-        newData.insert(DB_FLIGHTS_TSIC, block_minutes);
-        newData.insert(DB_FLIGHTS_TDUAL, DB_NULL);
-        newData.insert(DB_FLIGHTS_TFI, DB_NULL);
+        newData.insert(Opl::Db::FLIGHTS_TPIC, EMPTY_STRING);
+        newData.insert(Opl::Db::FLIGHTS_TPICUS, EMPTY_STRING);
+        newData.insert(Opl::Db::FLIGHTS_TSIC, block_minutes);
+        newData.insert(Opl::Db::FLIGHTS_TDUAL, EMPTY_STRING);
+        newData.insert(Opl::Db::FLIGHTS_TFI, EMPTY_STRING);
         break;
     case 3://Dual
-        newData.insert(DB_FLIGHTS_TPIC, DB_NULL);
-        newData.insert(DB_FLIGHTS_TPICUS, DB_NULL);
-        newData.insert(DB_FLIGHTS_TSIC, DB_NULL);
-        newData.insert(DB_FLIGHTS_TDUAL, block_minutes);
-        newData.insert(DB_FLIGHTS_TFI, DB_NULL);
+        newData.insert(Opl::Db::FLIGHTS_TPIC, EMPTY_STRING);
+        newData.insert(Opl::Db::FLIGHTS_TPICUS, EMPTY_STRING);
+        newData.insert(Opl::Db::FLIGHTS_TSIC, EMPTY_STRING);
+        newData.insert(Opl::Db::FLIGHTS_TDUAL, block_minutes);
+        newData.insert(Opl::Db::FLIGHTS_TFI, EMPTY_STRING);
         break;
     case 4://Instructor
-        newData.insert(DB_FLIGHTS_TPIC, block_minutes);
-        newData.insert(DB_FLIGHTS_TPICUS, DB_NULL);
-        newData.insert(DB_FLIGHTS_TSIC, DB_NULL);
-        newData.insert(DB_FLIGHTS_TDUAL, DB_NULL);
-        newData.insert(DB_FLIGHTS_TFI, block_minutes);
+        newData.insert(Opl::Db::FLIGHTS_TPIC, block_minutes);
+        newData.insert(Opl::Db::FLIGHTS_TPICUS, EMPTY_STRING);
+        newData.insert(Opl::Db::FLIGHTS_TSIC, EMPTY_STRING);
+        newData.insert(Opl::Db::FLIGHTS_TDUAL, EMPTY_STRING);
+        newData.insert(Opl::Db::FLIGHTS_TFI, block_minutes);
     }
     // Pilot Flying
-    newData.insert(DB_FLIGHTS_PILOTFLYING, ui->PilotFlyingCheckBox->isChecked());
+    newData.insert(Opl::Db::FLIGHTS_PILOTFLYING, ui->PilotFlyingCheckBox->isChecked());
     // TO and LDG - again a bit explicit, but we  need to check for both night to day as well as day to night transitions.
     if (ui->TakeoffCheckBox->isChecked()) {
         if (night_minutes == 0) { // all day
-            newData.insert(DB_FLIGHTS_TODAY, ui->TakeoffSpinBox->value());
-            newData.insert(DB_FLIGHTS_TONIGHT, 0);
+            newData.insert(Opl::Db::FLIGHTS_TODAY, ui->TakeoffSpinBox->value());
+            newData.insert(Opl::Db::FLIGHTS_TONIGHT, 0);
         } else if (night_minutes == block_minutes) { // all night
-            newData.insert(DB_FLIGHTS_TODAY, 0);
-            newData.insert(DB_FLIGHTS_TONIGHT, ui->TakeoffSpinBox->value());
+            newData.insert(Opl::Db::FLIGHTS_TODAY, 0);
+            newData.insert(Opl::Db::FLIGHTS_TONIGHT, ui->TakeoffSpinBox->value());
         } else {
             if(ACalc::isNight(ui->deptLocLineEdit->text(), dept_date_time,  night_angle)) {
-                newData.insert(DB_FLIGHTS_TODAY, 0);
-                newData.insert(DB_FLIGHTS_TONIGHT, ui->TakeoffSpinBox->value());
+                newData.insert(Opl::Db::FLIGHTS_TODAY, 0);
+                newData.insert(Opl::Db::FLIGHTS_TONIGHT, ui->TakeoffSpinBox->value());
             } else {
-                newData.insert(DB_FLIGHTS_TODAY, ui->TakeoffSpinBox->value());
-                newData.insert(DB_FLIGHTS_TONIGHT, 0);
+                newData.insert(Opl::Db::FLIGHTS_TODAY, ui->TakeoffSpinBox->value());
+                newData.insert(Opl::Db::FLIGHTS_TONIGHT, 0);
             }
         }
     } else {
-        newData.insert(DB_FLIGHTS_TODAY, 0);
-        newData.insert(DB_FLIGHTS_TONIGHT, 0);
+        newData.insert(Opl::Db::FLIGHTS_TODAY, 0);
+        newData.insert(Opl::Db::FLIGHTS_TONIGHT, 0);
     }
 
     if (ui->LandingCheckBox->isChecked()) {
         if (night_minutes == 0) { // all day
-            newData.insert(DB_FLIGHTS_LDGDAY, ui->LandingSpinBox->value());
-            newData.insert(DB_FLIGHTS_LDGNIGHT, 0);
+            newData.insert(Opl::Db::FLIGHTS_LDGDAY, ui->LandingSpinBox->value());
+            newData.insert(Opl::Db::FLIGHTS_LDGNIGHT, 0);
         } else if (night_minutes == block_minutes) { // all night
-            newData.insert(DB_FLIGHTS_LDGDAY, 0);
-            newData.insert(DB_FLIGHTS_LDGNIGHT, ui->LandingSpinBox->value());
+            newData.insert(Opl::Db::FLIGHTS_LDGDAY, 0);
+            newData.insert(Opl::Db::FLIGHTS_LDGNIGHT, ui->LandingSpinBox->value());
         } else { //check
-            const auto dest_date = ui->doftLineEdit->text() + QStringLiteral("T") + tonb.toString(TIME_FORMAT);
+            const auto dest_date = ui->doftLineEdit->text() + 'T'
+                    + ATime::toString(tonb);
             const auto dest_date_time = QDateTime::fromString(dest_date, QStringLiteral("yyyy-MM-ddThh:mm"));
             if (ACalc::isNight(ui->destLocLineEdit->text(), dest_date_time,  night_angle)) {
-                newData.insert(DB_FLIGHTS_LDGDAY, 0);
-                newData.insert(DB_FLIGHTS_LDGNIGHT, ui->LandingSpinBox->value());
+                newData.insert(Opl::Db::FLIGHTS_LDGDAY, 0);
+                newData.insert(Opl::Db::FLIGHTS_LDGNIGHT, ui->LandingSpinBox->value());
             } else {
-                newData.insert(DB_FLIGHTS_LDGDAY, ui->LandingSpinBox->value());
-                newData.insert(DB_FLIGHTS_LDGNIGHT, 0);
+                newData.insert(Opl::Db::FLIGHTS_LDGDAY, ui->LandingSpinBox->value());
+                newData.insert(Opl::Db::FLIGHTS_LDGNIGHT, 0);
             }
         }
     } else {
-        newData.insert(DB_FLIGHTS_LDGDAY, 0);
-        newData.insert(DB_FLIGHTS_LDGNIGHT, 0);
+        newData.insert(Opl::Db::FLIGHTS_LDGDAY, 0);
+        newData.insert(Opl::Db::FLIGHTS_LDGNIGHT, 0);
     }
 
-    newData.insert(DB_FLIGHTS_AUTOLAND, ui->AutolandSpinBox->value());
-    newData.insert(DB_FLIGHTS_APPROACHTYPE, ui->ApproachComboBox->currentText());
-    newData.insert(DB_FLIGHTS_FLIGHTNUMBER, ui->FlightNumberLineEdit->text());
-    newData.insert(DB_FLIGHTS_REMARKS, ui->RemarksLineEdit->text());
+    newData.insert(Opl::Db::FLIGHTS_AUTOLAND, ui->AutolandSpinBox->value());
+    newData.insert(Opl::Db::FLIGHTS_APPROACHTYPE, ui->ApproachComboBox->currentText());
+    newData.insert(Opl::Db::FLIGHTS_FLIGHTNUMBER, ui->FlightNumberLineEdit->text());
+    newData.insert(Opl::Db::FLIGHTS_REMARKS, ui->RemarksLineEdit->text());
 
     DEB << "New Flight Data: " << newData;
 
@@ -635,7 +650,7 @@ void NewFlightDialog::formFiller()
 
     for (const auto& data_key : flightEntry.getData().keys()) {
         auto rx = QRegularExpression(data_key + "LineEdit");//acftLineEdit
-        for(const auto& leName : line_edits_names){
+        for(const auto& leName : qAsConst(line_edits_names)){
             if(rx.match(leName).hasMatch())  {
                 //DEB << "Loc Match found: " << key << " - " << leName);
                 auto line_edit = this->findChild<QLineEdit *>(leName);
@@ -647,7 +662,7 @@ void NewFlightDialog::formFiller()
             }
         }
         rx = QRegularExpression(data_key + "Loc\\w+?");
-        for(const auto& leName : line_edits_names){
+        for(const auto& leName : qAsConst(line_edits_names)){
             if(rx.match(leName).hasMatch())  {
                 //DEB << "Loc Match found: " << key << " - " << leName);
                 auto line_edit = this->findChild<QLineEdit *>(leName);
@@ -659,21 +674,21 @@ void NewFlightDialog::formFiller()
             }
         }
         rx = QRegularExpression(data_key + "Time\\w+?");
-        for(const auto& leName : line_edits_names){
+        for(const auto& leName : qAsConst(line_edits_names)){
             if(rx.match(leName).hasMatch())  {
                 //DEB << "Time Match found: " << key << " - " << leName);
                 auto line_edits = this->findChild<QLineEdit *>(leName);
                 if(line_edits != nullptr){
-                    DEB << "Setting " << line_edits->objectName() << " to " << ACalc::minutesToString(flightEntry.getData().value(data_key).toInt());
-                    line_edits->setText(ACalc::minutesToString(
-                                            flightEntry.getData().value(data_key).toInt()));
+                    DEB << "Setting " << line_edits->objectName() << " to " << ATime::toString(flightEntry.getData().value(data_key).toInt(), flightTimeFormat);
+                    line_edits->setText(ATime::toString(flightEntry.getData().value(data_key).toInt(),
+                                                        flightTimeFormat));
                     line_edits_names.removeOne(leName);
                 }
                 break;
             }
         }
         rx = QRegularExpression(data_key + "Name\\w+?");
-        for(const auto& leName : line_edits_names){
+        for(const auto& leName : qAsConst(line_edits_names)){
             if(rx.match(leName).hasMatch())  {
                 auto line_edits = this->findChild<QLineEdit *>(leName);
                 if(line_edits != nullptr){
@@ -698,29 +713,29 @@ void NewFlightDialog::formFiller()
         }
     }
     // Approach Combo Box
-    const QString& app = flightEntry.getData().value(DB_FLIGHTS_APPROACHTYPE).toString();
-    if(app != DB_NULL){
+    const QString& app = flightEntry.getData().value(Opl::Db::FLIGHTS_APPROACHTYPE).toString();
+    if(app != EMPTY_STRING){
         ui->ApproachComboBox->setCurrentText(app);
     }
     // Task and Rules
-    qint8 PF = flightEntry.getData().value(DB_FLIGHTS_PILOTFLYING).toInt();
+    qint8 PF = flightEntry.getData().value(Opl::Db::FLIGHTS_PILOTFLYING).toInt();
     if (PF > 0) {
         ui->PilotFlyingCheckBox->setChecked(true);
     } else {
         ui->PilotMonitoringCheckBox->setChecked(true);
     }
-    qint8 FR = flightEntry.getData().value(DB_FLIGHTS_TIFR).toInt();
+    qint8 FR = flightEntry.getData().value(Opl::Db::FLIGHTS_TIFR).toInt();
     if (FR > 0) {
         ui->IfrCheckBox->setChecked(true);
     } else {
-        ui->tIFRTimeLineEdit->setText(DB_NULL);
+        ui->tIFRTimeLineEdit->setText(EMPTY_STRING);
         ui->VfrCheckBox->setChecked(true);
     }
     // Take Off and Landing
-    qint8 TO = flightEntry.getData().value(DB_FLIGHTS_TODAY).toInt()
-            + flightEntry.getData().value(DB_FLIGHTS_TONIGHT).toInt();
-    qint8 LDG = flightEntry.getData().value(DB_FLIGHTS_LDGDAY).toInt()
-            + flightEntry.getData().value(DB_FLIGHTS_LDGNIGHT).toInt();
+    qint8 TO = flightEntry.getData().value(Opl::Db::FLIGHTS_TODAY).toInt()
+            + flightEntry.getData().value(Opl::Db::FLIGHTS_TONIGHT).toInt();
+    qint8 LDG = flightEntry.getData().value(Opl::Db::FLIGHTS_LDGDAY).toInt()
+            + flightEntry.getData().value(Opl::Db::FLIGHTS_LDGNIGHT).toInt();
     if(TO > 0) {
         ui->TakeoffCheckBox->setChecked(true);
         ui->TakeoffSpinBox->setValue(TO);
@@ -735,13 +750,13 @@ void NewFlightDialog::formFiller()
         ui->LandingCheckBox->setChecked(false);
         ui->LandingSpinBox->setValue(0);
     }
-    qint8 AL = flightEntry.getData().value(DB_FLIGHTS_AUTOLAND).toInt();
+    qint8 AL = flightEntry.getData().value(Opl::Db::FLIGHTS_AUTOLAND).toInt();
     if(AL > 0) {
         ui->AutolandCheckBox->setChecked(true);
         ui->AutolandSpinBox->setValue(AL);
     }
 
-    for(const auto& le : mandatoryLineEdits){
+    for(const auto& le : qAsConst(mandatoryLineEdits)){
         emit le->editingFinished();
     }
 }
@@ -749,26 +764,26 @@ void NewFlightDialog::formFiller()
 bool NewFlightDialog::isLessOrEqualThanBlockTime(const QString time_string)
 {
     if (mandatoryLineEditsGood.count(true) != 7){
-        auto message_box = QMessageBox(this);
-        message_box.setText("Unable to determine total block time.\n"
-                            "Please fill out Departure and Arrival Time\n"
+        QMessageBox message_box(this);
+        message_box.setText("Unable to determine total block time.<br>"
+                            "Please fill out all Mandatory Fields<br>"
                             "before manually editing these times.");
         message_box.exec();
         return false;
     }
 
-    auto extra_time = QTime::fromString(time_string,TIME_FORMAT);
-    auto block_time = ACalc::blocktime(QTime::fromString(
-                                           ui->tofbTimeLineEdit->text(),TIME_FORMAT),
-                                       QTime::fromString(
-                                           ui->tonbTimeLineEdit->text(), TIME_FORMAT));
+    auto extra_time = ATime::fromString(time_string, flightTimeFormat);
+    auto block_time = ATime::blocktime(ATime::fromString(
+                                           ui->tofbTimeLineEdit->text(), flightTimeFormat),
+                                       ATime::fromString(
+                                           ui->tonbTimeLineEdit->text(), flightTimeFormat));
     if (extra_time <= block_time) {
         return true;
     } else {
-        auto message_box = QMessageBox(this);
+        QMessageBox message_box(this);
         message_box.setWindowTitle("Error");
         message_box.setText("The flight time you have entered is longer than the total blocktime:<br><center><b>"
-                            + block_time.toString(TIME_FORMAT)
+                            + ATime::toString(block_time, flightTimeFormat)
                             + "</b></center>");
         message_box.exec();
         return false;
@@ -790,7 +805,7 @@ void NewFlightDialog::addNewTail(QLineEdit *parent_line_edit)
     if (reply == QMessageBox::Yes) {
         DEB << "Add new aircraft selected";
         // create and open new aircraft dialog
-        auto na = NewTailDialog(ui->acftLineEdit->text(), this);
+        NewTailDialog na(ui->acftLineEdit->text(), this);
         na.exec();
         // update map and list, set line edit
         tailsIdMap  = aDB->getIdMap(ADatabaseTarget::tails);
@@ -802,7 +817,7 @@ void NewFlightDialog::addNewTail(QLineEdit *parent_line_edit)
         parent_line_edit->setText(tailsIdMap.key(aDB->getLastEntry(ADatabaseTarget::tails)));
         emit parent_line_edit->editingFinished();
     } else {
-        parent_line_edit->setText(DB_NULL);
+        parent_line_edit->setText(EMPTY_STRING);
     }
 }
 
@@ -822,7 +837,7 @@ void NewFlightDialog::addNewPilot(QLineEdit *parent_line_edit)
     if (reply == QMessageBox::Yes) {
         DEB << "Add new pilot selected";
         // create and open new pilot dialog
-        auto np = NewPilotDialog(this);
+        NewPilotDialog np(this);
         np.exec();
         // update map and list, set line edit
         pilotsIdMap  = aDB->getIdMap(ADatabaseTarget::pilots);
@@ -831,7 +846,7 @@ void NewFlightDialog::addNewPilot(QLineEdit *parent_line_edit)
         parent_line_edit->setText(pilotsIdMap.key(aDB->getLastEntry(ADatabaseTarget::pilots)));
         emit parent_line_edit->editingFinished();
     } else {
-        parent_line_edit->setText(DB_NULL);
+        parent_line_edit->setText(EMPTY_STRING);
     }
 }
 
@@ -847,7 +862,7 @@ void NewFlightDialog::on_cancelButton_clicked()
 
 void NewFlightDialog::on_submitButton_clicked()
 {
-    for (const auto &line_edit : mandatoryLineEdits) {
+    for (const auto &line_edit : qAsConst(mandatoryLineEdits)) {
         emit line_edit->editingFinished();
     }
     DEB << "editing finished emitted. good count: " << mandatoryLineEditsGood.count(true);
@@ -862,7 +877,7 @@ void NewFlightDialog::on_submitButton_clicked()
         }
         error_message.append("</b></center><br>Please go back and fill in the required data.");
 
-        auto message_box = QMessageBox(this);
+        QMessageBox message_box(this);
         message_box.setText(error_message);
         message_box.exec();
         return;
@@ -874,7 +889,7 @@ void NewFlightDialog::on_submitButton_clicked()
     flightEntry.setData(newData);
     DEB << "Committing...";
     if (!aDB->commit(flightEntry)) {
-        auto message_box = QMessageBox(this);
+        QMessageBox message_box(this);
         message_box.setText("The following error has ocurred:\n\n"
                             + aDB->lastError.text()
                             + "\n\nYour entry has not been saved.");
@@ -915,8 +930,6 @@ void NewFlightDialog::onBadInputReceived(QLineEdit *line_edit)
 
     DEB << "Mandatory Good: " << mandatoryLineEditsGood.count(true) << " out of "
         << mandatoryLineEditsGood.size() << ". Array: " << mandatoryLineEditsGood;
-    ui->submissonReadyLabel->setText("INCOMPLETE");
-    ui->submissonReadyLabel->setStyleSheet("color: rgb(237, 212, 0);");
 }
 
 // capitalize input for dept, dest and registration input
@@ -1112,16 +1125,17 @@ void NewFlightDialog::onTimeLineEdit_editingFinished()
     auto line_edit = this->findChild<QLineEdit*>(sender_object->objectName());
     DEB << line_edit->objectName() << "Editing Finished -" << line_edit->text();
 
-    line_edit->setText(ACalc::formatTimeInput(line_edit->text()));
-    const auto time = QTime::fromString(line_edit->text(),TIME_FORMAT);
+    line_edit->setText(ATime::formatTimeInput(line_edit->text()));
+    const auto time = ATime::fromString(line_edit->text());
     if(time.isValid()){
         if(primaryTimeLineEdits.contains(line_edit)) {
             onGoodInputReceived(line_edit);
         } else { // is extra time line edit
-            isLessOrEqualThanBlockTime(line_edit->text());
-            line_edit->setText(DB_NULL);
-            line_edit->setFocus();
-            return;
+            if (!isLessOrEqualThanBlockTime(line_edit->text())) {
+                line_edit->setText(EMPTY_STRING);
+                line_edit->setFocus();
+                return;
+            }
         }
     } else {
         if (!line_edit->text().isEmpty())
@@ -1175,7 +1189,7 @@ void NewFlightDialog::onPilotNameLineEdit_editingFinished()
         DEB << "self recognized.";
         line_edit->setText(pilotsIdMap.key(1));
         auto pilot = aDB->getPilotEntry(1);
-        ui->picCompanyLabel->setText(pilot.getData().value(DB_TAILS_COMPANY).toString());
+        ui->picCompanyLabel->setText(pilot.getData().value(Opl::Db::TAILS_COMPANY).toString());
         onGoodInputReceived(line_edit);
         return;
     }
@@ -1183,7 +1197,7 @@ void NewFlightDialog::onPilotNameLineEdit_editingFinished()
     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()));
-        ui->picCompanyLabel->setText(pilot.getData().value(DB_TAILS_COMPANY).toString());
+        ui->picCompanyLabel->setText(pilot.getData().value(Opl::Db::TAILS_COMPANY).toString());
         onGoodInputReceived(line_edit);
         return;
     }
@@ -1244,7 +1258,7 @@ void NewFlightDialog::on_IfrCheckBox_stateChanged(int)
 void NewFlightDialog::on_manualEditingCheckBox_stateChanged(int arg1)
 {
     if (!(mandatoryLineEditsGood.count(true) == 7) && ui->manualEditingCheckBox->isChecked()) {
-        auto message_box = QMessageBox(this);
+        QMessageBox message_box(this);
         message_box.setText("Before editing times manually, please fill out the required fields in the flight data tab,"
                             " so that total time can be calculated.");
         message_box.exec();
@@ -1277,13 +1291,22 @@ void NewFlightDialog::on_manualEditingCheckBox_stateChanged(int arg1)
 
 void NewFlightDialog::on_ApproachComboBox_currentTextChanged(const QString &arg1)
 {
-    if(arg1 == "ILS CAT III"){  //for a CAT III approach an Autoland is mandatory, so we can preselect it.
+    if(arg1 == QStringLiteral("ILS CAT III")){  //for a CAT III approach an Autoland is mandatory, so we can preselect it.
         ui->AutolandCheckBox->setCheckState(Qt::Checked);
         ui->AutolandSpinBox->setValue(1);
     }else{
         ui->AutolandCheckBox->setCheckState(Qt::Unchecked);
         ui->AutolandSpinBox->setValue(0);
     }
+
+    if (arg1 != QStringLiteral("VISUAL"))
+        ui->IfrCheckBox->setChecked(true);
+
+    if (arg1 == QStringLiteral("OTHER")) {
+        QMessageBox message_box(this);
+        message_box.setText(QStringLiteral("You can specify the approach type in the Remarks field."));
+        message_box.exec();
+    }
 }
 
 void NewFlightDialog::on_FunctionComboBox_currentIndexChanged(int)

+ 22 - 0
src/gui/dialogues/newflightdialog.h

@@ -30,11 +30,13 @@
 #include <QCalendarWidget>
 #include <QTabWidget>
 #include <QKeyEvent>
+#include "src/functions/atime.h"
 
 #include "src/classes/aflightentry.h"
 #include "src/classes/apilotentry.h"
 #include "src/classes/atailentry.h"
 
+
 namespace Ui {
 class NewFlight;
 }
@@ -116,6 +118,8 @@ private:
     QMap<QString, int> airportIataIdMap;
     QMap<QString, int> airportNameIdMap;
 
+    Opl::Time::FlightTimeFormat flightTimeFormat;
+
     /*!
      * \brief If the user elects to manually edit function times, automatic updating
      * is disabled.
@@ -142,6 +146,24 @@ private:
     void addNewPilot(QLineEdit *);
 
     RowData collectInput();
+
+    /*!
+     * \brief converts a time string as used in the UI to an integer of minutes for
+     * use in the database based on the format in use in the Dialog
+     */
+    inline int stringToMinutes(const QString &time_string, Opl::Time::FlightTimeFormat format)
+    {
+        return ATime::toMinutes(ATime::fromString(time_string, format));
+    }
+
+    /*!
+     * \brief minutesToString converts an integer of minutes as received from the database
+     * to a String to be displayed in the UI, based on the format in use in the Dialog.
+     */
+    inline QString minutesToString(const int minutes, Opl::Time::FlightTimeFormat format)
+    {
+        return ATime::toString(ATime::fromMinutes(minutes), format);
+    }
 };
 
 

+ 1 - 1
src/gui/dialogues/newpilotdialog.cpp

@@ -153,7 +153,7 @@ void NewPilotDialog::submitForm()
     DEB << "Pilot entry position: " << pilotEntry.getPosition().tableName << pilotEntry.getPosition().rowId;
     DEB << "Pilot entry data: " << pilotEntry.getData();
     if (!aDB->commit(pilotEntry)) {
-        auto message_box = QMessageBox(this);
+        QMessageBox message_box(this);
         message_box.setText("The following error has ocurred:\n\n"
                             + aDB->lastError.text()
                             + "\n\nThe entry has not been saved.");

+ 13 - 12
src/gui/dialogues/newtaildialog.cpp

@@ -18,6 +18,7 @@
 #include "newtaildialog.h"
 #include "ui_newtail.h"
 #include "src/testing/adebug.h"
+#include "src/oplconstants.h"
 
 static const auto REG_VALID = QPair<QString, QRegularExpression> {
     "registrationLineEdit", QRegularExpression("\\w+-\\w+")};
@@ -127,10 +128,10 @@ void NewTailDialog::fillForm(AEntry entry, bool is_template)
         le->setText(data.value(key).toString());
     }
 
-    ui->operationComboBox->setCurrentIndex(data.value(DB_TAILS_MULTIPILOT).toInt() + 1);
-    ui->ppNumberComboBox ->setCurrentIndex(data.value(DB_TAILS_MULTIENGINE).toInt() + 1);
-    ui->ppTypeComboBox->setCurrentIndex(data.value(DB_TAILS_ENGINETYPE).toInt() + 1);
-    ui->weightComboBox->setCurrentIndex(data.value(DB_TAILS_WEIGHTCLASS).toInt() + 1);
+    ui->operationComboBox->setCurrentIndex(data.value(Opl::Db::TAILS_MULTIPILOT).toInt() + 1);
+    ui->ppNumberComboBox ->setCurrentIndex(data.value(Opl::Db::TAILS_MULTIENGINE).toInt() + 1);
+    ui->ppTypeComboBox->setCurrentIndex(data.value(Opl::Db::TAILS_ENGINETYPE).toInt() + 1);
+    ui->weightComboBox->setCurrentIndex(data.value(Opl::Db::TAILS_WEIGHTCLASS).toInt() + 1);
 }
 
 /*!
@@ -193,23 +194,23 @@ void NewTailDialog::submitForm()
     }
 
     if (ui->operationComboBox->currentIndex() != 0) { // bool Multipilot
-        new_data.insert(DB_TAILS_MULTIPILOT, ui->operationComboBox->currentIndex() - 1);
+        new_data.insert(Opl::Db::TAILS_MULTIPILOT, ui->operationComboBox->currentIndex() - 1);
     }
     if (ui->ppNumberComboBox->currentIndex() != 0) { // bool MultiEngine
-        new_data.insert(DB_TAILS_MULTIENGINE, ui->ppNumberComboBox->currentIndex() - 1);
+        new_data.insert(Opl::Db::TAILS_MULTIENGINE, ui->ppNumberComboBox->currentIndex() - 1);
     }
     if (ui->ppTypeComboBox->currentIndex() != 0) { // int 0=unpowered,....4=jet
-        new_data.insert(DB_TAILS_ENGINETYPE, ui->ppTypeComboBox->currentIndex() - 1);
+        new_data.insert(Opl::Db::TAILS_ENGINETYPE, ui->ppTypeComboBox->currentIndex() - 1);
     }
     if (ui->weightComboBox->currentIndex() != 0) { // int 0=light...3=super
-        new_data.insert(DB_TAILS_WEIGHTCLASS, ui->weightComboBox->currentIndex() - 1);
+        new_data.insert(Opl::Db::TAILS_WEIGHTCLASS, ui->weightComboBox->currentIndex() - 1);
     }
 
     //create db object
 
     entry.setData(new_data);
     if (!aDB->commit(entry)) {
-        auto message_box = QMessageBox(this);
+        QMessageBox message_box(this);
         message_box.setText("The following error has ocurred:\n\n"
                             + aDB->lastError.text()
                             + "\n\nThe entry has not been saved.");
@@ -256,9 +257,9 @@ void NewTailDialog::on_buttonBox_accepted()
 {
     DEB << "Button Box Accepted.";
     if (ui->registrationLineEdit->text().isEmpty()) {
-        auto nope = QMessageBox(this);
-        nope.setText("Registration cannot be empty.");
-        nope.exec();
+        QMessageBox message_box(this);
+        message_box.setText("Registration cannot be empty.");
+        message_box.exec();
         return;
     }
 

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

@@ -121,7 +121,7 @@ void AircraftWidget::onDeleteUnsuccessful()
     /// the messagebox doesn't grow too tall.
     QList<int> foreign_key_constraints = aDB->getForeignKeyConstraints(selectedTails.first(), ADatabaseTarget::tails);
     QList<AFlightEntry> constrained_flights;
-    for (const auto &row_id : foreign_key_constraints) {
+    for (const auto &row_id : qAsConst(foreign_key_constraints)) {
         constrained_flights.append(aDB->getFlightEntry(row_id));
     }
 
@@ -144,7 +144,7 @@ void AircraftWidget::onDeleteUnsuccessful()
 
 void AircraftWidget::on_newAircraftButton_clicked()
 {
-    auto nt = NewTailDialog(QString(), this);
+    NewTailDialog nt(QString(), this);
     connect(&nt, SIGNAL(accepted()), this, SLOT(acft_editing_finished()));
     connect(&nt, SIGNAL(rejected()), this, SLOT(acft_editing_finished()));
     nt.exec();

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

@@ -4,7 +4,9 @@
 #include "src/gui/widgets/logbookwidget.h"
 #include "src/gui/widgets/pilotswidget.h"
 #include "src/gui/widgets/aircraftwidget.h"
+#include "src/gui/dialogues/firstrundialog.h"
 #include <QtGlobal>
+#include "src/functions/atime.h"
 
 DebugWidget::DebugWidget(QWidget *parent) :
     QWidget(parent),
@@ -165,7 +167,7 @@ void DebugWidget::on_importCsvPushButton_clicked()
 
 void DebugWidget::on_debugPushButton_clicked()
 {
-    // space for debugging
+    // debug space
 }
 
 /* //Comparing two functions template

+ 1 - 1
src/gui/widgets/pilotswidget.cpp

@@ -151,7 +151,7 @@ void PilotsWidget::on_deletePilotButton_clicked()
 
     } else if (selectedPilots.length() == 1) {
         auto entry = aDB->getPilotEntry(selectedPilots.first());
-        auto message_box = QMessageBox(this);
+        QMessageBox message_box(this);
         QString message = "You are deleting the following pilot:<br><br><b><tt>";
         message.append(entry.name());
         message.append(QStringLiteral("</b></tt><br><br>Are you sure?"));

+ 34 - 26
src/gui/widgets/settingswidget.cpp

@@ -22,7 +22,7 @@
 #include "src/classes/asettings.h"
 #include "src/database/adatabase.h"
 #include "src/classes/apilotentry.h"
-#include "src/database/declarations.h"
+#include "src/oplconstants.h"
 
 #include <QStyleFactory>
 
@@ -54,6 +54,19 @@ SettingsWidget::SettingsWidget(QWidget *parent) :
     ui->setupUi(this);
     ui->tabWidget->setCurrentIndex(0);
 
+    setupComboBoxes();
+    setupValidators();
+    readSettings();
+}
+
+
+SettingsWidget::~SettingsWidget()
+{
+    delete ui;
+}
+
+void SettingsWidget::setupComboBoxes(){
+    // Style Combo Box
     auto styles = AStyle::styles;
     auto current_style = AStyle::style();
     ui->styleComboBox->addItem(current_style);
@@ -65,15 +78,10 @@ SettingsWidget::SettingsWidget(QWidget *parent) :
 
     if(ASettings::read(ASettings::Main::StyleSheet).toUInt() == AStyle::Dark)
         ui->darkStyleCheckBox->setCheckState(Qt::Checked);
-
-    readSettings();
-    setupValidators();
-}
-
-
-SettingsWidget::~SettingsWidget()
-{
-    delete ui;
+    // Approach Combo Box
+    for (const auto &approach : Opl::ApproachTypes) {
+        ui->approachComboBox->addItem(approach);
+    }
 }
 
 void SettingsWidget::readSettings()
@@ -84,12 +92,12 @@ void SettingsWidget::readSettings()
     {
         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());
+        ui->lastnameLineEdit->setText(user_data.value(Opl::Db::PILOTS_LASTNAME).toString());
+        ui->firstnameLineEdit->setText(user_data.value(Opl::Db::PILOTS_FIRSTNAME).toString());
+        ui->companyLineEdit->setText(user_data.value(Opl::Db::PILOTS_COMPANY).toString());
+        ui->employeeidLineEdit->setText(user_data.value(Opl::Db::PILOTS_EMPLOYEEID).toString());
+        ui->phoneLineEdit->setText(user_data.value(Opl::Db::PILOTS_PHONE).toString());
+        ui->emailLineEdit->setText(user_data.value(Opl::Db::PILOTS_EMAIL).toString());
     }
 
     /*
@@ -131,10 +139,10 @@ void SettingsWidget::updatePersonalDetails()
     RowData user_data;
     switch (ui->aliasComboBox->currentIndex()) {
     case 0:
-        user_data.insert(DB_PILOTS_ALIAS, QStringLiteral("self"));
+        user_data.insert(Opl::Db::PILOTS_ALIAS, QStringLiteral("self"));
         break;
     case 1:
-        user_data.insert(DB_PILOTS_ALIAS,QStringLiteral("SELF"));
+        user_data.insert(Opl::Db::PILOTS_ALIAS, QStringLiteral("SELF"));
         break;
     case 2:{
         QString name;
@@ -142,18 +150,18 @@ void SettingsWidget::updatePersonalDetails()
         name.append(QLatin1String(", "));
         name.append(ui->firstnameLineEdit->text().left(1));
         name.append(QLatin1Char('.'));
-        user_data.insert(DB_PILOTS_ALIAS, name);
+        user_data.insert(Opl::Db::PILOTS_ALIAS, name);
     }
         break;
     default:
         break;
     }
-    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());
+    user_data.insert(Opl::Db::PILOTS_LASTNAME, ui->lastnameLineEdit->text());
+    user_data.insert(Opl::Db::PILOTS_FIRSTNAME, ui->firstnameLineEdit->text());
+    user_data.insert(Opl::Db::PILOTS_COMPANY, ui->companyLineEdit->text());
+    user_data.insert(Opl::Db::PILOTS_EMPLOYEEID, ui->employeeidLineEdit->text());
+    user_data.insert(Opl::Db::PILOTS_PHONE, ui->phoneLineEdit->text());
+    user_data.insert(Opl::Db::PILOTS_EMAIL, ui->emailLineEdit->text());
 
     auto user = APilotEntry(1);
     user.setData(user_data);
@@ -293,7 +301,7 @@ void SettingsWidget::on_acAllowIncompleteComboBox_currentIndexChanged(int index)
 
 void SettingsWidget::on_aboutPushButton_clicked()
 {
-    auto message_box = QMessageBox(this);
+    QMessageBox message_box(this);
     QString SQLITE_VERSION = aDB->sqliteVersion();
     QString text = QMessageBox::tr(
 

+ 3 - 0
src/gui/widgets/settingswidget.h

@@ -67,7 +67,10 @@ private:
 
     void setupValidators();
 
+    void setupComboBoxes();
+
     void updatePersonalDetails();
+
 signals:
     void viewSelectionChanged(int view_id);
 };

+ 2 - 108
src/gui/widgets/settingswidget.ui

@@ -17,7 +17,7 @@
    <item row="0" column="1">
     <widget class="QTabWidget" name="tabWidget">
      <property name="currentIndex">
-      <number>2</number>
+      <number>1</number>
      </property>
      <widget class="QWidget" name="personalTab">
       <attribute name="title">
@@ -282,113 +282,7 @@
         </widget>
        </item>
        <item row="3" column="2">
-        <widget class="QComboBox" name="approachComboBox">
-         <item>
-          <property name="text">
-           <string>VISUAL</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>ILS CAT I</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>ILS CAT II</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>ILS CAT III</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>GLS</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>MLS</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>LOC</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>LOC/DME</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>RNAV</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>RNAV (LNAV)</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>RNAV (LNAV/VNAV)</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>RNAV (LPV)</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>RNAV (RNP)</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>RNAV (RNP-AR)</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>VOR</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>VOR/DME</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>NDB</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>NDB/DME</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>TACAN</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>SRA</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>PAR</string>
-          </property>
-         </item>
-        </widget>
+        <widget class="QComboBox" name="approachComboBox"/>
        </item>
        <item row="3" column="3">
         <spacer name="horizontalSpacer_4">

+ 154 - 0
src/oplconstants.h

@@ -0,0 +1,154 @@
+#ifndef OPLCONSTANTS_H
+#define OPLCONSTANTS_H
+
+#include <QtCore>
+
+/*!
+ *  \brief A namespace to collect constants and enums used throughout the application.
+ *
+ *  \details The opl namespace collects enums and constants that are used throughout
+ *  the application and provide uniform access.
+ *
+ *  The date, time and datetime namespaces include enums used to differentiate
+ *  date and time formats for QDate, QTime and QDateTime that deviate from standard values
+ *  included in the Qt Framework like Qt::ISODate and are to be used in conjunction with the
+ *  .toString() members of these classes.
+ *
+ *  The db namespace contains constants for programatically accessing the database in a fast
+ *  and uniform manner.
+ */
+namespace Opl {
+
+static const auto ApproachTypes = QStringList{
+        QStringLiteral("VISUAL"),
+        QStringLiteral("ILS CAT I"),
+        QStringLiteral("ILS CAT II"),
+        QStringLiteral("ILS CAT III"),
+        QStringLiteral("GLS"),
+        QStringLiteral("MLS"),
+        QStringLiteral("LOC"),
+        QStringLiteral("LOC/DME"),
+        QStringLiteral("RNAV"),
+        QStringLiteral("RNAV (LNAV)"),
+        QStringLiteral("RNAV (LNAV/VNAV)"),
+        QStringLiteral("RNAV (LPV)"),
+        QStringLiteral("RNAV (RNP)"),
+        QStringLiteral("RNAV (RNP-AR)"),
+        QStringLiteral("VOR"),
+        QStringLiteral("VOR/DME"),
+        QStringLiteral("NDB"),
+        QStringLiteral("NDB/DME"),
+        QStringLiteral("TACAN"),
+        QStringLiteral("SRA"),
+        QStringLiteral("PAR"),
+        QStringLiteral("OTHER")
+};
+
+namespace Date {
+
+enum DateFormat {Default, Text};
+
+} // namespace opl::date
+
+namespace Time {
+
+enum FlightTimeFormat {Default, Decimal};
+
+} // namespace opl::time
+
+namespace Datetime {
+
+enum DateTimeFormat {Default, Backup};
+
+} // namespace opl::datetime
+
+/*!
+ *  The opl::db namespace provides string literals to programatically access the database
+ *
+ *  Example usage, do:
+ *  newData.insert(opl::db::FLIGHTS_DEP, ui->deptLocLineEdit->text());
+ *  newData.value(opl::db::AIRCRAFT_MULTIPILOT);
+ *
+ *  instead of:
+ *  newData.insert("dept", ui->deptLocLineEdit->text());
+ *  newData.value("multipilot");
+ *
+ *  Declaring these literals here avoids memory allocation at runtime for construction of temporary
+ *  qstrings like ("dept"). See https://doc.qt.io/qt-5/qstring.html#QStringLiteral and ensures
+ *  uniform use throughout the application.
+ */
+namespace Db {
+
+
+// Table names
+static const auto TABLE_FLIGHTS          = QStringLiteral("flights");
+static const auto TABLE_PILOTS           = QStringLiteral("pilots");
+static const auto TABLE_TAILS            = QStringLiteral("tails");
+static const auto TABLE_AIRCRAFT         = QStringLiteral("aircraft");
+static const auto TABLE_AIRPORTS         = QStringLiteral("airports");
+
+// Flights table columns
+static const auto FLIGHTS_DOFT           = QStringLiteral("doft");
+static const auto FLIGHTS_DEPT           = QStringLiteral("dept");
+static const auto FLIGHTS_DEST           = QStringLiteral("dest");
+static const auto FLIGHTS_TOFB           = QStringLiteral("tofb");
+static const auto FLIGHTS_TONB           = QStringLiteral("tonb");
+static const auto FLIGHTS_PIC            = QStringLiteral("pic");
+static const auto FLIGHTS_ACFT           = QStringLiteral("acft");
+static const auto FLIGHTS_TBLK           = QStringLiteral("tblk");
+static const auto FLIGHTS_TSPSE          = QStringLiteral("tSPSE");
+static const auto FLIGHTS_TSPME          = QStringLiteral("tSPME");
+static const auto FLIGHTS_TMP            = QStringLiteral("tMP");
+static const auto FLIGHTS_TNIGHT         = QStringLiteral("tNIGHT");
+static const auto FLIGHTS_TIFR           = QStringLiteral("tIFR");
+static const auto FLIGHTS_TPIC           = QStringLiteral("tPIC");
+static const auto FLIGHTS_TPICUS         = QStringLiteral("tPICUS");
+static const auto FLIGHTS_TSIC           = QStringLiteral("tSIC");
+static const auto FLIGHTS_TDUAL          = QStringLiteral("tDUAL");
+static const auto FLIGHTS_TFI            = QStringLiteral("tFI");
+static const auto FLIGHTS_TSIM           = QStringLiteral("tSIM");
+static const auto FLIGHTS_PILOTFLYING    = QStringLiteral("pilotFlying");
+static const auto FLIGHTS_TODAY          = QStringLiteral("toDay");
+static const auto FLIGHTS_TONIGHT        = QStringLiteral("toNight");
+static const auto FLIGHTS_LDGDAY         = QStringLiteral("ldgDay");
+static const auto FLIGHTS_LDGNIGHT       = QStringLiteral("ldgNight");
+static const auto FLIGHTS_AUTOLAND       = QStringLiteral("autoland");
+static const auto FLIGHTS_SECONDPILOT    = QStringLiteral("secondPilot");
+static const auto FLIGHTS_THIRDPILOT     = QStringLiteral("thirdPilot");
+static const auto FLIGHTS_APPROACHTYPE   = QStringLiteral("approachType");
+static const auto FLIGHTS_FLIGHTNUMBER   = QStringLiteral("flightNumber");
+static const auto FLIGHTS_REMARKS        = QStringLiteral("remarks");
+
+// tails table
+
+static const auto TAILS_REGISTRATION     = QStringLiteral("registration");
+static const auto TAILS_COMPANY          = QStringLiteral("company");
+static const auto TAILS_MAKE             = QStringLiteral("make");
+static const auto TAILS_MODEL            = QStringLiteral("model");
+static const auto TAILS_VARIANT          = QStringLiteral("variant");
+static const auto TAILS_MULTIPILOT       = QStringLiteral("multipilot");
+static const auto TAILS_MULTIENGINE      = QStringLiteral("multiengine");
+static const auto TAILS_ENGINETYPE       = QStringLiteral("engineType");
+static const auto TAILS_WEIGHTCLASS      = QStringLiteral("weightClass");
+
+// pilots table
+
+static const auto PILOTS_LASTNAME        = QStringLiteral("lastname");
+static const auto PILOTS_FIRSTNAME       = QStringLiteral("firstname");
+static const auto PILOTS_ALIAS           = QStringLiteral("alias");
+static const auto PILOTS_COMPANY         = QStringLiteral("company");
+static const auto PILOTS_EMPLOYEEID      = QStringLiteral("employeeid");
+static const auto PILOTS_PHONE           = QStringLiteral("phone");
+static const auto PILOTS_EMAIL           = QStringLiteral("email");
+
+// all tables
+
+static const auto ROWID                  = QStringLiteral("ROWID");
+static const auto EMPTY_STRING           = QStringLiteral("");
+static const auto NULL_TIME_hhmm         = QStringLiteral("00:00");
+
+} // namespace opl::db
+
+} // namespace opl
+
+#endif // OPLCONSTANTS_H