mirror of
https://github.com/d47081/qBittorrent.git
synced 2025-02-02 18:04:32 +00:00
RSS: Use SharedPtr everywhere
This commit is contained in:
parent
a13bb06ec3
commit
50a3e4e776
@ -45,10 +45,10 @@
|
|||||||
#include "rssfeed.h"
|
#include "rssfeed.h"
|
||||||
#include "iconprovider.h"
|
#include "iconprovider.h"
|
||||||
|
|
||||||
AutomatedRssDownloader::AutomatedRssDownloader(QWidget *parent) :
|
AutomatedRssDownloader::AutomatedRssDownloader(const QWeakPointer<RssManager>& manager, QWidget *parent) :
|
||||||
QDialog(parent),
|
QDialog(parent),
|
||||||
ui(new Ui::AutomatedRssDownloader),
|
ui(new Ui::AutomatedRssDownloader),
|
||||||
m_editedRule(0)
|
m_manager(manager), m_editedRule(0)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
// Icons
|
// Icons
|
||||||
@ -129,7 +129,7 @@ void AutomatedRssDownloader::loadRulesList()
|
|||||||
foreach (const QString &rule_name, m_ruleList->ruleNames()) {
|
foreach (const QString &rule_name, m_ruleList->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_ruleList->getRule(rule_name)->isEnabled())
|
||||||
item->setCheckState(Qt::Checked);
|
item->setCheckState(Qt::Checked);
|
||||||
else
|
else
|
||||||
item->setCheckState(Qt::Unchecked);
|
item->setCheckState(Qt::Unchecked);
|
||||||
@ -164,17 +164,17 @@ 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()) {
|
||||||
RssDownloadRule rule = m_ruleList->getRule(ruleItem->text());
|
RssDownloadRulePtr rule = m_ruleList->getRule(ruleItem->text());
|
||||||
if(!rule.isValid()) 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()) {
|
||||||
qDebug() << "Feed is " << test;
|
qDebug() << "Feed is " << test;
|
||||||
}
|
}
|
||||||
if(rule.rssFeeds().contains(feed_url)) {
|
if(rule->rssFeeds().contains(feed_url)) {
|
||||||
qDebug() << "Rule " << rule.name() << " affects feed " << feed_url;
|
qDebug() << "Rule " << rule->name() << " affects feed " << feed_url;
|
||||||
all_enabled = true;
|
all_enabled = true;
|
||||||
} else {
|
} else {
|
||||||
qDebug() << "Rule " << rule.name() << " does NOT affect feed " << feed_url;
|
qDebug() << "Rule " << rule->name() << " does NOT affect feed " << feed_url;
|
||||||
all_enabled = false;
|
all_enabled = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -203,18 +203,18 @@ void AutomatedRssDownloader::updateRuleDefinitionBox()
|
|||||||
const QList<QListWidgetItem*> selection = ui->listRules->selectedItems();
|
const QList<QListWidgetItem*> selection = ui->listRules->selectedItems();
|
||||||
if(selection.count() == 1) {
|
if(selection.count() == 1) {
|
||||||
m_editedRule = selection.first();
|
m_editedRule = selection.first();
|
||||||
RssDownloadRule rule = getCurrentRule();
|
RssDownloadRulePtr rule = getCurrentRule();
|
||||||
if(rule.isValid()) {
|
if (rule) {
|
||||||
ui->lineContains->setText(rule.mustContain());
|
ui->lineContains->setText(rule->mustContain());
|
||||||
ui->lineNotContains->setText(rule.mustNotContain());
|
ui->lineNotContains->setText(rule->mustNotContain());
|
||||||
ui->saveDiffDir_check->setChecked(!rule.savePath().isEmpty());
|
ui->saveDiffDir_check->setChecked(!rule->savePath().isEmpty());
|
||||||
ui->lineSavePath->setText(rule.savePath());
|
ui->lineSavePath->setText(rule->savePath());
|
||||||
ui->checkRegex->setChecked(rule.useRegex());
|
ui->checkRegex->setChecked(rule->useRegex());
|
||||||
if(rule.label().isEmpty()) {
|
if (rule->label().isEmpty()) {
|
||||||
ui->comboLabel->setCurrentIndex(-1);
|
ui->comboLabel->setCurrentIndex(-1);
|
||||||
ui->comboLabel->clearEditText();
|
ui->comboLabel->clearEditText();
|
||||||
} else {
|
} else {
|
||||||
ui->comboLabel->setCurrentIndex(ui->comboLabel->findText(rule.label()));
|
ui->comboLabel->setCurrentIndex(ui->comboLabel->findText(rule->label()));
|
||||||
}
|
}
|
||||||
updateMustLineValidity();
|
updateMustLineValidity();
|
||||||
updateMustNotLineValidity();
|
updateMustNotLineValidity();
|
||||||
@ -247,12 +247,12 @@ void AutomatedRssDownloader::clearRuleDefinitionBox()
|
|||||||
updateMustNotLineValidity();
|
updateMustNotLineValidity();
|
||||||
}
|
}
|
||||||
|
|
||||||
RssDownloadRule AutomatedRssDownloader::getCurrentRule() const
|
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_ruleList->getRule(current_item->text());
|
||||||
return RssDownloadRule();
|
return RssDownloadRulePtr();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AutomatedRssDownloader::initLabelCombobox()
|
void AutomatedRssDownloader::initLabelCombobox()
|
||||||
@ -273,26 +273,26 @@ 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;
|
||||||
}
|
}
|
||||||
RssDownloadRule rule = m_ruleList->getRule(m_editedRule->text());
|
RssDownloadRulePtr rule = m_ruleList->getRule(m_editedRule->text());
|
||||||
if(!rule.isValid()) {
|
if (!rule) {
|
||||||
rule.setName(m_editedRule->text());
|
rule->setName(m_editedRule->text());
|
||||||
}
|
}
|
||||||
if(m_editedRule->checkState() == Qt::Unchecked)
|
if (m_editedRule->checkState() == Qt::Unchecked)
|
||||||
rule.setEnabled(false);
|
rule->setEnabled(false);
|
||||||
else
|
else
|
||||||
rule.setEnabled(true);
|
rule->setEnabled(true);
|
||||||
rule.setUseRegex(ui->checkRegex->isChecked());
|
rule->setUseRegex(ui->checkRegex->isChecked());
|
||||||
rule.setMustContain(ui->lineContains->text());
|
rule->setMustContain(ui->lineContains->text());
|
||||||
rule.setMustNotContain(ui->lineNotContains->text());
|
rule->setMustNotContain(ui->lineNotContains->text());
|
||||||
if(ui->saveDiffDir_check->isChecked())
|
if(ui->saveDiffDir_check->isChecked())
|
||||||
rule.setSavePath(ui->lineSavePath->text());
|
rule->setSavePath(ui->lineSavePath->text());
|
||||||
else
|
else
|
||||||
rule.setSavePath("");
|
rule->setSavePath("");
|
||||||
rule.setLabel(ui->comboLabel->currentText());
|
rule->setLabel(ui->comboLabel->currentText());
|
||||||
// Save new label
|
// Save new label
|
||||||
if(!rule.label().isEmpty())
|
if(!rule->label().isEmpty())
|
||||||
Preferences().addTorrentLabel(rule.label());
|
Preferences().addTorrentLabel(rule->label());
|
||||||
//rule.setRssFeeds(getSelectedFeeds());
|
//rule->setRssFeeds(getSelectedFeeds());
|
||||||
// Save it
|
// Save it
|
||||||
m_ruleList->saveRule(rule);
|
m_ruleList->saveRule(rule);
|
||||||
}
|
}
|
||||||
@ -301,15 +301,15 @@ void AutomatedRssDownloader::saveEditedRule()
|
|||||||
void AutomatedRssDownloader::on_addRuleBtn_clicked()
|
void AutomatedRssDownloader::on_addRuleBtn_clicked()
|
||||||
{
|
{
|
||||||
// Ask for a rule name
|
// Ask for a rule name
|
||||||
const QString rule = 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.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).isValid()) {
|
if(m_ruleList->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;
|
||||||
}
|
}
|
||||||
// Add the new rule to the list
|
// Add the new rule to the list
|
||||||
QListWidgetItem * item = new QListWidgetItem(rule, ui->listRules);
|
QListWidgetItem * item = new QListWidgetItem(rule_name, ui->listRules);
|
||||||
item->setFlags(item->flags()|Qt::ItemIsUserCheckable);
|
item->setFlags(item->flags()|Qt::ItemIsUserCheckable);
|
||||||
item->setCheckState(Qt::Checked); // Enable as a default
|
item->setCheckState(Qt::Checked); // Enable as a default
|
||||||
ui->listRules->clearSelection();
|
ui->listRules->clearSelection();
|
||||||
@ -382,7 +382,7 @@ void AutomatedRssDownloader::displayRulesListMenu(const QPoint &pos)
|
|||||||
{
|
{
|
||||||
Q_UNUSED(pos);
|
Q_UNUSED(pos);
|
||||||
QMenu menu;
|
QMenu menu;
|
||||||
QAction *addAct = menu.addAction(IconProvider::instance()->getIcon("list-add"), tr("Add new rule..."));
|
QAction *addAct = menu.addAction(IconProvider::instance()->getIcon("list-add"), tr("Add new rule->.."));
|
||||||
QAction *delAct = 0;
|
QAction *delAct = 0;
|
||||||
QAction *renameAct = 0;
|
QAction *renameAct = 0;
|
||||||
const QList<QListWidgetItem*> selection = ui->listRules->selectedItems();
|
const QList<QListWidgetItem*> selection = ui->listRules->selectedItems();
|
||||||
@ -390,7 +390,7 @@ void AutomatedRssDownloader::displayRulesListMenu(const QPoint &pos)
|
|||||||
if(selection.count() == 1) {
|
if(selection.count() == 1) {
|
||||||
delAct = menu.addAction(IconProvider::instance()->getIcon("list-remove"), tr("Delete rule"));
|
delAct = menu.addAction(IconProvider::instance()->getIcon("list-remove"), tr("Delete rule"));
|
||||||
menu.addSeparator();
|
menu.addSeparator();
|
||||||
renameAct = menu.addAction(IconProvider::instance()->getIcon("edit-rename"), tr("Rename rule..."));
|
renameAct = menu.addAction(IconProvider::instance()->getIcon("edit-rename"), tr("Rename rule->.."));
|
||||||
} else {
|
} else {
|
||||||
delAct = menu.addAction(IconProvider::instance()->getIcon("list-remove"), tr("Delete selected rules"));
|
delAct = menu.addAction(IconProvider::instance()->getIcon("list-remove"), tr("Delete selected rules"));
|
||||||
}
|
}
|
||||||
@ -438,9 +438,9 @@ 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()) {
|
||||||
RssDownloadRule rule = m_ruleList->getRule(rule_item->text());
|
RssDownloadRulePtr rule = m_ruleList->getRule(rule_item->text());
|
||||||
Q_ASSERT(rule.isValid());
|
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) {
|
||||||
if(!affected_feeds.contains(feed_url))
|
if(!affected_feeds.contains(feed_url))
|
||||||
affected_feeds << feed_url;
|
affected_feeds << feed_url;
|
||||||
@ -449,8 +449,8 @@ void AutomatedRssDownloader::handleFeedCheckStateChange(QListWidgetItem *feed_it
|
|||||||
affected_feeds.removeOne(feed_url);
|
affected_feeds.removeOne(feed_url);
|
||||||
}
|
}
|
||||||
// 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_ruleList->saveRule(rule);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -464,26 +464,29 @@ void AutomatedRssDownloader::updateMatchingArticles()
|
|||||||
if(ui->ruleDefBox->isEnabled()) {
|
if(ui->ruleDefBox->isEnabled()) {
|
||||||
saveEditedRule();
|
saveEditedRule();
|
||||||
}
|
}
|
||||||
const QHash<QString, RssFeed*> all_feeds = RssManager::instance()->getAllFeedsAsHash();
|
RssManagerPtr manager = m_manager.toStrongRef();
|
||||||
|
if (!manager)
|
||||||
|
return;
|
||||||
|
const QHash<QString, RssFeedPtr> all_feeds = manager->getAllFeedsAsHash();
|
||||||
|
|
||||||
foreach(const QListWidgetItem *rule_item, ui->listRules->selectedItems()) {
|
foreach(const QListWidgetItem *rule_item, ui->listRules->selectedItems()) {
|
||||||
RssDownloadRule rule = m_ruleList->getRule(rule_item->text());
|
RssDownloadRulePtr rule = m_ruleList->getRule(rule_item->text());
|
||||||
if(!rule.isValid()) 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;
|
||||||
Q_ASSERT(all_feeds.contains(feed_url));
|
Q_ASSERT(all_feeds.contains(feed_url));
|
||||||
if(!all_feeds.contains(feed_url)) continue;
|
if(!all_feeds.contains(feed_url)) continue;
|
||||||
const RssFeed *feed = all_feeds.value(feed_url);
|
RssFeedPtr feed = all_feeds.value(feed_url);
|
||||||
Q_ASSERT(feed);
|
Q_ASSERT(feed);
|
||||||
if(!feed) continue;
|
if(!feed) continue;
|
||||||
const QStringList matching_articles = rule.findMatchingArticles(feed);
|
const QStringList matching_articles = rule->findMatchingArticles(feed);
|
||||||
if(!matching_articles.isEmpty())
|
if(!matching_articles.isEmpty())
|
||||||
addFeedArticlesToTree(feed, matching_articles);
|
addFeedArticlesToTree(feed, matching_articles);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AutomatedRssDownloader::addFeedArticlesToTree(const RssFeed *feed, const QStringList &articles)
|
void AutomatedRssDownloader::addFeedArticlesToTree(const RssFeedPtr& feed, const QStringList &articles)
|
||||||
{
|
{
|
||||||
// Check if this feed is already in the tree
|
// Check if this feed is already in the tree
|
||||||
QTreeWidgetItem *treeFeedItem = 0;
|
QTreeWidgetItem *treeFeedItem = 0;
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
#define AUTOMATEDRSSDOWNLOADER_H
|
#define AUTOMATEDRSSDOWNLOADER_H
|
||||||
|
|
||||||
#include <QDialog>
|
#include <QDialog>
|
||||||
|
#include <QWeakPointer>
|
||||||
#include "rssdownloadrule.h"
|
#include "rssdownloadrule.h"
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
@ -41,6 +42,7 @@ class AutomatedRssDownloader;
|
|||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
class RssDownloadRuleList;
|
class RssDownloadRuleList;
|
||||||
|
class RssManager;
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
class QListWidgetItem;
|
class QListWidgetItem;
|
||||||
@ -51,7 +53,7 @@ class AutomatedRssDownloader : public QDialog
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit AutomatedRssDownloader(QWidget *parent = 0);
|
explicit AutomatedRssDownloader(const QWeakPointer<RssManager>& manager, QWidget *parent = 0);
|
||||||
~AutomatedRssDownloader();
|
~AutomatedRssDownloader();
|
||||||
bool isRssDownloaderEnabled() const;
|
bool isRssDownloaderEnabled() const;
|
||||||
|
|
||||||
@ -80,12 +82,13 @@ private slots:
|
|||||||
void updateMustNotLineValidity();
|
void updateMustNotLineValidity();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
RssDownloadRule getCurrentRule() const;
|
RssDownloadRulePtr getCurrentRule() const;
|
||||||
void initLabelCombobox();
|
void initLabelCombobox();
|
||||||
void addFeedArticlesToTree(const RssFeed *feed, const QStringList& articles);
|
void addFeedArticlesToTree(const RssFeedPtr& feed, const QStringList& articles);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::AutomatedRssDownloader *ui;
|
Ui::AutomatedRssDownloader *ui;
|
||||||
|
QWeakPointer<RssManager> m_manager;
|
||||||
QListWidgetItem* m_editedRule;
|
QListWidgetItem* m_editedRule;
|
||||||
RssDownloadRuleList *m_ruleList;
|
RssDownloadRuleList *m_ruleList;
|
||||||
};
|
};
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
#include "rssfeed.h"
|
#include "rssfeed.h"
|
||||||
#include "iconprovider.h"
|
#include "iconprovider.h"
|
||||||
|
|
||||||
FeedListWidget::FeedListWidget(QWidget *parent, RssManager *rssmanager): QTreeWidget(parent), m_rssManager(rssmanager) {
|
FeedListWidget::FeedListWidget(QWidget *parent, const RssManagerPtr& rssmanager): QTreeWidget(parent), m_rssManager(rssmanager) {
|
||||||
setContextMenuPolicy(Qt::CustomContextMenu);
|
setContextMenuPolicy(Qt::CustomContextMenu);
|
||||||
setDragDropMode(QAbstractItemView::InternalMove);
|
setDragDropMode(QAbstractItemView::InternalMove);
|
||||||
setSelectionMode(QAbstractItemView::ExtendedSelection);
|
setSelectionMode(QAbstractItemView::ExtendedSelection);
|
||||||
@ -51,20 +51,20 @@ FeedListWidget::~FeedListWidget() {
|
|||||||
delete m_unreadStickyItem;
|
delete m_unreadStickyItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FeedListWidget::itemAdded(QTreeWidgetItem *item, IRssFile* file) {
|
void FeedListWidget::itemAdded(QTreeWidgetItem *item, const RssFilePtr& file) {
|
||||||
m_rssMapping[item] = file;
|
m_rssMapping[item] = file;
|
||||||
if(file->type() == IRssFile::FEED) {
|
if (RssFeedPtr feed = qSharedPointerDynamicCast<RssFeed>(file)) {
|
||||||
m_feedsItems[file->id()] = item;
|
m_feedsItems[feed->id()] = item;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FeedListWidget::itemAboutToBeRemoved(QTreeWidgetItem *item) {
|
void FeedListWidget::itemAboutToBeRemoved(QTreeWidgetItem *item) {
|
||||||
IRssFile* file = m_rssMapping.take(item);
|
RssFilePtr file = m_rssMapping.take(item);
|
||||||
if(file->type() == IRssFile::FEED) {
|
if (RssFeedPtr feed = qSharedPointerDynamicCast<RssFeed>(file)) {
|
||||||
m_feedsItems.remove(file->id());
|
m_feedsItems.remove(feed->id());
|
||||||
} else {
|
} if (RssFolderPtr folder = qSharedPointerDynamicCast<RssFolder>(file)) {
|
||||||
QList<RssFeed*> feeds = ((RssFolder*)file)->getAllFeeds();
|
RssFeedList feeds = folder->getAllFeeds();
|
||||||
foreach(RssFeed* feed, feeds) {
|
foreach(const RssFeedPtr& feed, feeds) {
|
||||||
m_feedsItems.remove(feed->id());
|
m_feedsItems.remove(feed->id());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -105,7 +105,7 @@ QList<QTreeWidgetItem*> FeedListWidget::getAllOpenFolders(QTreeWidgetItem *paren
|
|||||||
item = parent->child(i);
|
item = parent->child(i);
|
||||||
else
|
else
|
||||||
item = topLevelItem(i);
|
item = topLevelItem(i);
|
||||||
if(getItemType(item) == IRssFile::FOLDER && item->isExpanded()) {
|
if(isFolder(item) && item->isExpanded()) {
|
||||||
QList<QTreeWidgetItem*> open_subfolders = getAllOpenFolders(item);
|
QList<QTreeWidgetItem*> open_subfolders = getAllOpenFolders(item);
|
||||||
if(!open_subfolders.empty()) {
|
if(!open_subfolders.empty()) {
|
||||||
open_folders << open_subfolders;
|
open_folders << open_subfolders;
|
||||||
@ -122,7 +122,7 @@ QList<QTreeWidgetItem*> FeedListWidget::getAllFeedItems(QTreeWidgetItem* folder)
|
|||||||
const int nbChildren = folder->childCount();
|
const int nbChildren = folder->childCount();
|
||||||
for(int i=0; i<nbChildren; ++i) {
|
for(int i=0; i<nbChildren; ++i) {
|
||||||
QTreeWidgetItem *item = folder->child(i);
|
QTreeWidgetItem *item = folder->child(i);
|
||||||
if(getItemType(item) == IRssFile::FEED) {
|
if(isFeed(item)) {
|
||||||
feeds << item;
|
feeds << item;
|
||||||
} else {
|
} else {
|
||||||
feeds << getAllFeedItems(item);
|
feeds << getAllFeedItems(item);
|
||||||
@ -131,12 +131,18 @@ QList<QTreeWidgetItem*> FeedListWidget::getAllFeedItems(QTreeWidgetItem* folder)
|
|||||||
return feeds;
|
return feeds;
|
||||||
}
|
}
|
||||||
|
|
||||||
IRssFile* FeedListWidget::getRSSItem(QTreeWidgetItem *item) const {
|
RssFilePtr FeedListWidget::getRSSItem(QTreeWidgetItem *item) const {
|
||||||
return m_rssMapping.value(item, 0);
|
return m_rssMapping.value(item, RssFilePtr());
|
||||||
}
|
}
|
||||||
|
|
||||||
IRssFile::FileType FeedListWidget::getItemType(QTreeWidgetItem *item) const {
|
bool FeedListWidget::isFeed(QTreeWidgetItem *item) const
|
||||||
return m_rssMapping.value(item)->type();
|
{
|
||||||
|
return (qSharedPointerDynamicCast<RssFeed>(m_rssMapping.value(item)) != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FeedListWidget::isFolder(QTreeWidgetItem *item) const
|
||||||
|
{
|
||||||
|
return (qSharedPointerDynamicCast<RssFolder>(m_rssMapping.value(item)) != NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
QString FeedListWidget::getItemID(QTreeWidgetItem *item) const {
|
QString FeedListWidget::getItemID(QTreeWidgetItem *item) const {
|
||||||
@ -147,8 +153,8 @@ QTreeWidgetItem* FeedListWidget::getTreeItemFromUrl(const QString &url) const{
|
|||||||
return m_feedsItems.value(url, 0);
|
return m_feedsItems.value(url, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
RssFeed* FeedListWidget::getRSSItemFromUrl(const QString &url) const {
|
RssFeedPtr FeedListWidget::getRSSItemFromUrl(const QString &url) const {
|
||||||
return dynamic_cast<RssFeed*>(getRSSItem(getTreeItemFromUrl(url)));
|
return qSharedPointerDynamicCast<RssFeed>(getRSSItem(getTreeItemFromUrl(url)));
|
||||||
}
|
}
|
||||||
|
|
||||||
QTreeWidgetItem* FeedListWidget::currentItem() const {
|
QTreeWidgetItem* FeedListWidget::currentItem() const {
|
||||||
@ -162,7 +168,7 @@ QTreeWidgetItem* FeedListWidget::currentFeed() const {
|
|||||||
void FeedListWidget::updateCurrentFeed(QTreeWidgetItem* new_item) {
|
void FeedListWidget::updateCurrentFeed(QTreeWidgetItem* new_item) {
|
||||||
if(!new_item) return;
|
if(!new_item) return;
|
||||||
if(!m_rssMapping.contains(new_item)) return;
|
if(!m_rssMapping.contains(new_item)) return;
|
||||||
if((getItemType(new_item) == IRssFile::FEED) || new_item == m_unreadStickyItem)
|
if(isFeed(new_item) || new_item == m_unreadStickyItem)
|
||||||
m_currentFeed = new_item;
|
m_currentFeed = new_item;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -171,7 +177,7 @@ void FeedListWidget::dragMoveEvent(QDragMoveEvent * event) {
|
|||||||
if(item == m_unreadStickyItem) {
|
if(item == m_unreadStickyItem) {
|
||||||
event->ignore();
|
event->ignore();
|
||||||
} else {
|
} else {
|
||||||
if(item && getItemType(item) != IRssFile::FOLDER)
|
if(item && isFolder(item))
|
||||||
event->ignore();
|
event->ignore();
|
||||||
else {
|
else {
|
||||||
if(selectedItems().contains(m_unreadStickyItem)) {
|
if(selectedItems().contains(m_unreadStickyItem)) {
|
||||||
@ -187,9 +193,9 @@ void FeedListWidget::dropEvent(QDropEvent *event) {
|
|||||||
qDebug("dropEvent");
|
qDebug("dropEvent");
|
||||||
QList<QTreeWidgetItem*> folders_altered;
|
QList<QTreeWidgetItem*> folders_altered;
|
||||||
QTreeWidgetItem *dest_folder_item = itemAt(event->pos());
|
QTreeWidgetItem *dest_folder_item = itemAt(event->pos());
|
||||||
RssFolder *dest_folder;
|
RssFolderPtr dest_folder;
|
||||||
if(dest_folder_item) {
|
if(dest_folder_item) {
|
||||||
dest_folder = (RssFolder*)getRSSItem(dest_folder_item);
|
dest_folder = qSharedPointerCast<RssFolder>(getRSSItem(dest_folder_item));
|
||||||
folders_altered << dest_folder_item;
|
folders_altered << dest_folder_item;
|
||||||
} else {
|
} else {
|
||||||
dest_folder = m_rssManager;
|
dest_folder = m_rssManager;
|
||||||
@ -197,7 +203,7 @@ void FeedListWidget::dropEvent(QDropEvent *event) {
|
|||||||
QList<QTreeWidgetItem *> src_items = selectedItems();
|
QList<QTreeWidgetItem *> src_items = selectedItems();
|
||||||
// Check if there is not going to overwrite another file
|
// Check if there is not going to overwrite another file
|
||||||
foreach(QTreeWidgetItem *src_item, src_items) {
|
foreach(QTreeWidgetItem *src_item, src_items) {
|
||||||
IRssFile *file = getRSSItem(src_item);
|
RssFilePtr file = getRSSItem(src_item);
|
||||||
if(dest_folder->hasChild(file->id())) {
|
if(dest_folder->hasChild(file->id())) {
|
||||||
emit overwriteAttempt(file->id());
|
emit overwriteAttempt(file->id());
|
||||||
return;
|
return;
|
||||||
@ -209,7 +215,7 @@ void FeedListWidget::dropEvent(QDropEvent *event) {
|
|||||||
if(parent_folder && !folders_altered.contains(parent_folder))
|
if(parent_folder && !folders_altered.contains(parent_folder))
|
||||||
folders_altered << parent_folder;
|
folders_altered << parent_folder;
|
||||||
// Actually move the file
|
// Actually move the file
|
||||||
IRssFile *file = getRSSItem(src_item);
|
RssFilePtr file = getRSSItem(src_item);
|
||||||
m_rssManager->moveFile(file, dest_folder);
|
m_rssManager->moveFile(file, dest_folder);
|
||||||
}
|
}
|
||||||
QTreeWidget::dropEvent(event);
|
QTreeWidget::dropEvent(event);
|
||||||
|
@ -40,15 +40,14 @@
|
|||||||
#include <QUrl>
|
#include <QUrl>
|
||||||
|
|
||||||
#include "rssfile.h"
|
#include "rssfile.h"
|
||||||
|
#include "rssfeed.h"
|
||||||
class RssManager;
|
#include "rssmanager.h"
|
||||||
class RssFeed;
|
|
||||||
|
|
||||||
class FeedListWidget: public QTreeWidget {
|
class FeedListWidget: public QTreeWidget {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
FeedListWidget(QWidget *parent, RssManager *m_rssManager);
|
FeedListWidget(QWidget *parent, const RssManagerPtr& rssManager);
|
||||||
~FeedListWidget();
|
~FeedListWidget();
|
||||||
|
|
||||||
bool hasFeed(const QString &url) const;
|
bool hasFeed(const QString &url) const;
|
||||||
@ -57,16 +56,17 @@ public:
|
|||||||
QStringList getItemPath(QTreeWidgetItem* item) const;
|
QStringList getItemPath(QTreeWidgetItem* item) const;
|
||||||
QList<QTreeWidgetItem*> getAllOpenFolders(QTreeWidgetItem *parent=0) const;
|
QList<QTreeWidgetItem*> getAllOpenFolders(QTreeWidgetItem *parent=0) const;
|
||||||
QList<QTreeWidgetItem*> getAllFeedItems(QTreeWidgetItem* folder);
|
QList<QTreeWidgetItem*> getAllFeedItems(QTreeWidgetItem* folder);
|
||||||
IRssFile* getRSSItem(QTreeWidgetItem *item) const;
|
RssFilePtr getRSSItem(QTreeWidgetItem *item) const;
|
||||||
IRssFile::FileType getItemType(QTreeWidgetItem *item) const;
|
bool isFeed(QTreeWidgetItem *item) const;
|
||||||
|
bool isFolder(QTreeWidgetItem *item) const;
|
||||||
QString getItemID(QTreeWidgetItem *item) const;
|
QString getItemID(QTreeWidgetItem *item) const;
|
||||||
QTreeWidgetItem* getTreeItemFromUrl(const QString &url) const;
|
QTreeWidgetItem* getTreeItemFromUrl(const QString &url) const;
|
||||||
RssFeed* getRSSItemFromUrl(const QString &url) const;
|
RssFeedPtr getRSSItemFromUrl(const QString &url) const;
|
||||||
QTreeWidgetItem* currentItem() const;
|
QTreeWidgetItem* currentItem() const;
|
||||||
QTreeWidgetItem* currentFeed() const;
|
QTreeWidgetItem* currentFeed() const;
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void itemAdded(QTreeWidgetItem *item, IRssFile* file);
|
void itemAdded(QTreeWidgetItem *item, const RssFilePtr& file);
|
||||||
void itemAboutToBeRemoved(QTreeWidgetItem *item);
|
void itemAboutToBeRemoved(QTreeWidgetItem *item);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
@ -81,8 +81,8 @@ protected:
|
|||||||
void dropEvent(QDropEvent *event);
|
void dropEvent(QDropEvent *event);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
RssManager *m_rssManager;
|
RssManagerPtr m_rssManager;
|
||||||
QHash<QTreeWidgetItem*, IRssFile*> m_rssMapping;
|
QHash<QTreeWidgetItem*, RssFilePtr> m_rssMapping;
|
||||||
QHash<QString, QTreeWidgetItem*> m_feedsItems;
|
QHash<QString, QTreeWidgetItem*> m_feedsItems;
|
||||||
QTreeWidgetItem* m_currentFeed;
|
QTreeWidgetItem* m_currentFeed;
|
||||||
QTreeWidgetItem *m_unreadStickyItem;
|
QTreeWidgetItem *m_unreadStickyItem;
|
||||||
|
@ -78,7 +78,7 @@ void RSSImp::displayRSSListMenu(const QPoint& pos){
|
|||||||
myRSSListMenu.addAction(actionRename);
|
myRSSListMenu.addAction(actionRename);
|
||||||
myRSSListMenu.addAction(actionDelete);
|
myRSSListMenu.addAction(actionDelete);
|
||||||
myRSSListMenu.addSeparator();
|
myRSSListMenu.addSeparator();
|
||||||
if(m_feedList->getItemType(selectedItems.first()) == IRssFile::FOLDER) {
|
if(m_feedList->isFolder(selectedItems.first())) {
|
||||||
myRSSListMenu.addAction(actionNew_folder);
|
myRSSListMenu.addAction(actionNew_folder);
|
||||||
} else {
|
} else {
|
||||||
myRSSListMenu.addAction(actionManage_cookies);
|
myRSSListMenu.addAction(actionManage_cookies);
|
||||||
@ -86,7 +86,7 @@ void RSSImp::displayRSSListMenu(const QPoint& pos){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
myRSSListMenu.addAction(actionNew_subscription);
|
myRSSListMenu.addAction(actionNew_subscription);
|
||||||
if(m_feedList->getItemType(selectedItems.first()) == IRssFile::FEED) {
|
if(m_feedList->isFeed(selectedItems.first())) {
|
||||||
myRSSListMenu.addSeparator();
|
myRSSListMenu.addSeparator();
|
||||||
myRSSListMenu.addAction(actionCopy_feed_URL);
|
myRSSListMenu.addAction(actionCopy_feed_URL);
|
||||||
}
|
}
|
||||||
@ -137,18 +137,18 @@ void RSSImp::on_actionManage_cookies_triggered() {
|
|||||||
|
|
||||||
void RSSImp::askNewFolder() {
|
void RSSImp::askNewFolder() {
|
||||||
QTreeWidgetItem *parent_item = 0;
|
QTreeWidgetItem *parent_item = 0;
|
||||||
RssFolder *rss_parent;
|
RssFolderPtr rss_parent;
|
||||||
if(m_feedList->selectedItems().size() > 0) {
|
if(m_feedList->selectedItems().size() > 0) {
|
||||||
parent_item = m_feedList->selectedItems().at(0);
|
parent_item = m_feedList->selectedItems().at(0);
|
||||||
rss_parent = dynamic_cast<RssFolder*>(m_feedList->getRSSItem(parent_item));
|
rss_parent = qSharedPointerDynamicCast<RssFolder>(m_feedList->getRSSItem(parent_item));
|
||||||
Q_ASSERT(rss_parent->type() == IRssFile::FOLDER);
|
Q_ASSERT(rss_parent);
|
||||||
} else {
|
} else {
|
||||||
rss_parent = m_rssManager;
|
rss_parent = m_rssManager;
|
||||||
}
|
}
|
||||||
bool ok;
|
bool ok;
|
||||||
QString new_name = QInputDialog::getText(this, tr("Please choose a folder name"), tr("Folder name:"), QLineEdit::Normal, tr("New folder"), &ok);
|
QString new_name = QInputDialog::getText(this, tr("Please choose a folder name"), tr("Folder name:"), QLineEdit::Normal, tr("New folder"), &ok);
|
||||||
if(ok) {
|
if(ok) {
|
||||||
RssFolder* new_folder = rss_parent->addFolder(new_name);
|
RssFolderPtr new_folder = rss_parent->addFolder(new_name);
|
||||||
QTreeWidgetItem* folder_item;
|
QTreeWidgetItem* folder_item;
|
||||||
if(parent_item)
|
if(parent_item)
|
||||||
folder_item = new QTreeWidgetItem(parent_item);
|
folder_item = new QTreeWidgetItem(parent_item);
|
||||||
@ -183,13 +183,13 @@ void RSSImp::on_newFeedButton_clicked() {
|
|||||||
if(parent_item == m_feedList->stickyUnreadItem()) {
|
if(parent_item == m_feedList->stickyUnreadItem()) {
|
||||||
parent_item = 0;
|
parent_item = 0;
|
||||||
} else {
|
} else {
|
||||||
if(m_feedList->getItemType(parent_item) != IRssFile::FOLDER)
|
if(m_feedList->isFolder(parent_item))
|
||||||
parent_item = parent_item->parent();
|
parent_item = parent_item->parent();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
RssFolder *rss_parent;
|
RssFolderPtr rss_parent;
|
||||||
if(parent_item) {
|
if(parent_item) {
|
||||||
rss_parent = (RssFolder*)m_feedList->getRSSItem(parent_item);
|
rss_parent = qSharedPointerCast<RssFolder>(m_feedList->getRSSItem(parent_item));
|
||||||
} else {
|
} else {
|
||||||
rss_parent = m_rssManager;
|
rss_parent = m_rssManager;
|
||||||
}
|
}
|
||||||
@ -210,7 +210,7 @@ void RSSImp::on_newFeedButton_clicked() {
|
|||||||
QMessageBox::Ok);
|
QMessageBox::Ok);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
RssFeed *stream = rss_parent->addStream(newUrl);
|
RssFeedPtr stream = rss_parent->addStream(m_rssManager.data(), newUrl);
|
||||||
// Create TreeWidget item
|
// Create TreeWidget item
|
||||||
QTreeWidgetItem* item;
|
QTreeWidgetItem* item;
|
||||||
if(parent_item)
|
if(parent_item)
|
||||||
@ -248,7 +248,7 @@ void RSSImp::deleteSelectedItems() {
|
|||||||
m_currentArticle = 0;
|
m_currentArticle = 0;
|
||||||
listArticles->clear();
|
listArticles->clear();
|
||||||
}
|
}
|
||||||
IRssFile *rss_item = m_feedList->getRSSItem(item);
|
RssFilePtr rss_item = m_feedList->getRSSItem(item);
|
||||||
QTreeWidgetItem * parent = item->parent();
|
QTreeWidgetItem * parent = item->parent();
|
||||||
// Notify TreeWidget
|
// Notify TreeWidget
|
||||||
m_feedList->itemAboutToBeRemoved(item);
|
m_feedList->itemAboutToBeRemoved(item);
|
||||||
@ -350,7 +350,7 @@ void RSSImp::renameFiles() {
|
|||||||
QList<QTreeWidgetItem*> selectedItems = m_feedList->selectedItems();
|
QList<QTreeWidgetItem*> selectedItems = m_feedList->selectedItems();
|
||||||
Q_ASSERT(selectedItems.size() == 1);
|
Q_ASSERT(selectedItems.size() == 1);
|
||||||
QTreeWidgetItem *item = selectedItems.at(0);
|
QTreeWidgetItem *item = selectedItems.at(0);
|
||||||
IRssFile *rss_item = m_feedList->getRSSItem(item);
|
RssFilePtr rss_item = m_feedList->getRSSItem(item);
|
||||||
bool ok;
|
bool ok;
|
||||||
QString newName;
|
QString newName;
|
||||||
do {
|
do {
|
||||||
@ -375,7 +375,7 @@ void RSSImp::renameFiles() {
|
|||||||
void RSSImp::refreshSelectedItems() {
|
void RSSImp::refreshSelectedItems() {
|
||||||
QList<QTreeWidgetItem*> selectedItems = m_feedList->selectedItems();
|
QList<QTreeWidgetItem*> selectedItems = m_feedList->selectedItems();
|
||||||
foreach(QTreeWidgetItem* item, selectedItems){
|
foreach(QTreeWidgetItem* item, selectedItems){
|
||||||
IRssFile* file = m_feedList->getRSSItem(item);
|
RssFilePtr file = m_feedList->getRSSItem(item);
|
||||||
// Update icons
|
// Update icons
|
||||||
if(item == m_feedList->stickyUnreadItem()) {
|
if(item == m_feedList->stickyUnreadItem()) {
|
||||||
foreach(QTreeWidgetItem *feed, m_feedList->getAllFeedItems()) {
|
foreach(QTreeWidgetItem *feed, m_feedList->getAllFeedItems()) {
|
||||||
@ -384,9 +384,9 @@ void RSSImp::refreshSelectedItems() {
|
|||||||
file->refresh();
|
file->refresh();
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
if(file->type() == IRssFile::FEED) {
|
if (qSharedPointerDynamicCast<RssFeed>(file)) {
|
||||||
item->setData(0,Qt::DecorationRole, QVariant(QIcon(":/Icons/loading.png")));
|
item->setData(0,Qt::DecorationRole, QVariant(QIcon(":/Icons/loading.png")));
|
||||||
} else {
|
} else if (qSharedPointerDynamicCast<RssFolder>(file)) {
|
||||||
// Update feeds in the folder
|
// Update feeds in the folder
|
||||||
foreach(QTreeWidgetItem *feed, m_feedList->getAllFeedItems(item)) {
|
foreach(QTreeWidgetItem *feed, m_feedList->getAllFeedItems(item)) {
|
||||||
feed->setData(0,Qt::DecorationRole, QVariant(QIcon(":/Icons/loading.png")));
|
feed->setData(0,Qt::DecorationRole, QVariant(QIcon(":/Icons/loading.png")));
|
||||||
@ -403,7 +403,7 @@ void RSSImp::copySelectedFeedsURL() {
|
|||||||
QList<QTreeWidgetItem*> selectedItems = m_feedList->selectedItems();
|
QList<QTreeWidgetItem*> selectedItems = m_feedList->selectedItems();
|
||||||
QTreeWidgetItem* item;
|
QTreeWidgetItem* item;
|
||||||
foreach(item, selectedItems){
|
foreach(item, selectedItems){
|
||||||
if(m_feedList->getItemType(item) == IRssFile::FEED)
|
if(m_feedList->isFeed(item))
|
||||||
URLs << m_feedList->getItemID(item);
|
URLs << m_feedList->getItemID(item);
|
||||||
}
|
}
|
||||||
qApp->clipboard()->setText(URLs.join("\n"));
|
qApp->clipboard()->setText(URLs.join("\n"));
|
||||||
@ -413,7 +413,7 @@ void RSSImp::on_markReadButton_clicked() {
|
|||||||
QList<QTreeWidgetItem*> selectedItems = m_feedList->selectedItems();
|
QList<QTreeWidgetItem*> selectedItems = m_feedList->selectedItems();
|
||||||
QTreeWidgetItem* item;
|
QTreeWidgetItem* item;
|
||||||
foreach(item, selectedItems){
|
foreach(item, selectedItems){
|
||||||
IRssFile *rss_item = m_feedList->getRSSItem(item);
|
RssFilePtr rss_item = m_feedList->getRSSItem(item);
|
||||||
rss_item->markAsRead();
|
rss_item->markAsRead();
|
||||||
updateItemInfos(item);
|
updateItemInfos(item);
|
||||||
}
|
}
|
||||||
@ -421,14 +421,14 @@ void RSSImp::on_markReadButton_clicked() {
|
|||||||
refreshArticleList(m_feedList->currentItem());
|
refreshArticleList(m_feedList->currentItem());
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSSImp::fillFeedsList(QTreeWidgetItem *parent, RssFolder *rss_parent) {
|
void RSSImp::fillFeedsList(QTreeWidgetItem *parent, const RssFolderPtr& rss_parent) {
|
||||||
QList<IRssFile*> children;
|
QList<RssFilePtr> children;
|
||||||
if(parent) {
|
if(parent) {
|
||||||
children = rss_parent->getContent();
|
children = rss_parent->getContent();
|
||||||
} else {
|
} else {
|
||||||
children = m_rssManager->getContent();
|
children = m_rssManager->getContent();
|
||||||
}
|
}
|
||||||
foreach(IRssFile* rss_child, children){
|
foreach (const RssFilePtr& rss_child, children){
|
||||||
QTreeWidgetItem* item;
|
QTreeWidgetItem* item;
|
||||||
if(!parent)
|
if(!parent)
|
||||||
item = new QTreeWidgetItem(m_feedList);
|
item = new QTreeWidgetItem(m_feedList);
|
||||||
@ -438,12 +438,12 @@ void RSSImp::fillFeedsList(QTreeWidgetItem *parent, RssFolder *rss_parent) {
|
|||||||
// Notify TreeWidget of item addition
|
// Notify TreeWidget of item addition
|
||||||
m_feedList->itemAdded(item, rss_child);
|
m_feedList->itemAdded(item, rss_child);
|
||||||
// Set Icon
|
// Set Icon
|
||||||
if(rss_child->type() == IRssFile::FEED) {
|
if(qSharedPointerDynamicCast<RssFeed>(rss_child)) {
|
||||||
item->setData(0,Qt::DecorationRole, QVariant(QIcon(QString::fromUtf8(":/Icons/loading.png"))));
|
item->setData(0,Qt::DecorationRole, QVariant(QIcon(QString::fromUtf8(":/Icons/loading.png"))));
|
||||||
} else {
|
} else if (RssFolderPtr folder = qSharedPointerDynamicCast<RssFolder>(rss_child)) {
|
||||||
item->setData(0,Qt::DecorationRole, QVariant(IconProvider::instance()->getIcon("inode-directory")));
|
item->setData(0,Qt::DecorationRole, QVariant(IconProvider::instance()->getIcon("inode-directory")));
|
||||||
// Recurvive call to load sub folders/files
|
// Recurvive call to load sub folders/files
|
||||||
fillFeedsList(item, (RssFolder*)rss_child);
|
fillFeedsList(item, folder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -455,11 +455,11 @@ void RSSImp::refreshArticleList(QTreeWidgetItem* item) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
IRssFile *rss_item = m_feedList->getRSSItem(item);
|
RssFilePtr rss_item = m_feedList->getRSSItem(item);
|
||||||
if(!rss_item) return;
|
if(!rss_item) return;
|
||||||
|
|
||||||
qDebug("Getting the list of news");
|
qDebug("Getting the list of news");
|
||||||
QList<RssArticlePtr> news;
|
RssArticleList news;
|
||||||
if(rss_item == m_rssManager)
|
if(rss_item == m_rssManager)
|
||||||
news = rss_item->unreadArticleList();
|
news = rss_item->unreadArticleList();
|
||||||
else if(rss_item)
|
else if(rss_item)
|
||||||
@ -507,7 +507,7 @@ void RSSImp::refreshTextBrowser() {
|
|||||||
}
|
}
|
||||||
m_currentArticle = item;
|
m_currentArticle = item;
|
||||||
}
|
}
|
||||||
RssFeed *stream = m_feedList->getRSSItemFromUrl(item->data(Article::FeedUrlRole).toString());
|
RssFeedPtr stream = m_feedList->getRSSItemFromUrl(item->data(Article::FeedUrlRole).toString());
|
||||||
RssArticlePtr article = stream->getItem(item->data(Article::IdRole).toString());
|
RssArticlePtr article = stream->getItem(item->data(Article::IdRole).toString());
|
||||||
QString html;
|
QString html;
|
||||||
html += "<div style='border: 2px solid red; margin-left: 5px; margin-right: 5px; margin-bottom: 5px;'>";
|
html += "<div style='border: 2px solid red; margin-left: 5px; margin-right: 5px; margin-bottom: 5px;'>";
|
||||||
@ -556,7 +556,7 @@ void RSSImp::updateItemsInfos(const QList<QTreeWidgetItem *> &items) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void RSSImp::updateItemInfos(QTreeWidgetItem *item) {
|
void RSSImp::updateItemInfos(QTreeWidgetItem *item) {
|
||||||
IRssFile *rss_item = m_feedList->getRSSItem(item);
|
RssFilePtr rss_item = m_feedList->getRSSItem(item);
|
||||||
if (!rss_item)
|
if (!rss_item)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -579,7 +579,7 @@ void RSSImp::updateFeedIcon(const QString &url, const QString &icon_path){
|
|||||||
void RSSImp::updateFeedInfos(const QString &url, const QString &display_name, uint nbUnread){
|
void RSSImp::updateFeedInfos(const QString &url, const QString &display_name, uint nbUnread){
|
||||||
qDebug() << Q_FUNC_INFO << display_name;
|
qDebug() << Q_FUNC_INFO << display_name;
|
||||||
QTreeWidgetItem *item = m_feedList->getTreeItemFromUrl(url);
|
QTreeWidgetItem *item = m_feedList->getTreeItemFromUrl(url);
|
||||||
RssFeed *stream = (RssFeed*)m_feedList->getRSSItem(item);
|
RssFeedPtr stream = qSharedPointerCast<RssFeed>(m_feedList->getRSSItem(item));
|
||||||
item->setText(0, display_name + QString::fromUtf8(" (") + QString::number(nbUnread, 10)+ QString(")"));
|
item->setText(0, display_name + QString::fromUtf8(" (") + QString::number(nbUnread, 10)+ QString(")"));
|
||||||
if(!stream->isLoading())
|
if(!stream->isLoading())
|
||||||
item->setData(0,Qt::DecorationRole, QVariant(QIcon(stream->icon())));
|
item->setData(0,Qt::DecorationRole, QVariant(QIcon(stream->icon())));
|
||||||
@ -603,7 +603,7 @@ void RSSImp::updateRefreshInterval(uint val) {
|
|||||||
m_rssManager->updateRefreshInterval(val);
|
m_rssManager->updateRefreshInterval(val);
|
||||||
}
|
}
|
||||||
|
|
||||||
RSSImp::RSSImp(QWidget *parent) : QWidget(parent) {
|
RSSImp::RSSImp(QWidget *parent) : QWidget(parent), m_rssManager(new RssManager) {
|
||||||
setupUi(this);
|
setupUi(this);
|
||||||
// Icons
|
// Icons
|
||||||
actionCopy_feed_URL->setIcon(IconProvider::instance()->getIcon("edit-copy"));
|
actionCopy_feed_URL->setIcon(IconProvider::instance()->getIcon("edit-copy"));
|
||||||
@ -623,8 +623,6 @@ RSSImp::RSSImp(QWidget *parent) : QWidget(parent) {
|
|||||||
rssDownloaderBtn->setIcon(IconProvider::instance()->getIcon("download"));
|
rssDownloaderBtn->setIcon(IconProvider::instance()->getIcon("download"));
|
||||||
settingsButton->setIcon(IconProvider::instance()->getIcon("preferences-system"));
|
settingsButton->setIcon(IconProvider::instance()->getIcon("preferences-system"));
|
||||||
|
|
||||||
m_rssManager = RssManager::instance();
|
|
||||||
|
|
||||||
m_feedList = new FeedListWidget(splitter_h, m_rssManager);
|
m_feedList = new FeedListWidget(splitter_h, m_rssManager);
|
||||||
splitter_h->insertWidget(0, m_feedList);
|
splitter_h->insertWidget(0, m_feedList);
|
||||||
listArticles->setSelectionBehavior(QAbstractItemView::SelectItems);
|
listArticles->setSelectionBehavior(QAbstractItemView::SelectItems);
|
||||||
@ -635,8 +633,8 @@ RSSImp::RSSImp(QWidget *parent) : QWidget(parent) {
|
|||||||
refreshArticleList(m_feedList->currentItem());
|
refreshArticleList(m_feedList->currentItem());
|
||||||
|
|
||||||
loadFoldersOpenState();
|
loadFoldersOpenState();
|
||||||
connect(m_rssManager, SIGNAL(feedInfosChanged(QString, QString, unsigned int)), this, SLOT(updateFeedInfos(QString, QString, unsigned int)));
|
connect(m_rssManager.data(), SIGNAL(feedInfosChanged(QString, QString, unsigned int)), this, SLOT(updateFeedInfos(QString, QString, unsigned int)));
|
||||||
connect(m_rssManager, SIGNAL(feedIconChanged(QString, QString)), this, SLOT(updateFeedIcon(QString, QString)));
|
connect(m_rssManager.data(), SIGNAL(feedIconChanged(QString, QString)), this, SLOT(updateFeedIcon(QString, QString)));
|
||||||
|
|
||||||
connect(m_feedList, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayRSSListMenu(const QPoint&)));
|
connect(m_feedList, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayRSSListMenu(const QPoint&)));
|
||||||
connect(listArticles, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayItemsListMenu(const QPoint&)));
|
connect(listArticles, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayItemsListMenu(const QPoint&)));
|
||||||
@ -676,7 +674,6 @@ RSSImp::~RSSImp(){
|
|||||||
qDebug("Deleting RSSImp...");
|
qDebug("Deleting RSSImp...");
|
||||||
saveFoldersOpenState();
|
saveFoldersOpenState();
|
||||||
delete m_feedList;
|
delete m_feedList;
|
||||||
RssManager::drop();
|
|
||||||
qDebug("RSSImp deleted");
|
qDebug("RSSImp deleted");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -689,7 +686,7 @@ void RSSImp::on_settingsButton_clicked() {
|
|||||||
|
|
||||||
void RSSImp::on_rssDownloaderBtn_clicked()
|
void RSSImp::on_rssDownloaderBtn_clicked()
|
||||||
{
|
{
|
||||||
AutomatedRssDownloader dlg(this);
|
AutomatedRssDownloader dlg(m_rssManager, this);
|
||||||
dlg.exec();
|
dlg.exec();
|
||||||
if(dlg.isRssDownloaderEnabled())
|
if(dlg.isRssDownloaderEnabled())
|
||||||
on_updateAllButton_clicked();
|
on_updateAllButton_clicked();
|
||||||
|
@ -35,10 +35,10 @@
|
|||||||
#include <QPointer>
|
#include <QPointer>
|
||||||
|
|
||||||
#include "ui_rss.h"
|
#include "ui_rss.h"
|
||||||
|
#include "rssfolder.h"
|
||||||
|
#include "rssmanager.h"
|
||||||
|
|
||||||
class FeedListWidget;
|
class FeedListWidget;
|
||||||
class RssFolder;
|
|
||||||
class RssManager;
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
class QTreeWidgetItem;
|
class QTreeWidgetItem;
|
||||||
@ -72,7 +72,7 @@ private slots:
|
|||||||
void updateItemInfos(QTreeWidgetItem *item);
|
void updateItemInfos(QTreeWidgetItem *item);
|
||||||
void openNewsUrl();
|
void openNewsUrl();
|
||||||
void downloadTorrent();
|
void downloadTorrent();
|
||||||
void fillFeedsList(QTreeWidgetItem *parent=0, RssFolder *rss_parent=0);
|
void fillFeedsList(QTreeWidgetItem *parent=0, const RssFolderPtr& rss_parent = RssFolderPtr());
|
||||||
void saveSlidersPosition();
|
void saveSlidersPosition();
|
||||||
void restoreSlidersPosition();
|
void restoreSlidersPosition();
|
||||||
void askNewFolder();
|
void askNewFolder();
|
||||||
@ -84,7 +84,7 @@ private slots:
|
|||||||
void on_rssDownloaderBtn_clicked();
|
void on_rssDownloaderBtn_clicked();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
RssManager *m_rssManager;
|
RssManagerPtr m_rssManager;
|
||||||
FeedListWidget *m_feedList;
|
FeedListWidget *m_feedList;
|
||||||
QListWidgetItem* m_currentArticle;
|
QListWidgetItem* m_currentArticle;
|
||||||
|
|
||||||
|
@ -76,35 +76,35 @@ void RssDownloadRule::setMustNotContain(const QString &tokens)
|
|||||||
m_mustNotContain = tokens.split(QRegExp("[\\s|]"));
|
m_mustNotContain = tokens.split(QRegExp("[\\s|]"));
|
||||||
}
|
}
|
||||||
|
|
||||||
RssDownloadRule RssDownloadRule::fromOldFormat(const QVariantHash &rule_hash, const QString &feed_url, const QString &rule_name)
|
RssDownloadRulePtr RssDownloadRule::fromOldFormat(const QVariantHash &rule_hash, const QString &feed_url, const QString &rule_name)
|
||||||
{
|
{
|
||||||
qDebug() << Q_FUNC_INFO << feed_url << rule_name;
|
qDebug() << Q_FUNC_INFO << feed_url << rule_name;
|
||||||
RssDownloadRule rule;
|
RssDownloadRulePtr rule(new RssDownloadRule);
|
||||||
rule.setName(rule_name);
|
rule->setName(rule_name);
|
||||||
rule.setMustContain(rule_hash.value("matches", "").toString());
|
rule->setMustContain(rule_hash.value("matches", "").toString());
|
||||||
rule.setMustNotContain(rule_hash.value("not", "").toString());
|
rule->setMustNotContain(rule_hash.value("not", "").toString());
|
||||||
if(!feed_url.isEmpty())
|
if(!feed_url.isEmpty())
|
||||||
rule.setRssFeeds(QStringList() << feed_url);
|
rule->setRssFeeds(QStringList() << feed_url);
|
||||||
rule.setSavePath(rule_hash.value("save_path", "").toString());
|
rule->setSavePath(rule_hash.value("save_path", "").toString());
|
||||||
// Is enabled?
|
// Is enabled?
|
||||||
QIniSettings qBTRSS("qBittorrent", "qBittorrent-rss");
|
QIniSettings qBTRSS("qBittorrent", "qBittorrent-rss");
|
||||||
const QHash<QString, QVariant> feeds_w_downloader = qBTRSS.value("downloader_on").toHash();
|
const QHash<QString, QVariant> feeds_w_downloader = qBTRSS.value("downloader_on").toHash();
|
||||||
rule.setEnabled(feeds_w_downloader.value(feed_url, true).toBool());
|
rule->setEnabled(feeds_w_downloader.value(feed_url, true).toBool());
|
||||||
// label was unsupported < 2.5.0
|
// label was unsupported < 2.5.0
|
||||||
return rule;
|
return rule;
|
||||||
}
|
}
|
||||||
|
|
||||||
RssDownloadRule RssDownloadRule::fromNewFormat(const QVariantHash &rule_hash)
|
RssDownloadRulePtr RssDownloadRule::fromNewFormat(const QVariantHash &rule_hash)
|
||||||
{
|
{
|
||||||
RssDownloadRule rule;
|
RssDownloadRulePtr rule(new RssDownloadRule);
|
||||||
rule.setName(rule_hash.value("name").toString());
|
rule->setName(rule_hash.value("name").toString());
|
||||||
rule.setMustContain(rule_hash.value("must_contain").toString());
|
rule->setMustContain(rule_hash.value("must_contain").toString());
|
||||||
rule.setMustNotContain(rule_hash.value("must_not_contain").toString());
|
rule->setMustNotContain(rule_hash.value("must_not_contain").toString());
|
||||||
rule.setRssFeeds(rule_hash.value("affected_feeds").toStringList());
|
rule->setRssFeeds(rule_hash.value("affected_feeds").toStringList());
|
||||||
rule.setEnabled(rule_hash.value("enabled", false).toBool());
|
rule->setEnabled(rule_hash.value("enabled", false).toBool());
|
||||||
rule.setSavePath(rule_hash.value("save_path").toString());
|
rule->setSavePath(rule_hash.value("save_path").toString());
|
||||||
rule.setLabel(rule_hash.value("label_assigned").toString());
|
rule->setLabel(rule_hash.value("label_assigned").toString());
|
||||||
rule.setUseRegex(rule_hash.value("use_regex", false).toBool());
|
rule->setUseRegex(rule_hash.value("use_regex", false).toBool());
|
||||||
return rule;
|
return rule;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -134,7 +134,7 @@ void RssDownloadRule::setSavePath(const QString &save_path)
|
|||||||
m_savePath = QString();
|
m_savePath = QString();
|
||||||
}
|
}
|
||||||
|
|
||||||
QStringList RssDownloadRule::findMatchingArticles(const RssFeed *feed) const
|
QStringList RssDownloadRule::findMatchingArticles(const RssFeedPtr& feed) const
|
||||||
{
|
{
|
||||||
QStringList ret;
|
QStringList ret;
|
||||||
const RssArticleHash& feed_articles = feed->articleHash();
|
const RssArticleHash& feed_articles = feed->articleHash();
|
||||||
|
@ -33,16 +33,21 @@
|
|||||||
|
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
#include <QVariantHash>
|
#include <QVariantHash>
|
||||||
|
#include <QSharedPointer>
|
||||||
|
|
||||||
class RssFeed;
|
class RssFeed;
|
||||||
|
typedef QSharedPointer<RssFeed> RssFeedPtr;
|
||||||
|
|
||||||
|
class RssDownloadRule;
|
||||||
|
typedef QSharedPointer<RssDownloadRule> RssDownloadRulePtr;
|
||||||
|
|
||||||
class RssDownloadRule
|
class RssDownloadRule
|
||||||
{
|
{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit RssDownloadRule();
|
explicit RssDownloadRule();
|
||||||
static RssDownloadRule fromOldFormat(const QVariantHash& rule_hash, const QString &feed_url, const QString &rule_name); // Before v2.5.0
|
static RssDownloadRulePtr fromOldFormat(const QVariantHash& rule_hash, const QString &feed_url, const QString &rule_name); // Before v2.5.0
|
||||||
static RssDownloadRule fromNewFormat(const QVariantHash &rule_hash);
|
static RssDownloadRulePtr fromNewFormat(const QVariantHash &rule_hash);
|
||||||
QVariantHash toVariantHash() const;
|
QVariantHash toVariantHash() const;
|
||||||
bool matches(const QString &article_title) const;
|
bool matches(const QString &article_title) const;
|
||||||
void setMustContain(const QString &tokens);
|
void setMustContain(const QString &tokens);
|
||||||
@ -57,12 +62,11 @@ public:
|
|||||||
inline void setLabel(const QString &_label) { m_label = _label; }
|
inline void setLabel(const QString &_label) { m_label = _label; }
|
||||||
inline bool isEnabled() const { return m_enabled; }
|
inline bool isEnabled() const { return m_enabled; }
|
||||||
inline void setEnabled(bool enable) { m_enabled = enable; }
|
inline void setEnabled(bool enable) { m_enabled = enable; }
|
||||||
inline bool isValid() const { return !m_name.isEmpty(); }
|
|
||||||
inline QString mustContain() const { return m_mustContain.join(" "); }
|
inline QString mustContain() const { return m_mustContain.join(" "); }
|
||||||
inline QString mustNotContain() const { return m_mustNotContain.join(" "); }
|
inline QString mustNotContain() const { return m_mustNotContain.join(" "); }
|
||||||
inline bool useRegex() const { return m_useRegex; }
|
inline bool useRegex() const { return m_useRegex; }
|
||||||
inline void setUseRegex(bool enabled) { m_useRegex = enabled; }
|
inline void setUseRegex(bool enabled) { m_useRegex = enabled; }
|
||||||
QStringList findMatchingArticles(const RssFeed* feed) const;
|
QStringList findMatchingArticles(const RssFeedPtr& feed) const;
|
||||||
// Operators
|
// Operators
|
||||||
bool operator==(const RssDownloadRule &other);
|
bool operator==(const RssDownloadRule &other);
|
||||||
|
|
||||||
|
@ -51,19 +51,21 @@ RssDownloadRuleList* RssDownloadRuleList::instance()
|
|||||||
|
|
||||||
void RssDownloadRuleList::drop()
|
void RssDownloadRuleList::drop()
|
||||||
{
|
{
|
||||||
if(m_instance)
|
if (m_instance) {
|
||||||
delete m_instance;
|
delete m_instance;
|
||||||
|
m_instance = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
RssDownloadRule RssDownloadRuleList::findMatchingRule(const QString &feed_url, const QString &article_title) const
|
RssDownloadRulePtr RssDownloadRuleList::findMatchingRule(const QString &feed_url, const QString &article_title) const
|
||||||
{
|
{
|
||||||
Q_ASSERT(RssSettings().isRssDownloadingEnabled());
|
Q_ASSERT(RssSettings().isRssDownloadingEnabled());
|
||||||
const QStringList rule_names = m_feedRules.value(feed_url);
|
QStringList rule_names = m_feedRules.value(feed_url);
|
||||||
foreach(const QString &rule_name, rule_names) {
|
foreach(const QString &rule_name, rule_names) {
|
||||||
const RssDownloadRule &rule = m_rules[rule_name];
|
RssDownloadRulePtr rule = m_rules[rule_name];
|
||||||
if(rule.isEnabled() && rule.matches(article_title)) return rule;
|
if(rule->isEnabled() && rule->matches(article_title)) return rule;
|
||||||
}
|
}
|
||||||
return RssDownloadRule();
|
return RssDownloadRulePtr();
|
||||||
}
|
}
|
||||||
|
|
||||||
void RssDownloadRuleList::saveRulesToStorage()
|
void RssDownloadRuleList::saveRulesToStorage()
|
||||||
@ -97,11 +99,11 @@ void RssDownloadRuleList::importFeedsInOldFormat(const QHash<QString, QVariant>
|
|||||||
void RssDownloadRuleList::importFeedRulesInOldFormat(const QString &feed_url, const QHash<QString, QVariant> &rules)
|
void RssDownloadRuleList::importFeedRulesInOldFormat(const QString &feed_url, const QHash<QString, QVariant> &rules)
|
||||||
{
|
{
|
||||||
foreach(const QString &rule_name, rules.keys()) {
|
foreach(const QString &rule_name, rules.keys()) {
|
||||||
RssDownloadRule rule = RssDownloadRule::fromOldFormat(rules.value(rule_name).toHash(), feed_url, rule_name);
|
RssDownloadRulePtr rule = RssDownloadRule::fromOldFormat(rules.value(rule_name).toHash(), feed_url, rule_name);
|
||||||
if(!rule.isValid()) continue;
|
if(!rule) continue;
|
||||||
// Check for rule name clash
|
// Check for rule name clash
|
||||||
while(m_rules.contains(rule.name())) {
|
while(m_rules.contains(rule->name())) {
|
||||||
rule.setName(rule.name()+"_");
|
rule->setName(rule->name()+"_");
|
||||||
}
|
}
|
||||||
// Add the rule to the list
|
// Add the rule to the list
|
||||||
saveRule(rule);
|
saveRule(rule);
|
||||||
@ -111,8 +113,8 @@ void RssDownloadRuleList::importFeedRulesInOldFormat(const QString &feed_url, co
|
|||||||
QVariantHash RssDownloadRuleList::toVariantHash() const
|
QVariantHash RssDownloadRuleList::toVariantHash() const
|
||||||
{
|
{
|
||||||
QVariantHash ret;
|
QVariantHash ret;
|
||||||
foreach(const RssDownloadRule &rule, m_rules.values()) {
|
foreach(const RssDownloadRulePtr &rule, m_rules.values()) {
|
||||||
ret.insert(rule.name(), rule.toVariantHash());
|
ret.insert(rule->name(), rule->toVariantHash());
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -120,25 +122,25 @@ QVariantHash RssDownloadRuleList::toVariantHash() const
|
|||||||
void RssDownloadRuleList::loadRulesFromVariantHash(const QVariantHash &h)
|
void RssDownloadRuleList::loadRulesFromVariantHash(const QVariantHash &h)
|
||||||
{
|
{
|
||||||
foreach(const QVariant& v, h.values()) {
|
foreach(const QVariant& v, h.values()) {
|
||||||
RssDownloadRule rule = RssDownloadRule::fromNewFormat(v.toHash());
|
RssDownloadRulePtr rule = RssDownloadRule::fromNewFormat(v.toHash());
|
||||||
if(!rule.name().isEmpty()) {
|
if(rule && !rule->name().isEmpty()) {
|
||||||
saveRule(rule);
|
saveRule(rule);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RssDownloadRuleList::saveRule(const RssDownloadRule &rule)
|
void RssDownloadRuleList::saveRule(const RssDownloadRulePtr &rule)
|
||||||
{
|
{
|
||||||
qDebug() << Q_FUNC_INFO << rule.name();
|
qDebug() << Q_FUNC_INFO << rule->name();
|
||||||
Q_ASSERT(rule.isValid());
|
Q_ASSERT(rule);
|
||||||
if(m_rules.contains(rule.name())) {
|
if(m_rules.contains(rule->name())) {
|
||||||
qDebug("This is an update, removing old rule first");
|
qDebug("This is an update, removing old rule first");
|
||||||
removeRule(rule.name());
|
removeRule(rule->name());
|
||||||
}
|
}
|
||||||
m_rules.insert(rule.name(), rule);
|
m_rules.insert(rule->name(), rule);
|
||||||
// Update feedRules hashtable
|
// Update feedRules hashtable
|
||||||
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
|
// Save rules
|
||||||
saveRulesToStorage();
|
saveRulesToStorage();
|
||||||
@ -149,10 +151,10 @@ void RssDownloadRuleList::removeRule(const QString &name)
|
|||||||
{
|
{
|
||||||
qDebug() << Q_FUNC_INFO << name;
|
qDebug() << Q_FUNC_INFO << name;
|
||||||
if(!m_rules.contains(name)) return;
|
if(!m_rules.contains(name)) return;
|
||||||
const RssDownloadRule rule = m_rules.take(name);
|
RssDownloadRulePtr rule = m_rules.take(name);
|
||||||
// Update feedRules hashtable
|
// Update feedRules hashtable
|
||||||
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
|
// Save rules
|
||||||
saveRulesToStorage();
|
saveRulesToStorage();
|
||||||
@ -161,18 +163,18 @@ void RssDownloadRuleList::removeRule(const QString &name)
|
|||||||
void RssDownloadRuleList::renameRule(const QString &old_name, const QString &new_name)
|
void RssDownloadRuleList::renameRule(const QString &old_name, const QString &new_name)
|
||||||
{
|
{
|
||||||
if(!m_rules.contains(old_name)) return;
|
if(!m_rules.contains(old_name)) return;
|
||||||
RssDownloadRule rule = m_rules.take(old_name);
|
RssDownloadRulePtr rule = m_rules.take(old_name);
|
||||||
rule.setName(new_name);
|
rule->setName(new_name);
|
||||||
m_rules.insert(new_name, rule);
|
m_rules.insert(new_name, rule);
|
||||||
// Update feedRules hashtable
|
// Update feedRules hashtable
|
||||||
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
|
// Save rules
|
||||||
saveRulesToStorage();
|
saveRulesToStorage();
|
||||||
}
|
}
|
||||||
|
|
||||||
const RssDownloadRule RssDownloadRuleList::getRule(const QString &name) const
|
RssDownloadRulePtr RssDownloadRuleList::getRule(const QString &name) const
|
||||||
{
|
{
|
||||||
return m_rules.value(name);
|
return m_rules.value(name);
|
||||||
}
|
}
|
||||||
|
@ -49,12 +49,12 @@ private:
|
|||||||
public:
|
public:
|
||||||
static RssDownloadRuleList* instance();
|
static RssDownloadRuleList* instance();
|
||||||
static void drop();
|
static void drop();
|
||||||
RssDownloadRule findMatchingRule(const QString &feed_url, const QString &article_title) const;
|
RssDownloadRulePtr findMatchingRule(const QString &feed_url, const QString &article_title) const;
|
||||||
// Operators
|
// Operators
|
||||||
void saveRule(const RssDownloadRule &rule);
|
void saveRule(const RssDownloadRulePtr &rule);
|
||||||
void removeRule(const QString &name);
|
void removeRule(const QString &name);
|
||||||
void renameRule(const QString &old_name, const QString &new_name);
|
void renameRule(const QString &old_name, const QString &new_name);
|
||||||
const RssDownloadRule 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(); }
|
||||||
bool serialize(const QString& path);
|
bool serialize(const QString& path);
|
||||||
@ -69,7 +69,7 @@ private:
|
|||||||
void saveRulesToStorage();
|
void saveRulesToStorage();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QHash<QString, RssDownloadRule> m_rules;
|
QHash<QString, RssDownloadRulePtr> m_rules;
|
||||||
QHash<QString, QStringList> m_feedRules;
|
QHash<QString, QStringList> m_feedRules;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -39,16 +39,17 @@
|
|||||||
#include "rssdownloadrulelist.h"
|
#include "rssdownloadrulelist.h"
|
||||||
#include "downloadthread.h"
|
#include "downloadthread.h"
|
||||||
|
|
||||||
RssFeed::RssFeed(RssFolder* parent, const QString &url): m_parent(parent), m_icon(":/Icons/oxygen/application-rss+xml.png"),
|
RssFeed::RssFeed(RssManager* manager, RssFolder* parent, const QString &url):
|
||||||
|
m_manager(manager), m_parent(parent), m_icon(":/Icons/oxygen/application-rss+xml.png"),
|
||||||
m_refreshed(false), m_downloadFailure(false), m_loading(false) {
|
m_refreshed(false), m_downloadFailure(false), m_loading(false) {
|
||||||
qDebug() << Q_FUNC_INFO << url;
|
qDebug() << Q_FUNC_INFO << url;
|
||||||
m_url = QUrl::fromEncoded(url.toUtf8()).toString();
|
m_url = QUrl::fromEncoded(url.toUtf8()).toString();
|
||||||
// Listen for new RSS downloads
|
// Listen for new RSS downloads
|
||||||
connect(RssManager::instance()->rssDownloader(), SIGNAL(downloadFinished(QString,QString)), SLOT(handleFinishedDownload(QString,QString)));
|
connect(manager->rssDownloader(), SIGNAL(downloadFinished(QString,QString)), SLOT(handleFinishedDownload(QString,QString)));
|
||||||
connect(RssManager::instance()->rssDownloader(), SIGNAL(downloadFailure(QString,QString)), SLOT(handleDownloadFailure(QString,QString)));
|
connect(manager->rssDownloader(), SIGNAL(downloadFailure(QString,QString)), SLOT(handleDownloadFailure(QString,QString)));
|
||||||
// Download the RSS Feed icon
|
// Download the RSS Feed icon
|
||||||
m_iconUrl = iconUrl();
|
m_iconUrl = iconUrl();
|
||||||
RssManager::instance()->rssDownloader()->downloadUrl(m_iconUrl);
|
manager->rssDownloader()->downloadUrl(m_iconUrl);
|
||||||
|
|
||||||
// Load old RSS articles
|
// Load old RSS articles
|
||||||
loadItemsFromDisk();
|
loadItemsFromDisk();
|
||||||
@ -90,10 +91,6 @@ void RssFeed::loadItemsFromDisk() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
IRssFile::FileType RssFeed::type() const {
|
|
||||||
return IRssFile::FEED;
|
|
||||||
}
|
|
||||||
|
|
||||||
void RssFeed::refresh() {
|
void RssFeed::refresh() {
|
||||||
if(m_loading) {
|
if(m_loading) {
|
||||||
qWarning() << Q_FUNC_INFO << "Feed" << this->displayName() << "is already being refreshed, ignoring request";
|
qWarning() << Q_FUNC_INFO << "Feed" << this->displayName() << "is already being refreshed, ignoring request";
|
||||||
@ -101,7 +98,7 @@ void RssFeed::refresh() {
|
|||||||
}
|
}
|
||||||
m_loading = true;
|
m_loading = true;
|
||||||
// Download the RSS again
|
// Download the RSS again
|
||||||
RssManager::instance()->rssDownloader()->downloadUrl(m_url);
|
m_manager->rssDownloader()->downloadUrl(m_url);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RssFeed::removeAllSettings() {
|
void RssFeed::removeAllSettings() {
|
||||||
@ -189,7 +186,7 @@ void RssFeed::markAsRead() {
|
|||||||
for (RssArticleHash::ConstIterator it=m_articles.begin(); it != m_articles.end(); it++) {
|
for (RssArticleHash::ConstIterator it=m_articles.begin(); it != m_articles.end(); it++) {
|
||||||
it.value()->markAsRead();
|
it.value()->markAsRead();
|
||||||
}
|
}
|
||||||
RssManager::instance()->forwardFeedInfosChanged(m_url, displayName(), 0);
|
m_manager->forwardFeedInfosChanged(m_url, displayName(), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint RssFeed::unreadCount() const{
|
uint RssFeed::unreadCount() const{
|
||||||
@ -201,12 +198,12 @@ uint RssFeed::unreadCount() const{
|
|||||||
return nbUnread;
|
return nbUnread;
|
||||||
}
|
}
|
||||||
|
|
||||||
const QList<RssArticlePtr> RssFeed::articleList() const{
|
const RssArticleList RssFeed::articleList() const{
|
||||||
return m_articles.values();
|
return m_articles.values();
|
||||||
}
|
}
|
||||||
|
|
||||||
const QList<RssArticlePtr> RssFeed::unreadArticleList() const {
|
const RssArticleList RssFeed::unreadArticleList() const {
|
||||||
QList<RssArticlePtr> unread_news;
|
RssArticleList unread_news;
|
||||||
for (RssArticleHash::ConstIterator it = m_articles.begin(); it != m_articles.end(); it++) {
|
for (RssArticleHash::ConstIterator it = m_articles.begin(); it != m_articles.end(); it++) {
|
||||||
if(!it.value()->isRead())
|
if(!it.value()->isRead())
|
||||||
unread_news << it.value();
|
unread_news << it.value();
|
||||||
@ -270,7 +267,7 @@ bool RssFeed::parseRSS(QIODevice* device) {
|
|||||||
QString icon_path = xml.attributes().value("url").toString();
|
QString icon_path = xml.attributes().value("url").toString();
|
||||||
if(!icon_path.isEmpty()) {
|
if(!icon_path.isEmpty()) {
|
||||||
m_iconUrl = icon_path;
|
m_iconUrl = icon_path;
|
||||||
RssManager::instance()->rssDownloader()->downloadUrl(m_iconUrl);
|
m_manager->rssDownloader()->downloadUrl(m_iconUrl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(xml.name() == "item") {
|
else if(xml.name() == "item") {
|
||||||
@ -305,13 +302,13 @@ void RssFeed::downloadMatchingArticleTorrents() {
|
|||||||
else
|
else
|
||||||
torrent_url = item->link();
|
torrent_url = item->link();
|
||||||
// Check if the item should be automatically downloaded
|
// Check if the item should be automatically downloaded
|
||||||
const RssDownloadRule matching_rule = RssDownloadRuleList::instance()->findMatchingRule(m_url, item->title());
|
RssDownloadRulePtr matching_rule = RssDownloadRuleList::instance()->findMatchingRule(m_url, item->title());
|
||||||
if(matching_rule.isValid()) {
|
if(matching_rule) {
|
||||||
// Item was downloaded, consider it as Read
|
// Item was downloaded, consider it as Read
|
||||||
item->markAsRead();
|
item->markAsRead();
|
||||||
// Download the torrent
|
// Download the torrent
|
||||||
QBtSession::instance()->addConsoleMessage(tr("Automatically downloading %1 torrent from %2 RSS feed...").arg(item->title()).arg(displayName()));
|
QBtSession::instance()->addConsoleMessage(tr("Automatically downloading %1 torrent from %2 RSS feed...").arg(item->title()).arg(displayName()));
|
||||||
QBtSession::instance()->downloadUrlAndSkipDialog(torrent_url, matching_rule.savePath(), matching_rule.label());
|
QBtSession::instance()->downloadUrlAndSkipDialog(torrent_url, matching_rule->savePath(), matching_rule->label());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -320,7 +317,7 @@ void RssFeed::resizeList() {
|
|||||||
const uint max_articles = RssSettings().getRSSMaxArticlesPerFeed();
|
const uint max_articles = RssSettings().getRSSMaxArticlesPerFeed();
|
||||||
const uint nb_articles = m_articles.size();
|
const uint nb_articles = m_articles.size();
|
||||||
if(nb_articles > max_articles) {
|
if(nb_articles > max_articles) {
|
||||||
QList<RssArticlePtr> listItems = m_articles.values();
|
RssArticleList listItems = m_articles.values();
|
||||||
RssManager::sortNewsList(listItems);
|
RssManager::sortNewsList(listItems);
|
||||||
const int excess = nb_articles - max_articles;
|
const int excess = nb_articles - max_articles;
|
||||||
for(uint i=nb_articles-excess; i<nb_articles; ++i){
|
for(uint i=nb_articles-excess; i<nb_articles; ++i){
|
||||||
@ -358,14 +355,14 @@ void RssFeed::handleFinishedDownload(const QString& url, const QString &file_pat
|
|||||||
// Parse the download RSS
|
// Parse the download RSS
|
||||||
if(parseXmlFile(file_path)) {
|
if(parseXmlFile(file_path)) {
|
||||||
m_refreshed = true;
|
m_refreshed = true;
|
||||||
RssManager::instance()->forwardFeedInfosChanged(m_url, displayName(), unreadCount()); // XXX: Ugly
|
m_manager->forwardFeedInfosChanged(m_url, displayName(), unreadCount()); // XXX: Ugly
|
||||||
qDebug() << Q_FUNC_INFO << "Feed parsed successfuly";
|
qDebug() << Q_FUNC_INFO << "Feed parsed successfuly";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(url == m_iconUrl) {
|
else if(url == m_iconUrl) {
|
||||||
m_icon = file_path;
|
m_icon = file_path;
|
||||||
qDebug() << Q_FUNC_INFO << "icon path:" << m_icon;
|
qDebug() << Q_FUNC_INFO << "icon path:" << m_icon;
|
||||||
RssManager::instance()->forwardFeedIconChanged(m_url, m_icon); // XXX: Ugly
|
m_manager->forwardFeedIconChanged(m_url, m_icon); // XXX: Ugly
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -373,7 +370,7 @@ void RssFeed::handleDownloadFailure(const QString &url, const QString& error) {
|
|||||||
if(url != m_url) return;
|
if(url != m_url) return;
|
||||||
m_downloadFailure = true;
|
m_downloadFailure = true;
|
||||||
m_loading = false;
|
m_loading = false;
|
||||||
RssManager::instance()->forwardFeedInfosChanged(m_url, displayName(), unreadCount()); // XXX: Ugly
|
m_manager->forwardFeedInfosChanged(m_url, displayName(), unreadCount()); // XXX: Ugly
|
||||||
qWarning() << "Failed to download RSS feed at" << url;
|
qWarning() << "Failed to download RSS feed at" << url;
|
||||||
qWarning() << "Reason:" << error;
|
qWarning() << "Reason:" << error;
|
||||||
}
|
}
|
||||||
|
@ -32,22 +32,25 @@
|
|||||||
#define RSSFEED_H
|
#define RSSFEED_H
|
||||||
|
|
||||||
#include <QHash>
|
#include <QHash>
|
||||||
|
#include <QSharedPointer>
|
||||||
|
|
||||||
#include "rssfile.h"
|
#include "rssfile.h"
|
||||||
|
|
||||||
|
class RssFeed;
|
||||||
class RssManager;
|
class RssManager;
|
||||||
|
|
||||||
typedef QHash<QString, RssArticlePtr> RssArticleHash;
|
typedef QHash<QString, RssArticlePtr> RssArticleHash;
|
||||||
|
typedef QSharedPointer<RssFeed> RssFeedPtr;
|
||||||
|
typedef QList<RssFeedPtr> RssFeedList;
|
||||||
|
|
||||||
class RssFeed: public QObject, public IRssFile {
|
class RssFeed: public QObject, public RssFile {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
RssFeed(RssFolder* m_parent, const QString &url);
|
RssFeed(RssManager* manager, RssFolder* m_parent, const QString &url);
|
||||||
virtual ~RssFeed();
|
virtual ~RssFeed();
|
||||||
inline RssFolder* parent() const { return m_parent; }
|
inline RssFolder* parent() const { return m_parent; }
|
||||||
void setParent(RssFolder* parent) { m_parent = parent; }
|
void setParent(RssFolder* parent) { m_parent = parent; }
|
||||||
FileType type() const;
|
|
||||||
void refresh();
|
void refresh();
|
||||||
QString id() const { return m_url; }
|
QString id() const { return m_url; }
|
||||||
void removeAllSettings();
|
void removeAllSettings();
|
||||||
@ -65,9 +68,9 @@ public:
|
|||||||
uint count() const;
|
uint count() const;
|
||||||
void markAsRead();
|
void markAsRead();
|
||||||
uint unreadCount() const;
|
uint unreadCount() const;
|
||||||
const QList<RssArticlePtr> articleList() const;
|
const RssArticleList articleList() const;
|
||||||
const RssArticleHash& articleHash() const { return m_articles; }
|
const RssArticleHash& articleHash() const { return m_articles; }
|
||||||
const QList<RssArticlePtr> unreadArticleList() const;
|
const RssArticleList unreadArticleList() const;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void handleFinishedDownload(const QString& url, const QString &file_path);
|
void handleFinishedDownload(const QString& url, const QString &file_path);
|
||||||
@ -83,6 +86,7 @@ private:
|
|||||||
void loadItemsFromDisk();
|
void loadItemsFromDisk();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
RssManager* m_manager;
|
||||||
RssArticleHash m_articles;
|
RssArticleHash m_articles;
|
||||||
RssFolder *m_parent;
|
RssFolder *m_parent;
|
||||||
QString m_title;
|
QString m_title;
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
#include "rssfile.h"
|
#include "rssfile.h"
|
||||||
#include "rssfolder.h"
|
#include "rssfolder.h"
|
||||||
|
|
||||||
QStringList IRssFile::pathHierarchy() const {
|
QStringList RssFile::pathHierarchy() const {
|
||||||
QStringList path;
|
QStringList path;
|
||||||
if(parent())
|
if(parent())
|
||||||
path << parent()->pathHierarchy();
|
path << parent()->pathHierarchy();
|
||||||
|
@ -33,19 +33,25 @@
|
|||||||
|
|
||||||
#include <QList>
|
#include <QList>
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
#include "rssarticle.h"
|
#include <QSharedPointer>
|
||||||
|
|
||||||
class RssFolder;
|
class RssFolder;
|
||||||
|
class RssFile;
|
||||||
|
class RssArticle;
|
||||||
|
|
||||||
class IRssFile {
|
typedef QSharedPointer<RssFile> RssFilePtr;
|
||||||
|
typedef QSharedPointer<RssArticle> RssArticlePtr;
|
||||||
|
typedef QList<RssArticlePtr> RssArticleList;
|
||||||
|
typedef QList<RssFilePtr> RssFileList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parent interface for RssFolder and RssFeed.
|
||||||
|
*/
|
||||||
|
class RssFile {
|
||||||
public:
|
public:
|
||||||
enum FileType {FEED, FOLDER};
|
virtual ~RssFile() {}
|
||||||
|
|
||||||
virtual ~IRssFile() {}
|
|
||||||
|
|
||||||
virtual uint unreadCount() const = 0;
|
virtual uint unreadCount() const = 0;
|
||||||
virtual FileType type() const = 0;
|
|
||||||
virtual QString displayName() const = 0;
|
virtual QString displayName() const = 0;
|
||||||
virtual QString id() const = 0;
|
virtual QString id() const = 0;
|
||||||
virtual void rename(const QString &new_name) = 0;
|
virtual void rename(const QString &new_name) = 0;
|
||||||
@ -54,8 +60,8 @@ public:
|
|||||||
virtual void setParent(RssFolder* parent) = 0;
|
virtual void setParent(RssFolder* parent) = 0;
|
||||||
virtual void refresh() = 0;
|
virtual void refresh() = 0;
|
||||||
virtual void removeAllSettings() = 0;
|
virtual void removeAllSettings() = 0;
|
||||||
virtual const QList<RssArticlePtr> articleList() const = 0;
|
virtual const RssArticleList articleList() const = 0;
|
||||||
virtual const QList<RssArticlePtr> unreadArticleList() const = 0;
|
virtual const RssArticleList unreadArticleList() const = 0;
|
||||||
QStringList pathHierarchy() const;
|
QStringList pathHierarchy() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -40,8 +40,6 @@ RssFolder::RssFolder(RssFolder *parent, const QString &name): m_parent(parent),
|
|||||||
}
|
}
|
||||||
|
|
||||||
RssFolder::~RssFolder() {
|
RssFolder::~RssFolder() {
|
||||||
qDebug("Deleting a RSS folder, removing elements");
|
|
||||||
qDeleteAll(m_children.values());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int RssFolder::unreadCount() const {
|
unsigned int RssFolder::unreadCount() const {
|
||||||
@ -52,31 +50,26 @@ unsigned int RssFolder::unreadCount() const {
|
|||||||
return nb_unread;
|
return nb_unread;
|
||||||
}
|
}
|
||||||
|
|
||||||
IRssFile::FileType RssFolder::type() const {
|
|
||||||
return IRssFile::FOLDER;
|
|
||||||
}
|
|
||||||
|
|
||||||
void RssFolder::removeChild(const QString &childId) {
|
void RssFolder::removeChild(const QString &childId) {
|
||||||
if (m_children.contains(childId)) {
|
if (m_children.contains(childId)) {
|
||||||
IRssFile* child = m_children.take(childId);
|
RssFilePtr child = m_children.take(childId);
|
||||||
child->removeAllSettings();
|
child->removeAllSettings();
|
||||||
delete child;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
RssFolder* RssFolder::addFolder(const QString &name) {
|
RssFolderPtr RssFolder::addFolder(const QString &name) {
|
||||||
RssFolder *subfolder;
|
RssFolderPtr subfolder;
|
||||||
if (!m_children.contains(name)) {
|
if (!m_children.contains(name)) {
|
||||||
subfolder = new RssFolder(this, name);
|
subfolder = RssFolderPtr(new RssFolder(this, name));
|
||||||
m_children[name] = subfolder;
|
m_children[name] = subfolder;
|
||||||
} else {
|
} else {
|
||||||
subfolder = dynamic_cast<RssFolder*>(m_children.value(name));
|
subfolder = qSharedPointerDynamicCast<RssFolder>(m_children.value(name));
|
||||||
}
|
}
|
||||||
return subfolder;
|
return subfolder;
|
||||||
}
|
}
|
||||||
|
|
||||||
RssFeed* RssFolder::addStream(const QString &url) {
|
RssFeedPtr RssFolder::addStream(RssManager* manager, const QString &url) {
|
||||||
RssFeed* stream = new RssFeed(this, url);
|
RssFeedPtr stream(new RssFeed(manager, this, url));
|
||||||
Q_ASSERT(!m_children.contains(stream->url()));
|
Q_ASSERT(!m_children.contains(stream->url()));
|
||||||
m_children[stream->url()] = stream;
|
m_children[stream->url()] = stream;
|
||||||
stream->refresh();
|
stream->refresh();
|
||||||
@ -90,33 +83,33 @@ void RssFolder::refresh() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const QList<RssArticlePtr> RssFolder::articleList() const {
|
const RssArticleList RssFolder::articleList() const {
|
||||||
QList<RssArticlePtr> news;
|
RssArticleList news;
|
||||||
for (RssFileHash::ConstIterator it = m_children.begin(); it != m_children.end(); it++) {
|
for (RssFileHash::ConstIterator it = m_children.begin(); it != m_children.end(); it++) {
|
||||||
news << it.value()->articleList();
|
news << it.value()->articleList();
|
||||||
}
|
}
|
||||||
return news;
|
return news;
|
||||||
}
|
}
|
||||||
|
|
||||||
const QList<RssArticlePtr> RssFolder::unreadArticleList() const {
|
const RssArticleList RssFolder::unreadArticleList() const {
|
||||||
QList<RssArticlePtr> unread_news;
|
RssArticleList unread_news;
|
||||||
for (RssFileHash::ConstIterator it = m_children.begin(); it != m_children.end(); it++) {
|
for (RssFileHash::ConstIterator it = m_children.begin(); it != m_children.end(); it++) {
|
||||||
unread_news << it.value()->unreadArticleList();
|
unread_news << it.value()->unreadArticleList();
|
||||||
}
|
}
|
||||||
return unread_news;
|
return unread_news;
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<IRssFile*> RssFolder::getContent() const {
|
RssFileList RssFolder::getContent() const {
|
||||||
return m_children.values();
|
return m_children.values();
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int RssFolder::getNbFeeds() const {
|
unsigned int RssFolder::getNbFeeds() const {
|
||||||
uint nbFeeds = 0;
|
uint nbFeeds = 0;
|
||||||
for (RssFileHash::ConstIterator it = m_children.begin(); it != m_children.end(); it++) {
|
for (RssFileHash::ConstIterator it = m_children.begin(); it != m_children.end(); it++) {
|
||||||
if (it.value()->type() == IRssFile::FOLDER)
|
if (RssFolderPtr folder = qSharedPointerDynamicCast<RssFolder>(it.value()))
|
||||||
nbFeeds += ((RssFolder*)*it)->getNbFeeds();
|
nbFeeds += folder->getNbFeeds();
|
||||||
else
|
else
|
||||||
nbFeeds += 1;
|
++nbFeeds; // Feed
|
||||||
}
|
}
|
||||||
return nbFeeds;
|
return nbFeeds;
|
||||||
}
|
}
|
||||||
@ -142,51 +135,46 @@ void RssFolder::markAsRead() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<RssFeed*> RssFolder::getAllFeeds() const {
|
RssFeedList RssFolder::getAllFeeds() const {
|
||||||
QList<RssFeed*> streams;
|
RssFeedList streams;
|
||||||
for (RssFileHash::ConstIterator it = m_children.begin(); it != m_children.end(); it++) {
|
for (RssFileHash::ConstIterator it = m_children.begin(); it != m_children.end(); it++) {
|
||||||
if (it.value()->type() == IRssFile::FEED) {
|
if (RssFeedPtr feed = qSharedPointerDynamicCast<RssFeed>(it.value())) {
|
||||||
streams << static_cast<RssFeed*>(it.value());
|
streams << feed;
|
||||||
} else {
|
} else if (RssFolderPtr folder = qSharedPointerDynamicCast<RssFolder>(it.value())) {
|
||||||
streams << static_cast<RssFolder*>(it.value())->getAllFeeds();
|
streams << folder->getAllFeeds();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return streams;
|
return streams;
|
||||||
}
|
}
|
||||||
|
|
||||||
QHash<QString, RssFeed*> RssFolder::getAllFeedsAsHash() const {
|
QHash<QString, RssFeedPtr> RssFolder::getAllFeedsAsHash() const {
|
||||||
QHash<QString, RssFeed*> ret;
|
QHash<QString, RssFeedPtr> ret;
|
||||||
for (RssFileHash::ConstIterator it = m_children.begin(); it != m_children.end(); it++) {
|
for (RssFileHash::ConstIterator it = m_children.begin(); it != m_children.end(); it++) {
|
||||||
if (it.value()->type() == IRssFile::FEED) {
|
if (RssFeedPtr feed = qSharedPointerDynamicCast<RssFeed>(it.value())) {
|
||||||
RssFeed* feed = dynamic_cast<RssFeed*>(it.value());
|
|
||||||
Q_ASSERT(feed);
|
|
||||||
qDebug() << Q_FUNC_INFO << feed->url();
|
qDebug() << Q_FUNC_INFO << feed->url();
|
||||||
ret[feed->url()] = feed;
|
ret[feed->url()] = feed;
|
||||||
} else {
|
} else if (RssFolderPtr folder = qSharedPointerDynamicCast<RssFolder>(it.value())) {
|
||||||
ret.unite(static_cast<RssFolder*>(it.value())->getAllFeedsAsHash());
|
ret.unite(folder->getAllFeedsAsHash());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RssFolder::addFile(IRssFile * item) {
|
void RssFolder::addFile(const RssFilePtr& item) {
|
||||||
if (item->type() == IRssFile::FEED) {
|
if (RssFeedPtr feed = qSharedPointerDynamicCast<RssFeed>(item)) {
|
||||||
RssFeed* feedItem = dynamic_cast<RssFeed*>(item);
|
Q_ASSERT(!m_children.contains(feed->url()));
|
||||||
Q_ASSERT(!m_children.contains(feedItem->url()));
|
m_children[feed->url()] = item;
|
||||||
m_children[feedItem->url()] = item;
|
qDebug("Added feed %s to folder ./%s", qPrintable(feed->url()), qPrintable(m_name));
|
||||||
qDebug("Added feed %s to folder ./%s", qPrintable(feedItem->url()), qPrintable(m_name));
|
} else if (RssFolderPtr folder = qSharedPointerDynamicCast<RssFolder>(item)) {
|
||||||
} else {
|
Q_ASSERT(!m_children.contains(folder->displayName()));
|
||||||
RssFolder* folderItem = dynamic_cast<RssFolder*>(item);
|
m_children[folder->displayName()] = item;
|
||||||
Q_ASSERT(!m_children.contains(folderItem->displayName()));
|
qDebug("Added folder %s to folder ./%s", qPrintable(folder->displayName()), qPrintable(m_name));
|
||||||
m_children[folderItem->displayName()] = item;
|
|
||||||
qDebug("Added folder %s to folder ./%s", qPrintable(folderItem->displayName()), qPrintable(m_name));
|
|
||||||
}
|
}
|
||||||
// Update parent
|
// Update parent
|
||||||
item->setParent(this);
|
item->setParent(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RssFolder::removeAllItems() {
|
void RssFolder::removeAllItems() {
|
||||||
qDeleteAll(m_children.values());
|
|
||||||
m_children.clear();
|
m_children.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -207,11 +195,11 @@ bool RssFolder::hasChild(const QString &childId) {
|
|||||||
void RssFolder::renameChildFolder(const QString &old_name, const QString &new_name)
|
void RssFolder::renameChildFolder(const QString &old_name, const QString &new_name)
|
||||||
{
|
{
|
||||||
Q_ASSERT(m_children.contains(old_name));
|
Q_ASSERT(m_children.contains(old_name));
|
||||||
IRssFile *folder = m_children.take(old_name);
|
RssFilePtr folder = m_children.take(old_name);
|
||||||
m_children[new_name] = folder;
|
m_children[new_name] = folder;
|
||||||
}
|
}
|
||||||
|
|
||||||
IRssFile * RssFolder::takeChild(const QString &childId)
|
RssFilePtr RssFolder::takeChild(const QString &childId)
|
||||||
{
|
{
|
||||||
return m_children.take(childId);
|
return m_children.take(childId);
|
||||||
}
|
}
|
||||||
|
@ -32,15 +32,19 @@
|
|||||||
#define RSSFOLDER_H
|
#define RSSFOLDER_H
|
||||||
|
|
||||||
#include <QHash>
|
#include <QHash>
|
||||||
|
#include <QSharedPointer>
|
||||||
#include "rssfile.h"
|
#include "rssfile.h"
|
||||||
|
|
||||||
class RssArticle;
|
class RssFolder;
|
||||||
class RssFeed;
|
class RssFeed;
|
||||||
|
class RssManager;
|
||||||
|
|
||||||
typedef QHash<QString, IRssFile*> RssFileHash;
|
typedef QHash<QString, RssFilePtr> RssFileHash;
|
||||||
|
typedef QSharedPointer<RssFeed> RssFeedPtr;
|
||||||
|
typedef QSharedPointer<RssFolder> RssFolderPtr;
|
||||||
|
typedef QList<RssFeedPtr> RssFeedList;
|
||||||
|
|
||||||
class RssFolder: public QObject, public IRssFile {
|
class RssFolder: public QObject, public RssFile {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -49,26 +53,25 @@ public:
|
|||||||
inline RssFolder* parent() const { return m_parent; }
|
inline RssFolder* parent() const { return m_parent; }
|
||||||
void setParent(RssFolder* parent) { m_parent = parent; }
|
void setParent(RssFolder* parent) { m_parent = parent; }
|
||||||
unsigned int unreadCount() const;
|
unsigned int unreadCount() const;
|
||||||
FileType type() const;
|
RssFeedPtr addStream(RssManager* manager, const QString &url);
|
||||||
RssFeed* addStream(const QString &url);
|
RssFolderPtr addFolder(const QString &name);
|
||||||
RssFolder* addFolder(const QString &name);
|
|
||||||
unsigned int getNbFeeds() const;
|
unsigned int getNbFeeds() const;
|
||||||
QList<IRssFile*> getContent() const;
|
RssFileList getContent() const;
|
||||||
QList<RssFeed*> getAllFeeds() const;
|
RssFeedList getAllFeeds() const;
|
||||||
QHash<QString, RssFeed*> getAllFeedsAsHash() const;
|
QHash<QString, RssFeedPtr> getAllFeedsAsHash() const;
|
||||||
QString displayName() const;
|
QString displayName() const;
|
||||||
QString id() const;
|
QString id() const;
|
||||||
bool hasChild(const QString &childId);
|
bool hasChild(const QString &childId);
|
||||||
const QList<RssArticlePtr> articleList() const;
|
const RssArticleList articleList() const;
|
||||||
const QList<RssArticlePtr> unreadArticleList() const;
|
const RssArticleList unreadArticleList() const;
|
||||||
void removeAllSettings();
|
void removeAllSettings();
|
||||||
void removeAllItems();
|
void removeAllItems();
|
||||||
void renameChildFolder(const QString &old_name, const QString &new_name);
|
void renameChildFolder(const QString &old_name, const QString &new_name);
|
||||||
IRssFile *takeChild(const QString &childId);
|
RssFilePtr takeChild(const QString &childId);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void refresh();
|
void refresh();
|
||||||
void addFile(IRssFile * item);
|
void addFile(const RssFilePtr& item);
|
||||||
void removeChild(const QString &childId);
|
void removeChild(const QString &childId);
|
||||||
void rename(const QString &new_name);
|
void rename(const QString &new_name);
|
||||||
void markAsRead();
|
void markAsRead();
|
||||||
|
@ -37,8 +37,6 @@
|
|||||||
#include "rssdownloadrulelist.h"
|
#include "rssdownloadrulelist.h"
|
||||||
#include "downloadthread.h"
|
#include "downloadthread.h"
|
||||||
|
|
||||||
RssManager* RssManager::m_instance = 0;
|
|
||||||
|
|
||||||
RssManager::RssManager(): m_rssDownloader(new DownloadThread(this)) {
|
RssManager::RssManager(): m_rssDownloader(new DownloadThread(this)) {
|
||||||
connect(&m_refreshTimer, SIGNAL(timeout()), this, SLOT(refresh()));
|
connect(&m_refreshTimer, SIGNAL(timeout()), this, SLOT(refresh()));
|
||||||
m_refreshInterval = RssSettings().getRSSRefreshInterval();
|
m_refreshInterval = RssSettings().getRSSRefreshInterval();
|
||||||
@ -78,14 +76,14 @@ void RssManager::loadStreamList() {
|
|||||||
const QString feed_url = path.takeLast();
|
const QString feed_url = path.takeLast();
|
||||||
qDebug() << "Feed URL:" << feed_url;
|
qDebug() << "Feed URL:" << feed_url;
|
||||||
// Create feed path (if it does not exists)
|
// Create feed path (if it does not exists)
|
||||||
RssFolder * feed_parent = this;
|
RssFolder* feed_parent = this;
|
||||||
foreach(const QString &folder_name, path) {
|
foreach(const QString &folder_name, path) {
|
||||||
qDebug() << "Adding parent folder:" << folder_name;
|
qDebug() << "Adding parent folder:" << folder_name;
|
||||||
feed_parent = feed_parent->addFolder(folder_name);
|
feed_parent = feed_parent->addFolder(folder_name).data();
|
||||||
}
|
}
|
||||||
// Create feed
|
// Create feed
|
||||||
qDebug() << "Adding feed to parent folder";
|
qDebug() << "Adding feed to parent folder";
|
||||||
RssFeed *stream = feed_parent->addStream(feed_url);
|
RssFeedPtr stream = feed_parent->addStream(this, feed_url);
|
||||||
const QString alias = aliases.at(i);
|
const QString alias = aliases.at(i);
|
||||||
if(!alias.isEmpty()) {
|
if(!alias.isEmpty()) {
|
||||||
stream->rename(alias);
|
stream->rename(alias);
|
||||||
@ -103,7 +101,7 @@ void RssManager::forwardFeedIconChanged(const QString &url, const QString &icon_
|
|||||||
emit feedIconChanged(url, icon_path);
|
emit feedIconChanged(url, icon_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RssManager::moveFile(IRssFile* file, RssFolder* dest_folder) {
|
void RssManager::moveFile(const RssFilePtr& file, const RssFolderPtr& dest_folder) {
|
||||||
RssFolder* src_folder = file->parent();
|
RssFolder* src_folder = file->parent();
|
||||||
if(dest_folder != src_folder) {
|
if(dest_folder != src_folder) {
|
||||||
// Remove reference in old folder
|
// Remove reference in old folder
|
||||||
@ -118,8 +116,8 @@ void RssManager::moveFile(IRssFile* file, RssFolder* dest_folder) {
|
|||||||
void RssManager::saveStreamList() const {
|
void RssManager::saveStreamList() const {
|
||||||
QStringList streamsUrl;
|
QStringList streamsUrl;
|
||||||
QStringList aliases;
|
QStringList aliases;
|
||||||
const QList<RssFeed*> streams = getAllFeeds();
|
QList<RssFeedPtr> streams = getAllFeeds();
|
||||||
foreach(const RssFeed *stream, streams) {
|
foreach(const RssFeedPtr& stream, streams) {
|
||||||
QString stream_path = stream->pathHierarchy().join("\\");
|
QString stream_path = stream->pathHierarchy().join("\\");
|
||||||
if(stream_path.isNull()) {
|
if(stream_path.isNull()) {
|
||||||
stream_path = "";
|
stream_path = "";
|
||||||
@ -138,21 +136,6 @@ static bool laterItemDate(const RssArticlePtr& a, const RssArticlePtr& b)
|
|||||||
return (a->date() > b->date());
|
return (a->date() > b->date());
|
||||||
}
|
}
|
||||||
|
|
||||||
void RssManager::sortNewsList(QList<RssArticlePtr>& news_list) {
|
void RssManager::sortNewsList(RssArticleList& news_list) {
|
||||||
qSort(news_list.begin(), news_list.end(), laterItemDate);
|
qSort(news_list.begin(), news_list.end(), laterItemDate);
|
||||||
}
|
}
|
||||||
|
|
||||||
RssManager * RssManager::instance()
|
|
||||||
{
|
|
||||||
if(!m_instance)
|
|
||||||
m_instance = new RssManager;
|
|
||||||
return m_instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
void RssManager::drop()
|
|
||||||
{
|
|
||||||
if(m_instance) {
|
|
||||||
delete m_instance;
|
|
||||||
m_instance = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -32,31 +32,32 @@
|
|||||||
#define RSSMANAGER_H
|
#define RSSMANAGER_H
|
||||||
|
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
#include <QSharedPointer>
|
||||||
|
|
||||||
#include "rssfolder.h"
|
#include "rssfolder.h"
|
||||||
|
|
||||||
class DownloadThread;
|
class DownloadThread;
|
||||||
|
|
||||||
|
class RssManager;
|
||||||
|
typedef QSharedPointer<RssManager> RssManagerPtr;
|
||||||
|
|
||||||
class RssManager: public RssFolder {
|
class RssManager: public RssFolder {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
private:
|
|
||||||
explicit RssManager();
|
|
||||||
static RssManager* m_instance;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static RssManager* instance();
|
RssManager();
|
||||||
static void drop();
|
|
||||||
virtual ~RssManager();
|
virtual ~RssManager();
|
||||||
|
|
||||||
inline DownloadThread* rssDownloader() const { return m_rssDownloader; }
|
inline DownloadThread* rssDownloader() const { return m_rssDownloader; }
|
||||||
static void insertSortElem(QList<RssArticlePtr> &list, const RssArticlePtr &item);
|
static void insertSortElem(RssArticleList &list, const RssArticlePtr &item);
|
||||||
static void sortNewsList(QList<RssArticlePtr>& news_list);
|
static void sortNewsList(RssArticleList& news_list);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void loadStreamList();
|
void loadStreamList();
|
||||||
void saveStreamList() const;
|
void saveStreamList() const;
|
||||||
void forwardFeedInfosChanged(const QString &url, const QString &aliasOrUrl, uint nbUnread);
|
void forwardFeedInfosChanged(const QString &url, const QString &aliasOrUrl, uint nbUnread);
|
||||||
void forwardFeedIconChanged(const QString &url, const QString &icon_path);
|
void forwardFeedIconChanged(const QString &url, const QString &icon_path);
|
||||||
void moveFile(IRssFile* file, RssFolder* dest_folder);
|
void moveFile(const RssFilePtr& file, const RssFolderPtr& dest_folder);
|
||||||
void updateRefreshInterval(uint val);
|
void updateRefreshInterval(uint val);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user