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

#include <KisResourceStorage.h>

Static Public Member Functions

static bool addVersionedResource (const QString &saveLocation, KoResourceSP resource, int minVersion)
 
static QString chooseUniqueName (KoResourceSP resource, int minVersion, std::function< bool(QString)> checkExists)
 
static void detectFileVersions (QVector< VersionedResourceEntry > &allFiles)
 

Detailed Description

Definition at line 341 of file KisResourceStorage.h.

Member Function Documentation

◆ addVersionedResource()

bool KisStorageVersioningHelper::addVersionedResource ( const QString & saveLocation,
KoResourceSP resource,
int minVersion )
static

Definition at line 421 of file KisResourceStorage.cpp.

424{
425 int version = qMax(resource->version(), minVersion);
426
427 VersionedFileParts parts = guessFileNamePartsLazy(resource->filename(), version);
428 version = parts.version;
429
430 QString newFilename =
431 chooseUniqueName(resource, minVersion,
432 [saveLocation] (const QString &filename) {
433 return QFileInfo(saveLocation + "/" + filename).exists();
434 });
435
436 if (newFilename.isEmpty()) return false;
437
438 QFile file(saveLocation + "/" + newFilename);
440
441 if (!file.open(QFile::WriteOnly)) {
442 qWarning() << "Could not open resource file for writing" << newFilename;
443 return false;
444 }
445
446 if (!resource->saveToDevice(&file)) {
447 qWarning() << "Could not save resource file" << newFilename;
448 return false;
449 }
450
451 resource->setFilename(newFilename);
452 file.close();
453
454 if (!resource->thumbnailPath().isEmpty()) {
455 // hack for MyPaint brush presets thumbnails
456 // note: for all versions of the preset, it will try to save in the same place
457 if (!QFileInfo(saveLocation + "/" + resource->thumbnailPath()).exists()) {
458 QImage thumbnail = resource->thumbnail();
459 thumbnail.save(saveLocation + "/" + resource->thumbnailPath());
460 }
461 }
462
463 return true;
464}
VersionedFileParts guessFileNamePartsLazy(const QString &filename, int minVersion)
static QString chooseUniqueName(KoResourceSP resource, int minVersion, std::function< bool(QString)> checkExists)
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:129

References chooseUniqueName(), guessFileNamePartsLazy(), KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE, and VersionedFileParts::version.

◆ chooseUniqueName()

QString KisStorageVersioningHelper::chooseUniqueName ( KoResourceSP resource,
int minVersion,
std::function< bool(QString)> checkExists )
static

Definition at line 350 of file KisResourceStorage.cpp.

353{
354 int version = qMax(resource->version(), minVersion);
355
356 VersionedFileParts parts = guessFileNamePartsLazy(resource->filename(), version);
357 version = parts.version;
358
359 QString newFilename;
360
361 while (1) {
362 int numPlaceholders = 4;
363
364 if (version > 9999) {
365 numPlaceholders = qFloor(std::log10(version)) + 1;
366 }
367
368 QString versionString = QString("%1").arg(version, numPlaceholders, 10, QChar('0'));
369
370 // XXX: Temporary, until I've fixed the tests
371 if (versionString == "0000" && qApp->applicationName() == "krita") {
372 newFilename = resource->filename();
373 }
374 else {
375 newFilename = parts.basename +
376 "."
378 + "."
379 + parts.suffix;
380 }
381 if (checkExists(newFilename)) {
382 version++;
383 if (version == std::numeric_limits<int>::max()) {
384 return QString();
385 }
386 continue;
387 }
388
389 break;
390 }
391
392 return newFilename;
393}
KRITAVERSION_EXPORT QString versionString(bool checkGit=false)

References VersionedFileParts::basename, guessFileNamePartsLazy(), VersionedFileParts::suffix, and VersionedFileParts::version.

◆ detectFileVersions()

void KisStorageVersioningHelper::detectFileVersions ( QVector< VersionedResourceEntry > & allFiles)
static

Definition at line 395 of file KisResourceStorage.cpp.

396{
397 for (auto it = allFiles.begin(); it != allFiles.end(); ++it) {
398 VersionedFileParts parts = guessFileNamePartsLazy(it->filename, -1);
399 it->guessedKey = parts.basename + parts.suffix;
400 it->guessedVersion = parts.version;
401 }
402
403 std::sort(allFiles.begin(), allFiles.end(), VersionedResourceEntry::KeyVersionLess());
404
405 boost::optional<QString> lastResourceKey;
406 int availableVersion = 0;
407 for (auto it = allFiles.begin(); it != allFiles.end(); ++it) {
408 if (!lastResourceKey || *lastResourceKey != it->guessedKey) {
409 availableVersion = 0;
410 lastResourceKey = it->guessedKey;
411 }
412
413 if (it->guessedVersion < availableVersion) {
414 it->guessedVersion = availableVersion;
415 }
416
417 availableVersion = it->guessedVersion + 1;
418 }
419}

References VersionedFileParts::basename, guessFileNamePartsLazy(), VersionedFileParts::suffix, and VersionedFileParts::version.


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