/* *openPilotLog - A FOSS Pilot Logbook Application *Copyright (C) 2020-2023 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 . */ #include #include "mainwindow.h" #include "ui_mainwindow.h" #include "src/database/database.h" #include "src/classes/style.h" #include "src/gui/dialogues/firstrundialog.h" #include "src/gui/dialogues/newflightdialog.h" #include "src/gui/dialogues/newsimdialog.h" #include "src/gui/dialogues/newflightdialog.h" #include "src/database/databasecache.h" #include "src/classes/settings.h" // Quick and dirty Debug area void MainWindow::doDebugStuff() { OPL::RowData_T xp = DB->getTotals(false); LOG << "Totals without previous:"; LOG << xp; xp = DB->getTotals(true); LOG << "Totals with previous:"; LOG << xp; OPL::FlightEntry fe = OPL::FlightEntry(); LOG << "FLIGHT table: " << fe.getTableName(); OPL::Row row = OPL::Row(); LOG << "ROW table: " << row.getTableName(); } MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); init(); // set Startup Screen (Home Screen) ui->stackedWidget->setCurrentWidget(homeWidget); } MainWindow::~MainWindow() { delete ui; } void MainWindow::init() { connectDatabase(); initialiseWidgets(); setupToolbar(); connectWidgets(); setActionIcons(OPL::Style::getStyleType()); } void MainWindow::setupToolbar() { // Create and set up the toolbar auto *toolBar = new QToolBar(this); toolBar->addAction(ui->actionHome); toolBar->addAction(ui->actionNewFlight); toolBar->addAction(ui->actionNewSim); toolBar->addAction(ui->actionLogbook); toolBar->addAction(ui->actionAircraft); toolBar->addAction(ui->actionPilots); toolBar->addAction(ui->actionAirports); toolBar->addAction(ui->actionSettings); toolBar->addAction(ui->actionQuit); toolBar->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum); toolBar->setMovable(false); addToolBar(Qt::ToolBarArea::LeftToolBarArea, toolBar); } void MainWindow::initialiseWidgets() { // Construct Widgets homeWidget = new HomeWidget(this); ui->stackedWidget->addWidget(homeWidget); logbookWidget = new LogbookWidget(this); ui->stackedWidget->addWidget(logbookWidget); aircraftWidget = new TailsWidget(this); ui->stackedWidget->addWidget(aircraftWidget); pilotsWidget = new PilotsWidget(this); ui->stackedWidget->addWidget(pilotsWidget); airportWidget = new AirportWidget(this); ui->stackedWidget->addWidget(airportWidget); settingsWidget = new SettingsWidget(this); ui->stackedWidget->addWidget(settingsWidget); debugWidget = new DebugWidget(this); ui->stackedWidget->addWidget(debugWidget); } void MainWindow::connectDatabase() { // connect to the Database if (OPL::Paths::databaseFileInfo().size() == 0) onDatabaseInvalid(); if(!DB->connect()){ WARN(tr("Error establishing database connection. The following error has ocurred:

%1") .arg(DB->lastError.text())); } DBCache->init(); // Load Cache } void MainWindow::setActionIcons(OPL::Style::StyleType style) { switch (style){ case OPL::Style::StyleType::Light: LOG << "Setting Light Icon theme"; ui->actionHome->setIcon(QIcon(OPL::Assets::ICON_TOOLBAR_HOME)); ui->actionNewFlight->setIcon(QIcon(OPL::Assets::ICON_TOOLBAR_NEW_FLIGHT)); ui->actionNewSim->setIcon(QIcon(OPL::Assets::ICON_TOOLBAR_NEW_FLIGHT)); // pending seperate icon ui->actionLogbook->setIcon(QIcon(OPL::Assets::ICON_TOOLBAR_LOGBOOK)); ui->actionAircraft->setIcon(QIcon(OPL::Assets::ICON_TOOLBAR_AIRCRAFT)); ui->actionPilots->setIcon(QIcon(OPL::Assets::ICON_TOOLBAR_PILOT)); ui->actionAirports->setIcon(QIcon(OPL::Assets::ICON_TOOLBAR_BACKUP)); ui->actionSettings->setIcon(QIcon(OPL::Assets::ICON_TOOLBAR_SETTINGS)); ui->actionQuit->setIcon(QIcon(OPL::Assets::ICON_TOOLBAR_QUIT)); break; case OPL::Style::StyleType::Dark: LOG << "Setting Dark Icon theme"; ui->actionHome->setIcon(QIcon(OPL::Assets::ICON_TOOLBAR_HOME_DARK)); ui->actionNewFlight->setIcon(QIcon(OPL::Assets::ICON_TOOLBAR_NEW_FLIGHT_DARK)); ui->actionNewSim->setIcon(QIcon(OPL::Assets::ICON_TOOLBAR_NEW_FLIGHT_DARK)); // pending separate icon ui->actionLogbook->setIcon(QIcon(OPL::Assets::ICON_TOOLBAR_LOGBOOK_DARK)); ui->actionAircraft->setIcon(QIcon(OPL::Assets::ICON_TOOLBAR_AIRCRAFT_DARK)); ui->actionPilots->setIcon(QIcon(OPL::Assets::ICON_TOOLBAR_PILOT_DARK)); ui->actionAirports->setIcon(QIcon(OPL::Assets::ICON_TOOLBAR_BACKUP_DARK)); ui->actionSettings->setIcon(QIcon(OPL::Assets::ICON_TOOLBAR_SETTINGS_DARK)); ui->actionQuit->setIcon(QIcon(OPL::Assets::ICON_TOOLBAR_QUIT_DARK)); break; } } 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(DB, &OPL::Database::dataBaseUpdated, homeWidget, &HomeWidget::refresh); QObject::connect(settingsWidget, &SettingsWidget::settingChanged, homeWidget, &HomeWidget::refresh); QObject::connect(DB, &OPL::Database::dataBaseUpdated, logbookWidget, &LogbookWidget::refresh); QObject::connect(settingsWidget, &SettingsWidget::settingChanged, logbookWidget, &LogbookWidget::onLogbookWidget_viewSelectionChanged); QObject::connect(DB, &OPL::Database::dataBaseUpdated, aircraftWidget, &TailsWidget::onAircraftWidget_dataBaseUpdated); QObject::connect(settingsWidget, &SettingsWidget::settingChanged, aircraftWidget, &TailsWidget::onAircraftWidget_settingChanged); QObject::connect(DB, &OPL::Database::dataBaseUpdated, pilotsWidget, &PilotsWidget::onPilotsWidget_databaseUpdated); QObject::connect(settingsWidget, &SettingsWidget::settingChanged, pilotsWidget, &PilotsWidget::onPilotsWidget_settingChanged); QObject::connect(settingsWidget, &SettingsWidget::settingChanged, this, &MainWindow::onStyleChanged); QObject::connect(DB, &OPL::Database::connectionReset, logbookWidget, &LogbookWidget::repopulateModel); QObject::connect(DB, &OPL::Database::connectionReset, pilotsWidget, &PilotsWidget::repopulateModel); QObject::connect(DB, &OPL::Database::connectionReset, aircraftWidget, &TailsWidget::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.
" "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 = QDir::toNativeSeparators( (QFileDialog::getOpenFileName(this, tr("Select Database"), OPL::Paths::directory(OPL::Paths::Backup).canonicalPath(), tr("Database file (*.db)")))); if (!db_path.isEmpty()) { if(!DB->restoreBackup(db_path)) { WARN(tr("Unable to restore backup file:

%1").arg(db_path)); on_actionQuit_triggered(); } } } else if (ret == QMessageBox::ButtonRole::RejectRole){ DEB << "No(Create New)"; if(FirstRunDialog().exec() == QDialog::Rejected){ LOG << "Initial setup incomplete or unsuccessfull."; on_actionQuit_triggered(); } Settings::write(Settings::Main::SetupComplete, true); LOG << "Initial Setup Completed successfully"; } } /* * Slots */ void MainWindow::on_actionHome_triggered() { ui->stackedWidget->setCurrentWidget(homeWidget); } void MainWindow::on_actionNewFlight_triggered() { auto* nf = new NewFlightDialog(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_actionAirports_triggered() { ui->stackedWidget->setCurrentWidget(airportWidget); } void MainWindow::on_actionSettings_triggered() { ui->stackedWidget->setCurrentWidget(settingsWidget); } void MainWindow::on_actionQuit_triggered() { QApplication::quit(); exit(0); } void MainWindow::on_actionDebug_triggered() { ui->stackedWidget->setCurrentWidget(debugWidget); } void MainWindow::on_actionNewSim_triggered() { auto nsd = NewSimDialog(this); nsd.exec(); }