diff options
Diffstat (limited to 'seriestreemodel.cpp')
-rw-r--r-- | seriestreemodel.cpp | 120 |
1 files changed, 81 insertions, 39 deletions
diff --git a/seriestreemodel.cpp b/seriestreemodel.cpp index 0edbd8e..eb6022b 100644 --- a/seriestreemodel.cpp +++ b/seriestreemodel.cpp @@ -24,6 +24,8 @@ SeriesTreeModel::SeriesTreeModel(QStringList &headers, QObject *parent) : SmTree mUpdateSeriesNameQuery->prepare("UPDATE series SET tseries_name = :newname WHERE iseries_id = :id"); mDeleteSeriesQuery = new QSqlQuery(mDb); mDeleteSeriesQuery->prepare("DELETE FROM series where iseries_id = :id"); + mSeriesInsertQuery = new QSqlQuery(mDb); + mSeriesInsertQuery->prepare("INSERT INTO series(tseries_name) VALUES(:name)"); populate(); } @@ -32,6 +34,7 @@ SeriesTreeModel::~SeriesTreeModel(){ delete mUpdateSeriesIdQuery; delete mUpdateSeriesNameQuery; delete mDeleteSeriesQuery; + delete mSeriesInsertQuery; mDb.close(); mDb = QSqlDatabase(); } @@ -57,7 +60,7 @@ QVariant SeriesTreeModel::data(const QModelIndex &index, int role) const{ if(role == Qt::DisplayRole){ if(index.column() == Name){ int type = index.data(TypeRole).toInt(); - if(type == Series){ + if(type == Series || type == NewSeries){ return item->data(Name); }else if(type == Part){ QString retval = QString("%1 %2").arg(item->data(Name).toString()).arg(item->data(SeriesPart).toInt()); @@ -75,7 +78,7 @@ QVariant SeriesTreeModel::data(const QModelIndex &index, int role) const{ } } if(role == Qt::EditRole){ - if(index.data(TypeRole) == Series){ + if(index.data(TypeRole) == Series || index.data(TypeRole) == NewSeries){ if(index.column() == 0){ return item->data(Name); } @@ -104,54 +107,25 @@ bool SeriesTreeModel::setData(const QModelIndex &index, const QVariant &value, i return false; } if(role == Qt::EditRole){ - if(index.data(Type).toInt() == Series){ + if(index.data(TypeRole).toInt() == Series){ //change of series name if(index.column() == Name){ QModelIndex newSeries = findValue(value, index.parent(), index.column()); if(newSeries == index){ + //no change made, exit gracefully return false; } - int oldSeriesId = index.data(SeriesIdRole).toInt(); + //int oldSeriesId = index.data(SeriesIdRole).toInt(); if(newSeries != QModelIndex()){ - //new series name already exists - int newSeriesId = newSeries.data(SeriesIdRole).toInt(); - mUpdateSeriesIdQuery->bindValue(":oldid", oldSeriesId); - mUpdateSeriesIdQuery->bindValue(":newid", newSeriesId); - if(mUpdateSeriesIdQuery->exec()){ - SmTreeItem *oldParent = static_cast<SmTreeItem*>(index.internalPointer()); - SmTreeItem *newParent = static_cast<SmTreeItem*>(newSeries.internalPointer()); - //reparent items to new series - for(int i = oldParent->childCount() - 1; i > -1; --i){ - SmTreeItem *curItem = oldParent->child(i); - curItem->setParent(newParent); - curItem->setData(Name, value); - newParent->appendChild(curItem); - oldParent->removeChild(i, false); - } - mDeleteSeriesQuery->bindValue(":id", oldSeriesId); - if(mDeleteSeriesQuery->exec()){ - //series has to be empty - root()->removeChild(index.row()); - } - reset(); - return true; - }else{ - return false; - } + //series already exists, merge + return mergeSeries(index, newSeries); }else{ //rename series - mUpdateSeriesNameQuery->bindValue(":newname", value); - mUpdateSeriesNameQuery->bindValue(":id", oldSeriesId); - if(mUpdateSeriesNameQuery->exec()){ - SmTreeItem *curItem = static_cast<SmTreeItem*>(index.internalPointer()); - curItem->setData(Name, value); - emit dataChanged(index, index); - emit needResort(); - return true; - } + return renameSeries(index, value); } - } + }else if(index.data(TypeRole).toInt() == NewSeries){ + return setNewSeries(index, value); } } return false; @@ -190,3 +164,71 @@ void SeriesTreeModel::populate(){ } setRoot(rootItem); } + +bool SeriesTreeModel::mergeSeries(const QModelIndex &from, const QModelIndex &to){ + //new series name already exists + int oldSeriesId = from.data(SeriesIdRole).toInt(); + int newSeriesId = to.data(SeriesIdRole).toInt(); + mUpdateSeriesIdQuery->bindValue(":oldid", oldSeriesId); + mUpdateSeriesIdQuery->bindValue(":newid", newSeriesId); + if(mUpdateSeriesIdQuery->exec()){ + SmTreeItem *oldParent = static_cast<SmTreeItem*>(from.internalPointer()); + SmTreeItem *newParent = static_cast<SmTreeItem*>(to.internalPointer()); + //reparent items to new series + for(int i = oldParent->childCount() - 1; i > -1; --i){ + SmTreeItem *curItem = oldParent->child(i); + curItem->setParent(newParent); + curItem->setData(Name, to.data(NameRole)); + newParent->appendChild(curItem); + oldParent->removeChild(i, false); + } + mDeleteSeriesQuery->bindValue(":id", oldSeriesId); + if(mDeleteSeriesQuery->exec()){ + //series has to be empty + root()->removeChild(from.row()); + } + reset(); + return true; + } + return false; +} + +bool SeriesTreeModel::renameSeries(const QModelIndex &source, const QVariant &value){ + int oldSeriesId = source.data(SeriesIdRole).toInt(); + mUpdateSeriesNameQuery->bindValue(":newname", value); + mUpdateSeriesNameQuery->bindValue(":id", oldSeriesId); + if(mUpdateSeriesNameQuery->exec()){ + SmTreeItem *curItem = static_cast<SmTreeItem*>(source.internalPointer()); + curItem->setData(Name, value); + emit dataChanged(source, source); + emit needResort(); + return true; + } + return false; +} + +bool SeriesTreeModel::setNewSeries(const QModelIndex &source, const QVariant &value){ + QString newName = value.toString(); + if(newName.isEmpty()){ + return false; + } + SmTreeItem *item = static_cast<SmTreeItem*>(source.internalPointer()); + mDb.transaction(); + mSeriesInsertQuery->bindValue(":name", value); + if(mSeriesInsertQuery->exec()){ + QSqlQuery lastId("SELECT currval('series_iseries_id__seq')", mDb); + if(lastId.next()){ + int newId = lastId.value(0).toInt(); + item->setData(Name, value); + item->setData(SeriesId, newId); + item->setData(Type, Series); + QModelIndex end = index(source.row(), item->childCount() - 1, source.parent()); + emit dataChanged(source, end); + emit needResort(); + mDb.commit(); + return true; + } + } + mDb.rollback(); + return false; +} |