diff options
Diffstat (limited to 'seriestreemodel.cpp')
-rw-r--r-- | seriestreemodel.cpp | 668 |
1 files changed, 0 insertions, 668 deletions
diff --git a/seriestreemodel.cpp b/seriestreemodel.cpp deleted file mode 100644 index ac1a381..0000000 --- a/seriestreemodel.cpp +++ /dev/null @@ -1,668 +0,0 @@ -/* - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version - 2 of the License, or (at your option) any later version. -*/ - -#include <QSqlQuery> -#include <QSqlError> -#include <QIcon> -#include <QFile> -#include <QFileInfo> -#include <QRegExp> -#include <QSettings> - -#include "seriestreemodel.h" -#include "smtreeitem.h" -#include "helper.h" - -SeriesTreeModel::SeriesTreeModel(QStringList &headers, QObject *parent) : SmTreeModel(headers, parent), mRowFilter(All) { - mDb = QSqlDatabase::database("treedb"); - mSeriesPartsQuery = new QSqlQuery(mDb); - mSeriesPartsQuery->prepare("SELECT iseriesparts_id, iseriespart, bfavorite, tsubtitle FROM seriesparts WHERE iseries_id = :id ORDER BY iseriespart"); - mUpdateSeriesIdQuery = new QSqlQuery(mDb); - mUpdateSeriesIdQuery->prepare("UPDATE seriesparts SET iseries_id = :newid WHERE iseries_id = :oldid"); - mUpdateSeriesNameQuery = new QSqlQuery(mDb); - 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"); - mDeleteSeriesPartQuery = new QSqlQuery(mDb); - mDeleteSeriesPartQuery->prepare("DELETE FROM seriesparts WHERE iseriesparts_id = :id"); - mSeriesInsertQuery = new QSqlQuery(mDb); - mSeriesInsertQuery->prepare("INSERT INTO series(tseries_name) VALUES(:name)"); - mSeriesFilesQuery = new QSqlQuery(mDb); - mSeriesFilesQuery->prepare("SELECT files.tfilename, files.cmd5sum FROM series, seriesparts, files WHERE series.iseries_id = :id AND series.iseries_id = seriesparts.iseries_id AND seriesparts.iseriesparts_id = files.iseriespart_id"); - mSeriesPartFilesQuery = new QSqlQuery(mDb); - mSeriesPartFilesQuery->prepare("SELECT files.tfilename, files.cmd5sum FROM seriesparts, files WHERE seriesparts.iseriesparts_id = :id AND seriesparts.iseriesparts_id = files.iseriespart_id"); - mSeriesPartInsertQuery = new QSqlQuery(mDb); - mSeriesPartInsertQuery->prepare("INSERT INTO seriesparts(iseriespart, iseries_id, tsubtitle) VALUES(:part, :id, :subtitle)"); - mSortedMovieListQuery = new QSqlQuery(mDb); - mSortedMovieListQuery->prepare("SELECT files.tfilename, files.cmd5sum FROM series, seriesparts, files WHERE series.iseries_id = :id AND seriesparts.iseries_id = series.iseries_id AND seriesparts.iseriesparts_id = files.iseriespart_id AND files.sifiletype = 1 ORDER BY seriesparts.iseriespart, files.sifileno"); - mNextDvdNoQuery = new QSqlQuery(mDb); - mNextDvdNoQuery->prepare("SELECT MAX(idvd) FROM files"); - mGenreFilterQuery = new QSqlQuery(mDb); - mGenreFilterQuery->prepare("SELECT DISTINCT(series.iseries_id), series.tseries_name FROM series, seriesparts, seriesparts_genremap, genres where tgenrename LIKE :pat AND genres.igenres_id = seriesparts_genremap.igenres_id AND seriesparts_genremap.iseriesparts_id = seriesparts.iseriesparts_id AND seriesparts.iseries_id = series.iseries_id"); - mFavoriteSeriesIdQuery = new QSqlQuery(mDb); - mFavoriteSeriesIdQuery->prepare("SELECT DISTINCT(series.iseries_id), series.tseries_name FROM series, seriesparts WHERE seriesparts.bfavorite = true and seriesparts.iseries_id = series.iseries_id"); - mFavoriteSeriesPartsQuery = new QSqlQuery(mDb); - mFavoriteSeriesPartsQuery->prepare("SELECT iseriesparts_id, iseriespart, tsubtitle FROM seriesparts WHERE iseries_id = :id AND bfavorite = true"); - mUpdateGenericTemplate = QString("UPDATE seriesparts SET %1 = :value WHERE iseriesparts_id = :id"); - mIsLocalQuery = new QSqlQuery(mDb); - mIsLocalQuery->prepare("SELECT COUNT(*) FROM files WHERE iseriespart_id = :id AND sifiletype = 1 AND idvd = -1"); - mUpdateGenericMap.insert(Favorite, "bfavorite"); - mUpdateGenericMap.insert(Subtitle, "tsubtitle"); - mUpdateGenericMap.insert(SeriesPart, "iseriespart"); - populate(); -} - -Qt::ItemFlags SeriesTreeModel::flags(const QModelIndex &index) const{ - if(!index.isValid()){ - return 0; - } - Qt::ItemFlags retval = Qt::ItemIsEnabled | Qt::ItemIsSelectable; - if(index.data(TypeRole).toInt() == Series || index.data(TypeRole).toInt() == NewSeries){ - return retval | Qt::ItemIsEditable; - } - return retval; -} - -QVariant SeriesTreeModel::data(const QModelIndex &index, int role) const{ - if(!index.isValid()){ - return QVariant(); - } - - SmTreeItem *item = static_cast<SmTreeItem*>(index.internalPointer()); - - if(role == Qt::DisplayRole){ - if(index.column() == Name){ - int type = index.data(TypeRole).toInt(); - if(type == Series || type == NewSeries){ - return item->data(Name); - }else if(type == Part){ - QString retval = item->data(Name).toString(); - if(item->data(SeriesPart).toInt() > 0){ - retval = QString("%1 %2").arg(retval).arg(item->data(SeriesPart).toInt()); - } - QString subtitle = item->data(Subtitle).toString(); - if(!subtitle.isEmpty()){ - retval = QString("%1 - %2").arg(retval).arg(subtitle); - } - return retval; - }else{ - return QVariant(); - } - }else{ - return item->data(index.column()); - } - } - if(role == Qt::DecorationRole){ - if(index.column() == 0){ - return decorationIcon(); - } - } - if(role == Qt::ForegroundRole){ - if(item->data(Favorite).toBool()){ - return mFavoriteColor; - } - } - if(role == Qt::EditRole){ - if(index.data(TypeRole) == Series || index.data(TypeRole) == NewSeries){ - if(index.column() == 0){ - return item->data(Name); - } - } - } - if(role == NameRole){ - return item->data(Name); - } - if(role == SeriesIdRole){ - return item->data(SeriesId); - } - if(role == SeriesPartIdRole){ - return item->data(SeriesPartId); - } - if(role == SeriesPartRole){ - return item->data(SeriesPart); - } - if(role == TypeRole){ - return item->data(Type); - } - if(role == FavoriteRole){ - return item->data(Favorite); - } - if(role == SubtitleRole){ - return item->data(Subtitle); - } - if(role == IsLocalRole){ - return item->data(IsLocal); - } - return QVariant(); -} - -bool SeriesTreeModel::setData(const QModelIndex &index, const QVariant &value, int role){ - if(!index.isValid()){ - return false; - } - if(role == Qt::EditRole){ - if(index.column() == Name){ - 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; - } - if(newSeries != QModelIndex()){ - //series already exists, merge - return mergeSeries(index, newSeries); - }else{ - //rename series - return renameSeries(index, value); - } - } - } - }else if(index.column() == IsLocal){ - setLocal(index, value); - }else if(index.data(TypeRole).toInt() == NewSeries){ - return setNewSeries(index, value); - }else{ - return updateGeneric(index, value); - } - } - return false; -} - -QList<QVariant> SeriesTreeModel::childrenColumnList(const QModelIndex &parent, int column) const{ - if(!parent.isValid()){ - return QList<QVariant>(); - } - SmTreeItem *item = static_cast<SmTreeItem*>(parent.internalPointer()); - QList<QVariant> retval; - for(int i = 0; i < item->childCount(); ++i){ - SmTreeItem *child = item->child(i); - retval << child->data(column); - } - return retval; -} - -QModelIndex SeriesTreeModel::findValue(const QVariant &value, const QModelIndex &parent, int searchColumn, int indexColumn) const{ - SmTreeItem *parentItem = root(); - if(parent != QModelIndex()){ - parentItem = static_cast<SmTreeItem*>(parent.internalPointer()); - } - for(int i = 0; i < parentItem->childCount(); ++i){ - SmTreeItem *childItem = parentItem->child(i); - if(value == childItem->data(searchColumn)){ - if(indexColumn == -1){ - return createIndex(i, searchColumn, childItem); - }else{ - return createIndex(i, indexColumn, childItem); - } - } - } - return QModelIndex(); -} - -QFileInfoList SeriesTreeModel::findFiles(const QModelIndex &where) const{ - int type = where.data(TypeRole).toInt(); - QFileInfoList retval; - - QSqlQuery *query = 0; - if(type == Series){ - query = mSeriesFilesQuery; - query->bindValue(":id", where.data(SeriesIdRole)); - }else if(type == Part){ - query = mSeriesPartFilesQuery; - query->bindValue(":id", where.data(SeriesPartIdRole)); - } - - if(query){ - if(query->exec()){ - while(query->next()){ - QString path = Helper::createArchivePath(query->value(0).toString(), query->value(1).toString()); - retval << QFileInfo(path); - } - } - } - - return retval; -} - -QFileInfoList SeriesTreeModel::findMovies(const QModelIndexList &from) const{ - if(from.isEmpty()){ - return QFileInfoList(); - } - QFileInfoList retval; - foreach(QModelIndex idx, from){ - QFileInfoList files = findFiles(idx); - foreach(QFileInfo fi, files){ - QString mime = Helper::mimeType(fi.absoluteFilePath()); - if(mime.startsWith("video")){ - if(!retval.contains(fi)){ - retval << fi; - } - } - } - } - return retval; -} - -QFileInfoList SeriesTreeModel::findSortedMovies(const QModelIndex &from) const{ - if(!from.isValid()){ - return QFileInfoList(); - } - QFileInfoList retval; - int seriesId = from.data(SeriesIdRole).toInt(); - mSortedMovieListQuery->bindValue(":id", seriesId); - if(mSortedMovieListQuery->exec()){ - while(mSortedMovieListQuery->next()){ - QString path = Helper::createArchivePath(mSortedMovieListQuery->value(0).toString(), mSortedMovieListQuery->value(1).toString()); - retval << QFileInfo(path); - } - } - return retval; -} - -bool SeriesTreeModel::hasLocals(int sPartId) const { - bool retval = false; - mIsLocalQuery->bindValue(":id", sPartId); - mIsLocalQuery->exec(); - while(mIsLocalQuery->next()){ - retval = mIsLocalQuery->value(0).toBool(); - } - return retval; -} - -int SeriesTreeModel::seriesIdByPartId(int partId){ - if(mSeriesPartSeriesMap.contains(partId)){ - return mSeriesPartSeriesMap.value(partId); - } - return -1; -} - -int SeriesTreeModel::findNextDvdNo() const{ - int dvdno = 0; - mNextDvdNoQuery->exec(); - while(mNextDvdNoQuery->next()){ - dvdno = mNextDvdNoQuery->value(0).toInt(); - } - return ++dvdno; -} - -bool SeriesTreeModel::deleteFromSeries(const QModelIndex &what){ - int nodeType = what.data(TypeRole).toInt(); - QSqlQuery *query = 0; - if(nodeType == Series || nodeType == NewSeries){ - query = mDeleteSeriesQuery; - query->bindValue(":id", what.data(SeriesIdRole)); - }else if(nodeType == Part){ - query = mDeleteSeriesPartQuery; - query->bindValue(":id", what.data(SeriesPartIdRole)); - } - if(query){ - QFileInfoList files = findFiles(what); - if(query->exec()){ - foreach(QFileInfo fi, files){ - QFile::remove(fi.absoluteFilePath()); - } - removeRows(what.row(), 1, what.parent()); - return true; - } - } - return false; -} - -bool SeriesTreeModel::addSeries(const QVariant &seriesName, const QModelIndex &parent){ - const QString name = seriesName.toString().toLower().trimmed(); - if(name.isEmpty()){ - return false; - } - mDb.transaction(); - mSeriesInsertQuery->bindValue(":name", name); - if(mSeriesInsertQuery->exec()){ - QSqlQuery lastId("SELECT currval('series_iseries_id__seq')", mDb); - if(lastId.next()){ - int id = lastId.value(0).toInt(); - QList<QVariant> seriesData; - seriesData << name << id << QVariant() << QVariant() << Series << false << QVariant() << QVariant(); - if(addRow(seriesData, parent)){ - mDb.commit(); - return true; - } - } - } - mDb.rollback(); - return false; -} - -bool SeriesTreeModel::addSeriesPart(int seriesPart, const QModelIndex &parent, const QString &subTitle){ - if(!parent.isValid() || parent.data(TypeRole) != Series){ - return false; - } - int seriesId = parent.data(SeriesIdRole).toInt(); - mDb.transaction(); - if(seriesPart > 0){ - mSeriesPartInsertQuery->bindValue(":part", seriesPart); - }else{ - QSqlQuery nextNegValQuery("SELECT nextval('seriesparts_iseriespart__seq')", mDb); - if(nextNegValQuery.next()){ - seriesPart = nextNegValQuery.value(0).toInt(); - mSeriesPartInsertQuery->bindValue(":part", seriesPart); - } - } - mSeriesPartInsertQuery->bindValue(":id", seriesId); - mSeriesPartInsertQuery->bindValue(":subtitle", subTitle.toLower()); - if(mSeriesPartInsertQuery->exec()){ - QSqlQuery lastId("SELECT currval('seriesparts_seriesparts_id__seq')", mDb); - if(lastId.next()){ - int id = lastId.value(0).toInt(); - QList<QVariant> partData; - partData << parent.data(NameRole) << seriesId << id << seriesPart << Part << false << subTitle << true; - if(addRow(partData, parent)){ - mDb.commit(); - mSeriesPartSeriesMap.insert(id, seriesId); - return true; - } - } - } - mDb.rollback(); - return false; -} - -void SeriesTreeModel::clearFilter(){ - populate(); -} - -void SeriesTreeModel::setMappingFilter(const QString &filter, const QString &table){ - QString pattern = QString("%%1%").arg(filter); - QString tableIdTemplate = QString("SELECT i%1s_id FROM %1s WHERE t%1name LIKE :pat").arg(table); - QSqlQuery tableIdQuery(mDb); - tableIdQuery.prepare(tableIdTemplate); - tableIdQuery.bindValue(":pat", pattern); - if(tableIdQuery.exec()){ - mSeriesPartSeriesMap.clear(); - QStringList ids; - SmTreeItem *rootItem = new SmTreeItem(NumFields); - while(tableIdQuery.next()){ - ids << QString::number(tableIdQuery.value(0).toInt()); - } - if(ids.isEmpty()){ - return; - } - QString seriesPartsTemplate("SELECT DISTINCT(seriesparts.iseriesparts_id), seriesparts.iseriespart, seriesparts.bfavorite, seriesparts.tsubtitle FROM seriesparts, seriesparts_%1map WHERE seriesparts.iseries_id = :id AND seriesparts_%1map.iseriesparts_id = seriesparts.iseriesparts_id AND seriesparts_%1map.i%1s_id IN (%2) ORDER BY iseriespart"); - QString seriesIdTemplate = QString("SELECT DISTINCT(series.iseries_id), series.tseries_name FROM series, seriesparts, seriesparts_%1map, %1s WHERE %1s.i%1s_id IN (%2) AND %1s.i%1s_id = seriesparts_%1map.i%1s_id AND seriesparts_%1map.iseriesparts_id = seriesparts.iseriesparts_id AND seriesparts.iseries_id = series.iseries_id ORDER BY series.tseries_name").arg(table).arg(ids.join(",")); - QSqlQuery seriesIdQuery(seriesIdTemplate, mDb); - while(seriesIdQuery.next()){ - QList<QVariant> seriesData; - seriesData << seriesIdQuery.value(1) << seriesIdQuery.value(0) << QVariant() << QVariant() << Series << false << QVariant() << QVariant(); - SmTreeItem *seriesItem = new SmTreeItem(seriesData, rootItem); - rootItem->appendChild(seriesItem); - QString partsQueryString = seriesPartsTemplate.arg(table).arg(ids.join(",")); - QSqlQuery partsQuery(mDb); - partsQuery.prepare(partsQueryString); - partsQuery.bindValue(":id", seriesIdQuery.value(0)); - partsQuery.exec(); - while(partsQuery.next()){ - QList<QVariant> partData; - partData << seriesData.at(Name) << seriesData.at(SeriesId) << partsQuery.value(0) << partsQuery.value(1) << Part << partsQuery.value(2) << partsQuery.value(3); - partData << hasLocals(partsQuery.value(0).toInt()); - SmTreeItem *partItem = new SmTreeItem(partData, seriesItem); - seriesItem->appendChild(partItem); - mSeriesPartSeriesMap.insert(partsQuery.value(0).toInt(), seriesData.at(1).toInt()); - } - } - setRoot(rootItem); - } -} - -void SeriesTreeModel::setFileFilter(const QString &filter, const QString &column, int queryType){ - QSqlQuery seriesIdQuery(mDb); - QString partsQueryTemplate; - QString op("="); - QVariant value = filter; - if(queryType == TextQuery){ - QString idQueryTemplate = QString("SELECT DISTINCT(series.iseries_id), series.tseries_name FROM series, seriesparts, files WHERE files.%1 LIKE :value AND files.iseriespart_id = seriesparts.iseriesparts_id AND seriesparts.iseries_id = series.iseries_id ORDER BY series.tseries_name").arg(column); - seriesIdQuery.prepare(idQueryTemplate); - value = QString("%%1%").arg(filter); - seriesIdQuery.bindValue(":value", value); - partsQueryTemplate = QString("SELECT DISTINCT(seriesparts.iseriesparts_id), seriesparts.iseriespart, seriesparts.bfavorite, seriesparts.tsubtitle FROM seriesparts, series, files WHERE series.iseries_id = :id AND series.iseries_id = seriesparts.iseries_id AND seriesparts.iseriesparts_id = files.iseriespart_id AND files.%1 LIKE :value"); - }else if(queryType == NumericQuery){ - QRegExp valRe("([<>=]?)\\s*(\\d+)\\s*(\\w*)"); - (void)valRe.indexIn(value.toString()); - QStringList capText = valRe.capturedTexts(); - op = capText.at(1).isEmpty() ? op : capText.at(1); - value = Helper::bytesFromUnit(capText.at(2), capText.at(3)); - QString idQueryTemplate = QString("SELECT DISTINCT(series.iseries_id), series.tseries_name FROM series, seriesparts, files WHERE files.%1 %2 :value AND files.iseriespart_id = seriesparts.iseriesparts_id AND seriesparts.iseries_id = series.iseries_id ORDER BY series.tseries_name").arg(column).arg(op); - seriesIdQuery.prepare(idQueryTemplate); - seriesIdQuery.bindValue(":value", value); - partsQueryTemplate = QString("SELECT DISTINCT(seriesparts.iseriesparts_id), seriesparts.iseriespart, seriesparts.bfavorite, seriesparts.tsubtitle FROM seriesparts, series, files WHERE series.iseries_id = :id AND series.iseries_id = seriesparts.iseries_id AND seriesparts.iseriesparts_id = files.iseriespart_id AND files.%1 %2 :value"); - }else{ - return; - } - if(seriesIdQuery.exec()){ - mSeriesPartSeriesMap.clear(); - SmTreeItem *rootItem = new SmTreeItem(NumFields); - while(seriesIdQuery.next()){ - QList<QVariant> seriesData; - seriesData << seriesIdQuery.value(1) << seriesIdQuery.value(0) << QVariant() << QVariant() << Series << false << QVariant(); - SmTreeItem *seriesItem = new SmTreeItem(seriesData, rootItem); - rootItem->appendChild(seriesItem); - QString partsQueryString; - if(queryType == TextQuery){ - partsQueryString = partsQueryTemplate.arg(column); - value = QString("%%1%").arg(value.toString()); - }else{ - partsQueryString = partsQueryTemplate.arg(column).arg(op); - } - QSqlQuery partsQuery(mDb); - partsQuery.prepare(partsQueryString); - partsQuery.bindValue(":id", seriesIdQuery.value(0)); - partsQuery.bindValue(":value", value); - if(partsQuery.exec()){ - while(partsQuery.next()){ - QList<QVariant> partData; - partData << seriesData.at(Name) << seriesData.at(SeriesId) << partsQuery.value(0) << partsQuery.value(1) << Part << partsQuery.value(2) << partsQuery.value(3); - partData << hasLocals(partsQuery.value(0).toInt()); - SmTreeItem *partItem = new SmTreeItem(partData, seriesItem); - seriesItem->appendChild(partItem); - mSeriesPartSeriesMap.insert(partsQuery.value(0).toInt(), seriesData.at(1).toInt()); - } - } - } - setRoot(rootItem); - } -} - -void SeriesTreeModel::setFavoriteFilter(){ - if(mFavoriteSeriesIdQuery->exec()){ - mSeriesPartSeriesMap.clear(); - SmTreeItem *rootItem = new SmTreeItem(NumFields); - while(mFavoriteSeriesIdQuery->next()){ - QList<QVariant> seriesData; - seriesData << mFavoriteSeriesIdQuery->value(1) << mFavoriteSeriesIdQuery->value(0) << QVariant() << QVariant() << Series << false << QVariant(); - SmTreeItem *seriesItem = new SmTreeItem(seriesData, rootItem); - rootItem->appendChild(seriesItem); - mFavoriteSeriesPartsQuery->bindValue(":id", seriesData.at(1)); - if(mFavoriteSeriesPartsQuery->exec()){ - while(mFavoriteSeriesPartsQuery->next()){ - QList<QVariant> partData; - partData << seriesData.at(Name) << seriesData.at(SeriesId) << mFavoriteSeriesPartsQuery->value(0) << mFavoriteSeriesPartsQuery->value(1) << Part << true << mFavoriteSeriesPartsQuery->value(2); - partData << hasLocals(mFavoriteSeriesPartsQuery->value(0).toInt()); - SmTreeItem *partItem = new SmTreeItem(partData, seriesItem); - seriesItem->appendChild(partItem); - mSeriesPartSeriesMap.insert(mFavoriteSeriesPartsQuery->value(0).toInt(), seriesData.at(1).toInt()); - } - } - } - setRoot(rootItem); - } -} - -void SeriesTreeModel::readSettings(){ - QSettings s; - QVariant fc = s.value("ui/favoritecolor"); - mFavoriteColor = fc.value<QColor>(); - conditionalUpdate(index(0, 0, QModelIndex()), Favorite, true); -} - -void SeriesTreeModel::conditionalUpdate(const QModelIndex &parent, int field, const QVariant &value){ - if(!parent.isValid()){ - return; - } - SmTreeItem *item = static_cast<SmTreeItem*>(parent.internalPointer()); - if(item->childCount() > 0){ - //series - for(int i = 0; i < item->childCount(); ++i){ - QModelIndex newParent = parent.child(i, field); - if(newParent.isValid()){ - conditionalUpdate(newParent, field, value); - } - } - }else{ - //seriespart - if(item->data(field) == value){ - QModelIndex start = index(parent.row(), 0, parent.parent()); - emit dataChanged(start, parent); - } - } -} - -void SeriesTreeModel::populate(){ - QSqlQuery seriesQuery = QSqlQuery("SELECT iseries_id, tseries_name FROM series ORDER BY tseries_name", mDb); - mSeriesPartSeriesMap.clear(); - SmTreeItem *rootItem = new SmTreeItem(NumFields); - while(seriesQuery.next()){ - QList<QVariant> seriesData; - seriesData << seriesQuery.value(1) << seriesQuery.value(0) << QVariant() << QVariant() << Series << false << QVariant() << QVariant(); - SmTreeItem *seriesItem = new SmTreeItem(seriesData, rootItem); - rootItem->appendChild(seriesItem); - mSeriesPartsQuery->bindValue(":id", seriesData.at(1)); - mSeriesPartsQuery->exec(); - while(mSeriesPartsQuery->next()){ - QList<QVariant> partData; - partData << seriesData.at(Name) << seriesData.at(SeriesId) << mSeriesPartsQuery->value(0) << mSeriesPartsQuery->value(1) << Part << mSeriesPartsQuery->value(2) << mSeriesPartsQuery->value(3); - partData << hasLocals(mSeriesPartsQuery->value(0).toInt()); - SmTreeItem *partItem = new SmTreeItem(partData, seriesItem); - seriesItem->appendChild(partItem); - mSeriesPartSeriesMap.insert(mSeriesPartsQuery->value(0).toInt(), seriesData.at(1).toInt()); - } - } - 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()){ - beginResetModel(); - 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()); - } - //update seriespartmap - QList<int> seriesPartIds = mSeriesPartSeriesMap.keys(oldSeriesId); - foreach(int seriesPartId, seriesPartIds){ - mSeriesPartSeriesMap.remove(seriesPartId); - mSeriesPartSeriesMap.insert(seriesPartId, newSeriesId); - } - endResetModel(); - 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); - for(int i = 0; i < curItem->childCount(); ++i){ - SmTreeItem *child = curItem->child(i); - child->setData(Name, value); - } - if(curItem->childCount()){ - QModelIndex start = source.child(0, 0); - QModelIndex end = source.child(curItem->childCount() - 1, 0); - emit dataChanged(start, end); - } - 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; -} - -bool SeriesTreeModel::updateGeneric(const QModelIndex &source, const QVariant &value){ - int column = source.column(); - if(!mUpdateGenericMap.contains(column)){ - return false; - } - SmTreeItem *item = static_cast<SmTreeItem*>(source.internalPointer()); - QString table = mUpdateGenericMap.value(column); - QString queryString = QString(mUpdateGenericTemplate).arg(table); - mDb.transaction(); - QSqlQuery query(mDb); - query.prepare(queryString); - query.bindValue(":id", item->data(SeriesPartId)); - query.bindValue(":value", value); - if(query.exec()){ - item->setData(column, value); - emit dataChanged(source, source); - mDb.commit(); - return true; - } - mDb.rollback(); - return false; -} - -bool SeriesTreeModel::setLocal(const QModelIndex &source, const QVariant &value){ - SmTreeItem *item = static_cast<SmTreeItem*>(source.internalPointer()); - item->setData(IsLocal, value); - emit dataChanged(source, source); - emit localsChanged(); - return true; -} |