Przeglądaj źródła

working on database API and newtail dialog

fiffty-50 4 lat temu
rodzic
commit
971cd0725d

+ 1 - 1
openPilotLog.pro.user

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE QtCreatorProject>
-<!-- Written by QtCreator 4.11.0, 2020-10-31T11:04:51. -->
+<!-- Written by QtCreator 4.11.0, 2020-10-31T21:02:50. -->
 <qtcreator>
  <data>
   <variable>EnvironmentId</variable>

+ 68 - 1
src/database/db.cpp

@@ -57,6 +57,39 @@ db::db(sql::tableName tn, int row_ID)
     }
 }
 
+db::db(sql::tableName tn, QMap<QString, QString> newData)
+{
+    switch (tn) {
+    case sql::flights:
+        table = "flights";
+        break;
+    case sql::pilots:
+        table = "pilots";
+        break;
+    case sql::aircraft:
+        table = "aircraft";
+        break;
+    case sql::tails:
+        table = "tails";
+        break;
+    case sql::airports:
+        table = "airports";
+        break;
+    }
+    //Do some checks
+    auto in = dbInfo();
+    auto columns = in.format.value(table);
+    QMap<QString,QString>::iterator i;
+    for (i = newData.begin(); i != newData.end(); ++i){
+        if(!columns.contains(i.key())){
+            DEB(newData);
+            DEB(i.key()<< i.value() << "Not in column list for " << table <<". Removing.");
+            newData.remove(i.key());
+        }
+    }
+    data = newData;
+}
+
 /*!
  * \brief db::connect connects to the database via the default connection.
  * Can then be accessed globally with QSqlDatabase::database("qt_sql_default_connection")
@@ -462,7 +495,6 @@ bool db::update()
 
     //execute query
     QSqlQuery q(statement);
-    DEB(statement);
     q.exec();
     //check result. Upon success, error should be " "
     QString error = q.lastError().text();
@@ -474,6 +506,41 @@ bool db::update()
     }
 }
 
+bool db::commit()
+{
+    //check prerequisites
+    if(row_id != 0){
+        DEB("Row ID already set. Unable to commit as new, try update() for existing entries: " << row_id);
+        return false;
+    }
+    if(data.isEmpty()){
+        DEB("Object Contains no data. Aborting.");
+        return false;
+    }
+    QString statement = "INSERT INTO " + table + QLatin1String(" (");
+    QMap<QString,QString>::iterator i;
+    for (i = data.begin(); i != data.end(); ++i){
+        statement += i.key() + QLatin1String(", ");
+    }
+    statement.chop(2);
+    statement += QLatin1String(") VALUES (");
+    for (i = data.begin(); i != data.end(); ++i){
+        statement += QLatin1String("'") + i.value() + QLatin1String("', ");
+    }
+    statement.chop(2);
+    statement += QLatin1String(")");
+
+    QSqlQuery q(statement);
+    QString error = q.lastError().text();
+    if(error.length() < 2){
+        DEB("Entry successfully committed.");
+        return true;
+    }else{
+        DEB("Unable to commit. Query Error: " << q.lastError().text());
+        return false;
+    }
+}
+
 
 //Debug
 void db::print()

+ 11 - 6
src/database/db.h

@@ -33,7 +33,7 @@ class sql
 {
 public:
     enum tableName {flights, pilots, tails, aircraft, airports };
-    enum queryType {select, update };
+    enum editRole {createNew, editExisting};
     enum matchType {exactMatch, partialMatch};
 };
 
@@ -41,20 +41,23 @@ public:
 class db
 {
 private:
-    QString table = QString();
-
-    int row_id = 0;
 
     bool retreiveData();
 
-    QMap<QString, QString> data;
-
 public:
 
     db(sql::tableName, int row_ID);
 
+    db(sql::tableName, QMap<QString, QString> newData);
+
     bool isValid = false;
 
+    QMap<QString, QString> data;
+
+    QString table = QString();
+
+    int row_id = 0;
+
     void setData(const QMap<QString, QString> &value);
 
     QMap<QString, QString> getData() const;
@@ -63,6 +66,8 @@ public:
 
     bool update();
 
+    bool commit();
+
     static void connect();
 
     static QVector<QString> getColumnNames(QString table);

+ 93 - 1
src/gui/dialogues/newtail.cpp

@@ -127,7 +127,14 @@ void NewTail::on_buttonBox_accepted()
     }else{
         if(verify()){
             DEB("Form verified");
-            auto acOut = createAircraftFromSelection();
+            switch (role) {
+            case sql::createNew:
+                break;
+            case sql::editExisting:
+                break;
+            }
+            //auto acOut = createAircraftFromSelection();
+            createEntry();
             //commit to database
             //accept();
         }else{
@@ -288,3 +295,88 @@ aircraft NewTail::createAircraftFromSelection()
     }
     return newacft;
 }
+
+
+
+
+
+
+
+//=============================DB Object ==================================
+
+
+
+//Dialog to be used to edit existing tail
+NewTail::NewTail(db dbentry, sql::editRole edRole, QWidget *parent) :
+    QDialog(parent),
+    ui(new Ui::NewTail)
+{
+    ui->setupUi(this);
+    role = edRole;
+    ui->searchLabel->hide();
+    ui->searchLineEdit->hide();
+    formFiller(dbentry);
+}
+
+/*!
+ * \brief NewTail::formFiller populates the Dialog with the
+ * information contained in an aircraft object.
+ * \param db - entry retreived from database
+ */
+void NewTail::formFiller(db entry)
+{
+    DEB("Filling Form for a/c" << entry);
+    //fill Line Edits
+    auto line_edits = parent()->findChildren<QLineEdit*>();
+    for (const auto& le : line_edits) {
+        QString name = le->objectName();
+        name.chop(8);//remove "LineEdit"
+        QString value = entry.data.value(name);
+        le->setText(value);
+    }
+    //select comboboxes
+    QVector<QString> operation = {entry.data.value("singleengine"),entry.data.value("multiengine")};
+    QVector<QString> ppNumber =  {entry.data.value("singlepilot"),entry.data.value("multipilot")};
+    QVector<QString> ppType =    {entry.data.value("unpowered"),entry.data.value("piston"),
+                                  entry.data.value("turboprop"),entry.data.value("jet")};
+    QVector<QString> weight =    {entry.data.value("light"),entry.data.value("medium"),
+                                  entry.data.value("heavy"),entry.data.value("super")};
+
+
+    ui->operationComboBox->setCurrentIndex(operation.indexOf("1")+1);
+    ui->ppNumberComboBox->setCurrentIndex(ppNumber.indexOf("1")+1);
+    ui->ppTypeComboBox->setCurrentIndex(ppType.indexOf("1")+1);
+    ui->weightComboBox->setCurrentIndex(weight.indexOf("1")+1);
+}
+
+void NewTail::createEntry()
+{
+    DEB("Creating Object...");
+    QMap<QString,QString> newData;
+    //retreive Line Edits
+    auto line_edits = parent()->findChildren<QLineEdit*>();
+
+    for (const auto& le : line_edits) {
+        QString name = le->objectName();
+        name.chop(8);//remove "LineEdit"
+        if(!le->text().isEmpty()){
+            newData.insert(name,le->text());
+        }
+    }
+
+    //prepare comboboxes
+    QVector<QString> operation = {"singlepilot","multipilot"};
+    QVector<QString> ppNumber  = {"singleengine","multiengine"};
+    QVector<QString> ppType    = {"unpowered","piston",
+                                  "turboprop","jet"};
+    QVector<QString> weight    = {"light","medium",
+                                  "heavy","super"};
+
+    newData.insert(operation[ui->operationComboBox->currentIndex()-1],QLatin1String("1"));
+    newData.insert(ppNumber[ui->ppNumberComboBox->currentIndex()-1],QLatin1String("1"));
+    newData.insert(ppType[ui->ppTypeComboBox->currentIndex()-1],QLatin1String("1"));
+    newData.insert(weight[ui->weightComboBox->currentIndex()-1],QLatin1String("1"));
+    //create db object
+    auto newObject = db(sql::tails,newData);
+    //DEB("Committing Succesfull: " << newObject.commit());
+}

+ 8 - 0
src/gui/dialogues/newtail.h

@@ -43,6 +43,8 @@ public:
 
     explicit NewTail(QString reg, QWidget *parent = nullptr);
 
+    explicit NewTail(db dbentry, sql::editRole edRole, QWidget *parent = nullptr);
+
     ~NewTail();
 
 
@@ -64,12 +66,18 @@ private:
 
     Ui::NewTail *ui;
 
+    sql::editRole role;
+
     void formFiller(aircraft);
 
+    void formFiller(db);
+
     bool verify();
 
     aircraft createAircraftFromSelection();
 
+    void createEntry();
+
     QStringList aircraftlist;
 
     QMap<QString, int> idMap;

+ 12 - 0
src/gui/dialogues/newtail.ui

@@ -274,6 +274,18 @@
    </item>
   </layout>
  </widget>
+ <tabstops>
+  <tabstop>searchLineEdit</tabstop>
+  <tabstop>registrationLineEdit</tabstop>
+  <tabstop>companyLineEdit</tabstop>
+  <tabstop>makeLineEdit</tabstop>
+  <tabstop>modelLineEdit</tabstop>
+  <tabstop>variantLineEdit</tabstop>
+  <tabstop>operationComboBox</tabstop>
+  <tabstop>ppTypeComboBox</tabstop>
+  <tabstop>ppNumberComboBox</tabstop>
+  <tabstop>weightComboBox</tabstop>
+ </tabstops>
  <resources/>
  <connections>
   <connection>

+ 2 - 0
src/gui/widgets/aircraftwidget.cpp

@@ -66,6 +66,8 @@ void aircraftWidget::tableView_selectionChanged(const QItemSelection &index, con
     DEB("Selected aircraft with ID#: " << selectedAircraft);
 
     auto nt = new NewTail(aircraft(selectedAircraft,aircraft::tail),this);
+    //auto nt = new NewTail(db(sql::tails,selectedAircraft),this);
+
     nt->setWindowFlag(Qt::Widget);
     ui->stackedWidget->addWidget(nt);
     ui->stackedWidget->setCurrentWidget(nt);

+ 1 - 0
src/gui/widgets/aircraftwidget.h

@@ -8,6 +8,7 @@
 #include <QLabel>
 #include "src/gui/dialogues/newtail.h"
 #include "src/classes/aircraft.h"
+#include "src/database/db.h"
 
 namespace Ui {
 class aircraftWidget;

+ 5 - 4
src/gui/widgets/homewidget.cpp

@@ -54,12 +54,13 @@ void homeWidget::on_pushButton_clicked()
 {
     //aircraft ac(203,aircraft::tail);
 
-    //auto nt = new NewTail("SE-NEU",this);
-    //nt->show();
+
     //aircraft ac2(114,aircraft::acft);
     //aircraft ac3(0,aircraft::acft);
 
-    auto ob = db(sql::flights,1);
-    DEB(ob);
+    auto ob = db(sql::tails,1);
+    auto nt = new NewTail(ob,this);
+    nt->show();
+
 
 }