From 00b9f4027124efa9e2a135982cafb82766d9418f Mon Sep 17 00:00:00 2001 From: Martin Kleusberg Date: Sat, 6 Apr 2013 23:12:53 +0200 Subject: [PATCH] SqliteTableModel: Make editing of data possible again --- src/MainWindow.cpp | 27 ++++++--------------------- src/MainWindow.h | 2 +- src/MainWindow.ui | 3 +++ src/sqlitedb.cpp | 32 ++++++++++++++++++++++++++++++++ src/sqlitedb.h | 1 + src/sqlitetablemodel.cpp | 33 ++++++++++++++++++++++++++++++++- src/sqlitetablemodel.h | 5 +++++ 7 files changed, 80 insertions(+), 23 deletions(-) diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 3da472a6..75eccfde 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -104,7 +104,7 @@ void MainWindow::init() connect(ui->dataTable->horizontalHeader(), SIGNAL(sectionClicked(int)), this, SLOT(browseTableHeaderClicked(int))); connect(ui->dataTable->verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(setRecordsetLabel())); connect(editWin, SIGNAL(goingAway()), this, SLOT(editWinAway())); - connect(editWin, SIGNAL(updateRecordText(int, int, QByteArray)), this, SLOT(updateRecordText(int, int , QByteArray))); + connect(editWin, SIGNAL(updateRecordText(int, int, QByteArray)), this, SLOT(updateRecordText(int, int, QByteArray))); // Load window settings restoreGeometry(PreferencesDialog::getSettingsValue("MainWindow", "geometry").toByteArray()); @@ -277,7 +277,7 @@ void MainWindow::populateTable( const QString & tablename, bool keepColumnWidths { QApplication::setOverrideCursor( Qt::WaitCursor ); if(!tablename.isEmpty()) - m_browseTableModel->setQuery(QString("SELECT * FROM `%1`").arg(tablename)); + m_browseTableModel->setTable(tablename); // bool mustreset = false; // if (tablename.compare(db.curBrowseTableName)!=0) // { @@ -706,18 +706,7 @@ void MainWindow::helpAbout() void MainWindow::updateRecordText(int row, int col, const QByteArray& newtext) { - if (!db.updateRecord(row, col, newtext)){ - QMessageBox::information( this, QApplication::applicationName(), - tr("Data could not be updated:\n") + db.lastErrorMessage); - } - - rowList tab = db.browseRecs; - QList& rt = tab[row]; - QByteArray& cv = rt[col+1];//must account for rowid - - QStandardItem* item = new QStandardItem(QString(cv)); - item->setToolTip( wrapText(cv) ); - browseTableModel->setItem(row, col, item); + m_browseTableModel->setData(m_browseTableSortProxy->mapToSource(m_browseTableSortProxy->index(row, col)), newtext); } void MainWindow::editWinAway() @@ -727,13 +716,9 @@ void MainWindow::editWinAway() ui->dataTable->setCurrentIndex(ui->dataTable->currentIndex().sibling(editWin->getCurrentRow(), editWin->getCurrentCol())); } -void MainWindow::editText(int row, int col) +void MainWindow::editText(const QModelIndex& index) { - rowList tab = db.browseRecs; - QList rt = tab[row]; - QByteArray cv = rt[col+1];//must account for rowid - - editWin->loadText(cv , row, col); + editWin->loadText(index.data().toByteArray(), index.row(), index.column()); editWin->show(); } @@ -749,7 +734,7 @@ void MainWindow::doubleClickTable(const QModelIndex& index) if(db.getObjectByName(ui->comboBrowseTable->currentText()).gettype() != "table") return; - editText(index.row(), index.column()); + editText(index); } /* diff --git a/src/MainWindow.h b/src/MainWindow.h index 65905314..ef63b4ef 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -125,7 +125,7 @@ private slots: virtual void helpAbout(); virtual void updateRecordText(int row, int col, const QByteArray& newtext); virtual void editWinAway(); - virtual void editText( int row, int col ); + virtual void editText(const QModelIndex& index); virtual void doubleClickTable(const QModelIndex& index); virtual void executeQuery(); virtual void importTableFromCSV(); diff --git a/src/MainWindow.ui b/src/MainWindow.ui index 57bfb24a..b6a1995d 100644 --- a/src/MainWindow.ui +++ b/src/MainWindow.ui @@ -205,6 +205,9 @@ This is the database view. You can double-click any record to edit its contents in the cell editor window. + + QAbstractItemView::NoEditTriggers + QAbstractItemView::ExtendedSelection diff --git a/src/sqlitedb.cpp b/src/sqlitedb.cpp index 195d93c7..c64bb4ae 100644 --- a/src/sqlitedb.cpp +++ b/src/sqlitedb.cpp @@ -475,6 +475,38 @@ bool DBBrowserDB::updateRecord(int wrow, int wcol, const QByteArray& wtext) } } +bool DBBrowserDB::updateRecord(const QString& table, const QString& column, int row, const QByteArray& value) +{ + if (!isOpen()) return false; + + lastErrorMessage = QString("no error"); + + QString sql = QString("UPDATE `%1` SET `%2`=? WHERE rowid=%3;").arg(table).arg(column).arg(row); + + logSQL(sql, kLogMsg_App); + setRestorePoint(); + + sqlite3_stmt* stmt; + int success = 1; + if(sqlite3_prepare_v2(_db, sql.toUtf8(), -1, &stmt, 0) != SQLITE_OK) + success = 0; + if(success == 1 && sqlite3_bind_text(stmt, 1, value.constData(), value.length(), SQLITE_STATIC) != SQLITE_OK) + success = -1; + if(success == 1 && sqlite3_step(stmt) != SQLITE_DONE) + success = -1; + if(success != 0 && sqlite3_finalize(stmt) != SQLITE_OK) + success = -1; + + if(success == 1) + { + return true; + } else { + lastErrorMessage = sqlite3_errmsg(_db); + qCritical() << "updateRecord: " << lastErrorMessage; + return false; + } +} + bool DBBrowserDB::browseTable( const QString & tablename, const QString& orderby ) { QStringList testFields = getTableFields( tablename ); diff --git a/src/sqlitedb.h b/src/sqlitedb.h index bccc0cc2..f1796b54 100644 --- a/src/sqlitedb.h +++ b/src/sqlitedb.h @@ -101,6 +101,7 @@ public: void updateSchema() ; bool addRecord(const QString& sTableName); bool deleteRecord(int wrow); + bool updateRecord(const QString& table, const QString& column, int row, const QByteArray& value); bool updateRecord(int wrow, int wcol, const QByteArray& wtext); bool browseTable( const QString & tablename, const QString& orderby = "rowid" ); diff --git a/src/sqlitetablemodel.cpp b/src/sqlitetablemodel.cpp index acbb8ab4..8c7e9360 100644 --- a/src/sqlitetablemodel.cpp +++ b/src/sqlitetablemodel.cpp @@ -1,5 +1,4 @@ #include "sqlitetablemodel.h" - #include "sqlitedb.h" #include @@ -18,6 +17,12 @@ void SqliteTableModel::setChunkSize(size_t chunksize) m_chunkSize = chunksize; } +void SqliteTableModel::setTable(const QString& table) +{ + m_sTable = table; + setQuery(QString("SELECT * FROM `%1`").arg(table)); +} + void SqliteTableModel::setQuery(const QString& sQuery) { if(!m_db->isOpen()) @@ -116,6 +121,24 @@ QVariant SqliteTableModel::data(const QModelIndex &index, int role) const return QVariant(); } +bool SqliteTableModel::setData(const QModelIndex& index, const QVariant& value, int role) +{ + if(index.isValid() && role == Qt::EditRole) + { + m_data[index.row()].replace(index.column(), value.toString()); + + if(m_db->updateRecord(m_sTable, m_headers.at(index.column()), index.row()+1, value.toByteArray())) + { + emit(dataChanged(index, index)); + return true; + } else { + return false; + } + } + + return false; +} + bool SqliteTableModel::canFetchMore(const QModelIndex &parent) const { return m_data.size() < m_rowCount; @@ -150,3 +173,11 @@ void SqliteTableModel::fetchMore(const QModelIndex& parent) beginInsertRows(parent, currentsize, m_data.size()); endInsertRows(); } + +Qt::ItemFlags SqliteTableModel::flags(const QModelIndex& index) const +{ + if(!index.isValid()) + return Qt::ItemIsEnabled; + + return QAbstractTableModel::flags(index) | Qt::ItemIsEditable; +} diff --git a/src/sqlitetablemodel.h b/src/sqlitetablemodel.h index e0accf8d..35614564 100644 --- a/src/sqlitetablemodel.h +++ b/src/sqlitetablemodel.h @@ -16,13 +16,17 @@ public: int columnCount(const QModelIndex &parent) const; QVariant headerData(int section, Qt::Orientation orientation, int role) const; QVariant data(const QModelIndex &index, int role) const; + bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole); bool canFetchMore(const QModelIndex &parent) const; void fetchMore(const QModelIndex &parent); size_t queryMore(size_t offset); void setQuery(const QString& sQuery); + void setTable(const QString& table); void setChunkSize(size_t chunksize); + Qt::ItemFlags flags(const QModelIndex& index) const; + signals: public slots: @@ -35,6 +39,7 @@ private: QStringList m_headers; QMap m_data; QString m_sQuery; + QString m_sTable; size_t m_chunkSize; };