diff --git a/shared/qt/idian/include/Idian/Utils.cpp b/shared/qt/idian/include/Idian/Utils.cpp index c4fc12559..6fa935888 100644 --- a/shared/qt/idian/include/Idian/Utils.cpp +++ b/shared/qt/idian/include/Idian/Utils.cpp @@ -26,6 +26,38 @@ #include namespace idian { +Q_GLOBAL_STATIC(Utils, utils); + +Utils::Utils() : QObject(nullptr) {} + +void Utils::addToPolishQueue(QWidget *widget) +{ + widgetPolishQueue.push_back(widget); + + if (isPolishPending) { + return; + } + + isPolishPending = true; + + QMetaObject::invokeMethod(this, &Utils::processPolishQueue, Qt::QueuedConnection); +} + +void Utils::processPolishQueue() +{ + widgetPolishQueue.sort(); + widgetPolishQueue.unique(); + + for (QPointer widget : widgetPolishQueue) { + if (widget) { + widget->style()->polish(widget); + } + } + + isPolishPending = false; + widgetPolishQueue.clear(); +} + void Utils::polishChildren(QWidget *widget) { for (QWidget *child : widget->findChildren()) { @@ -35,7 +67,7 @@ void Utils::polishChildren(QWidget *widget) void Utils::repolish(QWidget *widget) { - widget->style()->polish(widget); + utils->addToPolishQueue(widget); } void Utils::addClass(QWidget *widget, const QString &classname) diff --git a/shared/qt/idian/include/Idian/Utils.hpp b/shared/qt/idian/include/Idian/Utils.hpp index 6c468cccd..1f90e5286 100644 --- a/shared/qt/idian/include/Idian/Utils.hpp +++ b/shared/qt/idian/include/Idian/Utils.hpp @@ -17,6 +17,7 @@ #pragma once +#include #include #include #include @@ -38,7 +39,12 @@ class Utils : public QObject { } public: - Utils(QObject *parent = nullptr) {}; + Utils(); + + bool isPolishPending{false}; + std::list> widgetPolishQueue; + void addToPolishQueue(QWidget *widget); + void processPolishQueue(); // Force all children widgets to repaint static void polishChildren(QWidget *widget);