Allow to refresh existing search

PR #22122.
Closes #17184.
This commit is contained in:
Vladimir Golovnev
2025-01-08 17:03:32 +03:00
committed by GitHub
parent 4fc36b9e99
commit f9f4b60b83
5 changed files with 128 additions and 66 deletions

View File

@@ -1,6 +1,6 @@
/*
* Bittorrent Client using Qt and libtorrent.
* Copyright (C) 2018-2024 Vladimir Golovnev <glassez@yandex.ru>
* Copyright (C) 2018-2025 Vladimir Golovnev <glassez@yandex.ru>
* Copyright (C) 2006 Christophe Dumez <chris@qbittorrent.org>
*
* This program is free software; you can redistribute it and/or
@@ -61,12 +61,30 @@ namespace
{
return QApplication::palette().color(QPalette::Disabled, QPalette::WindowText);
}
QString statusText(SearchJobWidget::Status st)
{
switch (st)
{
case SearchJobWidget::Status::Ongoing:
return SearchJobWidget::tr("Searching...");
case SearchJobWidget::Status::Finished:
return SearchJobWidget::tr("Search has finished");
case SearchJobWidget::Status::Aborted:
return SearchJobWidget::tr("Search aborted");
case SearchJobWidget::Status::Error:
return SearchJobWidget::tr("An error occurred during search...");
case SearchJobWidget::Status::NoResults:
return SearchJobWidget::tr("Search returned no results");
default:
return {};
}
}
}
SearchJobWidget::SearchJobWidget(SearchHandler *searchHandler, IGUIApplication *app, QWidget *parent)
: GUIApplicationComponent(app, parent)
, m_ui {new Ui::SearchJobWidget}
, m_searchHandler {searchHandler}
, m_nameFilteringMode {u"Search/FilteringMode"_s}
{
m_ui->setupUi(this);
@@ -94,7 +112,6 @@ SearchJobWidget::SearchJobWidget(SearchHandler *searchHandler, IGUIApplication *
m_proxyModel = new SearchSortModel(this);
m_proxyModel->setDynamicSortFilter(true);
m_proxyModel->setSourceModel(m_searchListModel);
m_proxyModel->setNameFilter(searchHandler->pattern());
m_ui->resultsBrowser->setModel(m_proxyModel);
m_ui->resultsBrowser->hideColumn(SearchSortModel::DL_LINK); // Hide url column
@@ -134,8 +151,9 @@ SearchJobWidget::SearchJobWidget(SearchHandler *searchHandler, IGUIApplication *
connect(header(), &QHeaderView::sortIndicatorChanged, this, &SearchJobWidget::saveSettings);
fillFilterComboBoxes();
setStatusTip(statusText(m_status));
updateFilter();
assignSearchHandler(searchHandler);
m_lineEditSearchResultsFilter = new LineEdit(this);
m_lineEditSearchResultsFilter->setPlaceholderText(tr("Filter search results..."));
@@ -165,13 +183,6 @@ SearchJobWidget::SearchJobWidget(SearchHandler *searchHandler, IGUIApplication *
connect(m_ui->resultsBrowser, &QAbstractItemView::doubleClicked, this, &SearchJobWidget::onItemDoubleClicked);
connect(searchHandler, &SearchHandler::newSearchResults, this, &SearchJobWidget::appendSearchResults);
connect(searchHandler, &SearchHandler::searchFinished, this, &SearchJobWidget::searchFinished);
connect(searchHandler, &SearchHandler::searchFailed, this, &SearchJobWidget::searchFailed);
connect(this, &QObject::destroyed, searchHandler, &QObject::deleteLater);
setStatusTip(statusText(m_status));
connect(UIThemeManager::instance(), &UIThemeManager::themeChanged, this, &SearchJobWidget::onUIThemeChanged);
}
@@ -181,6 +192,15 @@ SearchJobWidget::~SearchJobWidget()
delete m_ui;
}
QString SearchJobWidget::searchPattern() const
{
Q_ASSERT(m_searchHandler);
if (!m_searchHandler) [[unlikely]]
return {};
return m_searchHandler->pattern();
}
void SearchJobWidget::onItemDoubleClicked(const QModelIndex &index)
{
downloadTorrent(index);
@@ -238,8 +258,33 @@ LineEdit *SearchJobWidget::lineEditSearchResultsFilter() const
return m_lineEditSearchResultsFilter;
}
void SearchJobWidget::assignSearchHandler(SearchHandler *searchHandler)
{
Q_ASSERT(searchHandler);
if (!searchHandler) [[unlikely]]
return;
m_searchListModel->removeRows(0, m_searchListModel->rowCount());
delete m_searchHandler;
m_searchHandler = searchHandler;
m_searchHandler->setParent(this);
connect(m_searchHandler, &SearchHandler::newSearchResults, this, &SearchJobWidget::appendSearchResults);
connect(m_searchHandler, &SearchHandler::searchFinished, this, &SearchJobWidget::searchFinished);
connect(m_searchHandler, &SearchHandler::searchFailed, this, &SearchJobWidget::searchFailed);
m_proxyModel->setNameFilter(m_searchHandler->pattern());
updateFilter();
setStatus(Status::Ongoing);
}
void SearchJobWidget::cancelSearch()
{
Q_ASSERT(m_searchHandler);
if (!m_searchHandler) [[unlikely]]
return;
m_searchHandler->cancelSearch();
}
@@ -296,7 +341,8 @@ void SearchJobWidget::copyField(const int column) const
void SearchJobWidget::setStatus(Status value)
{
if (m_status == value) return;
if (m_status == value)
return;
m_status = value;
setStatusTip(statusText(value));
@@ -444,25 +490,6 @@ void SearchJobWidget::contextMenuEvent(QContextMenuEvent *event)
menu->popup(event->globalPos());
}
QString SearchJobWidget::statusText(SearchJobWidget::Status st)
{
switch (st)
{
case Status::Ongoing:
return tr("Searching...");
case Status::Finished:
return tr("Search has finished");
case Status::Aborted:
return tr("Search aborted");
case Status::Error:
return tr("An error occurred during search...");
case Status::NoResults:
return tr("Search returned no results");
default:
return {};
}
}
SearchJobWidget::NameFilteringMode SearchJobWidget::filteringMode() const
{
return static_cast<NameFilteringMode>(m_ui->filterMode->itemData(m_ui->filterMode->currentIndex()).toInt());