mirror of
https://github.com/sqlitebrowser/sqlitebrowser.git
synced 2026-01-20 02:50:46 -06:00
Fix view updating after remove field in edittable dialog
rename the FieldList typedef to FieldVector use a object instead of a table pointer in edittable dialog
This commit is contained in:
@@ -6,7 +6,6 @@
|
||||
#include <QComboBox>
|
||||
|
||||
#include "sqlitedb.h"
|
||||
#include "sqlitetypes.h"
|
||||
|
||||
#include <QDebug>
|
||||
|
||||
@@ -14,7 +13,8 @@ EditTableDialog::EditTableDialog(DBBrowserDB* db, const QString& tableName, QWid
|
||||
: QDialog(parent),
|
||||
ui(new Ui::EditTableDialog),
|
||||
pdb(db),
|
||||
curTable(tableName)
|
||||
curTable(tableName),
|
||||
m_table(tableName)
|
||||
{
|
||||
// Create UI
|
||||
ui->setupUi(this);
|
||||
@@ -27,13 +27,9 @@ EditTableDialog::EditTableDialog(DBBrowserDB* db, const QString& tableName, QWid
|
||||
// Existing table, so load and set the current layout
|
||||
QString sTablesql = pdb->getTableSQL(curTable);
|
||||
//qDebug() << sTablesql;
|
||||
m_table = new sqlb::Table(sqlb::Table::parseSQL(sTablesql));
|
||||
m_table = sqlb::Table::parseSQL(sTablesql);
|
||||
populateFields();
|
||||
}
|
||||
else
|
||||
{
|
||||
m_table = new sqlb::Table(tableName);
|
||||
}
|
||||
|
||||
// And create a savepoint
|
||||
pdb->executeSQL(QString("SAVEPOINT edittable_%1_save;").arg(curTable), false);
|
||||
@@ -43,16 +39,10 @@ EditTableDialog::EditTableDialog(DBBrowserDB* db, const QString& tableName, QWid
|
||||
updateColumnWidth();
|
||||
|
||||
checkInput();
|
||||
|
||||
//connect itemchanged signal now
|
||||
//if we do it before populateFields additem will interfere
|
||||
connect(ui->treeWidget, SIGNAL(itemChanged(QTreeWidgetItem*,int)),this,SLOT(itemChanged(QTreeWidgetItem*,int)));
|
||||
|
||||
}
|
||||
|
||||
EditTableDialog::~EditTableDialog()
|
||||
{
|
||||
delete m_table;
|
||||
delete ui;
|
||||
}
|
||||
|
||||
@@ -67,7 +57,13 @@ void EditTableDialog::updateColumnWidth()
|
||||
|
||||
void EditTableDialog::populateFields()
|
||||
{
|
||||
sqlb::FieldList fields = m_table->fields();
|
||||
// disconnect the itemChanged signal or the table item will
|
||||
// be updated while filling the treewidget
|
||||
disconnect(ui->treeWidget, SIGNAL(itemChanged(QTreeWidgetItem*,int)),
|
||||
this,SLOT(itemChanged(QTreeWidgetItem*,int)));
|
||||
|
||||
ui->treeWidget->clear();
|
||||
sqlb::FieldVector fields = m_table.fields();
|
||||
foreach(sqlb::FieldPtr f, fields)
|
||||
{
|
||||
QTreeWidgetItem *tbitem = new QTreeWidgetItem(ui->treeWidget);
|
||||
@@ -88,10 +84,13 @@ void EditTableDialog::populateFields()
|
||||
ui->treeWidget->setItemWidget(tbitem, kType, typeBox);
|
||||
|
||||
tbitem->setCheckState(kNotNull, f->notnull() ? Qt::Checked : Qt::Unchecked);
|
||||
tbitem->setCheckState(kPrimaryKey, m_table->primarykey().contains(f) ? Qt::Checked : Qt::Unchecked);
|
||||
tbitem->setCheckState(kPrimaryKey, m_table.primarykey().contains(f) ? Qt::Checked : Qt::Unchecked);
|
||||
tbitem->setCheckState(kAutoIncrement, f->autoIncrement() ? Qt::Checked : Qt::Unchecked);
|
||||
ui->treeWidget->addTopLevelItem(tbitem);
|
||||
}
|
||||
|
||||
// and reconnect
|
||||
connect(ui->treeWidget, SIGNAL(itemChanged(QTreeWidgetItem*,int)),this,SLOT(itemChanged(QTreeWidgetItem*,int)));
|
||||
}
|
||||
|
||||
void EditTableDialog::accept()
|
||||
@@ -102,7 +101,7 @@ void EditTableDialog::accept()
|
||||
{
|
||||
// Creation of new table
|
||||
// we commit immediatly so no need to setdirty
|
||||
if(!pdb->executeSQL(m_table->sql(), false))
|
||||
if(!pdb->executeSQL(m_table.sql(), false))
|
||||
{
|
||||
QMessageBox::warning(
|
||||
this,
|
||||
@@ -145,13 +144,13 @@ void EditTableDialog::reject()
|
||||
void EditTableDialog::updateSqlText()
|
||||
{
|
||||
ui->sqlTextEdit->clear();
|
||||
ui->sqlTextEdit->insertPlainText(m_table->sql());
|
||||
ui->sqlTextEdit->insertPlainText(m_table.sql());
|
||||
}
|
||||
|
||||
void EditTableDialog::updateTableObject()
|
||||
{
|
||||
sqlb::FieldList fields;
|
||||
sqlb::FieldList pk;
|
||||
sqlb::FieldVector fields;
|
||||
sqlb::FieldVector pk;
|
||||
for(int i = 0; i < ui->treeWidget->topLevelItemCount(); ++i)
|
||||
{
|
||||
QTreeWidgetItem* item = ui->treeWidget->topLevelItem(i);
|
||||
@@ -170,8 +169,8 @@ void EditTableDialog::updateTableObject()
|
||||
fields.append(f);
|
||||
}
|
||||
|
||||
m_table->setFields(fields);
|
||||
m_table->setPrimaryKey(pk);
|
||||
m_table.setFields(fields);
|
||||
m_table.setPrimaryKey(pk);
|
||||
}
|
||||
|
||||
void EditTableDialog::checkInput()
|
||||
@@ -183,7 +182,7 @@ void EditTableDialog::checkInput()
|
||||
valid = false;
|
||||
if(ui->treeWidget->topLevelItemCount() == 0)
|
||||
valid = false;
|
||||
m_table->setName(normTableName);
|
||||
m_table.setName(normTableName);
|
||||
updateSqlText();
|
||||
ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(valid);
|
||||
}
|
||||
@@ -197,7 +196,7 @@ void EditTableDialog::updateTypes()
|
||||
QString sType = "INTEGER";
|
||||
if(typeBox)
|
||||
sType = typeBox->currentText();
|
||||
m_table->fields().at(i)->setType(sType);
|
||||
m_table.fields().at(i)->setType(sType);
|
||||
}
|
||||
checkInput();
|
||||
}
|
||||
@@ -205,9 +204,9 @@ void EditTableDialog::updateTypes()
|
||||
void EditTableDialog::itemChanged(QTreeWidgetItem *item, int column)
|
||||
{
|
||||
int index = ui->treeWidget->indexOfTopLevelItem(item);
|
||||
if(index < m_table->fields().count())
|
||||
if(index < m_table.fields().count())
|
||||
{
|
||||
sqlb::FieldPtr field = m_table->fields().at(index);
|
||||
sqlb::FieldPtr field = m_table.fields().at(index);
|
||||
switch(column)
|
||||
{
|
||||
case kName:
|
||||
@@ -224,12 +223,16 @@ void EditTableDialog::itemChanged(QTreeWidgetItem *item, int column)
|
||||
break;
|
||||
case kPrimaryKey:
|
||||
{
|
||||
sqlb::FieldList pks = m_table->primarykey();
|
||||
sqlb::FieldVector pks = m_table.primarykey();
|
||||
if(item->checkState(column) == Qt::Checked)
|
||||
pks.append(field);
|
||||
else
|
||||
pks.remove(pks.indexOf(field));
|
||||
m_table->setPrimaryKey(pks);
|
||||
{
|
||||
int index = pks.indexOf(field);
|
||||
if(index != -1)
|
||||
pks.remove(index);
|
||||
}
|
||||
m_table.setPrimaryKey(pks);
|
||||
}
|
||||
break;
|
||||
case kNotNull:
|
||||
@@ -269,7 +272,7 @@ void EditTableDialog::addField()
|
||||
tbitem->text(kName),
|
||||
typeBox->currentText()
|
||||
));
|
||||
m_table->addField(f);
|
||||
m_table.addField(f);
|
||||
|
||||
checkInput();
|
||||
}
|
||||
@@ -286,9 +289,9 @@ void EditTableDialog::removeField()
|
||||
// Creating a new one
|
||||
|
||||
// Just delete that item. At this point there is no DB table to edit or data to be lost anyway
|
||||
sqlb::FieldList fields = m_table->fields();
|
||||
sqlb::FieldVector fields = m_table.fields();
|
||||
fields.remove(ui->treeWidget->indexOfTopLevelItem(ui->treeWidget->currentItem()));
|
||||
m_table->setFields(fields);
|
||||
m_table.setFields(fields);
|
||||
delete ui->treeWidget->currentItem();
|
||||
} else {
|
||||
// Editing an old one
|
||||
@@ -304,10 +307,9 @@ void EditTableDialog::removeField()
|
||||
} else {
|
||||
//relayout
|
||||
QString sTablesql = pdb->getTableSQL(curTable);
|
||||
m_table = new sqlb::Table(sqlb::Table::parseSQL(sTablesql));
|
||||
qDebug() << sTablesql;
|
||||
m_table = sqlb::Table::parseSQL(sTablesql);
|
||||
populateFields();
|
||||
|
||||
delete ui->treeWidget->currentItem();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,15 +1,13 @@
|
||||
#ifndef __EDITTABLEDIALOG_H__
|
||||
#define __EDITTABLEDIALOG_H__
|
||||
|
||||
#include "sqlitetypes.h"
|
||||
|
||||
#include <QDialog>
|
||||
class DBBrowserDB;
|
||||
class SQLiteSyntaxHighlighter;
|
||||
class QTreeWidgetItem;
|
||||
|
||||
namespace sqlb {
|
||||
class Table;
|
||||
}
|
||||
|
||||
namespace Ui {
|
||||
class EditTableDialog;
|
||||
}
|
||||
@@ -50,7 +48,7 @@ private:
|
||||
Ui::EditTableDialog* ui;
|
||||
DBBrowserDB* pdb;
|
||||
QString curTable;
|
||||
sqlb::Table* m_table;
|
||||
sqlb::Table m_table;
|
||||
QStringList types;
|
||||
QStringList fields;
|
||||
SQLiteSyntaxHighlighter* m_sqliteSyntaxHighlighter;
|
||||
|
||||
@@ -68,9 +68,8 @@ void Table::addField(const FieldPtr& f)
|
||||
m_fields.append(FieldPtr(f));
|
||||
}
|
||||
|
||||
void Table::setFields(const FieldList &fields)
|
||||
void Table::setFields(const FieldVector &fields)
|
||||
{
|
||||
m_primarykey.clear();
|
||||
clear();
|
||||
m_fields = fields;
|
||||
}
|
||||
@@ -85,7 +84,7 @@ int Table::findField(const QString &sname)
|
||||
return -1;
|
||||
}
|
||||
|
||||
bool Table::setPrimaryKey(const FieldList& pk)
|
||||
bool Table::setPrimaryKey(const FieldVector& pk)
|
||||
{
|
||||
foreach(FieldPtr f, pk) {
|
||||
if(!m_fields.contains(f))
|
||||
@@ -166,7 +165,7 @@ QString Table::sql() const
|
||||
if( m_primarykey.size() > 0 && !hasAutoIncrement())
|
||||
{
|
||||
sql += ",\n\tPRIMARY KEY(";
|
||||
for(FieldList::ConstIterator it = m_primarykey.constBegin();
|
||||
for(FieldVector::ConstIterator it = m_primarykey.constBegin();
|
||||
it != m_primarykey.constEnd();
|
||||
++it)
|
||||
{
|
||||
@@ -221,7 +220,7 @@ Table CreateTableWalker::table()
|
||||
s = s->getNextSibling(); // first column name
|
||||
antlr::RefAST column = s;
|
||||
// loop columndefs
|
||||
FieldList pks;
|
||||
FieldVector pks;
|
||||
while(column != antlr::nullAST && column->getType() == sqlite3TokenTypes::COLUMNDEF)
|
||||
{
|
||||
FieldPtr f;
|
||||
|
||||
@@ -56,7 +56,7 @@ private:
|
||||
};
|
||||
|
||||
typedef QSharedPointer<Field> FieldPtr;
|
||||
typedef QVector< FieldPtr > FieldList;
|
||||
typedef QVector< FieldPtr > FieldVector;
|
||||
class Table
|
||||
{
|
||||
public:
|
||||
@@ -66,12 +66,12 @@ public:
|
||||
void setName(const QString& name) { m_name = name; }
|
||||
|
||||
const QString& name() const { return m_name; }
|
||||
const FieldList& fields() const { return m_fields; }
|
||||
const FieldList& primarykey() const { return m_primarykey; }
|
||||
const FieldVector& fields() const { return m_fields; }
|
||||
const FieldVector& primarykey() const { return m_primarykey; }
|
||||
QString sql() const;
|
||||
|
||||
void addField(const FieldPtr& f);
|
||||
void setFields(const FieldList& fields);
|
||||
void setFields(const FieldVector& fields);
|
||||
void clear();
|
||||
/**
|
||||
* @brief findField Finds a field and returns the index.
|
||||
@@ -81,19 +81,18 @@ public:
|
||||
*/
|
||||
int findField(const QString& sname);
|
||||
|
||||
bool setPrimaryKey(const FieldList& pk);
|
||||
bool setPrimaryKey(const FieldVector& pk);
|
||||
bool setPrimaryKey(FieldPtr pk, bool autoincrement = false);
|
||||
|
||||
static Table parseSQL(const QString& sSQL);
|
||||
|
||||
private:
|
||||
QStringList fieldList() const;
|
||||
bool hasAutoIncrement() const;
|
||||
|
||||
private:
|
||||
QString m_name;
|
||||
FieldList m_fields;
|
||||
FieldList m_primarykey;
|
||||
FieldVector m_fields;
|
||||
FieldVector m_primarykey;
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -24,7 +24,7 @@ void TestTable::sqlOutput()
|
||||
tt.addField(f);
|
||||
tt.addField(FieldPtr(new Field("car", "text")));
|
||||
tt.addField(fkm);
|
||||
FieldList pk;
|
||||
FieldVector pk;
|
||||
pk.append(f);
|
||||
pk.append(fkm);
|
||||
tt.setPrimaryKey(pk);
|
||||
|
||||
Reference in New Issue
Block a user