summaryrefslogtreecommitdiffstats
path: root/seriestreemodel.cpp
diff options
context:
space:
mode:
authorArno <am@disconnect.de>2011-01-16 15:04:41 +0100
committerArno <am@disconnect.de>2011-01-16 15:04:41 +0100
commitafd74157ef705fa2b0323727b3a37e2806bb0730 (patch)
treecb4ed7f5ea467cc9293bca428ff42e5f596a2e96 /seriestreemodel.cpp
parentf4a2553aa56939721bcd82d8ad9bffbaecd0647a (diff)
downloadSheMov-afd74157ef705fa2b0323727b3a37e2806bb0730.tar.gz
SheMov-afd74157ef705fa2b0323727b3a37e2806bb0730.tar.bz2
SheMov-afd74157ef705fa2b0323727b3a37e2806bb0730.zip
Implement favorites
SeriesParts can be marked as favorites. They won't be selectable when filtering by local Movies only.
Diffstat (limited to 'seriestreemodel.cpp')
-rw-r--r--seriestreemodel.cpp113
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;
+}