66#include < QComboBox>
77
88#include " sqlitedb.h"
9- #include " sqlitetypes.h"
109
1110#include < QDebug>
1211
1312EditTableDialog::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
5344EditTableDialog::~EditTableDialog ()
5445{
55- delete m_table;
5646 delete ui;
5747}
5848
@@ -67,7 +57,13 @@ void EditTableDialog::updateColumnWidth()
6757
6858void 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
9796void 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()
145144void EditTableDialog::updateSqlText ()
146145{
147146 ui->sqlTextEdit ->clear ();
148- ui->sqlTextEdit ->insertPlainText (m_table-> sql ());
147+ ui->sqlTextEdit ->insertPlainText (m_table. sql ());
149148}
150149
151150void 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
177176void 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
205204void 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 }
0 commit comments