Browse Source

Work on FirstRunDialog

Fixed and updated FirstRunDialog to include initial database setup.
Reworked reading and writing of settings in FirstRunDialog and NewFlightDialog
Felix Turo 4 years ago
parent
commit
885b010b68

+ 9 - 2
main.cpp

@@ -18,11 +18,13 @@
 #include "mainwindow.h"
 #include "src/gui/dialogues/firstrundialog.h"
 #include "src/classes/arunguard.h"
+#include "src/experimental/adatabase.h"
+#include "src/classes/asettings.h"
 #include <QApplication>
 #include <QProcess>
 #include <QSettings>
 #include <QFileInfo>
-#include "src/experimental/adatabase.h"
+
 
 const auto DATA_DIR = QLatin1String("data");
 /*!
@@ -51,16 +53,21 @@ int main(int argc, char *argv[])
     QSettings::setDefaultFormat(QSettings::IniFormat);
     QSettings settings;
 
-//    Db::connect();
     experimental::aDB()->connect();
 
     QApplication openPilotLog(argc, argv);
     if(!setup()){
+        DEB("error creating required directories");
+        return 0;
+    }
+
+    if (!ASettings::read("setup/setup_complete").toBool()) {
         FirstRunDialog dialog;
         dialog.exec();
     }
 
 
+
     //Theming
     int selectedtheme = settings.value("main/theme").toInt();
     QDir::setCurrent("/themes");

+ 1 - 1
src/experimental/adatabase.cpp

@@ -498,7 +498,7 @@ int ADataBase::getLastEntry(ADataBase::DatabaseTarget target)
         statement.append(DB_TABLE_AIRCRAFT);
         break;
     case tails:
-        statement.append(DB_TABLE_AIRCRAFT);
+        statement.append(DB_TABLE_TAILS);
         break;
     default:
         DEB("Not a valid completer target for this function.");

+ 98 - 44
src/gui/dialogues/firstrundialog.cpp

@@ -1,6 +1,10 @@
 #include "firstrundialog.h"
 #include "ui_firstrundialog.h"
 
+const auto TEMPLATE_URL = QLatin1String("https://raw.githubusercontent.com/fiffty-50/openpilotlog/develop/assets/database/templates/");
+
+using namespace experimental;
+
 FirstRunDialog::FirstRunDialog(QWidget *parent) :
     QDialog(parent),
     ui(new Ui::FirstRunDialog)
@@ -52,67 +56,117 @@ void FirstRunDialog::on_finishButton_clicked()
         mb->setText("You have to enter a valid first and last name for the logbook.");
         mb->show();
     } else {
-        ASettings::write("userdata/piclastname",ui->piclastnameLineEdit->text());
-        ASettings::write("userdata/picfirstname",ui->picfirstnameLineEdit->text());
-        ASettings::write("userdata/employeeid",ui->employeeidLineEdit->text());
-        ASettings::write("userdata/phone",ui->phoneLineEdit->text());
-        ASettings::write("userdata/email",ui->emailLineEdit->text());
+        ASettings::write("userdata/piclastname", ui->piclastnameLineEdit->text());
+        ASettings::write("userdata/picfirstname", ui->picfirstnameLineEdit->text());
+        ASettings::write("userdata/employeeid", ui->employeeidLineEdit->text());
+        ASettings::write("userdata/phone", ui->phoneLineEdit->text());
+        ASettings::write("userdata/email", ui->emailLineEdit->text());
 
         ASettings::write("flightlogging/function", ui->functionComboBox->currentText());
-        ASettings::write("flightlogging/rules", ui->rulesComboBox->currentText());
         ASettings::write("flightlogging/approach", ui->approachComboBox->currentText());
         ASettings::write("flightlogging/nightlogging", ui->nightComboBox->currentIndex());
+        ASettings::write("flightlogging/logIfr", ui->rulesComboBox->currentIndex());
         ASettings::write("flightlogging/flightnumberPrefix", ui->prefixLineEdit->text());
 
-        QMap<QString,QString> data;
+        ASettings::write("flightlogging/numberTakeoffs", 1);
+        ASettings::write("flightlogging/numberLandings", 1);
+        ASettings::write("flightlogging/popupCalendar", true);
+        ASettings::write("flightlogging/pilotFlying", true);
+
+
+        QMap<QString, QVariant> data;
         switch (ui->aliasComboBox->currentIndex()) {
         case 0:
-            ASettings::write("userdata/displayselfas",ui->aliasComboBox->currentIndex());
-            data.insert("displayname","self");
+            ASettings::write("userdata/displayselfas", ui->aliasComboBox->currentIndex());
             break;
         case 1:
-            ASettings::write("userdata/displayselfas",ui->aliasComboBox->currentIndex());
-            data.insert("displayname","SELF");
+            ASettings::write("userdata/displayselfas", ui->aliasComboBox->currentIndex());
             break;
         case 2:{
-            ASettings::write("userdata/displayselfas",ui->aliasComboBox->currentIndex());
-            QString name;
-            name.append(ui->piclastnameLineEdit->text());
-            name.append(QLatin1String(", "));
-            name.append(ui->picfirstnameLineEdit->text().left(1));
-            name.append(QLatin1Char('.'));
-            data.insert("displayname",name);
+            ASettings::write("userdata/displayselfas", ui->aliasComboBox->currentIndex());
         }
             break;
         default:
             break;
         }
-        data.insert("piclastname",ui->piclastnameLineEdit->text());
-        data.insert("picfirstname",ui->picfirstnameLineEdit->text());
-        data.insert("alias", ASettings::read("userdata/displayselfas").toString());
-        data.insert("employeeid",ui->employeeidLineEdit->text());
-        data.insert("phone",ui->phoneLineEdit->text());
-        data.insert("email",ui->emailLineEdit->text());
-
-        Pilot pic(1);
-        pic.setData(data);
-        pic.commit();
-
-        switch(ASettings::read("main/theme").toInt()){
-        case 0:
-            accept();
-            break;
-        case 1:
-            qApp->quit();
-            QProcess::startDetached(qApp->arguments()[0], qApp->arguments());
-            break;
-        case 2:
-            qApp->quit();
-            QProcess::startDetached(qApp->arguments()[0], qApp->arguments());
-            break;
-        default:
-            ASettings::write("main/theme", 0);
-            accept();
+        data.insert("piclastname", ui->piclastnameLineEdit->text());
+        data.insert("picfirstname", ui->picfirstnameLineEdit->text());
+        data.insert("alias", "self");
+        data.insert("employeeid", ui->employeeidLineEdit->text());
+        data.insert("phone", ui->phoneLineEdit->text());
+        data.insert("email", ui->emailLineEdit->text());
+
+        if (!finishSetup()) {
+            QMessageBox message_box(this);
+            message_box.setText("Errors have ocurred creating the database. Without a working database The application will not be usable.");
+        }
+        aDB()->disconnect(); // reset db connection to refresh layout after initial setup.
+        aDB()->connect();
+        auto pilot = APilotEntry(1);
+        pilot.setData(data);
+        aDB()->commit(pilot);
+        qApp->quit();
+        QProcess::startDetached(qApp->arguments()[0], qApp->arguments());
+    }
+}
+
+bool FirstRunDialog::finishSetup()
+{
+
+    //check if template dir exists and create if needed.
+    QDir dir("data/templates");
+    DEB(dir.path());
+    if (!dir.exists())
+        dir.mkpath(".");
+
+    QMessageBox confirm;
+    confirm.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
+    confirm.setDefaultButton(QMessageBox::No);
+    confirm.setIcon(QMessageBox::Question);
+    confirm.setWindowTitle("Create Database");
+    confirm.setText("We are now going to create the database. Would you like to download the latest database information?\n(Recommended, Internet connection required)\n");
+    int reply = confirm.exec();
+    if (reply == QMessageBox::Yes) {
+        // download latest csv
+        QStringList templateTables = {"aircraft", "airports", "changelog"};
+        QString linkStub = TEMPLATE_URL;
+        for (const auto& table : templateTables) {
+            QEventLoop loop;
+            ADownload* dl = new ADownload;
+            connect(dl, &ADownload::done, &loop, &QEventLoop::quit );
+            dl->setTarget(QUrl(linkStub + table + ".csv"));
+            dl->setFileName("data/templates/" + table + ".csv");
+            dl->download();
+            loop.exec(); // event loop waits for download done signal before allowing loop to continue
+            dl->deleteLater();
+        }
+    }
+
+    //close database connection
+    aDB()->disconnect();
+
+    // back up old database
+    auto oldDatabase = QFile("data/logbook.db");
+    if (oldDatabase.exists()) {
+        auto dateString = QDateTime::currentDateTime().toString(Qt::ISODate);
+        DEB("Backing up old database as: " << "logbook-backup-" + dateString);
+        if (!oldDatabase.rename("data/logbook-backup-" + dateString)) {
+            DEB("Warning: Creating backup of old database has failed.");
         }
     }
+    // re-connect and create new database
+    aDB()->connect();
+
+    if (ADataBaseSetup::createDatabase()) {
+        if (ADataBaseSetup::importDefaultData()) {
+            ASettings::write("setup/setup_complete", true);
+            return true;
+        } else {
+            return false;
+        }
+    } else {
+        return false;
+    }
 }
+
+

+ 7 - 1
src/gui/dialogues/firstrundialog.h

@@ -5,7 +5,11 @@
 #include <QButtonGroup>
 #include <QMessageBox>
 #include "src/classes/asettings.h"
-#include "src/classes/pilot.h"
+#include "src/testing/adebug.h"
+#include "src/experimental/apilotentry.h"
+#include "src/experimental/adatabase.h"
+#include "src/classes/adownload.h"
+#include "src/database/adatabasesetup.h"
 
 namespace Ui {
 class FirstRunDialog;
@@ -29,6 +33,8 @@ private slots:
 
     void on_finishButton_clicked();
 
+    bool finishSetup();
+
 private:
     Ui::FirstRunDialog *ui;
 

+ 39 - 36
src/gui/dialogues/newflightdialog.cpp

@@ -1,4 +1,4 @@
-/*
+/*
  *openPilot Log - A FOSS Pilot Logbook Application
  *Copyright (C) 2020  Felix Turowsky
  *
@@ -103,6 +103,14 @@ NewFlightDialog::NewFlightDialog(QWidget *parent) :
     ui->setupUi(this);
     flightEntry = AFlightEntry();
     setup();
+    if (ASettings::read("NewFlight/FunctionComboBox").toString() == "SIC") {
+        ui->picNameLineEdit->setText(DB_NULL);
+        ui->secondPilotNameLineEdit->setText("self");
+    }
+    if(ASettings::read("NewFlight/FunctionComboBox").toString() == "PIC"){
+        ui->picNameLineEdit->setText("self");
+        emit ui->picNameLineEdit->editingFinished();
+    }
 }
 
 NewFlightDialog::NewFlightDialog(int row_id, QWidget *parent) :
@@ -142,54 +150,46 @@ void NewFlightDialog::setup()
 
     ui->doftLineEdit->setText(QDate::currentDate().toString(Qt::ISODate));
     emit ui->doftLineEdit->editingFinished();
-
-    if(ASettings::read("NewFlight/FunctionComboBox").toString() == "PIC"){
-        ui->picNameLineEdit->setText("self");
-        emit ui->picNameLineEdit->editingFinished();
-    }
     ui->deptLocLineEdit->setFocus();
 }
 void NewFlightDialog::readSettings()
 {
     DEB("Reading Settings...");
     QSettings settings;
-    ui->FunctionComboBox->setCurrentText(ASettings::read("NewFlight/FunctionComboBox").toString());
-    ui->ApproachComboBox->setCurrentText(ASettings::read("NewFlight/ApproachComboBox").toString());
-    ui->PilotFlyingCheckBox->setChecked(ASettings::read("NewFlight/PilotFlyingCheckBox").toBool());
-    ui->PilotMonitoringCheckBox->setChecked(ASettings::read("NewFlight/PilotMonitoringCheckBox").toBool());
-    ui->TakeoffSpinBox->setValue(ASettings::read("NewFlight/TakeoffSpinBox").toInt());
-    ui->TakeoffCheckBox->setChecked(ASettings::read("NewFlight/TakeoffCheckBox").toBool());
-    ui->LandingSpinBox->setValue(ASettings::read("NewFlight/LandingSpinBox").toInt());
-    ui->LandingCheckBox->setChecked(ASettings::read("NewFlight/LandingCheckBox").toBool());
-    ui->AutolandSpinBox->setValue(ASettings::read("NewFlight/AutolandSpinBox").toInt());
-    ui->AutolandCheckBox->setChecked(ASettings::read("NewFlight/AutolandCheckBox").toBool());
-    ui->IfrCheckBox->setChecked(ASettings::read("NewFlight/IfrCheckBox").toBool());
-    ui->VfrCheckBox->setChecked(ASettings::read("NewFlight/VfrCheckBox").toBool());
-    ui->FlightNumberLineEdit->setText(ASettings::read("flightlogging/flightnumberPrefix").toString());
-    ui->calendarCheckBox->setChecked(ASettings::read("NewFlight/calendarCheckBox").toBool());
-    if (ASettings::read("NewFlight/FunctionComboBox").toString() == "Co-Pilot") {
-        ui->picNameLineEdit->setText(DB_NULL);
-        ui->secondPilotNameLineEdit->setText("self");
+    ui->FunctionComboBox->setCurrentText(ASettings::read("flightlogging/function").toString());
+    ui->ApproachComboBox->setCurrentText(ASettings::read("flightlogging/approach").toString());
+
+    ASettings::read("flightlogging/pilotFlying").toBool() ? ui->PilotFlyingCheckBox->setChecked(true)
+                                                          : ui->PilotMonitoringCheckBox->setChecked(true);
+
+    ui->TakeoffSpinBox->setValue(ASettings::read("flightlogging/numberTakeoffs").toInt());
+    ui->TakeoffSpinBox->value() > 0 ? ui->TakeoffCheckBox->setChecked(true)
+                                    : ui->TakeoffCheckBox->setChecked(false);
+    ui->LandingSpinBox->setValue(ASettings::read("flightlogging/numberLandings").toInt());
+    ui->LandingSpinBox->value() > 0 ? ui->LandingCheckBox->setChecked(true)
+                                    : ui->LandingCheckBox->setChecked(false);
+    if (ASettings::read("flightlogging/logIfr").toBool()) {
+        ui->IfrCheckBox->setChecked(true);
+    } else {
+        ui->VfrCheckBox->setChecked(true);
     }
+
+    ui->FlightNumberLineEdit->setText(ASettings::read("flightlogging/flightnumberPrefix").toString());
+    ui->calendarCheckBox->setChecked(ASettings::read("flightlogging/popupCalendar").toBool());
+
 }
 
 void NewFlightDialog::writeSettings()
 {
     DEB("Writing Settings...");
 
-    ASettings::write("NewFlight/FunctionComboBox",ui->FunctionComboBox->currentText());
-    ASettings::write("NewFlight/ApproachComboBox",ui->ApproachComboBox->currentText());
-    ASettings::write("NewFlight/PilotFlyingCheckBox",ui->PilotFlyingCheckBox->isChecked());
-    ASettings::write("NewFlight/PilotMonitoringCheckBox",ui->PilotMonitoringCheckBox->isChecked());
-    ASettings::write("NewFlight/TakeoffSpinBox",ui->TakeoffSpinBox->value());
-    ASettings::write("NewFlight/TakeoffCheckBox",ui->TakeoffCheckBox->isChecked());
-    ASettings::write("NewFlight/LandingSpinBox",ui->LandingSpinBox->value());
-    ASettings::write("NewFlight/LandingCheckBox",ui->LandingCheckBox->isChecked());
-    ASettings::write("NewFlight/AutolandSpinBox",ui->AutolandSpinBox->value());
-    ASettings::write("NewFlight/AutolandCheckBox",ui->AutolandCheckBox->isChecked());
-    ASettings::write("NewFlight/IfrCheckBox",ui->IfrCheckBox->isChecked());
-    ASettings::write("NewFlight/VfrCheckBox",ui->VfrCheckBox->isChecked());
-    ASettings::write("NewFlight/calendarCheckBox",ui->calendarCheckBox->isChecked());
+    ASettings::write("flightlogging/function", ui->FunctionComboBox->currentText());
+    ASettings::write("flightlogging/approach", ui->ApproachComboBox->currentText());
+    ASettings::write("flightlogging/pilotFlying", ui->PilotFlyingCheckBox->isChecked());
+    ASettings::write("flightlogging/numberTakeoffs", ui->TakeoffSpinBox->value());
+    ASettings::write("flightlogging/numberLandings", ui->LandingSpinBox->value());
+    ASettings::write("flightlogging/logIfr", ui->IfrCheckBox->isChecked());
+    ASettings::write("flightlogging/popupCalendar", ui->calendarCheckBox->isChecked());
 }
 
 void NewFlightDialog::setupButtonGroups()
@@ -805,6 +805,9 @@ void NewFlightDialog::addNewTail(QLineEdit *parent_line_edit)
         tailsIdMap  = aDB()->getIdMap(ADataBase::tails);
         tailsList   = aDB()->getCompletionList(ADataBase::registrations);
 
+        DEB("New Entry added. Id:" << aDB()->getLastEntry(ADataBase::tails));
+        DEB("AC Map: " << tailsIdMap);
+
         parent_line_edit->setText(tailsIdMap.key(aDB()->getLastEntry(ADataBase::tails)));
         emit parent_line_edit->editingFinished();
     } else {

+ 2 - 1
src/gui/dialogues/newtaildialog.cpp

@@ -220,7 +220,8 @@ void NewTailDialog::submitForm()
         message_box.exec();
         return;
     } else {
-        ACalc::updateAutoTimes(entry.getPosition().second);
+        if (entry.getPosition().second != 0)
+            ACalc::updateAutoTimes(entry.getPosition().second);
         QDialog::accept();
     }
 }

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

@@ -67,7 +67,7 @@ void DebugWidget::on_resetDatabasePushButton_clicked()
     if (oldDatabase.exists()) {
         auto dateString = QDateTime::currentDateTime().toString(Qt::ISODate);
         DEB("Backing up old database as: " << "logbook-backup-" + dateString);
-        if (!oldDatabase.rename("data/logbook-backup-" + dateString)) {
+        if (!oldDatabase.rename("data/logbook-backup-" + dateString + ".db")) {
             DEB("Warning: Creating backup of old database has failed.");
         }
     }