mirror of
https://github.com/qbittorrent/qBittorrent
synced 2025-07-14 09:13:08 -07:00
Merge pull request #4020 from glassez/rss
RSS code redesign (Issue #2433).
This commit is contained in:
commit
6ccf2f9232
35 changed files with 2708 additions and 2551 deletions
|
@ -44,11 +44,10 @@
|
|||
#include "cookiesdlg.h"
|
||||
#include "base/preferences.h"
|
||||
#include "rsssettingsdlg.h"
|
||||
#include "rssmanager.h"
|
||||
#include "rssfolder.h"
|
||||
#include "rssarticle.h"
|
||||
#include "rssparser.h"
|
||||
#include "rssfeed.h"
|
||||
#include "base/rss/rssmanager.h"
|
||||
#include "base/rss/rssfolder.h"
|
||||
#include "base/rss/rssarticle.h"
|
||||
#include "base/rss/rssfeed.h"
|
||||
#include "automatedrssdownloader.h"
|
||||
#include "guiiconprovider.h"
|
||||
#include "autoexpandabledialog.h"
|
||||
|
@ -79,7 +78,7 @@ void RSSImp::displayRSSListMenu(const QPoint& pos)
|
|||
myRSSListMenu.addAction(actionMark_items_read);
|
||||
myRSSListMenu.addSeparator();
|
||||
if (selectedItems.size() == 1) {
|
||||
if (m_feedList->getRSSItem(selectedItems.first()) != m_rssManager) {
|
||||
if (m_feedList->getRSSItem(selectedItems.first()) != m_rssManager->rootFolder()) {
|
||||
myRSSListMenu.addAction(actionRename);
|
||||
myRSSListMenu.addAction(actionDelete);
|
||||
myRSSListMenu.addSeparator();
|
||||
|
@ -119,9 +118,9 @@ void RSSImp::displayItemsListMenu(const QPoint&)
|
|||
bool hasLink = false;
|
||||
foreach (const QListWidgetItem* item, selectedItems) {
|
||||
if (!item) continue;
|
||||
RssFeedPtr feed = m_feedList->getRSSItemFromUrl(item->data(Article::FeedUrlRole).toString());
|
||||
Rss::FeedPtr feed = m_feedList->getRSSItemFromUrl(item->data(Article::FeedUrlRole).toString());
|
||||
if (!feed) continue;
|
||||
RssArticlePtr article = feed->getItem(item->data(Article::IdRole).toString());
|
||||
Rss::ArticlePtr article = feed->getItem(item->data(Article::IdRole).toString());
|
||||
if (!article) continue;
|
||||
|
||||
if (!article->torrentUrl().isEmpty())
|
||||
|
@ -161,21 +160,22 @@ void RSSImp::on_actionManage_cookies_triggered()
|
|||
void RSSImp::askNewFolder()
|
||||
{
|
||||
QTreeWidgetItem* parent_item = 0;
|
||||
RssFolderPtr rss_parent;
|
||||
Rss::FolderPtr rss_parent;
|
||||
if (m_feedList->selectedItems().size() > 0) {
|
||||
parent_item = m_feedList->selectedItems().at(0);
|
||||
rss_parent = qSharedPointerDynamicCast<RssFolder>(m_feedList->getRSSItem(parent_item));
|
||||
rss_parent = qSharedPointerDynamicCast<Rss::Folder>(m_feedList->getRSSItem(parent_item));
|
||||
Q_ASSERT(rss_parent);
|
||||
}
|
||||
else {
|
||||
rss_parent = m_rssManager;
|
||||
rss_parent = m_rssManager->rootFolder();
|
||||
}
|
||||
bool ok;
|
||||
QString new_name = AutoExpandableDialog::getText(this, tr("Please choose a folder name"), tr("Folder name:"), QLineEdit::Normal, tr("New folder"), &ok);
|
||||
if (!ok)
|
||||
if (!ok || rss_parent->hasChild(new_name))
|
||||
return;
|
||||
|
||||
RssFolderPtr newFolder = rss_parent->addFolder(new_name);
|
||||
Rss::FolderPtr newFolder(new Rss::Folder(new_name));
|
||||
rss_parent->addFile(newFolder);
|
||||
QTreeWidgetItem* folderItem = createFolderListItem(newFolder);
|
||||
if (parent_item)
|
||||
parent_item->addChild(folderItem);
|
||||
|
@ -204,11 +204,11 @@ void RSSImp::on_newFeedButton_clicked()
|
|||
if (!m_feedList->isFolder(parent_item))
|
||||
parent_item = parent_item->parent();
|
||||
}
|
||||
RssFolderPtr rss_parent;
|
||||
Rss::FolderPtr rss_parent;
|
||||
if (parent_item)
|
||||
rss_parent = qSharedPointerCast<RssFolder>(m_feedList->getRSSItem(parent_item));
|
||||
rss_parent = qSharedPointerCast<Rss::Folder>(m_feedList->getRSSItem(parent_item));
|
||||
else
|
||||
rss_parent = m_rssManager;
|
||||
rss_parent = m_rssManager->rootFolder();
|
||||
// Ask for feed URL
|
||||
bool ok;
|
||||
QString clip_txt = qApp->clipboard()->text();
|
||||
|
@ -230,7 +230,9 @@ void RSSImp::on_newFeedButton_clicked()
|
|||
QMessageBox::Ok);
|
||||
return;
|
||||
}
|
||||
RssFeedPtr stream = rss_parent->addStream(m_rssManager.data(), newUrl);
|
||||
|
||||
Rss::FeedPtr stream(new Rss::Feed(newUrl, m_rssManager.data()));
|
||||
rss_parent->addFile(stream);
|
||||
// Create TreeWidget item
|
||||
QTreeWidgetItem* item = createFolderListItem(stream);
|
||||
if (parent_item)
|
||||
|
@ -261,22 +263,18 @@ void RSSImp::deleteSelectedItems()
|
|||
foreach (QTreeWidgetItem* item, selectedItems) {
|
||||
if (item == m_feedList->stickyUnreadItem())
|
||||
continue;
|
||||
RssFilePtr rss_item = m_feedList->getRSSItem(item);
|
||||
Rss::FilePtr rss_item = m_feedList->getRSSItem(item);
|
||||
QTreeWidgetItem* parent = item->parent();
|
||||
// Notify TreeWidget
|
||||
m_feedList->itemAboutToBeRemoved(item);
|
||||
// Actually delete the item
|
||||
rss_item->parent()->removeChild(rss_item->id());
|
||||
rss_item->parentFolder()->removeChild(rss_item->id());
|
||||
delete item;
|
||||
// Update parents count
|
||||
while (parent && parent != m_feedList->invisibleRootItem()) {
|
||||
updateItemInfos (parent);
|
||||
while (parent && (parent != m_feedList->invisibleRootItem())) {
|
||||
updateItemInfos(parent);
|
||||
parent = parent->parent();
|
||||
}
|
||||
// Clear feed data from RSS parser (possible caching).
|
||||
RssFeed* rssFeed = dynamic_cast<RssFeed*>(rss_item.data());
|
||||
if (rssFeed)
|
||||
m_rssManager->rssParser()->clearFeedData(rssFeed->url());
|
||||
}
|
||||
m_rssManager->saveStreamList();
|
||||
// Update Unread items
|
||||
|
@ -342,9 +340,9 @@ void RSSImp::downloadSelectedTorrents()
|
|||
return;
|
||||
foreach (QListWidgetItem* item, selected_items) {
|
||||
if (!item) continue;
|
||||
RssFeedPtr feed = m_feedList->getRSSItemFromUrl(item->data(Article::FeedUrlRole).toString());
|
||||
Rss::FeedPtr feed = m_feedList->getRSSItemFromUrl(item->data(Article::FeedUrlRole).toString());
|
||||
if (!feed) continue;
|
||||
RssArticlePtr article = feed->getItem(item->data(Article::IdRole).toString());
|
||||
Rss::ArticlePtr article = feed->getItem(item->data(Article::IdRole).toString());
|
||||
if (!article) continue;
|
||||
|
||||
// Mark as read
|
||||
|
@ -372,9 +370,9 @@ void RSSImp::openSelectedArticlesUrls()
|
|||
return;
|
||||
foreach (QListWidgetItem* item, selected_items) {
|
||||
if (!item) continue;
|
||||
RssFeedPtr feed = m_feedList->getRSSItemFromUrl(item->data(Article::FeedUrlRole).toString());
|
||||
Rss::FeedPtr feed = m_feedList->getRSSItemFromUrl(item->data(Article::FeedUrlRole).toString());
|
||||
if (!feed) continue;
|
||||
RssArticlePtr article = feed->getItem(item->data(Article::IdRole).toString());
|
||||
Rss::ArticlePtr article = feed->getItem(item->data(Article::IdRole).toString());
|
||||
if (!article) continue;
|
||||
|
||||
// Mark as read
|
||||
|
@ -400,14 +398,14 @@ void RSSImp::renameSelectedRssFile()
|
|||
QTreeWidgetItem* item = selectedItems.first();
|
||||
if (item == m_feedList->stickyUnreadItem())
|
||||
return;
|
||||
RssFilePtr rss_item = m_feedList->getRSSItem(item);
|
||||
Rss::FilePtr rss_item = m_feedList->getRSSItem(item);
|
||||
bool ok;
|
||||
QString newName;
|
||||
do {
|
||||
newName = AutoExpandableDialog::getText(this, tr("Please choose a new name for this RSS feed"), tr("New feed name:"), QLineEdit::Normal, m_feedList->getRSSItem(item)->displayName(), &ok);
|
||||
// Check if name is already taken
|
||||
if (ok) {
|
||||
if (rss_item->parent()->hasChild(newName)) {
|
||||
if (rss_item->parentFolder()->hasChild(newName)) {
|
||||
QMessageBox::warning(0, tr("Name already in use"), tr("This name is already used by another item, please choose another one."));
|
||||
ok = false;
|
||||
}
|
||||
|
@ -427,7 +425,7 @@ void RSSImp::refreshSelectedItems()
|
|||
{
|
||||
QList<QTreeWidgetItem*> selectedItems = m_feedList->selectedItems();
|
||||
foreach (QTreeWidgetItem* item, selectedItems) {
|
||||
RssFilePtr file = m_feedList->getRSSItem(item);
|
||||
Rss::FilePtr file = m_feedList->getRSSItem(item);
|
||||
// Update icons
|
||||
if (item == m_feedList->stickyUnreadItem()) {
|
||||
refreshAllFeeds();
|
||||
|
@ -437,10 +435,10 @@ void RSSImp::refreshSelectedItems()
|
|||
if (!file->refresh())
|
||||
continue;
|
||||
// Update UI
|
||||
if (qSharedPointerDynamicCast<RssFeed>(file)) {
|
||||
if (qSharedPointerDynamicCast<Rss::Feed>(file)) {
|
||||
item->setData(0, Qt::DecorationRole, QVariant(QIcon(":/icons/loading.png")));
|
||||
}
|
||||
else if (qSharedPointerDynamicCast<RssFolder>(file)) {
|
||||
else if (qSharedPointerDynamicCast<Rss::Folder>(file)) {
|
||||
// Update feeds in the folder
|
||||
foreach (QTreeWidgetItem *feed, m_feedList->getAllFeedItems(item))
|
||||
feed->setData(0, Qt::DecorationRole, QVariant(QIcon(":/icons/loading.png")));
|
||||
|
@ -464,7 +462,7 @@ void RSSImp::on_markReadButton_clicked()
|
|||
{
|
||||
QList<QTreeWidgetItem*> selectedItems = m_feedList->selectedItems();
|
||||
foreach (QTreeWidgetItem* item, selectedItems) {
|
||||
RssFilePtr rss_item = m_feedList->getRSSItem(item);
|
||||
Rss::FilePtr rss_item = m_feedList->getRSSItem(item);
|
||||
Q_ASSERT(rss_item);
|
||||
rss_item->markAsRead();
|
||||
updateItemInfos(item);
|
||||
|
@ -474,24 +472,24 @@ void RSSImp::on_markReadButton_clicked()
|
|||
populateArticleList(m_feedList->currentItem());
|
||||
}
|
||||
|
||||
QTreeWidgetItem* RSSImp::createFolderListItem(const RssFilePtr& rssFile)
|
||||
QTreeWidgetItem* RSSImp::createFolderListItem(const Rss::FilePtr& rssFile)
|
||||
{
|
||||
Q_ASSERT(rssFile);
|
||||
QTreeWidgetItem* item = new QTreeWidgetItem;
|
||||
item->setData(0, Qt::DisplayRole, QVariant(rssFile->displayName() + QString::fromUtf8(" (") + QString::number(rssFile->unreadCount()) + QString(")")));
|
||||
item->setData(0, Qt::DecorationRole, rssFile->icon());
|
||||
item->setData(0, Qt::DecorationRole, QIcon(rssFile->iconPath()));
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
void RSSImp::fillFeedsList(QTreeWidgetItem* parent, const RssFolderPtr& rss_parent)
|
||||
void RSSImp::fillFeedsList(QTreeWidgetItem* parent, const Rss::FolderPtr& rss_parent)
|
||||
{
|
||||
QList<RssFilePtr> children;
|
||||
QList<Rss::FilePtr> children;
|
||||
if (parent)
|
||||
children = rss_parent->getContent();
|
||||
else
|
||||
children = m_rssManager->getContent();
|
||||
foreach (const RssFilePtr& rssFile, children) {
|
||||
children = m_rssManager->rootFolder()->getContent();
|
||||
foreach (const Rss::FilePtr& rssFile, children) {
|
||||
QTreeWidgetItem* item = createFolderListItem(rssFile);
|
||||
Q_ASSERT(item);
|
||||
if (parent)
|
||||
|
@ -503,12 +501,12 @@ void RSSImp::fillFeedsList(QTreeWidgetItem* parent, const RssFolderPtr& rss_pare
|
|||
m_feedList->itemAdded(item, rssFile);
|
||||
|
||||
// Recursive call if this is a folder.
|
||||
if (RssFolderPtr folder = qSharedPointerDynamicCast<RssFolder>(rssFile))
|
||||
if (Rss::FolderPtr folder = qSharedPointerDynamicCast<Rss::Folder>(rssFile))
|
||||
fillFeedsList(item, folder);
|
||||
}
|
||||
}
|
||||
|
||||
QListWidgetItem* RSSImp::createArticleListItem(const RssArticlePtr& article)
|
||||
QListWidgetItem* RSSImp::createArticleListItem(const Rss::ArticlePtr& article)
|
||||
{
|
||||
Q_ASSERT(article);
|
||||
QListWidgetItem* item = new QListWidgetItem;
|
||||
|
@ -536,7 +534,7 @@ void RSSImp::populateArticleList(QTreeWidgetItem* item)
|
|||
return;
|
||||
}
|
||||
|
||||
RssFilePtr rss_item = m_feedList->getRSSItem(item);
|
||||
Rss::FilePtr rss_item = m_feedList->getRSSItem(item);
|
||||
if (!rss_item)
|
||||
return;
|
||||
|
||||
|
@ -546,14 +544,14 @@ void RSSImp::populateArticleList(QTreeWidgetItem* item)
|
|||
listArticles->clear();
|
||||
|
||||
qDebug("Getting the list of news");
|
||||
RssArticleList articles;
|
||||
if (rss_item == m_rssManager)
|
||||
Rss::ArticleList articles;
|
||||
if (rss_item == m_rssManager->rootFolder())
|
||||
articles = rss_item->unreadArticleListByDateDesc();
|
||||
else
|
||||
articles = rss_item->articleListByDateDesc();
|
||||
|
||||
qDebug("Got the list of news");
|
||||
foreach (const RssArticlePtr& article, articles) {
|
||||
foreach (const Rss::ArticlePtr& article, articles) {
|
||||
QListWidgetItem* articleItem = createArticleListItem(article);
|
||||
listArticles->addItem(articleItem);
|
||||
}
|
||||
|
@ -570,9 +568,9 @@ void RSSImp::refreshTextBrowser()
|
|||
if (item == m_currentArticle) return;
|
||||
m_currentArticle = item;
|
||||
|
||||
RssFeedPtr feed = m_feedList->getRSSItemFromUrl(item->data(Article::FeedUrlRole).toString());
|
||||
Rss::FeedPtr feed = m_feedList->getRSSItemFromUrl(item->data(Article::FeedUrlRole).toString());
|
||||
if (!feed) return;
|
||||
RssArticlePtr article = feed->getItem(item->data(Article::IdRole).toString());
|
||||
Rss::ArticlePtr article = feed->getItem(item->data(Article::IdRole).toString());
|
||||
if (!article) return;
|
||||
QString html;
|
||||
html += "<div style='border: 2px solid red; margin-left: 5px; margin-right: 5px; margin-bottom: 5px;'>";
|
||||
|
@ -651,12 +649,12 @@ void RSSImp::updateItemsInfos(const QList<QTreeWidgetItem*>& items)
|
|||
|
||||
void RSSImp::updateItemInfos(QTreeWidgetItem *item)
|
||||
{
|
||||
RssFilePtr rss_item = m_feedList->getRSSItem(item);
|
||||
Rss::FilePtr rss_item = m_feedList->getRSSItem(item);
|
||||
if (!rss_item)
|
||||
return;
|
||||
|
||||
QString name;
|
||||
if (rss_item == m_rssManager) {
|
||||
if (rss_item == m_rssManager->rootFolder()) {
|
||||
name = tr("Unread");
|
||||
emit updateRSSCount(rss_item->unreadCount());
|
||||
}
|
||||
|
@ -678,10 +676,10 @@ void RSSImp::updateFeedInfos(const QString& url, const QString& display_name, ui
|
|||
{
|
||||
qDebug() << Q_FUNC_INFO << display_name;
|
||||
QTreeWidgetItem *item = m_feedList->getTreeItemFromUrl(url);
|
||||
RssFeedPtr stream = qSharedPointerCast<RssFeed>(m_feedList->getRSSItem(item));
|
||||
Rss::FeedPtr stream = qSharedPointerCast<Rss::Feed>(m_feedList->getRSSItem(item));
|
||||
item->setText(0, display_name + QString::fromUtf8(" (") + QString::number(nbUnread) + QString(")"));
|
||||
if (!stream->isLoading())
|
||||
item->setData(0, Qt::DecorationRole, QVariant(stream->icon()));
|
||||
item->setData(0, Qt::DecorationRole, QIcon(stream->iconPath()));
|
||||
// Update parent
|
||||
if (item->parent())
|
||||
updateItemInfos(item->parent());
|
||||
|
@ -708,7 +706,7 @@ void RSSImp::updateRefreshInterval(uint val)
|
|||
|
||||
RSSImp::RSSImp(QWidget *parent):
|
||||
QWidget(parent),
|
||||
m_rssManager(new RssManager)
|
||||
m_rssManager(new Rss::Manager)
|
||||
{
|
||||
setupUi(this);
|
||||
// Icons
|
||||
|
@ -800,7 +798,7 @@ void RSSImp::on_rssDownloaderBtn_clicked()
|
|||
AutomatedRssDownloader dlg(m_rssManager, this);
|
||||
dlg.exec();
|
||||
if (dlg.isRssDownloaderEnabled()) {
|
||||
m_rssManager->recheckRssItemsForDownload();
|
||||
m_rssManager->rootFolder()->recheckRssItemsForDownload();
|
||||
refreshAllFeeds();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue