mirror of
https://github.com/qbittorrent/qBittorrent.git
synced 2025-12-23 00:47:21 -06:00
Improve coding style
This commit is contained in:
@@ -65,13 +65,16 @@ void ArticleListWidget::setRSSItem(RSS::Item *rssItem, bool unreadOnly)
|
||||
|
||||
m_unreadOnly = unreadOnly;
|
||||
m_rssItem = rssItem;
|
||||
if (m_rssItem) {
|
||||
if (m_rssItem)
|
||||
{
|
||||
connect(m_rssItem, &RSS::Item::newArticle, this, &ArticleListWidget::handleArticleAdded);
|
||||
connect(m_rssItem, &RSS::Item::articleRead, this, &ArticleListWidget::handleArticleRead);
|
||||
connect(m_rssItem, &RSS::Item::articleAboutToBeRemoved, this, &ArticleListWidget::handleArticleAboutToBeRemoved);
|
||||
|
||||
for (const auto article : asConst(rssItem->articles())) {
|
||||
if (!(m_unreadOnly && article->isRead())) {
|
||||
for (const auto article : asConst(rssItem->articles()))
|
||||
{
|
||||
if (!(m_unreadOnly && article->isRead()))
|
||||
{
|
||||
auto item = createItem(article);
|
||||
addItem(item);
|
||||
m_rssArticleToListItemMapping.insert(article, item);
|
||||
@@ -84,7 +87,8 @@ void ArticleListWidget::setRSSItem(RSS::Item *rssItem, bool unreadOnly)
|
||||
|
||||
void ArticleListWidget::handleArticleAdded(RSS::Article *rssArticle)
|
||||
{
|
||||
if (!(m_unreadOnly && rssArticle->isRead())) {
|
||||
if (!(m_unreadOnly && rssArticle->isRead()))
|
||||
{
|
||||
auto item = createItem(rssArticle);
|
||||
insertItem(0, item);
|
||||
m_rssArticleToListItemMapping.insert(rssArticle, item);
|
||||
@@ -124,13 +128,15 @@ QListWidgetItem *ArticleListWidget::createItem(RSS::Article *article) const
|
||||
|
||||
item->setData(Qt::DisplayRole, article->title());
|
||||
item->setData(Qt::UserRole, reinterpret_cast<quintptr>(article));
|
||||
if (article->isRead()) {
|
||||
if (article->isRead())
|
||||
{
|
||||
const QColor defaultColor {palette().color(QPalette::Inactive, QPalette::WindowText)};
|
||||
const QBrush foregroundBrush {UIThemeManager::instance()->getColor("RSS.ReadArticle", defaultColor)};
|
||||
item->setData(Qt::ForegroundRole, foregroundBrush);
|
||||
item->setData(Qt::DecorationRole, UIThemeManager::instance()->getIcon(QLatin1String("sphere")));
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
const QColor defaultColor {palette().color(QPalette::Active, QPalette::Link)};
|
||||
const QBrush foregroundBrush {UIThemeManager::instance()->getColor("RSS.UnreadArticle", defaultColor)};
|
||||
item->setData(Qt::ForegroundRole, foregroundBrush);
|
||||
|
||||
@@ -181,7 +181,8 @@ void AutomatedRssDownloader::loadFeedList()
|
||||
{
|
||||
const QSignalBlocker feedListSignalBlocker(m_ui->listFeeds);
|
||||
|
||||
for (const auto feed : asConst(RSS::Session::instance()->feeds())) {
|
||||
for (const auto feed : asConst(RSS::Session::instance()->feeds()))
|
||||
{
|
||||
QListWidgetItem *item = new QListWidgetItem(feed->name(), m_ui->listFeeds);
|
||||
item->setData(Qt::UserRole, feed->url());
|
||||
item->setFlags(item->flags() | Qt::ItemIsUserCheckable | Qt::ItemIsTristate);
|
||||
@@ -203,7 +204,8 @@ void AutomatedRssDownloader::updateFeedList()
|
||||
|
||||
bool enable = !selection.isEmpty();
|
||||
|
||||
for (int i = 0; i < m_ui->listFeeds->count(); ++i) {
|
||||
for (int i = 0; i < m_ui->listFeeds->count(); ++i)
|
||||
{
|
||||
QListWidgetItem *item = m_ui->listFeeds->item(i);
|
||||
const QString feedURL = item->data(Qt::UserRole).toString();
|
||||
item->setHidden(!enable);
|
||||
@@ -211,7 +213,8 @@ void AutomatedRssDownloader::updateFeedList()
|
||||
bool allEnabled = true;
|
||||
bool anyEnabled = false;
|
||||
|
||||
for (const QListWidgetItem *ruleItem : asConst(selection)) {
|
||||
for (const QListWidgetItem *ruleItem : asConst(selection))
|
||||
{
|
||||
const auto rule = RSS::AutoDownloader::instance()->ruleByName(ruleItem->text());
|
||||
if (rule.feedURLs().contains(feedURL))
|
||||
anyEnabled = true;
|
||||
@@ -236,14 +239,16 @@ void AutomatedRssDownloader::updateRuleDefinitionBox()
|
||||
{
|
||||
const QList<QListWidgetItem *> selection = m_ui->listRules->selectedItems();
|
||||
QListWidgetItem *currentRuleItem = ((selection.count() == 1) ? selection.first() : nullptr);
|
||||
if (m_currentRuleItem != currentRuleItem) {
|
||||
if (m_currentRuleItem != currentRuleItem)
|
||||
{
|
||||
saveEditedRule(); // Save previous rule first
|
||||
m_currentRuleItem = currentRuleItem;
|
||||
//m_ui->listRules->setCurrentItem(m_currentRuleItem);
|
||||
}
|
||||
|
||||
// Update rule definition box
|
||||
if (m_currentRuleItem) {
|
||||
if (m_currentRuleItem)
|
||||
{
|
||||
m_currentRule = RSS::AutoDownloader::instance()->ruleByName(m_currentRuleItem->text());
|
||||
|
||||
m_ui->lineContains->setText(m_currentRule.mustContain());
|
||||
@@ -290,7 +295,8 @@ void AutomatedRssDownloader::updateRuleDefinitionBox()
|
||||
updateFieldsToolTips(m_ui->checkRegex->isChecked());
|
||||
m_ui->ruleDefBox->setEnabled(true);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
m_currentRule = RSS::AutoDownloadRule();
|
||||
clearRuleDefinitionBox();
|
||||
m_ui->ruleDefBox->setEnabled(false);
|
||||
@@ -376,7 +382,8 @@ void AutomatedRssDownloader::on_addRuleBtn_clicked()
|
||||
if (ruleName.isEmpty()) return;
|
||||
|
||||
// Check if this rule name already exists
|
||||
if (RSS::AutoDownloader::instance()->hasRule(ruleName)) {
|
||||
if (RSS::AutoDownloader::instance()->hasRule(ruleName))
|
||||
{
|
||||
QMessageBox::warning(this, tr("Rule name conflict")
|
||||
, tr("A rule with this name already exists, please choose another name."));
|
||||
return;
|
||||
@@ -404,7 +411,8 @@ void AutomatedRssDownloader::on_removeRuleBtn_clicked()
|
||||
|
||||
void AutomatedRssDownloader::on_exportBtn_clicked()
|
||||
{
|
||||
if (RSS::AutoDownloader::instance()->rules().isEmpty()) {
|
||||
if (RSS::AutoDownloader::instance()->rules().isEmpty())
|
||||
{
|
||||
QMessageBox::warning(this, tr("Invalid action")
|
||||
, tr("The list is empty, there is nothing to export."));
|
||||
return;
|
||||
@@ -416,24 +424,28 @@ void AutomatedRssDownloader::on_exportBtn_clicked()
|
||||
, QString::fromLatin1("%1;;%2").arg(m_formatFilterJSON, m_formatFilterLegacy), &selectedFilter);
|
||||
if (path.isEmpty()) return;
|
||||
|
||||
const RSS::AutoDownloader::RulesFileFormat format {
|
||||
const RSS::AutoDownloader::RulesFileFormat format
|
||||
{
|
||||
(selectedFilter == m_formatFilterJSON)
|
||||
? RSS::AutoDownloader::RulesFileFormat::JSON
|
||||
: RSS::AutoDownloader::RulesFileFormat::Legacy
|
||||
};
|
||||
|
||||
if (format == RSS::AutoDownloader::RulesFileFormat::JSON) {
|
||||
if (format == RSS::AutoDownloader::RulesFileFormat::JSON)
|
||||
{
|
||||
if (!path.endsWith(EXT_JSON, Qt::CaseInsensitive))
|
||||
path += EXT_JSON;
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
if (!path.endsWith(EXT_LEGACY, Qt::CaseInsensitive))
|
||||
path += EXT_LEGACY;
|
||||
}
|
||||
|
||||
QFile file {path};
|
||||
if (!file.open(QFile::WriteOnly)
|
||||
|| (file.write(RSS::AutoDownloader::instance()->exportRules(format)) == -1)) {
|
||||
|| (file.write(RSS::AutoDownloader::instance()->exportRules(format)) == -1))
|
||||
{
|
||||
QMessageBox::critical(
|
||||
this, tr("I/O Error")
|
||||
, tr("Failed to create the destination file. Reason: %1").arg(file.errorString()));
|
||||
@@ -450,23 +462,27 @@ void AutomatedRssDownloader::on_importBtn_clicked()
|
||||
return;
|
||||
|
||||
QFile file {path};
|
||||
if (!file.open(QIODevice::ReadOnly)) {
|
||||
if (!file.open(QIODevice::ReadOnly))
|
||||
{
|
||||
QMessageBox::critical(
|
||||
this, tr("I/O Error")
|
||||
, tr("Failed to open the file. Reason: %1").arg(file.errorString()));
|
||||
return;
|
||||
}
|
||||
|
||||
const RSS::AutoDownloader::RulesFileFormat format {
|
||||
const RSS::AutoDownloader::RulesFileFormat format
|
||||
{
|
||||
(selectedFilter == m_formatFilterJSON)
|
||||
? RSS::AutoDownloader::RulesFileFormat::JSON
|
||||
: RSS::AutoDownloader::RulesFileFormat::Legacy
|
||||
};
|
||||
|
||||
try {
|
||||
try
|
||||
{
|
||||
RSS::AutoDownloader::instance()->importRules(file.readAll(),format);
|
||||
}
|
||||
catch (const RSS::ParsingError &error) {
|
||||
catch (const RSS::ParsingError &error)
|
||||
{
|
||||
QMessageBox::critical(
|
||||
this, tr("Import Error")
|
||||
, tr("Failed to import the selected rules file. Reason: %1").arg(error.message()));
|
||||
@@ -483,8 +499,10 @@ void AutomatedRssDownloader::displayRulesListMenu()
|
||||
|
||||
const QList<QListWidgetItem *> selection = m_ui->listRules->selectedItems();
|
||||
|
||||
if (!selection.isEmpty()) {
|
||||
if (selection.count() == 1) {
|
||||
if (!selection.isEmpty())
|
||||
{
|
||||
if (selection.count() == 1)
|
||||
{
|
||||
const QAction *delAct = menu->addAction(UIThemeManager::instance()->getIcon("list-remove"), tr("Delete rule"));
|
||||
connect(delAct, &QAction::triggered, this, &AutomatedRssDownloader::on_removeRuleBtn_clicked);
|
||||
|
||||
@@ -493,7 +511,8 @@ void AutomatedRssDownloader::displayRulesListMenu()
|
||||
const QAction *renameAct = menu->addAction(UIThemeManager::instance()->getIcon("edit-rename"), tr("Rename rule..."));
|
||||
connect(renameAct, &QAction::triggered, this, &AutomatedRssDownloader::renameSelectedRule);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
const QAction *delAct = menu->addAction(UIThemeManager::instance()->getIcon("list-remove"), tr("Delete selected rules"));
|
||||
connect(delAct, &QAction::triggered, this, &AutomatedRssDownloader::on_removeRuleBtn_clicked);
|
||||
}
|
||||
@@ -513,18 +532,21 @@ void AutomatedRssDownloader::renameSelectedRule()
|
||||
if (selection.isEmpty()) return;
|
||||
|
||||
QListWidgetItem *item = selection.first();
|
||||
forever {
|
||||
forever
|
||||
{
|
||||
QString newName = AutoExpandableDialog::getText(
|
||||
this, tr("Rule renaming"), tr("Please type the new rule name")
|
||||
, QLineEdit::Normal, item->text());
|
||||
newName = newName.trimmed();
|
||||
if (newName.isEmpty()) return;
|
||||
|
||||
if (RSS::AutoDownloader::instance()->hasRule(newName)) {
|
||||
if (RSS::AutoDownloader::instance()->hasRule(newName))
|
||||
{
|
||||
QMessageBox::warning(this, tr("Rule name conflict")
|
||||
, tr("A rule with this name already exists, please choose another name."));
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
// Rename the rule
|
||||
RSS::AutoDownloader::instance()->renameRule(item->text(), newName);
|
||||
return;
|
||||
@@ -545,7 +567,8 @@ void AutomatedRssDownloader::clearSelectedRuleDownloadedEpisodeList()
|
||||
tr("Are you sure you want to clear the list of downloaded episodes for the selected rule?"),
|
||||
QMessageBox::Yes | QMessageBox::No);
|
||||
|
||||
if (reply == QMessageBox::Yes) {
|
||||
if (reply == QMessageBox::Yes)
|
||||
{
|
||||
m_currentRule.setPreviouslyMatchedEpisodes(QStringList());
|
||||
handleRuleDefinitionChanged();
|
||||
}
|
||||
@@ -554,7 +577,8 @@ void AutomatedRssDownloader::clearSelectedRuleDownloadedEpisodeList()
|
||||
void AutomatedRssDownloader::handleFeedCheckStateChange(QListWidgetItem *feedItem)
|
||||
{
|
||||
const QString feedURL = feedItem->data(Qt::UserRole).toString();
|
||||
for (QListWidgetItem *ruleItem : asConst(m_ui->listRules->selectedItems())) {
|
||||
for (QListWidgetItem *ruleItem : asConst(m_ui->listRules->selectedItems()))
|
||||
{
|
||||
RSS::AutoDownloadRule rule = (ruleItem == m_currentRuleItem
|
||||
? m_currentRule
|
||||
: RSS::AutoDownloader::instance()->ruleByName(ruleItem->text()));
|
||||
@@ -578,11 +602,13 @@ void AutomatedRssDownloader::updateMatchingArticles()
|
||||
{
|
||||
m_ui->treeMatchingArticles->clear();
|
||||
|
||||
for (const QListWidgetItem *ruleItem : asConst(m_ui->listRules->selectedItems())) {
|
||||
for (const QListWidgetItem *ruleItem : asConst(m_ui->listRules->selectedItems()))
|
||||
{
|
||||
RSS::AutoDownloadRule rule = (ruleItem == m_currentRuleItem
|
||||
? m_currentRule
|
||||
: RSS::AutoDownloader::instance()->ruleByName(ruleItem->text()));
|
||||
for (const QString &feedURL : asConst(rule.feedURLs())) {
|
||||
for (const QString &feedURL : asConst(rule.feedURLs()))
|
||||
{
|
||||
auto feed = RSS::Session::instance()->feedByURL(feedURL);
|
||||
if (!feed) continue; // feed doesn't exist
|
||||
|
||||
@@ -605,16 +631,19 @@ void AutomatedRssDownloader::addFeedArticlesToTree(RSS::Feed *feed, const QStrin
|
||||
|
||||
// Check if this feed is already in the tree
|
||||
QTreeWidgetItem *treeFeedItem = nullptr;
|
||||
for (int i = 0; i < m_ui->treeMatchingArticles->topLevelItemCount(); ++i) {
|
||||
for (int i = 0; i < m_ui->treeMatchingArticles->topLevelItemCount(); ++i)
|
||||
{
|
||||
QTreeWidgetItem *item = m_ui->treeMatchingArticles->topLevelItem(i);
|
||||
if (item->data(0, Qt::UserRole).toString() == feed->url()) {
|
||||
if (item->data(0, Qt::UserRole).toString() == feed->url())
|
||||
{
|
||||
treeFeedItem = item;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// If there is none, create it
|
||||
if (!treeFeedItem) {
|
||||
if (!treeFeedItem)
|
||||
{
|
||||
treeFeedItem = new QTreeWidgetItem(QStringList() << feed->name());
|
||||
treeFeedItem->setToolTip(0, feed->name());
|
||||
QFont f = treeFeedItem->font(0);
|
||||
@@ -626,10 +655,12 @@ void AutomatedRssDownloader::addFeedArticlesToTree(RSS::Feed *feed, const QStrin
|
||||
}
|
||||
|
||||
// Insert the articles
|
||||
for (const QString &article : articles) {
|
||||
for (const QString &article : articles)
|
||||
{
|
||||
QPair<QString, QString> key(feed->name(), article);
|
||||
|
||||
if (!m_treeListEntries.contains(key)) {
|
||||
if (!m_treeListEntries.contains(key))
|
||||
{
|
||||
m_treeListEntries << key;
|
||||
QTreeWidgetItem *item = new QTreeWidgetItem(QStringList() << article);
|
||||
item->setToolTip(0, article);
|
||||
@@ -645,10 +676,12 @@ void AutomatedRssDownloader::addFeedArticlesToTree(RSS::Feed *feed, const QStrin
|
||||
void AutomatedRssDownloader::updateFieldsToolTips(bool regex)
|
||||
{
|
||||
QString tip;
|
||||
if (regex) {
|
||||
if (regex)
|
||||
{
|
||||
tip = "<p>" + tr("Regex mode: use Perl-compatible regular expressions") + "</p>";
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
tip = "<p>" + tr("Wildcard mode: you can use") + "<ul>"
|
||||
+ "<li>" + tr("? to match any single character") + "</li>"
|
||||
+ "<li>" + tr("* to match zero or more of any characters") + "</li>"
|
||||
@@ -676,7 +709,8 @@ void AutomatedRssDownloader::updateMustLineValidity()
|
||||
bool valid = true;
|
||||
QString error;
|
||||
|
||||
if (!text.isEmpty()) {
|
||||
if (!text.isEmpty())
|
||||
{
|
||||
QStringList tokens;
|
||||
if (isRegex)
|
||||
tokens << text;
|
||||
@@ -684,9 +718,11 @@ void AutomatedRssDownloader::updateMustLineValidity()
|
||||
for (const QString &token : asConst(text.split('|')))
|
||||
tokens << Utils::String::wildcardToRegex(token);
|
||||
|
||||
for (const QString &token : asConst(tokens)) {
|
||||
for (const QString &token : asConst(tokens))
|
||||
{
|
||||
QRegularExpression reg(token, QRegularExpression::CaseInsensitiveOption);
|
||||
if (!reg.isValid()) {
|
||||
if (!reg.isValid())
|
||||
{
|
||||
if (isRegex)
|
||||
error = tr("Position %1: %2").arg(reg.patternErrorOffset()).arg(reg.errorString());
|
||||
valid = false;
|
||||
@@ -695,12 +731,14 @@ void AutomatedRssDownloader::updateMustLineValidity()
|
||||
}
|
||||
}
|
||||
|
||||
if (valid) {
|
||||
if (valid)
|
||||
{
|
||||
m_ui->lineContains->setStyleSheet("");
|
||||
m_ui->labelMustStat->setPixmap(QPixmap());
|
||||
m_ui->labelMustStat->setToolTip("");
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
m_ui->lineContains->setStyleSheet("QLineEdit { color: #ff0000; }");
|
||||
m_ui->labelMustStat->setPixmap(UIThemeManager::instance()->getIcon("task-attention").pixmap(16, 16));
|
||||
m_ui->labelMustStat->setToolTip(error);
|
||||
@@ -714,7 +752,8 @@ void AutomatedRssDownloader::updateMustNotLineValidity()
|
||||
bool valid = true;
|
||||
QString error;
|
||||
|
||||
if (!text.isEmpty()) {
|
||||
if (!text.isEmpty())
|
||||
{
|
||||
QStringList tokens;
|
||||
if (isRegex)
|
||||
tokens << text;
|
||||
@@ -722,9 +761,11 @@ void AutomatedRssDownloader::updateMustNotLineValidity()
|
||||
for (const QString &token : asConst(text.split('|')))
|
||||
tokens << Utils::String::wildcardToRegex(token);
|
||||
|
||||
for (const QString &token : asConst(tokens)) {
|
||||
for (const QString &token : asConst(tokens))
|
||||
{
|
||||
QRegularExpression reg(token, QRegularExpression::CaseInsensitiveOption);
|
||||
if (!reg.isValid()) {
|
||||
if (!reg.isValid())
|
||||
{
|
||||
if (isRegex)
|
||||
error = tr("Position %1: %2").arg(reg.patternErrorOffset()).arg(reg.errorString());
|
||||
valid = false;
|
||||
@@ -733,12 +774,14 @@ void AutomatedRssDownloader::updateMustNotLineValidity()
|
||||
}
|
||||
}
|
||||
|
||||
if (valid) {
|
||||
if (valid)
|
||||
{
|
||||
m_ui->lineNotContains->setStyleSheet("");
|
||||
m_ui->labelMustNotStat->setPixmap(QPixmap());
|
||||
m_ui->labelMustNotStat->setToolTip("");
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
m_ui->lineNotContains->setStyleSheet("QLineEdit { color: #ff0000; }");
|
||||
m_ui->labelMustNotStat->setPixmap(UIThemeManager::instance()->getIcon("task-attention").pixmap(16, 16));
|
||||
m_ui->labelMustNotStat->setToolTip(error);
|
||||
@@ -750,11 +793,13 @@ void AutomatedRssDownloader::updateEpisodeFilterValidity()
|
||||
const QString text = m_ui->lineEFilter->text();
|
||||
bool valid = text.isEmpty() || m_episodeRegex->match(text).hasMatch();
|
||||
|
||||
if (valid) {
|
||||
if (valid)
|
||||
{
|
||||
m_ui->lineEFilter->setStyleSheet("");
|
||||
m_ui->labelEpFilterStat->setPixmap(QPixmap());
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
m_ui->lineEFilter->setStyleSheet("QLineEdit { color: #ff0000; }");
|
||||
m_ui->labelEpFilterStat->setPixmap(UIThemeManager::instance()->getIcon("task-attention").pixmap(16, 16));
|
||||
}
|
||||
|
||||
@@ -97,7 +97,8 @@ void FeedListWidget::handleFeedStateChanged(RSS::Feed *feed)
|
||||
|
||||
void FeedListWidget::handleFeedIconLoaded(RSS::Feed *feed)
|
||||
{
|
||||
if (!feed->isLoading() && !feed->hasError()) {
|
||||
if (!feed->isLoading() && !feed->hasError())
|
||||
{
|
||||
QTreeWidgetItem *item = m_rssToTreeItemMapping.value(feed);
|
||||
Q_ASSERT(item);
|
||||
|
||||
@@ -107,10 +108,12 @@ void FeedListWidget::handleFeedIconLoaded(RSS::Feed *feed)
|
||||
|
||||
void FeedListWidget::handleItemUnreadCountChanged(RSS::Item *rssItem)
|
||||
{
|
||||
if (rssItem == RSS::Session::instance()->rootFolder()) {
|
||||
if (rssItem == RSS::Session::instance()->rootFolder())
|
||||
{
|
||||
m_unreadStickyItem->setText(0, tr("Unread (%1)").arg(RSS::Session::instance()->rootFolder()->unreadCount()));
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
QTreeWidgetItem *item = mapRSSItem(rssItem);
|
||||
Q_ASSERT(item);
|
||||
item->setData(0, Qt::DisplayRole, QString::fromLatin1("%1 (%2)").arg(rssItem->name(), QString::number(rssItem->unreadCount())));
|
||||
@@ -151,9 +154,11 @@ QList<QTreeWidgetItem *> FeedListWidget::getAllOpenedFolders(QTreeWidgetItem *pa
|
||||
{
|
||||
QList<QTreeWidgetItem *> openedFolders;
|
||||
int nbChildren = (parent ? parent->childCount() : topLevelItemCount());
|
||||
for (int i = 0; i < nbChildren; ++i) {
|
||||
for (int i = 0; i < nbChildren; ++i)
|
||||
{
|
||||
QTreeWidgetItem *item (parent ? parent->child(i) : topLevelItem(i));
|
||||
if (isFolder(item) && item->isExpanded()) {
|
||||
if (isFolder(item) && item->isExpanded())
|
||||
{
|
||||
QList<QTreeWidgetItem *> openedSubfolders = getAllOpenedFolders(item);
|
||||
if (!openedSubfolders.empty())
|
||||
openedFolders << openedSubfolders;
|
||||
@@ -215,7 +220,8 @@ void FeedListWidget::dropEvent(QDropEvent *event)
|
||||
: RSS::Session::instance()->rootFolder());
|
||||
|
||||
// move as much items as possible
|
||||
for (QTreeWidgetItem *srcItem : asConst(selectedItems())) {
|
||||
for (QTreeWidgetItem *srcItem : asConst(selectedItems()))
|
||||
{
|
||||
auto rssItem = getRSSItem(srcItem);
|
||||
RSS::Session::instance()->moveItem(rssItem, RSS::Item::joinPath(destFolder->path(), rssItem->name()));
|
||||
}
|
||||
@@ -233,7 +239,8 @@ QTreeWidgetItem *FeedListWidget::createItem(RSS::Item *rssItem, QTreeWidgetItem
|
||||
m_rssToTreeItemMapping[rssItem] = item;
|
||||
|
||||
QIcon icon;
|
||||
if (auto feed = qobject_cast<RSS::Feed *>(rssItem)) {
|
||||
if (auto feed = qobject_cast<RSS::Feed *>(rssItem))
|
||||
{
|
||||
if (feed->isLoading())
|
||||
icon = UIThemeManager::instance()->getIcon(QLatin1String("loading"));
|
||||
else if (feed->hasError())
|
||||
@@ -243,7 +250,8 @@ QTreeWidgetItem *FeedListWidget::createItem(RSS::Item *rssItem, QTreeWidgetItem
|
||||
else
|
||||
icon = UIThemeManager::instance()->getIcon(QLatin1String("application-rss+xml"));
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
icon = UIThemeManager::instance()->getIcon(QLatin1String("inode-directory"));
|
||||
}
|
||||
item->setData(0, Qt::DecorationRole, icon);
|
||||
@@ -260,7 +268,8 @@ QTreeWidgetItem *FeedListWidget::createItem(RSS::Item *rssItem, QTreeWidgetItem
|
||||
|
||||
void FeedListWidget::fill(QTreeWidgetItem *parent, RSS::Folder *rssParent)
|
||||
{
|
||||
for (const auto rssItem : asConst(rssParent->items())) {
|
||||
for (const auto rssItem : asConst(rssParent->items()))
|
||||
{
|
||||
QTreeWidgetItem *item = createItem(rssItem, parent);
|
||||
// Recursive call if this is a folder.
|
||||
if (auto folder = qobject_cast<RSS::Folder *>(rssItem))
|
||||
|
||||
@@ -59,20 +59,23 @@ HtmlBrowser::~HtmlBrowser()
|
||||
|
||||
QVariant HtmlBrowser::loadResource(int type, const QUrl &name)
|
||||
{
|
||||
if (type == QTextDocument::ImageResource) {
|
||||
if (type == QTextDocument::ImageResource)
|
||||
{
|
||||
QUrl url(name);
|
||||
if (url.scheme().isEmpty())
|
||||
url.setScheme("http");
|
||||
|
||||
QIODevice *dev = m_diskCache->data(url);
|
||||
if (dev) {
|
||||
if (dev)
|
||||
{
|
||||
qDebug() << "HtmlBrowser::loadResource() cache " << url.toString();
|
||||
QByteArray res = dev->readAll();
|
||||
delete dev;
|
||||
return res;
|
||||
}
|
||||
|
||||
if (!m_activeRequests.contains(url)) {
|
||||
if (!m_activeRequests.contains(url))
|
||||
{
|
||||
m_activeRequests.insert(url, true);
|
||||
qDebug() << "HtmlBrowser::loadResource() get " << url.toString();
|
||||
QNetworkRequest req(url);
|
||||
@@ -90,10 +93,12 @@ void HtmlBrowser::resourceLoaded(QNetworkReply *reply)
|
||||
{
|
||||
m_activeRequests.remove(reply->request().url());
|
||||
|
||||
if ((reply->error() == QNetworkReply::NoError) && (reply->size() > 0)) {
|
||||
if ((reply->error() == QNetworkReply::NoError) && (reply->size() > 0))
|
||||
{
|
||||
qDebug() << "HtmlBrowser::resourceLoaded() save " << reply->request().url().toString();
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
// If resource failed to load, replace it with warning icon and store it in cache for 1 day.
|
||||
// Otherwise HTMLBrowser will keep trying to download it every time article is displayed,
|
||||
// since it's not possible to cache error responses.
|
||||
|
||||
@@ -150,13 +150,16 @@ void RSSWidget::displayRSSListMenu(const QPoint &pos)
|
||||
menu->setAttribute(Qt::WA_DeleteOnClose);
|
||||
|
||||
const QList<QTreeWidgetItem *> selectedItems = m_feedListWidget->selectedItems();
|
||||
if (!selectedItems.isEmpty()) {
|
||||
if (!selectedItems.isEmpty())
|
||||
{
|
||||
menu->addAction(m_ui->actionUpdate);
|
||||
menu->addAction(m_ui->actionMarkItemsRead);
|
||||
menu->addSeparator();
|
||||
|
||||
if (selectedItems.size() == 1) {
|
||||
if (selectedItems.first() != m_feedListWidget->stickyUnreadItem()) {
|
||||
if (selectedItems.size() == 1)
|
||||
{
|
||||
if (selectedItems.first() != m_feedListWidget->stickyUnreadItem())
|
||||
{
|
||||
menu->addAction(m_ui->actionRename);
|
||||
menu->addAction(m_ui->actionDelete);
|
||||
menu->addSeparator();
|
||||
@@ -164,19 +167,22 @@ void RSSWidget::displayRSSListMenu(const QPoint &pos)
|
||||
menu->addAction(m_ui->actionNewFolder);
|
||||
}
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
menu->addAction(m_ui->actionDelete);
|
||||
menu->addSeparator();
|
||||
}
|
||||
|
||||
menu->addAction(m_ui->actionNewSubscription);
|
||||
|
||||
if (m_feedListWidget->isFeed(selectedItems.first())) {
|
||||
if (m_feedListWidget->isFeed(selectedItems.first()))
|
||||
{
|
||||
menu->addSeparator();
|
||||
menu->addAction(m_ui->actionCopyFeedURL);
|
||||
}
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
menu->addAction(m_ui->actionNewSubscription);
|
||||
menu->addAction(m_ui->actionNewFolder);
|
||||
menu->addSeparator();
|
||||
@@ -190,7 +196,8 @@ void RSSWidget::displayItemsListMenu(const QPoint &)
|
||||
{
|
||||
bool hasTorrent = false;
|
||||
bool hasLink = false;
|
||||
for (const QListWidgetItem *item : asConst(m_articleListWidget->selectedItems())) {
|
||||
for (const QListWidgetItem *item : asConst(m_articleListWidget->selectedItems()))
|
||||
{
|
||||
auto article = reinterpret_cast<RSS::Article *>(item->data(Qt::UserRole).value<quintptr>());
|
||||
Q_ASSERT(article);
|
||||
|
||||
@@ -228,7 +235,8 @@ void RSSWidget::askNewFolder()
|
||||
// Determine destination folder for new item
|
||||
QTreeWidgetItem *destItem = nullptr;
|
||||
QList<QTreeWidgetItem *> selectedItems = m_feedListWidget->selectedItems();
|
||||
if (!selectedItems.empty()) {
|
||||
if (!selectedItems.empty())
|
||||
{
|
||||
destItem = selectedItems.first();
|
||||
if (!m_feedListWidget->isFolder(destItem))
|
||||
destItem = destItem->parent();
|
||||
@@ -268,7 +276,8 @@ void RSSWidget::on_newFeedButton_clicked()
|
||||
// Determine destination folder for new item
|
||||
QTreeWidgetItem *destItem = nullptr;
|
||||
QList<QTreeWidgetItem *> selectedItems = m_feedListWidget->selectedItems();
|
||||
if (!selectedItems.empty()) {
|
||||
if (!selectedItems.empty())
|
||||
{
|
||||
destItem = selectedItems.first();
|
||||
if (!m_feedListWidget->isFolder(destItem))
|
||||
destItem = destItem->parent();
|
||||
@@ -313,13 +322,17 @@ void RSSWidget::deleteSelectedItems()
|
||||
void RSSWidget::loadFoldersOpenState()
|
||||
{
|
||||
const QStringList openedFolders = Preferences::instance()->getRssOpenFolders();
|
||||
for (const QString &varPath : openedFolders) {
|
||||
for (const QString &varPath : openedFolders)
|
||||
{
|
||||
QTreeWidgetItem *parent = nullptr;
|
||||
for (const QString &name : asConst(varPath.split('\\'))) {
|
||||
for (const QString &name : asConst(varPath.split('\\')))
|
||||
{
|
||||
int nbChildren = (parent ? parent->childCount() : m_feedListWidget->topLevelItemCount());
|
||||
for (int i = 0; i < nbChildren; ++i) {
|
||||
for (int i = 0; i < nbChildren; ++i)
|
||||
{
|
||||
QTreeWidgetItem *child = (parent ? parent->child(i) : m_feedListWidget->topLevelItem(i));
|
||||
if (m_feedListWidget->getRSSItem(child)->name() == name) {
|
||||
if (m_feedListWidget->getRSSItem(child)->name() == name)
|
||||
{
|
||||
parent = child;
|
||||
parent->setExpanded(true);
|
||||
break;
|
||||
@@ -344,14 +357,16 @@ void RSSWidget::refreshAllFeeds()
|
||||
|
||||
void RSSWidget::downloadSelectedTorrents()
|
||||
{
|
||||
for (QListWidgetItem *item : asConst(m_articleListWidget->selectedItems())) {
|
||||
for (QListWidgetItem *item : asConst(m_articleListWidget->selectedItems()))
|
||||
{
|
||||
auto article = reinterpret_cast<RSS::Article *>(item->data(Qt::UserRole).value<quintptr>());
|
||||
Q_ASSERT(article);
|
||||
|
||||
// Mark as read
|
||||
article->markAsRead();
|
||||
|
||||
if (!article->torrentUrl().isEmpty()) {
|
||||
if (!article->torrentUrl().isEmpty())
|
||||
{
|
||||
if (AddNewTorrentDialog::isEnabled())
|
||||
AddNewTorrentDialog::show(article->torrentUrl(), window());
|
||||
else
|
||||
@@ -363,7 +378,8 @@ void RSSWidget::downloadSelectedTorrents()
|
||||
// open the url of the selected RSS articles in the Web browser
|
||||
void RSSWidget::openSelectedArticlesUrls()
|
||||
{
|
||||
for (QListWidgetItem *item : asConst(m_articleListWidget->selectedItems())) {
|
||||
for (QListWidgetItem *item : asConst(m_articleListWidget->selectedItems()))
|
||||
{
|
||||
auto article = reinterpret_cast<RSS::Article *>(item->data(Qt::UserRole).value<quintptr>());
|
||||
Q_ASSERT(article);
|
||||
|
||||
@@ -387,7 +403,8 @@ void RSSWidget::renameSelectedRSSItem()
|
||||
RSS::Item *rssItem = m_feedListWidget->getRSSItem(item);
|
||||
const QString parentPath = RSS::Item::parentPath(rssItem->path());
|
||||
bool ok = false;
|
||||
do {
|
||||
do
|
||||
{
|
||||
QString newName = AutoExpandableDialog::getText(
|
||||
this, tr("Please choose a new name for this RSS feed"), tr("New feed name:")
|
||||
, QLineEdit::Normal, rssItem->name(), &ok);
|
||||
@@ -395,7 +412,8 @@ void RSSWidget::renameSelectedRSSItem()
|
||||
if (!ok) return;
|
||||
|
||||
QString error;
|
||||
if (!RSS::Session::instance()->moveItem(rssItem, RSS::Item::joinPath(parentPath, newName), &error)) {
|
||||
if (!RSS::Session::instance()->moveItem(rssItem, RSS::Item::joinPath(parentPath, newName), &error))
|
||||
{
|
||||
QMessageBox::warning(nullptr, tr("Rename failed"), error);
|
||||
ok = false;
|
||||
}
|
||||
@@ -404,8 +422,10 @@ void RSSWidget::renameSelectedRSSItem()
|
||||
|
||||
void RSSWidget::refreshSelectedItems()
|
||||
{
|
||||
for (QTreeWidgetItem *item : asConst(m_feedListWidget->selectedItems())) {
|
||||
if (item == m_feedListWidget->stickyUnreadItem()) {
|
||||
for (QTreeWidgetItem *item : asConst(m_feedListWidget->selectedItems()))
|
||||
{
|
||||
if (item == m_feedListWidget->stickyUnreadItem())
|
||||
{
|
||||
refreshAllFeeds();
|
||||
return;
|
||||
}
|
||||
@@ -417,7 +437,8 @@ void RSSWidget::refreshSelectedItems()
|
||||
void RSSWidget::copySelectedFeedsURL()
|
||||
{
|
||||
QStringList URLs;
|
||||
for (QTreeWidgetItem *item : asConst(m_feedListWidget->selectedItems())) {
|
||||
for (QTreeWidgetItem *item : asConst(m_feedListWidget->selectedItems()))
|
||||
{
|
||||
if (auto feed = qobject_cast<RSS::Feed *>(m_feedListWidget->getRSSItem(item)))
|
||||
URLs << feed->url();
|
||||
}
|
||||
@@ -432,7 +453,8 @@ void RSSWidget::handleCurrentFeedItemChanged(QTreeWidgetItem *currentItem)
|
||||
|
||||
void RSSWidget::on_markReadButton_clicked()
|
||||
{
|
||||
for (QTreeWidgetItem *item : asConst(m_feedListWidget->selectedItems())) {
|
||||
for (QTreeWidgetItem *item : asConst(m_feedListWidget->selectedItems()))
|
||||
{
|
||||
m_feedListWidget->getRSSItem(item)->markAsRead();
|
||||
if (item == m_feedListWidget->stickyUnreadItem())
|
||||
break; // all items was read
|
||||
@@ -444,7 +466,8 @@ void RSSWidget::handleCurrentArticleItemChanged(QListWidgetItem *currentItem, QL
|
||||
{
|
||||
m_ui->textBrowser->clear();
|
||||
|
||||
if (previousItem) {
|
||||
if (previousItem)
|
||||
{
|
||||
auto article = m_articleListWidget->getRSSArticle(previousItem);
|
||||
Q_ASSERT(article);
|
||||
article->markAsRead();
|
||||
@@ -468,10 +491,12 @@ void RSSWidget::handleCurrentArticleItemChanged(QListWidgetItem *currentItem, QL
|
||||
html += QString::fromLatin1("<div style='background-color: \"%1\";'><b>%2</b>%3</div>").arg(alternateBaseColor, tr("Author: "), article->author());
|
||||
html += "</div>"
|
||||
"<div style='margin-left: 5px; margin-right: 5px;'>";
|
||||
if (Qt::mightBeRichText(article->description())) {
|
||||
if (Qt::mightBeRichText(article->description()))
|
||||
{
|
||||
html += article->description();
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
QString description = article->description();
|
||||
QRegularExpression rx;
|
||||
// If description is plain text, replace BBCode tags with HTML and wrap everything in <pre></pre> so it looks nice
|
||||
|
||||
Reference in New Issue
Block a user