Skip to content

Commit

Permalink
Partly revert previous approach: and rely on layout clone
Browse files Browse the repository at this point in the history
Disable follow preset and manually add layers
  • Loading branch information
elpaso authored and github-actions[bot] committed Jun 9, 2021
1 parent 8675174 commit 749e903
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 16 deletions.
10 changes: 5 additions & 5 deletions src/core/layout/qgslayoutitemmap.cpp
Expand Up @@ -2111,17 +2111,17 @@ QList<QgsMapLayer *> QgsLayoutItemMap::layersToRender( const QgsExpressionContex
QList<QgsMapLayer *> renderLayers;

QString presetName = themeToRender( *evalContext );
if ( !layers().isEmpty() )
{
renderLayers = layers();
}
else if ( !presetName.isEmpty() )
if ( !presetName.isEmpty() )
{
if ( mLayout->project()->mapThemeCollection()->hasMapTheme( presetName ) )
renderLayers = mLayout->project()->mapThemeCollection()->mapThemeVisibleLayers( presetName );
else // fallback to using map canvas layers
renderLayers = mLayout->project()->mapThemeCollection()->masterVisibleLayers();
}
else if ( !layers().isEmpty() )
{
renderLayers = layers();
}
else
{
renderLayers = mLayout->project()->mapThemeCollection()->masterVisibleLayers();
Expand Down
27 changes: 24 additions & 3 deletions src/server/services/wms/qgswmsrenderer.cpp
Expand Up @@ -624,7 +624,7 @@ namespace QgsWms
}
else
{
for ( const auto &layer : std::as_const( cMapParams.mLayers ) )
for ( auto layer : cMapParams.mLayers )
{
if ( mContext.isValidGroup( layer.mNickname ) )
{
Expand Down Expand Up @@ -660,9 +660,30 @@ namespace QgsWms
layerSet << mlayer;
}
}
std::reverse( layerSet.begin(), layerSet.end() );
}
layerSet << highlightLayers( cMapParams.mHighlightLayers );
std::reverse( layerSet.begin(), layerSet.end() );

// If the map is set to follow preset we need to disable follow preset and manually
// configure the layers here or the map item internal logic will override and get
// the layers from the map theme.
if ( map->followVisibilityPreset() )
{
if ( layerSet.isEmpty() )
{
// Get the layers from the theme
const QgsExpressionContext ex { map->createExpressionContext() };
layerSet = map->layersToRender( &ex );
}
map->setFollowVisibilityPreset( false );
}

// Handle highlight layers
const QList< QgsMapLayer *> highlights = highlightLayers( cMapParams.mHighlightLayers );
for ( const auto &hl : std::as_const( highlights ) )
{
layerSet.prepend( hl );
}

map->setLayers( layerSet );
map->setKeepLayerSet( true );
}
Expand Down
4 changes: 0 additions & 4 deletions tests/src/core/testqgslayoutgeopdfexport.cpp
Expand Up @@ -256,10 +256,6 @@ void TestQgsLayoutGeoPdfExport::testCollectingFeatures()
map2->setFollowVisibilityPreset( true );
map2->setFollowVisibilityPresetName( QStringLiteral( "test preset3" ) );

// Clear layers
map->setLayers( {} );
map2->setLayers( {} );

QgsLayoutGeoPdfExporter geoPdfExporter2( &l );
settings = QgsLayoutExporter::PdfExportSettings();
settings.writeGeoPdf = true;
Expand Down
2 changes: 1 addition & 1 deletion tests/src/core/testqgslayoutmap.cpp
Expand Up @@ -1401,7 +1401,7 @@ void TestQgsLayoutMap::testLayeredExport()

l.renderContext().setExportThemes( QStringList() << QStringLiteral( "test preset2" ) << QStringLiteral( "test preset" ) << QStringLiteral( "test preset3" ) );

map->setLayers( {} );

map->startLayeredExport();
QVERIFY( map->nextExportPart() );
map->createStagedRenderJob( map->extent(), QSize( 512, 512 ), 72 );
Expand Down
25 changes: 22 additions & 3 deletions tests/src/python/test_qgsserver_wms_getprint_maptheme.py
Expand Up @@ -37,9 +37,9 @@ class PyQgsServerWMSGetPrintMapTheme(QgsServerTestBase):

def test_wms_getprint_maptheme(self):
"""Test project has 2 layer: red and green and three templates:
red: map theme red
green: map theme green
blank: non map theme
red: follow map theme red
green: follow map theme green
blank: no map theme
"""

tmp_dir = QTemporaryDir()
Expand Down Expand Up @@ -67,6 +67,7 @@ def test_wms_getprint_maptheme(self):
######################################################
# Template map theme tests, no HIGHLIGHT

# blank template, specified layer is red
response = QgsBufferServerResponse()
request = QgsBufferServerRequest('?' + '&'.join(["%s=%s" % i for i in params.items()]))
self.server.handleRequest(request, response, project)
Expand All @@ -77,6 +78,7 @@ def test_wms_getprint_maptheme(self):
self.assertEqual(color.green(), 0)
self.assertEqual(color.blue(), 0)

# blank template, specified layer is green
params["map0:LAYERS"] = "green"
response = QgsBufferServerResponse()
request = QgsBufferServerRequest('?' + '&'.join(["%s=%s" % i for i in params.items()]))
Expand All @@ -88,6 +90,7 @@ def test_wms_getprint_maptheme(self):
self.assertEqual(color.green(), 255)
self.assertEqual(color.blue(), 0)

# red template, no specified layers
params["map0:LAYERS"] = ""
params["TEMPLATE"] = "red"
response = QgsBufferServerResponse()
Expand All @@ -100,6 +103,7 @@ def test_wms_getprint_maptheme(self):
self.assertEqual(color.green(), 0)
self.assertEqual(color.blue(), 0)

# green template, no specified layers
params["map0:LAYERS"] = ""
params["TEMPLATE"] = "green"
response = QgsBufferServerResponse()
Expand All @@ -112,6 +116,21 @@ def test_wms_getprint_maptheme(self):
self.assertEqual(color.green(), 255)
self.assertEqual(color.blue(), 0)

# green template, specified layer is red
# This is a conflict situation: the green template map is set to follow green theme
# but we tell the server to render the red layer, red is what we get.
params["map0:LAYERS"] = "red"
params["TEMPLATE"] = "green"
response = QgsBufferServerResponse()
request = QgsBufferServerRequest('?' + '&'.join(["%s=%s" % i for i in params.items()]))
self.server.handleRequest(request, response, project)

image = QImage.fromData(response.body(), "PNG")
color = image.pixelColor(100, 100)
self.assertEqual(color.red(), 255)
self.assertEqual(color.green(), 0)
self.assertEqual(color.blue(), 0)

######################################################
# Start HIGHLIGHT tests

Expand Down

0 comments on commit 749e903

Please sign in to comment.