Skip to content

Commit 1b0d5a2

Browse files
committed
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
1 parent ade0914 commit 1b0d5a2

5 files changed

Lines changed: 51 additions & 53 deletions

File tree

src/EditTableDialog.cpp

Lines changed: 36 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@
66
#include <QComboBox>
77

88
#include "sqlitedb.h"
9-
#include "sqlitetypes.h"
109

1110
#include <QDebug>
1211

1312
EditTableDialog::EditTableDialog(DBBrowserDB* db, const QString& tableName, QWidget* parent)
1413
: QDialog(parent),
1514
ui(new Ui::EditTableDialog),
1615
pdb(db),
17-
curTable(tableName)
16+
curTable(tableName),
17+
m_table(tableName)
1818
{
1919
// Create UI
2020
ui->setupUi(this);
@@ -27,13 +27,9 @@ EditTableDialog::EditTableDialog(DBBrowserDB* db, const QString& tableName, QWid
2727
// Existing table, so load and set the current layout
2828
QString sTablesql = pdb->getTableSQL(curTable);
2929
//qDebug() << sTablesql;
30-
m_table = new sqlb::Table(sqlb::Table::parseSQL(sTablesql));
30+
m_table = sqlb::Table::parseSQL(sTablesql);
3131
populateFields();
3232
}
33-
else
34-
{
35-
m_table = new sqlb::Table(tableName);
36-
}
3733

3834
// And create a savepoint
3935
pdb->executeSQL(QString("SAVEPOINT edittable_%1_save;").arg(curTable), false);
@@ -43,16 +39,10 @@ EditTableDialog::EditTableDialog(DBBrowserDB* db, const QString& tableName, QWid
4339
updateColumnWidth();
4440

4541
checkInput();
46-
47-
//connect itemchanged signal now
48-
//if we do it before populateFields additem will interfere
49-
connect(ui->treeWidget, SIGNAL(itemChanged(QTreeWidgetItem*,int)),this,SLOT(itemChanged(QTreeWidgetItem*,int)));
50-
5142
}
5243

5344
EditTableDialog::~EditTableDialog()
5445
{
55-
delete m_table;
5646
delete ui;
5747
}
5848

@@ -67,7 +57,13 @@ void EditTableDialog::updateColumnWidth()
6757

6858
void EditTableDialog::populateFields()
6959
{
70-
sqlb::FieldList fields = m_table->fields();
60+
// disconnect the itemChanged signal or the table item will
61+
// be updated while filling the treewidget
62+
disconnect(ui->treeWidget, SIGNAL(itemChanged(QTreeWidgetItem*,int)),
63+
this,SLOT(itemChanged(QTreeWidgetItem*,int)));
64+
65+
ui->treeWidget->clear();
66+
sqlb::FieldVector fields = m_table.fields();
7167
foreach(sqlb::FieldPtr f, fields)
7268
{
7369
QTreeWidgetItem *tbitem = new QTreeWidgetItem(ui->treeWidget);
@@ -88,10 +84,13 @@ void EditTableDialog::populateFields()
8884
ui->treeWidget->setItemWidget(tbitem, kType, typeBox);
8985

9086
tbitem->setCheckState(kNotNull, f->notnull() ? Qt::Checked : Qt::Unchecked);
91-
tbitem->setCheckState(kPrimaryKey, m_table->primarykey().contains(f) ? Qt::Checked : Qt::Unchecked);
87+
tbitem->setCheckState(kPrimaryKey, m_table.primarykey().contains(f) ? Qt::Checked : Qt::Unchecked);
9288
tbitem->setCheckState(kAutoIncrement, f->autoIncrement() ? Qt::Checked : Qt::Unchecked);
9389
ui->treeWidget->addTopLevelItem(tbitem);
9490
}
91+
92+
// and reconnect
93+
connect(ui->treeWidget, SIGNAL(itemChanged(QTreeWidgetItem*,int)),this,SLOT(itemChanged(QTreeWidgetItem*,int)));
9594
}
9695

9796
void EditTableDialog::accept()
@@ -102,7 +101,7 @@ void EditTableDialog::accept()
102101
{
103102
// Creation of new table
104103
// we commit immediatly so no need to setdirty
105-
if(!pdb->executeSQL(m_table->sql(), false))
104+
if(!pdb->executeSQL(m_table.sql(), false))
106105
{
107106
QMessageBox::warning(
108107
this,
@@ -145,13 +144,13 @@ void EditTableDialog::reject()
145144
void EditTableDialog::updateSqlText()
146145
{
147146
ui->sqlTextEdit->clear();
148-
ui->sqlTextEdit->insertPlainText(m_table->sql());
147+
ui->sqlTextEdit->insertPlainText(m_table.sql());
149148
}
150149

151150
void EditTableDialog::updateTableObject()
152151
{
153-
sqlb::FieldList fields;
154-
sqlb::FieldList pk;
152+
sqlb::FieldVector fields;
153+
sqlb::FieldVector pk;
155154
for(int i = 0; i < ui->treeWidget->topLevelItemCount(); ++i)
156155
{
157156
QTreeWidgetItem* item = ui->treeWidget->topLevelItem(i);
@@ -170,8 +169,8 @@ void EditTableDialog::updateTableObject()
170169
fields.append(f);
171170
}
172171

173-
m_table->setFields(fields);
174-
m_table->setPrimaryKey(pk);
172+
m_table.setFields(fields);
173+
m_table.setPrimaryKey(pk);
175174
}
176175

177176
void EditTableDialog::checkInput()
@@ -183,7 +182,7 @@ void EditTableDialog::checkInput()
183182
valid = false;
184183
if(ui->treeWidget->topLevelItemCount() == 0)
185184
valid = false;
186-
m_table->setName(normTableName);
185+
m_table.setName(normTableName);
187186
updateSqlText();
188187
ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(valid);
189188
}
@@ -197,17 +196,17 @@ void EditTableDialog::updateTypes()
197196
QString sType = "INTEGER";
198197
if(typeBox)
199198
sType = typeBox->currentText();
200-
m_table->fields().at(i)->setType(sType);
199+
m_table.fields().at(i)->setType(sType);
201200
}
202201
checkInput();
203202
}
204203

205204
void EditTableDialog::itemChanged(QTreeWidgetItem *item, int column)
206205
{
207206
int index = ui->treeWidget->indexOfTopLevelItem(item);
208-
if(index < m_table->fields().count())
207+
if(index < m_table.fields().count())
209208
{
210-
sqlb::FieldPtr field = m_table->fields().at(index);
209+
sqlb::FieldPtr field = m_table.fields().at(index);
211210
switch(column)
212211
{
213212
case kName:
@@ -224,12 +223,16 @@ void EditTableDialog::itemChanged(QTreeWidgetItem *item, int column)
224223
break;
225224
case kPrimaryKey:
226225
{
227-
sqlb::FieldList pks = m_table->primarykey();
226+
sqlb::FieldVector pks = m_table.primarykey();
228227
if(item->checkState(column) == Qt::Checked)
229228
pks.append(field);
230229
else
231-
pks.remove(pks.indexOf(field));
232-
m_table->setPrimaryKey(pks);
230+
{
231+
int index = pks.indexOf(field);
232+
if(index != -1)
233+
pks.remove(index);
234+
}
235+
m_table.setPrimaryKey(pks);
233236
}
234237
break;
235238
case kNotNull:
@@ -269,7 +272,7 @@ void EditTableDialog::addField()
269272
tbitem->text(kName),
270273
typeBox->currentText()
271274
));
272-
m_table->addField(f);
275+
m_table.addField(f);
273276

274277
checkInput();
275278
}
@@ -286,9 +289,9 @@ void EditTableDialog::removeField()
286289
// Creating a new one
287290

288291
// Just delete that item. At this point there is no DB table to edit or data to be lost anyway
289-
sqlb::FieldList fields = m_table->fields();
292+
sqlb::FieldVector fields = m_table.fields();
290293
fields.remove(ui->treeWidget->indexOfTopLevelItem(ui->treeWidget->currentItem()));
291-
m_table->setFields(fields);
294+
m_table.setFields(fields);
292295
delete ui->treeWidget->currentItem();
293296
} else {
294297
// Editing an old one
@@ -304,10 +307,9 @@ void EditTableDialog::removeField()
304307
} else {
305308
//relayout
306309
QString sTablesql = pdb->getTableSQL(curTable);
307-
m_table = new sqlb::Table(sqlb::Table::parseSQL(sTablesql));
310+
qDebug() << sTablesql;
311+
m_table = sqlb::Table::parseSQL(sTablesql);
308312
populateFields();
309-
310-
delete ui->treeWidget->currentItem();
311313
}
312314
}
313315
}

src/EditTableDialog.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
#ifndef __EDITTABLEDIALOG_H__
22
#define __EDITTABLEDIALOG_H__
33

4+
#include "sqlitetypes.h"
5+
46
#include <QDialog>
57
class DBBrowserDB;
68
class SQLiteSyntaxHighlighter;
79
class QTreeWidgetItem;
810

9-
namespace sqlb {
10-
class Table;
11-
}
12-
1311
namespace Ui {
1412
class EditTableDialog;
1513
}
@@ -50,7 +48,7 @@ private slots:
5048
Ui::EditTableDialog* ui;
5149
DBBrowserDB* pdb;
5250
QString curTable;
53-
sqlb::Table* m_table;
51+
sqlb::Table m_table;
5452
QStringList types;
5553
QStringList fields;
5654
SQLiteSyntaxHighlighter* m_sqliteSyntaxHighlighter;

src/sqlitetypes.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,8 @@ void Table::addField(const FieldPtr& f)
6868
m_fields.append(FieldPtr(f));
6969
}
7070

71-
void Table::setFields(const FieldList &fields)
71+
void Table::setFields(const FieldVector &fields)
7272
{
73-
m_primarykey.clear();
7473
clear();
7574
m_fields = fields;
7675
}
@@ -85,7 +84,7 @@ int Table::findField(const QString &sname)
8584
return -1;
8685
}
8786

88-
bool Table::setPrimaryKey(const FieldList& pk)
87+
bool Table::setPrimaryKey(const FieldVector& pk)
8988
{
9089
foreach(FieldPtr f, pk) {
9190
if(!m_fields.contains(f))
@@ -166,7 +165,7 @@ QString Table::sql() const
166165
if( m_primarykey.size() > 0 && !hasAutoIncrement())
167166
{
168167
sql += ",\n\tPRIMARY KEY(";
169-
for(FieldList::ConstIterator it = m_primarykey.constBegin();
168+
for(FieldVector::ConstIterator it = m_primarykey.constBegin();
170169
it != m_primarykey.constEnd();
171170
++it)
172171
{
@@ -221,7 +220,7 @@ Table CreateTableWalker::table()
221220
s = s->getNextSibling(); // first column name
222221
antlr::RefAST column = s;
223222
// loop columndefs
224-
FieldList pks;
223+
FieldVector pks;
225224
while(column != antlr::nullAST && column->getType() == sqlite3TokenTypes::COLUMNDEF)
226225
{
227226
FieldPtr f;

src/sqlitetypes.h

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ class Field
5656
};
5757

5858
typedef QSharedPointer<Field> FieldPtr;
59-
typedef QVector< FieldPtr > FieldList;
59+
typedef QVector< FieldPtr > FieldVector;
6060
class Table
6161
{
6262
public:
@@ -66,12 +66,12 @@ class Table
6666
void setName(const QString& name) { m_name = name; }
6767

6868
const QString& name() const { return m_name; }
69-
const FieldList& fields() const { return m_fields; }
70-
const FieldList& primarykey() const { return m_primarykey; }
69+
const FieldVector& fields() const { return m_fields; }
70+
const FieldVector& primarykey() const { return m_primarykey; }
7171
QString sql() const;
7272

7373
void addField(const FieldPtr& f);
74-
void setFields(const FieldList& fields);
74+
void setFields(const FieldVector& fields);
7575
void clear();
7676
/**
7777
* @brief findField Finds a field and returns the index.
@@ -81,19 +81,18 @@ class Table
8181
*/
8282
int findField(const QString& sname);
8383

84-
bool setPrimaryKey(const FieldList& pk);
84+
bool setPrimaryKey(const FieldVector& pk);
8585
bool setPrimaryKey(FieldPtr pk, bool autoincrement = false);
8686

8787
static Table parseSQL(const QString& sSQL);
88-
8988
private:
9089
QStringList fieldList() const;
9190
bool hasAutoIncrement() const;
9291

9392
private:
9493
QString m_name;
95-
FieldList m_fields;
96-
FieldList m_primarykey;
94+
FieldVector m_fields;
95+
FieldVector m_primarykey;
9796
};
9897

9998
/**

src/tests/testsqlobjects.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ void TestTable::sqlOutput()
2424
tt.addField(f);
2525
tt.addField(FieldPtr(new Field("car", "text")));
2626
tt.addField(fkm);
27-
FieldList pk;
27+
FieldVector pk;
2828
pk.append(f);
2929
pk.append(fkm);
3030
tt.setPrimaryKey(pk);

0 commit comments

Comments
 (0)