123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 |
- /*
- *openPilotLog - A FOSS Pilot Logbook Application
- *Copyright (C) 2020-2021 Felix Turowsky
- *
- *This program is free software: you can redistribute it and/or modify
- *it under the terms of the GNU General Public License as published by
- *the Free Software Foundation, either version 3 of the License, or
- *(at your option) any later version.
- *
- *This program is distributed in the hope that it will be useful,
- *but WITHOUT ANY WARRANTY; without even the implied warranty of
- *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- *GNU General Public License for more details.
- *
- *You should have received a copy of the GNU General Public License
- *along with this program. If not, see <https://www.gnu.org/licenses/>.
- */
- #include <QToolBar>
- #include "mainwindow.h"
- #include "ui_mainwindow.h"
- #include "src/functions/alog.h"
- #include "src/database/adatabase.h"
- #include "src/classes/astyle.h"
- #include "src/gui/dialogues/firstrundialog.h"
- #include "src/gui/dialogues/newflightdialog.h"
- #include "src/functions/adatetime.h"
- #include "src/classes/aentry.h"
- #include "src/gui/dialogues/newsimdialog.h"
- // Quick and dirty Debug area
- void MainWindow::doDebugStuff()
- {
- auto nsd = new NewSimDialog(this);
- nsd->exec();
- }
- MainWindow::MainWindow(QWidget *parent)
- : QMainWindow(parent)
- , ui(new Ui::MainWindow)
- {
- ui->setupUi(this);
- // connect to the Database
- QFileInfo database_file(AStandardPaths::directory(AStandardPaths::Database).
- absoluteFilePath(QStringLiteral("logbook.db")));
- bool db_invalid = false;
- if (!database_file.exists()) {
- WARN(tr("Error: Database file not found."));
- db_invalid = true;
- } else if (database_file.size() == 0) { // To Do: Check for database errors instead of just checking for empty
- WARN(tr("Database file invalid."));
- db_invalid = true;
- }
- if (db_invalid)
- onDatabaseInvalid();
- if(!aDB->connect()){
- WARN(tr("Error establishing database connection."));
- }
- // retreive completion lists and maps
- completionData.init();
- // Construct Widgets
- homeWidget = new HomeWidget(this);
- ui->stackedWidget->addWidget(homeWidget);
- logbookWidget = new LogbookWidget(completionData, this);
- ui->stackedWidget->addWidget(logbookWidget);
- aircraftWidget = new AircraftWidget(this);
- ui->stackedWidget->addWidget(aircraftWidget);
- pilotsWidget = new PilotsWidget(this);
- ui->stackedWidget->addWidget(pilotsWidget);
- backupWidget = new BackupWidget(this);
- ui->stackedWidget->addWidget(backupWidget);
- settingsWidget = new SettingsWidget(this);
- ui->stackedWidget->addWidget(settingsWidget);
- debugWidget = new DebugWidget(this);
- ui->stackedWidget->addWidget(debugWidget);
- connectWidgets();
- // Startup Screen (Home Screen)
- ui->stackedWidget->setCurrentWidget(homeWidget);
- // Create and set up the toolbar
- auto *toolBar = new QToolBar(this);
- ui->actionHome->setIcon(QIcon(OPL::Assets::ICON_TOOLBAR_HOME));
- toolBar->addAction(ui->actionHome);
- ui->actionNewFlight->setIcon(QIcon(OPL::Assets::ICON_TOOLBAR_NEW_FLIGHT));
- toolBar->addAction(ui->actionNewFlight);
- ui->actionLogbook->setIcon(QIcon(OPL::Assets::ICON_TOOLBAR_LOGBOOK));
- toolBar->addAction(ui->actionLogbook);
- ui->actionAircraft->setIcon(QIcon(OPL::Assets::ICON_TOOLBAR_AIRCRAFT));
- toolBar->addAction(ui->actionAircraft);
- ui->actionPilots->setIcon(QIcon(OPL::Assets::ICON_TOOLBAR_PILOT));
- toolBar->addAction(ui->actionPilots);
- ui->actionBackup->setIcon(QIcon(OPL::Assets::ICON_TOOLBAR_BACKUP));
- toolBar->addAction(ui->actionBackup);
- ui->actionSettings->setIcon(QIcon(OPL::Assets::ICON_TOOLBAR_SETTINGS));
- toolBar->addAction(ui->actionSettings);
- ui->actionQuit->setIcon(QIcon(OPL::Assets::ICON_TOOLBAR_QUIT));
- toolBar->addAction(ui->actionQuit);
- toolBar->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum);
- toolBar->setMovable(false);
- addToolBar(Qt::ToolBarArea::LeftToolBarArea, toolBar);
- // check database version (Debug)
- if (aDB->dbRevision() < aDB->getMinimumDatabaseRevision()) {
- QString message = tr("Your database is out of date."
- "Minimum required revision: %1<br>"
- "You have revision: %2<br>")
- .arg(aDB->getMinimumDatabaseRevision(), aDB->dbRevision());
- WARN(message);
- }
- }
- MainWindow::~MainWindow()
- {
- delete ui;
- }
- void MainWindow::nope()
- {
- QMessageBox message_box(this); //error box
- message_box.setText(tr("This feature is not yet available!"));
- message_box.exec();
- }
- /*!
- * \brief Connect the widgets to signals that are emitted when an update of the widegts' contents,
- * is required, either because the database has changed (model and view need to be refreshed) or
- * because a setting that affects the widgets layout has changed.
- */
- void MainWindow::connectWidgets()
- {
- QObject::connect(aDB, &ADatabase::dataBaseUpdated,
- homeWidget, &HomeWidget::refresh);
- QObject::connect(settingsWidget, &SettingsWidget::settingChanged,
- homeWidget, &HomeWidget::refresh);
- QObject::connect(aDB, &ADatabase::dataBaseUpdated,
- logbookWidget, &LogbookWidget::refresh);
- QObject::connect(settingsWidget, &SettingsWidget::settingChanged,
- logbookWidget, &LogbookWidget::onLogbookWidget_viewSelectionChanged);
- QObject::connect(aDB, &ADatabase::dataBaseUpdated,
- aircraftWidget, &AircraftWidget::onAircraftWidget_dataBaseUpdated);
- QObject::connect(settingsWidget, &SettingsWidget::settingChanged,
- aircraftWidget, &AircraftWidget::onAircraftWidget_settingChanged);
- QObject::connect(aDB, &ADatabase::dataBaseUpdated,
- pilotsWidget, &PilotsWidget::onPilotsWidget_databaseUpdated);
- QObject::connect(settingsWidget, &SettingsWidget::settingChanged,
- pilotsWidget, &PilotsWidget::onPilotsWidget_settingChanged);
- QObject::connect(aDB, &ADatabase::connectionReset,
- logbookWidget, &LogbookWidget::repopulateModel);
- QObject::connect(aDB, &ADatabase::connectionReset,
- pilotsWidget, &PilotsWidget::repopulateModel);
- QObject::connect(aDB, &ADatabase::connectionReset,
- aircraftWidget, &AircraftWidget::repopulateModel);
- }
- void MainWindow::onDatabaseInvalid()
- {
- QMessageBox db_error(this);
- //db_error.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
- db_error.addButton(tr("Restore Backup"), QMessageBox::ButtonRole::AcceptRole);
- db_error.addButton(tr("Create New Database"), QMessageBox::ButtonRole::RejectRole);
- db_error.addButton(tr("Abort"), QMessageBox::ButtonRole::DestructiveRole);
- db_error.setIcon(QMessageBox::Warning);
- db_error.setWindowTitle(tr("No valid database found"));
- db_error.setText(tr("No valid database has been found.<br>"
- "Would you like to create a new database or import a backup?"));
- int ret = db_error.exec();
- if (ret == QMessageBox::DestructiveRole) {
- DEB << "No valid database found. Exiting.";
- on_actionQuit_triggered();
- } else if (ret == QMessageBox::ButtonRole::AcceptRole) {
- DEB << "Yes(Import Backup)";
- QString db_path = QFileDialog::getOpenFileName(this,
- tr("Select Database"),
- AStandardPaths::directory(AStandardPaths::Backup).canonicalPath(),
- tr("Database file (*.db)"));
- if (!db_path.isEmpty()) {
- if(!aDB->restoreBackup(db_path)) {
- WARN(tr("Unable to restore Backup file: %1").arg(db_path));
- on_actionQuit_triggered();
- } else {
- INFO(tr("Backup successfully restored."));
- }
- }
- } else if (ret == QMessageBox::ButtonRole::RejectRole){
- DEB << "No(Create New)";
- if(FirstRunDialog().exec() == QDialog::Rejected){
- LOG << "Initial setup incomplete or unsuccessfull.";
- on_actionQuit_triggered();
- }
- ASettings::write(ASettings::Main::SetupComplete, true);
- LOG << "Initial Setup Completed successfully";
- }
- }
- /*
- * Slots
- */
- void MainWindow::on_actionHome_triggered()
- {
- ui->stackedWidget->setCurrentWidget(homeWidget);
- }
- void MainWindow::on_actionNewFlight_triggered()
- {
- completionData.update();
- auto* nf = new NewFlightDialog(completionData, this);
- nf->exec();
- }
- void MainWindow::on_actionLogbook_triggered()
- {
- ui->stackedWidget->setCurrentWidget(logbookWidget);
- }
- void MainWindow::on_actionAircraft_triggered()
- {
- ui->stackedWidget->setCurrentWidget(aircraftWidget);
- }
- void MainWindow::on_actionPilots_triggered()
- {
- ui->stackedWidget->setCurrentWidget(pilotsWidget);
- }
- void MainWindow::on_actionBackup_triggered()
- {
- ui->stackedWidget->setCurrentWidget(backupWidget);
- }
- void MainWindow::on_actionSettings_triggered()
- {
- ui->stackedWidget->setCurrentWidget(settingsWidget);
- }
- void MainWindow::on_actionQuit_triggered()
- {
- QApplication::quit();
- }
- void MainWindow::on_actionDebug_triggered()
- {
- ui->stackedWidget->setCurrentWidget(debugWidget);
- }
|