10#include <QLoggingCategory>
14#include <QStyleFactory>
15#include <QApplication>
19#include "ui_FrmStyle.h"
21#include "RabbitCommonDir.h"
23static Q_LOGGING_CATEGORY(log,
"RabbitCommon.Style")
29 qDebug(log) << Q_FUNC_INFO;
30 setAttribute(Qt::WA_DeleteOnClose,
true);
33 auto pStyle = RabbitCommon::CStyle::Instance();
34 foreach(
auto szName, QStyleFactory::keys()) {
35 if(-1 == ui->cbStyleName->findData(szName))
36 ui->cbStyleName->addItem(szName, szName);
38 if(!QStyleFactory::keys().isEmpty()) {
39 int index = ui->cbStyleName->findData(pStyle->GetStyleName());
41 ui->cbStyleName->setCurrentIndex(index);
44 ui->leStyleSheet->setText(pStyle->GetStyleSheetFile());
46 ui->lbIconThemeChanged->setVisible(
false);
48 QSettings set(RabbitCommon::CDir::Instance()->GetFileUserConfigure(),
49 QSettings::IniFormat);
50 bool bIconTheme = set.value(
"Style/Icon/Theme/Enable",
true).toBool();
51 ui->gpIconTheme->setChecked(bIconTheme);
54 <<
"Icon theme name:" << QIcon::themeName() <<
"\n"
55 <<
"Icon theme search paths:" << QIcon::themeSearchPaths() <<
"\n"
56 #if QT_VERSION >= QT_VERSION_CHECK(5, 12, 0)
57 <<
"Fallback theme name:" << QIcon::fallbackThemeName() <<
"\n"
59 #if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)
60 <<
"Fallback search paths:" << QIcon::fallbackSearchPaths() <<
"\n"
63 foreach(
auto d, QIcon::themeSearchPaths())
69 <<
"Theme folder isn't exists:" << d;
73 qInfo(log) <<
"Theme folder:" << dir.absolutePath();
77 foreach(
auto themeName, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot))
79 qDebug(log) <<
"Theme path:" << dir.absolutePath()
80 <<
"Theme:" << themeName;
81 QFileInfo fi(dir.absolutePath() + QDir::separator()
82 + themeName + QDir::separator() +
"index.theme");
85 qDebug(log) <<
"Theme:" << themeName;
86 ui->cbIconTheme->addItem(themeName);
88 qCritical(log) <<
"index.theme doesn't exists: " << fi.fileName()
89 <<
"Theme:" << themeName;
93 if(!QIcon::themeName().isEmpty())
94 ui->cbIconTheme->setCurrentText(QIcon::themeName());
96#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 0) && !defined(Q_OS_WINDOWS)
97 QDir fallbackDir(RabbitCommon::CDir::Instance()->GetDirIcons());
98 QStringList lstFallback;
99 if(fallbackDir.exists())
101 foreach(
auto themeName, fallbackDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot))
103 qDebug(log) <<
"fallback path:" << fallbackDir.absolutePath()
104 <<
"Theme:" << themeName;
105 QFileInfo fi(fallbackDir.absolutePath() + QDir::separator()
106 + themeName + QDir::separator() +
"index.theme");
109 qDebug(log) <<
"fallback Theme:" << themeName;
110 ui->cbFallbackTheme->addItem(themeName);
114 if(!QIcon::fallbackThemeName().isEmpty())
116 ui->cbFallbackTheme->setCurrentText(QIcon::fallbackThemeName());
118 ui->gbFallbackTheme->setVisible(
true);
120 ui->gbFallbackTheme->setVisible(
false);
125CFrmStyle::~CFrmStyle()
127 qDebug(log) <<
"CFrmStyle::~CFrmStyle()";
131void CFrmStyle::on_pbOK_clicked()
133#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
134 const auto colorScheme = QGuiApplication::styleHints()->colorScheme();
135 QString szColorScheme;
136 QRegularExpression re(
"[Bb]lack|[Dd]ark");
137 QRegularExpressionMatch match = re.match(ui->cbIconTheme->currentText());
138 if (Qt::ColorScheme::Dark == colorScheme && match.hasMatch()) {
139 szColorScheme = tr(
"Dark");
141 QRegularExpression reWhite(
"[Ww]hite|[L|l]ight");
142 match = reWhite.match(ui->cbIconTheme->currentText());
143 if (Qt::ColorScheme::Light == colorScheme && match.hasMatch()) {
144 szColorScheme = tr(
"Light");
146 if(!szColorScheme.isEmpty()) {
147 QString szInfo = tr(
"Current system theme is") +
" \"" + szColorScheme +
"\", " + tr(
"current select theme is")
148 + QString(
" \"") + ui->cbIconTheme->currentText() +
"\". \n";
149 szInfo += tr(
"it's almost impossible to find the icon because its color matches the current system theme.") +
"\n"
150 + tr(
"Are you sure you want to modify it?");
151 auto ret = QMessageBox::information(
nullptr, tr(
"Change theme"),
153 QMessageBox::Ok | QMessageBox::No,
155 if(QMessageBox::No == ret)
160 QSettings set(RabbitCommon::CDir::Instance()->GetFileUserConfigure(),
161 QSettings::IniFormat);
162 bool bIconTheme = ui->gpIconTheme->isChecked();
163 set.setValue(
"Style/Icon/Theme/Enable", bIconTheme);
165 if(!ui->cbIconTheme->currentText().isEmpty())
166 QIcon::setThemeName(ui->cbIconTheme->currentText());
167 set.setValue(
"Style/Icon/Theme", QIcon::themeName());
169#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 0)
170 if(!ui->cbFallbackTheme->currentText().isEmpty())
171 QIcon::setFallbackThemeName(ui->cbFallbackTheme->currentText());
172 set.setValue(
"Style/Icon/Theme/Fallback", QIcon::fallbackThemeName());
176 auto pStyle = RabbitCommon::CStyle::Instance();
177 pStyle->SetStyleSheetFile(ui->leStyleSheet->text());
178 pStyle->SetStyleName(ui->cbStyleName->currentData().toString());
179 pStyle->ReLoadStyle();
184void CFrmStyle::on_pbCancel_clicked()
189void CFrmStyle::on_pbBrowse_clicked()
191 ui->leStyleSheet->setText(RabbitCommon::CStyle::Instance()->GetStyleSheet());
194void CFrmStyle::on_pbDefault_clicked()
196 ui->leStyleSheet->setText(
"");
197 if(ui->cbStyleName->count() > 0)
198 ui->cbStyleName->setCurrentIndex(0);
200 if(ui->gpIconTheme->isChecked()) {
201 ui->cbIconTheme->setCurrentText(
202 RabbitCommon::CStyle::Instance()->m_szDefaultIconTheme);
203 ui->cbFallbackTheme->setCurrentText(
204 RabbitCommon::CStyle::Instance()->m_szDefaultFallbackIconTheme);
208void CFrmStyle::on_gpIconTheme_clicked()
210 ui->lbIconThemeChanged->setVisible(
true);
Set style and icon theme form.