Selaa lähdekoodia

Tweaked widgets

Various tweaks in the widgets.

- Fixed a bug that was showing a stray line edit in the pilotsWidget.
- Cleared up and refactored construction and refreshing of model and view in PilotsWidget and AircraftWidget
- Migrated Signals and Slots to new QObject::connect() syntax.
- Unified memory management, ensured changing selections without editing does not spawn infinite dialogs.
Felix Turo 4 vuotta sitten
vanhempi
commit
bc78383773

+ 3 - 2
mainwindow.ui

@@ -17,8 +17,9 @@
    <layout class="QGridLayout" name="gridLayout">
     <item row="0" column="0">
      <widget class="QStackedWidget" name="stackedWidget">
-      <widget class="QWidget" name="page"/>
-      <widget class="QWidget" name="page_2"/>
+      <property name="currentIndex">
+       <number>-1</number>
+      </property>
      </widget>
     </item>
    </layout>

+ 39 - 23
src/gui/widgets/aircraftwidget.cpp

@@ -28,8 +28,10 @@ AircraftWidget::AircraftWidget(QWidget *parent) :
 {
     DEB("New AircraftWidet");
     ui->setupUi(this);
-    sortColumn = ASettings::read("userdata/acSortColumn").toInt();
-    refreshModelAndView();
+    ui->stackedWidget->addWidget(this->findChild<QWidget*>("welcomePageTails"));
+    ui->stackedWidget->setCurrentWidget(this->findChild<QWidget*>("welcomePageTails"));
+
+    setupModelAndView();
 }
 
 AircraftWidget::~AircraftWidget()
@@ -42,16 +44,17 @@ AircraftWidget::~AircraftWidget()
  * Functions
  */
 
-void AircraftWidget::refreshModelAndView()
+void AircraftWidget::setupModelAndView()
 {
-    ui->stackedWidget->addWidget(parent()->findChild<QWidget*>("welcomePageTails"));
-    ui->stackedWidget->setCurrentWidget(parent()->findChild<QWidget*>("welcomePageTails"));
+    sortColumn = ASettings::read("userdata/acSortColumn").toInt();
 
+    model = new QSqlTableModel(this);
     model->setTable("viewTails");
     model->select();
 
-    QTableView *view = ui->tableView;
+    view = ui->tableView;
     view->setModel(model);
+
     view->setSelectionBehavior(QAbstractItemView::SelectRows);
     view->setSelectionMode(QAbstractItemView::SingleSelection);
     view->setEditTriggers(QAbstractItemView::NoEditTriggers);
@@ -66,10 +69,10 @@ void AircraftWidget::refreshModelAndView()
 
     view->show();
 
-    connect(ui->tableView->selectionModel(), SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)),
-            this, SLOT(tableView_selectionChanged()));
-    connect(ui->tableView->horizontalHeader(), SIGNAL(sectionClicked(int)),
-            this, SLOT(tableView_headerClicked(int)));
+    QObject::connect(ui->tableView->selectionModel(), &QItemSelectionModel::selectionChanged,
+                     this, &AircraftWidget::tableView_selectionChanged);
+    QObject::connect(ui->tableView->horizontalHeader(), &QHeaderView::sectionClicked,
+                     this, &AircraftWidget::tableView_headerClicked);
 }
 
 /*
@@ -116,7 +119,7 @@ void AircraftWidget::on_deleteButton_clicked()
                 }
             }
         }
-        refreshModelAndView();
+        model->select();
     } else {
         auto mb = QMessageBox(this);
         mb.setText("No aircraft selected.");
@@ -132,16 +135,26 @@ void AircraftWidget::on_newButton_clicked()
     nt.exec();
 }
 
-void AircraftWidget::on_searchLineEdit_textChanged(const QString &arg1)
+void AircraftWidget::on_aircraftSearchLineEdit_textChanged(const QString &arg1)
 {
-    if(ui->searchComboBox->currentIndex() == 0){
-        ui->searchLineEdit->setText(arg1.toUpper());
+    if(ui->aircraftSearchComboBox->currentIndex() == 0){
+        ui->aircraftSearchLineEdit->setText(arg1.toUpper());
     }
-    model->setFilter(ui->searchComboBox->currentText() + " LIKE \"%" + arg1 + "%\"");
+    model->setFilter(ui->aircraftSearchComboBox->currentText() + " LIKE \"%" + arg1 + "%\"");
 }
 
 void AircraftWidget::tableView_selectionChanged()
 {
+    if (this->findChild<NewTailDialog*>() != nullptr) {
+        DEB("Selection changed. Deleting orphaned dialog.");
+        delete this->findChild<NewTailDialog*>();
+        /// [F] if the user changes the selection without making any changes,
+        /// if(selectedTails.length() == 1) spawns a new dialog without the
+        /// old one being deleted, since neither accept() nor reject() was emitted.
+        /// Is this a reasonable way of avoiding pollution? Creating the widgets on the
+        /// stack does not seem to solve the problem since the Dialog does not get destroyed
+        /// until either accept() or reject() is emitted so I went for this solution.
+    }
     auto *selection = ui->tableView->selectionModel();
     selectedTails.clear();
 
@@ -150,13 +163,16 @@ void AircraftWidget::tableView_selectionChanged()
         DEB("Selected Tails(s) with ID: " << selectedTails);
     }
     if(selectedTails.length() == 1) {
-        auto nt = NewTailDialog(selectedTails.first(), this);
-        connect(&nt, SIGNAL(accepted()), this, SLOT(acft_editing_finished()));
-        connect(&nt, SIGNAL(rejected()), this, SLOT(acft_editing_finished()));
-        ui->stackedWidget->addWidget(&nt);
-        ui->stackedWidget->setCurrentWidget(&nt);
-        nt.setWindowFlag(Qt::Widget);
-        nt.exec();
+        auto* nt = new NewTailDialog(selectedTails.first(), this);
+        QObject::connect(nt,   &QDialog::accepted,
+                         this, &AircraftWidget::acft_editing_finished);
+        QObject::connect(nt,   &QDialog::rejected,
+                         this, &AircraftWidget::acft_editing_finished);
+        ui->stackedWidget->addWidget(nt);
+        ui->stackedWidget->setCurrentWidget(nt);
+        nt->setWindowFlag(Qt::Widget);
+        nt->setAttribute(Qt::WA_DeleteOnClose);
+        nt->exec();
     }
 }
 
@@ -168,5 +184,5 @@ void AircraftWidget::tableView_headerClicked(int column)
 
 void AircraftWidget::acft_editing_finished()
 {
-    refreshModelAndView();
+    model->select();
 }

+ 6 - 5
src/gui/widgets/aircraftwidget.h

@@ -22,8 +22,7 @@
 #include <QItemSelection>
 #include <QSqlTableModel>
 #include <QDebug>
-#include <QLabel>
-#include <QHBoxLayout>
+#include <QTableView>
 
 #include "src/classes/asettings.h"
 #include "src/gui/dialogues/newtaildialog.h"
@@ -54,18 +53,20 @@ private slots:
 
     void acft_editing_finished();
 
-    void on_searchLineEdit_textChanged(const QString &arg1);
+    void on_aircraftSearchLineEdit_textChanged(const QString &arg1);
 
 private:
     Ui::AircraftWidget *ui;
 
-    QSqlTableModel *model = new QSqlTableModel;
+    QSqlTableModel *model;
+
+    QTableView *view;
 
     qint32 sortColumn;
 
     QVector<qint32> selectedTails;
 
-    void refreshModelAndView();
+    void setupModelAndView();
 };
 
 #endif // AIRCRAFTWIDGET_H

+ 2 - 2
src/gui/widgets/aircraftwidget.ui

@@ -76,7 +76,7 @@
             </widget>
            </item>
            <item row="0" column="1">
-            <widget class="QLineEdit" name="searchLineEdit"/>
+            <widget class="QLineEdit" name="aircraftSearchLineEdit"/>
            </item>
            <item row="1" column="0">
             <widget class="QLabel" name="label_2">
@@ -86,7 +86,7 @@
             </widget>
            </item>
            <item row="1" column="1">
-            <widget class="QComboBox" name="searchComboBox">
+            <widget class="QComboBox" name="aircraftSearchComboBox">
              <item>
               <property name="text">
                <string>Registration</string>

+ 28 - 2
src/gui/widgets/debugwidget.cpp

@@ -169,7 +169,6 @@ void DebugWidget::on_debugPushButton_clicked()
     long time2 = 0;
     using namespace experimental;
     {
-
         ATimer timer;
         for (int i = 0; i < number_of_runs; i++) {
             // first block, do stuff here...
@@ -186,6 +185,33 @@ void DebugWidget::on_debugPushButton_clicked()
         }
         time2 = timer.timeNow();
     }
-    DEB("First block executed " << number_of_runs << " times for a total of " << time1 << " milliseconds.");
+
+    DEB("First block executed  " << number_of_runs << " times for a total of " << time1 << " milliseconds.");
     DEB("Second block executed " << number_of_runs << " times for a total of " << time2 << " milliseconds.");
 }
+
+/*
+    qlonglong number_of_runs = 5000;
+    long time1 = 0;
+    long time2 = 0;
+    using namespace experimental;
+    {
+
+        ATimer timer;
+        for (int i = 0; i < number_of_runs; i++) {
+            // first block, do stuff here...
+        }
+
+        time1 = timer.timeNow();
+    }
+    {
+        ATimer timer;
+        for (int i = 0; i < number_of_runs; i++) {
+            // second block, do stuff here...
+        }
+        time2 = timer.timeNow();
+    }
+
+    DEB("First block executed " << number_of_runs << " times for a total of " << time1 << " milliseconds.");
+    DEB("Second block executed " << number_of_runs << " times for a total of " << time2 << " milliseconds.");
+*/

+ 24 - 27
src/gui/widgets/pilotswidget.cpp

@@ -25,15 +25,8 @@ PilotsWidget::PilotsWidget(QWidget *parent) :
     ui(new Ui::PilotsWidget)
 {
     ui->setupUi(this);
-    sortColumn = ASettings::read("userdata/pilSortColumn").toInt();
 
     setupModelAndView();
-    refreshModelAndView();
-
-    QObject::connect(ui->tableView->selectionModel(), &QItemSelectionModel::selectionChanged,
-                     this, &PilotsWidget::tableView_selectionChanged);
-    QObject::connect(ui->tableView->horizontalHeader(), &QHeaderView::sectionClicked,
-                     this, &PilotsWidget::tableView_headerClicked);
 }
 
 PilotsWidget::~PilotsWidget()
@@ -43,11 +36,14 @@ PilotsWidget::~PilotsWidget()
 
 void PilotsWidget::setupModelAndView()
 {
+    sortColumn = ASettings::read("userdata/pilSortColumn").toInt();
+
+    model = new QSqlTableModel(this);
     model->setTable("viewPilots");
     model->setFilter("ID > 1");//to not allow editing of self, shall be done via settings
     model->select();
 
-    view = ui->tableView;
+    view = ui->pilotsTableView;
     view->setModel(model);
     view->setSelectionBehavior(QAbstractItemView::SelectRows);
     view->setSelectionMode(QAbstractItemView::SingleSelection);
@@ -60,31 +56,31 @@ void PilotsWidget::setupModelAndView()
     view->setAlternatingRowColors(true);
     view->setSortingEnabled(true);
     view->sortByColumn(sortColumn, Qt::AscendingOrder);
-}
 
-void PilotsWidget::refreshModelAndView()
-{
-    ui->stackedWidget->setCurrentWidget(this->findChild<QWidget*>("welcomePage"));
-    model->select();
-    view->show();
+    QObject::connect(ui->pilotsTableView->selectionModel(), &QItemSelectionModel::selectionChanged,
+                     this, &PilotsWidget::tableView_selectionChanged);
+    QObject::connect(ui->pilotsTableView->horizontalHeader(), &QHeaderView::sectionClicked,
+                     this, &PilotsWidget::tableView_headerClicked);
 }
 
-void PilotsWidget::on_searchLineEdit_textChanged(const QString &arg1)
+void PilotsWidget::on_pilotSearchLineEdit_textChanged(const QString &arg1)
 {
-    model->setFilter("\"" + ui->searchComboBox->currentText() + "\" LIKE \"%" + arg1 + "%\" AND ID > 1");
+    model->setFilter("\"" + ui->pilotsSearchComboBox->currentText() + "\" LIKE \"%" + arg1 + "%\" AND ID > 1");
 }
 
 void PilotsWidget::tableView_selectionChanged()//const QItemSelection &index, const QItemSelection &
-{   
-    if (this->findChild<NewPilotDialog*>("NewPilot") != nullptr) {
+{
+    if (this->findChild<NewPilotDialog*>() != nullptr) {
         DEB("Selection changed. Deleting orphaned dialog.");
         delete this->findChild<NewPilotDialog*>();
         /// [F] if the user changes the selection without making any changes,
         /// if(selectedPilots.length() == 1) spawns a new dialog without the
         /// old one being deleted, since neither accept() nor reject() was emitted.
-        /// Is this a reasonable way of avoiding pollution?
+        /// Is this a reasonable way of avoiding pollution? Creating the widgets on the
+        /// stack does not seem to solve the problem since the Dialog does not get deleted
+        /// until either accept() or reject() is emitted so I went for this solution.
     }
-    auto *selection = ui->tableView->selectionModel();
+    auto *selection = ui->pilotsTableView->selectionModel();
     selectedPilots.clear();
 
     for (const auto& row : selection->selectedRows()) {
@@ -94,7 +90,6 @@ void PilotsWidget::tableView_selectionChanged()//const QItemSelection &index, co
     if(selectedPilots.length() == 1) {
 
         NewPilotDialog* np = new NewPilotDialog(selectedPilots.first(), this);
-        DEB("new dialog: " << np->objectName());
         QObject::connect(np, &QDialog::accepted,
                          this, &PilotsWidget::pilot_editing_finished);
         QObject::connect(np, &QDialog::rejected,
@@ -116,9 +111,11 @@ void PilotsWidget::tableView_headerClicked(int column)
 void PilotsWidget::on_newButton_clicked()
 {
     NewPilotDialog* np = new NewPilotDialog(this);
+    QObject::connect(np,   &QDialog::accepted,
+                     this, &PilotsWidget::pilot_editing_finished);
+    QObject::connect(np,   &QDialog::rejected,
+                     this, &PilotsWidget::pilot_editing_finished);
     np->setAttribute(Qt::WA_DeleteOnClose);
-    connect(np, SIGNAL(accepted()), this, SLOT(pilot_editing_finished()));
-    connect(np, SIGNAL(rejected()), this, SLOT(pilot_editing_finished()));
     np->exec();
 }
 
@@ -139,14 +136,14 @@ void PilotsWidget::on_deletePushButton_clicked()
         /// for example, the user has changed airlines and does not want to have his 'old'
         /// colleagues polluting his logbook anymore.
         /// On the other hand we could run into issues with foreign key constraints on the
-        /// flights table (see on_delete_unsuccessful) below
+        /// flights table (see on_delete_unsuccessful) below.
+        /// I think batch-editing should be implemented at some point, but batch-deleting should not.
 
     } else if (selectedPilots.length() == 1) {
         auto entry = aDB()->getPilotEntry(selectedPilots.first());
         aDB()->remove(entry);
         }
-    refreshModelAndView();
-
+    model->select();
 }
 
 void PilotsWidget::on_deleteUnsuccessful()
@@ -183,5 +180,5 @@ void PilotsWidget::on_deleteUnsuccessful()
 
 void PilotsWidget::pilot_editing_finished()
 {
-    refreshModelAndView();
+    model->select();
 }

+ 3 - 5
src/gui/widgets/pilotswidget.h

@@ -53,22 +53,20 @@ private slots:
 
     void pilot_editing_finished();
 
-    void on_searchLineEdit_textChanged(const QString &arg1);
+    void on_pilotSearchLineEdit_textChanged(const QString &arg1);
 
 private:
     Ui::PilotsWidget *ui;
 
-    QSqlTableModel *model = new QSqlTableModel(this);
+    QSqlTableModel *model;
 
-    QTableView *view = new QTableView(this);
+    QTableView *view;
 
     qint32 sortColumn;
 
     QVector<qint32> selectedPilots;
 
     void setupModelAndView();
-
-    void refreshModelAndView();
 };
 
 #endif // PILOTSWIDGET_H

+ 9 - 9
src/gui/widgets/pilotswidget.ui

@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>1920</width>
-    <height>1080</height>
+    <width>1280</width>
+    <height>720</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -15,9 +15,9 @@
   </property>
   <layout class="QGridLayout" name="gridLayout">
    <item row="0" column="0">
-    <widget class="QTableView" name="tableView"/>
+    <widget class="QTableView" name="pilotsTableView"/>
    </item>
-   <item row="0" column="1">
+   <item row="0" column="1" rowspan="3">
     <layout class="QHBoxLayout" name="horizontalLayout">
      <item>
       <spacer name="horizontalSpacer">
@@ -53,7 +53,7 @@
           </spacer>
          </item>
          <item row="1" column="0">
-          <layout class="QGridLayout" name="gridLayout_2">
+          <layout class="QGridLayout" name="pilotsDiasogGridLayout">
            <item row="0" column="0">
             <widget class="QLabel" name="searchLabel">
              <property name="text">
@@ -62,7 +62,7 @@
             </widget>
            </item>
            <item row="0" column="1">
-            <widget class="QLineEdit" name="searchLineEdit"/>
+            <widget class="QLineEdit" name="pilotSearchLineEdit"/>
            </item>
            <item row="1" column="0">
             <widget class="QLabel" name="searchInLabel">
@@ -72,7 +72,7 @@
             </widget>
            </item>
            <item row="1" column="1">
-            <widget class="QComboBox" name="searchComboBox">
+            <widget class="QComboBox" name="pilotsSearchComboBox">
              <item>
               <property name="text">
                <string>Last Name</string>
@@ -139,14 +139,14 @@
     </layout>
    </item>
    <item row="1" column="0">
-    <widget class="QPushButton" name="newButton">
+    <widget class="QPushButton" name="newPilotPushButton">
      <property name="text">
       <string>New Pilot</string>
      </property>
     </widget>
    </item>
    <item row="2" column="0">
-    <widget class="QPushButton" name="deletePushButton">
+    <widget class="QPushButton" name="deletPilotButton">
      <property name="text">
       <string>Delete Pilot</string>
      </property>