diff --git a/src/src.pro b/src/src.pro index 8c0e2144d..34eb13e7b 100644 --- a/src/src.pro +++ b/src/src.pro @@ -154,7 +154,6 @@ nox { autoexpandabledialog.h \ statsdialog.h \ messageboxraised.h \ - statussortfilterproxymodel.h \ torrentfilterenum.h SOURCES += mainwindow.cpp \ @@ -179,7 +178,6 @@ nox { autoexpandabledialog.cpp \ statsdialog.cpp \ messageboxraised.cpp \ - statussortfilterproxymodel.cpp \ statusbar.cpp \ trackerlogin.cpp diff --git a/src/statussortfilterproxymodel.cpp b/src/statussortfilterproxymodel.cpp deleted file mode 100644 index 5eb4d8ec7..000000000 --- a/src/statussortfilterproxymodel.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Bittorrent Client using Qt4 and libtorrent. - * Copyright (C) 2014 sledgehammer999 - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - * - * Contact : hammered999@gmail.com - */ - -#include "statussortfilterproxymodel.h" -#include "torrentmodel.h" - -StatusSortFilterProxyModel::StatusSortFilterProxyModel(QObject *parent) : QSortFilterProxyModel(parent), filter0(TorrentFilter::ALL) -{ -} - -void StatusSortFilterProxyModel::setFilterStatus(const TorrentFilter::TorrentFilter &filter) { - if (filter != filter0) { - filter0 = filter; - invalidateFilter(); - } -} - -TorrentFilter::TorrentFilter StatusSortFilterProxyModel::getFilterStatus() const { - return filter0; -} - -bool StatusSortFilterProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const { - if (filter0 == TorrentFilter::ALL) - return true; - QAbstractItemModel *model = sourceModel(); - if (!model) return false; - QModelIndex index = model->index(sourceRow, TorrentModelItem::TR_STATUS, sourceParent); - TorrentModelItem::State state = (TorrentModelItem::State)index.data().toInt(); - - switch (filter0) { - case TorrentFilter::DOWNLOADING: - return (state == TorrentModelItem::STATE_DOWNLOADING || state == TorrentModelItem::STATE_STALLED_DL - || state == TorrentModelItem::STATE_PAUSED_DL || state == TorrentModelItem::STATE_CHECKING_DL - || state == TorrentModelItem::STATE_QUEUED_DL || state == TorrentModelItem::STATE_DOWNLOADING_META); - - case TorrentFilter::COMPLETED: - return (state == TorrentModelItem::STATE_SEEDING || state == TorrentModelItem::STATE_STALLED_UP - || state == TorrentModelItem::STATE_PAUSED_UP || state == TorrentModelItem::STATE_CHECKING_UP - || state == TorrentModelItem::STATE_QUEUED_UP); - - case TorrentFilter::PAUSED: - return (state == TorrentModelItem::STATE_PAUSED_UP || state == TorrentModelItem::STATE_PAUSED_DL); - - case TorrentFilter::ACTIVE: - if (state == TorrentModelItem::STATE_STALLED_DL) { - const qulonglong up_speed = model->index(sourceRow, TorrentModelItem::TR_UPSPEED, sourceParent).data().toULongLong(); - return (up_speed > 0); - } - - return (state == TorrentModelItem::STATE_DOWNLOADING || state == TorrentModelItem::STATE_SEEDING); - - case TorrentFilter::INACTIVE: - if (state == TorrentModelItem::STATE_STALLED_DL) { - const qulonglong up_speed = model->index(sourceRow, TorrentModelItem::TR_UPSPEED, sourceParent).data().toULongLong(); - return !(up_speed > 0); - } - - return (state != TorrentModelItem::STATE_DOWNLOADING && state != TorrentModelItem::STATE_SEEDING); - - default: - return false; - } -} diff --git a/src/statussortfilterproxymodel.h b/src/statussortfilterproxymodel.h deleted file mode 100644 index b5a5b1cec..000000000 --- a/src/statussortfilterproxymodel.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Bittorrent Client using Qt4 and libtorrent. - * Copyright (C) 2014 sledgehammer999 - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - * - * Contact : hammered999@gmail.com - */ - -#ifndef STATUSSORTFILTERPROXYMODEL_H -#define STATUSSORTFILTERPROXYMODEL_H - -#include -#include "torrentfilterenum.h" - -class StatusSortFilterProxyModel : public QSortFilterProxyModel { - Q_OBJECT - -public: - StatusSortFilterProxyModel(QObject *parent = 0); - void setFilterStatus(const TorrentFilter::TorrentFilter &filter); - TorrentFilter::TorrentFilter getFilterStatus() const; - -protected: - bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const; - -private: - TorrentFilter::TorrentFilter filter0; -}; - -#endif // STATUSSORTFILTERPROXYMODEL_H diff --git a/src/transferlistsortmodel.cpp b/src/transferlistsortmodel.cpp index 9c3c1f19d..d74b3c818 100644 --- a/src/transferlistsortmodel.cpp +++ b/src/transferlistsortmodel.cpp @@ -35,8 +35,16 @@ TransferListSortModel::TransferListSortModel(QObject *parent) : QSortFilterProxyModel(parent) + , filter0(TorrentFilter::ALL) {} +void TransferListSortModel::setStatusFilter(const TorrentFilter::TorrentFilter &filter) { + if (filter != filter0) { + filter0 = filter; + invalidateFilter(); + } +} + bool TransferListSortModel::lessThan(const QModelIndex &left, const QModelIndex &right) const { const int column = sortColumn(); @@ -169,3 +177,51 @@ bool TransferListSortModel::lessThan(const QModelIndex &left, const QModelIndex return QSortFilterProxyModel::lessThan(left, right); } + +bool TransferListSortModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const { + return matchStatusFilter(sourceRow, sourceParent) + && QSortFilterProxyModel::filterAcceptsRow(sourceRow, sourceParent); +} + +bool TransferListSortModel::matchStatusFilter(int sourceRow, const QModelIndex &sourceParent) const { + if (filter0 == TorrentFilter::ALL) + return true; + QAbstractItemModel *model = sourceModel(); + if (!model) return false; + QModelIndex index = model->index(sourceRow, TorrentModelItem::TR_STATUS, sourceParent); + TorrentModelItem::State state = (TorrentModelItem::State)index.data().toInt(); + + switch (filter0) { + case TorrentFilter::DOWNLOADING: + return (state == TorrentModelItem::STATE_DOWNLOADING || state == TorrentModelItem::STATE_STALLED_DL + || state == TorrentModelItem::STATE_PAUSED_DL || state == TorrentModelItem::STATE_CHECKING_DL + || state == TorrentModelItem::STATE_QUEUED_DL || state == TorrentModelItem::STATE_DOWNLOADING_META); + + case TorrentFilter::COMPLETED: + return (state == TorrentModelItem::STATE_SEEDING || state == TorrentModelItem::STATE_STALLED_UP + || state == TorrentModelItem::STATE_PAUSED_UP || state == TorrentModelItem::STATE_CHECKING_UP + || state == TorrentModelItem::STATE_QUEUED_UP); + + case TorrentFilter::PAUSED: + return (state == TorrentModelItem::STATE_PAUSED_UP || state == TorrentModelItem::STATE_PAUSED_DL); + + case TorrentFilter::ACTIVE: + if (state == TorrentModelItem::STATE_STALLED_DL) { + const qulonglong up_speed = model->index(sourceRow, TorrentModelItem::TR_UPSPEED, sourceParent).data().toULongLong(); + return (up_speed > 0); + } + + return (state == TorrentModelItem::STATE_DOWNLOADING || state == TorrentModelItem::STATE_SEEDING); + + case TorrentFilter::INACTIVE: + if (state == TorrentModelItem::STATE_STALLED_DL) { + const qulonglong up_speed = model->index(sourceRow, TorrentModelItem::TR_UPSPEED, sourceParent).data().toULongLong(); + return !(up_speed > 0); + } + + return (state != TorrentModelItem::STATE_DOWNLOADING && state != TorrentModelItem::STATE_SEEDING); + + default: + return false; + } +} diff --git a/src/transferlistsortmodel.h b/src/transferlistsortmodel.h index a25b3fc79..a0e261efb 100644 --- a/src/transferlistsortmodel.h +++ b/src/transferlistsortmodel.h @@ -32,6 +32,7 @@ #define TRANSFERLISTSORTMODEL_H #include +#include "torrentfilterenum.h" class TransferListSortModel : public QSortFilterProxyModel { Q_OBJECT @@ -39,8 +40,16 @@ class TransferListSortModel : public QSortFilterProxyModel { public: TransferListSortModel(QObject *parent = 0); -protected: - virtual bool lessThan(const QModelIndex &left, const QModelIndex &right) const; + void setStatusFilter(const TorrentFilter::TorrentFilter &filter); + +private: + bool lessThan(const QModelIndex &left, const QModelIndex &right) const; + bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const; + + bool matchStatusFilter(int sourceRow, const QModelIndex &sourceParent) const; + +private: + TorrentFilter::TorrentFilter filter0; }; #endif // TRANSFERLISTSORTMODEL_H diff --git a/src/transferlistwidget.cpp b/src/transferlistwidget.cpp index f8e435a09..abd0bea0c 100644 --- a/src/transferlistwidget.cpp +++ b/src/transferlistwidget.cpp @@ -63,7 +63,6 @@ #include "iconprovider.h" #include "fs_utils.h" #include "autoexpandabledialog.h" -#include "statussortfilterproxymodel.h" #include "transferlistsortmodel.h" using namespace libtorrent; @@ -89,13 +88,9 @@ TransferListWidget::TransferListWidget(QWidget *parent, MainWindow *main_window, labelFilterModel->setFilterKeyColumn(TorrentModelItem::TR_LABEL); labelFilterModel->setFilterRole(Qt::DisplayRole); - statusFilterModel = new StatusSortFilterProxyModel(); - statusFilterModel->setDynamicSortFilter(true); - statusFilterModel->setSourceModel(labelFilterModel); - nameFilterModel = new TransferListSortModel(); nameFilterModel->setDynamicSortFilter(true); - nameFilterModel->setSourceModel(statusFilterModel); + nameFilterModel->setSourceModel(labelFilterModel); nameFilterModel->setFilterKeyColumn(TorrentModelItem::TR_NAME); nameFilterModel->setFilterRole(Qt::DisplayRole); nameFilterModel->setSortCaseSensitivity(Qt::CaseInsensitive); @@ -171,7 +166,6 @@ TransferListWidget::~TransferListWidget() { saveSettings(); // Clean up delete labelFilterModel; - delete statusFilterModel; delete nameFilterModel; delete listModel; delete listDelegate; @@ -204,16 +198,14 @@ inline QString TransferListWidget::getHashFromRow(int row) const { inline QModelIndex TransferListWidget::mapToSource(const QModelIndex &index) const { Q_ASSERT(index.isValid()); if (index.model() == nameFilterModel) - return labelFilterModel->mapToSource(statusFilterModel->mapToSource(nameFilterModel->mapToSource(index))); - if (index.model() == statusFilterModel) - return labelFilterModel->mapToSource(statusFilterModel->mapToSource(index)); + return labelFilterModel->mapToSource(nameFilterModel->mapToSource(index)); return labelFilterModel->mapToSource(index); } inline QModelIndex TransferListWidget::mapFromSource(const QModelIndex &index) const { Q_ASSERT(index.isValid()); Q_ASSERT(index.model() == labelFilterModel); - return nameFilterModel->mapFromSource(statusFilterModel->mapFromSource(labelFilterModel->mapFromSource(index))); + return nameFilterModel->mapFromSource(labelFilterModel->mapFromSource(index)); } void TransferListWidget::torrentDoubleClicked(const QModelIndex& index) { @@ -919,7 +911,7 @@ void TransferListWidget::applyNameFilter(const QString& name) { } void TransferListWidget::applyStatusFilter(int f) { - statusFilterModel->setFilterStatus((TorrentFilter::TorrentFilter)f); + nameFilterModel->setStatusFilter((TorrentFilter::TorrentFilter)f); // Select first item if nothing is selected if (selectionModel()->selectedRows(0).empty() && nameFilterModel->rowCount() > 0) { qDebug("Nothing is selected, selecting first row: %s", qPrintable(nameFilterModel->index(0, TorrentModelItem::TR_NAME).data().toString())); diff --git a/src/transferlistwidget.h b/src/transferlistwidget.h index a07e6123a..8ddc27900 100644 --- a/src/transferlistwidget.h +++ b/src/transferlistwidget.h @@ -40,7 +40,6 @@ class MainWindow; class TransferListDelegate; class TransferListSortModel; class TorrentModel; -class StatusSortFilterProxyModel; QT_BEGIN_NAMESPACE class QShortcut; @@ -114,7 +113,6 @@ private: TransferListDelegate *listDelegate; TorrentModel *listModel; TransferListSortModel *nameFilterModel; - StatusSortFilterProxyModel *statusFilterModel; QSortFilterProxyModel *labelFilterModel; QBtSession* BTSession; MainWindow *main_window;