bool QgsLayoutItemPicture::writePropertiesToElement( QDomElement &elem, QDomDocument &, const QgsReadWriteContext &context ) const { QString imagePath = mSourcePath; // convert from absolute path to relative. For SVG we also need to consider system SVG paths QgsPathResolver pathResolver = context.pathResolver(); if ( imagePath.endsWith( QLatin1String( ".svg" ), Qt::CaseInsensitive ) ) imagePath = QgsSymbolLayerUtils::svgSymbolPathToName( imagePath, pathResolver ); else imagePath = pathResolver.writePath( imagePath ); elem.setAttribute( QStringLiteral( "file" ), imagePath ); elem.setAttribute( QStringLiteral( "pictureWidth" ), QString::number( mPictureWidth ) ); elem.setAttribute( QStringLiteral( "pictureHeight" ), QString::number( mPictureHeight ) ); elem.setAttribute( QStringLiteral( "resizeMode" ), QString::number( static_cast< int >( mResizeMode ) ) ); elem.setAttribute( QStringLiteral( "anchorPoint" ), QString::number( static_cast< int >( mPictureAnchor ) ) ); elem.setAttribute( QStringLiteral( "svgFillColor" ), QgsSymbolLayerUtils::encodeColor( mSvgFillColor ) ); elem.setAttribute( QStringLiteral( "svgBorderColor" ), QgsSymbolLayerUtils::encodeColor( mSvgStrokeColor ) ); elem.setAttribute( QStringLiteral( "svgBorderWidth" ), QString::number( mSvgStrokeWidth ) ); //rotation elem.setAttribute( QStringLiteral( "pictureRotation" ), QString::number( mPictureRotation ) ); if ( !mRotationMap ) { elem.setAttribute( QStringLiteral( "mapUuid" ), QString() ); } else { elem.setAttribute( QStringLiteral( "mapUuid" ), mRotationMap->uuid() ); } elem.setAttribute( QStringLiteral( "northMode" ), mNorthMode ); elem.setAttribute( QStringLiteral( "northOffset" ), mNorthOffset ); return true; }
void TestQgsProject::testPathResolver() { // Test resolver with a non existing file path QgsPathResolver resolverLegacy( QStringLiteral( "/home/qgis/test.qgs" ) ); QCOMPARE( resolverLegacy.readPath( QString() ), QString() ); QCOMPARE( resolverLegacy.writePath( QString() ), QString() ); QCOMPARE( resolverLegacy.writePath( "/home/qgis/file1.txt" ), QString( "./file1.txt" ) ); QCOMPARE( resolverLegacy.writePath( "/home/qgis/subdir/file1.txt" ), QString( "./subdir/file1.txt" ) ); QCOMPARE( resolverLegacy.writePath( "/home/file1.txt" ), QString( "../file1.txt" ) ); QCOMPARE( resolverLegacy.readPath( "./file1.txt" ), QString( "/home/qgis/file1.txt" ) ); QCOMPARE( resolverLegacy.readPath( "./subdir/file1.txt" ), QString( "/home/qgis/subdir/file1.txt" ) ); QCOMPARE( resolverLegacy.readPath( "../file1.txt" ), QString( "/home/file1.txt" ) ); QCOMPARE( resolverLegacy.readPath( "/home/qgis/file1.txt" ), QString( "/home/qgis/file1.txt" ) ); // Test resolver with existing file path QTemporaryDir tmpDir; QString tmpDirName = tmpDir.path(); QDir dir( tmpDirName ); dir.mkpath( tmpDirName + "/home/qgis/" ); QgsPathResolver resolverRel( QString( tmpDirName + "/home/qgis/test.qgs" ) ); QCOMPARE( resolverRel.readPath( QString() ), QString() ); QCOMPARE( resolverRel.writePath( QString() ), QString() ); QCOMPARE( resolverRel.writePath( tmpDirName + "/home/qgis/file1.txt" ), QString( "./file1.txt" ) ); QCOMPARE( resolverRel.writePath( tmpDirName + "/home/qgis/subdir/file1.txt" ), QString( "./subdir/file1.txt" ) ); QCOMPARE( resolverRel.writePath( tmpDirName + "/home/file1.txt" ), QString( "../file1.txt" ) ); QCOMPARE( resolverRel.readPath( "./file1.txt" ), QString( tmpDirName + "/home/qgis/file1.txt" ) ); QCOMPARE( resolverRel.readPath( "./subdir/file1.txt" ), QString( tmpDirName + "/home/qgis/subdir/file1.txt" ) ); QCOMPARE( resolverRel.readPath( "../file1.txt" ), QString( tmpDirName + "/home/file1.txt" ) ); QCOMPARE( resolverRel.readPath( tmpDirName + "/home/qgis/file1.txt" ), QString( tmpDirName + "/home/qgis/file1.txt" ) ); // test older style relative path - file must exist for this to work QTemporaryFile tmpFile; tmpFile.open(); // fileName is not available until we open the file QString tmpName = tmpFile.fileName(); tmpFile.close(); QgsPathResolver tempRel( tmpName ); QFileInfo fi( tmpName ); QFile testFile( fi.path() + QStringLiteral( "/file1.txt" ) ); QVERIFY( testFile.open( QIODevice::WriteOnly | QIODevice::Text ) ); testFile.close(); QVERIFY( QFile::exists( fi.path() + QStringLiteral( "/file1.txt" ) ) ); QCOMPARE( tempRel.readPath( "file1.txt" ), fi.path() + QStringLiteral( "/file1.txt" ) ); QgsPathResolver resolverAbs; QCOMPARE( resolverAbs.writePath( "/home/qgis/file1.txt" ), QString( "/home/qgis/file1.txt" ) ); QCOMPARE( resolverAbs.readPath( "/home/qgis/file1.txt" ), QString( "/home/qgis/file1.txt" ) ); QCOMPARE( resolverAbs.readPath( "./file1.txt" ), QString( "./file1.txt" ) ); // TODO: test non-canonical paths - there are inconsistencies in the implementation // e.g. base filename "/home/qgis/../test.qgs" resolving "/home/qgis/../file1.txt" back and forth }
void TestQgsProject::testPathResolver() { QgsPathResolver resolverRel( QStringLiteral( "/home/qgis/test.qgs" ) ); QCOMPARE( resolverRel.writePath( "/home/qgis/file1.txt" ), QString( "./file1.txt" ) ); QCOMPARE( resolverRel.writePath( "/home/qgis/subdir/file1.txt" ), QString( "./subdir/file1.txt" ) ); QCOMPARE( resolverRel.writePath( "/home/file1.txt" ), QString( "../file1.txt" ) ); QCOMPARE( resolverRel.readPath( "./file1.txt" ), QString( "/home/qgis/file1.txt" ) ); QCOMPARE( resolverRel.readPath( "./subdir/file1.txt" ), QString( "/home/qgis/subdir/file1.txt" ) ); QCOMPARE( resolverRel.readPath( "../file1.txt" ), QString( "/home/file1.txt" ) ); QCOMPARE( resolverRel.readPath( "/home/qgis/file1.txt" ), QString( "/home/qgis/file1.txt" ) ); QgsPathResolver resolverAbs; QCOMPARE( resolverAbs.writePath( "/home/qgis/file1.txt" ), QString( "/home/qgis/file1.txt" ) ); QCOMPARE( resolverAbs.readPath( "/home/qgis/file1.txt" ), QString( "/home/qgis/file1.txt" ) ); QCOMPARE( resolverAbs.readPath( "./file1.txt" ), QString( "./file1.txt" ) ); // TODO: test non-canonical paths - there are inconsistencies in the implementation // e.g. base filename "/home/qgis/../test.qgs" resolving "/home/qgis/../file1.txt" back and forth }