From f9c36d0a999c1b16c40594c23fc8da04541475d6 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Wed, 13 Jul 2016 18:33:58 +0200 Subject: [PATCH] Improved automatic reloading of altered stylesheets --- src/blackgui/stylesheetutility.cpp | 20 +++++++++++++++----- src/blackgui/stylesheetutility.h | 5 +++-- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/blackgui/stylesheetutility.cpp b/src/blackgui/stylesheetutility.cpp index ba6ac6a9c..234f0c548 100644 --- a/src/blackgui/stylesheetutility.cpp +++ b/src/blackgui/stylesheetutility.cpp @@ -36,8 +36,8 @@ namespace BlackGui CStyleSheetUtility::CStyleSheetUtility(BlackMisc::Restricted, QObject *parent) : QObject(parent) { this->read(); - this->m_fileWatcher.addPath(CBuildConfig::getStylesheetsDir()); connect(&this->m_fileWatcher, &QFileSystemWatcher::directoryChanged, this, &CStyleSheetUtility::ps_qssDirectoryChanged); + connect(&this->m_fileWatcher, &QFileSystemWatcher::fileChanged, this, &CStyleSheetUtility::ps_qssDirectoryChanged); } const QString &CStyleSheetUtility::fontStyleAsString(const QFont &font) @@ -113,26 +113,36 @@ namespace BlackGui if (!directory.exists()) { return false; } // qss/css files + const bool needsWatcher = this->m_fileWatcher.files().isEmpty(); + if (needsWatcher) { this->m_fileWatcher.addPath(CBuildConfig::getStylesheetsDir()); } // directory to deleted file watching directory.setNameFilters({"*.qss", "*.css"}); directory.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks); - this->m_styleSheets.clear(); + QMap newStyleSheets; const QFileInfoList fileInfoList = directory.entryInfoList(); for (const QFileInfo &fileInfo : fileInfoList) { - QFile file(fileInfo.absoluteFilePath()); + const QString absolutePath = fileInfo.absoluteFilePath(); + QFile file(absolutePath); if (file.open(QFile::QIODevice::ReadOnly | QIODevice::Text)) { + if (needsWatcher) { this->m_fileWatcher.addPath(absolutePath); } QTextStream in(&file); const QString c = in.readAll(); const QString f = fileInfo.fileName().toLower(); // keep even empty files as placeholders - this->m_styleSheets.insert(f, c); + newStyleSheets.insert(f, c); } file.close(); } - emit this->styleSheetsChanged(); + + // ignore redundant re-reads + if (newStyleSheets != this->m_styleSheets) + { + this->m_styleSheets = newStyleSheets; + emit this->styleSheetsChanged(); + } return true; } diff --git a/src/blackgui/stylesheetutility.h b/src/blackgui/stylesheetutility.h index f0695bd15..5457710c1 100644 --- a/src/blackgui/stylesheetutility.h +++ b/src/blackgui/stylesheetutility.h @@ -14,6 +14,7 @@ #include "blackgui/blackguiexport.h" #include "blackmisc/restricted.h" +#include "blackmisc/digestsignal.h" #include #include @@ -144,8 +145,8 @@ namespace BlackGui void ps_qssDirectoryChanged(const QString &file); private: - QMap m_styleSheets; //!< filename, stylesheet - QFileSystemWatcher m_fileWatcher {this}; //!< Monitor my qss files + QMap m_styleSheets; //!< filename, stylesheet + QFileSystemWatcher m_fileWatcher {this}; //!< Monitor my qss files }; } #endif // guard