]> Some of my projects - localmylist.git/commitdiff
Rework the way MyListView gets data for context menus
authorAPTX <marek321@gmail.com>
Mon, 23 Jul 2012 01:34:44 +0000 (03:34 +0200)
committerAPTX <marek321@gmail.com>
Mon, 23 Jul 2012 01:34:44 +0000 (03:34 +0200)
localmylist/mylistmodel.cpp
localmylist/mylistmodel.h
management-gui/mainwindow.cpp
management-gui/mylistfiltermodel.cpp
management-gui/mylistfiltermodel.h
management-gui/mylistview.cpp
management-gui/mylistview.h

index d21430299792cd2ac1b21b6ad851a533f679eec1..3ab101fa1cfd4c9546db11f48a7e7bf9d2fc7de0 100644 (file)
@@ -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<MyListNode *>(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<MyListNode *>(idx.internalPointer())->id();
+       return static_cast<MyListNode *>(idx.internalPointer());
 }
 
 void MyListModel::reload()
index 42e3d4f97a8e90ce8f53d9708ea7c78c5b32a95c..78f1880c4c9b916bf7136006a538bc5b7bb0a845 100644 (file)
@@ -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:
index cf49fe73288a6ad09206c2a672972110ba4b3aab..a662e21f3e952fbb2186f909491c0e3982377fcf 100644 (file)
@@ -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;
index 09bdae6199caf78e0c2231f599f5077773a19c0d..f0a074523a64ac6fe199e4586feb5d8653e181fc 100644 (file)
@@ -1,5 +1,8 @@
 #include "mylistfiltermodel.h"
 
+#include "mylistmodel.h"
+#include "mylistnode.h"
+
 #include <QDebug>
 
 MyListFilterModel::MyListFilterModel(QObject *parent) :
@@ -8,6 +11,19 @@ MyListFilterModel::MyListFilterModel(QObject *parent) :
        setFilterCaseSensitivity(Qt::CaseInsensitive);
 }
 
+LocalMyList::MyListModel *MyListFilterModel::myListModel() const
+{
+       return qobject_cast<LocalMyList::MyListModel *>(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())
index aae9c6120a681ff0340cbfcf6cc1a232db586a19..f6564199025d5182983a0f8a04558343fcfee6d5 100644 (file)
@@ -3,12 +3,21 @@
 
 #include <QSortFilterProxyModel>
 
+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;
 };
index 86faeb588039a1d012ca213b4de75d6ef5a01c5c..0dde9aa27d0972c23eebc244ef4a84a282b62a55 100644 (file)
@@ -2,6 +2,8 @@
 
 #include "mylist.h"
 #include "mylistmodel.h"
+#include "mylistnode.h"
+#include "mylistfiltermodel.h"
 
 #include <QHeaderView>
 #include <QMenu>
@@ -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<LocalMyList::MyListModel *>(model());
+       return qobject_cast<MyListFilterModel *>(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<QAction *> 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);
 }
index a7ffe1e3ac69a6ec06eb3e44dd375df100c9a50a..430b1a93f3ba16339119344968900c282bf869d3 100644 (file)
@@ -4,9 +4,7 @@
 #include <QTreeView>
 #include <QModelIndex>
 
-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();