mirror of
https://github.com/d47081/qBittorrent.git
synced 2025-01-23 21:14:33 +00:00
Merge pull request #687 from Gelmir/asserts_fix
Fix failing asserts (rss settings are not saved).
This commit is contained in:
commit
3fc1f4e162
@ -68,6 +68,7 @@ AutomatedRssDownloader::AutomatedRssDownloader(const QWeakPointer<RssManager>& m
|
|||||||
ok = connect(ui->listRules, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayRulesListMenu(const QPoint&)));
|
ok = connect(ui->listRules, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayRulesListMenu(const QPoint&)));
|
||||||
Q_ASSERT(ok);
|
Q_ASSERT(ok);
|
||||||
m_ruleList = manager.toStrongRef()->downloadRules();
|
m_ruleList = manager.toStrongRef()->downloadRules();
|
||||||
|
m_editableRuleList = new RssDownloadRuleList; // Read rule list from disk
|
||||||
initLabelCombobox();
|
initLabelCombobox();
|
||||||
loadFeedList();
|
loadFeedList();
|
||||||
loadSettings();
|
loadSettings();
|
||||||
@ -92,6 +93,8 @@ AutomatedRssDownloader::AutomatedRssDownloader(const QWeakPointer<RssManager>& m
|
|||||||
Q_ASSERT(ok);
|
Q_ASSERT(ok);
|
||||||
ok = connect(ui->checkRegex, SIGNAL(stateChanged(int)), SLOT(updateMustNotLineValidity()));
|
ok = connect(ui->checkRegex, SIGNAL(stateChanged(int)), SLOT(updateMustNotLineValidity()));
|
||||||
Q_ASSERT(ok);
|
Q_ASSERT(ok);
|
||||||
|
ok = connect(this, SIGNAL(finished(int)), SLOT(on_finished(int)));
|
||||||
|
Q_ASSERT(ok);
|
||||||
updateRuleDefinitionBox();
|
updateRuleDefinitionBox();
|
||||||
updateFeedList();
|
updateFeedList();
|
||||||
}
|
}
|
||||||
@ -99,10 +102,8 @@ AutomatedRssDownloader::AutomatedRssDownloader(const QWeakPointer<RssManager>& m
|
|||||||
AutomatedRssDownloader::~AutomatedRssDownloader()
|
AutomatedRssDownloader::~AutomatedRssDownloader()
|
||||||
{
|
{
|
||||||
qDebug() << Q_FUNC_INFO;
|
qDebug() << Q_FUNC_INFO;
|
||||||
// Save current item on exit
|
|
||||||
saveEditedRule();
|
|
||||||
saveSettings();
|
|
||||||
delete ui;
|
delete ui;
|
||||||
|
delete m_editableRuleList;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AutomatedRssDownloader::loadSettings()
|
void AutomatedRssDownloader::loadSettings()
|
||||||
@ -132,10 +133,10 @@ void AutomatedRssDownloader::loadRulesList()
|
|||||||
saveEditedRule();
|
saveEditedRule();
|
||||||
}
|
}
|
||||||
ui->listRules->clear();
|
ui->listRules->clear();
|
||||||
foreach (const QString &rule_name, m_ruleList->ruleNames()) {
|
foreach (const QString &rule_name, m_editableRuleList->ruleNames()) {
|
||||||
QListWidgetItem *item = new QListWidgetItem(rule_name, ui->listRules);
|
QListWidgetItem *item = new QListWidgetItem(rule_name, ui->listRules);
|
||||||
item->setFlags(item->flags()|Qt::ItemIsUserCheckable);
|
item->setFlags(item->flags()|Qt::ItemIsUserCheckable);
|
||||||
if (m_ruleList->getRule(rule_name)->isEnabled())
|
if (m_editableRuleList->getRule(rule_name)->isEnabled())
|
||||||
item->setCheckState(Qt::Checked);
|
item->setCheckState(Qt::Checked);
|
||||||
else
|
else
|
||||||
item->setCheckState(Qt::Unchecked);
|
item->setCheckState(Qt::Unchecked);
|
||||||
@ -170,7 +171,7 @@ void AutomatedRssDownloader::updateFeedList()
|
|||||||
const QString feed_url = item->data(Qt::UserRole).toString();
|
const QString feed_url = item->data(Qt::UserRole).toString();
|
||||||
bool all_enabled = false;
|
bool all_enabled = false;
|
||||||
foreach (const QListWidgetItem *ruleItem, ui->listRules->selectedItems()) {
|
foreach (const QListWidgetItem *ruleItem, ui->listRules->selectedItems()) {
|
||||||
RssDownloadRulePtr rule = m_ruleList->getRule(ruleItem->text());
|
RssDownloadRulePtr rule = m_editableRuleList->getRule(ruleItem->text());
|
||||||
if (!rule) continue;
|
if (!rule) continue;
|
||||||
qDebug() << "Rule" << rule->name() << "affects" << rule->rssFeeds().size() << "feeds.";
|
qDebug() << "Rule" << rule->name() << "affects" << rule->rssFeeds().size() << "feeds.";
|
||||||
foreach (QString test, rule->rssFeeds()) {
|
foreach (QString test, rule->rssFeeds()) {
|
||||||
@ -257,7 +258,7 @@ RssDownloadRulePtr AutomatedRssDownloader::getCurrentRule() const
|
|||||||
{
|
{
|
||||||
QListWidgetItem * current_item = ui->listRules->currentItem();
|
QListWidgetItem * current_item = ui->listRules->currentItem();
|
||||||
if (current_item)
|
if (current_item)
|
||||||
return m_ruleList->getRule(current_item->text());
|
return m_editableRuleList->getRule(current_item->text());
|
||||||
return RssDownloadRulePtr();
|
return RssDownloadRulePtr();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -279,7 +280,7 @@ void AutomatedRssDownloader::saveEditedRule()
|
|||||||
qDebug() << "Probably removed the item, no need to save it";
|
qDebug() << "Probably removed the item, no need to save it";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
RssDownloadRulePtr rule = m_ruleList->getRule(m_editedRule->text());
|
RssDownloadRulePtr rule = m_editableRuleList->getRule(m_editedRule->text());
|
||||||
if (!rule) {
|
if (!rule) {
|
||||||
rule = RssDownloadRulePtr(new RssDownloadRule);
|
rule = RssDownloadRulePtr(new RssDownloadRule);
|
||||||
rule->setName(m_editedRule->text());
|
rule->setName(m_editedRule->text());
|
||||||
@ -301,7 +302,7 @@ void AutomatedRssDownloader::saveEditedRule()
|
|||||||
Preferences().addTorrentLabel(rule->label());
|
Preferences().addTorrentLabel(rule->label());
|
||||||
//rule->setRssFeeds(getSelectedFeeds());
|
//rule->setRssFeeds(getSelectedFeeds());
|
||||||
// Save it
|
// Save it
|
||||||
m_ruleList->saveRule(rule);
|
m_editableRuleList->saveRule(rule);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -311,7 +312,7 @@ void AutomatedRssDownloader::on_addRuleBtn_clicked()
|
|||||||
const QString rule_name = QInputDialog::getText(this, tr("New rule name"), tr("Please type the name of the new download rule."));
|
const QString rule_name = QInputDialog::getText(this, tr("New rule name"), tr("Please type the name of the new download rule."));
|
||||||
if (rule_name.isEmpty()) return;
|
if (rule_name.isEmpty()) return;
|
||||||
// Check if this rule name already exists
|
// Check if this rule name already exists
|
||||||
if (m_ruleList->getRule(rule_name)) {
|
if (m_editableRuleList->getRule(rule_name)) {
|
||||||
QMessageBox::warning(this, tr("Rule name conflict"), tr("A rule with this name already exists, please choose another name."));
|
QMessageBox::warning(this, tr("Rule name conflict"), tr("A rule with this name already exists, please choose another name."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -342,8 +343,8 @@ void AutomatedRssDownloader::on_removeRuleBtn_clicked()
|
|||||||
// Clean up memory
|
// Clean up memory
|
||||||
delete item;
|
delete item;
|
||||||
qDebug("Removed item for the UI list");
|
qDebug("Removed item for the UI list");
|
||||||
// Remove it from the m_ruleList
|
// Remove it from the m_editableRuleList
|
||||||
m_ruleList->removeRule(rule_name);
|
m_editableRuleList->removeRule(rule_name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -356,7 +357,7 @@ void AutomatedRssDownloader::on_browseSP_clicked()
|
|||||||
|
|
||||||
void AutomatedRssDownloader::on_exportBtn_clicked()
|
void AutomatedRssDownloader::on_exportBtn_clicked()
|
||||||
{
|
{
|
||||||
if (m_ruleList->isEmpty()) {
|
if (m_editableRuleList->isEmpty()) {
|
||||||
QMessageBox::warning(this, tr("Invalid action"), tr("The list is empty, there is nothing to export."));
|
QMessageBox::warning(this, tr("Invalid action"), tr("The list is empty, there is nothing to export."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -365,7 +366,7 @@ void AutomatedRssDownloader::on_exportBtn_clicked()
|
|||||||
if (save_path.isEmpty()) return;
|
if (save_path.isEmpty()) return;
|
||||||
if (!save_path.endsWith(".rssrules", Qt::CaseInsensitive))
|
if (!save_path.endsWith(".rssrules", Qt::CaseInsensitive))
|
||||||
save_path += ".rssrules";
|
save_path += ".rssrules";
|
||||||
if (!m_ruleList->serialize(save_path)) {
|
if (!m_editableRuleList->serialize(save_path)) {
|
||||||
QMessageBox::warning(this, tr("I/O Error"), tr("Failed to create the destination file"));
|
QMessageBox::warning(this, tr("I/O Error"), tr("Failed to create the destination file"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -377,7 +378,7 @@ void AutomatedRssDownloader::on_importBtn_clicked()
|
|||||||
QString load_path = QFileDialog::getOpenFileName(this, tr("Please point to the RSS download rules file"), QDir::homePath(), tr("Rules list (*.rssrules *.filters)"));
|
QString load_path = QFileDialog::getOpenFileName(this, tr("Please point to the RSS download rules file"), QDir::homePath(), tr("Rules list (*.rssrules *.filters)"));
|
||||||
if (load_path.isEmpty() || !QFile::exists(load_path)) return;
|
if (load_path.isEmpty() || !QFile::exists(load_path)) return;
|
||||||
// Load it
|
// Load it
|
||||||
if (!m_ruleList->unserialize(load_path)) {
|
if (!m_editableRuleList->unserialize(load_path)) {
|
||||||
QMessageBox::warning(this, tr("Import Error"), tr("Failed to import the selected rules file"));
|
QMessageBox::warning(this, tr("Import Error"), tr("Failed to import the selected rules file"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -426,11 +427,11 @@ void AutomatedRssDownloader::renameSelectedRule()
|
|||||||
QString new_name = QInputDialog::getText(this, tr("Rule renaming"), tr("Please type the new rule name"), QLineEdit::Normal, item->text());
|
QString new_name = QInputDialog::getText(this, tr("Rule renaming"), tr("Please type the new rule name"), QLineEdit::Normal, item->text());
|
||||||
new_name = new_name.trimmed();
|
new_name = new_name.trimmed();
|
||||||
if (new_name.isEmpty()) return;
|
if (new_name.isEmpty()) return;
|
||||||
if (m_ruleList->ruleNames().contains(new_name, Qt::CaseInsensitive)) {
|
if (m_editableRuleList->ruleNames().contains(new_name, Qt::CaseInsensitive)) {
|
||||||
QMessageBox::warning(this, tr("Rule name conflict"), tr("A rule with this name already exists, please choose another name."));
|
QMessageBox::warning(this, tr("Rule name conflict"), tr("A rule with this name already exists, please choose another name."));
|
||||||
} else {
|
} else {
|
||||||
// Rename the rule
|
// Rename the rule
|
||||||
m_ruleList->renameRule(item->text(), new_name);
|
m_editableRuleList->renameRule(item->text(), new_name);
|
||||||
item->setText(new_name);
|
item->setText(new_name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -445,7 +446,7 @@ void AutomatedRssDownloader::handleFeedCheckStateChange(QListWidgetItem *feed_it
|
|||||||
}
|
}
|
||||||
const QString feed_url = feed_item->data(Qt::UserRole).toString();
|
const QString feed_url = feed_item->data(Qt::UserRole).toString();
|
||||||
foreach (QListWidgetItem* rule_item, ui->listRules->selectedItems()) {
|
foreach (QListWidgetItem* rule_item, ui->listRules->selectedItems()) {
|
||||||
RssDownloadRulePtr rule = m_ruleList->getRule(rule_item->text());
|
RssDownloadRulePtr rule = m_editableRuleList->getRule(rule_item->text());
|
||||||
Q_ASSERT(rule);
|
Q_ASSERT(rule);
|
||||||
QStringList affected_feeds = rule->rssFeeds();
|
QStringList affected_feeds = rule->rssFeeds();
|
||||||
if (feed_item->checkState() == Qt::Checked) {
|
if (feed_item->checkState() == Qt::Checked) {
|
||||||
@ -458,7 +459,7 @@ void AutomatedRssDownloader::handleFeedCheckStateChange(QListWidgetItem *feed_it
|
|||||||
// Save the updated rule
|
// Save the updated rule
|
||||||
if (affected_feeds.size() != rule->rssFeeds().size()) {
|
if (affected_feeds.size() != rule->rssFeeds().size()) {
|
||||||
rule->setRssFeeds(affected_feeds);
|
rule->setRssFeeds(affected_feeds);
|
||||||
m_ruleList->saveRule(rule);
|
m_editableRuleList->saveRule(rule);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Update Matching articles
|
// Update Matching articles
|
||||||
@ -477,7 +478,7 @@ void AutomatedRssDownloader::updateMatchingArticles()
|
|||||||
const QHash<QString, RssFeedPtr> all_feeds = manager->getAllFeedsAsHash();
|
const QHash<QString, RssFeedPtr> all_feeds = manager->getAllFeedsAsHash();
|
||||||
|
|
||||||
foreach (const QListWidgetItem *rule_item, ui->listRules->selectedItems()) {
|
foreach (const QListWidgetItem *rule_item, ui->listRules->selectedItems()) {
|
||||||
RssDownloadRulePtr rule = m_ruleList->getRule(rule_item->text());
|
RssDownloadRulePtr rule = m_editableRuleList->getRule(rule_item->text());
|
||||||
if (!rule) continue;
|
if (!rule) continue;
|
||||||
foreach (const QString &feed_url, rule->rssFeeds()) {
|
foreach (const QString &feed_url, rule->rssFeeds()) {
|
||||||
qDebug() << Q_FUNC_INFO << feed_url;
|
qDebug() << Q_FUNC_INFO << feed_url;
|
||||||
@ -588,4 +589,11 @@ void AutomatedRssDownloader::updateMustNotLineValidity()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AutomatedRssDownloader::on_finished(int result) {
|
||||||
|
Q_UNUSED(result);
|
||||||
|
// Save current item on exit
|
||||||
|
saveEditedRule();
|
||||||
|
m_ruleList->replace(m_editableRuleList);
|
||||||
|
m_ruleList->saveRulesToStorage();
|
||||||
|
saveSettings();
|
||||||
|
}
|
||||||
|
@ -80,6 +80,7 @@ private slots:
|
|||||||
void updateFieldsToolTips(bool regex);
|
void updateFieldsToolTips(bool regex);
|
||||||
void updateMustLineValidity();
|
void updateMustLineValidity();
|
||||||
void updateMustNotLineValidity();
|
void updateMustNotLineValidity();
|
||||||
|
void on_finished(int result);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
RssDownloadRulePtr getCurrentRule() const;
|
RssDownloadRulePtr getCurrentRule() const;
|
||||||
@ -91,6 +92,7 @@ private:
|
|||||||
QWeakPointer<RssManager> m_manager;
|
QWeakPointer<RssManager> m_manager;
|
||||||
QListWidgetItem* m_editedRule;
|
QListWidgetItem* m_editedRule;
|
||||||
RssDownloadRuleList *m_ruleList;
|
RssDownloadRuleList *m_ruleList;
|
||||||
|
RssDownloadRuleList *m_editableRuleList;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // AUTOMATEDRSSDOWNLOADER_H
|
#endif // AUTOMATEDRSSDOWNLOADER_H
|
||||||
|
@ -52,6 +52,16 @@ RssDownloadRulePtr RssDownloadRuleList::findMatchingRule(const QString &feed_url
|
|||||||
return RssDownloadRulePtr();
|
return RssDownloadRulePtr();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RssDownloadRuleList::replace(RssDownloadRuleList *other) {
|
||||||
|
m_rules.clear();
|
||||||
|
m_feedRules.clear();
|
||||||
|
foreach (const QString& name, other->ruleNames()) {
|
||||||
|
RssDownloadRule* r = new RssDownloadRule;
|
||||||
|
*r = *(other->getRule(name).value); // Implicit copy
|
||||||
|
saveRule(RssDownloadRulePtr(r));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void RssDownloadRuleList::saveRulesToStorage()
|
void RssDownloadRuleList::saveRulesToStorage()
|
||||||
{
|
{
|
||||||
QIniSettings qBTRSS("qBittorrent", "qBittorrent-rss");
|
QIniSettings qBTRSS("qBittorrent", "qBittorrent-rss");
|
||||||
@ -97,8 +107,6 @@ void RssDownloadRuleList::saveRule(const RssDownloadRulePtr &rule)
|
|||||||
foreach (const QString &feed_url, rule->rssFeeds()) {
|
foreach (const QString &feed_url, rule->rssFeeds()) {
|
||||||
m_feedRules[feed_url].append(rule->name());
|
m_feedRules[feed_url].append(rule->name());
|
||||||
}
|
}
|
||||||
// Save rules
|
|
||||||
saveRulesToStorage();
|
|
||||||
qDebug() << Q_FUNC_INFO << "EXIT";
|
qDebug() << Q_FUNC_INFO << "EXIT";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -111,8 +119,6 @@ void RssDownloadRuleList::removeRule(const QString &name)
|
|||||||
foreach (const QString &feed_url, rule->rssFeeds()) {
|
foreach (const QString &feed_url, rule->rssFeeds()) {
|
||||||
m_feedRules[feed_url].removeOne(rule->name());
|
m_feedRules[feed_url].removeOne(rule->name());
|
||||||
}
|
}
|
||||||
// Save rules
|
|
||||||
saveRulesToStorage();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void RssDownloadRuleList::renameRule(const QString &old_name, const QString &new_name)
|
void RssDownloadRuleList::renameRule(const QString &old_name, const QString &new_name)
|
||||||
@ -125,8 +131,6 @@ void RssDownloadRuleList::renameRule(const QString &old_name, const QString &new
|
|||||||
foreach (const QString &feed_url, rule->rssFeeds()) {
|
foreach (const QString &feed_url, rule->rssFeeds()) {
|
||||||
m_feedRules[feed_url].replace(m_feedRules[feed_url].indexOf(old_name), new_name);
|
m_feedRules[feed_url].replace(m_feedRules[feed_url].indexOf(old_name), new_name);
|
||||||
}
|
}
|
||||||
// Save rules
|
|
||||||
saveRulesToStorage();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
RssDownloadRulePtr RssDownloadRuleList::getRule(const QString &name) const
|
RssDownloadRulePtr RssDownloadRuleList::getRule(const QString &name) const
|
||||||
|
@ -50,14 +50,15 @@ public:
|
|||||||
RssDownloadRulePtr getRule(const QString &name) const;
|
RssDownloadRulePtr getRule(const QString &name) const;
|
||||||
inline QStringList ruleNames() const { return m_rules.keys(); }
|
inline QStringList ruleNames() const { return m_rules.keys(); }
|
||||||
inline bool isEmpty() const { return m_rules.isEmpty(); }
|
inline bool isEmpty() const { return m_rules.isEmpty(); }
|
||||||
|
void saveRulesToStorage();
|
||||||
bool serialize(const QString& path);
|
bool serialize(const QString& path);
|
||||||
bool unserialize(const QString& path);
|
bool unserialize(const QString& path);
|
||||||
|
void replace(RssDownloadRuleList* other);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void loadRulesFromStorage();
|
void loadRulesFromStorage();
|
||||||
void loadRulesFromVariantHash(const QVariantHash& l);
|
void loadRulesFromVariantHash(const QVariantHash& l);
|
||||||
QVariantHash toVariantHash() const;
|
QVariantHash toVariantHash() const;
|
||||||
void saveRulesToStorage();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QHash<QString, RssDownloadRulePtr> m_rules;
|
QHash<QString, RssDownloadRulePtr> m_rules;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user