diff --git a/src/gui/properties/piecesbar.cpp b/src/gui/properties/piecesbar.cpp index 780d63db5..87b941493 100644 --- a/src/gui/properties/piecesbar.cpp +++ b/src/gui/properties/piecesbar.cpp @@ -42,7 +42,6 @@ #include "base/indexrange.h" #include "base/path.h" #include "base/utils/misc.h" -#include "gui/uithememanager.h" namespace { @@ -119,13 +118,7 @@ PiecesBar::PiecesBar(QWidget *parent) : QWidget(parent) { setMouseTracking(true); - updateColorsImpl(); - connect(UIThemeManager::instance(), &UIThemeManager::themeChanged, this, [this] - { - updateColors(); - redraw(); - }); } void PiecesBar::setTorrent(const BitTorrent::Torrent *torrent) @@ -143,12 +136,19 @@ void PiecesBar::clear() bool PiecesBar::event(QEvent *e) { - if (e->type() == QEvent::ToolTip) + const QEvent::Type eventType = e->type(); + if (eventType == QEvent::ToolTip) { showToolTip(static_cast(e)); return true; } + if (eventType == QEvent::PaletteChange) + { + updateColors(); + redraw(); + } + return base::event(e); } diff --git a/src/gui/rss/rsswidget.cpp b/src/gui/rss/rsswidget.cpp index 75d0be77a..a6ca52b6c 100644 --- a/src/gui/rss/rsswidget.cpp +++ b/src/gui/rss/rsswidget.cpp @@ -126,6 +126,8 @@ RSSWidget::RSSWidget(IGUIApplication *app, QWidget *parent) , this, &RSSWidget::handleSessionProcessingStateChanged); connect(RSS::Session::instance()->rootFolder(), &RSS::Folder::unreadCountChanged , this, &RSSWidget::handleUnreadCountChanged); + + m_ui->textBrowser->installEventFilter(this); } RSSWidget::~RSSWidget() @@ -494,60 +496,11 @@ void RSSWidget::handleCurrentArticleItemChanged(QListWidgetItem *currentItem, QL article->markAsRead(); } - if (!currentItem) return; + if (!currentItem) + return; auto *article = m_articleListWidget->getRSSArticle(currentItem); - Q_ASSERT(article); - - const QString highlightedBaseColor = m_ui->textBrowser->palette().color(QPalette::Highlight).name(); - const QString highlightedBaseTextColor = m_ui->textBrowser->palette().color(QPalette::HighlightedText).name(); - const QString alternateBaseColor = m_ui->textBrowser->palette().color(QPalette::AlternateBase).name(); - - QString html = - u"
" + - u"
%3
"_s.arg(highlightedBaseColor, highlightedBaseTextColor, article->title()); - if (article->date().isValid()) - html += u"
%2%3
"_s.arg(alternateBaseColor, tr("Date: "), QLocale::system().toString(article->date().toLocalTime())); - if (m_feedListWidget->currentItem() == m_feedListWidget->stickyUnreadItem()) - html += u"
%2%3
"_s.arg(alternateBaseColor, tr("Feed: "), article->feed()->title()); - if (!article->author().isEmpty()) - html += u"
%2%3
"_s.arg(alternateBaseColor, tr("Author: "), article->author()); - html += u"
" - u"
"; - if (Qt::mightBeRichText(article->description())) - { - html += article->description(); - } - else - { - QString description = article->description(); - QRegularExpression rx; - // If description is plain text, replace BBCode tags with HTML and wrap everything in
 so it looks nice
-        rx.setPatternOptions(QRegularExpression::InvertedGreedinessOption
-            | QRegularExpression::CaseInsensitiveOption);
-
-        rx.setPattern(u"\\[img\\](.+)\\[/img\\]"_s);
-        description = description.replace(rx, u""_s);
-
-        rx.setPattern(u"\\[url=(\")?(.+)\\1\\]"_s);
-        description = description.replace(rx, u""_s);
-        description = description.replace(u"[/url]"_s, u""_s, Qt::CaseInsensitive);
-
-        rx.setPattern(u"\\[(/)?([bius])\\]"_s);
-        description = description.replace(rx, u"<\\1\\2>"_s);
-
-        rx.setPattern(u"\\[color=(\")?(.+)\\1\\]"_s);
-        description = description.replace(rx, u""_s);
-        description = description.replace(u"[/color]"_s, u""_s, Qt::CaseInsensitive);
-
-        rx.setPattern(u"\\[size=(\")?(.+)\\d\\1\\]"_s);
-        description = description.replace(rx, u""_s);
-        description = description.replace(u"[/size]"_s, u""_s, Qt::CaseInsensitive);
-
-        html += u"
" + description + u"
"; - } - html += u"
"; - m_ui->textBrowser->setHtml(html); + renderArticle(article); } void RSSWidget::saveSlidersPosition() @@ -590,3 +543,73 @@ void RSSWidget::handleUnreadCountChanged() { emit unreadCountUpdated(RSS::Session::instance()->rootFolder()->unreadCount()); } + +bool RSSWidget::eventFilter(QObject *obj, QEvent *event) +{ + if ((obj == m_ui->textBrowser) && (event->type() == QEvent::PaletteChange)) + { + QListWidgetItem *currentItem = m_articleListWidget->currentItem(); + if (currentItem) + { + const RSS::Article *article = m_articleListWidget->getRSSArticle(currentItem); + renderArticle(article); + } + } + + return false; +} + +void RSSWidget::renderArticle(const RSS::Article *article) const +{ + Q_ASSERT(article); + + const QString highlightedBaseColor = m_ui->textBrowser->palette().color(QPalette::Active, QPalette::Highlight).name(); + const QString highlightedBaseTextColor = m_ui->textBrowser->palette().color(QPalette::Active, QPalette::HighlightedText).name(); + const QString alternateBaseColor = m_ui->textBrowser->palette().color(QPalette::Active, QPalette::AlternateBase).name(); + + QString html = + u"
" + + u"
%3
"_s.arg(highlightedBaseColor, highlightedBaseTextColor, article->title()); + if (article->date().isValid()) + html += u"
%2%3
"_s.arg(alternateBaseColor, tr("Date: "), QLocale::system().toString(article->date().toLocalTime())); + if (m_feedListWidget->currentItem() == m_feedListWidget->stickyUnreadItem()) + html += u"
%2%3
"_s.arg(alternateBaseColor, tr("Feed: "), article->feed()->title()); + if (!article->author().isEmpty()) + html += u"
%2%3
"_s.arg(alternateBaseColor, tr("Author: "), article->author()); + html += u"
" + u"
"; + if (Qt::mightBeRichText(article->description())) + { + html += article->description(); + } + else + { + QString description = article->description(); + QRegularExpression rx; + // If description is plain text, replace BBCode tags with HTML and wrap everything in
 so it looks nice
+        rx.setPatternOptions(QRegularExpression::InvertedGreedinessOption
+                             | QRegularExpression::CaseInsensitiveOption);
+
+        rx.setPattern(u"\\[img\\](.+)\\[/img\\]"_s);
+        description = description.replace(rx, u""_s);
+
+        rx.setPattern(u"\\[url=(\")?(.+)\\1\\]"_s);
+        description = description.replace(rx, u""_s);
+        description = description.replace(u"[/url]"_s, u""_s, Qt::CaseInsensitive);
+
+        rx.setPattern(u"\\[(/)?([bius])\\]"_s);
+        description = description.replace(rx, u"<\\1\\2>"_s);
+
+        rx.setPattern(u"\\[color=(\")?(.+)\\1\\]"_s);
+        description = description.replace(rx, u""_s);
+        description = description.replace(u"[/color]"_s, u""_s, Qt::CaseInsensitive);
+
+        rx.setPattern(u"\\[size=(\")?(.+)\\d\\1\\]"_s);
+        description = description.replace(rx, u""_s);
+        description = description.replace(u"[/size]"_s, u""_s, Qt::CaseInsensitive);
+
+        html += u"
" + description + u"
"; + } + html += u"
"; + m_ui->textBrowser->setHtml(html); +} diff --git a/src/gui/rss/rsswidget.h b/src/gui/rss/rsswidget.h index 5c5aaaa1b..cc1da53bc 100644 --- a/src/gui/rss/rsswidget.h +++ b/src/gui/rss/rsswidget.h @@ -40,6 +40,11 @@ class QTreeWidgetItem; class ArticleListWidget; class FeedListWidget; +namespace RSS +{ + class Article; +} + namespace Ui { class RSSWidget; @@ -85,6 +90,9 @@ private slots: void handleUnreadCountChanged(); private: + bool eventFilter(QObject *obj, QEvent *event) override; + void renderArticle(const RSS::Article *article) const; + Ui::RSSWidget *m_ui = nullptr; ArticleListWidget *m_articleListWidget = nullptr; FeedListWidget *m_feedListWidget = nullptr;