Improve color scheme change detection

* Fix pieces bars won't correctly detect color scheme change with Qt 6.8.
* Update RSS article content view on color scheme changed.

PR #21625.
Closes #21327.
This commit is contained in:
Vladimir Golovnev 2024-10-21 09:50:53 +03:00 committed by GitHub
parent ab8d0d1dae
commit 3ab9fe55e5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 91 additions and 60 deletions

View file

@ -42,7 +42,6 @@
#include "base/indexrange.h" #include "base/indexrange.h"
#include "base/path.h" #include "base/path.h"
#include "base/utils/misc.h" #include "base/utils/misc.h"
#include "gui/uithememanager.h"
namespace namespace
{ {
@ -119,13 +118,7 @@ PiecesBar::PiecesBar(QWidget *parent)
: QWidget(parent) : QWidget(parent)
{ {
setMouseTracking(true); setMouseTracking(true);
updateColorsImpl(); updateColorsImpl();
connect(UIThemeManager::instance(), &UIThemeManager::themeChanged, this, [this]
{
updateColors();
redraw();
});
} }
void PiecesBar::setTorrent(const BitTorrent::Torrent *torrent) void PiecesBar::setTorrent(const BitTorrent::Torrent *torrent)
@ -143,12 +136,19 @@ void PiecesBar::clear()
bool PiecesBar::event(QEvent *e) bool PiecesBar::event(QEvent *e)
{ {
if (e->type() == QEvent::ToolTip) const QEvent::Type eventType = e->type();
if (eventType == QEvent::ToolTip)
{ {
showToolTip(static_cast<QHelpEvent *>(e)); showToolTip(static_cast<QHelpEvent *>(e));
return true; return true;
} }
if (eventType == QEvent::PaletteChange)
{
updateColors();
redraw();
}
return base::event(e); return base::event(e);
} }

View file

@ -126,6 +126,8 @@ RSSWidget::RSSWidget(IGUIApplication *app, QWidget *parent)
, this, &RSSWidget::handleSessionProcessingStateChanged); , this, &RSSWidget::handleSessionProcessingStateChanged);
connect(RSS::Session::instance()->rootFolder(), &RSS::Folder::unreadCountChanged connect(RSS::Session::instance()->rootFolder(), &RSS::Folder::unreadCountChanged
, this, &RSSWidget::handleUnreadCountChanged); , this, &RSSWidget::handleUnreadCountChanged);
m_ui->textBrowser->installEventFilter(this);
} }
RSSWidget::~RSSWidget() RSSWidget::~RSSWidget()
@ -494,14 +496,76 @@ void RSSWidget::handleCurrentArticleItemChanged(QListWidgetItem *currentItem, QL
article->markAsRead(); article->markAsRead();
} }
if (!currentItem) return; if (!currentItem)
return;
auto *article = m_articleListWidget->getRSSArticle(currentItem); auto *article = m_articleListWidget->getRSSArticle(currentItem);
renderArticle(article);
}
void RSSWidget::saveSlidersPosition()
{
// Remember sliders positions
Preferences *const pref = Preferences::instance();
pref->setRssSideSplitterState(m_ui->splitterSide->saveState());
pref->setRssMainSplitterState(m_ui->splitterMain->saveState());
}
void RSSWidget::restoreSlidersPosition()
{
const Preferences *const pref = Preferences::instance();
const QByteArray stateSide = pref->getRssSideSplitterState();
if (!stateSide.isEmpty())
m_ui->splitterSide->restoreState(stateSide);
const QByteArray stateMain = pref->getRssMainSplitterState();
if (!stateMain.isEmpty())
m_ui->splitterMain->restoreState(stateMain);
}
void RSSWidget::updateRefreshInterval(int val) const
{
RSS::Session::instance()->setRefreshInterval(val);
}
void RSSWidget::on_rssDownloaderBtn_clicked()
{
auto *downloader = new AutomatedRssDownloader(this);
downloader->setAttribute(Qt::WA_DeleteOnClose);
downloader->open();
}
void RSSWidget::handleSessionProcessingStateChanged(bool enabled)
{
m_ui->labelWarn->setVisible(!enabled);
}
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); Q_ASSERT(article);
const QString highlightedBaseColor = m_ui->textBrowser->palette().color(QPalette::Highlight).name(); const QString highlightedBaseColor = m_ui->textBrowser->palette().color(QPalette::Active, QPalette::Highlight).name();
const QString highlightedBaseTextColor = m_ui->textBrowser->palette().color(QPalette::HighlightedText).name(); const QString highlightedBaseTextColor = m_ui->textBrowser->palette().color(QPalette::Active, QPalette::HighlightedText).name();
const QString alternateBaseColor = m_ui->textBrowser->palette().color(QPalette::AlternateBase).name(); const QString alternateBaseColor = m_ui->textBrowser->palette().color(QPalette::Active, QPalette::AlternateBase).name();
QString html = QString html =
u"<div style='border: 2px solid red; margin-left: 5px; margin-right: 5px; margin-bottom: 5px;'>" + u"<div style='border: 2px solid red; margin-left: 5px; margin-right: 5px; margin-bottom: 5px;'>" +
@ -549,44 +613,3 @@ void RSSWidget::handleCurrentArticleItemChanged(QListWidgetItem *currentItem, QL
html += u"</div>"; html += u"</div>";
m_ui->textBrowser->setHtml(html); m_ui->textBrowser->setHtml(html);
} }
void RSSWidget::saveSlidersPosition()
{
// Remember sliders positions
Preferences *const pref = Preferences::instance();
pref->setRssSideSplitterState(m_ui->splitterSide->saveState());
pref->setRssMainSplitterState(m_ui->splitterMain->saveState());
}
void RSSWidget::restoreSlidersPosition()
{
const Preferences *const pref = Preferences::instance();
const QByteArray stateSide = pref->getRssSideSplitterState();
if (!stateSide.isEmpty())
m_ui->splitterSide->restoreState(stateSide);
const QByteArray stateMain = pref->getRssMainSplitterState();
if (!stateMain.isEmpty())
m_ui->splitterMain->restoreState(stateMain);
}
void RSSWidget::updateRefreshInterval(int val) const
{
RSS::Session::instance()->setRefreshInterval(val);
}
void RSSWidget::on_rssDownloaderBtn_clicked()
{
auto *downloader = new AutomatedRssDownloader(this);
downloader->setAttribute(Qt::WA_DeleteOnClose);
downloader->open();
}
void RSSWidget::handleSessionProcessingStateChanged(bool enabled)
{
m_ui->labelWarn->setVisible(!enabled);
}
void RSSWidget::handleUnreadCountChanged()
{
emit unreadCountUpdated(RSS::Session::instance()->rootFolder()->unreadCount());
}

View file

@ -40,6 +40,11 @@ class QTreeWidgetItem;
class ArticleListWidget; class ArticleListWidget;
class FeedListWidget; class FeedListWidget;
namespace RSS
{
class Article;
}
namespace Ui namespace Ui
{ {
class RSSWidget; class RSSWidget;
@ -85,6 +90,9 @@ private slots:
void handleUnreadCountChanged(); void handleUnreadCountChanged();
private: private:
bool eventFilter(QObject *obj, QEvent *event) override;
void renderArticle(const RSS::Article *article) const;
Ui::RSSWidget *m_ui = nullptr; Ui::RSSWidget *m_ui = nullptr;
ArticleListWidget *m_articleListWidget = nullptr; ArticleListWidget *m_articleListWidget = nullptr;
FeedListWidget *m_feedListWidget = nullptr; FeedListWidget *m_feedListWidget = nullptr;