]> Some of my projects - localmylist.git/commitdiff
Enable marking multiple files as watched
authorAPTX <marek321@gmail.com>
Mon, 5 Aug 2019 16:10:34 +0000 (01:10 +0900)
committerAPTX <marek321@gmail.com>
Mon, 5 Aug 2019 16:24:35 +0000 (01:24 +0900)
localmylist-management/dynamicmodelview.cpp
localmylist-management/dynamicmodelview.h
localmylist-management/tabs/dynamicmodeltab.cpp

index 22f3aed493dceb7925453d310165ae7a9162d080..b4d05c1ff0c798cce8807cd29122e5c404fb770a 100644 (file)
@@ -31,6 +31,8 @@ DynamicModelView::DynamicModelView(QWidget *parent) :
        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
@@ -75,53 +77,63 @@ void DynamicModelView::showCustomContextMenu(const QPoint &pos)
 {\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
@@ -164,36 +176,29 @@ void DynamicModelView::markAnimeWatched()
 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
@@ -263,3 +268,39 @@ void DynamicModelView::removeFileLocation()
        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
index ccaab98253fd5fd6b95e145487b7d350e3786626..4a289c045178cc1a862079e500b3741dbd252b7b 100644 (file)
@@ -36,6 +36,7 @@ private slots:
        void markAnimeWatched();\r
        void markEpisodeWatched();\r
        void markFileWatched();\r
+       void markSelectionWatched();\r
        void markFileUnwatched();\r
        void openAnidbPage();\r
        void requestFileRename();\r
@@ -44,7 +45,11 @@ private slots:
        void removeFileLocation();\r
 \r
 private:\r
+       void markEpisodeWatched(const LocalMyList::DynamicModel::Node *);\r
+       void markFileWatched(const LocalMyList::DynamicModel::Node *);\r
+\r
        QModelIndex customContextMenuIndex;\r
+       QModelIndexList lastSelection;\r
 \r
 \r
        QAction *openAction;\r
@@ -52,6 +57,7 @@ private:
        QAction *markAnimeWatchedAction;\r
        QAction *markEpisodeWatchedAction;\r
        QAction *markFileWatchedAction;\r
+       QAction *markSelectionWatchedAction;\r
        QAction *markFileUnwatchedAction;\r
        QAction *aniDBLinkAction;\r
        QAction *renameTestAction;\r
index 88f724b8799021e9719d7596b4965c84377cf8a1..d9260e4a055b8e461e326c02999e4a50496feec1 100644 (file)
@@ -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());
        }