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

#include <ResourceImporter.h>

+ Inheritance diagram for ResourceImporter:

Public Member Functions

void importResources (QString startPath="")
 
 ResourceImporter (QWidget *parent)
 
 ~ResourceImporter () override
 

Private Types

enum  ImportFailureReason { MimetypeResourceTypeUnknown , ResourceCannotBeLoaded , CancelledByTheUser , StorageAlreadyExists }
 

Private Member Functions

void initialize ()
 
void prepareModelsMap ()
 
void prepareTypesMaps ()
 

Private Attributes

QStringList m_allMimetypes
 
bool m_isInitialized {false}
 
QMap< QString, QStringListm_mimetypeForResourceType
 
QMap< QString, KisResourceModel * > m_resourceModelsForResourceType
 
QMap< QString, QStringListm_resourceTypesForMimetype
 
QStringList m_storagesMimetypes
 
QWidget * m_widgetParent {0}
 
QStringList m_zipMimetypes
 

Friends

class FailureReasonsDialog
 

Detailed Description

Definition at line 18 of file ResourceImporter.h.

Member Enumeration Documentation

◆ ImportFailureReason

Enumerator
MimetypeResourceTypeUnknown 
ResourceCannotBeLoaded 
CancelledByTheUser 
StorageAlreadyExists 

Definition at line 39 of file ResourceImporter.h.

40 {
41 MimetypeResourceTypeUnknown, // when someone tries to import a .foo file
43 CancelledByTheUser, // the user pressed Cancel when asked
44 StorageAlreadyExists, // bundle, asl or abr file already exists in that location
45 };

Constructor & Destructor Documentation

◆ ResourceImporter()

ResourceImporter::ResourceImporter ( QWidget * parent)

Definition at line 97 of file ResourceImporter.cpp.

98 : m_widgetParent(parent)
99{
100 initialize();
101}

References initialize().

◆ ~ResourceImporter()

ResourceImporter::~ResourceImporter ( )
override

Definition at line 104 of file ResourceImporter.cpp.

105{
107}
QMap< QString, KisResourceModel * > m_resourceModelsForResourceType

References m_resourceModelsForResourceType.

Member Function Documentation

◆ importResources()

void ResourceImporter::importResources ( QString startPath = "")

Definition at line 109 of file ResourceImporter.cpp.

110{
111 // TODO: remove debug after finishing the importer
112 bool debug = false;
113
114 if (startPath.isEmpty()) {
115 startPath = QStandardPaths::writableLocation(QStandardPaths::HomeLocation);
116 }
117
119 dialog.setDefaultDir(startPath);
120 dialog.setCaption(i18nc("Resource Importer file dialog title", "Import Resources and Resource Libraries"));
121 dialog.setMimeTypeFilters(m_allMimetypes);
122 QStringList filenames = dialog.filenames();
123
124
125 if (debug) qCritical() << "All filenames: " << filenames;
126
127
128 QMap<QString, QString> troublesomeFiles;
129 QStringList troublesomeMimetypes;
130
131 QMap<QString, QStringList> troublesomeFilesPerMimetype;
132
133
134
135 QMap<QString, QString> resourceTypePerFile;
136
137 QStringList successfullyImportedFiles;
138 QMap<ImportFailureReason, QStringList> failedFiles;
139 failedFiles.insert(StorageAlreadyExists, QStringList());
140 failedFiles.insert(MimetypeResourceTypeUnknown, QStringList());
141 failedFiles.insert(ResourceCannotBeLoaded, QStringList());
142 failedFiles.insert(CancelledByTheUser, QStringList());
143
144
145 for (int i = 0; i < filenames.count(); i++) {
146 QString mimetype = KisMimeDatabase::mimeTypeForFile(filenames[i]);
147 if (m_storagesMimetypes.contains(mimetype)) {
148 if (debug) qCritical() << "We're loading a storage here: " << filenames[i];
149
150 // import the bundle/asl/abr storage
151
153 if (debug) qCritical() << "checking for storage" << filenames[i] << QFileInfo(filenames[i]).fileName();
154 // TODO: three options in case of the same filename: cancel; overwrite; rename;
155 // but for now, let's just skip
156 bool skip = false;
157 if (KisResourceLocator::instance()->hasStorage(QFileInfo(filenames[i]).fileName())) {
158 skip = true;
159 /*
160 if (QMessageBox::warning(m_widgetParent, i18nc("@title:window", "Warning"),
161 i18n("There is already a resource library with this name installed. Do you want to overwrite it? Resource library name: "),
162 QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Cancel) {
163 importMode = KisStorageModel::Rename;
164 }
165 else {
166 importMode = KisStorageModel::Overwrite;
167 }
168 */
169 }
170 if (skip || !KisStorageModel::instance()->importStorage(filenames[i], importMode)) {
171 failedFiles[StorageAlreadyExists] << filenames[i];
172 } else {
173 successfullyImportedFiles << filenames[i];
174 }
175
176 } else if (m_zipMimetypes.contains(mimetype)) {
177 // TODO: unpack a zip file and then proceed the same way like with others
178 } else if (m_resourceTypesForMimetype.contains(mimetype)) {
179 bool differentResourceTypes = m_resourceTypesForMimetype.value(mimetype).count() > 1;
180 if (differentResourceTypes) {
181 if (debug) qCritical() << "We have a difficult situation here!" << filenames[i];
182
183 troublesomeFiles.insert(filenames[i], mimetype);
184 if (!troublesomeMimetypes.contains(mimetype)) {
185 troublesomeMimetypes.append(mimetype);
186 }
187
188 if (!troublesomeFilesPerMimetype.contains(mimetype)) {
189 troublesomeFilesPerMimetype.insert(mimetype, QStringList());
190 }
191 troublesomeFilesPerMimetype[mimetype] = troublesomeFilesPerMimetype[mimetype] << filenames[i];
192
193 } else {
194 if (debug) qCritical() << "We're loading a" << mimetype << " here: " << filenames[i];
195 resourceTypePerFile.insert(filenames[i], m_resourceTypesForMimetype[mimetype][0]);
196 }
197 } else {
198 failedFiles[MimetypeResourceTypeUnknown] << filenames[i];
199 }
200
201 }
202
203 QMap<QString, QStringList> troublesomeResourceTypesPerMimetype;
204 for (int i = 0; i < troublesomeMimetypes.size(); i++) {
205 troublesomeResourceTypesPerMimetype.insert(troublesomeMimetypes[i], m_resourceTypesForMimetype[troublesomeMimetypes[i]]);
206 }
207
208 if (troublesomeMimetypes.count() > 0) {
209 DlgResourceTypeForFile dlg(m_widgetParent, troublesomeResourceTypesPerMimetype);
210 if (dlg.exec() == QDialog::Accepted) {
211 for (int i = 0; i < troublesomeMimetypes.count(); i++) {
212 QString resourceType = dlg.getResourceTypeForMimetype(troublesomeMimetypes[i]);
213 QString mimetype = troublesomeMimetypes[i];
214 if (troublesomeFilesPerMimetype.contains(mimetype)) {
215 for (int j = 0; j < troublesomeFilesPerMimetype[mimetype].size(); j++) {
216 resourceTypePerFile.insert(troublesomeFilesPerMimetype[mimetype][j], resourceType);
217 }
218 }
219 }
220 } else {
221 for (int i = 0; i < troublesomeMimetypes.count(); i++) {
222 for (int j = 0; j < troublesomeFilesPerMimetype[troublesomeMimetypes[i]].size(); j++) {
223 failedFiles[CancelledByTheUser] << troublesomeFilesPerMimetype[troublesomeMimetypes[i]][j];
224 }
225 }
226 }
227 }
228
229
230
231
232 if (debug) qCritical() << "Resource types for mimetype: ";
233
234 for (int i = 0; i < m_resourceTypesForMimetype.keys().size(); i++) {
235 if (m_resourceTypesForMimetype[m_resourceTypesForMimetype.keys()[i]].size() > 1) {
236 if (debug) qCritical() << m_resourceTypesForMimetype.keys()[i] << m_resourceTypesForMimetype[m_resourceTypesForMimetype.keys()[i]];
237 }
238 }
239
240 QString resourceLocationBase = KisResourceLocator::instance()->resourceLocationBase();
241
242 QStringList resourceFiles = resourceTypePerFile.keys();
243 for (int i = 0; i < resourceFiles.count(); i++) {
244 QString resourceType = resourceTypePerFile[resourceFiles[i]];
245 if (debug) qCritical() << "Loading " << resourceFiles[i] << "as" << resourceType;
246 if (m_resourceModelsForResourceType.contains(resourceType)) {
247 if (debug) qCritical() << "We do have a resource model for that!";
249
250 bool allowOverwrite = false;
251
252 // first check if we are going to overwrite anything
253 if (model->importWillOverwriteResource(resourceFiles[i])) {
255 continue;
256 } else {
257 allowOverwrite = true;
258 }
259 }
260
261 KoResourceSP res = model->importResourceFile(resourceFiles[i], allowOverwrite);
262 if (res.isNull()) {
263 if (debug) qCritical() << "But the resource is null :( ";
264 failedFiles[ResourceCannotBeLoaded] << resourceFiles[i];
265 } else {
266 if (debug) qCritical() << "The resource isn't null, great!";
267 successfullyImportedFiles << resourceFiles[i];
268 }
269 } else {
270 failedFiles[MimetypeResourceTypeUnknown] << resourceFiles[i];
271 }
272 }
273
274 if (debug) qCritical() << "Failed files: " << failedFiles;
275 if (debug) qCritical() << "Successfully imported files: " << successfullyImportedFiles;
276
277 QList<ImportFailureReason> keys = failedFiles.keys();
278 int failedFilesCount = 0;
279 for (int i = 0; i < keys.size(); i++) {
280 failedFilesCount += failedFiles[keys[i]].size();
281 }
282 if (failedFilesCount > 0) {
283 FailureReasonsDialog dlg(m_widgetParent, failedFiles);
284 dlg.exec();
285 }
286
287}
QList< QString > QStringList
static QString mimeTypeForFile(const QString &file, bool checkExistingFiles=true)
Find the mimetype for the given filename. The filename must include a suffix.
QString resourceLocationBase() const
resourceLocationBase is the place where all resource storages (folder, bundles etc....
static KisResourceLocator * instance()
The KisResourceModel class provides the main access to resources. It is possible to filter the resour...
KoResourceSP importResourceFile(const QString &filename, const bool allowOverwrite, const QString &storageId=QString("")) override
importResourceFile
bool importWillOverwriteResource(const QString &fileName, const QString &storageLocation=QString()) const override
importWillOverwriteResource checks is importing a resource with this filename will overwrite anything
static bool userAllowsOverwrite(QWidget *widgetParent, QString resourceFilepath)
static KisStorageModel * instance()
QStringList m_storagesMimetypes
QStringList m_zipMimetypes
QMap< QString, QStringList > m_resourceTypesForMimetype
QStringList m_allMimetypes
int size(const Forest< T > &forest)
Definition KisForest.h:1232
PyObject * debug(PyObject *, PyObject *args)

References CancelledByTheUser, DlgResourceTypeForFile::getResourceTypeForMimetype(), KisResourceModel::importResourceFile(), KisResourceModel::importWillOverwriteResource(), KisResourceLocator::instance(), KisStorageModel::instance(), m_allMimetypes, m_resourceModelsForResourceType, m_resourceTypesForMimetype, m_storagesMimetypes, m_widgetParent, m_zipMimetypes, KisMimeDatabase::mimeTypeForFile(), MimetypeResourceTypeUnknown, KisStorageModel::None, KoFileDialog::OpenFiles, ResourceCannotBeLoaded, KisResourceLocator::resourceLocationBase(), StorageAlreadyExists, and KisResourceUserOperations::userAllowsOverwrite().

◆ initialize()

void ResourceImporter::initialize ( )
private

Definition at line 358 of file ResourceImporter.cpp.

359{
360 if (!m_isInitialized) {
363 m_isInitialized = true;
364 }
365}

References m_isInitialized, prepareModelsMap(), and prepareTypesMaps().

◆ prepareModelsMap()

void ResourceImporter::prepareModelsMap ( )
private

Definition at line 341 of file ResourceImporter.cpp.

342{
344 for (int i = 0; i < model.rowCount(); i++) {
345 QModelIndex idx = model.index(i, 0);
346 QString resourceType = model.data(idx, Qt::UserRole + KisResourceTypeModel::ResourceType).toString();
347 if (!m_resourceModelsForResourceType.contains(resourceType)) {
348 KisResourceModel* model = new KisResourceModel(resourceType);
349 if (model) {
350 m_resourceModelsForResourceType.insert(resourceType, model);
351 } else {
352 dbgResources << "There is no KisResourceModel available for " << resourceType;
353 }
354 }
355 }
356}
QVariant data(const QModelIndex &index, int role) const override
int rowCount(const QModelIndex &parent=QModelIndex()) const override
#define dbgResources
Definition kis_debug.h:43

References KisResourceTypeModel::data(), dbgResources, m_resourceModelsForResourceType, KisResourceTypeModel::ResourceType, and KisResourceTypeModel::rowCount().

◆ prepareTypesMaps()

void ResourceImporter::prepareTypesMaps ( )
private

Definition at line 289 of file ResourceImporter.cpp.

290{
291 m_storagesMimetypes = QStringList() << "application/x-krita-bundle"
292 << "image/x-adobe-brushlibrary"
293 << "application/x-photoshop-style-library";
294
295 m_zipMimetypes = QStringList(); // << "application/zip"; // TODO: implement for zip archives
296
297 QStringList resourceTypes;
299 for (int i = 0; i < model.rowCount(); i++) {
300 QModelIndex idx = model.index(i, 0);
301 resourceTypes << model.data(idx, Qt::UserRole + KisResourceTypeModel::ResourceType).toString();
302 }
303 qCritical() << "resource types = " << resourceTypes;
304
307
308 QStringList mimetypes;
309 for (int i = 0; i < resourceTypes.count(); i++) {
311
312 // remove mypaint brushes for now, because we'd need to figure out an UX for them
313 // probably 1) remove all the _prev.png files from a list to import as patterns or brush tips
314 // and 2) when importing a .myb file, find a proper .png file alongside it to import together
315 mime.removeAll("application/x-mypaint-brush");
316
317 m_mimetypeForResourceType.insert(resourceTypes[i], mime);
318 mimetypes << mime;
319 for (int j = 0; j < mime.count(); j++) {
320 if (m_resourceTypesForMimetype.contains(mime[j])) {
321 if (!m_resourceTypesForMimetype[mime[j]].contains(resourceTypes[i])) {
322 m_resourceTypesForMimetype[mime[j]].append(resourceTypes[i]);
323 }
324 } else {
325 m_resourceTypesForMimetype.insert(mime[j], QStringList() << resourceTypes[i]);
326 }
327 }
328 }
329
332 m_allMimetypes << mimetypes;
333
334
335 m_allMimetypes.removeDuplicates();
336
337
338
339}
static KisResourceLoaderRegistry * instance()
QStringList mimeTypes(const QString &resourceType) const
QMap< QString, QStringList > m_mimetypeForResourceType

References KisResourceTypeModel::data(), KisResourceLoaderRegistry::instance(), m_allMimetypes, m_mimetypeForResourceType, m_resourceTypesForMimetype, m_storagesMimetypes, m_zipMimetypes, KisResourceLoaderRegistry::mimeTypes(), KisResourceTypeModel::ResourceType, and KisResourceTypeModel::rowCount().

Friends And Related Symbol Documentation

◆ FailureReasonsDialog

friend class FailureReasonsDialog
friend

Definition at line 49 of file ResourceImporter.h.

Member Data Documentation

◆ m_allMimetypes

QStringList ResourceImporter::m_allMimetypes
private

Definition at line 56 of file ResourceImporter.h.

◆ m_isInitialized

bool ResourceImporter::m_isInitialized {false}
private

Definition at line 59 of file ResourceImporter.h.

59{false};

◆ m_mimetypeForResourceType

QMap<QString, QStringList> ResourceImporter::m_mimetypeForResourceType
private

Definition at line 53 of file ResourceImporter.h.

◆ m_resourceModelsForResourceType

QMap<QString, KisResourceModel*> ResourceImporter::m_resourceModelsForResourceType
private

Definition at line 51 of file ResourceImporter.h.

◆ m_resourceTypesForMimetype

QMap<QString, QStringList> ResourceImporter::m_resourceTypesForMimetype
private

Definition at line 52 of file ResourceImporter.h.

◆ m_storagesMimetypes

QStringList ResourceImporter::m_storagesMimetypes
private

Definition at line 54 of file ResourceImporter.h.

◆ m_widgetParent

QWidget* ResourceImporter::m_widgetParent {0}
private

Definition at line 57 of file ResourceImporter.h.

57{0};

◆ m_zipMimetypes

QStringList ResourceImporter::m_zipMimetypes
private

Definition at line 55 of file ResourceImporter.h.


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