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 342 of file KisResourceStorage.h.

Member Function Documentation

◆ addVersionedResource()

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

Definition at line 464 of file KisResourceStorage.cpp.

467{
468 int version = qMax(resource->version(), minVersion);
469
470 VersionedFileParts parts = guessFileNamePartsLazy(resource->filename(), version);
471 version = parts.version;
472
473 QString newFilename =
474 chooseUniqueName(resource, minVersion,
475 [saveLocation] (const QString &filename) {
476 return QFileInfo(saveLocation + "/" + filename).exists();
477 });
478
479 if (newFilename.isEmpty()) return false;
480
481 QFile file(saveLocation + "/" + newFilename);
483
484 if (!file.open(QFile::WriteOnly)) {
485 qWarning() << "Could not open resource file for writing" << newFilename;
486 return false;
487 }
488
489 if (!resource->saveToDevice(&file)) {
490 qWarning() << "Could not save resource file" << newFilename;
491 return false;
492 }
493
494 resource->setFilename(newFilename);
495 file.close();
496
497 if (!resource->thumbnailPath().isEmpty()) {
498 // hack for MyPaint brush presets thumbnails
499 // note: for all versions of the preset, it will try to save in the same place
500 if (!QFileInfo(saveLocation + "/" + resource->thumbnailPath()).exists()) {
501 QImage thumbnail = resource->thumbnail();
502 thumbnail.save(saveLocation + "/" + resource->thumbnailPath());
503 }
504 }
505
506 return true;
507}
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 393 of file KisResourceStorage.cpp.

396{
397 int version = qMax(resource->version(), minVersion);
398
399 VersionedFileParts parts = guessFileNamePartsLazy(resource->filename(), version);
400 version = parts.version;
401
402 QString newFilename;
403
404 while (1) {
405 int numPlaceholders = 4;
406
407 if (version > 9999) {
408 numPlaceholders = qFloor(std::log10(version)) + 1;
409 }
410
411 QString versionString = QString("%1").arg(version, numPlaceholders, 10, QChar('0'));
412
413 // XXX: Temporary, until I've fixed the tests
414 if (versionString == "0000" && qApp->applicationName() == "krita") {
415 newFilename = resource->filename();
416 }
417 else {
418 newFilename = parts.basename +
419 "."
421 + "."
422 + parts.suffix;
423 }
424 if (checkExists(newFilename)) {
425 version++;
426 if (version == std::numeric_limits<int>::max()) {
427 return QString();
428 }
429 continue;
430 }
431
432 break;
433 }
434
435 return newFilename;
436}
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 438 of file KisResourceStorage.cpp.

439{
440 for (auto it = allFiles.begin(); it != allFiles.end(); ++it) {
441 VersionedFileParts parts = guessFileNamePartsLazy(it->filename, -1);
442 it->guessedKey = parts.basename + parts.suffix;
443 it->guessedVersion = parts.version;
444 }
445
446 std::sort(allFiles.begin(), allFiles.end(), VersionedResourceEntry::KeyVersionLess());
447
448 boost::optional<QString> lastResourceKey;
449 int availableVersion = 0;
450 for (auto it = allFiles.begin(); it != allFiles.end(); ++it) {
451 if (!lastResourceKey || *lastResourceKey != it->guessedKey) {
452 availableVersion = 0;
453 lastResourceKey = it->guessedKey;
454 }
455
456 if (it->guessedVersion < availableVersion) {
457 it->guessedVersion = availableVersion;
458 }
459
460 availableVersion = it->guessedVersion + 1;
461 }
462}

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


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