From 1b0d5a2ff964e44e42d4bcb0f3aa627287d29cbc Mon Sep 17 00:00:00 2001 From: Peinthor Rene Date: Mon, 18 Mar 2013 17:37:03 +0100 Subject: [PATCH] Fix view updating after remove field in edittable dialog rename the FieldList typedef to FieldVector use a object instead of a table pointer in edittable dialog --- src/EditTableDialog.cpp | 70 ++++++++++++++++++------------------ src/EditTableDialog.h | 8 ++--- src/sqlitetypes.cpp | 9 +++-- src/sqlitetypes.h | 15 ++++---- src/tests/testsqlobjects.cpp | 2 +- 5 files changed, 51 insertions(+), 53 deletions(-) diff --git a/src/EditTableDialog.cpp b/src/EditTableDialog.cpp index 9df2d900..ba6694fe 100644 --- a/src/EditTableDialog.cpp +++ b/src/EditTableDialog.cpp @@ -6,7 +6,6 @@ #include #include "sqlitedb.h" -#include "sqlitetypes.h" #include @@ -14,7 +13,8 @@ EditTableDialog::EditTableDialog(DBBrowserDB* db, const QString& tableName, QWid : QDialog(parent), ui(new Ui::EditTableDialog), pdb(db), - curTable(tableName) + curTable(tableName), + m_table(tableName) { // Create UI ui->setupUi(this); @@ -27,13 +27,9 @@ EditTableDialog::EditTableDialog(DBBrowserDB* db, const QString& tableName, QWid // Existing table, so load and set the current layout QString sTablesql = pdb->getTableSQL(curTable); //qDebug() << sTablesql; - m_table = new sqlb::Table(sqlb::Table::parseSQL(sTablesql)); + m_table = sqlb::Table::parseSQL(sTablesql); populateFields(); } - else - { - m_table = new sqlb::Table(tableName); - } // And create a savepoint pdb->executeSQL(QString("SAVEPOINT edittable_%1_save;").arg(curTable), false); @@ -43,16 +39,10 @@ EditTableDialog::EditTableDialog(DBBrowserDB* db, const QString& tableName, QWid updateColumnWidth(); checkInput(); - - //connect itemchanged signal now - //if we do it before populateFields additem will interfere - connect(ui->treeWidget, SIGNAL(itemChanged(QTreeWidgetItem*,int)),this,SLOT(itemChanged(QTreeWidgetItem*,int))); - } EditTableDialog::~EditTableDialog() { - delete m_table; delete ui; } @@ -67,7 +57,13 @@ void EditTableDialog::updateColumnWidth() void EditTableDialog::populateFields() { - sqlb::FieldList fields = m_table->fields(); + // disconnect the itemChanged signal or the table item will + // be updated while filling the treewidget + disconnect(ui->treeWidget, SIGNAL(itemChanged(QTreeWidgetItem*,int)), + this,SLOT(itemChanged(QTreeWidgetItem*,int))); + + ui->treeWidget->clear(); + sqlb::FieldVector fields = m_table.fields(); foreach(sqlb::FieldPtr f, fields) { QTreeWidgetItem *tbitem = new QTreeWidgetItem(ui->treeWidget); @@ -88,10 +84,13 @@ void EditTableDialog::populateFields() ui->treeWidget->setItemWidget(tbitem, kType, typeBox); tbitem->setCheckState(kNotNull, f->notnull() ? Qt::Checked : Qt::Unchecked); - tbitem->setCheckState(kPrimaryKey, m_table->primarykey().contains(f) ? Qt::Checked : Qt::Unchecked); + tbitem->setCheckState(kPrimaryKey, m_table.primarykey().contains(f) ? Qt::Checked : Qt::Unchecked); tbitem->setCheckState(kAutoIncrement, f->autoIncrement() ? Qt::Checked : Qt::Unchecked); ui->treeWidget->addTopLevelItem(tbitem); } + + // and reconnect + connect(ui->treeWidget, SIGNAL(itemChanged(QTreeWidgetItem*,int)),this,SLOT(itemChanged(QTreeWidgetItem*,int))); } void EditTableDialog::accept() @@ -102,7 +101,7 @@ void EditTableDialog::accept() { // Creation of new table // we commit immediatly so no need to setdirty - if(!pdb->executeSQL(m_table->sql(), false)) + if(!pdb->executeSQL(m_table.sql(), false)) { QMessageBox::warning( this, @@ -145,13 +144,13 @@ void EditTableDialog::reject() void EditTableDialog::updateSqlText() { ui->sqlTextEdit->clear(); - ui->sqlTextEdit->insertPlainText(m_table->sql()); + ui->sqlTextEdit->insertPlainText(m_table.sql()); } void EditTableDialog::updateTableObject() { - sqlb::FieldList fields; - sqlb::FieldList pk; + sqlb::FieldVector fields; + sqlb::FieldVector pk; for(int i = 0; i < ui->treeWidget->topLevelItemCount(); ++i) { QTreeWidgetItem* item = ui->treeWidget->topLevelItem(i); @@ -170,8 +169,8 @@ void EditTableDialog::updateTableObject() fields.append(f); } - m_table->setFields(fields); - m_table->setPrimaryKey(pk); + m_table.setFields(fields); + m_table.setPrimaryKey(pk); } void EditTableDialog::checkInput() @@ -183,7 +182,7 @@ void EditTableDialog::checkInput() valid = false; if(ui->treeWidget->topLevelItemCount() == 0) valid = false; - m_table->setName(normTableName); + m_table.setName(normTableName); updateSqlText(); ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(valid); } @@ -197,7 +196,7 @@ void EditTableDialog::updateTypes() QString sType = "INTEGER"; if(typeBox) sType = typeBox->currentText(); - m_table->fields().at(i)->setType(sType); + m_table.fields().at(i)->setType(sType); } checkInput(); } @@ -205,9 +204,9 @@ void EditTableDialog::updateTypes() void EditTableDialog::itemChanged(QTreeWidgetItem *item, int column) { int index = ui->treeWidget->indexOfTopLevelItem(item); - if(index < m_table->fields().count()) + if(index < m_table.fields().count()) { - sqlb::FieldPtr field = m_table->fields().at(index); + sqlb::FieldPtr field = m_table.fields().at(index); switch(column) { case kName: @@ -224,12 +223,16 @@ void EditTableDialog::itemChanged(QTreeWidgetItem *item, int column) break; case kPrimaryKey: { - sqlb::FieldList pks = m_table->primarykey(); + sqlb::FieldVector pks = m_table.primarykey(); if(item->checkState(column) == Qt::Checked) pks.append(field); else - pks.remove(pks.indexOf(field)); - m_table->setPrimaryKey(pks); + { + int index = pks.indexOf(field); + if(index != -1) + pks.remove(index); + } + m_table.setPrimaryKey(pks); } break; case kNotNull: @@ -269,7 +272,7 @@ void EditTableDialog::addField() tbitem->text(kName), typeBox->currentText() )); - m_table->addField(f); + m_table.addField(f); checkInput(); } @@ -286,9 +289,9 @@ void EditTableDialog::removeField() // Creating a new one // Just delete that item. At this point there is no DB table to edit or data to be lost anyway - sqlb::FieldList fields = m_table->fields(); + sqlb::FieldVector fields = m_table.fields(); fields.remove(ui->treeWidget->indexOfTopLevelItem(ui->treeWidget->currentItem())); - m_table->setFields(fields); + m_table.setFields(fields); delete ui->treeWidget->currentItem(); } else { // Editing an old one @@ -304,10 +307,9 @@ void EditTableDialog::removeField() } else { //relayout QString sTablesql = pdb->getTableSQL(curTable); - m_table = new sqlb::Table(sqlb::Table::parseSQL(sTablesql)); + qDebug() << sTablesql; + m_table = sqlb::Table::parseSQL(sTablesql); populateFields(); - - delete ui->treeWidget->currentItem(); } } } diff --git a/src/EditTableDialog.h b/src/EditTableDialog.h index 567850f3..6a565ead 100644 --- a/src/EditTableDialog.h +++ b/src/EditTableDialog.h @@ -1,15 +1,13 @@ #ifndef __EDITTABLEDIALOG_H__ #define __EDITTABLEDIALOG_H__ +#include "sqlitetypes.h" + #include class DBBrowserDB; class SQLiteSyntaxHighlighter; class QTreeWidgetItem; -namespace sqlb { -class Table; -} - namespace Ui { class EditTableDialog; } @@ -50,7 +48,7 @@ private: Ui::EditTableDialog* ui; DBBrowserDB* pdb; QString curTable; - sqlb::Table* m_table; + sqlb::Table m_table; QStringList types; QStringList fields; SQLiteSyntaxHighlighter* m_sqliteSyntaxHighlighter; diff --git a/src/sqlitetypes.cpp b/src/sqlitetypes.cpp index 5d8cfa0a..3dacc6a5 100644 --- a/src/sqlitetypes.cpp +++ b/src/sqlitetypes.cpp @@ -68,9 +68,8 @@ void Table::addField(const FieldPtr& f) m_fields.append(FieldPtr(f)); } -void Table::setFields(const FieldList &fields) +void Table::setFields(const FieldVector &fields) { - m_primarykey.clear(); clear(); m_fields = fields; } @@ -85,7 +84,7 @@ int Table::findField(const QString &sname) return -1; } -bool Table::setPrimaryKey(const FieldList& pk) +bool Table::setPrimaryKey(const FieldVector& pk) { foreach(FieldPtr f, pk) { if(!m_fields.contains(f)) @@ -166,7 +165,7 @@ QString Table::sql() const if( m_primarykey.size() > 0 && !hasAutoIncrement()) { sql += ",\n\tPRIMARY KEY("; - for(FieldList::ConstIterator it = m_primarykey.constBegin(); + for(FieldVector::ConstIterator it = m_primarykey.constBegin(); it != m_primarykey.constEnd(); ++it) { @@ -221,7 +220,7 @@ Table CreateTableWalker::table() s = s->getNextSibling(); // first column name antlr::RefAST column = s; // loop columndefs - FieldList pks; + FieldVector pks; while(column != antlr::nullAST && column->getType() == sqlite3TokenTypes::COLUMNDEF) { FieldPtr f; diff --git a/src/sqlitetypes.h b/src/sqlitetypes.h index 0756f5c6..3645ade3 100644 --- a/src/sqlitetypes.h +++ b/src/sqlitetypes.h @@ -56,7 +56,7 @@ private: }; typedef QSharedPointer FieldPtr; -typedef QVector< FieldPtr > FieldList; +typedef QVector< FieldPtr > FieldVector; class Table { public: @@ -66,12 +66,12 @@ public: void setName(const QString& name) { m_name = name; } const QString& name() const { return m_name; } - const FieldList& fields() const { return m_fields; } - const FieldList& primarykey() const { return m_primarykey; } + const FieldVector& fields() const { return m_fields; } + const FieldVector& primarykey() const { return m_primarykey; } QString sql() const; void addField(const FieldPtr& f); - void setFields(const FieldList& fields); + void setFields(const FieldVector& fields); void clear(); /** * @brief findField Finds a field and returns the index. @@ -81,19 +81,18 @@ public: */ int findField(const QString& sname); - bool setPrimaryKey(const FieldList& pk); + bool setPrimaryKey(const FieldVector& pk); bool setPrimaryKey(FieldPtr pk, bool autoincrement = false); static Table parseSQL(const QString& sSQL); - private: QStringList fieldList() const; bool hasAutoIncrement() const; private: QString m_name; - FieldList m_fields; - FieldList m_primarykey; + FieldVector m_fields; + FieldVector m_primarykey; }; /** diff --git a/src/tests/testsqlobjects.cpp b/src/tests/testsqlobjects.cpp index 90fd7a21..98cba41e 100644 --- a/src/tests/testsqlobjects.cpp +++ b/src/tests/testsqlobjects.cpp @@ -24,7 +24,7 @@ void TestTable::sqlOutput() tt.addField(f); tt.addField(FieldPtr(new Field("car", "text"))); tt.addField(fkm); - FieldList pk; + FieldVector pk; pk.append(f); pk.append(fkm); tt.setPrimaryKey(pk);