From 7bf6a7536733626853b317e37c48c200a84d6f48 Mon Sep 17 00:00:00 2001 From: APTX Date: Tue, 6 Aug 2019 01:10:34 +0900 Subject: [PATCH] Enable marking multiple files as watched --- localmylist-management/dynamicmodelview.cpp | 165 +++++++++++------- localmylist-management/dynamicmodelview.h | 6 + .../tabs/dynamicmodeltab.cpp | 6 +- 3 files changed, 114 insertions(+), 63 deletions(-) diff --git a/localmylist-management/dynamicmodelview.cpp b/localmylist-management/dynamicmodelview.cpp index 22f3aed..b4d05c1 100644 --- a/localmylist-management/dynamicmodelview.cpp +++ b/localmylist-management/dynamicmodelview.cpp @@ -31,6 +31,8 @@ DynamicModelView::DynamicModelView(QWidget *parent) : connect(markAnimeWatchedAction, SIGNAL(triggered()), this, SLOT(markAnimeWatched())); markEpisodeWatchedAction = new QAction(tr("Mark Episode Watched"), this); connect(markEpisodeWatchedAction, SIGNAL(triggered()), this, SLOT(markEpisodeWatched())); + markSelectionWatchedAction = new QAction(tr("Mark Selected Episodes/Files Watched"), this); + connect(markSelectionWatchedAction, SIGNAL(triggered()), this, SLOT(markSelectionWatched())); markFileWatchedAction = new QAction(tr("Mark Watched"), this); connect(markFileWatchedAction, SIGNAL(triggered()), this, SLOT(markFileWatched())); markFileUnwatchedAction = new QAction(tr("Mark Unwatched"), this); @@ -75,53 +77,63 @@ void DynamicModelView::showCustomContextMenu(const QPoint &pos) { using namespace LocalMyList; - const QModelIndex idx = indexAt(pos); - if (!idx.isValid()) - return; - - DynamicModel::Node *node = dynamicModelFilterModel()->node(idx); + lastSelection = selectionModel()->selectedRows(); QList actions; + const QModelIndex idx = indexAt(pos); - if (node->data()->type()->name() == "anime") - { - aniDBLinkAction->setText(tr("Open AniDB Page (%1%2)").arg('a').arg(node->id())); - actions << aniDBLinkAction - << openNextAction - << markAnimeWatchedAction - << renameFilesAction - << requestDataAction; - } - else if (node->data()->type()->name() == "episode") - { - aniDBLinkAction->setText(tr("Open AniDB Page (%1%2)").arg('e').arg(node->id())); - actions << aniDBLinkAction - << openAction - << markEpisodeWatchedAction - << renameFilesAction - << requestDataAction; - } - else if (node->data()->type()->name() == "file" - || node->data()->type()->name() == "episode_file") + if (lastSelection.count() == 1) { - aniDBLinkAction->setText(tr("Open AniDB Page (%1%2)").arg('f').arg(node->id())); - actions << aniDBLinkAction - << openAction - << markFileWatchedAction - << markFileUnwatchedAction - << renameTestAction - << renameFilesAction - << requestDataAction; + if (!idx.isValid()) + return; + + DynamicModel::Node *node = dynamicModelFilterModel()->node(idx); + + + if (node->data()->type()->name() == "anime") + { + aniDBLinkAction->setText(tr("Open AniDB Page (%1%2)").arg('a').arg(node->id())); + actions << aniDBLinkAction + << openNextAction + << markAnimeWatchedAction + << renameFilesAction + << requestDataAction; + } + else if (node->data()->type()->name() == "episode") + { + aniDBLinkAction->setText(tr("Open AniDB Page (%1%2)").arg('e').arg(node->id())); + actions << aniDBLinkAction + << openAction + << markEpisodeWatchedAction + << renameFilesAction + << requestDataAction; + } + else if (node->data()->type()->name() == "file" + || node->data()->type()->name() == "episode_file") + { + aniDBLinkAction->setText(tr("Open AniDB Page (%1%2)").arg('f').arg(node->id())); + actions << aniDBLinkAction + << openAction + << markFileWatchedAction + << markFileUnwatchedAction + << renameTestAction + << renameFilesAction + << requestDataAction; + } + else if (node->data()->type()->name() == "file_location") + { + aniDBLinkAction->setText(tr("Open AniDB Page (%1%2) (%3%4)") + .arg('f').arg(node->parent()->id()) + .arg("LocationId").arg(node->id())); + actions << aniDBLinkAction + << renameTestAction + << renameFilesAction + << removeFileLocationAction; + } } - else if (node->data()->type()->name() == "file_location") + else { - aniDBLinkAction->setText(tr("Open AniDB Page (%1%2) (%3%4)") - .arg('f').arg(node->parent()->id()) - .arg("LocationId").arg(node->id())); - actions << aniDBLinkAction - << renameTestAction - << renameFilesAction - << removeFileLocationAction; + actions << markSelectionWatchedAction; } if(actions.isEmpty()) @@ -164,36 +176,29 @@ void DynamicModelView::markAnimeWatched() void DynamicModelView::markEpisodeWatched() { using namespace LocalMyList; - DynamicModel::Node *node = dynamicModelFilterModel()->node(customContextMenuIndex); - - if (node->data()->type()->name() != "episode") - return; - - const auto data = static_cast(node->data()); - - PendingMyListUpdate pmu; - pmu.aid = data->episodeData.aid; - pmu.epno = data->episodeData.epno; - pmu.eptype = data->episodeData.type; - - pmu.setMyWatched = true; - pmu.myWatched = QDateTime::currentDateTime(); - - MyList::instance()->database()->addPendingMyListUpdate(pmu); + markEpisodeWatched(node); } void DynamicModelView::markFileWatched() { using namespace LocalMyList; - DynamicModel::Node *node = dynamicModelFilterModel()->node(customContextMenuIndex); + markFileWatched(node); +} - if (node->data()->type()->name() != "file" - && node->data()->type()->name() != "episode_file") - return; +void DynamicModelView::markSelectionWatched() +{ + using namespace LocalMyList; - MyList::instance()->markWatched(node->id()); + RaiiTransaction t{MyList::instance()->database()}; + t.commit(); + + for (const auto &index : lastSelection) { + DynamicModel::Node *node = dynamicModelFilterModel()->node(index); + markEpisodeWatched(node); + markFileWatched(node); + } } void DynamicModelView::markFileUnwatched() @@ -263,3 +268,39 @@ void DynamicModelView::removeFileLocation() if (id) emit removeFileLocationRequested(id); } + + +void DynamicModelView::markEpisodeWatched(const LocalMyList::DynamicModel::Node *node) +{ + using namespace LocalMyList; + + Q_ASSERT(node); + + if (node->data()->type()->name() != "episode") + return; + + const auto data = static_cast(node->data()); + + PendingMyListUpdate pmu; + pmu.aid = data->episodeData.aid; + pmu.epno = data->episodeData.epno; + pmu.eptype = data->episodeData.type; + + pmu.setMyWatched = true; + pmu.myWatched = QDateTime::currentDateTime(); + + MyList::instance()->database()->addPendingMyListUpdate(pmu); +} + +void DynamicModelView::markFileWatched(const LocalMyList::DynamicModel::Node *node) +{ + using namespace LocalMyList; + + Q_ASSERT(node); + + if (node->data()->type()->name() != "file" + && node->data()->type()->name() != "episode_file") + return; + + MyList::instance()->markWatched(node->id()); +} diff --git a/localmylist-management/dynamicmodelview.h b/localmylist-management/dynamicmodelview.h index ccaab98..4a289c0 100644 --- a/localmylist-management/dynamicmodelview.h +++ b/localmylist-management/dynamicmodelview.h @@ -36,6 +36,7 @@ private slots: void markAnimeWatched(); void markEpisodeWatched(); void markFileWatched(); + void markSelectionWatched(); void markFileUnwatched(); void openAnidbPage(); void requestFileRename(); @@ -44,7 +45,11 @@ private slots: void removeFileLocation(); private: + void markEpisodeWatched(const LocalMyList::DynamicModel::Node *); + void markFileWatched(const LocalMyList::DynamicModel::Node *); + QModelIndex customContextMenuIndex; + QModelIndexList lastSelection; QAction *openAction; @@ -52,6 +57,7 @@ private: QAction *markAnimeWatchedAction; QAction *markEpisodeWatchedAction; QAction *markFileWatchedAction; + QAction *markSelectionWatchedAction; QAction *markFileUnwatchedAction; QAction *aniDBLinkAction; QAction *renameTestAction; diff --git a/localmylist-management/tabs/dynamicmodeltab.cpp b/localmylist-management/tabs/dynamicmodeltab.cpp index 88f724b..d9260e4 100644 --- a/localmylist-management/tabs/dynamicmodeltab.cpp +++ b/localmylist-management/tabs/dynamicmodeltab.cpp @@ -78,6 +78,9 @@ void DynamicModelTab::init() ui->myListView->setModel(dynamicModelFilterModel); ui->myListView->setItemDelegate(new DynamicModelItemDelegate(ui->myListView)); + ui->myListView->setSelectionBehavior(QAbstractItemView::SelectRows); + ui->myListView->setSelectionMode(QAbstractItemView::ExtendedSelection); + #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) ui->myListView->header()->setSectionResizeMode(0, QHeaderView::Stretch); #else @@ -163,7 +166,8 @@ void DynamicModelTab::on_myListView_openFileRequested(const QModelIndex &index) { data = MyList::instance()->database()->openFileByEid(node->id()); } - else if (node->data()->type()->name() == "file") + else if (node->data()->type()->name() == "file" + || node->data()->type()->name() == "episode_file") { data = MyList::instance()->database()->openFile(node->id()); } -- 2.52.0