From fa226c66caf80f9f5041f9616d057309e8f958c0 Mon Sep 17 00:00:00 2001 From: Arno Date: Sun, 11 Aug 2013 03:42:04 +0200 Subject: Implement Favorites Re-Implement mark as Favorites in new ArchiveView. Also, don't block when the Collector is running again and we're trying to update the view. --- archivemodel.cpp | 27 +++++++++++++++++++++++++++ archivemodel.h | 2 ++ archiveview.cpp | 11 +++++++++++ archiveview.h | 1 + shemov.cpp | 14 ++++++++++---- shemov.h | 3 ++- 6 files changed, 53 insertions(+), 5 deletions(-) diff --git a/archivemodel.cpp b/archivemodel.cpp index 3fb8188..774265f 100644 --- a/archivemodel.cpp +++ b/archivemodel.cpp @@ -106,6 +106,9 @@ QVariant ArchiveModel::data(const QModelIndex &index, int role) const{ if(role == SubtitleRole){ return item->data(Subtitle); } + if(role == FavoriteRole){ + return item->data(Favorite); + } if(role == Qt::DecorationRole){ if(index.column() == 0){ return mNodeIcons.value(item->data(Type).toInt()); @@ -481,6 +484,25 @@ bool ArchiveModel::setPartNo(int partId, int newPartId, const QString &subtitle) return true; } +bool ArchiveModel::setFavorite(int partId, bool favorite){ + QSqlQuery favQ(mDb); + favQ.prepare("UPDATE seriesparts SET bfavorite = :fav WHERE iseriesparts_id = :id"); + favQ.bindValue(":id", partId); + favQ.bindValue(":fav", favorite); + if(favQ.exec()){ + QMutexLocker l(&mRootAccessMx); + QModelIndex idx = findRecursive(partId, SeriesPartId, rootIndex()); + if(idx.isValid()){ + SmTreeItem *item = itemAt(idx); + item->setData(Favorite, favorite); + emit dataChanged(idx, idx); + refresh(); + return true; + } + } + return false; +} + QStringList ArchiveModel::allSources() const{ QSqlQuery sQ("SELECT DISTINCT(tsourcemedium) FROM metadata ORDER BY tsourcemedium ASC", mDb); QStringList retval; @@ -545,9 +567,14 @@ void ArchiveModel::collectorFinished(QObject *thread){ if(t->isCancelled()){ return; } + // don't block the GUI if we're already running again! + if(t->isRunning()){ + return; + } SmTreeItem *rootCopy = t->rootItem(); int sortOrder = t->sortOrder(); if(sortOrder == mOrder){ + QMutexLocker l(&mRootAccessMx); setRoot(rootCopy); } writeCache(sortOrder, rootCopy); diff --git a/archivemodel.h b/archivemodel.h index 8323385..e4ed513 100644 --- a/archivemodel.h +++ b/archivemodel.h @@ -52,6 +52,7 @@ class ArchiveModel : public SmTreeModel { QStringList allSources() const; QStringList allReleaseGroups() const; bool setPartNo(int partId, int newPartId, const QString &subtitle); + bool setFavorite(int partId, bool favorite); signals: void needRefresh(); @@ -83,6 +84,7 @@ class ArchiveModel : public SmTreeModel { QList mCollectors; QHash mNodeIcons; QMutex mCacheMx; + QMutex mRootAccessMx; int mOrder; }; diff --git a/archiveview.cpp b/archiveview.cpp index 27aacc9..295ddae 100644 --- a/archiveview.cpp +++ b/archiveview.cpp @@ -371,6 +371,17 @@ void ArchiveTree::editSeriesPart(){ } } +void ArchiveTree::markAsFavorite(){ + QModelIndex idx = firstSelected(); + if(!idx.isValid()){ + return; + } + int pId = idx.data(ArchiveModel::SeriesPartIdRole).toInt(); + bool fav = idx.data(ArchiveModel::FavoriteRole).toBool(); + ArchiveController *c = SmGlobals::instance()->archiveController(); + c->archiveTreeModel()->setFavorite(pId, !fav); +} + void ArchiveTree::impossible(const QString msg){ QMessageBox::critical(this, tr("Error"), msg); } diff --git a/archiveview.h b/archiveview.h index c786b33..36e915c 100644 --- a/archiveview.h +++ b/archiveview.h @@ -89,6 +89,7 @@ class ArchiveTree : public SmTreeView { void editGenres(); void editMetadata(); void editSeriesPart(); + void markAsFavorite(); private: void impossible(const QString msg = tr("Unable to perform function!")); diff --git a/shemov.cpp b/shemov.cpp index 48fd8ff..472b64c 100644 --- a/shemov.cpp +++ b/shemov.cpp @@ -583,9 +583,13 @@ void SheMov::createActions(){ mArchiveViewMetadataA->setData(ArchiveModel::SeriesPartNode); connect(mArchiveViewMetadataA, SIGNAL(triggered()), c->archiveTree(), SLOT(editMetadata())); // refresh all - mRefreshArchiveA = new QAction(tr("Refresh"), this); - mRefreshArchiveA->setData(ArchiveModel::AllNodes); - connect(mRefreshArchiveA, SIGNAL(triggered()), c->archiveView(), SLOT(refreshArchive())); + mArchiveViewRefreshA = new QAction(tr("Refresh"), this); + mArchiveViewRefreshA->setData(ArchiveModel::AllNodes); + connect(mArchiveViewRefreshA, SIGNAL(triggered()), c->archiveView(), SLOT(refreshArchive())); + // mark as favorite + mArchiveViewMarkFavA = new QAction(tr("Mark as favorite"), this); + mArchiveViewMarkFavA->setData(ArchiveModel::SeriesPartNode); + connect(mArchiveViewMarkFavA, SIGNAL(triggered()), c->archiveTree(), SLOT(markAsFavorite())); // ArchiveFiles actions <- ArchiveView! // play selected @@ -778,7 +782,9 @@ void SheMov::createMenus(){ c->addActionForTree(mArchiveViewPartnoA); c->addActionForTree(mArchiveViewMetadataA); c->addActionForTree(createSeparator()); - c->addActionForTree(mRefreshArchiveA); + c->addActionForTree(mArchiveViewMarkFavA); + c->addActionForTree(createSeparator()); + c->addActionForTree(mArchiveViewRefreshA); QMenu *archiveTreeM = new QMenu(tr("Archive"), this); archiveTreeM->addActions(c->archiveTree()->actions()); diff --git a/shemov.h b/shemov.h index 27f08ab..dd085d6 100644 --- a/shemov.h +++ b/shemov.h @@ -141,7 +141,8 @@ class SheMov : public QMainWindow { QAction *mArchiveViewGenresA; QAction *mArchiveViewPartnoA; QAction *mArchiveViewMetadataA; - QAction *mRefreshArchiveA; + QAction *mArchiveViewRefreshA; + QAction *mArchiveViewMarkFavA; QActionGroup *mArchiveFilesAG; //ArchiveFiles actions -- cgit v1.2.3-70-g09d2