Krita Source Code Documentation
Loading...
Searching...
No Matches
KisTemplateTree Class Reference

#include <KisTemplateTree.h>

Public Member Functions

bool add (KisTemplateGroup *g)
 
KisTemplateGroupdefaultGroup () const
 
KisTemplatedefaultTemplate () const
 
KisTemplateGroupfind (const QString &name) const
 
QList< KisTemplateGroup * > groups () const
 
 KisTemplateTree (const QString &templatesResourcePath, bool readTree=false)
 
void readTemplateTree ()
 
QString templatesResourcePath () const
 
void writeTemplateTree ()
 
 ~KisTemplateTree ()
 

Private Member Functions

void readGroups ()
 
void readTemplates ()
 
void writeTemplate (KisTemplate *t, KisTemplateGroup *group, const QString &localDir)
 

Private Attributes

KisTemplateGroupm_defaultGroup
 
KisTemplatem_defaultTemplate
 
QList< KisTemplateGroup * > m_groups
 
QString m_templatesResourcePath
 

Detailed Description

Definition at line 18 of file KisTemplateTree.h.

Constructor & Destructor Documentation

◆ KisTemplateTree()

KisTemplateTree::KisTemplateTree ( const QString & templatesResourcePath,
bool readTree = false )

Definition at line 36 of file KisTemplateTree.cpp.

41{
42 if (readTree)
44}
KisTemplateGroup * m_defaultGroup
QString templatesResourcePath() const
KisTemplate * m_defaultTemplate
QString m_templatesResourcePath

References readTemplateTree().

◆ ~KisTemplateTree()

KisTemplateTree::~KisTemplateTree ( )

Definition at line 46 of file KisTemplateTree.cpp.

47{
48 qDeleteAll(m_groups);
49}
QList< KisTemplateGroup * > m_groups

References m_groups.

Member Function Documentation

◆ add()

bool KisTemplateTree::add ( KisTemplateGroup * g)

Definition at line 106 of file KisTemplateTree.cpp.

107{
108
109 KisTemplateGroup *group = find(g->name());
110 if (group == 0) {
111 m_groups.append(g);
112 return true;
113 }
114
115 group->addDir(g->dirs().first()); // "...there can be only one..." (Queen)
116 delete g;
117 g = 0;
118 return false;
119}
QString name() const
QStringList dirs() const
void addDir(const QString &dir)
KisTemplateGroup * find(const QString &name) const

References KisTemplateGroup::addDir(), KisTemplateGroup::dirs(), find(), m_groups, and KisTemplateGroup::name().

◆ defaultGroup()

KisTemplateGroup * KisTemplateTree::defaultGroup ( ) const
inline

Definition at line 35 of file KisTemplateTree.h.

35 {
36 return m_defaultGroup;
37 }

◆ defaultTemplate()

KisTemplate * KisTemplateTree::defaultTemplate ( ) const
inline

Definition at line 38 of file KisTemplateTree.h.

38 {
39 return m_defaultTemplate;
40 }

◆ find()

KisTemplateGroup * KisTemplateTree::find ( const QString & name) const

Definition at line 121 of file KisTemplateTree.cpp.

122{
124 KisTemplateGroup* ret = 0;
125
126 while (it != m_groups.end()) {
127 if ((*it)->name() == name) {
128 ret = *it;
129 break;
130 }
131
132 ++it;
133 }
134
135 return ret;
136}

References m_groups.

◆ groups()

QList< KisTemplateGroup * > KisTemplateTree::groups ( ) const
inline

Definition at line 42 of file KisTemplateTree.h.

42{ return m_groups; }

◆ readGroups()

void KisTemplateTree::readGroups ( )
private

Definition at line 138 of file KisTemplateTree.cpp.

139{
140
141 QStringList dirs = KoResourcePaths::findDirs("templates");
142
143 Q_FOREACH (const QString & dirName, dirs) {
144 if (!dirName.contains("templates")) continue; // Hack around broken KoResourcePaths
145 QDir dir(dirName);
146 // avoid the annoying warning
147 if (!dir.exists())
148 continue;
149 QStringList templateDirs = dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
150
151
152 Q_FOREACH (const QString & templateDirName, templateDirs) {
153 QDir templateDir(dirName + "/" + templateDirName);
154 QString name = templateDirName;
155 QString defaultTab;
156 int sortingWeight = 1000;
157 if (templateDir.exists(".directory")) {
158 KDesktopFile config(templateDir.absoluteFilePath(".directory"));
159 config.setLocale(currentLocale());
160 KConfigGroup dg = config.desktopGroup();
161 name = dg.readEntry("Name");
162 defaultTab = dg.readEntry("X-KDE-DefaultTab");
163 sortingWeight = dg.readEntry("X-KDE-SortingWeight", 1000);
164 }
165 KisTemplateGroup *g = new KisTemplateGroup(name, templateDir.absolutePath() + '/', sortingWeight);
166 if (add(g)) {
167 if (defaultTab == "true") {
168 m_defaultGroup = g;
169 }
170 }
171 }
172 }
173}
static QString currentLocale()
bool add(KisTemplateGroup *g)
static QStringList findDirs(const QString &type)
const char * name(StandardAction id)

References add(), currentLocale(), KoResourcePaths::findDirs(), and m_defaultGroup.

◆ readTemplates()

void KisTemplateTree::readTemplates ( )
private

Definition at line 175 of file KisTemplateTree.cpp.

176{
177 QString dontShow = "imperial";
178 if ( QLocale().measurementSystem() == QLocale::ImperialSystem) {
179 dontShow = "metric";
180 }
181
182 Q_FOREACH (KisTemplateGroup* group, m_groups) {
183 QStringList dirs = group->dirs();
184 for (QStringList::ConstIterator it = dirs.constBegin(); it != dirs.constEnd(); ++it) {
185 QDir d(*it);
186 if (!d.exists())
187 continue;
188 QStringList files = d.entryList(QDir::Files | QDir::Readable, QDir::Name);
189 for (int i = 0; i < files.count(); ++i) {
190 QString filePath = *it + files[i];
191 //dbgUI <<"filePath:" << filePath;
192 QString icon;
193 QString text;
194 QString description;
195 QString hidden_str;
196 QString fileName;
197 bool hidden = false;
198 bool defaultTemplate = false;
199 QString templatePath;
200 QString measureSystem;
201 // If a desktop file, then read the name from it.
202 // Otherwise (or if no name in it?) use file name
203 if (KDesktopFile::isDesktopFile(filePath)) {
204 KConfig _config(filePath, KConfig::SimpleConfig);
205 _config.setLocale(currentLocale());
206 KConfigGroup config(&_config, "Desktop Entry");
207 if (config.readEntry("Type") == "Link") {
208 text = config.readEntry("Name");
209 fileName = filePath;
210 description = config.readEntry("Comment");
211 //dbgUI <<"name:" << text;
212 icon = config.readEntry("Icon");
213 if (icon[0] != '/' && // allow absolute paths for icons
214 QFile::exists(*it + icon)) // allow icons from icontheme
215 icon = *it + icon;
216 //dbgUI <<"icon2:" << icon;
217 hidden = config.readEntry("X-KDE-Hidden", false);
218 defaultTemplate = config.readEntry("X-KDE-DefaultTemplate", false);
219 measureSystem = config.readEntry("X-KDE-MeasureSystem").toLower();
220
221 // Don't add a template that is for the wrong measure system
222 if (measureSystem == dontShow)
223 continue;
224
225 //dbgUI <<"hidden:" << hidden_str;
226 templatePath = config.readPathEntry("URL", QString());
227 //dbgUI <<"Link to :" << templatePath;
228 if (templatePath[0] != '/') {
229 if (templatePath.left(6) == "file:/") // I doubt this will happen
230 templatePath = templatePath.right(templatePath.length() - 6);
231 //else
232 // dbgUI <<"dirname=" << *it;
233 templatePath = *it + templatePath;
234 //dbgUI <<"templatePath:" << templatePath;
235 }
236 } else
237 continue; // Invalid
238 }
239 // The else if and the else branch are here for compat. with the old system
240 else if (files[i].right(4) != ".png")
241 // Ignore everything that is not a PNG file
242 continue;
243 else {
244 // Found a PNG file - the template must be here in the same dir.
245 icon = filePath;
246 QFileInfo fi(filePath);
247 text = fi.completeBaseName();
248 templatePath = filePath; // Note that we store the .png file as the template !
249 // That's the way it's always been done. Then the app replaces the extension...
250 }
251 KisTemplate *t = new KisTemplate(text, description, templatePath, icon, fileName,
252 measureSystem, hidden);
253 group->add(t, false, false); // false -> we aren't a "user", false -> don't
254 // "touch" the group to avoid useless
255 // creation of dirs in .kde/blah/...
256 if (defaultTemplate)
258 }
259 }
260 }
261}
bool add(KisTemplate *t, bool force=false, bool touch=true)
KisTemplate * defaultTemplate() const

References KisTemplateGroup::add(), currentLocale(), defaultTemplate(), KisTemplateGroup::dirs(), m_defaultTemplate, and m_groups.

◆ readTemplateTree()

void KisTemplateTree::readTemplateTree ( )

Definition at line 51 of file KisTemplateTree.cpp.

52{
53 readGroups();
55}

References readGroups(), and readTemplates().

◆ templatesResourcePath()

QString KisTemplateTree::templatesResourcePath ( ) const
inline

Definition at line 26 of file KisTemplateTree.h.

26 {
28 }

◆ writeTemplate()

void KisTemplateTree::writeTemplate ( KisTemplate * t,
KisTemplateGroup * group,
const QString & localDir )
private

Definition at line 263 of file KisTemplateTree.cpp.

265{
266 QString fileName;
267 if (t->isHidden()) {
268 fileName = t->fileName();
269 // try to remove the file
270 if (QFile::remove(fileName) || !QFile::exists(fileName)) {
271 QFile::remove(t->name());
272 QFile::remove(t->picture());
273 return;
274 }
275 }
276 // be sure that the template's file name is unique so we don't overwrite another
277 QString const path = localDir + group->name() + '/';
278 QString const name = KisTemplates::trimmed(t->name());
279 fileName = path + name + ".desktop";
280 if (t->isHidden() && QFile::exists(fileName))
281 return;
282 QString fill;
283 while (QFile(fileName).exists()) {
284 fill += '_';
285 fileName = path + fill + name + ".desktop";
286 }
287
288 KConfig _config(fileName, KConfig::SimpleConfig);
289 _config.setLocale(currentLocale());
290 KConfigGroup config(&_config, "Desktop Entry");
291 config.writeEntry("Type", "Link");
292 config.writePathEntry("URL", t->file());
293 config.writeEntry("Name", t->name());
294 config.writeEntry("Icon", t->picture());
295 config.writeEntry("X-KDE-Hidden", t->isHidden());
296}
QString picture() const
Definition KisTemplate.h:37
QString name() const
Definition KisTemplate.h:28
QString file() const
Definition KisTemplate.h:34
QString fileName() const
Definition KisTemplate.h:40
bool isHidden() const
Definition KisTemplate.h:45
QString trimmed(const QString &string)

References currentLocale(), KisTemplate::file(), KisTemplate::fileName(), KisTemplate::isHidden(), KisTemplate::name(), KisTemplateGroup::name(), KisTemplate::picture(), and KisTemplates::trimmed().

◆ writeTemplateTree()

void KisTemplateTree::writeTemplateTree ( )

Definition at line 57 of file KisTemplateTree.cpp.

58{
59 QString localDir = KoResourcePaths::saveLocation("templates");
60
61 Q_FOREACH (KisTemplateGroup *group, m_groups) {
62 //dbgUI <<"---------------------------------";
63 //dbgUI <<"group:" << group->name();
64
65 bool touched = false;
66 QList<KisTemplate*> templates = group->templates();
67 QList<KisTemplate*>::iterator it = templates.begin();
68 for (; it != templates.end() && !touched && !group->touched(); ++it)
69 touched = (*it)->touched();
70
71 if (group->touched() || touched) {
72 //dbgUI <<"touched";
73 if (!group->isHidden()) {
74 //dbgUI <<"not hidden";
75 QDir path;
76 path.mkpath(localDir + group->name()); // create the local group dir
77 } else {
78 //dbgUI <<"hidden";
79 if (group->dirs().count() == 1 && group->dirs().contains(localDir)) {
80 //dbgUI <<"local only";
81 QFile f(group->dirs().first());
82 f.remove();
83 //dbgUI <<"removing:" << group->dirs().first();
84 } else {
85 //dbgUI <<"global";
86 QDir path;
87 path.mkpath(localDir + group->name());
88 }
89 }
90 }
91 Q_FOREACH (KisTemplate *t, templates) {
92 if (t->touched()) {
93 //dbgUI <<"++template:" << t->name();
94 writeTemplate(t, group, localDir);
95 }
96 if (t->isHidden() && t->touched()) {
97 //dbgUI <<"+++ delete local template ##############";
98 writeTemplate(t, group, localDir);
99 QFile::remove(t->file());
100 QFile::remove(t->picture());
101 }
102 }
103 }
104}
QList< KisTemplate * > templates() const
bool touched() const
bool isHidden() const
If all children are hidden, we are hidden too.
void writeTemplate(KisTemplate *t, KisTemplateGroup *group, const QString &localDir)
bool touched() const
Definition KisTemplate.h:52
static QString saveLocation(const QString &type, const QString &suffix=QString(), bool create=true)

References KisTemplateGroup::dirs(), KisTemplate::file(), KisTemplate::isHidden(), KisTemplateGroup::isHidden(), m_groups, KisTemplateGroup::name(), KisTemplate::picture(), KoResourcePaths::saveLocation(), KisTemplateGroup::templates(), KisTemplate::touched(), KisTemplateGroup::touched(), and writeTemplate().

Member Data Documentation

◆ m_defaultGroup

KisTemplateGroup* KisTemplateTree::m_defaultGroup
private

Definition at line 52 of file KisTemplateTree.h.

◆ m_defaultTemplate

KisTemplate* KisTemplateTree::m_defaultTemplate
private

Definition at line 53 of file KisTemplateTree.h.

◆ m_groups

QList<KisTemplateGroup*> KisTemplateTree::m_groups
private

Definition at line 51 of file KisTemplateTree.h.

◆ m_templatesResourcePath

QString KisTemplateTree::m_templatesResourcePath
private

Definition at line 50 of file KisTemplateTree.h.


The documentation for this class was generated from the following files: