void QgsDecorationCopyright::projectRead() { QgsDecorationItem::projectRead(); mLabelText = QgsProject::instance()->readEntry( mNameConfig, QStringLiteral( "/Label" ), QString() ); mMarginHorizontal = QgsProject::instance()->readNumEntry( mNameConfig, QStringLiteral( "/MarginH" ), 0 ); mMarginVertical = QgsProject::instance()->readNumEntry( mNameConfig, QStringLiteral( "/MarginV" ), 0 ); QDomDocument doc; QDomElement elem; QString textXml = QgsProject::instance()->readEntry( mNameConfig, QStringLiteral( "/Font" ) ); if ( !textXml.isEmpty() ) { doc.setContent( textXml ); elem = doc.documentElement(); QgsReadWriteContext rwContext; rwContext.setPathResolver( QgsProject::instance()->pathResolver() ); mTextFormat.readXml( elem, rwContext ); } // Migratation for pre QGIS 3.2 settings QColor oldColor = QgsSymbolLayerUtils::decodeColor( QgsProject::instance()->readEntry( mNameConfig, QStringLiteral( "/Color" ) ) ); if ( oldColor.isValid() ) { mTextFormat.setColor( oldColor ); QgsProject::instance()->removeEntry( mNameConfig, QStringLiteral( "/Color" ) ); } }
QDomElement QgsLayoutManager::writeXml( QDomDocument &doc ) const { QDomElement layoutsElem = doc.createElement( QStringLiteral( "Layouts" ) ); QgsReadWriteContext context; context.setPathResolver( mProject->pathResolver() ); for ( QgsMasterLayoutInterface *l : mLayouts ) { QDomElement layoutElem = l->writeLayoutXml( doc, context ); layoutsElem.appendChild( layoutElem ); } return layoutsElem; }
void QgsDecorationCopyright::saveToProject() { QgsDecorationItem::saveToProject(); QgsProject::instance()->writeEntry( mNameConfig, QStringLiteral( "/Label" ), mLabelText ); QgsProject::instance()->writeEntry( mNameConfig, QStringLiteral( "/MarginH" ), mMarginHorizontal ); QgsProject::instance()->writeEntry( mNameConfig, QStringLiteral( "/MarginV" ), mMarginVertical ); QDomDocument textDoc; QgsReadWriteContext rwContext; rwContext.setPathResolver( QgsProject::instance()->pathResolver() ); QDomElement textElem = mTextFormat.writeXml( textDoc, rwContext ); textDoc.appendChild( textElem ); QgsProject::instance()->writeEntry( mNameConfig, QStringLiteral( "/Font" ), textDoc.toString() ); }
QgsLayerTreeNode *QgsLayerTreeNode::readXml( QDomElement &element, const QgsProject *project ) { QgsReadWriteContext context; QgsPathResolver resolver; if ( project ) resolver = project->pathResolver(); context.setPathResolver( resolver ); context.setProjectTranslator( const_cast<QgsProject *>( project ) ); QgsLayerTreeNode *node = readXml( element, context ); if ( node ) node->resolveReferences( project ); return node; }
void QgsDecorationGrid::saveToProject() { QgsDecorationItem::saveToProject(); QgsProject::instance()->writeEntry( mNameConfig, QStringLiteral( "/Enabled" ), mEnabled ); QgsProject::instance()->writeEntry( mNameConfig, QStringLiteral( "/MapUnits" ), static_cast< int >( mMapUnits ) ); QgsProject::instance()->writeEntry( mNameConfig, QStringLiteral( "/Style" ), static_cast< int >( mGridStyle ) ); QgsProject::instance()->writeEntry( mNameConfig, QStringLiteral( "/IntervalX" ), mGridIntervalX ); QgsProject::instance()->writeEntry( mNameConfig, QStringLiteral( "/IntervalY" ), mGridIntervalY ); QgsProject::instance()->writeEntry( mNameConfig, QStringLiteral( "/OffsetX" ), mGridOffsetX ); QgsProject::instance()->writeEntry( mNameConfig, QStringLiteral( "/OffsetY" ), mGridOffsetY ); // QgsProject::instance()->writeEntry( mNameConfig, "/CrossLength", mCrossLength ); // missing mGridPen, but should use styles anyway QgsProject::instance()->writeEntry( mNameConfig, QStringLiteral( "/ShowAnnotation" ), mShowGridAnnotation ); // QgsProject::instance()->writeEntry( mNameConfig, "/AnnotationPosition", ( int ) mGridAnnotationPosition ); QgsProject::instance()->writeEntry( mNameConfig, QStringLiteral( "/AnnotationDirection" ), static_cast< int >( mGridAnnotationDirection ) ); QgsProject::instance()->writeEntry( mNameConfig, QStringLiteral( "/AnnotationFont" ), mGridAnnotationFont.toString() ); QgsProject::instance()->writeEntry( mNameConfig, QStringLiteral( "/AnnotationFrameDistance" ), mAnnotationFrameDistance ); QgsProject::instance()->writeEntry( mNameConfig, QStringLiteral( "/AnnotationPrecision" ), mGridAnnotationPrecision ); // write symbol info to xml QDomDocument doc; QDomElement elem; QgsReadWriteContext rwContext; rwContext.setPathResolver( QgsProject::instance()->pathResolver() ); if ( mLineSymbol ) { elem = QgsSymbolLayerUtils::saveSymbol( QStringLiteral( "line symbol" ), mLineSymbol, doc, rwContext ); doc.appendChild( elem ); // FIXME this works, but XML will not be valid as < is replaced by < QgsProject::instance()->writeEntry( mNameConfig, QStringLiteral( "/LineSymbol" ), doc.toString() ); } if ( mMarkerSymbol ) { doc.setContent( QString() ); elem = QgsSymbolLayerUtils::saveSymbol( QStringLiteral( "marker symbol" ), mMarkerSymbol, doc, rwContext ); doc.appendChild( elem ); QgsProject::instance()->writeEntry( mNameConfig, QStringLiteral( "/MarkerSymbol" ), doc.toString() ); } }
void QgsDecorationTitle::projectRead() { QgsDecorationItem::projectRead(); mLabelText = QgsProject::instance()->readEntry( mNameConfig, QStringLiteral( "/Label" ), QString() ); mBackgroundColor = QgsSymbolLayerUtils::decodeColor( QgsProject::instance()->readEntry( mNameConfig, QStringLiteral( "/BackgroundColor" ), QStringLiteral( "0,0,0,99" ) ) ); mMarginHorizontal = QgsProject::instance()->readNumEntry( mNameConfig, QStringLiteral( "/MarginH" ), 0 ); mMarginVertical = QgsProject::instance()->readNumEntry( mNameConfig, QStringLiteral( "/MarginV" ), 0 ); QDomDocument doc; QDomElement elem; QString textXml = QgsProject::instance()->readEntry( mNameConfig, QStringLiteral( "/Font" ) ); if ( !textXml.isEmpty() ) { doc.setContent( textXml ); elem = doc.documentElement(); QgsReadWriteContext rwContext; rwContext.setPathResolver( QgsProject::instance()->pathResolver() ); mTextFormat.readXml( elem, rwContext ); } }
bool QgsLayoutManager::readXml( const QDomElement &element, const QDomDocument &doc ) { clear(); QDomElement layoutsElem = element; if ( element.tagName() != QStringLiteral( "Layouts" ) ) { layoutsElem = element.firstChildElement( QStringLiteral( "Layouts" ) ); } if ( layoutsElem.isNull() ) { // handle legacy projects layoutsElem = doc.documentElement(); } //restore each composer bool result = true; QDomNodeList composerNodes = element.elementsByTagName( QStringLiteral( "Composer" ) ); for ( int i = 0; i < composerNodes.size(); ++i ) { // This legacy title is the Composer "title" (that can be overridden by the Composition "name") QString legacyTitle = composerNodes.at( i ).toElement().attribute( QStringLiteral( "title" ) ); // Convert compositions to layouts QDomNodeList compositionNodes = composerNodes.at( i ).toElement().elementsByTagName( QStringLiteral( "Composition" ) ); for ( int j = 0; j < compositionNodes.size(); ++j ) { std::unique_ptr< QgsPrintLayout > l( QgsCompositionConverter::createLayoutFromCompositionXml( compositionNodes.at( j ).toElement(), mProject ) ); if ( l ) { if ( l->name().isEmpty() ) l->setName( legacyTitle ); // some 2.x projects could end in a state where they had duplicated layout names. This is strictly forbidden in 3.x // so check for duplicate name in layouts already added int id = 2; bool isDuplicateName = false; QString originalName = l->name(); do { isDuplicateName = false; for ( QgsMasterLayoutInterface *layout : qgis::as_const( mLayouts ) ) { if ( l->name() == layout->name() ) { isDuplicateName = true; break; } } if ( isDuplicateName ) { l->setName( QStringLiteral( "%1 %2" ).arg( originalName ).arg( id ) ); id++; } } while ( isDuplicateName ); bool added = addLayout( l.release() ); result = added && result; } } } QgsReadWriteContext context; context.setPathResolver( mProject->pathResolver() ); // restore layouts const QDomNodeList layoutNodes = layoutsElem.childNodes(); for ( int i = 0; i < layoutNodes.size(); ++i ) { if ( layoutNodes.at( i ).nodeName() != QStringLiteral( "Layout" ) ) continue; std::unique_ptr< QgsPrintLayout > l = qgis::make_unique< QgsPrintLayout >( mProject ); l->undoStack()->blockCommands( true ); if ( !l->readLayoutXml( layoutNodes.at( i ).toElement(), doc, context ) ) { result = false; continue; } l->undoStack()->blockCommands( false ); if ( addLayout( l.get() ) ) { ( void )l.release(); // ownership was transferred successfully } else { result = false; } } //reports const QDomNodeList reportNodes = element.elementsByTagName( QStringLiteral( "Report" ) ); for ( int i = 0; i < reportNodes.size(); ++i ) { std::unique_ptr< QgsReport > r = qgis::make_unique< QgsReport >( mProject ); if ( !r->readLayoutXml( reportNodes.at( i ).toElement(), doc, context ) ) { result = false; continue; } if ( addLayout( r.get() ) ) { ( void )r.release(); // ownership was transferred successfully } else { result = false; } } return result; }
void QgsDecorationGrid::projectRead() { QgsDecorationItem::projectRead(); mEnabled = QgsProject::instance()->readBoolEntry( mNameConfig, QStringLiteral( "/Enabled" ), false ); mMapUnits = static_cast< QgsUnitTypes::DistanceUnit >( QgsProject::instance()->readNumEntry( mNameConfig, QStringLiteral( "/MapUnits" ), QgsUnitTypes::DistanceUnknownUnit ) ); mGridStyle = static_cast< GridStyle >( QgsProject::instance()->readNumEntry( mNameConfig, QStringLiteral( "/Style" ), QgsDecorationGrid::Line ) ); mGridIntervalX = QgsProject::instance()->readDoubleEntry( mNameConfig, QStringLiteral( "/IntervalX" ), 10 ); mGridIntervalY = QgsProject::instance()->readDoubleEntry( mNameConfig, QStringLiteral( "/IntervalY" ), 10 ); mGridOffsetX = QgsProject::instance()->readDoubleEntry( mNameConfig, QStringLiteral( "/OffsetX" ), 0 ); mGridOffsetY = QgsProject::instance()->readDoubleEntry( mNameConfig, QStringLiteral( "/OffsetY" ), 0 ); // mCrossLength = QgsProject::instance()->readDoubleEntry( mNameConfig, "/CrossLength", 3 ); mShowGridAnnotation = QgsProject::instance()->readBoolEntry( mNameConfig, QStringLiteral( "/ShowAnnotation" ), false ); // mGridAnnotationPosition = ( GridAnnotationPosition ) QgsProject::instance()->readNumEntry( mNameConfig, // "/AnnotationPosition", 0 ); mGridAnnotationPosition = InsideMapFrame; // don't allow outside frame, doesn't make sense mGridAnnotationDirection = static_cast< GridAnnotationDirection >( QgsProject::instance()->readNumEntry( mNameConfig, QStringLiteral( "/AnnotationDirection" ), 0 ) ); QString fontStr = QgsProject::instance()->readEntry( mNameConfig, QStringLiteral( "/AnnotationFont" ), QString() ); if ( !fontStr.isEmpty() ) { mGridAnnotationFont.fromString( fontStr ); } else { mGridAnnotationFont = QFont(); // TODO fix font scaling problem - put a slightly large font for now mGridAnnotationFont.setPointSize( 16 ); } mAnnotationFrameDistance = QgsProject::instance()->readDoubleEntry( mNameConfig, QStringLiteral( "/AnnotationFrameDistance" ), 0 ); mGridAnnotationPrecision = QgsProject::instance()->readNumEntry( mNameConfig, QStringLiteral( "/AnnotationPrecision" ), 0 ); // read symbol info from xml QDomDocument doc; QDomElement elem; QString xml; QgsReadWriteContext rwContext; rwContext.setPathResolver( QgsProject::instance()->pathResolver() ); if ( mLineSymbol ) setLineSymbol( nullptr ); xml = QgsProject::instance()->readEntry( mNameConfig, QStringLiteral( "/LineSymbol" ) ); if ( !xml.isEmpty() ) { doc.setContent( xml ); elem = doc.documentElement(); mLineSymbol = QgsSymbolLayerUtils::loadSymbol<QgsLineSymbol>( elem, rwContext ); } if ( ! mLineSymbol ) mLineSymbol = new QgsLineSymbol(); if ( mMarkerSymbol ) setMarkerSymbol( nullptr ); xml = QgsProject::instance()->readEntry( mNameConfig, QStringLiteral( "/MarkerSymbol" ) ); if ( !xml.isEmpty() ) { doc.setContent( xml ); elem = doc.documentElement(); mMarkerSymbol = QgsSymbolLayerUtils::loadSymbol<QgsMarkerSymbol>( elem, rwContext ); } if ( ! mMarkerSymbol ) { // set default symbol : cross with width=3 QgsSymbolLayerList symbolList; symbolList << new QgsSimpleMarkerSymbolLayer( QgsSimpleMarkerSymbolLayerBase::Cross, 3, 0 ); mMarkerSymbol = new QgsMarkerSymbol( symbolList ); // mMarkerSymbol = new QgsMarkerSymbol(); } }