From 3f60142abc0509c39eaa72d6f1b25a388cd59b68 Mon Sep 17 00:00:00 2001 From: Martin Kleusberg Date: Sat, 27 Jul 2019 12:36:46 +0200 Subject: [PATCH] Support deleting table constraints in Edit Table dialog This adds support for deleting table constraints in the Edit Table dialog. --- src/EditTableDialog.cpp | 29 +++++++++++++++++++++++++++-- src/EditTableDialog.h | 1 + src/EditTableDialog.ui | 17 +++++++++++++++++ src/sql/sqlitetypes.cpp | 14 ++++++++++++++ src/sql/sqlitetypes.h | 3 ++- 5 files changed, 61 insertions(+), 3 deletions(-) diff --git a/src/EditTableDialog.cpp b/src/EditTableDialog.cpp index fcbbfc0b..635f9a50 100644 --- a/src/EditTableDialog.cpp +++ b/src/EditTableDialog.cpp @@ -30,9 +30,8 @@ EditTableDialog::EditTableDialog(DBBrowserDB& db, const sqlb::ObjectIdentifier& connect(ui->treeWidget, &QTreeWidget::itemChanged, this, &EditTableDialog::fieldItemChanged); connect(ui->tableConstraints, &QTableWidget::itemChanged, this, &EditTableDialog::constraintItemChanged); - // TODO Remove this once we have added support for these buttons + // TODO Remove this once we have added support for this button ui->buttonAddConstraint->setVisible(false); - ui->buttonRemoveConstraint->setVisible(false); // Set item delegate for foreign key column m_fkEditorDelegate = new ForeignKeyEditorDelegate(db, m_table, this); @@ -69,6 +68,12 @@ EditTableDialog::EditTableDialog(DBBrowserDB& db, const sqlb::ObjectIdentifier& ui->labelEditWarning->setVisible(false); } + // Enable/disable remove constraint button depending on whether a constraint is selected + connect(ui->tableConstraints, &QTableWidget::itemSelectionChanged, [this]() { + bool hasSelection = ui->tableConstraints->selectionModel()->hasSelection(); + ui->buttonRemoveConstraint->setEnabled(hasSelection); + }); + // And create a savepoint pdb.setSavepoint(m_sRestorePointName); @@ -818,3 +823,23 @@ void EditTableDialog::changeSchema(const QString& /*schema*/) // Update the SQL preview updateSqlText(); } + +void EditTableDialog::removeConstraint() +{ + // Is there any item selected to delete? + if(!ui->tableConstraints->currentItem()) + return; + + // Find constraint to delete + int row = ui->tableConstraints->currentRow(); + sqlb::StringVector columns = ui->tableConstraints->item(row, kConstraintColumns)->data(Qt::UserRole).value(); + sqlb::ConstraintPtr constraint = ui->tableConstraints->item(row, kConstraintName)->data(Qt::UserRole).value(); + + // Remove the constraint. If there is more than one constraint with this combination of columns and constraint type, only delete the first one. + m_table.removeConstraint(columns, constraint); + ui->tableConstraints->removeRow(ui->tableConstraints->currentRow()); + + // Update SQL and view + updateSqlText(); + populateFields(); +} diff --git a/src/EditTableDialog.h b/src/EditTableDialog.h index c579a615..1a77695b 100644 --- a/src/EditTableDialog.h +++ b/src/EditTableDialog.h @@ -72,6 +72,7 @@ private slots: void moveDown(); void setWithoutRowid(bool without_rowid); void changeSchema(const QString& schema); + void removeConstraint(); private: Ui::EditTableDialog* ui; diff --git a/src/EditTableDialog.ui b/src/EditTableDialog.ui index 987d9d36..6dcf8637 100644 --- a/src/EditTableDialog.ui +++ b/src/EditTableDialog.ui @@ -618,6 +618,22 @@ + + buttonRemoveConstraint + clicked() + EditTableDialog + removeConstraint() + + + 186 + 155 + + + 647 + 157 + + + fieldSelectionChanged() @@ -630,5 +646,6 @@ moveDown() setWithoutRowid(bool) changeSchema(QString) + removeConstraint() diff --git a/src/sql/sqlitetypes.cpp b/src/sql/sqlitetypes.cpp index 444a4551..ea41a00a 100644 --- a/src/sql/sqlitetypes.cpp +++ b/src/sql/sqlitetypes.cpp @@ -509,6 +509,20 @@ void Table::setConstraint(const StringVector& vStrFields, ConstraintPtr constrai addConstraint(vStrFields, constraint); } +void Table::removeConstraint(const StringVector& vStrFields, ConstraintPtr constraint) +{ + for(auto it = m_constraints.begin();it!=m_constraints.end();++it) + { + if(it->first == vStrFields && it->second->toSql(vStrFields) == constraint->toSql(vStrFields)) + { + m_constraints.erase(it); + + // Only remove the first constraint matching these criteria + return; + } + } +} + void Table::removeConstraints(const StringVector& vStrFields, Constraint::ConstraintTypes type) { for(auto it = m_constraints.begin();it!=m_constraints.end();) diff --git a/src/sql/sqlitetypes.h b/src/sql/sqlitetypes.h index 20be76fa..8b39de40 100644 --- a/src/sql/sqlitetypes.h +++ b/src/sql/sqlitetypes.h @@ -337,7 +337,8 @@ public: void addConstraint(const StringVector& vStrFields, ConstraintPtr constraint); void setConstraint(const StringVector& vStrFields, ConstraintPtr constraint); - void removeConstraints(const StringVector& vStrFields = StringVector(), Constraint::ConstraintTypes type = Constraint::NoType); //! Only removes the first constraint, if any + void removeConstraint(const StringVector& vStrFields, ConstraintPtr constraint); + void removeConstraints(const StringVector& vStrFields = StringVector(), Constraint::ConstraintTypes type = Constraint::NoType); ConstraintPtr constraint(const StringVector& vStrFields = StringVector(), Constraint::ConstraintTypes type = Constraint::NoType) const; //! Only returns the first constraint, if any std::vector constraints(const StringVector& vStrFields = StringVector(), Constraint::ConstraintTypes type = Constraint::NoType) const; ConstraintMap allConstraints() const { return m_constraints; }