connect(markAnimeWatchedAction, SIGNAL(triggered()), this, SLOT(markAnimeWatched()));\r
markEpisodeWatchedAction = new QAction(tr("Mark Episode Watched"), this);\r
connect(markEpisodeWatchedAction, SIGNAL(triggered()), this, SLOT(markEpisodeWatched()));\r
+ markSelectionWatchedAction = new QAction(tr("Mark Selected Episodes/Files Watched"), this);\r
+ connect(markSelectionWatchedAction, SIGNAL(triggered()), this, SLOT(markSelectionWatched()));\r
markFileWatchedAction = new QAction(tr("Mark Watched"), this);\r
connect(markFileWatchedAction, SIGNAL(triggered()), this, SLOT(markFileWatched()));\r
markFileUnwatchedAction = new QAction(tr("Mark Unwatched"), this);\r
{\r
using namespace LocalMyList;\r
\r
- const QModelIndex idx = indexAt(pos);\r
- if (!idx.isValid())\r
- return;\r
-\r
- DynamicModel::Node *node = dynamicModelFilterModel()->node(idx);\r
+ lastSelection = selectionModel()->selectedRows();\r
\r
QList<QAction *> actions;\r
+ const QModelIndex idx = indexAt(pos);\r
\r
- if (node->data()->type()->name() == "anime")\r
- {\r
- aniDBLinkAction->setText(tr("Open AniDB Page (%1%2)").arg('a').arg(node->id()));\r
- actions << aniDBLinkAction\r
- << openNextAction\r
- << markAnimeWatchedAction\r
- << renameFilesAction\r
- << requestDataAction;\r
- }\r
- else if (node->data()->type()->name() == "episode")\r
- {\r
- aniDBLinkAction->setText(tr("Open AniDB Page (%1%2)").arg('e').arg(node->id()));\r
- actions << aniDBLinkAction\r
- << openAction\r
- << markEpisodeWatchedAction\r
- << renameFilesAction\r
- << requestDataAction;\r
- }\r
- else if (node->data()->type()->name() == "file"\r
- || node->data()->type()->name() == "episode_file")\r
+ if (lastSelection.count() == 1)\r
{\r
- aniDBLinkAction->setText(tr("Open AniDB Page (%1%2)").arg('f').arg(node->id()));\r
- actions << aniDBLinkAction\r
- << openAction\r
- << markFileWatchedAction\r
- << markFileUnwatchedAction\r
- << renameTestAction\r
- << renameFilesAction\r
- << requestDataAction;\r
+ if (!idx.isValid())\r
+ return;\r
+\r
+ DynamicModel::Node *node = dynamicModelFilterModel()->node(idx);\r
+\r
+\r
+ if (node->data()->type()->name() == "anime")\r
+ {\r
+ aniDBLinkAction->setText(tr("Open AniDB Page (%1%2)").arg('a').arg(node->id()));\r
+ actions << aniDBLinkAction\r
+ << openNextAction\r
+ << markAnimeWatchedAction\r
+ << renameFilesAction\r
+ << requestDataAction;\r
+ }\r
+ else if (node->data()->type()->name() == "episode")\r
+ {\r
+ aniDBLinkAction->setText(tr("Open AniDB Page (%1%2)").arg('e').arg(node->id()));\r
+ actions << aniDBLinkAction\r
+ << openAction\r
+ << markEpisodeWatchedAction\r
+ << renameFilesAction\r
+ << requestDataAction;\r
+ }\r
+ else if (node->data()->type()->name() == "file"\r
+ || node->data()->type()->name() == "episode_file")\r
+ {\r
+ aniDBLinkAction->setText(tr("Open AniDB Page (%1%2)").arg('f').arg(node->id()));\r
+ actions << aniDBLinkAction\r
+ << openAction\r
+ << markFileWatchedAction\r
+ << markFileUnwatchedAction\r
+ << renameTestAction\r
+ << renameFilesAction\r
+ << requestDataAction;\r
+ }\r
+ else if (node->data()->type()->name() == "file_location")\r
+ {\r
+ aniDBLinkAction->setText(tr("Open AniDB Page (%1%2) (%3%4)")\r
+ .arg('f').arg(node->parent()->id())\r
+ .arg("LocationId").arg(node->id()));\r
+ actions << aniDBLinkAction\r
+ << renameTestAction\r
+ << renameFilesAction\r
+ << removeFileLocationAction;\r
+ }\r
}\r
- else if (node->data()->type()->name() == "file_location")\r
+ else\r
{\r
- aniDBLinkAction->setText(tr("Open AniDB Page (%1%2) (%3%4)")\r
- .arg('f').arg(node->parent()->id())\r
- .arg("LocationId").arg(node->id()));\r
- actions << aniDBLinkAction\r
- << renameTestAction\r
- << renameFilesAction\r
- << removeFileLocationAction;\r
+ actions << markSelectionWatchedAction;\r
}\r
\r
if(actions.isEmpty())\r
void DynamicModelView::markEpisodeWatched()\r
{\r
using namespace LocalMyList;\r
-\r
DynamicModel::Node *node = dynamicModelFilterModel()->node(customContextMenuIndex);\r
-\r
- if (node->data()->type()->name() != "episode")\r
- return;\r
-\r
- const auto data = static_cast<DynamicModel::EpisodeData *>(node->data());\r
-\r
- PendingMyListUpdate pmu;\r
- pmu.aid = data->episodeData.aid;\r
- pmu.epno = data->episodeData.epno;\r
- pmu.eptype = data->episodeData.type;\r
-\r
- pmu.setMyWatched = true;\r
- pmu.myWatched = QDateTime::currentDateTime();\r
-\r
- MyList::instance()->database()->addPendingMyListUpdate(pmu);\r
+ markEpisodeWatched(node);\r
}\r
\r
void DynamicModelView::markFileWatched()\r
{\r
using namespace LocalMyList;\r
-\r
DynamicModel::Node *node = dynamicModelFilterModel()->node(customContextMenuIndex);\r
+ markFileWatched(node);\r
+}\r
\r
- if (node->data()->type()->name() != "file"\r
- && node->data()->type()->name() != "episode_file")\r
- return;\r
+void DynamicModelView::markSelectionWatched()\r
+{\r
+ using namespace LocalMyList;\r
\r
- MyList::instance()->markWatched(node->id());\r
+ RaiiTransaction t{MyList::instance()->database()};\r
+ t.commit();\r
+\r
+ for (const auto &index : lastSelection) {\r
+ DynamicModel::Node *node = dynamicModelFilterModel()->node(index);\r
+ markEpisodeWatched(node);\r
+ markFileWatched(node);\r
+ }\r
}\r
\r
void DynamicModelView::markFileUnwatched()\r
if (id)\r
emit removeFileLocationRequested(id);\r
}\r
+\r
+\r
+void DynamicModelView::markEpisodeWatched(const LocalMyList::DynamicModel::Node *node)\r
+{\r
+ using namespace LocalMyList;\r
+\r
+ Q_ASSERT(node);\r
+\r
+ if (node->data()->type()->name() != "episode")\r
+ return;\r
+\r
+ const auto data = static_cast<DynamicModel::EpisodeData *>(node->data());\r
+\r
+ PendingMyListUpdate pmu;\r
+ pmu.aid = data->episodeData.aid;\r
+ pmu.epno = data->episodeData.epno;\r
+ pmu.eptype = data->episodeData.type;\r
+\r
+ pmu.setMyWatched = true;\r
+ pmu.myWatched = QDateTime::currentDateTime();\r
+\r
+ MyList::instance()->database()->addPendingMyListUpdate(pmu);\r
+}\r
+\r
+void DynamicModelView::markFileWatched(const LocalMyList::DynamicModel::Node *node)\r
+{\r
+ using namespace LocalMyList;\r
+\r
+ Q_ASSERT(node);\r
+\r
+ if (node->data()->type()->name() != "file"\r
+ && node->data()->type()->name() != "episode_file")\r
+ return;\r
+\r
+ MyList::instance()->markWatched(node->id());\r
+}\r