diff options
Diffstat (limited to 'seriestreemodel.cpp')
-rw-r--r-- | seriestreemodel.cpp | 113 |
1 files changed, 85 insertions, 28 deletions
diff --git a/seriestreemodel.cpp b/seriestreemodel.cpp index 555c0f4..fcc993f 100644 --- a/seriestreemodel.cpp +++ b/seriestreemodel.cpp @@ -11,6 +11,7 @@ #include <QFile> #include <QFileInfo> #include <QRegExp> +#include <QSettings> #include "seriestreemodel.h" #include "smtreeitem.h" @@ -19,11 +20,13 @@ SeriesTreeModel::SeriesTreeModel(QStringList &headers, QObject *parent) : SmTreeModel(headers, parent){ mDb = QSqlDatabase::database("treedb"); mSeriesPartsQuery = new QSqlQuery(mDb); - mSeriesPartsQuery->prepare("SELECT iseriesparts_id, iseriespart FROM seriesparts WHERE iseries_id = :id ORDER BY iseriespart"); + mSeriesPartsQuery->prepare("SELECT iseriesparts_id, iseriespart, bfavorite 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"); + mUpdateFavoriteQuery = new QSqlQuery(mDb); + mUpdateFavoriteQuery->prepare("UPDATE seriesparts SET bfavorite = :fav WHERE iseriesparts_id = :id"); mDeleteSeriesQuery = new QSqlQuery(mDb); mDeleteSeriesQuery->prepare("DELETE FROM series where iseries_id = :id"); mDeleteSeriesPartQuery = new QSqlQuery(mDb); @@ -49,6 +52,7 @@ SeriesTreeModel::~SeriesTreeModel(){ delete mSeriesPartsQuery; delete mUpdateSeriesIdQuery; delete mUpdateSeriesNameQuery; + delete mUpdateFavoriteQuery; delete mDeleteSeriesQuery; delete mDeleteSeriesPartQuery; delete mSeriesInsertQuery; @@ -99,6 +103,11 @@ QVariant SeriesTreeModel::data(const QModelIndex &index, int role) const{ 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){ @@ -121,6 +130,9 @@ QVariant SeriesTreeModel::data(const QModelIndex &index, int role) const{ if(role == TypeRole){ return item->data(Type); } + if(role == FavoriteRole){ + return item->data(Favorite); + } return QVariant(); } @@ -129,25 +141,28 @@ bool SeriesTreeModel::setData(const QModelIndex &index, const QVariant &value, i return false; } if(role == Qt::EditRole){ - 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(); - if(newSeries != QModelIndex()){ - //series already exists, merge - return mergeSeries(index, newSeries); - }else{ - //rename series - return renameSeries(index, value); + 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.data(TypeRole).toInt() == NewSeries){ + return setNewSeries(index, value); } - }else if(index.data(TypeRole).toInt() == NewSeries){ - return setNewSeries(index, value); + }else if(index.column() == Favorite){ + return setFavorite(index, value); } } return false; @@ -351,12 +366,12 @@ void SeriesTreeModel::setMappingFilter(const QString &filter, const QString &tab if(ids.isEmpty()){ return; } - QString seriesPartsTemplate("SELECT DISTINCT(seriesparts.iseriesparts_id), seriesparts.iseriespart 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 seriesPartsTemplate("SELECT DISTINCT(seriesparts.iseriesparts_id), seriesparts.iseriespart, seriesparts.bfavorite 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; + seriesData << seriesIdQuery.value(1) << seriesIdQuery.value(0) << QVariant() << QVariant() << Series << false; SmTreeItem *seriesItem = new SmTreeItem(seriesData, rootItem); rootItem->appendChild(seriesItem); QString partsQueryString = seriesPartsTemplate.arg(table).arg(ids.join(",")); @@ -366,7 +381,7 @@ void SeriesTreeModel::setMappingFilter(const QString &filter, const QString &tab partsQuery.exec(); while(partsQuery.next()){ QList<QVariant> partData; - partData << seriesData.at(Name) << seriesData.at(SeriesId) << partsQuery.value(0) << partsQuery.value(1) << Part; + partData << seriesData.at(Name) << seriesData.at(SeriesId) << partsQuery.value(0) << partsQuery.value(1) << Part << partsQuery.value(2); SmTreeItem *partItem = new SmTreeItem(partData, seriesItem); seriesItem->appendChild(partItem); mSeriesPartSeriesMap.insert(partsQuery.value(0).toInt(), seriesData.at(1).toInt()); @@ -386,7 +401,7 @@ void SeriesTreeModel::setFileFilter(const QString &filter, const QString &column seriesIdQuery.prepare(idQueryTemplate); value = QString("%%1%").arg(filter); seriesIdQuery.bindValue(":value", value); - partsQueryTemplate = QString("SELECT DISTINCT(seriesparts.iseriesparts_id), seriesparts.iseriespart 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"); + partsQueryTemplate = QString("SELECT DISTINCT(seriesparts.iseriesparts_id), seriesparts.iseriespart, seriesparts.bfavorite 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()); @@ -396,7 +411,7 @@ void SeriesTreeModel::setFileFilter(const QString &filter, const QString &column 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 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"); + partsQueryTemplate = QString("SELECT DISTINCT(seriesparts.iseriesparts_id), seriesparts.iseriespart, seriesparts.bfavorite 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; } @@ -405,7 +420,7 @@ void SeriesTreeModel::setFileFilter(const QString &filter, const QString &column SmTreeItem *rootItem = new SmTreeItem(5); while(seriesIdQuery.next()){ QList<QVariant> seriesData; - seriesData << seriesIdQuery.value(1) << seriesIdQuery.value(0) << QVariant() << QVariant() << Series; + seriesData << seriesIdQuery.value(1) << seriesIdQuery.value(0) << QVariant() << QVariant() << Series << false; SmTreeItem *seriesItem = new SmTreeItem(seriesData, rootItem); rootItem->appendChild(seriesItem); QString partsQueryString; @@ -422,7 +437,7 @@ void SeriesTreeModel::setFileFilter(const QString &filter, const QString &column if(partsQuery.exec()){ while(partsQuery.next()){ QList<QVariant> partData; - partData << seriesData.at(Name) << seriesData.at(SeriesId) << partsQuery.value(0) << partsQuery.value(1) << Part; + partData << seriesData.at(Name) << seriesData.at(SeriesId) << partsQuery.value(0) << partsQuery.value(1) << Part << partsQuery.value(2); SmTreeItem *partItem = new SmTreeItem(partData, seriesItem); seriesItem->appendChild(partItem); mSeriesPartSeriesMap.insert(partsQuery.value(0).toInt(), seriesData.at(1).toInt()); @@ -433,20 +448,46 @@ void SeriesTreeModel::setFileFilter(const QString &filter, const QString &column } } +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){ + 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(5); + SmTreeItem *rootItem = new SmTreeItem(6); while(seriesQuery.next()){ QList<QVariant> seriesData; - seriesData << seriesQuery.value(1) << seriesQuery.value(0) << QVariant() << QVariant() << Series; + seriesData << seriesQuery.value(1) << seriesQuery.value(0) << QVariant() << QVariant() << Series << false; 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; + partData << seriesData.at(Name) << seriesData.at(SeriesId) << mSeriesPartsQuery->value(0) << mSeriesPartsQuery->value(1) << Part << mSeriesPartsQuery->value(2); SmTreeItem *partItem = new SmTreeItem(partData, seriesItem); seriesItem->appendChild(partItem); mSeriesPartSeriesMap.insert(mSeriesPartsQuery->value(0).toInt(), seriesData.at(1).toInt()); @@ -538,3 +579,19 @@ bool SeriesTreeModel::setNewSeries(const QModelIndex &source, const QVariant &va mDb.rollback(); return false; } + +bool SeriesTreeModel::setFavorite(const QModelIndex &source, const QVariant &value){ + SmTreeItem *item = static_cast<SmTreeItem*>(source.internalPointer()); + mDb.transaction(); + mUpdateFavoriteQuery->bindValue(":fav", value); + mUpdateFavoriteQuery->bindValue(":id", item->data(SeriesPartId)); + if(mUpdateFavoriteQuery->exec()){ + item->setData(Favorite, value); + QModelIndex start = index(source.row(), 0, source.parent()); + emit dataChanged(start, source); + mDb.commit(); + return true; + } + mDb.rollback(); + return false; +} |