logbooktableeditwidget.cpp 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  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. showEditWidget();
  76. auto nfd = NewFlightDialog(this);
  77. m_stackedWidget->addWidget(&nfd);
  78. m_stackedWidget->setCurrentWidget(&nfd);
  79. nfd.exec();
  80. hideEditWidget();
  81. // auto nfd = NewFlightDialog(this);
  82. // nfd.exec();
  83. }
  84. void LogbookTableEditWidget::editEntryRequested(const QModelIndex &selectedIndex)
  85. {
  86. showEditWidget();
  87. const auto idx = m_view->selectionModel()->currentIndex();
  88. const auto rowId = m_model->index(idx.row(), 0).data().toInt();
  89. if(rowId > 0) {
  90. auto nfd = NewFlightDialog(rowId, this);
  91. m_stackedWidget->addWidget(&nfd);
  92. m_stackedWidget->setCurrentWidget(&nfd);
  93. nfd.exec();
  94. } else {
  95. auto nsd = NewSimDialog(rowId * -1, this);
  96. m_stackedWidget->addWidget(&nsd);
  97. m_stackedWidget->setCurrentWidget(&nsd);
  98. nsd.exec();
  99. }
  100. hideEditWidget();
  101. }
  102. void LogbookTableEditWidget::deleteEntryRequested()
  103. {
  104. const QModelIndex selectedIndex = m_view->selectionModel()->currentIndex();
  105. if(!selectedIndex.isValid()) {
  106. WARN(tr("No entry selected."));
  107. return;
  108. }
  109. m_stackedWidget->hide();
  110. int rowId = m_model->index(selectedIndex.row(), 0).data().toInt();
  111. m_view->selectionModel()->reset();
  112. // get user confirmation
  113. QMessageBox confirm(this);
  114. confirm.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
  115. confirm.setDefaultButton(QMessageBox::No);
  116. confirm.setIcon(QMessageBox::Question);
  117. confirm.setWindowTitle(tr("Confirm Deletion"));
  118. confirm.setText(confirmDeleteString(rowId));
  119. if (confirm.exec() == QMessageBox::Yes) {
  120. if(rowId > 0) {
  121. const auto selectedEntry = DB->getFlightEntry(rowId);
  122. if(!DB->remove(selectedEntry))
  123. WARN(deleteErrorString(rowId));
  124. } else {
  125. const auto selectedEntry = DB->getSimEntry(rowId * - 1);
  126. if(!DB->remove(selectedEntry))
  127. WARN(deleteErrorString(rowId));
  128. }
  129. }
  130. }
  131. // private implementations
  132. void LogbookTableEditWidget::viewSelectionChanged(SettingsWidget::SettingSignal widget)
  133. {
  134. for(auto i = m_defaultDelegates.constBegin(); i != m_defaultDelegates.constEnd(); i++) {
  135. m_view->setItemDelegateForColumn(i.key(), i.value());
  136. // should probably delete the old custom delegate, Qt docs say the
  137. // view does not take ownership of the delegates so they might be leaking
  138. // https://doc.qt.io/qt-6/qabstractitemdelegate.html
  139. }
  140. if(widget == SettingsWidget::SettingSignal::LogbookWidget)
  141. setupModelAndView();
  142. }
  143. void LogbookTableEditWidget::setupDelegates()
  144. {
  145. // minutes to hh:mm
  146. const auto timeDelegate = new StyledTimeDelegate(m_format, m_model);
  147. for(const auto col : OPL::LogbookViewInfo::getTimeColumns(m_logbookView)) {
  148. m_defaultDelegates.insert(col, m_view->itemDelegateForColumn(col));
  149. m_view->setItemDelegateForColumn(col, timeDelegate);
  150. }
  151. // julian day to Date Format
  152. const int dateCol = OPL::LogbookViewInfo::getDateColumn(m_logbookView);
  153. const auto dateDelegate = new StyledDateDelegate(Settings::getDisplayFormat(), m_model);
  154. m_defaultDelegates.insert(dateCol, m_view->itemDelegateForColumn(dateCol));
  155. m_view->setItemDelegateForColumn(dateCol, dateDelegate);
  156. // pilot_id to names
  157. const int pilCol = OPL::LogbookViewInfo::getPicColumn(m_logbookView);
  158. const auto pilotDelegate = new StyledPilotDelegate(m_model);
  159. m_defaultDelegates.insert(pilCol, m_view->itemDelegateForColumn(pilCol));
  160. m_view->setItemDelegateForColumn(pilCol, pilotDelegate);
  161. // tail_id to aircraft type and registration
  162. const int typeCol = OPL::LogbookViewInfo::getTypeColumn(m_logbookView);
  163. const auto typeDelegate = new StyledTypeDelegate(m_model);
  164. m_defaultDelegates.insert(typeCol, m_view->itemDelegateForColumn(typeCol));
  165. m_view->setItemDelegateForColumn(typeCol, typeDelegate);
  166. }