|
13 | 13 | #include <QColor> |
14 | 14 | #include <QPalette> |
15 | 15 | #include <QIcon> |
| 16 | +#include <QStyleHints> |
| 17 | +#include <QMessageBox> |
16 | 18 |
|
17 | 19 | namespace RabbitCommon { |
18 | 20 |
|
@@ -48,6 +50,14 @@ CStyle::CStyle(QObject *parent) : QObject(parent) |
48 | 50 | << "Fallback search paths:" << QIcon::fallbackSearchPaths() << "\n" |
49 | 51 | #endif // QT_VERSION >= QT_VERSION_CHECK(5, 11, 0) |
50 | 52 | ; |
| 53 | + |
| 54 | + bool check = false; |
| 55 | + if(QApplication::instance()) { |
| 56 | + check = connect(QApplication::styleHints(), |
| 57 | + SIGNAL(colorSchemeChanged(Qt::ColorScheme)), |
| 58 | + this, SLOT(slotColorSchemeChanged(Qt::ColorScheme))); |
| 59 | + Q_ASSERT(check); |
| 60 | + } |
51 | 61 | } |
52 | 62 |
|
53 | 63 | CStyle* CStyle::Instance() |
@@ -79,8 +89,27 @@ int CStyle::LoadStyle() |
79 | 89 | QString szThemeName = QIcon::themeName(); |
80 | 90 | if(szThemeName.isEmpty()) |
81 | 91 | szThemeName = m_szDefaultIconTheme; |
82 | | - QIcon::setThemeName(set.value("Style/Icon/Theme", |
83 | | - szThemeName).toString()); |
| 92 | + szThemeName = set.value("Style/Icon/Theme", szThemeName).toString(); |
| 93 | + |
| 94 | +#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0) |
| 95 | + const auto scheme = QGuiApplication::styleHints()->colorScheme(); |
| 96 | + //qDebug(log) << "Scheme:" << scheme; |
| 97 | + QRegularExpression re("black|[Dd]ark"); |
| 98 | + QRegularExpressionMatch match = re.match(szThemeName); |
| 99 | + if (Qt::ColorScheme::Dark == scheme && match.hasMatch()) { |
| 100 | + QString szInfo = tr("Current system theme is dark, current theme is ") + QString("\"") + szThemeName + "\". "; |
| 101 | + szInfo += tr("it's almost impossible to find the icon because it matches the color."); |
| 102 | +#if defined(Q_OS_WIN) |
| 103 | + szThemeName = "rabbit-green"; |
| 104 | +#else |
| 105 | + szThemeName = "rabbit-white"; |
| 106 | +#endif |
| 107 | + szInfo += " " + tr("change to ") + szThemeName; |
| 108 | + qInfo(log) << szInfo; |
| 109 | + } |
| 110 | +#endif // QT_VERSION |
| 111 | + |
| 112 | + QIcon::setThemeName(szThemeName); |
84 | 113 |
|
85 | 114 | #if QT_VERSION >= QT_VERSION_CHECK(5, 12, 0) && !defined(Q_OS_WINDOWS) |
86 | 115 | QIcon::setFallbackSearchPaths( |
@@ -207,4 +236,32 @@ QString CStyle::GetStyleFile() |
207 | 236 | return m_szFile; |
208 | 237 | } |
209 | 238 |
|
| 239 | +void CStyle::slotColorSchemeChanged(Qt::ColorScheme colorScheme) |
| 240 | +{ |
| 241 | +#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0) |
| 242 | + QRegularExpression re("black|[Dd]ark"); |
| 243 | + QRegularExpressionMatch match = re.match(QIcon::themeName()); |
| 244 | + if (Qt::ColorScheme::Dark == colorScheme && match.hasMatch()) { |
| 245 | + QString szThemeName; |
| 246 | + QString szInfo = tr("Current system theme is dark, current theme is ") + QString("\"") + QIcon::themeName() + "\". "; |
| 247 | + szInfo += tr("it's almost impossible to find the icon because it matches the color."); |
| 248 | +#if defined(Q_OS_WIN) |
| 249 | + szThemeName = "rabbit-green"; |
| 250 | +#else |
| 251 | + szThemeName = "rabbit-white"; |
| 252 | +#endif |
| 253 | + szInfo += " " + tr("change to ") + "\"" + szThemeName + "\"?"; |
| 254 | + auto ret = QMessageBox::information(nullptr, tr("Change theme"), szInfo, |
| 255 | + QMessageBox::Ok | QMessageBox::No, |
| 256 | + QMessageBox::Ok); |
| 257 | + if(QMessageBox::Ok == ret) { |
| 258 | + QSettings set(RabbitCommon::CDir::Instance()->GetFileUserConfigure(), |
| 259 | + QSettings::IniFormat); |
| 260 | + QIcon::setThemeName(szThemeName); |
| 261 | + szThemeName = set.value("Style/Icon/Theme", szThemeName).toString(); |
| 262 | + } |
| 263 | + } |
| 264 | +#endif // QT_VERSION |
| 265 | +} |
| 266 | + |
210 | 267 | } //namespace RabbitCommon |
0 commit comments