summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--archivemodel.cpp27
-rw-r--r--archivemodel.h2
-rw-r--r--archiveview.cpp11
-rw-r--r--archiveview.h1
-rw-r--r--shemov.cpp14
-rw-r--r--shemov.h3
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<ArchiveCollector*> mCollectors;
QHash<int, QIcon> 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