Skip to content

Commit

Permalink
Make composition associated with QgsProject (#3957)
Browse files Browse the repository at this point in the history
... rather than using project singleton within compositions
  • Loading branch information
wonder-sk committed Jan 6, 2017
1 parent 062de6a commit 8c340f7
Show file tree
Hide file tree
Showing 60 changed files with 188 additions and 139 deletions.
1 change: 1 addition & 0 deletions doc/api_break.dox
Expand Up @@ -615,6 +615,7 @@ QgsComposerTableV2 {#qgis_api_break_3_0_QgsComposerTableV2}
QgsComposition {#qgis_api_break_3_0_QgsComposition}
--------------

- constructor requires QgsProject instance as the second argument
- addItemsFromXML() has been renamed to addItemsFromXml()
- Constructor with QgsMapRenderer parameter has been removed. Use the variant with QgsMapSettings parameter.
- mapRenderer() has been removed. Use mapSettings() instead.
Expand Down
10 changes: 9 additions & 1 deletion python/core/composer/qgscomposition.sip
Expand Up @@ -40,7 +40,7 @@ class QgsComposition : QGraphicsScene, QgsExpressionContextGenerator
Landscape
};

explicit QgsComposition( const QgsMapSettings& mapSettings );
explicit QgsComposition( const QgsMapSettings& mapSettings, QgsProject* project );

/** Composition atlas modes*/
enum AtlasMode
Expand All @@ -52,6 +52,14 @@ class QgsComposition : QGraphicsScene, QgsExpressionContextGenerator

~QgsComposition();

/**
* The project associated with the composition. Used to get access to layers, map themes,
* relations and various other bits. It is never null.
*
* \note Added in QGIS 3.0
*/
QgsProject* project() const;

/** Changes size of paper item.
* @param width page width in mm
* @param height page height in mm
Expand Down
4 changes: 2 additions & 2 deletions src/app/composer/qgscomposer.cpp
Expand Up @@ -547,7 +547,7 @@ QgsComposer::QgsComposer( QgisApp *qgis, const QString& title )
connect( mActionShowRulers, SIGNAL( triggered( bool ) ), this, SLOT( toggleRulers( bool ) ) );

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

mActionUndo->setEnabled( false );
mActionRedo->setEnabled( false );
Expand Down Expand Up @@ -3543,7 +3543,7 @@ void QgsComposer::readXml( const QDomElement& composerElem, const QDomDocument&
createComposerView();

//read composition settings
mComposition = new QgsComposition( mQgis->mapCanvas()->mapSettings() );
mComposition = new QgsComposition( mQgis->mapCanvas()->mapSettings(), QgsProject::instance() );
QDomNodeList compositionNodeList = composerElem.elementsByTagName( QStringLiteral( "Composition" ) );
if ( compositionNodeList.size() > 0 )
{
Expand Down
2 changes: 1 addition & 1 deletion src/core/composer/qgsaddremoveitemcommand.cpp
Expand Up @@ -80,5 +80,5 @@ void QgsAddRemoveItemCommand::switchState()
emit itemAdded( mItem );
mState = Added;
}
QgsProject::instance()->setDirty( true );
mComposition->project()->setDirty( true );
}
2 changes: 1 addition & 1 deletion src/core/composer/qgsaddremovemultiframecommand.cpp
Expand Up @@ -78,7 +78,7 @@ void QgsAddRemoveMultiFrameCommand::switchState()
mComposition->addMultiFrame( mMultiFrame );
mState = Added;
}
QgsProject::instance()->setDirty( true );
mComposition->project()->setDirty( true );
}
}

Expand Down
6 changes: 3 additions & 3 deletions src/core/composer/qgsatlascomposition.cpp
Expand Up @@ -45,7 +45,7 @@ QgsAtlasComposition::QgsAtlasComposition( QgsComposition* composition )
{

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

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

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

mPageNameExpression = atlasElem.attribute( QStringLiteral( "pageNameExpression" ), QString() );
mSingleFile = atlasElem.attribute( QStringLiteral( "singleFile" ), QStringLiteral( "false" ) ) == QLatin1String( "true" ) ? true : false;
Expand Down Expand Up @@ -718,7 +718,7 @@ QgsExpressionContext QgsAtlasComposition::createExpressionContext()
{
QgsExpressionContext expressionContext;
expressionContext << QgsExpressionContextUtils::globalScope()
<< QgsExpressionContextUtils::projectScope( QgsProject::instance() );
<< QgsExpressionContextUtils::projectScope( mComposition->project() );
if ( mComposition )
expressionContext << QgsExpressionContextUtils::compositionScope( mComposition );

Expand Down
13 changes: 7 additions & 6 deletions src/core/composer/qgscomposerattributetablev2.cpp
Expand Up @@ -62,7 +62,7 @@ QgsComposerAttributeTableV2::QgsComposerAttributeTableV2( QgsComposition* compos
, mFeatureFilter( QLatin1String( "" ) )
{
//set first vector layer from layer registry as default one
QMap<QString, QgsMapLayer*> layerMap = QgsProject::instance()->mapLayers();
QMap<QString, QgsMapLayer*> layerMap = mComposition->project()->mapLayers();
QMap<QString, QgsMapLayer*>::const_iterator mapIt = layerMap.constBegin();
for ( ; mapIt != layerMap.constEnd(); ++mapIt )
{
Expand All @@ -79,10 +79,11 @@ QgsComposerAttributeTableV2::QgsComposerAttributeTableV2( QgsComposition* compos
//listen for modifications to layer and refresh table when they occur
connect( mVectorLayer, SIGNAL( layerModified() ), this, SLOT( refreshAttributes() ) );
}
connect( QgsProject::instance(), SIGNAL( layerWillBeRemoved( QString ) ), this, SLOT( removeLayer( const QString& ) ) );

if ( mComposition )
{
connect( mComposition->project(), SIGNAL( layerWillBeRemoved( QString ) ), this, SLOT( removeLayer( const QString& ) ) );

//refresh table attributes when composition is refreshed
connect( mComposition, SIGNAL( refreshItemsTriggered() ), this, SLOT( refreshAttributes() ) );

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

QgsVectorLayer* prevLayer = sourceLayer();
mRelationId = relationId;
QgsRelation relation = QgsProject::instance()->relationManager()->relation( mRelationId );
QgsRelation relation = mComposition->project()->relationManager()->relation( mRelationId );
QgsVectorLayer* newLayer = relation.referencingLayer();

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

if ( mSource == QgsComposerAttributeTableV2::RelationChildren )
{
QgsRelation relation = QgsProject::instance()->relationManager()->relation( mRelationId );
QgsRelation relation = mComposition->project()->relationManager()->relation( mRelationId );
QgsFeature atlasFeature = mComposition->atlasComposition().feature();
req = relation.getRelatedFeaturesRequest( atlasFeature );
}
Expand Down Expand Up @@ -564,7 +565,7 @@ QgsVectorLayer *QgsComposerAttributeTableV2::sourceLayer()
return mVectorLayer;
case QgsComposerAttributeTableV2::RelationChildren:
{
QgsRelation relation = QgsProject::instance()->relationManager()->relation( mRelationId );
QgsRelation relation = mComposition->project()->relationManager()->relation( mRelationId );
return relation.referencingLayer();
}
}
Expand Down Expand Up @@ -731,7 +732,7 @@ bool QgsComposerAttributeTableV2::readXml( const QDomElement& itemElem, const QD
}
else
{
QgsMapLayer* ml = QgsProject::instance()->mapLayer( layerId );
QgsMapLayer* ml = mComposition->project()->mapLayer( layerId );
if ( ml )
{
mVectorLayer = dynamic_cast<QgsVectorLayer*>( ml );
Expand Down
4 changes: 2 additions & 2 deletions src/core/composer/qgscomposerhtml.cpp
Expand Up @@ -185,7 +185,7 @@ void QgsComposerHtml::loadHtml( const bool useCache, const QgsExpressionContext
//set html, using the specified url as base if in Url mode or the project file if in manual mode
const QUrl baseUrl = mContentMode == QgsComposerHtml::Url ?
QUrl( mActualFetchedUrl ) :
QUrl::fromLocalFile( QgsProject::instance()->fileInfo().absoluteFilePath() );
QUrl::fromLocalFile( mComposition->project()->fileInfo().absoluteFilePath() );
mWebPage->mainFrame()->setHtml( loadedHtml, baseUrl );

//set user stylesheet
Expand Down Expand Up @@ -547,8 +547,8 @@ void QgsComposerHtml::setExpressionContext( const QgsFeature &feature, QgsVector
if ( mComposition )
{
mDistanceArea->setEllipsoidalMode( mComposition->mapSettings().hasCrsTransformEnabled() );
mDistanceArea->setEllipsoid( mComposition->project()->ellipsoid() );
}
mDistanceArea->setEllipsoid( QgsProject::instance()->ellipsoid() );

// create JSON representation of feature
QgsJSONExporter exporter( layer );
Expand Down
3 changes: 2 additions & 1 deletion src/core/composer/qgscomposeritemcommand.cpp
Expand Up @@ -19,6 +19,7 @@
#include "qgscomposeritem.h"
#include "qgscomposerframe.h"
#include "qgscomposermultiframe.h"
#include "qgscomposition.h"
#include "qgsproject.h"
#include "qgslogger.h"

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

destItem->readXml( stateDoc.documentElement().firstChild().toElement(), stateDoc );
destItem->repaint();
QgsProject::instance()->setDirty( true );
destItem->composition()->project()->setDirty( true );
}

//
Expand Down
4 changes: 2 additions & 2 deletions src/core/composer/qgscomposerlabel.cpp
Expand Up @@ -165,7 +165,7 @@ void QgsComposerLabel::contentChanged()
//set this to true after html is loaded.
mHtmlLoaded = false;

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

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

update();
Expand Down
18 changes: 9 additions & 9 deletions src/core/composer/qgscomposerlegend.cpp
Expand Up @@ -46,14 +46,14 @@ QgsComposerLegend::QgsComposerLegend( QgsComposition* composition )
, mForceResize( false )
, mSizeToContents( true )
{
mLegendModel = new QgsLegendModel( QgsProject::instance()->layerTreeRoot() );
mLegendModel = new QgsLegendModel( mComposition->project()->layerTreeRoot() );

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

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

QgsComposerLegend::QgsComposerLegend()
Expand Down Expand Up @@ -225,7 +225,7 @@ bool QgsComposerLegend::resizeToContents() const

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

delete mCustomLayerTree;
mCustomLayerTree = rootGroup;
Expand All @@ -237,7 +237,7 @@ void QgsComposerLegend::setAutoUpdateModel( bool autoUpdate )
if ( autoUpdate == autoUpdateModel() )
return;

setCustomLayerTree( autoUpdate ? nullptr : QgsLayerTree::toGroup( QgsProject::instance()->layerTreeRoot()->clone() ) );
setCustomLayerTree( autoUpdate ? nullptr : QgsLayerTree::toGroup( mComposition->project()->layerTreeRoot()->clone() ) );
adjustBoxSize();
updateItem();
}
Expand Down Expand Up @@ -414,7 +414,7 @@ bool QgsComposerLegend::writeXml( QDomElement& elem, QDomDocument & doc ) const
return _writeXml( composerLegendElem, doc );
}

static void _readOldLegendGroup( QDomElement& elem, QgsLayerTreeGroup* parentGroup )
static void _readOldLegendGroup( QDomElement& elem, QgsLayerTreeGroup* parentGroup, QgsProject* project )
{
QDomElement itemElem = elem.firstChildElement();

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

_readOldLegendGroup( itemElem, nodeGroup );
_readOldLegendGroup( itemElem, nodeGroup, project );
}

itemElem = itemElem.nextSiblingElement();
Expand Down Expand Up @@ -527,7 +527,7 @@ bool QgsComposerLegend::readXml( const QDomElement& itemElem, const QDomDocument
{
// QGIS <= 2.4
QgsLayerTreeGroup* nodeRoot = new QgsLayerTreeGroup();
_readOldLegendGroup( oldLegendModelElem, nodeRoot );
_readOldLegendGroup( oldLegendModelElem, nodeRoot, mComposition->project() );
setCustomLayerTree( nodeRoot );
}
else
Expand Down Expand Up @@ -687,7 +687,7 @@ void QgsComposerLegend::doUpdateFilterByMap()
mLegendModel->setLayerStyleOverrides( QMap<QString, QString>() );


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

if ( mComposerMap && ( mLegendFilterByMap || filterByExpression || mInAtlas ) )
{
Expand Down
24 changes: 13 additions & 11 deletions src/core/composer/qgscomposermap.cpp
Expand Up @@ -77,10 +77,12 @@ QgsComposerMap::QgsComposerMap( QgsComposition *composition, int x, int y, int w
mXOffset = 0.0;
mYOffset = 0.0;

QgsProject* project = mComposition->project();

//get the color for map canvas background and set map background color accordingly
int bgRedInt = QgsProject::instance()->readNumEntry( QStringLiteral( "Gui" ), QStringLiteral( "/CanvasColorRedPart" ), 255 );
int bgGreenInt = QgsProject::instance()->readNumEntry( QStringLiteral( "Gui" ), QStringLiteral( "/CanvasColorGreenPart" ), 255 );
int bgBlueInt = QgsProject::instance()->readNumEntry( QStringLiteral( "Gui" ), QStringLiteral( "/CanvasColorBluePart" ), 255 );
int bgRedInt = project->readNumEntry( QStringLiteral( "Gui" ), QStringLiteral( "/CanvasColorRedPart" ), 255 );
int bgGreenInt = project->readNumEntry( QStringLiteral( "Gui" ), QStringLiteral( "/CanvasColorGreenPart" ), 255 );
int bgBlueInt = project->readNumEntry( QStringLiteral( "Gui" ), QStringLiteral( "/CanvasColorBluePart" ), 255 );
setBackgroundColor( QColor( bgRedInt, bgGreenInt, bgBlueInt ) );

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

if ( QgsProject::instance()->mapThemeCollection()->hasMapTheme( presetName ) )
renderLayers = QgsProject::instance()->mapThemeCollection()->mapThemeVisibleLayers( presetName );
if ( mComposition->project()->mapThemeCollection()->hasMapTheme( presetName ) )
renderLayers = mComposition->project()->mapThemeCollection()->mapThemeVisibleLayers( presetName );
else // fallback to using map canvas layers
renderLayers = mComposition->mapSettings().layers();
}
Expand All @@ -567,7 +569,7 @@ QList<QgsMapLayer*> QgsComposerMap::layersToRender( const QgsExpressionContext*
//need to convert layer names to layer ids
Q_FOREACH ( const QString& name, layerNames )
{
QList< QgsMapLayer* > matchingLayers = QgsProject::instance()->mapLayersByName( name );
QList< QgsMapLayer* > matchingLayers = mComposition->project()->mapLayersByName( name );
Q_FOREACH ( QgsMapLayer* layer, matchingLayers )
{
renderLayers << layer;
Expand Down Expand Up @@ -605,8 +607,8 @@ QMap<QString, QString> QgsComposerMap::layerStyleOverridesToRender( const QgsExp
presetName = exprVal.toString();
}

if ( QgsProject::instance()->mapThemeCollection()->hasMapTheme( presetName ) )
return QgsProject::instance()->mapThemeCollection()->mapThemeStyleOverrides( presetName );
if ( mComposition->project()->mapThemeCollection()->hasMapTheme( presetName ) )
return mComposition->project()->mapThemeCollection()->mapThemeStyleOverrides( presetName );
else
return QMap<QString, QString>();
}
Expand Down Expand Up @@ -1200,7 +1202,7 @@ bool QgsComposerMap::containsAdvancedEffects() const
void QgsComposerMap::connectUpdateSlot()
{
//connect signal from layer registry to update in case of new or deleted layers
QgsProject* project = QgsProject::instance();
QgsProject* project = mComposition->project();
if ( project )
{
connect( project, SIGNAL( layerWillBeRemoved( QString ) ), this, SLOT( layersChanged() ) );
Expand Down Expand Up @@ -1403,7 +1405,7 @@ bool QgsComposerMap::readXml( const QDomElement& itemElem, const QDomDocument& d
for ( int i = 0; i < layerIdNodeList.size(); ++i )
{
QString layerId = layerIdNodeList.at( i ).toElement().text();
if ( QgsMapLayer* ml = QgsProject::instance()->mapLayer( layerId ) )
if ( QgsMapLayer* ml = mComposition->project()->mapLayer( layerId ) )
mLayers << ml;
}
}
Expand Down Expand Up @@ -1615,7 +1617,7 @@ void QgsComposerMap::syncLayerSet()
QList<QgsMapLayer*> currentLayers;
if ( mKeepLayerSet )
{
currentLayers = QgsProject::instance()->mapLayers().values();
currentLayers = mComposition->project()->mapLayers().values();
}
else //only consider layers visible in the map
{
Expand Down
4 changes: 2 additions & 2 deletions src/core/composer/qgscomposermousehandles.cpp
Expand Up @@ -624,7 +624,7 @@ void QgsComposerMouseHandles::mouseReleaseEvent( QGraphicsSceneMouseEvent* event
subcommand->saveAfterState();
}
mComposition->undoStack()->push( parentCommand );
QgsProject::instance()->setDirty( true );
mComposition->project()->setDirty( true );
}
else if ( mCurrentMouseMoveAction != QgsComposerMouseHandles::NoAction )
{
Expand Down Expand Up @@ -664,7 +664,7 @@ void QgsComposerMouseHandles::mouseReleaseEvent( QGraphicsSceneMouseEvent* event
subcommand->saveAfterState();
}
mComposition->undoStack()->push( parentCommand );
QgsProject::instance()->setDirty( true );
mComposition->project()->setDirty( true );
}

deleteAlignItems();
Expand Down
3 changes: 2 additions & 1 deletion src/core/composer/qgscomposermultiframecommand.cpp
Expand Up @@ -17,6 +17,7 @@

#include "qgscomposermultiframecommand.h"
#include "qgscomposermultiframe.h"
#include "qgscomposition.h"
#include "qgsproject.h"

QgsComposerMultiFrameCommand::QgsComposerMultiFrameCommand( QgsComposerMultiFrame* multiFrame, const QString& text, QUndoCommand* parent ):
Expand Down Expand Up @@ -68,7 +69,7 @@ void QgsComposerMultiFrameCommand::restoreState( QDomDocument& stateDoc )
if ( mMultiFrame )
{
mMultiFrame->readXml( stateDoc.documentElement().firstChild().toElement(), stateDoc );
QgsProject::instance()->setDirty( true );
mMultiFrame->composition()->project()->setDirty( true );
}
}

Expand Down

0 comments on commit 8c340f7

Please sign in to comment.