- Added Import / Export feature for RSS feed downloader filters

This commit is contained in:
Christophe Dumez 2009-08-21 10:17:00 +00:00
parent c6003c7403
commit 2926745102
2 changed files with 107 additions and 16 deletions

View file

@ -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

View file

@ -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">