1212#include < QKeyEvent>
1313#include < algorithm>
1414
15+ Q_DECLARE_METATYPE (sqlb::ConstraintPtr)
16+ Q_DECLARE_METATYPE(sqlb::StringVector)
17+
1518EditTableDialog::EditTableDialog(DBBrowserDB& db, const sqlb::ObjectIdentifier& tableName, bool createTable, QWidget* parent)
1619 : QDialog(parent),
1720 ui(new Ui::EditTableDialog),
@@ -24,9 +27,10 @@ EditTableDialog::EditTableDialog(DBBrowserDB& db, const sqlb::ObjectIdentifier&
2427 // Create UI
2528 ui->setupUi (this );
2629 ui->widgetExtension ->setVisible (false );
27- connect (ui->treeWidget , SIGNAL (itemChanged (QTreeWidgetItem*,int )),this ,SLOT (itemChanged (QTreeWidgetItem*,int )));
30+ connect (ui->treeWidget , &QTreeWidget::itemChanged, this , &EditTableDialog::fieldItemChanged);
31+ connect (ui->tableConstraints , &QTableWidget::itemChanged, this , &EditTableDialog::constraintItemChanged);
2832
29- // TODO Remove this one we have added support for these buttons
33+ // TODO Remove this once we have added support for these buttons
3034 ui->buttonAddConstraint ->setVisible (false );
3135 ui->buttonRemoveConstraint ->setVisible (false );
3236
@@ -111,10 +115,8 @@ void EditTableDialog::updateColumnWidth()
111115
112116void EditTableDialog::populateFields ()
113117{
114- // disconnect the itemChanged signal or the table item will
115- // be updated while filling the treewidget
116- disconnect (ui->treeWidget , SIGNAL (itemChanged (QTreeWidgetItem*,int )),
117- this ,SLOT (itemChanged (QTreeWidgetItem*,int )));
118+ // Disable the itemChanged signal or the table item will be updated while filling the treewidget
119+ ui->treeWidget ->blockSignals (true );
118120
119121 ui->treeWidget ->clear ();
120122 const auto & fields = m_table.fields ;
@@ -162,14 +164,16 @@ void EditTableDialog::populateFields()
162164 }
163165
164166 // and reconnect
165- connect ( ui->treeWidget , SIGNAL ( itemChanged (QTreeWidgetItem*, int )), this , SLOT ( itemChanged (QTreeWidgetItem*, int )) );
167+ ui->treeWidget -> blockSignals ( false );
166168}
167169
168170void EditTableDialog::populateConstraints ()
169171{
172+ // Disable the itemChanged signal or the table item will be updated while filling the treewidget
173+ ui->tableConstraints ->blockSignals (true );
174+
170175 const auto & constraints = m_table.allConstraints ();
171176
172- ui->tableConstraints ->blockSignals (true );
173177 ui->tableConstraints ->setRowCount (static_cast <int >(constraints.size ()));
174178 int row = 0 ;
175179 for (const auto & pair : constraints)
@@ -179,6 +183,7 @@ void EditTableDialog::populateConstraints()
179183
180184 // Columns
181185 QTableWidgetItem* column = new QTableWidgetItem (QString::fromStdString (sqlb::joinStringVector (columns, " ," )));
186+ column->setData (Qt::UserRole, QVariant::fromValue<sqlb::StringVector>(pair.first )); // Remember raw data of columns of constraint
182187 column->setFlags (Qt::ItemIsSelectable | Qt::ItemIsEnabled);
183188 ui->tableConstraints ->setItem (row, kConstraintColumns , column);
184189
@@ -206,16 +211,18 @@ void EditTableDialog::populateConstraints()
206211 type->addItem (tr (" Unknown" ));
207212 type->setCurrentIndex (type->count ()-1 );
208213 }
214+ type->setEnabled (false ); // TODO Remove this once we have added support for changing constraint types
209215 ui->tableConstraints ->setCellWidget (row, kConstraintType , type);
210216
211217 // Name
212218 QTableWidgetItem* name = new QTableWidgetItem (QString::fromStdString (constraint->name ()));
213- name->setFlags (Qt::ItemIsSelectable | Qt::ItemIsEnabled /* TODO | Qt::ItemIsEditable */ );
219+ name->setData (Qt::UserRole, QVariant::fromValue<sqlb::ConstraintPtr>(pair.second )); // Remember address of constraint object. This is used for modifying it later
220+ name->setFlags (Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable);
214221 ui->tableConstraints ->setItem (row, kConstraintName , name);
215222
216223 // SQL
217224 QTableWidgetItem* sql = new QTableWidgetItem (QString::fromStdString (constraint->toSql (columns)));
218- name ->setFlags (Qt::ItemIsSelectable | Qt::ItemIsEnabled);
225+ sql ->setFlags (Qt::ItemIsSelectable | Qt::ItemIsEnabled);
219226 ui->tableConstraints ->setItem (row, kConstraintSql , sql);
220227
221228 row++;
@@ -329,7 +336,7 @@ bool EditTableDialog::eventFilter(QObject *object, QEvent *event)
329336 return false ;
330337}
331338
332- void EditTableDialog::itemChanged (QTreeWidgetItem *item, int column)
339+ void EditTableDialog::fieldItemChanged (QTreeWidgetItem *item, int column)
333340{
334341 size_t index = static_cast <size_t >(ui->treeWidget ->indexOfTopLevelItem (item));
335342 if (index < m_table.fields .size ())
@@ -607,6 +614,25 @@ void EditTableDialog::itemChanged(QTreeWidgetItem *item, int column)
607614 checkInput ();
608615}
609616
617+ void EditTableDialog::constraintItemChanged (QTableWidgetItem* item)
618+ {
619+ // Find modified constraint
620+ sqlb::StringVector columns = ui->tableConstraints ->item (item->row (), kConstraintColumns )->data (Qt::UserRole).value <sqlb::StringVector>();
621+ sqlb::ConstraintPtr constraint = ui->tableConstraints ->item (item->row (), kConstraintName )->data (Qt::UserRole).value <sqlb::ConstraintPtr>();
622+
623+ // Which column has been modified?
624+ switch (item->column ())
625+ {
626+ case kConstraintName :
627+ constraint->setName (item->text ().toStdString ());
628+ break ;
629+ };
630+
631+ // Update SQL
632+ ui->tableConstraints ->item (item->row (), kConstraintSql )->setText (QString::fromStdString (constraint->toSql (columns)));
633+ checkInput ();
634+ }
635+
610636void EditTableDialog::addField ()
611637{
612638 QTreeWidgetItem *tbitem = new QTreeWidgetItem (ui->treeWidget );
0 commit comments