Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_meta_data_store.cc
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2007 Cyrille Berger <cberger@cberger.net>
3 *
4 * SPDX-License-Identifier: LGPL-2.1-or-later
5 */
6
8
9#include <QStringList>
10
11#include <kis_debug.h>
12
13#include "kis_meta_data_entry.h"
17#include "kis_meta_data_value.h"
18
19using namespace KisMetaData;
20
21uint qHash(const Entry& e)
22{
23 return qHash(e.qualifiedName());
24}
25
26struct Q_DECL_HIDDEN Store::Private {
27 QHash<QString, Entry> entries;
28};
29
30Store::Store() : d(new Private)
31{
32
33}
34
35Store::Store(const Store& s) : d(new Private(*s.d))
36{
37 // TODO: reaffect all schemas
38}
39
41{
42 delete d;
43}
44
45void Store::copyFrom(const Store* store)
46{
47 for (QHash<QString, Entry>::const_iterator entryIt = store->begin();
48 entryIt != store->end(); ++entryIt) {
49 const Entry& entry = entryIt.value();
50 if (entry.value().type() != KisMetaData::Value::Invalid) {
51 if (containsEntry(entry.qualifiedName())) {
52 getEntry(entry.qualifiedName()).value() = entry.value();
53 } else {
54 addEntry(entry);
55 }
56 }
57 }
58}
59
60bool Store::addEntry(const Entry& entry)
61{
62 Q_ASSERT(!entry.name().isEmpty());
63 if (d->entries.contains(entry.qualifiedName()) && d->entries[entry.qualifiedName()].isValid()) {
64 dbgMetaData << "Entry" << entry.qualifiedName() << " already exists in the store, cannot be included twice";
65 return false;
66 }
67 d->entries.insert(entry.qualifiedName(), entry);
68 return true;
69}
70
71bool Store::empty() const
72{
73 return d->entries.isEmpty();
74}
75
76bool Store::isEmpty() const
77{
78 return d->entries.isEmpty();
79}
80
81bool Store::containsEntry(const QString & entryKey) const
82{
83 return d->entries.contains(entryKey);
84}
85
86bool Store::containsEntry(const QString & uri, const QString & entryName) const
87{
88 const Schema* schema = SchemaRegistry::instance()->schemaFromUri(uri);
89 return containsEntry(schema->generateQualifiedName(entryName));
90}
91
92bool Store::containsEntry(const KisMetaData::Schema* schema, const QString & entryName) const
93{
94 if (schema) {
95 return containsEntry(schema->generateQualifiedName(entryName));
96 }
97 return false;
98}
99
100Entry& Store::getEntry(const QString & entryKey)
101{
102 if (!d->entries.contains(entryKey)) {
103 QStringList splitKey = entryKey.split(':');
104 QString prefix = splitKey[0];
105 splitKey.pop_front();
106 d->entries[entryKey] = Entry(SchemaRegistry::instance()->schemaFromPrefix(prefix),
107 splitKey.join(":"),
108 Value());
109 }
110 return d->entries [entryKey];
111}
112
113Entry& Store::getEntry(const QString & uri, const QString & entryName)
114{
115 const Schema* schema = SchemaRegistry::instance()->schemaFromUri(uri);
116 Q_ASSERT(schema);
117 return getEntry(schema, entryName);
118}
119
120Entry& Store::getEntry(const KisMetaData::Schema* schema, const QString & entryName)
121{
122 return getEntry(schema->generateQualifiedName(entryName));
123}
124
125
126const Entry& Store::getEntry(const QString & entryKey) const
127{
128 return d->entries[entryKey];
129}
130
131const Entry& Store::getEntry(const QString & uri, const QString & entryName) const
132{
133 const Schema* schema = SchemaRegistry::instance()->schemaFromUri(uri);
134 Q_ASSERT(schema);
135 return getEntry(schema, entryName);
136}
137
138const Entry& Store::getEntry(const KisMetaData::Schema* schema, const QString & entryName) const
139{
140 return getEntry(schema->generateQualifiedName(entryName));
141}
142
143void Store::removeEntry(const QString & entryKey)
144{
145 d->entries.remove(entryKey);
146}
147
148void Store::removeEntry(const QString & uri, const QString & entryName)
149{
150 const Schema* schema = SchemaRegistry::instance()->schemaFromUri(uri);
151 Q_ASSERT(schema);
152 removeEntry(schema, entryName);
153}
154
155void Store::removeEntry(const KisMetaData::Schema* schema, const QString & entryName)
156{
157 removeEntry(schema->generateQualifiedName(entryName));
158}
159
160const Value& Store::getValue(const QString & uri, const QString & entryName) const
161{
162 return getEntry(uri, entryName).value();
163}
164
165QHash<QString, Entry>::const_iterator Store::begin() const
166{
167 return d->entries.constBegin();
168}
169
170QHash<QString, Entry>::const_iterator Store::end() const
171{
172 return d->entries.constEnd();
173}
174
176{
177 dbgMetaData << "=== Dumping MetaData Store ===";
178 dbgMetaData << " - Metadata (there are" << d->entries.size() << " entries)";
179 Q_FOREACH (const Entry& e, d->entries) {
180 if (e.isValid()) {
181 dbgMetaData << e;
182 } else {
183 dbgMetaData << "Invalid entry";
184 }
185 }
186}
187
189{
190 dbgMetaData << "Apply " << filters.size() << " filters";
191 Q_FOREACH (const Filter* filter, filters) {
192 filter->filter(this);
193 }
194}
195
197{
198 return d->entries.keys();
199}
200
202{
203 return d->entries.values();
204}
unsigned int uint
QString name() const
const KisMetaData::Value & value() const
QString qualifiedName() const
virtual void filter(KisMetaData::Store *) const =0
static KisMetaData::SchemaRegistry * instance()
const Schema * schemaFromUri(const QString &uri) const
QString generateQualifiedName(const QString &) const
QHash< QString, Entry >::const_iterator end() const
void copyFrom(const Store *store)
QHash< QString, Entry >::const_iterator begin() const
const Value & getValue(const QString &uri, const QString &entryName) const
void applyFilters(const QList< const Filter * > &filters)
void removeEntry(const QString &entryKey)
QList< QString > keys() const
QList< Entry > entries() const
bool addEntry(const Entry &entry)
bool containsEntry(const QString &entryKey) const
Entry & getEntry(const QString &entryKey)
ValueType type() const
#define dbgMetaData
Definition kis_debug.h:61
uint qHash(const Entry &e)
QHash< QString, Entry > entries