Skip to content

Commit 8c340f7

Browse files
authored
Make composition associated with QgsProject (#3957)
... rather than using project singleton within compositions
1 parent 062de6a commit 8c340f7

File tree

60 files changed

+188
-139
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+188
-139
lines changed

doc/api_break.dox

+1
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,7 @@ QgsComposerTableV2 {#qgis_api_break_3_0_QgsComposerTableV2}
615615
QgsComposition {#qgis_api_break_3_0_QgsComposition}
616616
--------------
617617

618+
- constructor requires QgsProject instance as the second argument
618619
- addItemsFromXML() has been renamed to addItemsFromXml()
619620
- Constructor with QgsMapRenderer parameter has been removed. Use the variant with QgsMapSettings parameter.
620621
- mapRenderer() has been removed. Use mapSettings() instead.

python/core/composer/qgscomposition.sip

+9-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class QgsComposition : QGraphicsScene, QgsExpressionContextGenerator
4040
Landscape
4141
};
4242

43-
explicit QgsComposition( const QgsMapSettings& mapSettings );
43+
explicit QgsComposition( const QgsMapSettings& mapSettings, QgsProject* project );
4444

4545
/** Composition atlas modes*/
4646
enum AtlasMode
@@ -52,6 +52,14 @@ class QgsComposition : QGraphicsScene, QgsExpressionContextGenerator
5252

5353
~QgsComposition();
5454

55+
/**
56+
* The project associated with the composition. Used to get access to layers, map themes,
57+
* relations and various other bits. It is never null.
58+
*
59+
* \note Added in QGIS 3.0
60+
*/
61+
QgsProject* project() const;
62+
5563
/** Changes size of paper item.
5664
* @param width page width in mm
5765
* @param height page height in mm

src/app/composer/qgscomposer.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,7 @@ QgsComposer::QgsComposer( QgisApp *qgis, const QString& title )
547547
connect( mActionShowRulers, SIGNAL( triggered( bool ) ), this, SLOT( toggleRulers( bool ) ) );
548548

549549
//init undo/redo buttons
550-
mComposition = new QgsComposition( mQgis->mapCanvas()->mapSettings() );
550+
mComposition = new QgsComposition( mQgis->mapCanvas()->mapSettings(), QgsProject::instance() );
551551

552552
mActionUndo->setEnabled( false );
553553
mActionRedo->setEnabled( false );
@@ -3543,7 +3543,7 @@ void QgsComposer::readXml( const QDomElement& composerElem, const QDomDocument&
35433543
createComposerView();
35443544

35453545
//read composition settings
3546-
mComposition = new QgsComposition( mQgis->mapCanvas()->mapSettings() );
3546+
mComposition = new QgsComposition( mQgis->mapCanvas()->mapSettings(), QgsProject::instance() );
35473547
QDomNodeList compositionNodeList = composerElem.elementsByTagName( QStringLiteral( "Composition" ) );
35483548
if ( compositionNodeList.size() > 0 )
35493549
{

src/core/composer/qgsaddremoveitemcommand.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -80,5 +80,5 @@ void QgsAddRemoveItemCommand::switchState()
8080
emit itemAdded( mItem );
8181
mState = Added;
8282
}
83-
QgsProject::instance()->setDirty( true );
83+
mComposition->project()->setDirty( true );
8484
}

src/core/composer/qgsaddremovemultiframecommand.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ void QgsAddRemoveMultiFrameCommand::switchState()
7878
mComposition->addMultiFrame( mMultiFrame );
7979
mState = Added;
8080
}
81-
QgsProject::instance()->setDirty( true );
81+
mComposition->project()->setDirty( true );
8282
}
8383
}
8484

src/core/composer/qgsatlascomposition.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ QgsAtlasComposition::QgsAtlasComposition( QgsComposition* composition )
4545
{
4646

4747
//listen out for layer removal
48-
connect( QgsProject::instance(), SIGNAL( layersWillBeRemoved( QStringList ) ), this, SLOT( removeLayers( QStringList ) ) );
48+
connect( mComposition->project(), SIGNAL( layersWillBeRemoved( QStringList ) ), this, SLOT( removeLayers( QStringList ) ) );
4949
}
5050

5151
void QgsAtlasComposition::setEnabled( bool enabled )
@@ -625,7 +625,7 @@ void QgsAtlasComposition::readXml( const QDomElement& atlasElem, const QDomDocum
625625

626626
// look for stored layer name
627627
QString coverageLayerId = atlasElem.attribute( QStringLiteral( "coverageLayer" ) );
628-
mCoverageLayer = qobject_cast<QgsVectorLayer*>( QgsProject::instance()->mapLayer( coverageLayerId ) );
628+
mCoverageLayer = qobject_cast<QgsVectorLayer*>( mComposition->project()->mapLayer( coverageLayerId ) );
629629

630630
mPageNameExpression = atlasElem.attribute( QStringLiteral( "pageNameExpression" ), QString() );
631631
mSingleFile = atlasElem.attribute( QStringLiteral( "singleFile" ), QStringLiteral( "false" ) ) == QLatin1String( "true" ) ? true : false;
@@ -718,7 +718,7 @@ QgsExpressionContext QgsAtlasComposition::createExpressionContext()
718718
{
719719
QgsExpressionContext expressionContext;
720720
expressionContext << QgsExpressionContextUtils::globalScope()
721-
<< QgsExpressionContextUtils::projectScope( QgsProject::instance() );
721+
<< QgsExpressionContextUtils::projectScope( mComposition->project() );
722722
if ( mComposition )
723723
expressionContext << QgsExpressionContextUtils::compositionScope( mComposition );
724724

src/core/composer/qgscomposerattributetablev2.cpp

+7-6
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ QgsComposerAttributeTableV2::QgsComposerAttributeTableV2( QgsComposition* compos
6262
, mFeatureFilter( QLatin1String( "" ) )
6363
{
6464
//set first vector layer from layer registry as default one
65-
QMap<QString, QgsMapLayer*> layerMap = QgsProject::instance()->mapLayers();
65+
QMap<QString, QgsMapLayer*> layerMap = mComposition->project()->mapLayers();
6666
QMap<QString, QgsMapLayer*>::const_iterator mapIt = layerMap.constBegin();
6767
for ( ; mapIt != layerMap.constEnd(); ++mapIt )
6868
{
@@ -79,10 +79,11 @@ QgsComposerAttributeTableV2::QgsComposerAttributeTableV2( QgsComposition* compos
7979
//listen for modifications to layer and refresh table when they occur
8080
connect( mVectorLayer, SIGNAL( layerModified() ), this, SLOT( refreshAttributes() ) );
8181
}
82-
connect( QgsProject::instance(), SIGNAL( layerWillBeRemoved( QString ) ), this, SLOT( removeLayer( const QString& ) ) );
8382

8483
if ( mComposition )
8584
{
85+
connect( mComposition->project(), SIGNAL( layerWillBeRemoved( QString ) ), this, SLOT( removeLayer( const QString& ) ) );
86+
8687
//refresh table attributes when composition is refreshed
8788
connect( mComposition, SIGNAL( refreshItemsTriggered() ), this, SLOT( refreshAttributes() ) );
8889

@@ -140,7 +141,7 @@ void QgsComposerAttributeTableV2::setRelationId( const QString& relationId )
140141

141142
QgsVectorLayer* prevLayer = sourceLayer();
142143
mRelationId = relationId;
143-
QgsRelation relation = QgsProject::instance()->relationManager()->relation( mRelationId );
144+
QgsRelation relation = mComposition->project()->relationManager()->relation( mRelationId );
144145
QgsVectorLayer* newLayer = relation.referencingLayer();
145146

146147
if ( mSource == QgsComposerAttributeTableV2::RelationChildren && newLayer != prevLayer )
@@ -438,7 +439,7 @@ bool QgsComposerAttributeTableV2::getTableContents( QgsComposerTableContents &co
438439

439440
if ( mSource == QgsComposerAttributeTableV2::RelationChildren )
440441
{
441-
QgsRelation relation = QgsProject::instance()->relationManager()->relation( mRelationId );
442+
QgsRelation relation = mComposition->project()->relationManager()->relation( mRelationId );
442443
QgsFeature atlasFeature = mComposition->atlasComposition().feature();
443444
req = relation.getRelatedFeaturesRequest( atlasFeature );
444445
}
@@ -564,7 +565,7 @@ QgsVectorLayer *QgsComposerAttributeTableV2::sourceLayer()
564565
return mVectorLayer;
565566
case QgsComposerAttributeTableV2::RelationChildren:
566567
{
567-
QgsRelation relation = QgsProject::instance()->relationManager()->relation( mRelationId );
568+
QgsRelation relation = mComposition->project()->relationManager()->relation( mRelationId );
568569
return relation.referencingLayer();
569570
}
570571
}
@@ -731,7 +732,7 @@ bool QgsComposerAttributeTableV2::readXml( const QDomElement& itemElem, const QD
731732
}
732733
else
733734
{
734-
QgsMapLayer* ml = QgsProject::instance()->mapLayer( layerId );
735+
QgsMapLayer* ml = mComposition->project()->mapLayer( layerId );
735736
if ( ml )
736737
{
737738
mVectorLayer = dynamic_cast<QgsVectorLayer*>( ml );

src/core/composer/qgscomposerhtml.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ void QgsComposerHtml::loadHtml( const bool useCache, const QgsExpressionContext
185185
//set html, using the specified url as base if in Url mode or the project file if in manual mode
186186
const QUrl baseUrl = mContentMode == QgsComposerHtml::Url ?
187187
QUrl( mActualFetchedUrl ) :
188-
QUrl::fromLocalFile( QgsProject::instance()->fileInfo().absoluteFilePath() );
188+
QUrl::fromLocalFile( mComposition->project()->fileInfo().absoluteFilePath() );
189189
mWebPage->mainFrame()->setHtml( loadedHtml, baseUrl );
190190

191191
//set user stylesheet
@@ -547,8 +547,8 @@ void QgsComposerHtml::setExpressionContext( const QgsFeature &feature, QgsVector
547547
if ( mComposition )
548548
{
549549
mDistanceArea->setEllipsoidalMode( mComposition->mapSettings().hasCrsTransformEnabled() );
550+
mDistanceArea->setEllipsoid( mComposition->project()->ellipsoid() );
550551
}
551-
mDistanceArea->setEllipsoid( QgsProject::instance()->ellipsoid() );
552552

553553
// create JSON representation of feature
554554
QgsJSONExporter exporter( layer );

src/core/composer/qgscomposeritemcommand.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "qgscomposeritem.h"
2020
#include "qgscomposerframe.h"
2121
#include "qgscomposermultiframe.h"
22+
#include "qgscomposition.h"
2223
#include "qgsproject.h"
2324
#include "qgslogger.h"
2425

@@ -114,7 +115,7 @@ void QgsComposerItemCommand::restoreState( QDomDocument& stateDoc ) const
114115

115116
destItem->readXml( stateDoc.documentElement().firstChild().toElement(), stateDoc );
116117
destItem->repaint();
117-
QgsProject::instance()->setDirty( true );
118+
destItem->composition()->project()->setDirty( true );
118119
}
119120

120121
//

src/core/composer/qgscomposerlabel.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ void QgsComposerLabel::contentChanged()
165165
//set this to true after html is loaded.
166166
mHtmlLoaded = false;
167167

168-
const QUrl baseUrl = QUrl::fromLocalFile( QgsProject::instance()->fileInfo().absoluteFilePath() );
168+
const QUrl baseUrl = QUrl::fromLocalFile( mComposition->project()->fileInfo().absoluteFilePath() );
169169
mWebPage->mainFrame()->setHtml( textToDraw, baseUrl );
170170

171171
//For very basic html labels with no external assets, the html load will already be
@@ -265,7 +265,7 @@ void QgsComposerLabel::refreshExpressionContext()
265265
mDistanceArea->setSourceCrs( mComposition->mapSettings().destinationCrs().srsid() );
266266
}
267267
mDistanceArea->setEllipsoidalMode( mComposition->mapSettings().hasCrsTransformEnabled() );
268-
mDistanceArea->setEllipsoid( QgsProject::instance()->ellipsoid() );
268+
mDistanceArea->setEllipsoid( mComposition->project()->ellipsoid() );
269269
contentChanged();
270270

271271
update();

src/core/composer/qgscomposerlegend.cpp

+9-9
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,14 @@ QgsComposerLegend::QgsComposerLegend( QgsComposition* composition )
4646
, mForceResize( false )
4747
, mSizeToContents( true )
4848
{
49-
mLegendModel = new QgsLegendModel( QgsProject::instance()->layerTreeRoot() );
49+
mLegendModel = new QgsLegendModel( mComposition->project()->layerTreeRoot() );
5050

5151
connect( &composition->atlasComposition(), SIGNAL( renderEnded() ), this, SLOT( onAtlasEnded() ) );
5252
connect( &composition->atlasComposition(), SIGNAL( featureChanged( QgsFeature* ) ), this, SLOT( onAtlasFeature( QgsFeature* ) ) );
5353

5454
// Connect to the main layertreeroot.
5555
// It serves in "auto update mode" as a medium between the main app legend and this one
56-
connect( QgsProject::instance()->layerTreeRoot(), SIGNAL( customPropertyChanged( QgsLayerTreeNode*, QString ) ), this, SLOT( nodeCustomPropertyChanged( QgsLayerTreeNode*, QString ) ) );
56+
connect( mComposition->project()->layerTreeRoot(), SIGNAL( customPropertyChanged( QgsLayerTreeNode*, QString ) ), this, SLOT( nodeCustomPropertyChanged( QgsLayerTreeNode*, QString ) ) );
5757
}
5858

5959
QgsComposerLegend::QgsComposerLegend()
@@ -225,7 +225,7 @@ bool QgsComposerLegend::resizeToContents() const
225225

226226
void QgsComposerLegend::setCustomLayerTree( QgsLayerTreeGroup* rootGroup )
227227
{
228-
mLegendModel->setRootGroup( rootGroup ? rootGroup : QgsProject::instance()->layerTreeRoot() );
228+
mLegendModel->setRootGroup( rootGroup ? rootGroup : mComposition->project()->layerTreeRoot() );
229229

230230
delete mCustomLayerTree;
231231
mCustomLayerTree = rootGroup;
@@ -237,7 +237,7 @@ void QgsComposerLegend::setAutoUpdateModel( bool autoUpdate )
237237
if ( autoUpdate == autoUpdateModel() )
238238
return;
239239

240-
setCustomLayerTree( autoUpdate ? nullptr : QgsLayerTree::toGroup( QgsProject::instance()->layerTreeRoot()->clone() ) );
240+
setCustomLayerTree( autoUpdate ? nullptr : QgsLayerTree::toGroup( mComposition->project()->layerTreeRoot()->clone() ) );
241241
adjustBoxSize();
242242
updateItem();
243243
}
@@ -414,7 +414,7 @@ bool QgsComposerLegend::writeXml( QDomElement& elem, QDomDocument & doc ) const
414414
return _writeXml( composerLegendElem, doc );
415415
}
416416

417-
static void _readOldLegendGroup( QDomElement& elem, QgsLayerTreeGroup* parentGroup )
417+
static void _readOldLegendGroup( QDomElement& elem, QgsLayerTreeGroup* parentGroup, QgsProject* project )
418418
{
419419
QDomElement itemElem = elem.firstChildElement();
420420

@@ -424,7 +424,7 @@ static void _readOldLegendGroup( QDomElement& elem, QgsLayerTreeGroup* parentGro
424424
if ( itemElem.tagName() == QLatin1String( "LayerItem" ) )
425425
{
426426
QString layerId = itemElem.attribute( QStringLiteral( "layerId" ) );
427-
if ( QgsMapLayer* layer = QgsProject::instance()->mapLayer( layerId ) )
427+
if ( QgsMapLayer* layer = project->mapLayer( layerId ) )
428428
{
429429
QgsLayerTreeLayer* nodeLayer = parentGroup->addLayer( layer );
430430
QString userText = itemElem.attribute( QStringLiteral( "userText" ) );
@@ -447,7 +447,7 @@ static void _readOldLegendGroup( QDomElement& elem, QgsLayerTreeGroup* parentGro
447447
if ( !style.isEmpty() )
448448
nodeGroup->setCustomProperty( QStringLiteral( "legend/title-style" ), style );
449449

450-
_readOldLegendGroup( itemElem, nodeGroup );
450+
_readOldLegendGroup( itemElem, nodeGroup, project );
451451
}
452452

453453
itemElem = itemElem.nextSiblingElement();
@@ -527,7 +527,7 @@ bool QgsComposerLegend::readXml( const QDomElement& itemElem, const QDomDocument
527527
{
528528
// QGIS <= 2.4
529529
QgsLayerTreeGroup* nodeRoot = new QgsLayerTreeGroup();
530-
_readOldLegendGroup( oldLegendModelElem, nodeRoot );
530+
_readOldLegendGroup( oldLegendModelElem, nodeRoot, mComposition->project() );
531531
setCustomLayerTree( nodeRoot );
532532
}
533533
else
@@ -687,7 +687,7 @@ void QgsComposerLegend::doUpdateFilterByMap()
687687
mLegendModel->setLayerStyleOverrides( QMap<QString, QString>() );
688688

689689

690-
bool filterByExpression = QgsLayerTreeUtils::hasLegendFilterExpression( *( mCustomLayerTree ? mCustomLayerTree : QgsProject::instance()->layerTreeRoot() ) );
690+
bool filterByExpression = QgsLayerTreeUtils::hasLegendFilterExpression( *( mCustomLayerTree ? mCustomLayerTree : mComposition->project()->layerTreeRoot() ) );
691691

692692
if ( mComposerMap && ( mLegendFilterByMap || filterByExpression || mInAtlas ) )
693693
{

src/core/composer/qgscomposermap.cpp

+13-11
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,12 @@ QgsComposerMap::QgsComposerMap( QgsComposition *composition, int x, int y, int w
7777
mXOffset = 0.0;
7878
mYOffset = 0.0;
7979

80+
QgsProject* project = mComposition->project();
81+
8082
//get the color for map canvas background and set map background color accordingly
81-
int bgRedInt = QgsProject::instance()->readNumEntry( QStringLiteral( "Gui" ), QStringLiteral( "/CanvasColorRedPart" ), 255 );
82-
int bgGreenInt = QgsProject::instance()->readNumEntry( QStringLiteral( "Gui" ), QStringLiteral( "/CanvasColorGreenPart" ), 255 );
83-
int bgBlueInt = QgsProject::instance()->readNumEntry( QStringLiteral( "Gui" ), QStringLiteral( "/CanvasColorBluePart" ), 255 );
83+
int bgRedInt = project->readNumEntry( QStringLiteral( "Gui" ), QStringLiteral( "/CanvasColorRedPart" ), 255 );
84+
int bgGreenInt = project->readNumEntry( QStringLiteral( "Gui" ), QStringLiteral( "/CanvasColorGreenPart" ), 255 );
85+
int bgBlueInt = project->readNumEntry( QStringLiteral( "Gui" ), QStringLiteral( "/CanvasColorBluePart" ), 255 );
8486
setBackgroundColor( QColor( bgRedInt, bgGreenInt, bgBlueInt ) );
8587

8688
//calculate mExtent based on width/height ratio and map canvas extent
@@ -544,8 +546,8 @@ QList<QgsMapLayer*> QgsComposerMap::layersToRender( const QgsExpressionContext*
544546
presetName = exprVal.toString();
545547
}
546548

547-
if ( QgsProject::instance()->mapThemeCollection()->hasMapTheme( presetName ) )
548-
renderLayers = QgsProject::instance()->mapThemeCollection()->mapThemeVisibleLayers( presetName );
549+
if ( mComposition->project()->mapThemeCollection()->hasMapTheme( presetName ) )
550+
renderLayers = mComposition->project()->mapThemeCollection()->mapThemeVisibleLayers( presetName );
549551
else // fallback to using map canvas layers
550552
renderLayers = mComposition->mapSettings().layers();
551553
}
@@ -567,7 +569,7 @@ QList<QgsMapLayer*> QgsComposerMap::layersToRender( const QgsExpressionContext*
567569
//need to convert layer names to layer ids
568570
Q_FOREACH ( const QString& name, layerNames )
569571
{
570-
QList< QgsMapLayer* > matchingLayers = QgsProject::instance()->mapLayersByName( name );
572+
QList< QgsMapLayer* > matchingLayers = mComposition->project()->mapLayersByName( name );
571573
Q_FOREACH ( QgsMapLayer* layer, matchingLayers )
572574
{
573575
renderLayers << layer;
@@ -605,8 +607,8 @@ QMap<QString, QString> QgsComposerMap::layerStyleOverridesToRender( const QgsExp
605607
presetName = exprVal.toString();
606608
}
607609

608-
if ( QgsProject::instance()->mapThemeCollection()->hasMapTheme( presetName ) )
609-
return QgsProject::instance()->mapThemeCollection()->mapThemeStyleOverrides( presetName );
610+
if ( mComposition->project()->mapThemeCollection()->hasMapTheme( presetName ) )
611+
return mComposition->project()->mapThemeCollection()->mapThemeStyleOverrides( presetName );
610612
else
611613
return QMap<QString, QString>();
612614
}
@@ -1200,7 +1202,7 @@ bool QgsComposerMap::containsAdvancedEffects() const
12001202
void QgsComposerMap::connectUpdateSlot()
12011203
{
12021204
//connect signal from layer registry to update in case of new or deleted layers
1203-
QgsProject* project = QgsProject::instance();
1205+
QgsProject* project = mComposition->project();
12041206
if ( project )
12051207
{
12061208
connect( project, SIGNAL( layerWillBeRemoved( QString ) ), this, SLOT( layersChanged() ) );
@@ -1403,7 +1405,7 @@ bool QgsComposerMap::readXml( const QDomElement& itemElem, const QDomDocument& d
14031405
for ( int i = 0; i < layerIdNodeList.size(); ++i )
14041406
{
14051407
QString layerId = layerIdNodeList.at( i ).toElement().text();
1406-
if ( QgsMapLayer* ml = QgsProject::instance()->mapLayer( layerId ) )
1408+
if ( QgsMapLayer* ml = mComposition->project()->mapLayer( layerId ) )
14071409
mLayers << ml;
14081410
}
14091411
}
@@ -1615,7 +1617,7 @@ void QgsComposerMap::syncLayerSet()
16151617
QList<QgsMapLayer*> currentLayers;
16161618
if ( mKeepLayerSet )
16171619
{
1618-
currentLayers = QgsProject::instance()->mapLayers().values();
1620+
currentLayers = mComposition->project()->mapLayers().values();
16191621
}
16201622
else //only consider layers visible in the map
16211623
{

src/core/composer/qgscomposermousehandles.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -624,7 +624,7 @@ void QgsComposerMouseHandles::mouseReleaseEvent( QGraphicsSceneMouseEvent* event
624624
subcommand->saveAfterState();
625625
}
626626
mComposition->undoStack()->push( parentCommand );
627-
QgsProject::instance()->setDirty( true );
627+
mComposition->project()->setDirty( true );
628628
}
629629
else if ( mCurrentMouseMoveAction != QgsComposerMouseHandles::NoAction )
630630
{
@@ -664,7 +664,7 @@ void QgsComposerMouseHandles::mouseReleaseEvent( QGraphicsSceneMouseEvent* event
664664
subcommand->saveAfterState();
665665
}
666666
mComposition->undoStack()->push( parentCommand );
667-
QgsProject::instance()->setDirty( true );
667+
mComposition->project()->setDirty( true );
668668
}
669669

670670
deleteAlignItems();

src/core/composer/qgscomposermultiframecommand.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
#include "qgscomposermultiframecommand.h"
1919
#include "qgscomposermultiframe.h"
20+
#include "qgscomposition.h"
2021
#include "qgsproject.h"
2122

2223
QgsComposerMultiFrameCommand::QgsComposerMultiFrameCommand( QgsComposerMultiFrame* multiFrame, const QString& text, QUndoCommand* parent ):
@@ -68,7 +69,7 @@ void QgsComposerMultiFrameCommand::restoreState( QDomDocument& stateDoc )
6869
if ( mMultiFrame )
6970
{
7071
mMultiFrame->readXml( stateDoc.documentElement().firstChild().toElement(), stateDoc );
71-
QgsProject::instance()->setDirty( true );
72+
mMultiFrame->composition()->project()->setDirty( true );
7273
}
7374
}
7475

0 commit comments

Comments
 (0)