logbookwidget.cpp 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. /*
  2. *openPilot Log - A FOSS Pilot Logbook Application
  3. *Copyright (C) 2020 Felix Turowsky
  4. *
  5. *This program is free software: you can redistribute it and/or modify
  6. *it under the terms of the GNU General Public License as published by
  7. *the Free Software Foundation, either version 3 of the License, or
  8. *(at your option) any later version.
  9. *
  10. *This program is distributed in the hope that it will be useful,
  11. *but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. *GNU General Public License for more details.
  14. *
  15. *You should have received a copy of the GNU General Public License
  16. *along with this program. If not, see <https://www.gnu.org/licenses/>.
  17. */
  18. #include "logbookwidget.h"
  19. #include "ui_logbookwidget.h"
  20. #include "src/functions/adebug.h"
  21. LogbookWidget::LogbookWidget(QWidget *parent) :
  22. QWidget(parent),
  23. ui(new Ui::LogbookWidget)
  24. {
  25. ui->setupUi(this);
  26. ui->filterDateEdit->setDate(QDate::currentDate());
  27. ui->filterDateEdit_2->setDate(QDate::currentDate());
  28. ui->newFlightButton->setFocus();
  29. //customContextMenu for tablewidget
  30. menu = new QMenu(this);
  31. menu->addAction(ui->actionEdit_Flight);
  32. menu->addAction(ui->actionDelete_Flight);
  33. //message Box
  34. nope = new QMessageBox(this);
  35. refreshView(ASettings::read("logbook/view").toInt());
  36. }
  37. LogbookWidget::~LogbookWidget()
  38. {
  39. delete ui;
  40. }
  41. /*
  42. * Functions
  43. */
  44. void LogbookWidget::refreshView(int view_id)
  45. {
  46. switch (view_id) {
  47. case 0:
  48. defaultView();
  49. break;
  50. case 1:
  51. easaView();
  52. break;
  53. default:
  54. defaultView();
  55. }
  56. QTableView *view = ui->tableView;
  57. view->setSelectionBehavior(QAbstractItemView::SelectRows);
  58. view->setSelectionMode(QAbstractItemView::ExtendedSelection);
  59. view->setEditTriggers(QAbstractItemView::NoEditTriggers);
  60. view->setContextMenuPolicy(Qt::CustomContextMenu);
  61. view->horizontalHeader()->setStretchLastSection(QHeaderView::Stretch);
  62. view->verticalHeader()->hide();
  63. view->setAlternatingRowColors(true);
  64. view->hideColumn(0);
  65. connect(ui->tableView->selectionModel(), SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)),
  66. this, SLOT(tableView_selectionChanged()));
  67. }
  68. void LogbookWidget::defaultView()
  69. {
  70. DEB("Loading Default View...");
  71. QSqlTableModel *model = new QSqlTableModel;
  72. model->setTable("viewDefault");
  73. model->select();
  74. QTableView *view = ui->tableView;
  75. view->setModel(model);
  76. view->setColumnWidth(1, 120);
  77. view->setColumnWidth(2, 60);
  78. view->setColumnWidth(3, 60);
  79. view->setColumnWidth(4, 60);
  80. view->setColumnWidth(5, 60);
  81. view->setColumnWidth(6, 60);
  82. view->setColumnWidth(7, 180);
  83. view->setColumnWidth(8, 180);
  84. view->setColumnWidth(9, 120);
  85. view->setColumnWidth(10, 90);
  86. view->show();
  87. }
  88. void LogbookWidget::easaView()
  89. {
  90. DEB("Loading EASA View...");
  91. QSqlTableModel *model = new QSqlTableModel;
  92. model->setTable("viewEASA");
  93. model->select();
  94. QTableView *view = ui->tableView;
  95. view->setModel(model);
  96. view->setColumnWidth(1,120);
  97. view->setColumnWidth(2,60);
  98. view->setColumnWidth(3,60);
  99. view->setColumnWidth(4,60);
  100. view->setColumnWidth(5,60);
  101. view->setColumnWidth(6,180);
  102. view->setColumnWidth(7,120);
  103. view->setColumnWidth(8,30);
  104. view->setColumnWidth(9,30);
  105. view->setColumnWidth(10,30);
  106. view->setColumnWidth(11,30);
  107. view->setColumnWidth(12,120);
  108. view->setColumnWidth(13,15);
  109. view->setColumnWidth(14,15);
  110. view->setColumnWidth(15,60);
  111. view->setColumnWidth(16,60);
  112. view->setColumnWidth(17,60);
  113. view->setColumnWidth(18,60);
  114. view->setColumnWidth(19,60);
  115. view->setColumnWidth(20,60);
  116. view->setColumnWidth(21,120);
  117. view->show();
  118. }
  119. /*
  120. * Slots
  121. */
  122. void LogbookWidget::tableView_selectionChanged()//
  123. {
  124. auto *selection = ui->tableView->selectionModel();
  125. selectedFlights.clear();
  126. for (const auto& row : selection->selectedRows()) {
  127. selectedFlights << row.data().toInt();
  128. DEB("Selected Flight(s) with ID: " << selectedFlights);
  129. }
  130. }
  131. void LogbookWidget::on_newFlightButton_clicked()
  132. {
  133. auto nf = new NewFlightDialog(this, Db::createNew);
  134. nf->setAttribute(Qt::WA_DeleteOnClose);
  135. nf->exec();
  136. refreshView(ASettings::read("logbook/view").toInt());
  137. }
  138. void LogbookWidget::on_editFlightButton_clicked()
  139. {
  140. if(selectedFlights.length() == 1){
  141. auto ef = new NewFlightDialog(this,Flight(selectedFlights.first()), Db::editExisting);
  142. ef->setAttribute(Qt::WA_DeleteOnClose);
  143. ef->exec();
  144. refreshView(ASettings::read("logbook/view").toInt());
  145. } else if (selectedFlights.isEmpty()) {
  146. nope->setText("No flight selected.\n");
  147. nope->exec();
  148. } else {
  149. nope->setText("More than one flight selected.\n\nEditing multiple entries is not yet supported.");
  150. nope->exec();
  151. }
  152. }
  153. void LogbookWidget::on_deleteFlightPushButton_clicked()
  154. {
  155. DEB("Flights selected: " << selectedFlights.length());
  156. if (selectedFlights.length() > 0 && selectedFlights.length() < 11) {
  157. QVector<QString> columns = {
  158. "doft", "dept", "dest"
  159. };
  160. QVector<QString> details;
  161. QString warningMsg = "The following flight(s) will be deleted:<br><br><b><tt>";
  162. for(const auto& selectedFlight : selectedFlights){
  163. details = Db::multiSelect(columns, "flights", "flight_id",
  164. QString::number(selectedFlight), Db::exactMatch);
  165. for (const auto &item : details) {
  166. warningMsg.append(item);
  167. warningMsg.append(' ');
  168. }
  169. warningMsg.append("<br>");
  170. }
  171. warningMsg.append("</b></tt><br>Deleting Flights is irreversible."
  172. "<br>Do you want to proceed?");
  173. QMessageBox confirm;
  174. confirm.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
  175. confirm.setDefaultButton(QMessageBox::No);
  176. confirm.setIcon(QMessageBox::Question);
  177. confirm.setWindowTitle("Delete Flight");
  178. confirm.setText(warningMsg);
  179. int reply = confirm.exec();
  180. if (reply == QMessageBox::Yes) {
  181. for (const auto& selectedFlight : selectedFlights) {
  182. DEB("Deleting flight with ID# " << selectedFlight);
  183. auto entry = Flight(selectedFlight);
  184. entry.remove();
  185. }
  186. refreshView(ASettings::read("logbook/view").toInt());
  187. }
  188. } else if (selectedFlights.length() == 0) {
  189. nope->setIcon(QMessageBox::Information);
  190. nope->setText("No Flight Selected.");
  191. nope->exec();
  192. } else if (selectedFlights.length() > 10) {
  193. auto& warningMsg = "You have selected " + QString::number(selectedFlights.length())
  194. + " flights.\n\n Deleting these flights is irreversible.\n\n"
  195. "Are you sure you want to proceed?";
  196. QMessageBox confirm;
  197. confirm.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
  198. confirm.setDefaultButton(QMessageBox::No);
  199. confirm.setIcon(QMessageBox::Warning);
  200. confirm.setWindowTitle("Delete Flight");
  201. confirm.setText(warningMsg);
  202. int reply = confirm.exec();
  203. if(reply == QMessageBox::Yes) {
  204. for (const auto& selectedFlight : selectedFlights) {
  205. DEB("Deleting flight with ID# " << selectedFlight);
  206. auto entry = Flight(selectedFlight);
  207. entry.remove();
  208. }
  209. refreshView(ASettings::read("logbook/view").toInt());
  210. }
  211. }
  212. }
  213. void LogbookWidget::on_filterFlightsByDateButton_clicked()
  214. {
  215. QDate date(ui->filterDateEdit->date());
  216. QString startdate = date.toString("yyyy-MM-dd");
  217. date = ui->filterDateEdit_2->date();
  218. QString enddate = date.toString("yyyy-MM-dd");
  219. QString datefilter = "Date BETWEEN '" + startdate + "' AND '" + enddate + QLatin1Char('\'');
  220. QSqlTableModel *DateFilteredModel = new QSqlTableModel;
  221. DateFilteredModel ->setTable("Logbook");
  222. DateFilteredModel ->setFilter(datefilter);
  223. DateFilteredModel->select();
  224. ui->tableView->setModel(DateFilteredModel);
  225. }
  226. void LogbookWidget::on_showAllButton_clicked()
  227. {
  228. refreshView(ASettings::read("logbook/view").toInt());
  229. }
  230. void LogbookWidget::on_tableView_customContextMenuRequested(const QPoint &pos)
  231. {
  232. menu->popup(ui->tableView->viewport()->mapToGlobal(pos));
  233. }
  234. void LogbookWidget::on_actionDelete_Flight_triggered()
  235. {
  236. emit ui->deleteFlightPushButton->clicked();
  237. }
  238. void LogbookWidget::on_actionEdit_Flight_triggered()
  239. {
  240. emit ui->editFlightButton->clicked();
  241. }
  242. void LogbookWidget::on_tableView_doubleClicked()
  243. {
  244. emit ui->editFlightButton->clicked();
  245. }