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
This commit is contained in:
Peinthor Rene
2013-03-18 17:37:03 +01:00
parent ade0914195
commit 1b0d5a2ff9
5 changed files with 51 additions and 53 deletions

View File

@@ -6,7 +6,6 @@
#include <QComboBox>
#include "sqlitedb.h"
#include "sqlitetypes.h"
#include <QDebug>
@@ -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();
}
}
}

View File

@@ -1,15 +1,13 @@
#ifndef __EDITTABLEDIALOG_H__
#define __EDITTABLEDIALOG_H__
#include "sqlitetypes.h"
#include <QDialog>
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;

View File

@@ -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;

View File

@@ -56,7 +56,7 @@ private:
};
typedef QSharedPointer<Field> 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;
};
/**

View File

@@ -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);