Skin format converted.

This commit is contained in:
Martin Rotter 2017-01-12 07:52:43 +01:00
parent 5dafdec7e3
commit dac3a30a04
9 changed files with 6061 additions and 52 deletions

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
<a class="btn btn-primary btn-sm" href="%1">%2 (%3)</a>

View File

@ -0,0 +1 @@
<a href="%1"><img src="%1" alt="%2" height="%3" /></a>

View File

@ -0,0 +1,19 @@
<div class="card">
<div class="card-block">
<h4 class="card-title">%1 <a class="btn btn-primary btn-sm" href="%3">URL</a> %6</h4>
<div class="buttons" style="margin-bottom: 10px;">
<img class="%7" message_id="%9" onclick="switchReadStatus(this); return false;"></img>
<img class="%8" message_id="%9" onclick="switchStarredStatus(this); return false;"></img>
</div>
<div class="card-text">
<div style="padding: 2px; margin: 0px;">
%10
</div>
%4
</div>
</div>
<div class="card-footer" style="text-align: center;">
%2, %5
</div>
</div>

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<skin version="0.20">
<author>
<name>Martin Rotter</name>
<email>rotter.martinos@gmail.com</email>
</author>
</skin>

View File

@ -0,0 +1,38 @@
/* This is Qt CSS theme file for the overall GUI of the application. */
QTreeView::branch:has-siblings:!adjoins-item {
border-image: url(qss/dummy.png) 0;
}
QTreeView::branch:has-siblings:adjoins-item {
border-image: url(qss/dummy.png) 0;
}
QTreeView::branch:!has-children:!has-siblings:adjoins-item {
border-image: url(qss/dummy.png) 0;
}
QTreeView::branch:has-children:!has-siblings:closed,
QTreeView::branch:closed:has-children:has-siblings {
border-image: none;
image: url(qss/branch-closed.png);
}
QTreeView::branch:open:has-children:!has-siblings,
QTreeView::branch:open:has-children:has-siblings {
border-image: none;
image: url(qss/branch-open.png);
}
QTreeView::item {
padding: 1px 1px 1px 1px;
}
QTreeView[hideTree="true"]::branch:!has-chlidren:hasSiblings {
border-image: none;
image: none;
}
QStatusBar::item {
border: none;
}

View File

@ -123,7 +123,8 @@
#define APP_QUIT_INSTANCE "-q" #define APP_QUIT_INSTANCE "-q"
#define APP_IS_RUNNING "app_is_running" #define APP_IS_RUNNING "app_is_running"
#define APP_SKIN_DEFAULT "base/vergilius.xml" #define APP_SKIN_DEFAULT "vergilius"
#define APP_SKIN_METADATA_FILE "metadata.xml"
#define APP_STYLE_DEFAULT "Fusion" #define APP_STYLE_DEFAULT "Fusion"
#define APP_THEME_DEFAULT "Faenza" #define APP_THEME_DEFAULT "Faenza"
#define APP_NO_THEME "" #define APP_NO_THEME ""

View File

@ -80,7 +80,7 @@ QString SkinFactory::selectedSkinName() const {
Skin SkinFactory::skinInfo(const QString &skin_name, bool *ok) const { Skin SkinFactory::skinInfo(const QString &skin_name, bool *ok) const {
Skin skin; Skin skin;
QFile skin_file(APP_SKIN_PATH + QDir::separator() + skin_name); QFile skin_file(APP_SKIN_PATH + QDir::separator() + skin_name + QDir::separator() + APP_SKIN_METADATA_FILE);
QDomDocument dokument; QDomDocument dokument;
if (!skin_file.open(QIODevice::Text | QIODevice::ReadOnly) || !dokument.setContent(&skin_file, true)) { if (!skin_file.open(QIODevice::Text | QIODevice::ReadOnly) || !dokument.setContent(&skin_file, true)) {
@ -94,7 +94,7 @@ Skin SkinFactory::skinInfo(const QString &skin_name, bool *ok) const {
const QDomNode skin_node = dokument.namedItem(QSL("skin")); const QDomNode skin_node = dokument.namedItem(QSL("skin"));
// Obtain visible skin name. // Obtain visible skin name.
skin.m_visibleName = skin_node.namedItem(QSL("name")).toElement().text(); skin.m_visibleName = skin_name;
// Obtain author. // Obtain author.
skin.m_author = skin_node.namedItem(QSL("author")).namedItem(QSL("name")).toElement().text(); skin.m_author = skin_node.namedItem(QSL("author")).namedItem(QSL("name")).toElement().text();
@ -106,10 +106,11 @@ Skin SkinFactory::skinInfo(const QString &skin_name, bool *ok) const {
skin.m_version = skin_node.attributes().namedItem(QSL("version")).toAttr().value(); skin.m_version = skin_node.attributes().namedItem(QSL("version")).toAttr().value();
// Obtain other information. // Obtain other information.
skin.m_baseName = QString(skin_name).replace(QDir::separator(), '/'); skin.m_baseName = skin_name;
// Obtain base folder. // Free resources.
const QString base_folder = skin.m_baseName.split(QL1C('/'), QString::SkipEmptyParts).at(0); skin_file.close();
skin_file.deleteLater();
// Here we use "/" instead of QDir::separator() because CSS2.1 url field // Here we use "/" instead of QDir::separator() because CSS2.1 url field
// accepts '/' as path elements separator. // accepts '/' as path elements separator.
@ -120,34 +121,22 @@ Skin SkinFactory::skinInfo(const QString &skin_name, bool *ok) const {
// replaced by fully absolute path and target file can // replaced by fully absolute path and target file can
// be safely loaded. // be safely loaded.
// Obtain layout markup wrapper. const QString base_folder = APP_SKIN_PATH + QDir::separator() + skin_name + QDir::separator();
skin.m_layoutMarkupWrapper = skin_node.namedItem(QSL("markup_wrapper")).toElement().text();
skin.m_layoutMarkupWrapper = QByteArray::fromBase64(skin.m_layoutMarkupWrapper.toLocal8Bit());
skin.m_layoutMarkupWrapper = skin.m_layoutMarkupWrapper.replace(QSL("##"), APP_SKIN_PATH + QL1S("/") + base_folder);
// Obtain enclosure image layout skin.m_layoutMarkupWrapper = QString::fromUtf8(IOFactory::readTextFile(base_folder + QL1S("html_wrapper.html")));
skin.m_enclosureImageMarkup = skin_node.namedItem(QSL("enclosure_image")).toElement().text(); skin.m_layoutMarkupWrapper = skin.m_layoutMarkupWrapper.replace(QSL("##"), APP_SKIN_PATH + QL1S("/") + skin_name);
skin.m_enclosureImageMarkup = QByteArray::fromBase64(skin.m_enclosureImageMarkup.toLocal8Bit());
skin.m_enclosureImageMarkup = skin.m_enclosureImageMarkup.replace(QSL("##"), APP_SKIN_PATH + QL1S("/") + base_folder);
// Obtain layout markup. skin.m_enclosureImageMarkup = QString::fromUtf8(IOFactory::readTextFile(base_folder + QL1S("html_enclosure_image.html")));
skin.m_layoutMarkup = skin_node.namedItem(QSL("markup")).toElement().text(); skin.m_enclosureImageMarkup = skin.m_enclosureImageMarkup.replace(QSL("##"), APP_SKIN_PATH + QL1S("/") + skin_name);
skin.m_layoutMarkup = QByteArray::fromBase64(skin.m_layoutMarkup.toLocal8Bit());
skin.m_layoutMarkup = skin.m_layoutMarkup.replace(QSL("##"), APP_SKIN_PATH + QL1S("/") + base_folder);
// Obtain enclosure hyperlink wrapper. skin.m_layoutMarkup = QString::fromUtf8(IOFactory::readTextFile(base_folder + QL1S("html_single_message.html")));
skin.m_enclosureMarkup = skin_node.namedItem(QSL("markup_enclosure")).toElement().text(); skin.m_layoutMarkup = skin.m_layoutMarkup.replace(QSL("##"), APP_SKIN_PATH + QL1S("/") + skin_name);
skin.m_enclosureMarkup = QByteArray::fromBase64(skin.m_enclosureMarkup.toLocal8Bit());
skin.m_enclosureMarkup = skin.m_enclosureMarkup.replace(QSL("##"), APP_SKIN_PATH + QL1S("/") + base_folder);
// Obtain skin raw data. skin.m_enclosureMarkup = QString::fromUtf8(IOFactory::readTextFile(base_folder + QL1S("html_enclosure_every.html")));
skin.m_rawData = skin_node.namedItem(QSL("data")).toElement().text(); skin.m_enclosureMarkup = skin.m_enclosureMarkup.replace(QSL("##"), APP_SKIN_PATH + QL1S("/") + skin_name);
skin.m_rawData = QByteArray::fromBase64(skin.m_rawData.toLocal8Bit());
skin.m_rawData = skin.m_rawData.replace(QSL("##"), APP_SKIN_PATH + QL1S("/") + base_folder);
// Free resources. skin.m_rawData = QString::fromUtf8(IOFactory::readTextFile(base_folder + QL1S("theme.css")));
skin_file.close(); skin.m_rawData = skin.m_rawData.replace(QSL("##"), APP_SKIN_PATH + QL1S("/") + skin_name);
skin_file.deleteLater();
if (ok != nullptr) { if (ok != nullptr) {
*ok = !skin.m_author.isEmpty() && !skin.m_version.isEmpty() && *ok = !skin.m_author.isEmpty() && !skin.m_version.isEmpty() &&
@ -167,17 +156,10 @@ QList<Skin> SkinFactory::installedSkins() const {
QDir::Readable); QDir::Readable);
foreach (const QString &base_directory, skin_directories) { foreach (const QString &base_directory, skin_directories) {
// Check skins installed in this base directory. const Skin skin_info = skinInfo(base_directory, &skin_load_ok);
const QStringList skin_files = QDir(APP_SKIN_PATH + QDir::separator() + base_directory).entryList(QStringList() << QSL("*.xml"),
QDir::Files | QDir::Readable | QDir::NoDotAndDotDot | QDir::NoSymLinks);
foreach (const QString &skin_file, skin_files) { if (skin_load_ok) {
// Check if skin file is valid and add it if it is valid. skins.append(skin_info);
const Skin skin_info = skinInfo(base_directory + QDir::separator() + skin_file, &skin_load_ok);
if (skin_load_ok) {
skins.append(skin_info);
}
} }
} }