15 #include <QApplication> 17 #include <QTextStream> 19 #include <QRegularExpression> 20 #include <QStringList> 21 #include <QDirIterator> 23 #include <QFontDatabase> 38 static QString
ParseColor(
const QString &subject,
const QString &pattern,
const QString &fallback)
40 QRegularExpression re(pattern, QRegularExpression::CaseInsensitiveOption);
41 auto match = re.match(subject);
43 return match.hasMatch()
50 auto styleSheet = qApp->styleSheet();
52 if (styleSheet.isEmpty())
53 return QPixmap::fromImage(QImage::fromData(originalSVG));
56 QStringLiteral(
"iconColor\\s*[=:]\\s*(#[0-9a-f]{6})"),
57 QStringLiteral(
"#000000"));
60 QStringLiteral(
"iconAccentColor\\s*[=:]\\s*(#[0-9a-f]{6})"),
61 QStringLiteral(
"#ffffff"));
63 auto themedSVG = QString(originalSVG).replace(QStringLiteral(
"#00ff00"), iconColor, Qt::CaseInsensitive);
64 themedSVG = themedSVG.replace(QStringLiteral(
"#ff00ff"), iconAccentColor, Qt::CaseInsensitive);
66 return QPixmap::fromImage(QImage::fromData(themedSVG.toLatin1()));
71 QFile resourceFile(resourcePath);
73 if (resourceFile.open(QIODevice::ReadOnly))
75 auto originalSVG = resourceFile.readAll();
79 BERRY_WARN <<
"Could not read " << resourcePath;
90 void QtStyleManager::ReadPreferences()
96 QStringList pathList = paths.split(
";", QString::SkipEmptyParts);
97 QStringListIterator it(pathList);
116 for (FileNameToStyleMap::const_iterator i = styles.begin(); i != styles.end(); ++i)
122 void QtStyleManager::AddDefaultStyle()
125 AddStyle(
":/org.blueberry.ui.qt/darkstyle.qss",
"Dark");
126 AddStyle(
":/org.blueberry.ui.qt/lightstyle.qss",
"Light");
127 defaultStyle = styles[
":/org.blueberry.ui.qt/darkstyle.qss"];
131 void QtStyleManager::AddDefaultFonts()
133 m_customFontNames.append(QString(
"<<system>>"));
135 m_customFontNames.append(QString(
"Fira Sans"));
136 QFontDatabase::addApplicationFont(
":/org.blueberry.ui.qt/fonts/FiraSans/FiraSans.ttf");
138 m_customFontNames.append(QString(
"Light Fira Sans"));
139 QFontDatabase::addApplicationFont(
":/org.blueberry.ui.qt/fonts/LightFiraSans/LightFiraSans.ttf");
141 m_customFontNames.append(QString(
"Roboto"));
142 QFontDatabase::addApplicationFont(
":/org.blueberry.ui.qt/fonts/Roboto/Roboto.ttf");
144 m_customFontNames.push_back(QString(
"Open Sans"));
145 QFontDatabase::addApplicationFont(
":/org.blueberry.ui.qt/fonts/OpenSans/OpenSans-Regular.ttf");
147 m_customFontNames.push_back(QString(
"xkcd"));
148 QFontDatabase::addApplicationFont(
":/org.blueberry.ui.qt/fonts/xkcd/xkcd.ttf");
151 void QtStyleManager::ClearStyles()
153 for (FileNameToStyleMap::iterator i = styles.begin(); i != styles.end(); )
155 if (!i.value()->fileName.startsWith(
':'))
167 return Style(currentStyle->name, currentStyle->fileName);
172 return currentStyle->stylesheet;
177 return currentStyle->activeTabStylesheet;
182 return currentStyle->tabStylesheet;
186 const QString& styleName)
188 auto newStyle =
new ExtStyle();
190 if (styleName.isEmpty())
192 QFileInfo
info(styleFileName);
193 newStyle->name = info.completeBaseName();
197 newStyle->name = styleName;
200 newStyle->fileName = styleFileName;
202 styles.insert(newStyle->fileName, newStyle);
207 fontNames = m_customFontNames;
212 return m_currentFont;
217 QDirIterator dirIt(path);
218 while (dirIt.hasNext())
220 QString current = dirIt.next();
221 QFileInfo
info = dirIt.fileInfo();
222 if (info.isFile() && info.isReadable())
224 QString fileName = info.fileName();
225 if (fileName.endsWith(
"-tab.qss") || fileName.endsWith(
"-activetab.qss"))
228 if (fileName.endsWith(
".qss"))
234 void QtStyleManager::ReadStyleData(ExtStyle* style)
236 QString tabStyleFileName(style->fileName);
237 QString activeTabStyleFileName(style->fileName);
239 int index = style->fileName.lastIndexOf(
".qss");
240 tabStyleFileName.replace(index, 4,
"-tab.qss");
241 activeTabStyleFileName.replace(index, 4,
"-activetab.qss");
243 QFile styleFile(style->fileName);
244 if (styleFile.open(QIODevice::ReadOnly))
246 QTextStream
in(&styleFile);
247 style->stylesheet = in.readAll();
251 BERRY_WARN <<
"Could not read " << style->fileName.toStdString();
254 QFile tabStyleFile(tabStyleFileName);
255 if (tabStyleFile.open(QIODevice::ReadOnly))
257 QTextStream
in(&tabStyleFile);
258 style->tabStylesheet = in.readAll();
262 BERRY_WARN <<
"Could not read " << tabStyleFileName.toStdString();
265 QFile activeTabStyleFile(activeTabStyleFileName);
266 if (activeTabStyleFile.open(QIODevice::ReadOnly))
268 QTextStream
in(&activeTabStyleFile);
269 style->activeTabStylesheet = in.readAll();
273 BERRY_WARN <<
"Could not read " << activeTabStyleFileName.toStdString();
279 if (currentStyle->fileName == styleFileName)
284 delete styles.take(styleFileName);
295 for (FileNameToStyleMap::iterator i = styles.begin(); i != styles.end();)
297 ExtStyle* style = i.value();
298 QFileInfo
info(style->fileName);
299 if (info.absolutePath() == repo)
301 if (style->name == currentStyle->name)
318 for (FileNameToStyleMap::const_iterator i = styles.begin(); i != styles.end(); ++i)
319 styleNames.push_back(
Style(i.value()->name, i.value()->fileName));
329 if (fileName.isEmpty())
335 FileNameToStyleMap::const_iterator i = styles.find(fileName);
337 ExtStyle* style =
nullptr;
338 if (i == styles.end())
340 BERRY_WARN <<
"Style " + fileName.toStdString() <<
" does not exist";
341 style = defaultStyle;
347 currentStyle = style;
349 ReadStyleData(style);
353 qApp->setStyleSheet(currentStyle->stylesheet);
360 m_currentFont = fontName;
365 m_currentFontSize = fontSize;
370 if( m_currentFont == QString(
"<<system>>" ) || m_currentFont == QString(
"" ))
372 qApp->setFont(QFontDatabase::systemFont(QFontDatabase::GeneralFont));
377 font.setFamily(m_currentFont);
378 font.setPointSize(m_currentFontSize);
381 qApp->setStyleSheet(currentStyle->stylesheet);
387 return Style(defaultStyle->name, defaultStyle->fileName);
397 SetStyle(defaultStyle->fileName, update);
402 return styles.contains(fileName);
static const QString QT_STYLE_SEARCHPATHS
QString GetStylesheet() const override
Style GetStyle() const override
void RemoveStyle(const QString &styleFileName) override
~QtStyleManager() override
void RemoveStyles(const QString &path=QString()) override
static QIcon ThemeIcon(const QByteArray &originalSVG)
void SetFont(const QString &fontName) override
virtual SmartPointer< IPreferences > GetSystemPreferences()=0
static WorkbenchPlugin * GetDefault()
static const QString QT_STYLE_NAME
QString GetActiveTabStylesheet() const override
static void info(const char *fmt,...)
void GetFonts(QStringList &fontNames) const override
QString GetFont() const override
virtual void UpdateTheme()=0
void SetFontSize(const int fontSize) override
QString GetTabStylesheet() const override
void UpdateWorkbenchFont() override
IPreferencesService * GetPreferencesService() const
static const QString QT_STYLES_NODE
static QString ParseColor(const QString &subject, const QString &pattern, const QString &fallback)
void GetStyles(StyleList &styles) const override
static bool in(Reader::Char c, Reader::Char c1, Reader::Char c2, Reader::Char c3, Reader::Char c4)
void AddStyles(const QString &path) override
void SetDefaultStyle() override
void AddStyle(const QString &styleFileName, const QString &styleName=QString()) override
void SetStyle(const QString &fileName) override
bool Contains(const QString &fileName) const override
Style GetDefaultStyle() const override