31 #include "miscellaneous/skinfactory.h"
33 #include "definitions/definitions.h"
34 #include "miscellaneous/settings.h"
35 #include "miscellaneous/application.h"
38 #include <QStyleFactory>
39 #include <QDomDocument>
40 #include <QDomElement>
47 qDebug(
"Destroying SkinFactory instance.");
53 Skin skin_data =
skinInfo(skin_name_from_settings, &skin_parsed);
56 loadSkinFromData(skin_data);
59 m_currentSkin = skin_data;
61 qDebug(
"Skin '%s' loaded.", qPrintable(skin_name_from_settings));
65 qCritical(
"Skin '%s' not loaded because its data are corrupted. No skin is loaded now!",
66 qPrintable(skin_name_from_settings));
68 qFatal(
"Skin '%s' not loaded because its data are corrupted. No skin is loaded now!",
69 qPrintable(skin_name_from_settings));
74 bool SkinFactory::loadSkinFromData(
const Skin &skin) {
75 qDebug(
"Loading skin '%s'.", qPrintable(skin.m_baseName));
85 QString raw_data = skin.m_rawData;
87 if (!raw_data.isEmpty()) {
88 QString parsed_data = raw_data.replace(
"##",
91 qApp->setStyleSheet(parsed_data);
95 foreach (
const QString &style, skin.m_stylesNames) {
96 if (qApp->setStyle(style) != 0) {
97 qDebug(
"Style '%s' loaded.", qPrintable(style));
107 qApp->settings()->setValue(APP_CFG_GUI,
"skin", skin_name);
111 return qApp->settings()->value(APP_CFG_GUI,
113 APP_SKIN_DEFAULT).toString();
119 QFile skin_file(APP_SKIN_PATH + QDir::separator() + skin_name);
120 QDomDocument dokument;
122 if (!skin_file.open(QIODevice::Text | QIODevice::ReadOnly) || !dokument.setContent(&skin_file,
true)) {
130 QDomNode skin_node = dokument.namedItem(
"skin");
133 skin.m_visibleName = skin_node.namedItem(
"name").toElement().text();
136 skin.m_rawData = skin_node.namedItem(
"data").toElement().text();
137 skin.m_rawData = QByteArray::fromBase64(skin.m_rawData.toLocal8Bit());
140 styles = skin_node.namedItem(
"style").toElement().text();
141 skin.m_stylesNames = styles.split(
',', QString::SkipEmptyParts);
144 skin.m_author = skin_node.namedItem(
"author").namedItem(
"name").toElement().text();
147 skin.m_email = skin_node.namedItem(
"author").namedItem(
"email").toElement().text();
150 skin.m_version = skin_node.attributes().namedItem(
"version").toAttr().value();
153 skin.m_baseName = QString(skin_name).replace(QDir::separator(),
'/');
154 skin.m_baseFolder = skin.m_baseName.split(
'/', QString::SkipEmptyParts).at(0);
157 QString simulator_image = skin_node.namedItem(
"simulator").
158 namedItem(
"main").toElement().text();
160 skin.m_simulatorBackgroundMain = APP_SKIN_PATH +
'/' + skin.m_baseFolder +
'/' + simulator_image;
161 skin.m_simulatorBackgroundMain = skin.m_simulatorBackgroundMain.replace(
'\\',
'/');
163 skin.m_simulatorStyle = skin_node.namedItem(
"simulator").namedItem(
"style").toElement().text();
164 skin.m_simulatorStyle = QByteArray::fromBase64(skin.m_simulatorStyle.toLocal8Bit());
168 skin_file.deleteLater();
171 *ok = !skin.m_author.isEmpty() && !skin.m_version.isEmpty() &&
172 !skin.m_baseName.isEmpty() && !skin.m_email.isEmpty();
181 QStringList skin_directories = QDir(APP_SKIN_PATH).entryList(QDir::Dirs |
182 QDir::NoDotAndDotDot |
186 foreach (
const QString &base_directory, skin_directories) {
188 QStringList skin_files = QDir(APP_SKIN_PATH + QDir::separator() + base_directory).entryList(QStringList() <<
"*.xml",
189 QDir::Files | QDir::Readable | QDir::NoDotAndDotDot | QDir::NoSymLinks);
191 foreach (
const QString &skin_file, skin_files) {
193 Skin skin_info =
skinInfo(base_directory + QDir::separator() + skin_file,
197 skins.append(skin_info);
QList< Skin > installedSkins()
Returns list of installed skins.
virtual ~SkinFactory()
Destructor.
Skin skinInfo(const QString &skin_name, bool *ok=NULL)
Gets skin about a particular skin.
void loadCurrentSkin()
Loads skin name from settings and sets it as active.
void setCurrentSkinName(const QString &skin_name)
Sets the desired skin as the active one if it exists.
QString selectedSkinName()
Name of this "activated" skin.
SkinFactory(QObject *parent=0)
Constructor.