From d40114c8ffa822e8481a4dc13d70ecdf25753842 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Thu, 2 Apr 2020 14:50:08 +1000 Subject: [PATCH] [layouts] If a legend is linked to a map which is set to show a particular theme, then correctly follow that same theme's styling when rendering the legend Fixes layout legends always render using the canvas' visible theme styling, instead of that of the linked map. Fixes #27542, #24694, #28919, #28925 Fix sponsored by the Victorian Planning Authority --- src/core/layout/qgslayoutitemlegend.cpp | 58 +++++++++- src/core/layout/qgslayoutitemlegend.h | 2 + tests/src/python/test_qgslayoutlegend.py | 109 ++++++++++++++++++ .../expected_composer_legend_theme.png | Bin 0 -> 34261 bytes .../expected_composer_legend_theme_mask.png | Bin 0 -> 7049 bytes 5 files changed, 163 insertions(+), 6 deletions(-) create mode 100644 tests/testdata/control_images/composer_legend/expected_composer_legend_theme/expected_composer_legend_theme.png create mode 100644 tests/testdata/control_images/composer_legend/expected_composer_legend_theme/expected_composer_legend_theme_mask.png diff --git a/src/core/layout/qgslayoutitemlegend.cpp b/src/core/layout/qgslayoutitemlegend.cpp index 20ba9cb41e16..001bf6f16cd9 100644 --- a/src/core/layout/qgslayoutitemlegend.cpp +++ b/src/core/layout/qgslayoutitemlegend.cpp @@ -31,6 +31,7 @@ #include "qgssymbollayerutils.h" #include "qgslayertreeutils.h" #include "qgslayoututils.h" +#include "qgsmapthemecollection.h" #include #include #include @@ -702,7 +703,7 @@ void QgsLayoutItemLegend::setLinkedMap( QgsLayoutItemMap *map ) if ( mMap ) { setupMapConnections( mMap, true ); - mThemeName = mMap->themeToRender( mMap->createExpressionContext() ); + mapThemeChanged( mMap->themeToRender( mMap->createExpressionContext() ) ); } updateFilterByMap(); @@ -754,6 +755,15 @@ void QgsLayoutItemLegend::updateFilterByMapAndRedraw() updateFilterByMap( true ); } +void QgsLayoutItemLegend::setModelStyleOverrides( const QMap &overrides ) +{ + mLegendModel->setLayerStyleOverrides( overrides ); + const QList< QgsLayerTreeLayer * > layers = mLegendModel->rootGroup()->findLayers(); + for ( QgsLayerTreeLayer *nodeLayer : layers ) + mLegendModel->refreshLayerLegend( nodeLayer ); + +} + void QgsLayoutItemLegend::mapLayerStyleOverridesChanged() { if ( !mMap ) @@ -768,10 +778,7 @@ void QgsLayoutItemLegend::mapLayerStyleOverridesChanged() } else { - mLegendModel->setLayerStyleOverrides( mMap->layerStyleOverrides() ); - const QList< QgsLayerTreeLayer * > layers = mLegendModel->rootGroup()->findLayers(); - for ( QgsLayerTreeLayer *nodeLayer : layers ) - mLegendModel->refreshLayerLegend( nodeLayer ); + setModelStyleOverrides( mMap->layerStyleOverrides() ); } adjustBoxSize(); @@ -781,7 +788,35 @@ void QgsLayoutItemLegend::mapLayerStyleOverridesChanged() void QgsLayoutItemLegend::mapThemeChanged( const QString &theme ) { + if ( mThemeName == theme ) + return; + mThemeName = theme; + + // map's theme has been changed, so make sure to update the legend here + if ( mLegendFilterByMap ) + { + // legend is being filtered by map, so we need to re run the hit test too + // as the style overrides may also have affected the visible symbols + updateFilterByMap( false ); + } + else + { + if ( mThemeName.isEmpty() ) + { + setModelStyleOverrides( QMap() ); + } + else + { + // get style overrides for theme + const QMap overrides = mLayout->project()->mapThemeCollection()->mapThemeStyleOverrides( mThemeName ); + setModelStyleOverrides( overrides ); + } + } + + adjustBoxSize(); + + updateFilterByMap(); } void QgsLayoutItemLegend::updateFilterByMap( bool redraw ) @@ -798,7 +833,18 @@ void QgsLayoutItemLegend::updateFilterByMap( bool redraw ) void QgsLayoutItemLegend::doUpdateFilterByMap() { if ( mMap ) - mLegendModel->setLayerStyleOverrides( mMap->layerStyleOverrides() ); + { + if ( !mThemeName.isEmpty() ) + { + // get style overrides for theme + const QMap overrides = mLayout->project()->mapThemeCollection()->mapThemeStyleOverrides( mThemeName ); + mLegendModel->setLayerStyleOverrides( overrides ); + } + else + { + mLegendModel->setLayerStyleOverrides( mMap->layerStyleOverrides() ); + } + } else mLegendModel->setLayerStyleOverrides( QMap() ); diff --git a/src/core/layout/qgslayoutitemlegend.h b/src/core/layout/qgslayoutitemlegend.h index 984b1e37b55e..291ee3aa9191 100644 --- a/src/core/layout/qgslayoutitemlegend.h +++ b/src/core/layout/qgslayoutitemlegend.h @@ -545,6 +545,8 @@ class CORE_EXPORT QgsLayoutItemLegend : public QgsLayoutItem void setupMapConnections( QgsLayoutItemMap *map, bool connect = true ); + void setModelStyleOverrides( const QMap &overrides ); + std::unique_ptr< QgsLegendModel > mLegendModel; std::unique_ptr< QgsLayerTreeGroup > mCustomLayerTree; diff --git a/tests/src/python/test_qgslayoutlegend.py b/tests/src/python/test_qgslayoutlegend.py index 42aac4995ae2..0f95626aa138 100644 --- a/tests/src/python/test_qgslayoutlegend.py +++ b/tests/src/python/test_qgslayoutlegend.py @@ -33,6 +33,10 @@ QgsMapLayerLegendUtils, QgsLegendStyle, QgsFontUtils, + QgsLineSymbol, + QgsMapThemeCollection, + QgsCategorizedSymbolRenderer, + QgsRendererCategory, QgsApplication) from qgis.testing import (start_app, unittest @@ -514,6 +518,111 @@ def testThemes(self): legend.setLinkedMap(map3) self.assertFalse(legend.themeName()) + def testLegendRenderWithMapTheme(self): + """Test rendering legends linked to map themes""" + QgsProject.instance().removeAllMapLayers() + + point_path = os.path.join(TEST_DATA_DIR, 'points.shp') + point_layer = QgsVectorLayer(point_path, 'points', 'ogr') + line_path = os.path.join(TEST_DATA_DIR, 'lines.shp') + line_layer = QgsVectorLayer(line_path, 'lines', 'ogr') + QgsProject.instance().clear() + QgsProject.instance().addMapLayers([point_layer, line_layer]) + + marker_symbol = QgsMarkerSymbol.createSimple({'color': '#ff0000', 'outline_style': 'no', 'size': '5'}) + point_layer.setRenderer(QgsSingleSymbolRenderer(marker_symbol)) + point_layer.styleManager().addStyleFromLayer("red") + + line_symbol = QgsLineSymbol.createSimple({'color': '#ff0000', 'line_width': '2'}) + line_layer.setRenderer(QgsSingleSymbolRenderer(line_symbol)) + line_layer.styleManager().addStyleFromLayer("red") + + red_record = QgsMapThemeCollection.MapThemeRecord() + point_red_record = QgsMapThemeCollection.MapThemeLayerRecord(point_layer) + point_red_record.usingCurrentStyle = True + point_red_record.currentStyle = 'red' + red_record.addLayerRecord(point_red_record) + line_red_record = QgsMapThemeCollection.MapThemeLayerRecord(line_layer) + line_red_record.usingCurrentStyle = True + line_red_record.currentStyle = 'red' + red_record.addLayerRecord(line_red_record) + QgsProject.instance().mapThemeCollection().insert('red', red_record) + + marker_symbol1 = QgsMarkerSymbol.createSimple({'color': '#0000ff', 'outline_style': 'no', 'size': '5'}) + marker_symbol2 = QgsMarkerSymbol.createSimple({'color': '#0000ff', 'name': 'diamond', 'outline_style': 'no', 'size': '5'}) + marker_symbol3 = QgsMarkerSymbol.createSimple({'color': '#0000ff', 'name': 'rectangle', 'outline_style': 'no', 'size': '5'}) + + point_layer.setRenderer(QgsCategorizedSymbolRenderer('Class', [QgsRendererCategory('B52', marker_symbol1, ''), + QgsRendererCategory('Biplane', marker_symbol2, ''), + QgsRendererCategory('Jet', marker_symbol3, ''), + ])) + point_layer.styleManager().addStyleFromLayer("blue") + + line_symbol = QgsLineSymbol.createSimple({'color': '#0000ff', 'line_width': '2'}) + line_layer.setRenderer(QgsSingleSymbolRenderer(line_symbol)) + line_layer.styleManager().addStyleFromLayer("blue") + + blue_record = QgsMapThemeCollection.MapThemeRecord() + point_blue_record = QgsMapThemeCollection.MapThemeLayerRecord(point_layer) + point_blue_record.usingCurrentStyle = True + point_blue_record.currentStyle = 'blue' + blue_record.addLayerRecord(point_blue_record) + line_blue_record = QgsMapThemeCollection.MapThemeLayerRecord(line_layer) + line_blue_record.usingCurrentStyle = True + line_blue_record.currentStyle = 'blue' + blue_record.addLayerRecord(line_blue_record) + QgsProject.instance().mapThemeCollection().insert('blue', blue_record) + + layout = QgsLayout(QgsProject.instance()) + layout.initializeDefaults() + + map1 = QgsLayoutItemMap(layout) + map1.attemptSetSceneRect(QRectF(20, 20, 80, 80)) + map1.setFrameEnabled(True) + map1.setLayers([point_layer, line_layer]) + layout.addLayoutItem(map1) + map1.setExtent(point_layer.extent()) + map1.setFollowVisibilityPreset(True) + map1.setFollowVisibilityPresetName('red') + + map2 = QgsLayoutItemMap(layout) + map2.attemptSetSceneRect(QRectF(20, 120, 80, 80)) + map2.setFrameEnabled(True) + map2.setLayers([point_layer, line_layer]) + layout.addLayoutItem(map2) + map2.setExtent(point_layer.extent()) + map2.setFollowVisibilityPreset(True) + map2.setFollowVisibilityPresetName('blue') + + legend = QgsLayoutItemLegend(layout) + legend.setTitle("Legend") + legend.attemptSetSceneRect(QRectF(120, 20, 80, 80)) + legend.setFrameEnabled(True) + legend.setFrameStrokeWidth(QgsLayoutMeasurement(2)) + legend.setBackgroundColor(QColor(200, 200, 200)) + legend.setTitle('') + layout.addLayoutItem(legend) + legend.setLinkedMap(map1) + + legend2 = QgsLayoutItemLegend(layout) + legend2.setTitle("Legend") + legend2.attemptSetSceneRect(QRectF(120, 120, 80, 80)) + legend2.setFrameEnabled(True) + legend2.setFrameStrokeWidth(QgsLayoutMeasurement(2)) + legend2.setBackgroundColor(QColor(200, 200, 200)) + legend2.setTitle('') + layout.addLayoutItem(legend2) + legend2.setLinkedMap(map2) + + checker = QgsLayoutChecker( + 'composer_legend_theme', layout) + checker.setControlPathPrefix("composer_legend") + result, message = checker.testLayout() + self.report += checker.report() + self.assertTrue(result, message) + + QgsProject.instance().clear() + if __name__ == '__main__': unittest.main() diff --git a/tests/testdata/control_images/composer_legend/expected_composer_legend_theme/expected_composer_legend_theme.png b/tests/testdata/control_images/composer_legend/expected_composer_legend_theme/expected_composer_legend_theme.png new file mode 100644 index 0000000000000000000000000000000000000000..603ed6ef40258c24bdd9d45a5603dd4813538c55 GIT binary patch literal 34261 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

Ce*!27o%J%4O*Y{mIDQ>MPrS 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 literal 0 HcmV?d00001