-
-
Notifications
You must be signed in to change notification settings - Fork 141
/
themeprovider.cpp
107 lines (81 loc) · 2.69 KB
/
themeprovider.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include "themeprovider.h"
#include <QApplication>
#include <QJsonDocument>
#include <QPalette>
#include <QVariant>
#include <QFile>
#include <QDir>
#include "redasmsettings.h"
#define THEME_UI_SET_COLOR(palette, key) if(m_theme.contains(#key)) palette.setColor(QPalette::key, m_theme[#key].toString())
QJsonObject ThemeProvider::m_theme;
QStringList ThemeProvider::themes() { return ThemeProvider::readThemes(":/themes"); }
QString ThemeProvider::theme(const QString &name) { return QString(":/themes/%1.json").arg(name.toLower()); }
bool ThemeProvider::isDarkTheme()
{
if(!m_theme.contains("dark"))
return false;
return m_theme["dark"] == true;
}
bool ThemeProvider::loadTheme(const QString& theme)
{
if(!m_theme.isEmpty())
return true;
QFile f(QString(":/themes/%1.json").arg(theme.toLower()));
if(!f.open(QFile::ReadOnly))
return false;
QJsonDocument doc = QJsonDocument::fromJson(f.readAll());
if(doc.isObject())
m_theme = doc.object();
else
return false;
return true;
}
QColor ThemeProvider::themeValue(const QString &name)
{
if(m_theme.isEmpty())
{
REDasmSettings settings;
if(!ThemeProvider::loadTheme(settings.currentTheme()))
return QColor();
}
if(m_theme.contains(name))
return QColor(m_theme[name].toString());
return QColor();
}
QIcon ThemeProvider::icon(const QString &name)
{
REDasmSettings settings;
return QIcon(QString(":/res/%1/%2.png").arg(ThemeProvider::isDarkTheme() ? "dark" : "light")
.arg(name));
}
QColor ThemeProvider::seekColor() { return ThemeProvider::themeValue("seek"); }
QColor ThemeProvider::dottedColor() { return ThemeProvider::themeValue("dotted_fg"); }
void ThemeProvider::applyTheme()
{
REDasmSettings settings;
if(!ThemeProvider::loadTheme(settings.currentTheme()))
return;
QPalette palette = qApp->palette();
THEME_UI_SET_COLOR(palette, Shadow);
THEME_UI_SET_COLOR(palette, Base);
THEME_UI_SET_COLOR(palette, Text);
THEME_UI_SET_COLOR(palette, Window);
THEME_UI_SET_COLOR(palette, WindowText);
THEME_UI_SET_COLOR(palette, Button);
THEME_UI_SET_COLOR(palette, ButtonText);
THEME_UI_SET_COLOR(palette, Highlight);
THEME_UI_SET_COLOR(palette, HighlightedText);
THEME_UI_SET_COLOR(palette, ToolTipBase);
THEME_UI_SET_COLOR(palette, ToolTipText);
qApp->setPalette(palette);
}
QStringList ThemeProvider::readThemes(const QString &path)
{
QStringList themes = QDir(path).entryList({"*.json"});
for(QString& theme : themes)
{
theme.remove(".json");
theme.front() = theme.front().toUpper();
}
return themes;
}