Skip to content

Commit cd748d0

Browse files
committed
Support changing constraint names in the Edit Table dialog
This adds support for changing the names of existing constraints in the Edit Table dialog. It should be possible to extend the code to allow further modifications of the constraints. As a minor change, this commit makes the SQL column of the constraints table read only.
1 parent 335999e commit cd748d0

2 files changed

Lines changed: 42 additions & 13 deletions

File tree

src/EditTableDialog.cpp

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
#include <QKeyEvent>
1313
#include <algorithm>
1414

15+
Q_DECLARE_METATYPE(sqlb::ConstraintPtr)
16+
Q_DECLARE_METATYPE(sqlb::StringVector)
17+
1518
EditTableDialog::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

112116
void 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

168170
void 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+
610636
void EditTableDialog::addField()
611637
{
612638
QTreeWidgetItem *tbitem = new QTreeWidgetItem(ui->treeWidget);

src/EditTableDialog.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@
99
#include <QDialog>
1010

1111
class DBBrowserDB;
12-
class QTreeWidgetItem;
1312
class ForeignKeyEditorDelegate;
1413

14+
class QTableWidgetItem;
15+
class QTreeWidgetItem;
16+
1517
namespace Ui {
1618
class EditTableDialog;
1719
}
@@ -61,7 +63,8 @@ private slots:
6163
void accept() override;
6264
void reject() override;
6365
void checkInput();
64-
void itemChanged(QTreeWidgetItem* item, int column);
66+
void fieldItemChanged(QTreeWidgetItem* item, int column);
67+
void constraintItemChanged(QTableWidgetItem* item);
6568
void updateTypes(QObject *object);
6669
bool eventFilter(QObject *object, QEvent *event) override;
6770
void updateTypes();

0 commit comments

Comments
 (0)