logbooktableeditwidget.cpp 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. #include "logbooktableeditwidget.h"
  2. #include "src/classes/settings.h"
  3. #include "src/classes/styleddatedelegate.h"
  4. #include "src/classes/styledpilotdelegate.h"
  5. #include "src/classes/styledtimedelegate.h"
  6. #include "src/classes/styledtypedelegate.h"
  7. #include "src/database/database.h"
  8. #include "src/database/views/logbookviewinfo.h"
  9. #include "src/gui/dialogues/newflightdialog.h"
  10. #include "src/gui/dialogues/newsimdialog.h"
  11. LogbookTableEditWidget::LogbookTableEditWidget(QWidget *parent)
  12. : TableEditWidget(Vertical, parent)
  13. {}
  14. // TableEditWidget implementation
  15. void LogbookTableEditWidget::setupModelAndView()
  16. {
  17. m_logbookView = Settings::getLogbookView();
  18. m_model = new QSqlTableModel(this, DB->database());
  19. m_model->setTable(OPL::GLOBALS->getViewIdentifier(m_logbookView));
  20. m_model->select();
  21. const auto headers = OPL::LogbookViewInfo::getTableHeaders(m_logbookView);
  22. for(int i = 0; i < headers.size(); i++) {
  23. m_model->setHeaderData(i, Qt::Horizontal, headers[i]);
  24. }
  25. m_view->setModel(m_model);
  26. m_view->setSelectionMode(QAbstractItemView::SingleSelection);
  27. m_view->setSelectionBehavior(QAbstractItemView::SelectRows);
  28. m_view->setEditTriggers(QAbstractItemView::NoEditTriggers);
  29. m_view->horizontalHeader()->setStretchLastSection(QHeaderView::Stretch);
  30. m_view->verticalHeader()->hide();
  31. m_view->setAlternatingRowColors(true);
  32. m_view->hideColumn(COL_ROWID);
  33. setupDelegates();
  34. m_view->resizeColumnsToContents();
  35. }
  36. void LogbookTableEditWidget::setupUI()
  37. {
  38. TableEditWidget::setupUI();
  39. m_addNewEntryPushButton->setText(tr("Add new Flight"));
  40. m_deleteEntryPushButton->setText(tr("Delete selected Entry"));
  41. m_filterWidget->hide();
  42. m_stackedWidget->hide();
  43. m_format = Settings::getDisplayFormat();
  44. }
  45. QString LogbookTableEditWidget::deleteErrorString(int rowId)
  46. {
  47. return tr("<br>Unable to delete.<br><br>The following error has ocurred: %1"
  48. ).arg(DB->lastError.text());
  49. }
  50. QString LogbookTableEditWidget::confirmDeleteString(int rowId)
  51. {
  52. if(rowId > 0) {
  53. const auto selectedEntry = DB->getFlightEntry(rowId);
  54. return tr("The following flight will be deleted:<br><br><b><tt>"
  55. "%1<br></b></tt><br><br>"
  56. "Deleting flights is irreversible.<br>Do you want to proceed?"
  57. ).arg(selectedEntry.getFlightSummary());
  58. }
  59. return tr("Deleting entries is irreversible.<br>Do you want to proceed?");
  60. }
  61. EntryEditDialog *LogbookTableEditWidget::getEntryEditDialog(QWidget *parent)
  62. {
  63. return new NewFlightDialog(parent);
  64. }
  65. void LogbookTableEditWidget::filterTextChanged(const QString &filterString)
  66. {}
  67. void LogbookTableEditWidget::addEntryRequested()
  68. {
  69. // close open edit dialog(s), if present
  70. if(m_stackedWidget->count() > 2) {
  71. while (m_stackedWidget->count() > 2) {
  72. m_stackedWidget->removeWidget(m_stackedWidget->widget(2));
  73. }
  74. }
  75. auto nfd = NewFlightDialog(this);
  76. nfd.exec();
  77. }
  78. void LogbookTableEditWidget::editEntryRequested(const QModelIndex &selectedIndex)
  79. {
  80. m_stackedWidget->show();
  81. const auto idx = m_view->selectionModel()->currentIndex();
  82. const auto rowId = m_model->index(idx.row(), 0).data().toInt();
  83. if(rowId > 0) {
  84. auto nfd = NewFlightDialog(rowId, this);
  85. m_stackedWidget->addWidget(&nfd);
  86. m_stackedWidget->setCurrentWidget(&nfd);
  87. nfd.exec();
  88. } else {
  89. auto nsd = NewSimDialog(rowId * -1, this);
  90. m_stackedWidget->addWidget(&nsd);
  91. m_stackedWidget->setCurrentWidget(&nsd);
  92. nsd.exec();
  93. }
  94. m_stackedWidget->hide();
  95. }
  96. void LogbookTableEditWidget::deleteEntryRequested()
  97. {
  98. const QModelIndex selectedIndex = m_view->selectionModel()->currentIndex();
  99. if(!selectedIndex.isValid()) {
  100. WARN(tr("No entry selected."));
  101. return;
  102. }
  103. m_stackedWidget->hide();
  104. int rowId = m_model->index(selectedIndex.row(), 0).data().toInt();
  105. m_view->selectionModel()->reset();
  106. // get user confirmation
  107. QMessageBox confirm(this);
  108. confirm.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
  109. confirm.setDefaultButton(QMessageBox::No);
  110. confirm.setIcon(QMessageBox::Question);
  111. confirm.setWindowTitle(tr("Confirm Deletion"));
  112. confirm.setText(confirmDeleteString(rowId));
  113. if (confirm.exec() == QMessageBox::Yes) {
  114. if(rowId > 0) {
  115. const auto selectedEntry = DB->getFlightEntry(rowId);
  116. if(!DB->remove(selectedEntry))
  117. WARN(deleteErrorString(rowId));
  118. } else {
  119. const auto selectedEntry = DB->getSimEntry(rowId * - 1);
  120. if(!DB->remove(selectedEntry))
  121. WARN(deleteErrorString(rowId));
  122. }
  123. }
  124. }
  125. // private implementations
  126. void LogbookTableEditWidget::viewSelectionChanged(SettingsWidget::SettingSignal widget)
  127. {
  128. for(auto i = m_defaultDelegates.constBegin(); i != m_defaultDelegates.constEnd(); i++) {
  129. m_view->setItemDelegateForColumn(i.key(), i.value());
  130. // should probably delete the old custom delegate, Qt docs say the
  131. // view does not take ownership of the delegates so they might be leaking
  132. // https://doc.qt.io/qt-6/qabstractitemdelegate.html
  133. }
  134. if(widget == SettingsWidget::SettingSignal::LogbookWidget)
  135. setupModelAndView();
  136. }
  137. void LogbookTableEditWidget::setupDelegates()
  138. {
  139. // minutes to hh:mm
  140. const auto timeDelegate = new StyledTimeDelegate(m_format, m_model);
  141. for(const auto col : OPL::LogbookViewInfo::getTimeColumns(m_logbookView)) {
  142. m_defaultDelegates.insert(col, m_view->itemDelegateForColumn(col));
  143. m_view->setItemDelegateForColumn(col, timeDelegate);
  144. }
  145. // julian day to Date Format
  146. const int dateCol = OPL::LogbookViewInfo::getDateColumn(m_logbookView);
  147. const auto dateDelegate = new StyledDateDelegate(Settings::getDisplayFormat(), m_model);
  148. m_defaultDelegates.insert(dateCol, m_view->itemDelegateForColumn(dateCol));
  149. m_view->setItemDelegateForColumn(dateCol, dateDelegate);
  150. // pilot_id to names
  151. const int pilCol = OPL::LogbookViewInfo::getPicColumn(m_logbookView);
  152. const auto pilotDelegate = new StyledPilotDelegate(m_model);
  153. m_defaultDelegates.insert(pilCol, m_view->itemDelegateForColumn(pilCol));
  154. m_view->setItemDelegateForColumn(pilCol, pilotDelegate);
  155. // tail_id to aircraft type and registration
  156. const int typeCol = OPL::LogbookViewInfo::getTypeColumn(m_logbookView);
  157. const auto typeDelegate = new StyledTypeDelegate(m_model);
  158. m_defaultDelegates.insert(typeCol, m_view->itemDelegateForColumn(typeCol));
  159. m_view->setItemDelegateForColumn(typeCol, typeDelegate);
  160. }