mirror of
https://github.com/qbittorrent/qBittorrent.git
synced 2024-10-22 10:46:04 +03:00
- Added Import / Export feature for RSS feed downloader filters
This commit is contained in:
parent
c6003c7403
commit
2926745102
2 changed files with 107 additions and 16 deletions
|
@ -40,6 +40,9 @@
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
#include <QRegExp>
|
#include <QRegExp>
|
||||||
#include <QMenu>
|
#include <QMenu>
|
||||||
|
#include <QFile>
|
||||||
|
#include <QDataStream>
|
||||||
|
#include <QFileDialog>
|
||||||
|
|
||||||
#include "bittorrent.h"
|
#include "bittorrent.h"
|
||||||
#include "ui_FeedDownloader.h"
|
#include "ui_FeedDownloader.h"
|
||||||
|
@ -55,7 +58,7 @@ public:
|
||||||
bool matches(QString s) {
|
bool matches(QString s) {
|
||||||
QStringList match_tokens = getMatchingTokens();
|
QStringList match_tokens = getMatchingTokens();
|
||||||
foreach(const QString& token, match_tokens) {
|
foreach(const QString& token, match_tokens) {
|
||||||
if(token.isEmpty() || token == "*")
|
if(token.isEmpty() || token == "")
|
||||||
continue;
|
continue;
|
||||||
QRegExp reg(token, Qt::CaseInsensitive);
|
QRegExp reg(token, Qt::CaseInsensitive);
|
||||||
if(reg.indexIn(s) < 0) return false;
|
if(reg.indexIn(s) < 0) return false;
|
||||||
|
@ -75,7 +78,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
QStringList getMatchingTokens() const {
|
QStringList getMatchingTokens() const {
|
||||||
QString matches = this->value("matches", "*").toString();
|
QString matches = this->value("matches", "").toString();
|
||||||
return matches.split(" ");
|
return matches.split(" ");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,7 +89,7 @@ public:
|
||||||
void setMatchingTokens(QString tokens) {
|
void setMatchingTokens(QString tokens) {
|
||||||
tokens = tokens.trimmed();
|
tokens = tokens.trimmed();
|
||||||
if(tokens.isEmpty())
|
if(tokens.isEmpty())
|
||||||
(*this)["matches"] = "*";
|
(*this)["matches"] = "";
|
||||||
else
|
else
|
||||||
(*this)["matches"] = tokens;
|
(*this)["matches"] = tokens;
|
||||||
}
|
}
|
||||||
|
@ -179,6 +182,36 @@ public:
|
||||||
(*this)[new_name] = this->take(old_name);
|
(*this)[new_name] = this->take(old_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool serialize(QString path) {
|
||||||
|
QFile f(path);
|
||||||
|
if(f.open(QIODevice::WriteOnly)) {
|
||||||
|
QDataStream out(&f);
|
||||||
|
out.setVersion(QDataStream::Qt_4_3);
|
||||||
|
out << (QHash<QString, QVariant>)(*this);
|
||||||
|
f.close();
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool unserialize(QString path) {
|
||||||
|
QFile f(path);
|
||||||
|
if(f.open(QIODevice::ReadOnly)) {
|
||||||
|
QDataStream in(&f);
|
||||||
|
in.setVersion(QDataStream::Qt_4_3);
|
||||||
|
QHash<QString, QVariant> tmp;
|
||||||
|
in >> tmp;
|
||||||
|
qDebug("Unserialized %d filters", tmp.size());
|
||||||
|
foreach(const QString& key, tmp.keys()) {
|
||||||
|
(*this)[key] = tmp[key];
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void save() {
|
void save() {
|
||||||
QSettings qBTRSS("qBittorrent", "qBittorrent-rss");
|
QSettings qBTRSS("qBittorrent", "qBittorrent-rss");
|
||||||
QHash<QString, QVariant> all_feeds_filters = qBTRSS.value("feed_filters", QHash<QString, QVariant>()).toHash();
|
QHash<QString, QVariant> all_feeds_filters = qBTRSS.value("feed_filters", QHash<QString, QVariant>()).toHash();
|
||||||
|
@ -216,10 +249,7 @@ public:
|
||||||
connect(enableDl_cb, SIGNAL(stateChanged(int)), this, SLOT(enableFilterBox(int)));
|
connect(enableDl_cb, SIGNAL(stateChanged(int)), this, SLOT(enableFilterBox(int)));
|
||||||
// Restore saved info
|
// Restore saved info
|
||||||
enableDl_cb->setChecked(filters.isDownloadingEnabled());
|
enableDl_cb->setChecked(filters.isDownloadingEnabled());
|
||||||
// Fill filter list
|
fillFiltersList();
|
||||||
foreach(QString filter_name, filters.names()) {
|
|
||||||
new QListWidgetItem(filter_name, filtersList);
|
|
||||||
}
|
|
||||||
if(filters.size() > 0) {
|
if(filters.size() > 0) {
|
||||||
// Select first filter
|
// Select first filter
|
||||||
filtersList->setCurrentItem(filtersList->item(0));
|
filtersList->setCurrentItem(filtersList->item(0));
|
||||||
|
@ -250,6 +280,13 @@ protected slots:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void fillFiltersList() {
|
||||||
|
// Fill filter list
|
||||||
|
foreach(QString filter_name, filters.names()) {
|
||||||
|
new QListWidgetItem(filter_name, filtersList);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void displayFiltersListMenu(const QPoint&) {
|
void displayFiltersListMenu(const QPoint&) {
|
||||||
QMenu myFiltersListMenu(this);
|
QMenu myFiltersListMenu(this);
|
||||||
if(filtersList->selectedItems().size() > 0) {
|
if(filtersList->selectedItems().size() > 0) {
|
||||||
|
@ -276,6 +313,9 @@ protected slots:
|
||||||
FeedFilter filter = filters.getFilter(filter_name);
|
FeedFilter filter = filters.getFilter(filter_name);
|
||||||
filterSettingsBox->setEnabled(true);
|
filterSettingsBox->setEnabled(true);
|
||||||
match_line->setText(filter.getMatchingTokens_str());
|
match_line->setText(filter.getMatchingTokens_str());
|
||||||
|
if(match_line->text().trimmed().isEmpty()) {
|
||||||
|
match_line->setText(filter_name);
|
||||||
|
}
|
||||||
notmatch_line->setText(filter.getNotMatchingTokens_str());
|
notmatch_line->setText(filter.getNotMatchingTokens_str());
|
||||||
QString save_path = filter.getSavePath();
|
QString save_path = filter.getSavePath();
|
||||||
if(save_path.isEmpty())
|
if(save_path.isEmpty())
|
||||||
|
@ -402,6 +442,39 @@ protected slots:
|
||||||
test_res_lbl->setText("<b><font color=\"red\">"+tr("does not match")+"</font></b>");
|
test_res_lbl->setText("<b><font color=\"red\">"+tr("does not match")+"</font></b>");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void on_importButton_clicked(bool) {
|
||||||
|
QString source = QFileDialog::getOpenFileName(0, tr("Select file to import"), QDir::homePath(), tr("Filters Files")+QString::fromUtf8(" (*.filters)"));
|
||||||
|
if(source.isEmpty()) return;
|
||||||
|
if(filters.unserialize(source)) {
|
||||||
|
// Clean up first
|
||||||
|
clearFields();
|
||||||
|
filtersList->clear();
|
||||||
|
selected_filter = QString::null;
|
||||||
|
fillFiltersList();
|
||||||
|
if(filters.size() > 0)
|
||||||
|
filtersList->setCurrentItem(filtersList->item(0));
|
||||||
|
QMessageBox::information(0, tr("Import successful"), tr("Filters import was successful."));
|
||||||
|
} else {
|
||||||
|
QMessageBox::critical(0, tr("Import failure"), tr("Filters could not be imported due to an I/O error."));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void on_exportButton_clicked(bool) {
|
||||||
|
QString destination = QFileDialog::getSaveFileName(this, tr("Select destination file"), QDir::homePath(), tr("Filters Files")+QString::fromUtf8(" (*.filters)"));
|
||||||
|
if(destination.isEmpty()) return;
|
||||||
|
// Append file extension
|
||||||
|
if(!destination.endsWith(".filters"))
|
||||||
|
destination += ".filters";
|
||||||
|
if(QFile::exists(destination)) {
|
||||||
|
int ret = QMessageBox::question(0, tr("Overwriting confirmation"), tr("Are you sure you want to overwrite existing file?"));
|
||||||
|
if(ret != QMessageBox::Yes) return;
|
||||||
|
}
|
||||||
|
if(filters.serialize(destination))
|
||||||
|
QMessageBox::information(0, tr("Export successful"), tr("Filters export was successful."));
|
||||||
|
else
|
||||||
|
QMessageBox::critical(0, tr("Export failure"), tr("Filters could not be exported due to an I/O error."));
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // FEEDDOWNLOADER_H
|
#endif // FEEDDOWNLOADER_H
|
||||||
|
|
|
@ -430,7 +430,7 @@
|
||||||
<property name="sizeHint" stdset="0">
|
<property name="sizeHint" stdset="0">
|
||||||
<size>
|
<size>
|
||||||
<width>20</width>
|
<width>20</width>
|
||||||
<height>11</height>
|
<height>9</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
|
@ -444,14 +444,32 @@
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QDialogButtonBox" name="buttonBox">
|
<layout class="QHBoxLayout" name="horizontalLayout_10">
|
||||||
<property name="orientation">
|
<item>
|
||||||
<enum>Qt::Horizontal</enum>
|
<widget class="QPushButton" name="importButton">
|
||||||
</property>
|
<property name="text">
|
||||||
<property name="standardButtons">
|
<string>Import...</string>
|
||||||
<set>QDialogButtonBox::Close</set>
|
</property>
|
||||||
</property>
|
</widget>
|
||||||
</widget>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="exportButton">
|
||||||
|
<property name="text">
|
||||||
|
<string>Export...</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QDialogButtonBox" name="buttonBox">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="standardButtons">
|
||||||
|
<set>QDialogButtonBox::Close</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
<action name="actionRename_filter">
|
<action name="actionRename_filter">
|
||||||
|
|
Loading…
Reference in a new issue