7 #include "grantleetheme.h" 8 #include "grantleetheme_p.h" 9 #include "grantleetheme_debug.h" 10 #include "grantleethemeengine.h" 11 #include <config-grantleetheme.h> 12 #include "qtresourcetemplateloader.h" 15 #include <KConfigGroup> 16 #include <KLocalizedString> 19 #include <QSharedPointer> 24 Grantlee::Engine *GrantleeTheme::ThemePrivate::sEngine =
nullptr;
26 ThemePrivate::ThemePrivate()
31 ThemePrivate::ThemePrivate(
const ThemePrivate &other)
33 , displayExtraVariables(other.displayExtraVariables)
34 , themeFileName(other.themeFileName)
35 , description(other.description)
37 , dirName(other.dirName)
38 , absolutePaths(other.absolutePaths)
39 , author(other.author)
41 , loader(other.loader)
45 ThemePrivate::~ThemePrivate()
49 void ThemePrivate::setupEngine()
54 void ThemePrivate::setupLoader()
59 for (
const QString &absolutePath : qAsConst(absolutePaths)) {
62 templatePaths <<
dir.absolutePath();
66 loader->setTemplateDirs(templatePaths);
67 loader->setTheme(dirName);
70 ThemePrivate::setupEngine();
72 sEngine->addTemplateLoader(loader);
75 Grantlee::Context ThemePrivate::createContext(
const QVariantHash &data,
const QByteArray &applicationDomain)
80 sLocalizer->setApplicationDomain(applicationDomain);
81 Grantlee::Context ctx(data);
82 ctx.setLocalizer(sLocalizer);
86 QString ThemePrivate::errorTemplate(
const QString &reason,
const QString &origTemplateName,
const Grantlee::Template &failedTemplate)
88 Grantlee::Template tpl = sEngine->newTemplate(
89 QStringLiteral(
"<h1>{{ error }}</h1>\n" 90 "<b>%1:</b> {{ templateName }}<br>\n" 91 "<b>%2:</b> {{ errorMessage }}")
92 .arg(
i18n(
"Template"),
i18n(
"Error message")),
93 QStringLiteral(
"TemplateError"));
95 Grantlee::Context ctx = createContext();
96 ctx.insert(QStringLiteral(
"error"), reason);
97 ctx.insert(QStringLiteral(
"templateName"), origTemplateName);
98 const QString errorString = failedTemplate
99 ? failedTemplate->errorString()
100 :
i18n(
"(null template)");
101 ctx.insert(QStringLiteral(
"errorMessage"), errorString);
102 return tpl->render(&ctx);
106 : d(new ThemePrivate)
110 Theme::Theme(
const QString &themePath,
const QString &dirName,
const QString &defaultDesktopFileName)
111 : d(new ThemePrivate)
115 KConfigGroup group(&config, QStringLiteral(
"Desktop Entry"));
116 if (group.isValid()) {
117 d->dirName = dirName;
118 d->absolutePaths.
append(themePath);
119 d->name = group.readEntry(
"Name",
QString());
120 d->description = group.readEntry(
"Description",
QString());
121 d->themeFileName = group.readEntry(
"FileName",
QString());
122 d->displayExtraVariables = group.readEntry(
"DisplayExtraVariables",
QStringList());
126 Theme::Theme(
const Theme &other)
135 bool Theme::operator==(
const Theme &other)
const 137 return isValid() && other.isValid() && d->absolutePaths == other.d->absolutePaths;
142 if (
this != &other) {
149 bool Theme::isValid()
const 151 return !d->themeFileName.isEmpty() && !d->name.isEmpty();
154 QString Theme::description()
const 156 return d->description;
159 QString Theme::themeFilename()
const 161 return d->themeFileName;
171 return d->displayExtraVariables;
179 QString Theme::absolutePath()
const 181 if (!d->absolutePaths.isEmpty()) {
182 return d->absolutePaths.
at(0);
192 QString Theme::authorEmail()
const 197 void Theme::addThemePath(
const QString &path)
199 d->absolutePaths.
append(path);
209 if (!d->loader->canLoadTemplate(templateName)) {
210 qCWarning(GRANTLEETHEME_LOG) <<
"Cannot load template" << templateName <<
", please check your installation. Tried in these dirs:" << d->loader->templateDirs();
214 Grantlee::Template tpl = d->loader->loadByName(templateName, ThemePrivate::sEngine);
215 if (!tpl || tpl->error()) {
216 return d->errorTemplate(
i18n(
"Template parsing error"), templateName, tpl);
219 Grantlee::Context ctx = d->createContext(data, applicationDomain);
220 const QString result = tpl->render(&ctx);
222 return d->errorTemplate(
i18n(
"Template rendering error"), templateName, tpl);
228 void Theme::addPluginPath(
const QString &path)
230 if (!ThemePrivate::sEngine) {
231 ThemePrivate::setupEngine();
234 QStringList paths = ThemePrivate::sEngine->pluginPaths();
237 ThemePrivate::sEngine->setPluginPaths(paths);
The GrantleeKi18nLocalizer class.
QString & append(QChar ch)
QSharedPointer< T > create(Args &&...args)
bool contains(const QString &str, Qt::CaseSensitivity cs) const const
KSharedConfigPtr config()
QString i18n(const char *text, const TYPE &arg...)
KIOFILEWIDGETS_EXPORT QString dir(const QString &fileClass)
const QChar at(int position) const const
void prepend(const T &value)