diff --git a/resources/skins/base/plain.xml b/resources/skins/base/plain.xml
index 1b60a5667..2cd28f993 100644
--- a/resources/skins/base/plain.xml
+++ b/resources/skins/base/plain.xml
@@ -6,5 +6,8 @@
rotter.martinos@gmail.com
+
+ %1 %4
+
\ No newline at end of file
diff --git a/src/core/defs.h.in b/src/core/defs.h.in
index 3bf8be0b2..13598b4fc 100644
--- a/src/core/defs.h.in
+++ b/src/core/defs.h.in
@@ -37,6 +37,7 @@
#define APP_CFG_CUTS "keyboard"
#define APP_CFG_BROWSER "browser"
+#define APP_HTML_MARKUP "styled_pattern.html"
#define APP_DB_PATH "data/storage/database.db"
#define APP_PREFIX "@CMAKE_INSTALL_PREFIX@"
#define APP_REVISION "@APP_REVISION@"
diff --git a/src/core/textfactory.h b/src/core/textfactory.h
index e6d5f3ad9..3644dd130 100644
--- a/src/core/textfactory.h
+++ b/src/core/textfactory.h
@@ -10,7 +10,6 @@ class TextFactory {
virtual ~TextFactory();
static QString shorten(const QString &input);
-
};
#endif // TEXTFACTORY_H
diff --git a/src/gui/basewebview.cpp b/src/gui/basewebview.cpp
index 16a0b965f..06a097d4d 100644
--- a/src/gui/basewebview.cpp
+++ b/src/gui/basewebview.cpp
@@ -1,6 +1,8 @@
#include
#include
#include
+#include
+#include
#include
#include
@@ -8,6 +10,7 @@
#include "core/settings.h"
#include "core/basewebpage.h"
#include "gui/basewebview.h"
+#include "gui/skinfactory.h"
#include "gui/iconthemefactory.h"
@@ -96,10 +99,12 @@ void BaseWebView::initializeActions() {
}
void BaseWebView::displayErrorPage() {
- // TODO: Add better custom error page. Custom htmls are now copied during
- // "make install" to APP_HTML_PATH. It is needed to setup css absolute
- // path by replacing "##" with APP_HTML_PATH/css in "compact_text.html".
- setHtml("error", url());
+ // TODO: Add better custom error page.
+ setHtml(SkinFactory::getInstance()->getCurrentMarkup().arg(tr("Page not found"),
+ "bbb",
+ "ccc",
+ "ddd",
+ "eee"));
}
void BaseWebView::popupContextMenu(const QPoint &pos) {
diff --git a/src/gui/basewebview.h b/src/gui/basewebview.h
index 2496a6c3f..561c8d118 100644
--- a/src/gui/basewebview.h
+++ b/src/gui/basewebview.h
@@ -42,6 +42,7 @@ class BaseWebView : public QWebView {
void popupContextMenu(const QPoint &pos);
protected:
+ // Initializes all actions.
void initializeActions();
// Creates necessary connections.
diff --git a/src/gui/skinfactory.cpp b/src/gui/skinfactory.cpp
index 08ca9b19f..e86de57fa 100644
--- a/src/gui/skinfactory.cpp
+++ b/src/gui/skinfactory.cpp
@@ -11,8 +11,8 @@
QPointer SkinFactory::s_instance;
-SkinFactory::SkinFactory(QObject *parent)
- : QObject(parent), m_currentSkin(APP_THEME_SYSTEM) {
+SkinFactory::SkinFactory(QObject *parent) : QObject(parent) {
+ m_currentSkin = generateDefaultSkin();
}
SkinFactory::~SkinFactory() {
@@ -29,14 +29,18 @@ SkinFactory *SkinFactory::getInstance() {
void SkinFactory::loadCurrentSkin() {
QString skin_name_from_settings = getSelectedSkinName();
- bool loaded = false;
- Skin skin_data = getSkinInfo(skin_name_from_settings, &loaded);
if (skin_name_from_settings == APP_THEME_SYSTEM) {
- // NOTE: No need to call qApp->setStylesheet(QString()) here.
+ // User selected default skin for loading.
+ // NOTE: No need to do anything here.
qDebug("'Default system skin' loaded.");
+ return;
}
- else if (loaded) {
+
+ bool skin_parsed;
+ Skin skin_data = getSkinInfo(skin_name_from_settings, &skin_parsed);
+
+ if (skin_parsed) {
loadSkinFromData(skin_data.m_rawData, skin_name_from_settings);
foreach (QString style, skin_data.m_stylesNames) {
@@ -46,7 +50,8 @@ void SkinFactory::loadCurrentSkin() {
}
}
- m_currentSkin = skin_name_from_settings;
+ // Set this 'Skin' object as active one.
+ m_currentSkin = skin_data;
qDebug("Skin '%s' loaded.", qPrintable(skin_name_from_settings));
}
@@ -56,6 +61,21 @@ void SkinFactory::loadCurrentSkin() {
}
}
+Skin SkinFactory::generateDefaultSkin() {
+ Skin default_skin;
+
+ default_skin.m_author = "-";
+ default_skin.m_baseName = APP_THEME_SYSTEM;
+ default_skin.m_email = "-";
+ default_skin.m_version = "-";
+ default_skin.m_visibleName = tr("default system skin");
+
+ // NOTE: Used http://www.htmlcompressor.com/compressor/ for compression.
+ default_skin.m_layoutMarkup = " %1 %4
";
+
+ return default_skin;
+}
+
bool SkinFactory::loadSkinFromData(QString skin_data, const QString &skin_path) {
QStringList skin_parts = skin_path.split('/', QString::SkipEmptyParts);
@@ -95,27 +115,30 @@ QString SkinFactory::getSelectedSkinName() {
}
QString SkinFactory::getCurrentSkinName() {
- return m_currentSkin;
+ return m_currentSkin.m_baseName;
}
-Skin SkinFactory::getSkinInfo(const QString &skin_name, bool *ok) {
- Skin skin;
+QString SkinFactory::getCurrentMarkup() {
+ return m_currentSkin.m_layoutMarkup;
+}
+Skin SkinFactory::getSkinInfo(const QString &skin_name, bool *ok) {
if (skin_name == APP_THEME_SYSTEM) {
- skin.m_author = "-";
- skin.m_baseName = APP_THEME_SYSTEM;
- skin.m_email = "-";
- skin.m_version = "-";
- skin.m_visibleName = tr("default system skin");
-
if (ok != NULL) {
*ok = true;
}
- return skin;
+ if (m_currentSkin.m_baseName == APP_THEME_SYSTEM) {
+ return m_currentSkin;
+ }
+ else {
+ return generateDefaultSkin();
+ }
}
+ Skin skin;
QXmlQuery query;
+ QString styles;
QFile skin_file(APP_SKIN_PATH + QDir::separator() + skin_name);
if (!skin_file.open(QIODevice::ReadOnly) || !query.setFocus(&skin_file)) {
@@ -136,7 +159,6 @@ Skin SkinFactory::getSkinInfo(const QString &skin_name, bool *ok) {
// Obtain style name.
query.setQuery("string(/skin/style)");
- QString styles;
query.evaluateTo(&styles);
skin.m_stylesNames = styles.remove("\n").split(",");
@@ -155,6 +177,10 @@ Skin SkinFactory::getSkinInfo(const QString &skin_name, bool *ok) {
query.evaluateTo(&skin.m_version);
skin.m_version = skin.m_version.remove("\n");
+ // Obtain layout markup.
+ query.setQuery("string(/skin/markup)");
+ query.evaluateTo(&skin.m_layoutMarkup);
+
// Obtain other information.
skin.m_baseName = skin_name;
@@ -174,7 +200,7 @@ Skin SkinFactory::getSkinInfo(const QString &skin_name, bool *ok) {
QList SkinFactory::getInstalledSkins() {
QList skins;
- skins.append(getSkinInfo(APP_THEME_SYSTEM));
+ skins.append(generateDefaultSkin());
bool skin_load_ok;
QStringList skin_directories = QDir(APP_SKIN_PATH).entryList(QDir::Dirs |
diff --git a/src/gui/skinfactory.h b/src/gui/skinfactory.h
index c6e0db8f2..f9e6c8451 100644
--- a/src/gui/skinfactory.h
+++ b/src/gui/skinfactory.h
@@ -15,6 +15,7 @@ struct Skin {
QString m_email;
QString m_version;
QString m_rawData;
+ QString m_layoutMarkup;
};
Q_DECLARE_METATYPE(Skin)
@@ -30,6 +31,9 @@ class SkinFactory : public QObject {
// external resources.
bool loadSkinFromData(QString skin_data, const QString &skin_path);
+ // Generates "default" skin.
+ Skin generateDefaultSkin();
+
public:
// Singleton getter.
static SkinFactory *getInstance();
@@ -40,10 +44,13 @@ class SkinFactory : public QObject {
// Loads skin name from settings and sets it as active.
void loadCurrentSkin();
- // Return the name of the currently activated skin.
+ // Returns the name of the currently activated skin.
// NOTE: Skin name is formatted as "/.xml".
QString getCurrentSkinName();
+ // Returns contents of current layout markup.
+ QString getCurrentMarkup();
+
// Returns the name of the skin, that should be activated
// after application restart.
QString getSelectedSkinName();
@@ -60,7 +67,7 @@ class SkinFactory : public QObject {
private:
// Holds name of the current skin.
- QString m_currentSkin;
+ Skin m_currentSkin;
// Singleton.
static QPointer s_instance;