From: APTX Date: Mon, 23 Jul 2012 01:34:44 +0000 (+0200) Subject: Rework the way MyListView gets data for context menus X-Git-Url: https://gitweb.tyo.aptx.org/?a=commitdiff_plain;h=67b7b5c735c3326fa35577a221ebcb352c5451e0;p=localmylist.git Rework the way MyListView gets data for context menus --- diff --git a/localmylist/mylistmodel.cpp b/localmylist/mylistmodel.cpp index d214302..3ab101f 100644 --- a/localmylist/mylistmodel.cpp +++ b/localmylist/mylistmodel.cpp @@ -135,18 +135,11 @@ bool MyListModel::hasChildren(const QModelIndex &parent) const return rootItem->hasChildren(); } -MyListModel::NodeType MyListModel::type(const QModelIndex &idx) const -{ - if (!idx.isValid()) - return None; - return NodeType(static_cast(idx.internalPointer())->type()); -} - -int MyListModel::id(const QModelIndex &idx) const +MyListNode *MyListModel::node(const QModelIndex &idx) const { if (!idx.isValid()) return 0; - return static_cast(idx.internalPointer())->id(); + return static_cast(idx.internalPointer()); } void MyListModel::reload() diff --git a/localmylist/mylistmodel.h b/localmylist/mylistmodel.h index 42e3d4f..78f1880 100644 --- a/localmylist/mylistmodel.h +++ b/localmylist/mylistmodel.h @@ -40,8 +40,7 @@ public: signals: public slots: - NodeType type(const QModelIndex &idx) const; - int id(const QModelIndex &idx) const; + MyListNode *node(const QModelIndex &idx) const; void reload(); private: diff --git a/management-gui/mainwindow.cpp b/management-gui/mainwindow.cpp index cf49fe7..a662e21 100644 --- a/management-gui/mainwindow.cpp +++ b/management-gui/mainwindow.cpp @@ -14,6 +14,7 @@ #include "database.h" #include "settings.h" #include "mylistmodel.h" +#include "mylistnode.h" #include "mylistfiltermodel.h" #include "unknownfilelookuptask.h" #include "addrelatedepisodestask.h" @@ -152,25 +153,24 @@ void MainWindow::on_actionClearAnimeTitleData_triggered() void MainWindow::on_myListView_openFileRequested(const QModelIndex &index) { - MyListModel::NodeType type = myListModel->type(index); - int id = myListModel->id(index); + MyListNode *node = myListFilterModel->node(index); - if (!id) + if (!node->id()) return; OpenFileData data; - if (type == MyListModel::Anime) + if (node->type() == MyListNode::Anime) { - data = MyList::instance()->database()->firstUnwatchedByAid(id); + data = MyList::instance()->database()->firstUnwatchedByAid(node->id()); } - else if (type == MyListModel::Episode) + else if (node->type() == MyListNode::Episode) { - data = MyList::instance()->database()->openFileByEid(id); + data = MyList::instance()->database()->openFileByEid(node->id()); } - else if (type == MyListModel::File) + else if (node->type() == MyListNode::File) { - data = MyList::instance()->database()->openFile(id); + data = MyList::instance()->database()->openFile(node->id()); } else { @@ -190,42 +190,41 @@ void MainWindow::on_myListView_openFileRequested(const QModelIndex &index) void MainWindow::on_myListView_renameFilesRequested(const QModelIndex &index) { - MyListModel::NodeType type = myListModel->type(index); - int id = myListModel->id(index); + MyListNode *node = myListFilterModel->node(index); - if (!id) + if (!node->id()) return; QString path; QSqlQuery q(MyList::instance()->database()->connection()); QChar typeLetter; - if (type == MyListModel::Anime) + if (node->type() == MyListNode::Anime) { q.prepare( "UPDATE file_location fl SET renamed = NULL, failed_rename = false " " FROM file f " " WHERE f.fid = fl.fid AND f.aid = :aid"); - q.bindValue(":aid", id); + q.bindValue(":aid", node->id()); typeLetter = 'a'; } - else if (type == MyListModel::Episode) + else if (node->type() == MyListNode::Episode) { q.prepare( "UPDATE file_location fl SET renamed = NULL, failed_rename = false " " FROM file f " " WHERE f.fid = fl.fid AND f.eid = :eid"); - q.bindValue(":eid", id); + q.bindValue(":eid", node->id()); typeLetter = 'e'; } - else if (type == MyListModel::File) + else if (node->type() == MyListNode::File) { q.prepare( "UPDATE file_location fl SET renamed = NULL, failed_rename = false " " WHERE fl.fid = :fid"); - q.bindValue(":fid", id); + q.bindValue(":fid", node->id()); typeLetter = 'f'; } @@ -240,26 +239,28 @@ void MainWindow::on_myListView_renameFilesRequested(const QModelIndex &index) return; } - ui->statusBar->showMessage(tr("Files for %1%2 scheduled for rename").arg(typeLetter).arg(id)); + ui->statusBar->showMessage(tr("Files for %1%2 scheduled for rename").arg(typeLetter).arg(node->id())); } void MainWindow::on_myListView_dataRequested(const QModelIndex &index) { - MyListModel::NodeType type = myListModel->type(index); - int id = myListModel->id(index); + MyListNode *node = myListFilterModel->node(index); + + if (!node->id()) + return; PendingRequest r; - switch (type) + switch (node->type()) { - case MyListModel::Anime: - r.aid = id; + case MyListNode::Anime: + r.aid = node->id(); break; - case MyListModel::Episode: - r.eid = id; + case MyListNode::Episode: + r.eid = node->id(); break; - case MyListModel::File: - r.fid = id; + case MyListNode::File: + r.fid = node->id(); break; default: return; diff --git a/management-gui/mylistfiltermodel.cpp b/management-gui/mylistfiltermodel.cpp index 09bdae6..f0a0745 100644 --- a/management-gui/mylistfiltermodel.cpp +++ b/management-gui/mylistfiltermodel.cpp @@ -1,5 +1,8 @@ #include "mylistfiltermodel.h" +#include "mylistmodel.h" +#include "mylistnode.h" + #include MyListFilterModel::MyListFilterModel(QObject *parent) : @@ -8,6 +11,19 @@ MyListFilterModel::MyListFilterModel(QObject *parent) : setFilterCaseSensitivity(Qt::CaseInsensitive); } +LocalMyList::MyListModel *MyListFilterModel::myListModel() const +{ + return qobject_cast(sourceModel()); +} + +LocalMyList::MyListNode *MyListFilterModel::node(const QModelIndex &idx) const +{ + if (!idx.isValid()) + return 0; + + return myListModel()->node(mapToSource(idx)); +} + bool MyListFilterModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const { if (source_parent.isValid()) diff --git a/management-gui/mylistfiltermodel.h b/management-gui/mylistfiltermodel.h index aae9c61..f656419 100644 --- a/management-gui/mylistfiltermodel.h +++ b/management-gui/mylistfiltermodel.h @@ -3,12 +3,21 @@ #include +namespace LocalMyList { + class MyListModel; + class MyListNode; +} + class MyListFilterModel : public QSortFilterProxyModel { Q_OBJECT public: explicit MyListFilterModel(QObject *parent = 0); +public slots: + LocalMyList::MyListModel *myListModel() const; + LocalMyList::MyListNode *node(const QModelIndex &idx) const; + protected: bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const; }; diff --git a/management-gui/mylistview.cpp b/management-gui/mylistview.cpp index 86faeb5..0dde9aa 100644 --- a/management-gui/mylistview.cpp +++ b/management-gui/mylistview.cpp @@ -2,6 +2,8 @@ #include "mylist.h" #include "mylistmodel.h" +#include "mylistnode.h" +#include "mylistfiltermodel.h" #include #include @@ -33,9 +35,9 @@ MyListView::MyListView(QWidget *parent) : connect(requestDataAction, SIGNAL(triggered()), this, SLOT(requestData())); } -LocalMyList::MyListModel *MyListView::myListModel() const +MyListFilterModel *MyListView::myListFilterModel() const { - return qobject_cast(model()); + return qobject_cast(model()); } void MyListView::showCustomContextMenu(const QPoint &pos) @@ -46,29 +48,28 @@ void MyListView::showCustomContextMenu(const QPoint &pos) if (!idx.isValid()) return; - MyListModel::NodeType type = myListModel()->type(idx); - int id = myListModel()->id(idx); + MyListNode *node = myListFilterModel()->node(idx); QList actions; - switch (type) + switch (node->type()) { - case MyListModel::Anime: - aniDBLinkAction->setText(tr("Open AniDB Page (%1%2)").arg('a').arg(id)); + case MyListNode::Anime: + aniDBLinkAction->setText(tr("Open AniDB Page (%1%2)").arg('a').arg(node->id())); actions << aniDBLinkAction << openNextAction << renameFilesAction << requestDataAction; break; - case MyListModel::Episode: - aniDBLinkAction->setText(tr("Open AniDB Page (%1%2)").arg('e').arg(id)); + case MyListNode::Episode: + aniDBLinkAction->setText(tr("Open AniDB Page (%1%2)").arg('e').arg(node->id())); actions << aniDBLinkAction << openAction << renameFilesAction << requestDataAction; break; - case MyListModel::File: - aniDBLinkAction->setText(tr("Open AniDB Page (%1%2)").arg('f').arg(id)); + case MyListNode::File: + aniDBLinkAction->setText(tr("Open AniDB Page (%1%2)").arg('f').arg(node->id())); actions << aniDBLinkAction << openAction << markWatchedAction @@ -76,13 +77,15 @@ void MyListView::showCustomContextMenu(const QPoint &pos) << renameFilesAction << requestDataAction; break; - case MyListModel::FileLocation: - aniDBLinkAction->setText(tr("Open AniDB Page (%1%2)").arg('f').arg(id)); + case MyListNode::FileLocation: + aniDBLinkAction->setText(tr("Open AniDB Page (%1%2)").arg('f').arg(node->id())); actions << aniDBLinkAction << markWatchedAction << renameTestAction << renameFilesAction; break; + default: + break; } if(actions.isEmpty()) @@ -100,9 +103,11 @@ void MyListView::requestOpenFile() void MyListView::markWatched() { - int id = myListModel()->id(customContextMenuIndex); + using namespace LocalMyList; + + MyListNode *node = myListFilterModel()->node(customContextMenuIndex); - LocalMyList::instance()->markWatched(id); + MyList::instance()->markWatched(node->id()); } void MyListView::openAnidbPage() @@ -110,20 +115,19 @@ void MyListView::openAnidbPage() using namespace LocalMyList; QString aniDBUrlBase = "http://anidb.net/%1%2"; - int id = myListModel()->id(customContextMenuIndex); - MyListModel::NodeType type = myListModel()->type(customContextMenuIndex); + MyListNode *node = myListFilterModel()->node(customContextMenuIndex); - switch (type) + switch (node->type()) { - case MyListModel::Anime: - QDesktopServices::openUrl(QUrl(aniDBUrlBase.arg('a').arg(id))); + case MyListNode::Anime: + QDesktopServices::openUrl(QUrl(aniDBUrlBase.arg('a').arg(node->id()))); break; - case MyListModel::Episode: - QDesktopServices::openUrl(QUrl(aniDBUrlBase.arg('e').arg(id))); + case MyListNode::Episode: + QDesktopServices::openUrl(QUrl(aniDBUrlBase.arg('e').arg(node->id()))); break; - case MyListModel::File: - case MyListModel::FileLocation: - QDesktopServices::openUrl(QUrl(aniDBUrlBase.arg('f').arg(id))); + case MyListNode::File: + case MyListNode::FileLocation: + QDesktopServices::openUrl(QUrl(aniDBUrlBase.arg('f').arg(node->id()))); break; } } @@ -135,7 +139,7 @@ void MyListView::requestFileRename() void MyListView::renameTest() { - int id = myListModel()->id(customContextMenuIndex); + int id = myListFilterModel()->node(customContextMenuIndex)->id(); if (id) emit renameTest(id); } diff --git a/management-gui/mylistview.h b/management-gui/mylistview.h index a7ffe1e..430b1a9 100644 --- a/management-gui/mylistview.h +++ b/management-gui/mylistview.h @@ -4,9 +4,7 @@ #include #include -namespace LocalMyList { - class MyListModel; -} +class MyListFilterModel; class MyListView : public QTreeView { @@ -21,7 +19,7 @@ signals: void renameTest(int fid); private slots: - LocalMyList::MyListModel *myListModel() const; + MyListFilterModel *myListFilterModel() const; void showCustomContextMenu(const QPoint &pos); void requestOpenFile(); void markWatched();