From e4cd7c78ce85dc1c375fca2b7867622e6fc56deb Mon Sep 17 00:00:00 2001 From: Warchamp7 Date: Wed, 15 Oct 2025 14:13:16 -0400 Subject: [PATCH] frontend: Add icon recoloring to state style event filter --- .../idian/include/Idian/StateEventFilter.cpp | 30 +++++++++++++++--- .../idian/include/Idian/StateEventFilter.hpp | 4 +-- shared/qt/idian/include/Idian/Utils.hpp | 31 +++++++++++++++++++ 3 files changed, 58 insertions(+), 7 deletions(-) diff --git a/shared/qt/idian/include/Idian/StateEventFilter.cpp b/shared/qt/idian/include/Idian/StateEventFilter.cpp index 0fb2ee19b..b850b638e 100644 --- a/shared/qt/idian/include/Idian/StateEventFilter.cpp +++ b/shared/qt/idian/include/Idian/StateEventFilter.cpp @@ -2,7 +2,7 @@ #include #include -#include +#include namespace idian { StateEventFilter::StateEventFilter(idian::Utils *utils, QWidget *target) : QObject(target), target(target), utils(utils) @@ -22,7 +22,16 @@ bool StateEventFilter::eventFilter(QObject *obj, QEvent *event) QWidget *widget = qobject_cast(obj); QFocusEvent *focusEvent = nullptr; + bool updateIconColors = true; + switch (event->type()) { + case QEvent::StyleChange: + case QEvent::ThemeChange: + utils->repolish(widget); + + utils->polishChildren(widget); + + break; case QEvent::FocusIn: utils->toggleClass(widget, "focus", true); @@ -34,6 +43,7 @@ bool StateEventFilter::eventFilter(QObject *obj, QEvent *event) } utils->polishChildren(widget); + break; case QEvent::FocusOut: utils->toggleClass(widget, "focus", false); @@ -44,8 +54,8 @@ bool StateEventFilter::eventFilter(QObject *obj, QEvent *event) utils->polishChildren(widget); } - break; - case QEvent::MouseButtonPress: + utils->polishChildren(widget); + break; case QEvent::HoverEnter: if (widget->isEnabled()) { @@ -53,18 +63,28 @@ bool StateEventFilter::eventFilter(QObject *obj, QEvent *event) } utils->polishChildren(widget); + break; case QEvent::HoverLeave: utils->toggleClass(widget, "hover", false); utils->polishChildren(widget); + break; case QEvent::EnabledChange: - bool widgetEnabled = widget->isEnabled(); - utils->toggleClass(widget, "disabled", !widgetEnabled); + utils->toggleClass(widget, "disabled", !widget->isEnabled()); utils->polishChildren(widget); + break; + default: + updateIconColors = false; + break; + } + + if (updateIconColors) { + // Delay icon update + QTimer::singleShot(0, this, [this, widget]() { utils->applyColorToIcon(widget); }); } return QObject::eventFilter(obj, event); diff --git a/shared/qt/idian/include/Idian/StateEventFilter.hpp b/shared/qt/idian/include/Idian/StateEventFilter.hpp index 4724521a4..1d59f15b3 100644 --- a/shared/qt/idian/include/Idian/StateEventFilter.hpp +++ b/shared/qt/idian/include/Idian/StateEventFilter.hpp @@ -3,8 +3,6 @@ #include #include -#include -#include namespace idian { class StateEventFilter : public QObject { @@ -21,5 +19,7 @@ public slots: private: Utils *utils; QWidget *target; + + void applyColorToIcon(); }; } // namespace idian diff --git a/shared/qt/idian/include/Idian/Utils.hpp b/shared/qt/idian/include/Idian/Utils.hpp index 4f77311ab..cd71252bd 100644 --- a/shared/qt/idian/include/Idian/Utils.hpp +++ b/shared/qt/idian/include/Idian/Utils.hpp @@ -17,10 +17,13 @@ #pragma once +#include #include #include #include #include +#include +#include #include namespace idian { @@ -125,6 +128,34 @@ public: } } + static void applyColorToIcon(QWidget *widget) + { + QAbstractButton *button = qobject_cast(widget); + if (button && !button->icon().isNull()) { + // Filter is on a widget with an icon set, update it's colors + QStyleOptionButton opt; + opt.initFrom(button); + + QColor color = opt.palette.color(QPalette::ButtonText); + QPixmap tinted = recolorPixmap(button->icon().pixmap(button->iconSize(), QIcon::Normal), color); + QIcon tintedIcon; + tintedIcon.addPixmap(tinted, QIcon::Normal); + tintedIcon.addPixmap(tinted, QIcon::Disabled); + + button->setIcon(tintedIcon); + } + } + + static QPixmap recolorPixmap(const QPixmap &src, const QColor &color) + { + QImage img = src.toImage(); + QPainter p(&img); + p.setCompositionMode(QPainter::CompositionMode_SourceIn); + p.fillRect(img.rect(), color); + p.end(); + return QPixmap::fromImage(img); + } + void applyStateStylingEventFilter(QWidget *widget); };