#include "logbooktableeditwidget.h" #include "src/classes/settings.h" #include "src/classes/styleddatedelegate.h" #include "src/classes/styledpilotdelegate.h" #include "src/classes/styledtimedelegate.h" #include "src/classes/styledtypedelegate.h" #include "src/database/database.h" #include "src/database/views/logbookviewinfo.h" #include "src/gui/dialogues/newflightdialog.h" #include "src/gui/dialogues/newsimdialog.h" LogbookTableEditWidget::LogbookTableEditWidget(QWidget *parent) : TableEditWidget(Vertical, parent) {} // TableEditWidget implementation void LogbookTableEditWidget::setupModelAndView() { m_logbookView = Settings::getLogbookView(); m_model = new QSqlTableModel(this, DB->database()); m_model->setTable(OPL::GLOBALS->getViewIdentifier(m_logbookView)); m_model->select(); const auto headers = OPL::LogbookViewInfo::getTableHeaders(m_logbookView); for(int i = 0; i < headers.size(); i++) { m_model->setHeaderData(i, Qt::Horizontal, headers[i]); } m_view->setModel(m_model); m_view->setSelectionMode(QAbstractItemView::SingleSelection); m_view->setSelectionBehavior(QAbstractItemView::SelectRows); m_view->setEditTriggers(QAbstractItemView::NoEditTriggers); m_view->horizontalHeader()->setStretchLastSection(QHeaderView::Stretch); m_view->verticalHeader()->hide(); m_view->setAlternatingRowColors(true); m_view->hideColumn(COL_ROWID); setupDelegates(); m_view->resizeColumnsToContents(); } void LogbookTableEditWidget::setupUI() { TableEditWidget::setupUI(); m_addNewEntryPushButton->setText(tr("Add new Flight")); m_deleteEntryPushButton->setText(tr("Delete selected Entry")); m_filterWidget->hide(); m_stackedWidget->hide(); m_format = Settings::getDisplayFormat(); } QString LogbookTableEditWidget::deleteErrorString(int rowId) { return tr("
Unable to delete.

The following error has ocurred: %1" ).arg(DB->lastError.text()); } QString LogbookTableEditWidget::confirmDeleteString(int rowId) { if(rowId > 0) { const auto selectedEntry = DB->getFlightEntry(rowId); return tr("The following flight will be deleted:

" "%1


" "Deleting flights is irreversible.
Do you want to proceed?" ).arg(selectedEntry.getFlightSummary()); } return tr("Deleting entries is irreversible.
Do you want to proceed?"); } EntryEditDialog *LogbookTableEditWidget::getEntryEditDialog(QWidget *parent) { return new NewFlightDialog(parent); } void LogbookTableEditWidget::filterTextChanged(const QString &filterString) {} void LogbookTableEditWidget::addEntryRequested() { // close open edit dialog(s), if present if(m_stackedWidget->count() > 2) { while (m_stackedWidget->count() > 2) { m_stackedWidget->removeWidget(m_stackedWidget->widget(2)); } } showEditWidget(); auto nfd = NewFlightDialog(this); m_stackedWidget->addWidget(&nfd); m_stackedWidget->setCurrentWidget(&nfd); nfd.exec(); hideEditWidget(); // auto nfd = NewFlightDialog(this); // nfd.exec(); } void LogbookTableEditWidget::editEntryRequested(const QModelIndex &selectedIndex) { showEditWidget(); const auto idx = m_view->selectionModel()->currentIndex(); const auto rowId = m_model->index(idx.row(), 0).data().toInt(); if(rowId > 0) { auto nfd = NewFlightDialog(rowId, this); m_stackedWidget->addWidget(&nfd); m_stackedWidget->setCurrentWidget(&nfd); nfd.exec(); } else { auto nsd = NewSimDialog(rowId * -1, this); m_stackedWidget->addWidget(&nsd); m_stackedWidget->setCurrentWidget(&nsd); nsd.exec(); } hideEditWidget(); } void LogbookTableEditWidget::deleteEntryRequested() { const QModelIndex selectedIndex = m_view->selectionModel()->currentIndex(); if(!selectedIndex.isValid()) { WARN(tr("No entry selected.")); return; } m_stackedWidget->hide(); int rowId = m_model->index(selectedIndex.row(), 0).data().toInt(); m_view->selectionModel()->reset(); // get user confirmation QMessageBox confirm(this); confirm.setStandardButtons(QMessageBox::Yes | QMessageBox::No); confirm.setDefaultButton(QMessageBox::No); confirm.setIcon(QMessageBox::Question); confirm.setWindowTitle(tr("Confirm Deletion")); confirm.setText(confirmDeleteString(rowId)); if (confirm.exec() == QMessageBox::Yes) { if(rowId > 0) { const auto selectedEntry = DB->getFlightEntry(rowId); if(!DB->remove(selectedEntry)) WARN(deleteErrorString(rowId)); } else { const auto selectedEntry = DB->getSimEntry(rowId * - 1); if(!DB->remove(selectedEntry)) WARN(deleteErrorString(rowId)); } } } // private implementations void LogbookTableEditWidget::viewSelectionChanged(SettingsWidget::SettingSignal widget) { for(auto i = m_defaultDelegates.constBegin(); i != m_defaultDelegates.constEnd(); i++) { m_view->setItemDelegateForColumn(i.key(), i.value()); // should probably delete the old custom delegate, Qt docs say the // view does not take ownership of the delegates so they might be leaking // https://doc.qt.io/qt-6/qabstractitemdelegate.html } if(widget == SettingsWidget::SettingSignal::LogbookWidget) setupModelAndView(); } void LogbookTableEditWidget::setupDelegates() { // minutes to hh:mm const auto timeDelegate = new StyledTimeDelegate(m_format, m_model); for(const auto col : OPL::LogbookViewInfo::getTimeColumns(m_logbookView)) { m_defaultDelegates.insert(col, m_view->itemDelegateForColumn(col)); m_view->setItemDelegateForColumn(col, timeDelegate); } // julian day to Date Format const int dateCol = OPL::LogbookViewInfo::getDateColumn(m_logbookView); const auto dateDelegate = new StyledDateDelegate(Settings::getDisplayFormat(), m_model); m_defaultDelegates.insert(dateCol, m_view->itemDelegateForColumn(dateCol)); m_view->setItemDelegateForColumn(dateCol, dateDelegate); // pilot_id to names const int pilCol = OPL::LogbookViewInfo::getPicColumn(m_logbookView); const auto pilotDelegate = new StyledPilotDelegate(m_model); m_defaultDelegates.insert(pilCol, m_view->itemDelegateForColumn(pilCol)); m_view->setItemDelegateForColumn(pilCol, pilotDelegate); // tail_id to aircraft type and registration const int typeCol = OPL::LogbookViewInfo::getTypeColumn(m_logbookView); const auto typeDelegate = new StyledTypeDelegate(m_model); m_defaultDelegates.insert(typeCol, m_view->itemDelegateForColumn(typeCol)); m_view->setItemDelegateForColumn(typeCol, typeDelegate); }