mirror of
https://github.com/d47081/qBittorrent.git
synced 2025-02-05 11:24:15 +00:00
Use naturalSort in search.
This commit is contained in:
parent
09abc9d8b7
commit
f6e4ff1ab9
@ -539,26 +539,26 @@ void SearchEngine::appendSearchResult(const QString &line) {
|
|||||||
int row = cur_model->rowCount();
|
int row = cur_model->rowCount();
|
||||||
cur_model->insertRow(row);
|
cur_model->insertRow(row);
|
||||||
|
|
||||||
cur_model->setData(cur_model->index(row, DL_LINK), parts.at(PL_DL_LINK).trimmed()); // download URL
|
cur_model->setData(cur_model->index(row, SearchSortModel::DL_LINK), parts.at(PL_DL_LINK).trimmed()); // download URL
|
||||||
cur_model->setData(cur_model->index(row, NAME), parts.at(PL_NAME).trimmed()); // Name
|
cur_model->setData(cur_model->index(row, SearchSortModel::NAME), parts.at(PL_NAME).trimmed()); // Name
|
||||||
cur_model->setData(cur_model->index(row, SIZE), parts.at(PL_SIZE).trimmed().toLongLong()); // Size
|
cur_model->setData(cur_model->index(row, SearchSortModel::SIZE), parts.at(PL_SIZE).trimmed().toLongLong()); // Size
|
||||||
bool ok = false;
|
bool ok = false;
|
||||||
qlonglong nb_seeders = parts.at(PL_SEEDS).trimmed().toLongLong(&ok);
|
qlonglong nb_seeders = parts.at(PL_SEEDS).trimmed().toLongLong(&ok);
|
||||||
if (!ok || nb_seeders < 0) {
|
if (!ok || nb_seeders < 0) {
|
||||||
cur_model->setData(cur_model->index(row, SEEDS), tr("Unknown")); // Seeders
|
cur_model->setData(cur_model->index(row, SearchSortModel::SEEDS), tr("Unknown")); // Seeders
|
||||||
} else {
|
} else {
|
||||||
cur_model->setData(cur_model->index(row, SEEDS), nb_seeders); // Seeders
|
cur_model->setData(cur_model->index(row, SearchSortModel::SEEDS), nb_seeders); // Seeders
|
||||||
}
|
}
|
||||||
qlonglong nb_leechers = parts.at(PL_LEECHS).trimmed().toLongLong(&ok);
|
qlonglong nb_leechers = parts.at(PL_LEECHS).trimmed().toLongLong(&ok);
|
||||||
if (!ok || nb_leechers < 0) {
|
if (!ok || nb_leechers < 0) {
|
||||||
cur_model->setData(cur_model->index(row, LEECHS), tr("Unknown")); // Leechers
|
cur_model->setData(cur_model->index(row, SearchSortModel::LEECHS), tr("Unknown")); // Leechers
|
||||||
} else {
|
} else {
|
||||||
cur_model->setData(cur_model->index(row, LEECHS), nb_leechers); // Leechers
|
cur_model->setData(cur_model->index(row, SearchSortModel::LEECHS), nb_leechers); // Leechers
|
||||||
}
|
}
|
||||||
cur_model->setData(cur_model->index(row, ENGINE_URL), parts.at(PL_ENGINE_URL).trimmed()); // Engine URL
|
cur_model->setData(cur_model->index(row, SearchSortModel::ENGINE_URL), parts.at(PL_ENGINE_URL).trimmed()); // Engine URL
|
||||||
// Description Link
|
// Description Link
|
||||||
if (nb_fields == NB_PLUGIN_COLUMNS)
|
if (nb_fields == NB_PLUGIN_COLUMNS)
|
||||||
cur_model->setData(cur_model->index(row, DESC_LINK), parts.at(PL_DESC_LINK).trimmed());
|
cur_model->setData(cur_model->index(row, SearchSortModel::DESC_LINK), parts.at(PL_DESC_LINK).trimmed());
|
||||||
|
|
||||||
no_search_results = false;
|
no_search_results = false;
|
||||||
++nb_search_results;
|
++nb_search_results;
|
||||||
@ -591,7 +591,7 @@ void SearchEngine::on_download_button_clicked() {
|
|||||||
//QModelIndexList selectedIndexes = currentSearchTab->getCurrentTreeView()->selectionModel()->selectedIndexes();
|
//QModelIndexList selectedIndexes = currentSearchTab->getCurrentTreeView()->selectionModel()->selectedIndexes();
|
||||||
QModelIndexList selectedIndexes = all_tab.at(tabWidget->currentIndex())->getCurrentTreeView()->selectionModel()->selectedIndexes();
|
QModelIndexList selectedIndexes = all_tab.at(tabWidget->currentIndex())->getCurrentTreeView()->selectionModel()->selectedIndexes();
|
||||||
foreach (const QModelIndex &index, selectedIndexes) {
|
foreach (const QModelIndex &index, selectedIndexes) {
|
||||||
if (index.column() == NAME) {
|
if (index.column() == SearchSortModel::NAME) {
|
||||||
// Get Item url
|
// Get Item url
|
||||||
QSortFilterProxyModel* model = all_tab.at(tabWidget->currentIndex())->getCurrentSearchListProxy();
|
QSortFilterProxyModel* model = all_tab.at(tabWidget->currentIndex())->getCurrentSearchListProxy();
|
||||||
QString torrent_url = model->data(model->index(index.row(), URL_COLUMN)).toString();
|
QString torrent_url = model->data(model->index(index.row(), URL_COLUMN)).toString();
|
||||||
@ -606,9 +606,9 @@ void SearchEngine::on_goToDescBtn_clicked()
|
|||||||
{
|
{
|
||||||
QModelIndexList selectedIndexes = all_tab.at(tabWidget->currentIndex())->getCurrentTreeView()->selectionModel()->selectedIndexes();
|
QModelIndexList selectedIndexes = all_tab.at(tabWidget->currentIndex())->getCurrentTreeView()->selectionModel()->selectedIndexes();
|
||||||
foreach (const QModelIndex &index, selectedIndexes) {
|
foreach (const QModelIndex &index, selectedIndexes) {
|
||||||
if (index.column() == NAME) {
|
if (index.column() == SearchSortModel::NAME) {
|
||||||
QSortFilterProxyModel* model = all_tab.at(tabWidget->currentIndex())->getCurrentSearchListProxy();
|
QSortFilterProxyModel* model = all_tab.at(tabWidget->currentIndex())->getCurrentSearchListProxy();
|
||||||
const QString desc_url = model->data(model->index(index.row(), DESC_LINK)).toString();
|
const QString desc_url = model->data(model->index(index.row(), SearchSortModel::DESC_LINK)).toString();
|
||||||
if (!desc_url.isEmpty())
|
if (!desc_url.isEmpty())
|
||||||
QDesktopServices::openUrl(QUrl::fromEncoded(desc_url.toUtf8()));
|
QDesktopServices::openUrl(QUrl::fromEncoded(desc_url.toUtf8()));
|
||||||
}
|
}
|
||||||
|
@ -54,8 +54,6 @@ class SearchEngine : public QWidget, public Ui::search_engine{
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_DISABLE_COPY(SearchEngine)
|
Q_DISABLE_COPY(SearchEngine)
|
||||||
|
|
||||||
public:
|
|
||||||
enum SearchColumn { NAME, SIZE, SEEDS, LEECHS, ENGINE_URL, DL_LINK, DESC_LINK, NB_SEARCH_COLUMNS };
|
|
||||||
private:
|
private:
|
||||||
enum PluginColumn { PL_DL_LINK, PL_NAME, PL_SIZE, PL_SEEDS, PL_LEECHS, PL_ENGINE_URL, PL_DESC_LINK, NB_PLUGIN_COLUMNS };
|
enum PluginColumn { PL_DL_LINK, PL_NAME, PL_SIZE, PL_SEEDS, PL_LEECHS, PL_ENGINE_URL, PL_DESC_LINK, NB_PLUGIN_COLUMNS };
|
||||||
|
|
||||||
|
@ -9,7 +9,8 @@ HEADERS += $$PWD/searchengine.h \
|
|||||||
$$PWD/engineselectdlg.h \
|
$$PWD/engineselectdlg.h \
|
||||||
$$PWD/pluginsource.h \
|
$$PWD/pluginsource.h \
|
||||||
$$PWD/searchlistdelegate.h \
|
$$PWD/searchlistdelegate.h \
|
||||||
$$PWD/supportedengines.h
|
$$PWD/supportedengines.h \
|
||||||
|
$$PWD/searchsortmodel.h
|
||||||
|
|
||||||
SOURCES += $$PWD/searchengine.cpp \
|
SOURCES += $$PWD/searchengine.cpp \
|
||||||
$$PWD/searchtab.cpp \
|
$$PWD/searchtab.cpp \
|
||||||
|
@ -52,7 +52,7 @@ class SearchListDelegate: public QItemDelegate {
|
|||||||
painter->save();
|
painter->save();
|
||||||
QStyleOptionViewItemV2 opt = QItemDelegate::setOptions(index, option);
|
QStyleOptionViewItemV2 opt = QItemDelegate::setOptions(index, option);
|
||||||
switch(index.column()) {
|
switch(index.column()) {
|
||||||
case SearchEngine::SIZE:
|
case SearchSortModel::SIZE:
|
||||||
QItemDelegate::drawBackground(painter, opt, index);
|
QItemDelegate::drawBackground(painter, opt, index);
|
||||||
QItemDelegate::drawDisplay(painter, opt, option.rect, misc::friendlyUnit(index.data().toLongLong()));
|
QItemDelegate::drawDisplay(painter, opt, option.rect, misc::friendlyUnit(index.data().toLongLong()));
|
||||||
break;
|
break;
|
||||||
|
35
src/searchengine/searchsortmodel.h
Normal file
35
src/searchengine/searchsortmodel.h
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#ifndef SEARCHSORTMODEL_H
|
||||||
|
#define SEARCHSORTMODEL_H
|
||||||
|
|
||||||
|
#include <QSortFilterProxyModel>
|
||||||
|
#include "misc.h"
|
||||||
|
|
||||||
|
class SearchSortModel : public QSortFilterProxyModel {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
enum SearchColumn { NAME, SIZE, SEEDS, LEECHS, ENGINE_URL, DL_LINK, DESC_LINK, NB_SEARCH_COLUMNS };
|
||||||
|
|
||||||
|
SearchSortModel(QObject *parent = 0) : QSortFilterProxyModel(parent) {}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual bool lessThan(const QModelIndex &left, const QModelIndex &right) const {
|
||||||
|
if (sortColumn() == NAME || sortColumn() == ENGINE_URL) {
|
||||||
|
QVariant vL = sourceModel()->data(left);
|
||||||
|
QVariant vR = sourceModel()->data(right);
|
||||||
|
if (!(vL.isValid() && vR.isValid()))
|
||||||
|
return QSortFilterProxyModel::lessThan(left, right);
|
||||||
|
Q_ASSERT(vL.isValid());
|
||||||
|
Q_ASSERT(vR.isValid());
|
||||||
|
|
||||||
|
bool res = false;
|
||||||
|
if (misc::naturalSort(vL.toString(), vR.toString(), res))
|
||||||
|
return res;
|
||||||
|
|
||||||
|
return QSortFilterProxyModel::lessThan(left, right);
|
||||||
|
}
|
||||||
|
return QSortFilterProxyModel::lessThan(left, right);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // SEARCHSORTMODEL_H
|
@ -51,14 +51,14 @@ SearchTab::SearchTab(SearchEngine *parent) : QWidget(), parent(parent)
|
|||||||
|
|
||||||
setLayout(box);
|
setLayout(box);
|
||||||
// Set Search results list model
|
// Set Search results list model
|
||||||
SearchListModel = new QStandardItemModel(0, SearchEngine::NB_SEARCH_COLUMNS);
|
SearchListModel = new QStandardItemModel(0, SearchSortModel::NB_SEARCH_COLUMNS);
|
||||||
SearchListModel->setHeaderData(SearchEngine::NAME, Qt::Horizontal, tr("Name", "i.e: file name"));
|
SearchListModel->setHeaderData(SearchSortModel::NAME, Qt::Horizontal, tr("Name", "i.e: file name"));
|
||||||
SearchListModel->setHeaderData(SearchEngine::SIZE, Qt::Horizontal, tr("Size", "i.e: file size"));
|
SearchListModel->setHeaderData(SearchSortModel::SIZE, Qt::Horizontal, tr("Size", "i.e: file size"));
|
||||||
SearchListModel->setHeaderData(SearchEngine::SEEDS, Qt::Horizontal, tr("Seeders", "i.e: Number of full sources"));
|
SearchListModel->setHeaderData(SearchSortModel::SEEDS, Qt::Horizontal, tr("Seeders", "i.e: Number of full sources"));
|
||||||
SearchListModel->setHeaderData(SearchEngine::LEECHS, Qt::Horizontal, tr("Leechers", "i.e: Number of partial sources"));
|
SearchListModel->setHeaderData(SearchSortModel::LEECHS, Qt::Horizontal, tr("Leechers", "i.e: Number of partial sources"));
|
||||||
SearchListModel->setHeaderData(SearchEngine::ENGINE_URL, Qt::Horizontal, tr("Search engine"));
|
SearchListModel->setHeaderData(SearchSortModel::ENGINE_URL, Qt::Horizontal, tr("Search engine"));
|
||||||
|
|
||||||
proxyModel = new QSortFilterProxyModel();
|
proxyModel = new SearchSortModel();
|
||||||
proxyModel->setDynamicSortFilter(true);
|
proxyModel->setDynamicSortFilter(true);
|
||||||
proxyModel->setSourceModel(SearchListModel);
|
proxyModel->setSourceModel(SearchListModel);
|
||||||
resultsBrowser->setModel(proxyModel);
|
resultsBrowser->setModel(proxyModel);
|
||||||
@ -66,8 +66,8 @@ SearchTab::SearchTab(SearchEngine *parent) : QWidget(), parent(parent)
|
|||||||
SearchDelegate = new SearchListDelegate();
|
SearchDelegate = new SearchListDelegate();
|
||||||
resultsBrowser->setItemDelegate(SearchDelegate);
|
resultsBrowser->setItemDelegate(SearchDelegate);
|
||||||
|
|
||||||
resultsBrowser->hideColumn(SearchEngine::DL_LINK); // Hide url column
|
resultsBrowser->hideColumn(SearchSortModel::DL_LINK); // Hide url column
|
||||||
resultsBrowser->hideColumn(SearchEngine::DESC_LINK);
|
resultsBrowser->hideColumn(SearchSortModel::DESC_LINK);
|
||||||
|
|
||||||
resultsBrowser->setRootIsDecorated(false);
|
resultsBrowser->setRootIsDecorated(false);
|
||||||
resultsBrowser->setAllColumnsShowFocus(true);
|
resultsBrowser->setAllColumnsShowFocus(true);
|
||||||
@ -82,12 +82,12 @@ SearchTab::SearchTab(SearchEngine *parent) : QWidget(), parent(parent)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Sort by Seeds
|
// Sort by Seeds
|
||||||
resultsBrowser->sortByColumn(SearchEngine::SEEDS, Qt::DescendingOrder);
|
resultsBrowser->sortByColumn(SearchSortModel::SEEDS, Qt::DescendingOrder);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SearchTab::downloadSelectedItem(const QModelIndex& index) {
|
void SearchTab::downloadSelectedItem(const QModelIndex& index) {
|
||||||
QString engine_url = proxyModel->data(proxyModel->index(index.row(), SearchEngine::ENGINE_URL)).toString();
|
QString engine_url = proxyModel->data(proxyModel->index(index.row(), SearchSortModel::ENGINE_URL)).toString();
|
||||||
QString torrent_url = proxyModel->data(proxyModel->index(index.row(), SearchEngine::DL_LINK)).toString();
|
QString torrent_url = proxyModel->data(proxyModel->index(index.row(), SearchSortModel::DL_LINK)).toString();
|
||||||
setRowColor(index.row(), "red");
|
setRowColor(index.row(), "red");
|
||||||
parent->downloadTorrent(engine_url, torrent_url);
|
parent->downloadTorrent(engine_url, torrent_url);
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
#define SEARCH_TAB_H
|
#define SEARCH_TAB_H
|
||||||
|
|
||||||
#include "ui_search.h"
|
#include "ui_search.h"
|
||||||
|
#include "searchsortmodel.h"
|
||||||
|
|
||||||
#define ENGINE_URL_COLUMN 4
|
#define ENGINE_URL_COLUMN 4
|
||||||
#define URL_COLUMN 5
|
#define URL_COLUMN 5
|
||||||
@ -43,7 +44,6 @@ QT_BEGIN_NAMESPACE
|
|||||||
class QTreeView;
|
class QTreeView;
|
||||||
class QHeaderView;
|
class QHeaderView;
|
||||||
class QStandardItemModel;
|
class QStandardItemModel;
|
||||||
class QSortFilterProxyModel;
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
class SearchTab: public QWidget, public Ui::search_engine {
|
class SearchTab: public QWidget, public Ui::search_engine {
|
||||||
@ -54,7 +54,7 @@ private:
|
|||||||
QLabel *results_lbl;
|
QLabel *results_lbl;
|
||||||
QTreeView *resultsBrowser;
|
QTreeView *resultsBrowser;
|
||||||
QStandardItemModel *SearchListModel;
|
QStandardItemModel *SearchListModel;
|
||||||
QSortFilterProxyModel *proxyModel;
|
SearchSortModel *proxyModel;
|
||||||
SearchListDelegate *SearchDelegate;
|
SearchListDelegate *SearchDelegate;
|
||||||
SearchEngine *parent;
|
SearchEngine *parent;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user