40 #include <QStyleOptionGraphicsItem> 
   48   mBackgroundUpdateTimer = 
new QTimer( 
this );
 
   49   mBackgroundUpdateTimer->setSingleShot( 
true );
 
   50   connect( mBackgroundUpdateTimer, &QTimer::timeout, 
this, &QgsLayoutItemMap::recreateCachedImageInBackground );
 
   54   setCacheMode( QGraphicsItem::NoCache );
 
   61   mGridStack = qgis::make_unique< QgsLayoutItemMapGridStack >( 
this );
 
   62   mOverviewStack = qgis::make_unique< QgsLayoutItemMapOverviewStack >( 
this );
 
   95     mPainterJob->cancel(); 
 
  120   QList<QgsLayoutItemMap *> mapsList;
 
  121   mLayout->layoutItems( mapsList );
 
  130     if ( map->mMapId == mMapId )
 
  133     maxId = std::max( maxId, map->mMapId );
 
  138     mLayout->itemsModel()->updateItemDisplayName( 
this );
 
  150   return tr( 
"Map %1" ).arg( mMapId );
 
  162   mCachedLayerStyleOverridesPresetName.clear();
 
  166   updateAtlasFeature();
 
  171   if ( rect().isEmpty() )
 
  176   calculator.
setDpi( 25.4 );  
 
  183   double currentScaleDenominator = 
scale();
 
  190   double scaleRatio = scaleDenominator / currentScaleDenominator;
 
  191   mExtent.
scale( scaleRatio );
 
  193   if ( mAtlasDriven && mAtlasScalingMode == 
Fixed )
 
  200     calculator.
setDpi( 25.4 );  
 
  201     scaleRatio = scaleDenominator / calculator.
calculate( mExtent, rect().width() );
 
  202     mExtent.
scale( scaleRatio );
 
  226   QRectF currentRect = rect();
 
  228   double newHeight = currentRect.width() * mExtent.
height() / mExtent.
width();
 
  240   double currentWidthHeightRatio = 1.0;
 
  241   if ( !currentExtent.
isNull() )
 
  242     currentWidthHeightRatio = currentExtent.
width() / currentExtent.
height();
 
  244     currentWidthHeightRatio = rect().width() / rect().height();
 
  245   double newWidthHeightRatio = newExtent.
width() / newExtent.
height();
 
  247   if ( currentWidthHeightRatio < newWidthHeightRatio )
 
  250     double newHeight = newExtent.
width() / currentWidthHeightRatio;
 
  251     double deltaHeight = newHeight - newExtent.
height();
 
  258     double newWidth = currentWidthHeightRatio * newExtent.
height();
 
  259     double deltaWidth = newWidth - newExtent.
width();
 
  264   if ( mExtent == newExtent )
 
  283 QPolygonF QgsLayoutItemMap::calculateVisibleExtentPolygon( 
bool includeClipping )
 const 
  286   mapPolygon( mExtent, poly );
 
  288   if ( includeClipping && mItemClippingSettings->
isActive() )
 
  302   return calculateVisibleExtentPolygon( 
true );
 
  310     return mLayout->project()->crs();
 
  325   return _qgis_listRefToRaw( mLayers );
 
  330   mLayers = _qgis_listRawToRef( 
layers );
 
  335   if ( overrides == mLayerStyleOverrides )
 
  338   mLayerStyleOverrides = overrides;
 
  345   mLayerStyleOverrides.clear();
 
  346   for ( 
const QgsMapLayerRef &layerRef : qgis::as_const( mLayers ) )
 
  352       mLayerStyleOverrides.insert( layer->id(), style.
xmlData() );
 
  359   if ( mFollowVisibilityPreset == follow )
 
  362   mFollowVisibilityPreset = follow;
 
  363   if ( !mFollowVisibilityPresetName.isEmpty() )
 
  364     emit 
themeChanged( mFollowVisibilityPreset ? mFollowVisibilityPresetName : QString() );
 
  369   if ( name == mFollowVisibilityPresetName )
 
  372   mFollowVisibilityPresetName = name;
 
  373   if ( mFollowVisibilityPreset )
 
  379   mLastRenderedImageOffsetX -= dx;
 
  380   mLastRenderedImageOffsetY -= dy;
 
  383     transformShift( dx, dy );
 
  407   double mapY = mExtent.
yMinimum() + ( 1 - ( point.y() / rect().height() ) ) * ( mExtent.
yMaximum() - mExtent.
yMinimum() );
 
  413   centerX = mapX + ( centerX - mapX ) * ( 1.0 / factor );
 
  414   centerY = mapY + ( centerY - mapY ) * ( 1.0 / factor );
 
  416   double newIntervalX, newIntervalY;
 
  433   if ( mAtlasDriven && mAtlasScalingMode == 
Fixed )
 
  440     calculator.
setDpi( 25.4 );  
 
  441     double scaleRatio = 
scale() / calculator.
calculate( mExtent, rect().width() );
 
  442     mExtent.
scale( scaleRatio );
 
  458     if ( layer->dataProvider() && layer->providerType() == QLatin1String( 
"wms" ) )
 
  492   if ( mOverviewStack->containsAdvancedEffects() )
 
  498   if ( mGridStack->containsAdvancedEffects() )
 
  510   mMapRotation = rotation;
 
  511   mEvaluatedMapRotation = mMapRotation;
 
  525   mAtlasDriven = enabled;
 
  542     double margin = mAtlasMargin;
 
  550       margin = ddMargin / 100;
 
  562   if ( mGridStack->size() < 1 )
 
  565     mGridStack->addGrid( 
grid );
 
  567   return mGridStack->grid( 0 );
 
  572   if ( mOverviewStack->size() < 1 )
 
  575     mOverviewStack->addOverview( 
overview );
 
  577   return mOverviewStack->overview( 0 );
 
  588     mapElem.setAttribute( QStringLiteral( 
"keepLayerSet" ), QStringLiteral( 
"true" ) );
 
  592     mapElem.setAttribute( QStringLiteral( 
"keepLayerSet" ), QStringLiteral( 
"false" ) );
 
  595   if ( mDrawAnnotations )
 
  597     mapElem.setAttribute( QStringLiteral( 
"drawCanvasItems" ), QStringLiteral( 
"true" ) );
 
  601     mapElem.setAttribute( QStringLiteral( 
"drawCanvasItems" ), QStringLiteral( 
"false" ) );
 
  605   QDomElement extentElem = doc.createElement( QStringLiteral( 
"Extent" ) );
 
  610   mapElem.appendChild( extentElem );
 
  614     QDomElement crsElem = doc.createElement( QStringLiteral( 
"crs" ) );
 
  616     mapElem.appendChild( crsElem );
 
  620   mapElem.setAttribute( QStringLiteral( 
"followPreset" ), mFollowVisibilityPreset ? QStringLiteral( 
"true" ) : QStringLiteral( 
"false" ) );
 
  621   mapElem.setAttribute( QStringLiteral( 
"followPresetName" ), mFollowVisibilityPresetName );
 
  624   mapElem.setAttribute( QStringLiteral( 
"mapRotation" ), QString::number( mMapRotation ) );
 
  627   QDomElement layerSetElem = doc.createElement( QStringLiteral( 
"LayerSet" ) );
 
  632     QDomElement layerElem = doc.createElement( QStringLiteral( 
"Layer" ) );
 
  633     QDomText layerIdText = doc.createTextNode( layerRef.layerId );
 
  634     layerElem.appendChild( layerIdText );
 
  636     layerElem.setAttribute( QStringLiteral( 
"name" ), layerRef.name );
 
  637     layerElem.setAttribute( QStringLiteral( 
"source" ), layerRef.source );
 
  638     layerElem.setAttribute( QStringLiteral( 
"provider" ), layerRef.provider );
 
  640     layerSetElem.appendChild( layerElem );
 
  642   mapElem.appendChild( layerSetElem );
 
  645   if ( mKeepLayerStyles )
 
  647     QDomElement stylesElem = doc.createElement( QStringLiteral( 
"LayerStyles" ) );
 
  648     for ( 
auto styleIt = mLayerStyleOverrides.constBegin(); styleIt != mLayerStyleOverrides.constEnd(); ++styleIt )
 
  650       QDomElement styleElem = doc.createElement( QStringLiteral( 
"LayerStyle" ) );
 
  655       styleElem.setAttribute( QStringLiteral( 
"layerid" ), ref.
layerId );
 
  656       styleElem.setAttribute( QStringLiteral( 
"name" ), ref.
name );
 
  657       styleElem.setAttribute( QStringLiteral( 
"source" ), ref.
source );
 
  658       styleElem.setAttribute( QStringLiteral( 
"provider" ), ref.
provider );
 
  662       stylesElem.appendChild( styleElem );
 
  664     mapElem.appendChild( stylesElem );
 
  668   mGridStack->writeXml( mapElem, doc, context );
 
  671   mOverviewStack->writeXml( mapElem, doc, context );
 
  674   QDomElement atlasElem = doc.createElement( QStringLiteral( 
"AtlasMap" ) );
 
  675   atlasElem.setAttribute( QStringLiteral( 
"atlasDriven" ), mAtlasDriven );
 
  676   atlasElem.setAttribute( QStringLiteral( 
"scalingMode" ), mAtlasScalingMode );
 
  677   atlasElem.setAttribute( QStringLiteral( 
"margin" ), 
qgsDoubleToString( mAtlasMargin ) );
 
  678   mapElem.appendChild( atlasElem );
 
  680   mapElem.setAttribute( QStringLiteral( 
"labelMargin" ), mLabelMargin.
encodeMeasurement() );
 
  681   mapElem.setAttribute( QStringLiteral( 
"mapFlags" ), 
static_cast< int>( mMapFlags ) );
 
  683   QDomElement labelBlockingItemsElem = doc.createElement( QStringLiteral( 
"labelBlockingItems" ) );
 
  684   for ( 
const auto &item : qgis::as_const( mBlockingLabelItems ) )
 
  689     QDomElement blockingItemElem = doc.createElement( QStringLiteral( 
"item" ) );
 
  690     blockingItemElem.setAttribute( QStringLiteral( 
"uuid" ), item->uuid() );
 
  691     labelBlockingItemsElem.appendChild( blockingItemElem );
 
  693   mapElem.appendChild( labelBlockingItemsElem );
 
  696   mapElem.setAttribute( QStringLiteral( 
"isTemporal" ), 
isTemporal() ? 1 : 0 );
 
  699     mapElem.setAttribute( QStringLiteral( 
"temporalRangeBegin" ), 
temporalRange().begin().toString( Qt::ISODate ) );
 
  700     mapElem.setAttribute( QStringLiteral( 
"temporalRangeEnd" ), 
temporalRange().end().toString( Qt::ISODate ) );
 
  703   mAtlasClippingSettings->
writeXml( mapElem, doc, context );
 
  704   mItemClippingSettings->
writeXml( mapElem, doc, context );
 
  711   mUpdatesEnabled = 
false;
 
  714   QDomNodeList extentNodeList = itemElem.elementsByTagName( QStringLiteral( 
"Extent" ) );
 
  715   if ( !extentNodeList.isEmpty() )
 
  717     QDomElement extentElem = extentNodeList.at( 0 ).toElement();
 
  718     double xmin, xmax, ymin, ymax;
 
  719     xmin = extentElem.attribute( QStringLiteral( 
"xmin" ) ).toDouble();
 
  720     xmax = extentElem.attribute( QStringLiteral( 
"xmax" ) ).toDouble();
 
  721     ymin = extentElem.attribute( QStringLiteral( 
"ymin" ) ).toDouble();
 
  722     ymax = extentElem.attribute( QStringLiteral( 
"ymax" ) ).toDouble();
 
  726   QDomNodeList crsNodeList = itemElem.elementsByTagName( QStringLiteral( 
"crs" ) );
 
  728   if ( !crsNodeList.isEmpty() )
 
  730     QDomElement crsElem = crsNodeList.at( 0 ).toElement();
 
  736   mMapRotation = itemElem.attribute( QStringLiteral( 
"mapRotation" ), QStringLiteral( 
"0" ) ).toDouble();
 
  737   mEvaluatedMapRotation = mMapRotation;
 
  740   mFollowVisibilityPreset = itemElem.attribute( QStringLiteral( 
"followPreset" ) ).compare( QLatin1String( 
"true" ) ) == 0;
 
  741   mFollowVisibilityPresetName = itemElem.attribute( QStringLiteral( 
"followPresetName" ) );
 
  744   QString keepLayerSetFlag = itemElem.attribute( QStringLiteral( 
"keepLayerSet" ) );
 
  745   if ( keepLayerSetFlag.compare( QLatin1String( 
"true" ), Qt::CaseInsensitive ) == 0 )
 
  747     mKeepLayerSet = 
true;
 
  751     mKeepLayerSet = 
false;
 
  754   QString drawCanvasItemsFlag = itemElem.attribute( QStringLiteral( 
"drawCanvasItems" ), QStringLiteral( 
"true" ) );
 
  755   if ( drawCanvasItemsFlag.compare( QLatin1String( 
"true" ), Qt::CaseInsensitive ) == 0 )
 
  757     mDrawAnnotations = 
true;
 
  761     mDrawAnnotations = 
false;
 
  764   mLayerStyleOverrides.clear();
 
  768   QDomNodeList layerSetNodeList = itemElem.elementsByTagName( QStringLiteral( 
"LayerSet" ) );
 
  769   if ( !layerSetNodeList.isEmpty() )
 
  771     QDomElement layerSetElem = layerSetNodeList.at( 0 ).toElement();
 
  772     QDomNodeList layerIdNodeList = layerSetElem.elementsByTagName( QStringLiteral( 
"Layer" ) );
 
  773     mLayers.reserve( layerIdNodeList.size() );
 
  774     for ( 
int i = 0; i < layerIdNodeList.size(); ++i )
 
  776       QDomElement layerElem = layerIdNodeList.at( i ).toElement();
 
  777       QString layerId = layerElem.text();
 
  778       QString layerName = layerElem.attribute( QStringLiteral( 
"name" ) );
 
  779       QString layerSource = layerElem.attribute( QStringLiteral( 
"source" ) );
 
  780       QString layerProvider = layerElem.attribute( QStringLiteral( 
"provider" ) );
 
  782       QgsMapLayerRef ref( layerId, layerName, layerSource, layerProvider );
 
  789   QDomNodeList layerStylesNodeList = itemElem.elementsByTagName( QStringLiteral( 
"LayerStyles" ) );
 
  790   mKeepLayerStyles = !layerStylesNodeList.isEmpty();
 
  791   if ( mKeepLayerStyles )
 
  793     QDomElement layerStylesElem = layerStylesNodeList.at( 0 ).toElement();
 
  794     QDomNodeList layerStyleNodeList = layerStylesElem.elementsByTagName( QStringLiteral( 
"LayerStyle" ) );
 
  795     for ( 
int i = 0; i < layerStyleNodeList.size(); ++i )
 
  797       const QDomElement &layerStyleElement = layerStyleNodeList.at( i ).toElement();
 
  798       QString layerId = layerStyleElement.attribute( QStringLiteral( 
"layerid" ) );
 
  799       QString layerName = layerStyleElement.attribute( QStringLiteral( 
"name" ) );
 
  800       QString layerSource = layerStyleElement.attribute( QStringLiteral( 
"source" ) );
 
  801       QString layerProvider = layerStyleElement.attribute( QStringLiteral( 
"provider" ) );
 
  802       QgsMapLayerRef ref( layerId, layerName, layerSource, layerProvider );
 
  806       style.
readXml( layerStyleElement );
 
  812   mNumCachedLayers = 0;
 
  813   mCacheInvalidated = 
true;
 
  816   mOverviewStack->readXml( itemElem, doc, context );
 
  819   mGridStack->readXml( itemElem, doc, context );
 
  822   QDomNodeList atlasNodeList = itemElem.elementsByTagName( QStringLiteral( 
"AtlasMap" ) );
 
  823   if ( !atlasNodeList.isEmpty() )
 
  825     QDomElement atlasElem = atlasNodeList.at( 0 ).toElement();
 
  826     mAtlasDriven = ( atlasElem.attribute( QStringLiteral( 
"atlasDriven" ), QStringLiteral( 
"0" ) ) != QLatin1String( 
"0" ) );
 
  827     if ( atlasElem.hasAttribute( QStringLiteral( 
"fixedScale" ) ) ) 
 
  829       mAtlasScalingMode = ( atlasElem.attribute( QStringLiteral( 
"fixedScale" ), QStringLiteral( 
"0" ) ) != QLatin1String( 
"0" ) ) ? 
Fixed : 
Auto;
 
  831     else if ( atlasElem.hasAttribute( QStringLiteral( 
"scalingMode" ) ) )
 
  833       mAtlasScalingMode = 
static_cast<AtlasScalingMode>( atlasElem.attribute( QStringLiteral( 
"scalingMode" ) ).toInt() );
 
  835     mAtlasMargin = atlasElem.attribute( QStringLiteral( 
"margin" ), QStringLiteral( 
"0.1" ) ).toDouble();
 
  840   mMapFlags = 
static_cast< MapItemFlags
>( itemElem.attribute( QStringLiteral( 
"mapFlags" ), 
nullptr ).toInt() );
 
  843   mBlockingLabelItems.clear();
 
  844   mBlockingLabelItemUuids.clear();
 
  845   QDomNodeList labelBlockingNodeList = itemElem.elementsByTagName( QStringLiteral( 
"labelBlockingItems" ) );
 
  846   if ( !labelBlockingNodeList.isEmpty() )
 
  848     QDomElement blockingItems = labelBlockingNodeList.at( 0 ).toElement();
 
  849     QDomNodeList labelBlockingNodeList = blockingItems.childNodes();
 
  850     for ( 
int i = 0; i < labelBlockingNodeList.size(); ++i )
 
  852       const QDomElement &itemBlockingElement = labelBlockingNodeList.at( i ).toElement();
 
  853       const QString itemUuid = itemBlockingElement.attribute( QStringLiteral( 
"uuid" ) );
 
  854       mBlockingLabelItemUuids << itemUuid;
 
  858   mAtlasClippingSettings->
readXml( itemElem, doc, context );
 
  859   mItemClippingSettings->
readXml( itemElem, doc, context );
 
  864   setIsTemporal( itemElem.attribute( QStringLiteral( 
"isTemporal" ) ).toInt() );
 
  867     QDateTime begin = QDateTime::fromString( itemElem.attribute( QStringLiteral( 
"temporalRangeBegin" ) ), Qt::ISODate );
 
  868     QDateTime end = QDateTime::fromString( itemElem.attribute( QStringLiteral( 
"temporalRangeEnd" ) ), Qt::ISODate );
 
  872   mUpdatesEnabled = 
true;
 
  878   if ( mItemClippingSettings->
isActive() )
 
  889   if ( !
mLayout || !painter || !painter->device() || !mUpdatesEnabled )
 
  898   QRectF thisPaintRect = rect();
 
  904   if ( 
mLayout->renderContext().isPreviewRender() )
 
  907     painter->setClipRect( thisPaintRect );
 
  908     if ( !mCacheFinalImage || mCacheFinalImage->isNull() )
 
  911       painter->setBrush( QBrush( QColor( 125, 125, 125, 125 ) ) );
 
  912       painter->drawRect( thisPaintRect );
 
  913       painter->setBrush( Qt::NoBrush );
 
  915       messageFont.setPointSize( 12 );
 
  916       painter->setFont( messageFont );
 
  917       painter->setPen( QColor( 255, 255, 255, 255 ) );
 
  918       painter->drawText( thisPaintRect, Qt::AlignCenter | Qt::AlignHCenter, tr( 
"Rendering map" ) );
 
  919       if ( mPainterJob && mCacheInvalidated && !mDrawingPreview )
 
  923         mBackgroundUpdateTimer->start( 1 );
 
  925       else if ( !mPainterJob && !mDrawingPreview )
 
  929         mBackgroundUpdateTimer->start( 1 );
 
  934       if ( mCacheInvalidated && !mDrawingPreview )
 
  938         mBackgroundUpdateTimer->start( 1 );
 
  943       double imagePixelWidth = mCacheFinalImage->width(); 
 
  944       double scale = rect().width() / imagePixelWidth;
 
  948       painter->translate( mLastRenderedImageOffsetX + mXOffset, mLastRenderedImageOffsetY + mYOffset );
 
  950       painter->drawImage( 0, 0, *mCacheFinalImage );
 
  955     painter->setClipRect( thisPaintRect, Qt::NoClip );
 
  957     mOverviewStack->drawItems( painter, 
false );
 
  958     mGridStack->drawItems( painter );
 
  960     drawMapFrame( painter );
 
  968     QPaintDevice *paintDevice = painter->device();
 
  975 #if QT_VERSION >= QT_VERSION_CHECK(5, 13, 0) 
  977       painter->setRenderHint( QPainter::LosslessImageRendering, 
true );
 
  985       int widthInPixels = 
static_cast< int >( std::round( 
boundingRect().width() * layoutUnitsInInches * destinationDpi ) );
 
  986       int heightInPixels = 
static_cast< int >( std::round( 
boundingRect().height() * layoutUnitsInInches * destinationDpi ) );
 
  987       QImage image = QImage( widthInPixels, heightInPixels, QImage::Format_ARGB32 );
 
  989       image.fill( Qt::transparent );
 
  990       image.setDotsPerMeterX( 
static_cast< int >( std::round( 1000 * destinationDpi / 25.4 ) ) );
 
  991       image.setDotsPerMeterY( 
static_cast< int >( std::round( 1000 * destinationDpi / 25.4 ) ) );
 
  992       double dotsPerMM = destinationDpi / 25.4;
 
  993       QPainter p( &image );
 
  996       QRect imagePaintRect( 
static_cast< int >( std::round( tl.x() * dotsPerMM ) ),
 
  997                             static_cast< int >( std::round( tl.y() * dotsPerMM ) ),
 
  998                             static_cast< int >( std::round( thisPaintRect.width() * dotsPerMM ) ),
 
  999                             static_cast< int >( std::round( thisPaintRect.height() * dotsPerMM ) ) );
 
 1000       p.setClipRect( imagePaintRect );
 
 1002       p.translate( imagePaintRect.topLeft() );
 
 1006       if ( shouldDrawPart( Background ) )
 
 1008         p.scale( dotsPerMM, dotsPerMM );
 
 1009         drawMapBackground( &p );
 
 1010         p.scale( 1.0 / dotsPerMM, 1.0 / dotsPerMM );
 
 1013       drawMap( &p, cExtent, imagePaintRect.size(), image.logicalDpiX() );
 
 1018       p.scale( dotsPerMM, dotsPerMM );
 
 1020       if ( shouldDrawPart( OverviewMapExtent ) )
 
 1022         mOverviewStack->drawItems( &p, 
false );
 
 1024       if ( shouldDrawPart( Grid ) )
 
 1026         mGridStack->drawItems( &p );
 
 1031       painter->scale( 1 / dotsPerMM, 1 / dotsPerMM ); 
 
 1032       painter->drawImage( QPointF( -tl.x()* dotsPerMM, -tl.y() * dotsPerMM ), image );
 
 1033       painter->scale( dotsPerMM, dotsPerMM );
 
 1038       if ( shouldDrawPart( Background ) )
 
 1040         drawMapBackground( painter );
 
 1044       painter->setClipRect( thisPaintRect );
 
 1049         painter->translate( mXOffset, mYOffset );
 
 1051         double dotsPerMM = paintDevice->logicalDpiX() / 25.4;
 
 1053         painter->scale( 1 / dotsPerMM, 1 / dotsPerMM ); 
 
 1055         if ( mCurrentExportPart != NotLayered )
 
 1057           if ( !mStagedRendererJob )
 
 1059             createStagedRenderJob( cExtent, size, paintDevice->logicalDpiX() );
 
 1062           mStagedRendererJob->renderCurrentPart( painter );
 
 1066           drawMap( painter, cExtent, size, paintDevice->logicalDpiX() );
 
 1070       painter->setClipRect( thisPaintRect, Qt::NoClip );
 
 1072       if ( shouldDrawPart( OverviewMapExtent ) )
 
 1074         mOverviewStack->drawItems( painter, 
false );
 
 1076       if ( shouldDrawPart( Grid ) )
 
 1078         mGridStack->drawItems( painter );
 
 1083     if ( shouldDrawPart( Frame ) )
 
 1085       drawMapFrame( painter );
 
 1096          + ( layerCount + ( layerCount ? 1 : 0 ) ) 
 
 1097          + ( mGridStack->hasEnabledItems() ? 1 : 0 )
 
 1098          + ( mOverviewStack->hasEnabledItems() ? 1 : 0 )
 
 1104   mCurrentExportPart = Start;
 
 1106   mExportThemes = !mFollowVisibilityPreset ? 
mLayout->renderContext().exportThemes() : QStringList();
 
 1107   mExportThemeIt = mExportThemes.begin();
 
 1112   mCurrentExportPart = NotLayered;
 
 1113   mExportThemes.clear();
 
 1114   mExportThemeIt = mExportThemes.begin();
 
 1119   switch ( mCurrentExportPart )
 
 1124         mCurrentExportPart = Background;
 
 1130       mCurrentExportPart = Layer;
 
 1134       if ( mStagedRendererJob )
 
 1136         if ( mStagedRendererJob->nextPart() )
 
 1139           mStagedRendererJob.reset(); 
 
 1142       if ( mExportThemeIt != mExportThemes.end() && ++mExportThemeIt != mExportThemes.end() )
 
 1148       if ( mGridStack->hasEnabledItems() )
 
 1150         mCurrentExportPart = Grid;
 
 1156       for ( 
int i = 0; i < mOverviewStack->size(); ++i )
 
 1161           mCurrentExportPart = OverviewMapExtent;
 
 1167     case OverviewMapExtent:
 
 1170         mCurrentExportPart = Frame;
 
 1177       if ( isSelected() && !
mLayout->renderContext().isPreviewRender() )
 
 1179         mCurrentExportPart = SelectionBoxes;
 
 1184     case SelectionBoxes:
 
 1185       mCurrentExportPart = End;
 
 1206   switch ( mCurrentExportPart )
 
 1216       if ( !mExportThemes.empty() && mExportThemeIt != mExportThemes.end() )
 
 1219       if ( mStagedRendererJob )
 
 1221         switch ( mStagedRendererJob->currentStage() )
 
 1225             detail.
mapLayerId = mStagedRendererJob->currentLayerId();
 
 1226             detail.
compositionMode = mStagedRendererJob->currentLayerCompositionMode();
 
 1227             detail.
opacity = mStagedRendererJob->currentLayerOpacity();
 
 1233                 detail.
name = QStringLiteral( 
"%1: %2" ).arg( 
displayName(), layer->name() );
 
 1235             else if ( 
mLayout->project()->mainAnnotationLayer()->id() == detail.
mapLayerId )
 
 1241                 detail.
name = QStringLiteral( 
"%1: %2" ).arg( 
displayName(), tr( 
"Annotations" ) );
 
 1246               const QList<QgsLayoutItemMapOverview *> res = mOverviewStack->asList();
 
 1252                 if ( item->mapLayer() && detail.
mapLayerId == item->mapLayer()->id() )
 
 1255                     detail.
name = QStringLiteral( 
"%1 (%2): %3" ).arg( 
displayName(), detail.
mapTheme, item->mapLayer()->name() );
 
 1257                     detail.
name = QStringLiteral( 
"%1: %2" ).arg( 
displayName(), item->mapLayer()->name() );
 
 1266             detail.
mapLayerId  = mStagedRendererJob->currentLayerId();
 
 1272                 detail.
name = tr( 
"%1: %2 (Labels)" ).arg( 
displayName(), layer->name() );
 
 1307     case OverviewMapExtent:
 
 1315     case SelectionBoxes:
 
 1330 void QgsLayoutItemMap::drawMap( QPainter *painter, 
const QgsRectangle &extent, QSizeF size, 
double dpi )
 
 1344   if ( shouldDrawPart( OverviewMapExtent ) )
 
 1346     ms.setLayers( mOverviewStack->modifyMapLayerList( ms.layers() ) );
 
 1350 #ifdef HAVE_SERVER_PYTHON_PLUGINS 
 1351   job.setFeatureFilterProvider( 
mLayout->renderContext().featureFilterProvider() );
 
 1357   job.renderSynchronously();
 
 1359   mRenderingErrors = job.errors();
 
 1362 void QgsLayoutItemMap::recreateCachedImageInBackground()
 
 1368     QPainter *oldPainter = mPainter.release();
 
 1369     QImage *oldImage = mCacheRenderingImage.release();
 
 1372       oldJob->deleteLater();
 
 1380     mCacheRenderingImage.reset( 
nullptr );
 
 1384   Q_ASSERT( !mPainterJob );
 
 1385   Q_ASSERT( !mPainter );
 
 1386   Q_ASSERT( !mCacheRenderingImage );
 
 1392   int w = 
static_cast< int >( std::round( widthLayoutUnits * mPreviewScaleFactor ) );
 
 1393   int h = 
static_cast< int >( std::round( heightLayoutUnits * mPreviewScaleFactor ) );
 
 1396   if ( w > 5000 || h > 5000 )
 
 1401       h = 
static_cast< int>( std::round( w * heightLayoutUnits / widthLayoutUnits ) );
 
 1406       w = 
static_cast< int >( std::round( h * widthLayoutUnits / heightLayoutUnits ) );
 
 1410   if ( w <= 0 || h <= 0 )
 
 1413   mCacheRenderingImage.reset( 
new QImage( w, h, QImage::Format_ARGB32 ) );
 
 1416   mCacheRenderingImage->setDotsPerMeterX( 
static_cast< int >( std::round( 1000 * w / widthLayoutUnits ) ) );
 
 1417   mCacheRenderingImage->setDotsPerMeterY( 
static_cast< int >( std::round( 1000 * h / heightLayoutUnits ) ) );
 
 1420   mCacheRenderingImage->fill( QColor( 255, 255, 255, 0 ).rgba() );
 
 1425     if ( mItemClippingSettings->
isActive() )
 
 1427       QPainter p( mCacheRenderingImage.get() );
 
 1429       p.setPen( Qt::NoPen );
 
 1431       p.scale( mCacheRenderingImage->width() / widthLayoutUnits, mCacheRenderingImage->height() / heightLayoutUnits );
 
 1441   mCacheInvalidated = 
false;
 
 1442   mPainter.reset( 
new QPainter( mCacheRenderingImage.get() ) );
 
 1445   if ( shouldDrawPart( OverviewMapExtent ) )
 
 1447     settings.setLayers( mOverviewStack->modifyMapLayerList( settings.layers() ) );
 
 1452   mPainterJob->start();
 
 1464   mDrawingPreview = 
false;
 
 1488   jobMapSettings.
setRotation( mEvaluatedMapRotation );
 
 1492   if ( includeLayerSettings )
 
 1497     if ( !
mLayout->project()->mainAnnotationLayer()->isEmpty() )
 
 1500       layers.insert( 0, 
mLayout->project()->mainAnnotationLayer() );
 
 1507   if ( !
mLayout->renderContext().isPreviewRender() )
 
 1544   if ( mEvaluatedLabelMargin.
length() > 0 )
 
 1547     visiblePoly.append( visiblePoly.at( 0 ) ); 
 
 1548     const double layoutLabelMargin = 
mLayout->convertToLayoutUnits( mEvaluatedLabelMargin );
 
 1549     const double layoutLabelMarginInMapUnits = layoutLabelMargin / rect().width() * jobMapSettings.
extent().
width();
 
 1551     mapBoundaryGeom = mapBoundaryGeom.
buffer( -layoutLabelMarginInMapUnits, 0 );
 
 1552     labelBoundary = mapBoundaryGeom;
 
 1555   if ( !mBlockingLabelItems.isEmpty() )
 
 1568   if ( mAtlasClippingSettings->
enabled() && 
mLayout->reportContext().feature().isValid() )
 
 1579       if ( !labelBoundary.
isEmpty() )
 
 1581         labelBoundary = clipGeom.
intersection( labelBoundary );
 
 1585         labelBoundary = clipGeom;
 
 1590   if ( mItemClippingSettings->
isActive() )
 
 1599         const double layoutLabelMargin = 
mLayout->convertToLayoutUnits( mEvaluatedLabelMargin );
 
 1600         const double layoutLabelMarginInMapUnits = layoutLabelMargin / rect().width() * jobMapSettings.
extent().
width();
 
 1602         mapBoundaryGeom = mapBoundaryGeom.
buffer( -layoutLabelMarginInMapUnits, 0 );
 
 1603         if ( !labelBoundary.
isEmpty() )
 
 1605           labelBoundary = mapBoundaryGeom.
intersection( labelBoundary );
 
 1609           labelBoundary = mapBoundaryGeom;
 
 1615   if ( !labelBoundary.
isNull() )
 
 1618   return jobMapSettings;
 
 1625   mBlockingLabelItems.clear();
 
 1626   for ( 
const QString &
uuid : qgis::as_const( mBlockingLabelItemUuids ) )
 
 1635   mOverviewStack->finalizeRestoreFromXml();
 
 1636   mGridStack->finalizeRestoreFromXml();
 
 1648   return mCurrentRectangle;
 
 1681   QVariantList layersIds;
 
 1691   const QList<QgsMapLayer *> layersInMap = 
layersToRender( &context );
 
 1693   layersIds.reserve( layersInMap.count() );
 
 1694   layers.reserve( layersInMap.count() );
 
 1697     layersIds << layer->id();
 
 1703   scope->
addFunction( QStringLiteral( 
"is_layer_visible" ), 
new QgsExpressionContextUtils::GetLayerVisibility( layersInMap, 
scale() ) );
 
 1715   if ( extentWidth <= 0 )
 
 1719   return rect().width() / extentWidth;
 
 1724   double dx = mXOffset;
 
 1725   double dy = mYOffset;
 
 1726   transformShift( dx, dy );
 
 1727   QPolygonF poly = calculateVisibleExtentPolygon( 
false );
 
 1728   poly.translate( -dx, -dy );
 
 1734   if ( !mBlockingLabelItems.contains( item ) )
 
 1735     mBlockingLabelItems.append( item );
 
 1742   mBlockingLabelItems.removeAll( item );
 
 1749   return mBlockingLabelItems.contains( item );
 
 1758   if ( mOverviewStack )
 
 1760     for ( 
int i = 0; i < mOverviewStack->size(); ++i )
 
 1762       if ( mOverviewStack->item( i )->accept( visitor ) )
 
 1769     for ( 
int i = 0; i < mGridStack->size(); ++i )
 
 1771       if ( mGridStack->item( i )->accept( visitor ) )
 
 1784   mRenderedFeatureHandlers.append( handler );
 
 1789   mRenderedFeatureHandlers.removeAll( handler );
 
 1795   if ( mapPoly.empty() )
 
 1797     return QPointF( 0, 0 );
 
 1802   double dx = mapCoords.x() - rotationPoint.
x();
 
 1803   double dy = mapCoords.y() - rotationPoint.
y();
 
 1805   QgsPointXY backRotatedCoords( rotationPoint.
x() + dx, rotationPoint.
y() + dy );
 
 1808   double xItem = rect().width() * ( backRotatedCoords.
x() - unrotatedExtent.
xMinimum() ) / unrotatedExtent.
width();
 
 1809   double yItem = rect().height() * ( 1 - ( backRotatedCoords.
y() - unrotatedExtent.
yMinimum() ) / unrotatedExtent.
height() );
 
 1810   return QPointF( xItem, yItem );
 
 1824     mapPolygon( newExtent, poly );
 
 1825     QRectF bRect = poly.boundingRect();
 
 1839   mCacheInvalidated = 
true;
 
 1845   QRectF rectangle = rect();
 
 1846   double frameExtension = 
frameEnabled() ? pen().widthF() / 2.0 : 0.0;
 
 1848   double topExtension = 0.0;
 
 1849   double rightExtension = 0.0;
 
 1850   double bottomExtension = 0.0;
 
 1851   double leftExtension = 0.0;
 
 1854     mGridStack->calculateMaxGridExtension( topExtension, rightExtension, bottomExtension, leftExtension );
 
 1856   topExtension = std::max( topExtension, frameExtension );
 
 1857   rightExtension = std::max( rightExtension, frameExtension );
 
 1858   bottomExtension = std::max( bottomExtension, frameExtension );
 
 1859   leftExtension = std::max( leftExtension, frameExtension );
 
 1861   rectangle.setLeft( rectangle.left() - leftExtension );
 
 1862   rectangle.setRight( rectangle.right() + rightExtension );
 
 1863   rectangle.setTop( rectangle.top() - topExtension );
 
 1864   rectangle.setBottom( rectangle.bottom() + bottomExtension );
 
 1865   if ( rectangle != mCurrentRectangle )
 
 1867     prepareGeometryChange();
 
 1868     mCurrentRectangle = rectangle;
 
 1896     refreshMapExtents( &context );
 
 1898     if ( mExtent != beforeExtent )
 
 1905     refreshLabelMargin( 
false );
 
 1909     const QString previousTheme = mLastEvaluatedThemeName.isEmpty() ? mFollowVisibilityPresetName : mLastEvaluatedThemeName;
 
 1911     if ( mLastEvaluatedThemeName != previousTheme )
 
 1929   mCacheInvalidated = 
true;
 
 1934 void QgsLayoutItemMap::layersAboutToBeRemoved( 
const QList<QgsMapLayer *> &layers )
 
 1936   if ( !mLayers.isEmpty() || mLayerStyleOverrides.isEmpty() )
 
 1940       mLayerStyleOverrides.remove( layer->id() );
 
 1942     _qgis_removeLayers( mLayers, 
layers );
 
 1946 void QgsLayoutItemMap::painterJobFinished()
 
 1949   mPainterJob.reset( 
nullptr );
 
 1950   mPainter.reset( 
nullptr );
 
 1951   mCacheFinalImage = std::move( mCacheRenderingImage );
 
 1952   mLastRenderedImageOffsetX = 0;
 
 1953   mLastRenderedImageOffsetY = 0;
 
 1958 void QgsLayoutItemMap::shapeChanged()
 
 1963   double w = rect().width();
 
 1964   double h = rect().height();
 
 1967   double newWidth = mExtent.
width();
 
 1969   double newHeight = newWidth * h / w;
 
 1974   refreshMapExtents();
 
 1981 void QgsLayoutItemMap::mapThemeChanged( 
const QString &theme )
 
 1983   if ( theme == mCachedLayerStyleOverridesPresetName )
 
 1984     mCachedLayerStyleOverridesPresetName.clear(); 
 
 1987 void QgsLayoutItemMap::currentMapThemeRenamed( 
const QString &theme, 
const QString &newTheme )
 
 1989   if ( theme == mFollowVisibilityPresetName )
 
 1991     mFollowVisibilityPresetName = newTheme;
 
 1995 void QgsLayoutItemMap::connectUpdateSlot()
 
 2003              this, &QgsLayoutItemMap::layersAboutToBeRemoved );
 
 2007       if ( layers().isEmpty() )
 
 2036     if ( mAtlasScalingMode == Predefined )
 
 2037       updateAtlasFeature();
 
 2043   QPolygonF thisExtent = calculateVisibleExtentPolygon( 
false );
 
 2044   QTransform mapTransform;
 
 2045   QPolygonF thisRectPoly = QPolygonF( QRectF( 0, 0, rect().width(), rect().height() ) );
 
 2047   thisRectPoly.pop_back();
 
 2048   thisExtent.pop_back();
 
 2050   QPolygonF thisItemPolyInLayout = mapToScene( thisRectPoly );
 
 2053   QTransform::quadToQuad( thisItemPolyInLayout, thisExtent, mapTransform );
 
 2054   return mapTransform;
 
 2057 QList<QgsLabelBlockingRegion> QgsLayoutItemMap::createLabelBlockingRegions( 
const QgsMapSettings & )
 const 
 2060   QList< QgsLabelBlockingRegion > blockers;
 
 2061   blockers.reserve( mBlockingLabelItems.count() );
 
 2062   for ( 
const auto &item : qgis::as_const( mBlockingLabelItems ) )
 
 2069     if ( item->property( 
"wasVisible" ).isValid() )
 
 2071       if ( !item->property( 
"wasVisible" ).toBool() )
 
 2074     else if ( !item->isVisible() )
 
 2077     QPolygonF itemRectInMapCoordinates = mapTransform.map( item->mapToScene( item->rect() ) );
 
 2078     itemRectInMapCoordinates.append( itemRectInMapCoordinates.at( 0 ) ); 
 
 2087   return mLabelMargin;
 
 2092   mLabelMargin = margin;
 
 2093   refreshLabelMargin( 
false );
 
 2096 void QgsLayoutItemMap::updateToolTip()
 
 2105   if ( mFollowVisibilityPreset )
 
 2107     presetName = mFollowVisibilityPresetName;
 
 2111   else if ( !mExportThemes.empty() && mExportThemeIt != mExportThemes.end() )
 
 2112     presetName = *mExportThemeIt;
 
 2123   QList<QgsMapLayer *> renderLayers;
 
 2125   QString presetName = themeToRender( *evalContext );
 
 2126   if ( !presetName.isEmpty() )
 
 2128     if ( 
mLayout->project()->mapThemeCollection()->hasMapTheme( presetName ) )
 
 2129       renderLayers = 
mLayout->project()->mapThemeCollection()->mapThemeVisibleLayers( presetName );
 
 2131       renderLayers = 
mLayout->project()->mapThemeCollection()->masterVisibleLayers();
 
 2133   else if ( !
layers().isEmpty() )
 
 2139     renderLayers = 
mLayout->project()->mapThemeCollection()->masterVisibleLayers();
 
 2146     renderLayers.clear();
 
 2148     const QStringList layerNames = ddLayers.split( 
'|' );
 
 2150     for ( 
const QString &name : layerNames )
 
 2152       const QList< QgsMapLayer * > matchingLayers = 
mLayout->project()->mapLayersByName( name );
 
 2155         renderLayers << layer;
 
 2164     int removeAt = renderLayers.indexOf( 
mLayout->reportContext().layer() );
 
 2165     if ( removeAt != -1 )
 
 2167       renderLayers.removeAt( removeAt );
 
 2172   renderLayers.erase( std::remove_if( renderLayers.begin(), renderLayers.end(), []( 
QgsMapLayer * layer )
 
 2174     return !layer || !layer->isValid();
 
 2175   } ), renderLayers.end() );
 
 2177   return renderLayers;
 
 2180 QMap<QString, QString> QgsLayoutItemMap::layerStyleOverridesToRender( 
const QgsExpressionContext &context )
 const 
 2182   QString presetName = themeToRender( context );
 
 2183   if ( !presetName.isEmpty() )
 
 2185     if ( 
mLayout->project()->mapThemeCollection()->hasMapTheme( presetName ) )
 
 2187       if ( presetName != mCachedLayerStyleOverridesPresetName )
 
 2190         mCachedPresetLayerStyleOverrides = 
mLayout->project()->mapThemeCollection()->mapThemeStyleOverrides( presetName );
 
 2191         mCachedLayerStyleOverridesPresetName = presetName;
 
 2194       return mCachedPresetLayerStyleOverrides;
 
 2197       return QMap<QString, QString>();
 
 2199   else if ( mFollowVisibilityPreset )
 
 2201     QString presetName = mFollowVisibilityPresetName;
 
 2204     if ( 
mLayout->project()->mapThemeCollection()->hasMapTheme( presetName ) )
 
 2206       if ( presetName.isEmpty() || presetName != mCachedLayerStyleOverridesPresetName )
 
 2209         mCachedPresetLayerStyleOverrides = 
mLayout->project()->mapThemeCollection()->mapThemeStyleOverrides( presetName );
 
 2210         mCachedLayerStyleOverridesPresetName = presetName;
 
 2213       return mCachedPresetLayerStyleOverrides;
 
 2216       return QMap<QString, QString>();
 
 2218   else if ( mKeepLayerStyles )
 
 2220     return mLayerStyleOverrides;
 
 2224     return QMap<QString, QString>();
 
 2228 QgsRectangle QgsLayoutItemMap::transformedExtent()
 const 
 2230   double dx = mXOffset;
 
 2231   double dy = mYOffset;
 
 2232   transformShift( dx, dy );
 
 2236 void QgsLayoutItemMap::mapPolygon( 
const QgsRectangle &extent, QPolygonF &poly )
 const 
 2246     poly << QPointF( poly.at( 0 ) );
 
 2258   poly << QPointF( rotationPoint.x() - dx, rotationPoint.y() - dy );
 
 2264   poly << QPointF( rotationPoint.x() - dx, rotationPoint.y() - dy );
 
 2270   poly << QPointF( rotationPoint.x() - dx, rotationPoint.y() - dy );
 
 2276   poly << QPointF( rotationPoint.x() - dx, rotationPoint.y() - dy );
 
 2279   poly << QPointF( poly.at( 0 ) );
 
 2282 void QgsLayoutItemMap::transformShift( 
double &xShift, 
double &yShift )
 const 
 2285   double dxScaled = xShift * mmToMapUnits;
 
 2286   double dyScaled = - yShift * mmToMapUnits;
 
 2301   const QList< QgsAnnotation * > annotations = 
mLayout->project()->annotationManager()->annotations();
 
 2302   if ( annotations.isEmpty() )
 
 2312     if ( !annotation || !annotation->isVisible() )
 
 2316     if ( annotation->mapLayer() && !
layers.contains( annotation->mapLayer() ) )
 
 2319     drawAnnotation( annotation, rc );
 
 2333   double itemX, itemY;
 
 2336     QPointF mapPos = layoutMapPosForItem( annotation );
 
 2345   context.
painter()->translate( itemX, itemY );
 
 2348   double dotsPerMM = context.
painter()->device()->logicalDpiX() / 25.4;
 
 2349   context.
painter()->scale( 1 / dotsPerMM, 1 / dotsPerMM ); 
 
 2351   annotation->
render( context );
 
 2354 QPointF QgsLayoutItemMap::layoutMapPosForItem( 
const QgsAnnotation *annotation )
 const 
 2357     return QPointF( 0, 0 );
 
 2366   if ( annotationCrs != 
crs() )
 
 2373       t.transformInPlace( mapX, mapY, z );
 
 2383 void QgsLayoutItemMap::drawMapFrame( QPainter *p )
 
 2394 void QgsLayoutItemMap::drawMapBackground( QPainter *p )
 
 2405 bool QgsLayoutItemMap::shouldDrawPart( QgsLayoutItemMap::PartType part )
 const 
 2407   if ( mCurrentExportPart == NotLayered )
 
 2425       return mCurrentExportPart == Layer;
 
 2428       return mCurrentExportPart == Grid && mGridStack->hasEnabledItems();
 
 2430     case OverviewMapExtent:
 
 2431       return mCurrentExportPart == OverviewMapExtent && mOverviewStack->hasEnabledItems();
 
 2436     case SelectionBoxes:
 
 2437       return mCurrentExportPart == SelectionBoxes && isSelected();
 
 2458   bool useDdXMin = 
false;
 
 2459   bool useDdXMax = 
false;
 
 2460   bool useDdYMin = 
false;
 
 2461   bool useDdYMax = 
false;
 
 2492   if ( newExtent != mExtent )
 
 2498     double currentWidthHeightRatio = mExtent.
width() / mExtent.
height();
 
 2499     double newWidthHeightRatio = newExtent.
width() / newExtent.
height();
 
 2501     if ( currentWidthHeightRatio < newWidthHeightRatio )
 
 2504       double newHeight = newExtent.
width() / currentWidthHeightRatio;
 
 2505       double deltaHeight = newHeight - newExtent.
height();
 
 2512       double newWidth = currentWidthHeightRatio * newExtent.
height();
 
 2513       double deltaWidth = newWidth - newExtent.
width();
 
 2518     mExtent = newExtent;
 
 2528     newExtent = mExtent;
 
 2531   if ( useDdXMax || useDdXMin || useDdYMax || useDdYMin )
 
 2535     if ( useDdXMin && !useDdXMax )
 
 2541     else if ( !useDdXMin && useDdXMax )
 
 2547     if ( useDdYMin && !useDdYMax )
 
 2553     else if ( !useDdYMin && useDdYMax )
 
 2560     if ( newExtent != mExtent )
 
 2562       mExtent = newExtent;
 
 2579 void QgsLayoutItemMap::refreshLabelMargin( 
bool updateItem )
 
 2592 void QgsLayoutItemMap::updateAtlasFeature()
 
 2611   if ( mAtlasScalingMode == 
Fixed || mAtlasScalingMode == 
Predefined || isPointLayer )
 
 2616     double originalScale = calc.
calculate( originalExtent, rect().width() );
 
 2617     double geomCenterX = ( xa1 + xa2 ) / 2.0;
 
 2618     double geomCenterY = ( ya1 + ya2 ) / 2.0;
 
 2619     QVector<qreal> scales;
 
 2621     if ( !
mLayout->reportContext().predefinedScales().empty() ) 
 
 2622       scales = 
mLayout->reportContext().predefinedScales();
 
 2624       scales = 
mLayout->renderContext().predefinedScales();
 
 2626     if ( mAtlasScalingMode == 
Fixed || isPointLayer || scales.isEmpty() )
 
 2629       double xMin = geomCenterX - originalExtent.
width() / 2.0;
 
 2630       double yMin = geomCenterY - originalExtent.
height() / 2.0;
 
 2633                                 xMin + originalExtent.
width(),
 
 2634                                 yMin + originalExtent.
height() );
 
 2638       double newScale = calc.
calculate( newExtent, rect().width() );
 
 2639       newExtent.
scale( originalScale / newScale );
 
 2644       double newWidth = originalExtent.
width();
 
 2645       double newHeight = originalExtent.
height();
 
 2646       for ( 
int i = 0; i < scales.size(); i++ )
 
 2648         double ratio = scales[i] / originalScale;
 
 2649         newWidth = originalExtent.
width() * ratio;
 
 2650         newHeight = originalExtent.
height() * ratio;
 
 2653         double xMin = geomCenterX - newWidth / 2.0;
 
 2654         double yMin = geomCenterY - newHeight / 2.0;
 
 2662         double newScale = calc.
calculate( newExtent, rect().width() );
 
 2663         newExtent.
scale( scales[i] / newScale );
 
 2673   else if ( mAtlasScalingMode == 
Auto )
 
 2677     double geomRatio = bounds.
width() / bounds.
height();
 
 2678     double mapRatio = originalExtent.
width() / originalExtent.
height();
 
 2681     if ( geomRatio < mapRatio )
 
 2684       double adjWidth = ( mapRatio * bounds.
height() - bounds.
width() ) / 2.0;
 
 2689     else if ( geomRatio > mapRatio )
 
 2692       double adjHeight = ( bounds.
width() / mapRatio - bounds.
height() ) / 2.0;
 
 2698     const double evaluatedAtlasMargin = 
atlasMargin();
 
 2699     if ( evaluatedAtlasMargin > 0.0 )
 
 2701       newExtent.
scale( 1 + evaluatedAtlasMargin );
 
 2717   if ( mEvaluatedMapRotation != 0.0 )
 
 2727     double dx = std::max( std::abs( prevCenter.
x() - bounds.
xMinimum() ),
 
 2728                           std::abs( prevCenter.
x() - bounds.
xMaximum() ) );
 
 2729     double dy = std::max( std::abs( prevCenter.
y() - bounds.
yMinimum() ),
 
 2730                           std::abs( prevCenter.
y() - bounds.
yMaximum() ) );
 
 2733                          center.
x() + dx, center.
y() + dy );
 
 2741 void QgsLayoutItemMap::createStagedRenderJob( 
const QgsRectangle &extent, 
const QSizeF size, 
double dpi )
 
 2744   settings.
setLayers( mOverviewStack->modifyMapLayerList( settings.
layers() ) );
 
 2746   mStagedRendererJob = qgis::make_unique< QgsMapRendererStagedRenderJob >( settings,
 
 2749                        : QgsMapRendererStagedRenderJob::Flags() );
 
 2750   mStagedRendererJob->start();
 
 2766              this, &QgsLayoutItemMapAtlasClippingSettings::layersAboutToBeRemoved );
 
 2772   return mClipToAtlasFeature;
 
 2777   if ( 
enabled == mClipToAtlasFeature )
 
 2780   mClipToAtlasFeature = 
enabled;
 
 2786   return mFeatureClippingType;
 
 2791   if ( mFeatureClippingType == type )
 
 2794   mFeatureClippingType = type;
 
 2800   return mForceLabelsInsideFeature;
 
 2805   if ( forceInside == mForceLabelsInsideFeature )
 
 2808   mForceLabelsInsideFeature = forceInside;
 
 2814   return mRestrictToLayers;
 
 2819   if ( mRestrictToLayers == 
enabled )
 
 2828   return _qgis_listRefToRaw( mLayersToClip );
 
 2839   QDomElement settingsElem = document.createElement( QStringLiteral( 
"atlasClippingSettings" ) );
 
 2840   settingsElem.setAttribute( QStringLiteral( 
"enabled" ), mClipToAtlasFeature ? QStringLiteral( 
"1" ) : QStringLiteral( 
"0" ) );
 
 2841   settingsElem.setAttribute( QStringLiteral( 
"forceLabelsInside" ), mForceLabelsInsideFeature ? QStringLiteral( 
"1" ) : QStringLiteral( 
"0" ) );
 
 2842   settingsElem.setAttribute( QStringLiteral( 
"clippingType" ), QString::number( 
static_cast<int>( mFeatureClippingType ) ) );
 
 2843   settingsElem.setAttribute( QStringLiteral( 
"restrictLayers" ), mRestrictToLayers ? QStringLiteral( 
"1" ) : QStringLiteral( 
"0" ) );
 
 2846   QDomElement layerSetElem = document.createElement( QStringLiteral( 
"layersToClip" ) );
 
 2851     QDomElement layerElem = document.createElement( QStringLiteral( 
"Layer" ) );
 
 2852     QDomText layerIdText = document.createTextNode( layerRef.layerId );
 
 2853     layerElem.appendChild( layerIdText );
 
 2855     layerElem.setAttribute( QStringLiteral( 
"name" ), layerRef.name );
 
 2856     layerElem.setAttribute( QStringLiteral( 
"source" ), layerRef.source );
 
 2857     layerElem.setAttribute( QStringLiteral( 
"provider" ), layerRef.provider );
 
 2859     layerSetElem.appendChild( layerElem );
 
 2861   settingsElem.appendChild( layerSetElem );
 
 2863   element.appendChild( settingsElem );
 
 2869   const QDomElement settingsElem = element.firstChildElement( QStringLiteral( 
"atlasClippingSettings" ) );
 
 2871   mClipToAtlasFeature = settingsElem.attribute( QStringLiteral( 
"enabled" ), QStringLiteral( 
"0" ) ).toInt();
 
 2872   mForceLabelsInsideFeature = settingsElem.attribute( QStringLiteral( 
"forceLabelsInside" ), QStringLiteral( 
"0" ) ).toInt();
 
 2874   mRestrictToLayers = settingsElem.attribute( QStringLiteral( 
"restrictLayers" ), QStringLiteral( 
"0" ) ).toInt();
 
 2876   mLayersToClip.clear();
 
 2877   QDomNodeList layerSetNodeList = settingsElem.elementsByTagName( QStringLiteral( 
"layersToClip" ) );
 
 2878   if ( !layerSetNodeList.isEmpty() )
 
 2880     QDomElement layerSetElem = layerSetNodeList.at( 0 ).toElement();
 
 2881     QDomNodeList layerIdNodeList = layerSetElem.elementsByTagName( QStringLiteral( 
"Layer" ) );
 
 2882     mLayersToClip.reserve( layerIdNodeList.size() );
 
 2883     for ( 
int i = 0; i < layerIdNodeList.size(); ++i )
 
 2885       QDomElement layerElem = layerIdNodeList.at( i ).toElement();
 
 2886       QString layerId = layerElem.text();
 
 2887       QString layerName = layerElem.attribute( QStringLiteral( 
"name" ) );
 
 2888       QString layerSource = layerElem.attribute( QStringLiteral( 
"source" ) );
 
 2889       QString layerProvider = layerElem.attribute( QStringLiteral( 
"provider" ) );
 
 2891       QgsMapLayerRef ref( layerId, layerName, layerSource, layerProvider );
 
 2894       mLayersToClip << ref;
 
 2901 void QgsLayoutItemMapAtlasClippingSettings::layersAboutToBeRemoved( 
const QList<QgsMapLayer *> &layers )
 
 2903   if ( !mLayersToClip.isEmpty() )
 
 2905     _qgis_removeLayers( mLayersToClip, layers );
 
 2920   return mEnabled && mClipPathSource;
 
 2935   if ( mClipPathSource )
 
 2938     mClipPathSource->refresh();
 
 2947     QgsGeometry clipGeom( mClipPathSource->clipPath() );
 
 2958     QgsGeometry clipGeom( mClipPathSource->clipPath() );
 
 2959     clipGeom.
transform( mMap->sceneTransform().inverted() );
 
 2974   if ( mClipPathSource == item )
 
 2977   if ( mClipPathSource )
 
 2986   mClipPathSource = item;
 
 2988   if ( mClipPathSource )
 
 2997     mClipPathSource->refresh();
 
 3011   return mClipPathSource;
 
 3016   return mFeatureClippingType;
 
 3021   if ( mFeatureClippingType == type )
 
 3024   mFeatureClippingType = type;
 
 3030   return mForceLabelsInsideClipPath;
 
 3035   if ( forceInside == mForceLabelsInsideClipPath )
 
 3038   mForceLabelsInsideClipPath = forceInside;
 
 3044   QDomElement settingsElem = document.createElement( QStringLiteral( 
"itemClippingSettings" ) );
 
 3045   settingsElem.setAttribute( QStringLiteral( 
"enabled" ), mEnabled ? QStringLiteral( 
"1" ) : QStringLiteral( 
"0" ) );
 
 3046   settingsElem.setAttribute( QStringLiteral( 
"forceLabelsInside" ), mForceLabelsInsideClipPath ? QStringLiteral( 
"1" ) : QStringLiteral( 
"0" ) );
 
 3047   settingsElem.setAttribute( QStringLiteral( 
"clippingType" ), QString::number( 
static_cast<int>( mFeatureClippingType ) ) );
 
 3048   if ( mClipPathSource )
 
 3049     settingsElem.setAttribute( QStringLiteral( 
"clipSource" ), mClipPathSource->uuid() );
 
 3051     settingsElem.setAttribute( QStringLiteral( 
"clipSource" ), QString() );
 
 3053   element.appendChild( settingsElem );
 
 3059   const QDomElement settingsElem = element.firstChildElement( QStringLiteral( 
"itemClippingSettings" ) );
 
 3061   mEnabled = settingsElem.attribute( QStringLiteral( 
"enabled" ), QStringLiteral( 
"0" ) ).toInt();
 
 3062   mForceLabelsInsideClipPath = settingsElem.attribute( QStringLiteral( 
"forceLabelsInside" ), QStringLiteral( 
"0" ) ).toInt();
 
 3064   mClipPathUuid = settingsElem.attribute( QStringLiteral( 
"clipSource" ) );
 
 3071   if ( !mClipPathUuid.isEmpty() )
 
virtual QPainterPath asQPainterPath() const =0
Returns the geometry represented as a QPainterPath.
QDateTime valueAsDateTime(int key, const QgsExpressionContext &context, const QDateTime &defaultDateTime=QDateTime(), bool *ok=nullptr) const
Calculates the current value of the property with the specified key and interprets it as a datetime.
double valueAsDouble(int key, const QgsExpressionContext &context, double defaultValue=0.0, bool *ok=nullptr) const
Calculates the current value of the property with the specified key and interprets it as a double.
QString valueAsString(int key, const QgsExpressionContext &context, const QString &defaultString=QString(), bool *ok=nullptr) const
Calculates the current value of the property with the specified key and interprets it as a string.
Abstract base class for annotation items which are drawn over a map.
QgsCoordinateReferenceSystem mapPositionCrs() const
Returns the CRS of the map position, or an invalid CRS if the annotation does not have a fixed map po...
void render(QgsRenderContext &context) const
Renders the annotation to a target render context.
bool isVisible() const
Returns true if the annotation is visible and should be rendered.
QPointF relativePosition() const
Returns the relative position of the annotation, if it is not attached to a fixed map position.
static QgsCoordinateReferenceSystemRegistry * coordinateReferenceSystemRegistry()
Returns the application's coordinate reference system (CRS) registry, which handles known CRS definit...
static QIcon getThemeIcon(const QString &name)
Helper to get a theme icon.
void userCrsChanged(const QString &id)
Emitted whenever an existing user CRS definition is changed.
This class represents a coordinate reference system (CRS).
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
QString toProj() const
Returns a Proj string representation of this CRS.
bool readXml(const QDomNode &node)
Restores state from the given DOM node.
QString ellipsoidAcronym() const
Returns the ellipsoid acronym for the ellipsoid used by the CRS.
QString description() const
Returns the descriptive name of the CRS, e.g., "WGS 84" or "GDA 94 / Vicgrid94".
QString projectionAcronym() const
Returns the projection acronym for the projection used by the CRS.
void updateDefinition()
Updates the definition and parameters of the coordinate reference system to their latest values.
QString authid() const
Returns the authority identifier for the CRS.
@ WKT_PREFERRED
Preferred format, matching the most recent WKT ISO standard. Currently an alias to WKT2_2019,...
bool writeXml(QDomNode &node, QDomDocument &doc) const
Stores state to the given Dom node in the given document.
QString toWkt(WktVariant variant=WKT1_GDAL, bool multiline=false, int indentationWidth=4) const
Returns a WKT representation of this CRS.
Q_GADGET QgsUnitTypes::DistanceUnit mapUnits
Custom exception class for Coordinate Reference System related exceptions.
Single scope for storing variables and functions for use within a QgsExpressionContext.
void addFunction(const QString &name, QgsScopedExpressionFunction *function)
Adds a function to the scope.
void addVariable(const QgsExpressionContextScope::StaticVariable &variable)
Adds a variable into the context scope.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
void appendScope(QgsExpressionContextScope *scope)
Appends a scope to the end of the context.
A geometry is the spatial representation of a feature.
const QgsAbstractGeometry * constGet() const SIP_HOLDGIL
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
OperationResult rotate(double rotation, const QgsPointXY ¢er)
Rotate this geometry around the Z axis.
static QgsGeometry fromQPolygonF(const QPolygonF &polygon)
Construct geometry from a QPolygonF.
static QgsGeometry fromRect(const QgsRectangle &rect) SIP_HOLDGIL
Creates a new geometry from a QgsRectangle.
QgsGeometry intersection(const QgsGeometry &geometry) const
Returns a geometry representing the points shared by this geometry and other.
static QgsGeometry fromPointXY(const QgsPointXY &point) SIP_HOLDGIL
Creates a new geometry from a QgsPointXY object.
QPolygonF asQPolygonF() const SIP_HOLDGIL
Returns contents of the geometry as a QPolygonF.
QgsGeometry buffer(double distance, int segments) const
Returns a buffer region around this geometry having the given width and with a specified number of se...
bool isEmpty() const
Returns true if the geometry is empty (eg a linestring with no vertices, or a collection with no geom...
OperationResult transform(const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection direction=QgsCoordinateTransform::ForwardTransform, bool transformZ=false) SIP_THROW(QgsCsException)
Transforms this geometry as described by the coordinate transform ct.
QgsRectangle boundingBox() const
Returns the bounding box of the geometry.
Label blocking region (in map coordinates and CRS).
Stores global configuration for labeling engine.
@ UsePartialCandidates
Whether to use also label candidates that are partially outside of the map view.
@ DrawUnplacedLabels
Whether to render unplaced labels as an indicator/warning for users.
void setFlag(Flag f, bool enabled=true)
Sets whether a particual flag is enabled.
void layerOrderChanged()
Emitted when the layer order has changed.
Contains settings relating to clipping a layout map by the current atlas feature.
void setFeatureClippingType(QgsMapClippingRegion::FeatureClippingType type)
Sets the feature clipping type to apply when clipping to the current atlas feature.
bool restrictToLayers() const
Returns true if clipping should be restricted to a subset of layers.
QgsLayoutItemMapAtlasClippingSettings(QgsLayoutItemMap *map=nullptr)
Constructor for QgsLayoutItemMapAtlasClippingSettings, with the specified map parent.
bool readXml(const QDomElement &element, const QDomDocument &doc, const QgsReadWriteContext &context)
Sets the setting's state from a DOM document, where element is the DOM node corresponding to a 'Layou...
bool writeXml(QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context) const
Stores settings in a DOM element, where element is the DOM element corresponding to a 'LayoutMap' tag...
void setRestrictToLayers(bool enabled)
Sets whether clipping should be restricted to a subset of layers.
void setLayersToClip(const QList< QgsMapLayer * > &layers)
Sets the list of map layers to clip to the atlas feature.
QList< QgsMapLayer * > layersToClip() const
Returns the list of map layers to clip to the atlas feature.
void setEnabled(bool enabled)
Sets whether the map content should be clipped to the current atlas feature.
void changed()
Emitted when the atlas clipping settings are changed.
bool forceLabelsInsideFeature() const
Returns true if labels should only be placed inside the atlas feature geometry.
bool enabled() const
Returns true if the map content should be clipped to the current atlas feature.
void setForceLabelsInsideFeature(bool forceInside)
Sets whether labels should only be placed inside the atlas feature geometry.
QgsMapClippingRegion::FeatureClippingType featureClippingType() const
Returns the feature clipping type to apply when clipping to the current atlas feature.
An individual grid which is drawn above the map content in a QgsLayoutItemMap.
Contains settings relating to clipping a layout map by another layout item.
bool writeXml(QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context) const
Stores settings in a DOM element, where element is the DOM element corresponding to a 'LayoutMap' tag...
void setForceLabelsInsideClipPath(bool forceInside)
Sets whether labels should only be placed inside the clip path geometry.
void setSourceItem(QgsLayoutItem *item)
Sets the source item which will provide the clipping path for the map.
QgsLayoutItemMapItemClipPathSettings(QgsLayoutItemMap *map=nullptr)
Constructor for QgsLayoutItemMapItemClipPathSettings, with the specified map parent.
bool readXml(const QDomElement &element, const QDomDocument &doc, const QgsReadWriteContext &context)
Sets the setting's state from a DOM document, where element is the DOM node corresponding to a 'Layou...
QgsGeometry clipPathInMapItemCoordinates() const
Returns the clipping path geometry, in the map item's coordinate space.
QgsGeometry clippedMapExtent() const
Returns the geometry to use for clipping the parent map, in the map item's CRS.
QgsLayoutItem * sourceItem()
Returns the source item which will provide the clipping path for the map, or nullptr if no item is se...
void setEnabled(bool enabled)
Sets whether the map content should be clipped to the associated item.
bool forceLabelsInsideClipPath() const
Returns true if labels should only be placed inside the clip path geometry.
void finalizeRestoreFromXml()
To be called after all pending items have been restored from XML.
QgsMapClippingRegion::FeatureClippingType featureClippingType() const
Returns the feature clipping type to apply when clipping to the associated item.
bool enabled() const
Returns true if the map content should be clipped to the associated item.
QgsMapClippingRegion toMapClippingRegion() const
Returns the clip path as a map clipping region.
void changed()
Emitted when the item clipping settings are changed.
void setFeatureClippingType(QgsMapClippingRegion::FeatureClippingType type)
Sets the feature clipping type to apply when clipping to the associated item.
bool isActive() const
Returns true if the item clipping is enabled and set to a valid source item.
An item which is drawn inside a QgsLayoutItemMap, e.g., a grid or map overview.
@ StackAboveMapLabels
Render above all map layers and labels.
StackingPosition stackingPosition() const
Returns the item's stacking position, which specifies where the in the map's stack the item should be...
bool enabled() const
Returns whether the item will be drawn.
An individual overview which is drawn above the map content in a QgsLayoutItemMap,...
Layout graphical items for displaying a map.
void setFollowVisibilityPreset(bool follow)
Sets whether the map should follow a map theme.
bool nextExportPart() override
Moves to the next export part for a multi-layered export item, during a multi-layered export.
void removeRenderedFeatureHandler(QgsRenderedFeatureHandlerInterface *handler)
Removes a previously added rendered feature handler.
void extentChanged()
Emitted when the map's extent changes.
QPointF mapToItemCoords(QPointF mapCoords) const
Transforms map coordinates to item coordinates (considering rotation and move offset)
bool accept(QgsStyleEntityVisitorInterface *visitor) const override
Accepts the specified style entity visitor, causing it to visit all style entities associated with th...
~QgsLayoutItemMap() override
QIcon icon() const override
Returns the item's icon.
void preparedForAtlas()
Emitted when the map has been prepared for atlas rendering, just before actual rendering.
void setFollowVisibilityPresetName(const QString &name)
Sets preset name for map rendering.
QTransform layoutToMapCoordsTransform() const
Creates a transform from layout coordinates to map coordinates.
bool writePropertiesToElement(QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context) const override
Stores item state within an XML DOM element.
QgsMapSettings mapSettings(const QgsRectangle &extent, QSizeF size, double dpi, bool includeLayerSettings) const
Returns map settings that will be used for drawing of the map.
bool isLabelBlockingItem(QgsLayoutItem *item) const
Returns true if the specified item is a "label blocking item".
void storeCurrentLayerStyles()
Stores the current project layer styles into style overrides.
void setAtlasDriven(bool enabled)
Sets whether the map extent will follow the current atlas feature.
QgsLayoutMeasurement labelMargin() const
Returns the margin from the map edges in which no labels may be placed.
AtlasScalingMode
Scaling modes used for the serial rendering (atlas)
@ Predefined
A scale is chosen from the predefined scales.
@ Auto
The extent is adjusted so that each feature is fully visible.
@ Fixed
The current scale of the map is used for each feature of the atlas.
bool requiresRasterization() const override
Returns true if the item is drawn in such a way that forces the whole layout to be rasterized when ex...
Q_DECL_DEPRECATED int numberExportLayers() const override
Returns the number of layers that this item requires for exporting during layered exports (e....
void layerStyleOverridesChanged()
Emitted when layer style overrides are changed...
void updateBoundingRect()
Updates the bounding rect of this item. Call this function before doing any changes related to annota...
void moveContent(double dx, double dy) override
Moves the content of the item, by a specified dx and dy in layout units.
QgsLayoutItemMapGrid * grid()
Returns the map item's first grid.
void mapRotationChanged(double newRotation)
Emitted when the map's rotation changes.
int type() const override
friend class QgsLayoutItemMapOverview
void setExtent(const QgsRectangle &extent)
Sets a new extent for the map.
void paint(QPainter *painter, const QStyleOptionGraphicsItem *itemStyle, QWidget *pWidget) override
void draw(QgsLayoutItemRenderContext &context) override
Draws the item's contents using the specified item render context.
QPolygonF visibleExtentPolygon() const
Returns a polygon representing the current visible map extent, considering map extents and rotation.
QgsRectangle requestedExtent() const
Calculates the extent to request and the yShift of the top-left point in case of rotation.
QgsLayoutItemMap(QgsLayout *layout)
Constructor for QgsLayoutItemMap, with the specified parent layout.
void setMapFlags(QgsLayoutItemMap::MapItemFlags flags)
Sets the map item's flags, which control how the map content is drawn.
void refreshDataDefinedProperty(QgsLayoutObject::DataDefinedProperty property=QgsLayoutObject::AllProperties) override
void zoomContent(double factor, QPointF point) override
Zooms content of item.
QList< QgsMapLayer * > layersToRender(const QgsExpressionContext *context=nullptr) const
Returns a list of the layers which will be rendered within this map item, considering any locked laye...
void crsChanged()
Emitted when the map's coordinate reference system is changed.
void setLayers(const QList< QgsMapLayer * > &layers)
Sets the stored layers set.
QPolygonF transformedMapPolygon() const
Returns extent that considers rotation and shift with mOffsetX / mOffsetY.
static QgsLayoutItemMap * create(QgsLayout *layout)
Returns a new map item for the specified layout.
QRectF boundingRect() const override
QString displayName() const override
Gets item display name.
bool atlasDriven() const
Returns whether the map extent is set to follow the current atlas feature.
void setLayerStyleOverrides(const QMap< QString, QString > &overrides)
Sets the stored overrides of styles for layers.
void stopLayeredExport() override
Stops a multi-layer export operation.
void addRenderedFeatureHandler(QgsRenderedFeatureHandlerInterface *handler)
Adds a rendered feature handler to use while rendering the map.
QPainterPath framePath() const override
Returns the path to use when drawing the item's frame or background.
QgsExpressionContext createExpressionContext() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
void startLayeredExport() override
Starts a multi-layer export operation.
bool containsWmsLayer() const
Returns true if the map contains a WMS layer.
void setScale(double scale, bool forceUpdate=true)
Sets new map scale and changes only the map extent.
double mapRotation(QgsLayoutObject::PropertyValueType valueType=QgsLayoutObject::EvaluatedValue) const
Returns the rotation used for drawing the map within the layout item, in degrees clockwise.
double mapUnitsToLayoutUnits() const
Returns the conversion factor from map units to layout units.
QgsLayoutItemMap::MapItemFlags mapFlags() const
Returns the map item's flags, which control how the map content is drawn.
void setLabelMargin(const QgsLayoutMeasurement &margin)
Sets the margin from the map edges in which no labels may be placed.
void themeChanged(const QString &theme)
Emitted when the map's associated theme is changed.
QgsLayoutItem::ExportLayerDetail exportLayerDetails() const override
Returns the details for the specified current export layer.
void zoomToExtent(const QgsRectangle &extent)
Zooms the map so that the specified extent is fully visible within the map item.
double scale() const
Returns the map scale.
@ ShowPartialLabels
Whether to draw labels which are partially outside of the map view.
@ ShowUnplacedLabels
Whether to render unplaced labels in the map view.
bool drawAnnotations() const
Returns whether annotations are drawn within the map.
void removeLabelBlockingItem(QgsLayoutItem *item)
Removes the specified layout item from the map's "label blocking items".
void setCrs(const QgsCoordinateReferenceSystem &crs)
Sets the map's preset crs (coordinate reference system).
void invalidateCache() override
QgsRectangle extent() const
Returns the current map extent.
QgsLayoutItemMapOverview * overview()
Returns the map item's first overview.
void finalizeRestoreFromXml() override
Called after all pending items have been restored from XML.
bool readPropertiesFromElement(const QDomElement &element, const QDomDocument &document, const QgsReadWriteContext &context) override
Sets item state from a DOM element.
void setFrameStrokeWidth(QgsLayoutMeasurement width) override
Sets the frame stroke width.
bool containsAdvancedEffects() const override
Returns true if the item contains contents with blend modes or transparency effects which can only be...
friend class QgsLayoutItemMapGrid
QgsLayoutItem::Flags itemFlags() const override
Returns the item's flags, which indicate how the item behaves.
QList< QgsMapLayer * > layers() const
Returns the stored layer set.
void setMoveContentPreviewOffset(double dx, double dy) override
Sets temporary offset for the item, by a specified dx and dy in layout units.
void setMapRotation(double rotation)
Sets the rotation for the map - this does not affect the layout item shape, only the way the map is d...
QgsCoordinateReferenceSystem crs() const
Returns coordinate reference system used for rendering the map.
double atlasMargin(QgsLayoutObject::PropertyValueType valueType=QgsLayoutObject::EvaluatedValue)
Returns the margin size (percentage) used when the map is in atlas mode.
void addLabelBlockingItem(QgsLayoutItem *item)
Sets the specified layout item as a "label blocking item" for this map.
void assignFreeId()
Sets the map id() to a number not yet used in the layout.
ExportLayerBehavior exportLayerBehavior() const override
Returns the behavior of this item during exporting to layered exports (e.g.
Contains settings and helpers relating to a render of a QgsLayoutItem.
Base class for graphical items within a QgsLayout.
virtual void drawFrame(QgsRenderContext &context)
Draws the frame around the item.
virtual QPainterPath framePath() const
Returns the path to use when drawing the item's frame or background.
virtual void setFrameStrokeWidth(QgsLayoutMeasurement width)
Sets the frame stroke width.
void rotationChanged(double newRotation)
Emitted on item rotation change.
QColor backgroundColor() const
Returns the background color for this item.
QgsExpressionContext createExpressionContext() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
virtual void drawBackground(QgsRenderContext &context)
Draws the background for the item.
virtual bool requiresRasterization() const
Returns true if the item is drawn in such a way that forces the whole layout to be rasterized when ex...
bool shouldDrawItem() const
Returns whether the item should be drawn in the current context.
virtual void refreshDataDefinedProperty(QgsLayoutObject::DataDefinedProperty property=QgsLayoutObject::AllProperties)
Refreshes a data defined property for the item by reevaluating the property's value and redrawing the...
@ FlagOverridesPaint
Item overrides the default layout item painting method.
virtual bool containsAdvancedEffects() const
Returns true if the item contains contents with blend modes or transparency effects which can only be...
void sizePositionChanged()
Emitted when the item's size or position changes.
virtual QString uuid() const
Returns the item identification string.
QString id() const
Returns the item's ID name.
bool frameEnabled() const
Returns true if the item includes a frame.
ExportLayerBehavior
Behavior of item when exporting to layered outputs.
@ ItemContainsSubLayers
Item contains multiple sublayers which must be individually exported.
void clipPathChanged()
Emitted when the item's clipping path has changed.
bool hasBackground() const
Returns true if the item has a background.
void refresh() override
Refreshes the item, causing a recalculation of any property overrides and recalculation of its positi...
void attemptSetSceneRect(const QRectF &rect, bool includesFrame=false)
Attempts to update the item's position and size to match the passed rect in layout coordinates.
void backgroundTaskCountChanged(int count)
Emitted whenever the number of background tasks an item is executing changes.
This class provides a method of storing measurements for use in QGIS layouts using a variety of diffe...
void setLength(const double length)
Sets the length of the measurement.
static QgsLayoutMeasurement decodeMeasurement(const QString &string)
Decodes a measurement from a string.
QString encodeMeasurement() const
Encodes the layout measurement to a string.
double length() const
Returns the length of the measurement.
QgsUnitTypes::LayoutUnit units() const
Returns the units for the measurement.
void setUnits(const QgsUnitTypes::LayoutUnit units)
Sets the units for the measurement.
QgsPropertyCollection mDataDefinedProperties
const QgsLayout * layout() const
Returns the layout the object is attached to.
void changed()
Emitted when the object's properties change.
QPointer< QgsLayout > mLayout
DataDefinedProperty
Data defined properties for different item types.
@ MapYMin
Map extent y minimum.
@ MapStylePreset
Layer and style map theme.
@ MapXMax
Map extent x maximum.
@ StartDateTime
Temporal range's start DateTime.
@ AllProperties
All properties for item.
@ EndDateTime
Temporal range's end DateTime.
@ MapAtlasMargin
Map atlas margin.
@ MapYMax
Map extent y maximum.
@ MapXMin
Map extent x minimum.
@ MapLabelMargin
Map label margin.
@ MapLayers
Map layer set.
@ MapRotation
Map rotation.
PropertyValueType
Specifies whether the value returned by a function should be the original, user set value,...
@ EvaluatedValue
Return the current evaluated value for the property.
void predefinedScalesChanged()
Emitted when the list of predefined scales changes.
@ FlagRenderLabelsByMapLayer
When rendering map items to multi-layered exports, render labels belonging to different layers into s...
@ FlagUseAdvancedEffects
Enable advanced effects such as blend modes.
@ FlagDrawSelection
Draw selection.
@ FlagLosslessImageRendering
Render images losslessly whenever possible, instead of the default lossy jpeg rendering used for some...
@ FlagAntialiasing
Use antialiasing when drawing items.
@ FlagForceVectorOutput
Force output in vector format where possible, even if items require rasterization to keep their corre...
@ FlagHideCoverageLayer
Hide coverage layer in outputs.
@ FlagDisableTiledRasterLayerRenders
If set, then raster layers will not be drawn as separate tiles. This may improve the appearance in ex...
static QgsRenderContext createRenderContextForMap(QgsLayoutItemMap *map, QPainter *painter, double dpi=-1)
Creates a render context suitable for the specified layout map and painter destination.
static void rotate(double angle, double &x, double &y)
Rotates a point / vector around the origin.
static double scaleFactorFromItemStyle(const QStyleOptionGraphicsItem *style)
Extracts the scale factor from an item style.
Base class for layouts, which can contain items such as maps, labels, scalebars, etc.
QgsLayoutItem * itemByUuid(const QString &uuid, bool includeTemplateUuids=false) const
Returns the layout item with matching uuid unique identifier, or nullptr if a matching item could not...
void refreshed()
Emitted when the layout has been refreshed and items should also be refreshed and updated.
QgsProject * project() const
The project associated with the layout.
A map clipping region (in map coordinates and CRS).
void setRestrictToLayers(bool enabled)
Sets whether clipping should be restricted to a subset of layers.
FeatureClippingType
Feature clipping behavior, which controls how features from vector layers will be clipped.
void setFeatureClip(FeatureClippingType type)
Sets the feature clipping type.
void setRestrictedLayers(const QList< QgsMapLayer * > &layers)
Sets a list of layers to restrict the clipping region effects to.
Stores style information (renderer, opacity, labeling, diagrams etc.) applicable to a map layer.
void readXml(const QDomElement &styleElement)
Read style configuration (for project file reading)
void readFromLayer(QgsMapLayer *layer)
Store layer's active style information in the instance.
void writeXml(QDomElement &styleElement) const
Write style configuration (for project file writing)
QString xmlData() const
Returns XML content of the style.
Base class for all map layer types.
QString id() const
Returns the layer's unique ID, which is used to access this layer from QgsProject.
Job implementation that renders everything sequentially using a custom painter.
void cancelWithoutBlocking() override
Triggers cancellation of the rendering job without blocking.
void finished()
emitted when asynchronous rendering is finished (or canceled).
@ RenderLabelsByMapLayer
Labels should be rendered in individual stages by map layer. This allows separation of labels belongi...
@ Finished
Rendering is finished.
@ Symbology
Rendering layer symbology.
@ Labels
Rendering labels.
static QStringList containsAdvancedEffects(const QgsMapSettings &mapSettings, EffectsCheckFlags flags=QgsMapSettingsUtils::EffectsCheckFlags())
Checks whether any of the layers attached to a map settings object contain advanced effects.
The QgsMapSettings class contains configuration for rendering of the map.
void addClippingRegion(const QgsMapClippingRegion ®ion)
Adds a new clipping region to the map settings.
void setTextRenderFormat(QgsRenderContext::TextRenderFormat format)
Sets the text render format, which dictates how text is rendered (e.g.
void setSelectionColor(const QColor &color)
Sets the color that is used for drawing of selected vector features.
void setSimplifyMethod(const QgsVectorSimplifyMethod &method)
Sets the simplification setting to use when rendering vector layers.
QPolygonF visiblePolygon() const
Returns the visible area as a polygon (may be rotated)
void addRenderedFeatureHandler(QgsRenderedFeatureHandlerInterface *handler)
Adds a rendered feature handler to use while rendering the map settings.
void setLayers(const QList< QgsMapLayer * > &layers)
Sets the list of layers to render in the map.
bool setEllipsoid(const QString &ellipsoid)
Sets the ellipsoid by its acronym.
@ RenderPartialOutput
Whether to make extra effort to update map image with partially rendered layers (better for interacti...
@ UseRenderingOptimization
Enable vector simplification and other rendering optimizations.
@ LosslessImageRendering
Render images losslessly whenever possible, instead of the default lossy jpeg rendering used for some...
@ Antialiasing
Enable anti-aliasing for map rendering.
@ UseAdvancedEffects
Enable layer opacity and blending effects.
@ DrawSelection
Whether vector selections should be shown in the rendered map.
@ DrawEditingInfo
Enable drawing of vertex markers for layers in editing mode.
@ ForceVectorOutput
Vector graphics should not be cached and drawn as raster images.
void setOutputDpi(double dpi)
Sets the dpi (dots per inch) used for conversion between real world units (e.g.
QgsRectangle extent() const
Returns geographical coordinates of the rectangle that should be rendered.
void setLayerStyleOverrides(const QMap< QString, QString > &overrides)
Sets the map of map layer style overrides (key: layer ID, value: style name) where a different style ...
void setExtent(const QgsRectangle &rect, bool magnified=true)
Sets the coordinates of the rectangle which should be rendered.
void setExpressionContext(const QgsExpressionContext &context)
Sets the expression context.
void setLabelingEngineSettings(const QgsLabelingEngineSettings &settings)
Sets the global configuration of the labeling engine.
void setTransformContext(const QgsCoordinateTransformContext &context)
Sets the coordinate transform context, which stores various information regarding which datum transfo...
void setRotation(double rotation)
Sets the rotation of the resulting map image, in degrees clockwise.
QList< QgsMapLayer * > layers() const
Returns the list of layers which will be rendered in the map.
void setPathResolver(const QgsPathResolver &resolver)
Sets the path resolver for conversion between relative and absolute paths during rendering operations...
void setLabelBoundaryGeometry(const QgsGeometry &boundary)
Sets the label boundary geometry, which restricts where in the rendered map labels are permitted to b...
void setFlag(Flag flag, bool on=true)
Enable or disable a particular flag (other flags are not affected)
void setLabelBlockingRegions(const QList< QgsLabelBlockingRegion > ®ions)
Sets a list of regions to avoid placing labels within.
void setOutputSize(QSize size)
Sets the size of the resulting map image, in pixels.
void setBackgroundColor(const QColor &color)
Sets the background color of the map.
QgsCoordinateReferenceSystem destinationCrs() const
Returns the destination coordinate reference system for the map render.
void setDestinationCrs(const QgsCoordinateReferenceSystem &crs)
Sets the destination crs (coordinate reference system) for the map render.
void mapThemeRenamed(const QString &name, const QString &newName)
Emitted when a map theme within the collection is renamed.
void mapThemeChanged(const QString &theme)
Emitted when a map theme changes definition.
A class to represent a 2D point.
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
void layersWillBeRemoved(const QStringList &layerIds)
Emitted when one or more layers are about to be removed from the registry.
void crsChanged()
Emitted when the CRS of the project has changed.
QgsMapThemeCollection * mapThemeCollection
void projectColorsChanged()
Emitted whenever the project's color scheme has been changed.
QgsLayerTree * layerTreeRoot() const
Returns pointer to the root (invisible) node of the project's layer tree.
The class is used as a container of context for various read/write operations on other objects.
A rectangle specified with double values.
void scale(double scaleFactor, const QgsPointXY *c=nullptr)
Scale the rectangle around its center point.
double yMaximum() const SIP_HOLDGIL
Returns the y maximum value (top side of rectangle).
double xMaximum() const SIP_HOLDGIL
Returns the x maximum value (right side of rectangle).
double xMinimum() const SIP_HOLDGIL
Returns the x minimum value (left side of rectangle).
double yMinimum() const SIP_HOLDGIL
Returns the y minimum value (bottom side of rectangle).
void setYMinimum(double y) SIP_HOLDGIL
Set the minimum y value.
bool isNull() const
Test if the rectangle is null (all coordinates zero or after call to setMinimal()).
void setXMaximum(double x) SIP_HOLDGIL
Set the maximum x value.
void setXMinimum(double x) SIP_HOLDGIL
Set the minimum x value.
double height() const SIP_HOLDGIL
Returns the height of the rectangle.
void setYMaximum(double y) SIP_HOLDGIL
Set the maximum y value.
double width() const SIP_HOLDGIL
Returns the width of the rectangle.
static QgsRectangle fromCenterAndSize(QgsPointXY center, double width, double height)
Creates a new rectangle, given the specified center point and width and height.
QgsPointXY center() const SIP_HOLDGIL
Returns the center point of the rectangle.
Contains information about the context of a rendering operation.
void setForceVectorOutput(bool force)
Sets whether rendering operations should use vector operations instead of any faster raster shortcuts...
QPainter * painter()
Returns the destination QPainter for the render operation.
QgsExpressionContext & expressionContext()
Gets the expression context.
void setPainterFlagsUsingContext(QPainter *painter=nullptr) const
Sets relevant flags on a destination painter, using the flags and settings currently defined for the ...
void setExpressionContext(const QgsExpressionContext &context)
Sets the expression context.
An interface for classes which provider custom handlers for features rendered as part of a map render...
Calculates scale for a given combination of canvas size, map extent, and monitor dpi.
double calculate(const QgsRectangle &mapExtent, double canvasWidth) const
Calculate the scale denominator.
void setDpi(double dpi)
Sets the dpi (dots per inch) for the output resolution, to be used in scale calculations.
void setMapUnits(QgsUnitTypes::DistanceUnit mapUnits)
Set the map units.
Scoped object for saving and restoring a QPainter object's state.
An interface for classes which can visit style entity (e.g.
@ LayoutItem
Individual item in a print layout.
virtual bool visitExit(const QgsStyleEntityVisitorInterface::Node &node)
Called when the visitor stops visiting a node.
virtual bool visitEnter(const QgsStyleEntityVisitorInterface::Node &node)
Called when the visitor starts visiting a node.
const QgsDateTimeRange & temporalRange() const
Returns the datetime range for the object.
bool isTemporal() const
Returns true if the object's temporal range is enabled, and the object will be filtered when renderin...
void setIsTemporal(bool enabled)
Sets whether the temporal range is enabled (i.e.
void setTemporalRange(const QgsDateTimeRange &range)
Sets the temporal range for the object.
@ LayoutMillimeters
Millimeters.
static Q_INVOKABLE QString toString(QgsUnitTypes::DistanceUnit unit)
Returns a translated string representing a distance unit.
@ NoSimplification
No simplification can be applied.
static GeometryType geometryType(Type type) SIP_HOLDGIL
Returns the geometry type for a WKB type, e.g., both MultiPolygon and CurvePolygon would have a Polyg...
#define Q_NOWARN_DEPRECATED_POP
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
#define Q_NOWARN_DEPRECATED_PUSH
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
QPointer< QgsMapLayer > QgsWeakMapLayerPointer
Weak pointer for QgsMapLayer.
const QgsCoordinateReferenceSystem & crs
Single variable definition for use within a QgsExpressionContextScope.
Contains details of a particular export layer relating to a layout item.
QPainter::CompositionMode compositionMode
Associated composition mode if this layer is associated with a map layer.
QString mapLayerId
Associated map layer ID, or an empty string if this export layer is not associated with a map layer.
double opacity
Associated opacity, if this layer is associated with a map layer.
QString name
User-friendly name for the export layer.
QString mapTheme
Associated map theme, or an empty string if this export layer does not need to be associated with a m...
Contains information relating to a node (i.e.
QString source
Weak reference to layer public source.
QString name
Weak reference to layer name.
TYPE * resolve(const QgsProject *project)
Resolves the map layer by attempting to find a layer with matching ID within a project.
QString provider
Weak reference to layer provider.
TYPE * resolveWeakly(const QgsProject *project, MatchType matchType=MatchType::All)
Resolves the map layer by attempting to find a matching layer in a project using a weak match.
QString layerId
Original layer ID.