Skip to content

Commit db17cd9

Browse files
cristilupascuMKleusberg
authored andcommitted
Add Insert for Views using AddRecordDialog (#141)
1 parent b4af221 commit db17cd9

File tree

3 files changed

+34
-14
lines changed

3 files changed

+34
-14
lines changed

src/AddRecordDialog.cpp

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -112,12 +112,12 @@ class EditDelegate: public QStyledItemDelegate {
112112
}
113113
};
114114

115-
AddRecordDialog::AddRecordDialog(DBBrowserDB& db, const sqlb::ObjectIdentifier& tableName, QWidget* parent)
115+
AddRecordDialog::AddRecordDialog(DBBrowserDB& db, const sqlb::ObjectIdentifier& tableName, QWidget* parent, const QString &pseudo_pk)
116116
: QDialog(parent),
117117
ui(new Ui::AddRecordDialog),
118118
pdb(db),
119119
curTable(tableName),
120-
m_table(*(pdb.getObjectByName<sqlb::Table>(curTable)))
120+
pseudo_pk(pseudo_pk)
121121
{
122122
// Create UI
123123
ui->setupUi(this);
@@ -179,10 +179,28 @@ void AddRecordDialog::populateFields()
179179
ui->treeWidget->setItemDelegateForColumn(kType, new NoEditDelegate(this));
180180
ui->treeWidget->setItemDelegateForColumn(kValue, new EditDelegate(this));
181181

182-
const auto& fields = m_table.fields;
183-
const QStringList& pk = m_table.primaryKey();
184-
for(const sqlb::Field& f : fields)
182+
sqlb::FieldVector fields;
183+
QVector<sqlb::ConstraintPtr> fks;
184+
QStringList pk;
185+
186+
// Initialize fields, fks and pk differently depending on whether it's a table or a view.
187+
if (pseudo_pk.isNull())
188+
{
189+
sqlb::TablePtr m_table = pdb.getObjectByName<sqlb::Table>(curTable);
190+
fields = m_table->fields;
191+
for(const sqlb::Field& f : fields)
192+
fks.append(m_table->constraint({f.name()}, sqlb::Constraint::ForeignKeyConstraintType));
193+
pk = m_table->primaryKey();
194+
} else {
195+
sqlb::ViewPtr m_view = pdb.getObjectByName<sqlb::View>(curTable);
196+
fields = m_view->fields;
197+
fks.fill(sqlb::ConstraintPtr(nullptr), fields.size());
198+
pk = QStringList(pseudo_pk);
199+
}
200+
201+
for(uint i = 0; i < fields.size(); i++)
185202
{
203+
const sqlb::Field& f = fields[i];
186204
QTreeWidgetItem *tbitem = new QTreeWidgetItem(ui->treeWidget);
187205

188206
tbitem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsEditable);
@@ -199,7 +217,7 @@ void AddRecordDialog::populateFields()
199217
}
200218
if (contains(pk, f.name()))
201219
tbitem->setIcon(kName, QIcon(":/icons/field_key"));
202-
else if (m_table.constraint({f.name()}, sqlb::Constraint::ForeignKeyConstraintType))
220+
else if (fks[i])
203221
tbitem->setIcon(kName, QIcon(":/icons/field_fk"));
204222
else
205223
tbitem->setIcon(kName, QIcon(":/icons/field"));
@@ -216,7 +234,7 @@ void AddRecordDialog::populateFields()
216234
if (!f.check().isEmpty())
217235
toolTip.append(tr("Check constraint:\t %1\n").arg (f.check()));
218236

219-
auto fk = std::dynamic_pointer_cast<sqlb::ForeignKeyClause>(m_table.constraint({f.name()}, sqlb::Constraint::ForeignKeyConstraintType));
237+
auto fk = std::dynamic_pointer_cast<sqlb::ForeignKeyClause>(fks[i]);
220238
if(fk)
221239
toolTip.append(tr("Foreign key:\t %1\n").arg(fk->toString()));
222240

src/AddRecordDialog.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class AddRecordDialog : public QDialog
1919
Q_OBJECT
2020

2121
public:
22-
explicit AddRecordDialog(DBBrowserDB& pdb, const sqlb::ObjectIdentifier& tableName, QWidget* parent = nullptr);
22+
explicit AddRecordDialog(DBBrowserDB& pdb, const sqlb::ObjectIdentifier& tableName, QWidget* parent = nullptr, const QString& pseudo_pk = QString());
2323
~AddRecordDialog() override;
2424

2525
protected:
@@ -46,7 +46,7 @@ private slots:
4646
Ui::AddRecordDialog* ui;
4747
DBBrowserDB& pdb;
4848
sqlb::ObjectIdentifier curTable;
49-
sqlb::Table m_table;
49+
QString pseudo_pk;
5050
};
5151

5252
#endif

src/MainWindow.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -958,7 +958,8 @@ void MainWindow::addRecord()
958958
{
959959
int row = m_browseTableModel->rowCount();
960960

961-
if(m_browseTableModel->insertRow(row))
961+
// If table has pseudo_pk, then it must be an editable view. Jump straight to inserting by pop-up dialog.
962+
if(!m_browseTableModel->hasPseudoPk() && m_browseTableModel->insertRow(row))
962963
{
963964
selectTableLine(row);
964965
} else {
@@ -970,7 +971,8 @@ void MainWindow::addRecord()
970971

971972
void MainWindow::insertValues()
972973
{
973-
AddRecordDialog dialog(db, currentlyBrowsedTableName(), this);
974+
QString pseudo_pk = m_browseTableModel->hasPseudoPk() ? m_browseTableModel->pseudoPk() : QString();
975+
AddRecordDialog dialog(db, currentlyBrowsedTableName(), this, pseudo_pk);
974976
if (dialog.exec())
975977
populateTable();
976978
}
@@ -1296,7 +1298,7 @@ void MainWindow::doubleClickTable(const QModelIndex& index)
12961298
return;
12971299
}
12981300

1299-
// * Don't allow editing of other objects than tables (on the browse table) *
1301+
// * Don't allow editing of other objects than tables and editable views
13001302
bool isEditingAllowed = !db.readOnly() && m_currentTabTableModel == m_browseTableModel &&
13011303
m_browseTableModel->isEditable();
13021304

@@ -1324,7 +1326,7 @@ void MainWindow::dataTableSelectionChanged(const QModelIndex& index)
13241326
bool editingAllowed = !db.readOnly() && (m_currentTabTableModel == m_browseTableModel) &&
13251327
m_browseTableModel->isEditable();
13261328

1327-
// Don't allow editing of other objects than tables
1329+
// Don't allow editing of other objects than tables and editable views
13281330
editDock->setReadOnly(!editingAllowed);
13291331

13301332
// If the Edit Cell dock is visible, load the new value into it
@@ -3754,7 +3756,7 @@ void MainWindow::updateInsertDeleteRecordButton()
37543756
// at least one row to be selected. For the insert button there is an extra rule to disable it when we are browsing a view because inserting
37553757
// into a view isn't supported yet.
37563758
bool isEditable = m_browseTableModel->isEditable() && !db.readOnly();
3757-
ui->actionNewRecord->setEnabled(isEditable && !m_browseTableModel->hasPseudoPk());
3759+
ui->actionNewRecord->setEnabled(isEditable);
37583760
ui->actionDeleteRecord->setEnabled(isEditable && rows != 0);
37593761

37603762
if(rows > 1)

0 commit comments

Comments
 (0)