diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp index 1efebd8b3..246b89561 100644 --- a/src/gui/mainwindow.cpp +++ b/src/gui/mainwindow.cpp @@ -35,11 +35,13 @@ #include #include #include +#include #include #include #include #include #include +#include #include #include #include @@ -187,15 +189,23 @@ MainWindow::MainWindow(IGUIApplication *app, WindowState initialState) hSplitter->setChildrenCollapsible(false); hSplitter->setFrameShape(QFrame::NoFrame); - // Name filter + // Torrent filter m_searchFilter = new LineEdit(this); - m_searchFilter->setPlaceholderText(tr("Filter torrent names...")); + m_searchFilter->setPlaceholderText(tr("Filter torrents...")); m_searchFilter->setFixedWidth(200); m_searchFilter->setContextMenuPolicy(Qt::CustomContextMenu); connect(m_searchFilter, &QWidget::customContextMenuRequested, this, &MainWindow::showFilterContextMenu); m_searchFilterAction = m_ui->toolBar->insertWidget(m_ui->actionLock, m_searchFilter); - - QWidget *spacer = new QWidget(this); + auto *filterColumnWidget = new QWidget(this); + auto *filterLabel = new QLabel(tr("Filter by:")); + filterLabel->setMargin(7); + m_filterColumnComboBox = new QComboBox(this); + QHBoxLayout *filterColumnLayout = new QHBoxLayout(this); + filterColumnLayout->addWidget(filterLabel); + filterColumnLayout->addWidget(m_filterColumnComboBox); + filterColumnWidget->setLayout(filterColumnLayout); + m_ui->toolBar->insertWidget(m_ui->actionLock, filterColumnWidget); + auto *spacer = new QWidget(this); spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); m_ui->toolBar->insertWidget(m_searchFilterAction, spacer); @@ -213,8 +223,15 @@ MainWindow::MainWindow(IGUIApplication *app, WindowState initialState) UIThemeManager::instance()->getIcon(u"folder-remote"_qs), #endif tr("Transfers")); - - connect(m_searchFilter, &LineEdit::textChanged, m_transferListWidget, &TransferListWidget::applyNameFilter); + // Filter types + const QVector filterTypes = {TransferListModel::Column::TR_NAME, TransferListModel::Column::TR_SAVE_PATH}; + for (const TransferListModel::Column type : filterTypes) + { + const QString typeName = m_transferListWidget->getSourceModel()->headerData(type, Qt::Horizontal, Qt::DisplayRole).value(); + m_filterColumnComboBox->addItem(typeName, type); + } + connect(m_filterColumnComboBox, &QComboBox::currentIndexChanged, this, &MainWindow::applyTransferListFilter); + connect(m_searchFilter, &LineEdit::textChanged, this, &MainWindow::applyTransferListFilter); connect(hSplitter, &QSplitter::splitterMoved, this, &MainWindow::saveSettings); connect(m_splitter, &QSplitter::splitterMoved, this, &MainWindow::saveSplitterSettings); connect(BitTorrent::Session::instance(), &BitTorrent::Session::trackersChanged, m_propertiesWidget, &PropertiesWidget::loadTrackers); @@ -670,7 +687,7 @@ void MainWindow::showFilterContextMenu() useRegexAct->setCheckable(true); useRegexAct->setChecked(pref->getRegexAsFilteringPatternForTransferList()); connect(useRegexAct, &QAction::toggled, pref, &Preferences::setRegexAsFilteringPatternForTransferList); - connect(useRegexAct, &QAction::toggled, this, [this]() { m_transferListWidget->applyNameFilter(m_searchFilter->text()); }); + connect(useRegexAct, &QAction::toggled, this, &MainWindow::applyTransferListFilter); menu->popup(QCursor::pos()); } @@ -1917,6 +1934,11 @@ void MainWindow::updatePowerManagementState() m_pwr->setActivityState(inhibitSuspend); } +void MainWindow::applyTransferListFilter() +{ + m_transferListWidget->applyFilter(m_searchFilter->text(), m_filterColumnComboBox->currentData().value()); +} + #if defined(Q_OS_WIN) || defined(Q_OS_MACOS) void MainWindow::checkProgramUpdate(const bool invokedByUser) { diff --git a/src/gui/mainwindow.h b/src/gui/mainwindow.h index 4c2b876ed..e9a5b27fb 100644 --- a/src/gui/mainwindow.h +++ b/src/gui/mainwindow.h @@ -39,6 +39,7 @@ #include "windowstate.h" class QCloseEvent; +class QComboBox; class QFileSystemWatcher; class QSplitter; class QTabWidget; @@ -194,6 +195,7 @@ private: void createTorrentTriggered(const Path &path); void showStatusBar(bool show); void showFiltersSidebar(bool show); + void applyTransferListFilter(); Ui::MainWindow *m_ui = nullptr; @@ -219,6 +221,7 @@ private: bool m_unlockDlgShowing = false; LineEdit *m_searchFilter = nullptr; QAction *m_searchFilterAction = nullptr; + QComboBox *m_filterColumnComboBox = nullptr; // Widgets QAction *m_queueSeparator = nullptr; QAction *m_queueSeparatorMenu = nullptr; diff --git a/src/gui/transferlistmodel.h b/src/gui/transferlistmodel.h index d177e2001..7f42c6aef 100644 --- a/src/gui/transferlistmodel.h +++ b/src/gui/transferlistmodel.h @@ -143,3 +143,5 @@ private: QIcon m_stalledUPIcon; QIcon m_uploadingIcon; }; + +Q_DECLARE_METATYPE(TransferListModel::Column) diff --git a/src/gui/transferlistwidget.cpp b/src/gui/transferlistwidget.cpp index f413e2e94..246a72860 100644 --- a/src/gui/transferlistwidget.cpp +++ b/src/gui/transferlistwidget.cpp @@ -64,7 +64,6 @@ #include "torrentoptionsdialog.h" #include "trackerentriesdialog.h" #include "transferlistdelegate.h" -#include "transferlistmodel.h" #include "transferlistsortmodel.h" #include "tristateaction.h" #include "uithememanager.h" @@ -1299,8 +1298,9 @@ void TransferListWidget::applyTrackerFilter(const QSet &t m_sortFilterModel->setTrackerFilter(torrentIDs); } -void TransferListWidget::applyNameFilter(const QString &name) +void TransferListWidget::applyFilter(const QString &name, const TransferListModel::Column &type) { + m_sortFilterModel->setFilterKeyColumn(type); const QString pattern = (Preferences::instance()->getRegexAsFilteringPatternForTransferList() ? name : Utils::String::wildcardToRegexPattern(name)); m_sortFilterModel->setFilterRegularExpression(QRegularExpression(pattern, QRegularExpression::CaseInsensitiveOption)); diff --git a/src/gui/transferlistwidget.h b/src/gui/transferlistwidget.h index 51caeee7d..5b5be7d61 100644 --- a/src/gui/transferlistwidget.h +++ b/src/gui/transferlistwidget.h @@ -34,10 +34,10 @@ #include #include "base/bittorrent/infohash.h" +#include "transferlistmodel.h" class MainWindow; class Path; -class TransferListModel; class TransferListSortModel; namespace BitTorrent @@ -92,7 +92,7 @@ public slots: void setTorrentOptions(); void previewSelectedTorrents(); void hideQueuePosColumn(bool hide); - void applyNameFilter(const QString &name); + void applyFilter(const QString &name, const TransferListModel::Column &type); void applyStatusFilter(int f); void applyCategoryFilter(const QString &category); void applyTagFilter(const QString &tag);