From 089a2f1c1787a55da842a31846adc34818501f2d Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Wed, 12 Dec 2018 08:12:58 +1000 Subject: [PATCH] [FEATURE][layouts] Add new setting to control whether map items should show partial labels Layout map items no longer respect the default project setting for "show partial labels", and instead have their own, per map setting for this option. (Under the map item properties, labeling settings button). The map item setting always defaults to off (unlike the canvas setting, which defaults to true for a new project) as layouts should always default to the settings which produce the highest quality cartographic outputs. In general I suspect that most users would always want to avoid rendering partial labels in layouts, but this setting was previously so deeply hidden that most are unaware of how to change it. (And previous discussion about changing the canvas setting to hide partial labels deemed this default undesirable for the canvas, where showing even a small part of a label on the map border can help identify what sits just on/off the edges of the map) --- .../layout/qgslayoutitemmap.sip.in | 28 ++++++++ src/app/layout/qgslayoutmapwidget.cpp | 57 ++++++++++++++-- src/app/layout/qgslayoutmapwidget.h | 7 ++ src/core/layout/qgslayoutitemmap.cpp | 20 +++++- src/core/layout/qgslayoutitemmap.h | 27 ++++++++ .../layout/qgslayoutmaplabelingwidgetbase.ui | 7 ++ tests/src/python/test_qgslayoutmap.py | 63 ++++++++++++++++++ .../src/python/test_qgspallabeling_layout.py | 5 +- ...pected_composermap_show_partial_labels.png | Bin 0 -> 7373 bytes tests/testdata/qgis_server/test_project.qgs | 4 +- .../test_project_contextual_legend.qgs | 2 +- .../qgis_server_accesscontrol/project.qgs | 8 +-- .../project_groups.qgs | 4 +- .../qgis_server_accesscontrol/project_grp.qgs | 8 +-- .../project_labeling_settings.qgs | 8 +-- 15 files changed, 224 insertions(+), 24 deletions(-) create mode 100644 tests/testdata/control_images/composer_map/expected_composermap_show_partial_labels/expected_composermap_show_partial_labels.png diff --git a/python/core/auto_generated/layout/qgslayoutitemmap.sip.in b/python/core/auto_generated/layout/qgslayoutitemmap.sip.in index 9f6c0190e17..80481144975 100644 --- a/python/core/auto_generated/layout/qgslayoutitemmap.sip.in +++ b/python/core/auto_generated/layout/qgslayoutitemmap.sip.in @@ -31,6 +31,13 @@ Layout graphical items for displaying a map. Auto }; + enum MapItemFlag + { + ShowPartialLabels, + }; + typedef QFlags MapItemFlags; + + explicit QgsLayoutItemMap( QgsLayout *layout ); %Docstring Constructor for QgsLayoutItemMap, with the specified parent ``layout``. @@ -44,6 +51,24 @@ Constructor for QgsLayoutItemMap, with the specified parent ``layout``. virtual QgsLayoutItem::Flags itemFlags() const; + QgsLayoutItemMap::MapItemFlags mapFlags() const; +%Docstring +Returns the map item's flags, which control how the map content is drawn. + +.. seealso:: :py:func:`setMapFlags` + +.. versionadded:: 3.6 +%End + + void setMapFlags( QgsLayoutItemMap::MapItemFlags flags ); +%Docstring +Sets the map item's ``flags``, which control how the map content is drawn. + +.. seealso:: :py:func:`mapFlags` + +.. versionadded:: 3.6 +%End + void assignFreeId(); %Docstring Sets the map id() to a number not yet used in the layout. The existing id() is kept if it is not in use. @@ -583,6 +608,9 @@ Updates the bounding rect of this item. Call this function before doing any chan }; +QFlags operator|(QgsLayoutItemMap::MapItemFlag f1, QFlags f2); + + /************************************************************************ * This file has been generated automatically from * * * diff --git a/src/app/layout/qgslayoutmapwidget.cpp b/src/app/layout/qgslayoutmapwidget.cpp index cbc3c836b87..2222f6771c2 100644 --- a/src/app/layout/qgslayoutmapwidget.cpp +++ b/src/app/layout/qgslayoutmapwidget.cpp @@ -186,6 +186,8 @@ bool QgsLayoutMapWidget::setNewItem( QgsLayoutItem *item ) mMapItem = qobject_cast< QgsLayoutItemMap * >( item ); mItemPropertiesWidget->setItem( mMapItem ); + if ( mLabelWidget ) + mLabelWidget->setItem( mMapItem ); if ( mMapItem ) { @@ -359,8 +361,8 @@ void QgsLayoutMapWidget::overviewSymbolChanged() void QgsLayoutMapWidget::showLabelSettings() { - QgsLayoutMapLabelingWidget *w = new QgsLayoutMapLabelingWidget( mMapItem ); - openPanel( w ); + mLabelWidget = new QgsLayoutMapLabelingWidget( mMapItem ); + openPanel( mLabelWidget ); } void QgsLayoutMapWidget::switchToMoveContentTool() @@ -1703,14 +1705,43 @@ QgsLayoutMapLabelingWidget::QgsLayoutMapLabelingWidget( QgsLayoutItemMap *map ) mLabelBoundaryUnitsCombo->linkToWidget( mLabelBoundarySpinBox ); mLabelBoundaryUnitsCombo->setConverter( &mMapItem->layout()->renderContext().measurementConverter() ); - mLabelBoundarySpinBox->setValue( mMapItem->labelMargin().length() ); - mLabelBoundaryUnitsCombo->setUnit( mMapItem->labelMargin().units() ); - connect( mLabelBoundaryUnitsCombo, &QgsLayoutUnitsComboBox::changed, this, &QgsLayoutMapLabelingWidget::labelMarginUnitsChanged ); connect( mLabelBoundarySpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutMapLabelingWidget::labelMarginChanged ); + connect( mShowPartialLabelsCheckBox, &QCheckBox::toggled, this, &QgsLayoutMapLabelingWidget::showPartialsToggled ); registerDataDefinedButton( mLabelMarginDDBtn, QgsLayoutObject::MapLabelMargin ); + setNewItem( map ); +} + +bool QgsLayoutMapLabelingWidget::setNewItem( QgsLayoutItem *item ) +{ + if ( item->type() != QgsLayoutItemRegistry::LayoutMap ) + return false; + + if ( mMapItem ) + { + disconnect( mMapItem, &QgsLayoutObject::changed, this, &QgsLayoutMapLabelingWidget::updateGuiElements ); + } + + mMapItem = qobject_cast< QgsLayoutItemMap * >( item ); + + if ( mMapItem ) + { + connect( mMapItem, &QgsLayoutObject::changed, this, &QgsLayoutMapLabelingWidget::updateGuiElements ); + } + + updateGuiElements(); + + return true; +} + +void QgsLayoutMapLabelingWidget::updateGuiElements() +{ + whileBlocking( mLabelBoundarySpinBox )->setValue( mMapItem->labelMargin().length() ); + whileBlocking( mLabelBoundaryUnitsCombo )->setUnit( mMapItem->labelMargin().units() ); + whileBlocking( mShowPartialLabelsCheckBox )->setChecked( mMapItem->mapFlags() & QgsLayoutItemMap::ShowPartialLabels ); + updateDataDefinedButton( mLabelMarginDDBtn ); } @@ -1735,3 +1766,19 @@ void QgsLayoutMapLabelingWidget::labelMarginUnitsChanged() mMapItem->layout()->undoStack()->endCommand(); mMapItem->invalidateCache(); } + +void QgsLayoutMapLabelingWidget::showPartialsToggled( bool checked ) +{ + if ( !mMapItem ) + return; + + mMapItem->layout()->undoStack()->beginCommand( mMapItem, tr( "Change Label Visibility" ) ); + QgsLayoutItemMap::MapItemFlags flags = mMapItem->mapFlags(); + if ( checked ) + flags |= QgsLayoutItemMap::ShowPartialLabels; + else + flags &= ~QgsLayoutItemMap::ShowPartialLabels; + mMapItem->setMapFlags( flags ); + mMapItem->layout()->undoStack()->endCommand(); + mMapItem->invalidateCache(); +} diff --git a/src/app/layout/qgslayoutmapwidget.h b/src/app/layout/qgslayoutmapwidget.h index 952d839aea1..fd862c23752 100644 --- a/src/app/layout/qgslayoutmapwidget.h +++ b/src/app/layout/qgslayoutmapwidget.h @@ -26,6 +26,7 @@ class QgsMapLayer; class QgsLayoutItemMap; class QgsLayoutItemMapOverview; +class QgsLayoutMapLabelingWidget; /** * \ingroup app @@ -127,6 +128,7 @@ class QgsLayoutMapWidget: public QgsLayoutItemBaseWidget, private Ui::QgsLayoutM QPointer< QgsLayoutItemMap > mMapItem; QgsLayoutItemPropertiesWidget *mItemPropertiesWidget = nullptr; QgsLayoutDesignerInterface *mInterface = nullptr; + QPointer< QgsLayoutMapLabelingWidget > mLabelWidget; //! Sets extent of composer map from line edits void updateComposerExtentFromGui(); @@ -184,9 +186,14 @@ class QgsLayoutMapLabelingWidget: public QgsLayoutItemBaseWidget, private Ui::Qg public: explicit QgsLayoutMapLabelingWidget( QgsLayoutItemMap *map ); + protected: + bool setNewItem( QgsLayoutItem *item ) override; + private slots: + void updateGuiElements(); void labelMarginChanged( double val ); void labelMarginUnitsChanged(); + void showPartialsToggled( bool checked ); private: QPointer< QgsLayoutItemMap > mMapItem; diff --git a/src/core/layout/qgslayoutitemmap.cpp b/src/core/layout/qgslayoutitemmap.cpp index 4edcad80d75..1c269aef116 100644 --- a/src/core/layout/qgslayoutitemmap.cpp +++ b/src/core/layout/qgslayoutitemmap.cpp @@ -608,6 +608,7 @@ bool QgsLayoutItemMap::writePropertiesToElement( QDomElement &mapElem, QDomDocum mapElem.appendChild( atlasElem ); mapElem.setAttribute( QStringLiteral( "labelMargin" ), mLabelMargin.encodeMeasurement() ); + mapElem.setAttribute( QStringLiteral( "mapFlags" ), static_cast< int>( mMapFlags ) ); return true; } @@ -744,6 +745,8 @@ bool QgsLayoutItemMap::readPropertiesFromElement( const QDomElement &itemElem, c setLabelMargin( QgsLayoutMeasurement::decodeMeasurement( itemElem.attribute( QStringLiteral( "labelMargin" ), QStringLiteral( "0" ) ) ) ); + mMapFlags = static_cast< MapItemFlags>( itemElem.attribute( QStringLiteral( "mapFlags" ), nullptr ).toInt() ); + updateBoundingRect(); mUpdatesEnabled = true; @@ -1070,6 +1073,16 @@ void QgsLayoutItemMap::recreateCachedImageInBackground() mDrawingPreview = false; } +QgsLayoutItemMap::MapItemFlags QgsLayoutItemMap::mapFlags() const +{ + return mMapFlags; +} + +void QgsLayoutItemMap::setMapFlags( QgsLayoutItemMap::MapItemFlags mapFlags ) +{ + mMapFlags = mapFlags; +} + QgsMapSettings QgsLayoutItemMap::mapSettings( const QgsRectangle &extent, QSizeF size, double dpi, bool includeLayerSettings ) const { QgsExpressionContext expressionContext = createExpressionContext(); @@ -1127,7 +1140,12 @@ QgsMapSettings QgsLayoutItemMap::mapSettings( const QgsRectangle &extent, QSizeF jobMapSettings.setTransformContext( mLayout->project()->transformContext() ); jobMapSettings.setPathResolver( mLayout->project()->pathResolver() ); - jobMapSettings.setLabelingEngineSettings( mLayout->project()->labelingEngineSettings() ); + QgsLabelingEngineSettings labelSettings = mLayout->project()->labelingEngineSettings(); + + // override project "show partial labels" setting with this map's setting + labelSettings.setFlag( QgsLabelingEngineSettings::UsePartialCandidates, mMapFlags & ShowPartialLabels ); + jobMapSettings.setLabelingEngineSettings( labelSettings ); + // override the default text render format inherited from the labeling engine settings using the layout's render context setting jobMapSettings.setTextRenderFormat( mLayout->renderContext().textRenderFormat() ); diff --git a/src/core/layout/qgslayoutitemmap.h b/src/core/layout/qgslayoutitemmap.h index 1135a3601cf..b66024dfbf8 100644 --- a/src/core/layout/qgslayoutitemmap.h +++ b/src/core/layout/qgslayoutitemmap.h @@ -63,6 +63,16 @@ class CORE_EXPORT QgsLayoutItemMap : public QgsLayoutItem Auto }; + /** + * Various flags that affect drawing of map items. + * \since QGIS 3.6 + */ + enum MapItemFlag + { + ShowPartialLabels = 1 << 0, //!< Whether to draw labels which are partially outside of the map view + }; + Q_DECLARE_FLAGS( MapItemFlags, MapItemFlag ) + /** * Constructor for QgsLayoutItemMap, with the specified parent \a layout. */ @@ -73,6 +83,20 @@ class CORE_EXPORT QgsLayoutItemMap : public QgsLayoutItem QIcon icon() const override; QgsLayoutItem::Flags itemFlags() const override; + /** + * Returns the map item's flags, which control how the map content is drawn. + * \see setMapFlags() + * \since QGIS 3.6 + */ + QgsLayoutItemMap::MapItemFlags mapFlags() const; + + /** + * Sets the map item's \a flags, which control how the map content is drawn. + * \see mapFlags() + * \since QGIS 3.6 + */ + void setMapFlags( QgsLayoutItemMap::MapItemFlags flags ); + /** * Sets the map id() to a number not yet used in the layout. The existing id() is kept if it is not in use. */ @@ -521,6 +545,7 @@ class CORE_EXPORT QgsLayoutItemMap : public QgsLayoutItem private: + QgsLayoutItemMap::MapItemFlags mMapFlags = nullptr; //! Unique identifier int mMapId = 1; @@ -709,4 +734,6 @@ class CORE_EXPORT QgsLayoutItemMap : public QgsLayoutItem }; +Q_DECLARE_OPERATORS_FOR_FLAGS( QgsLayoutItemMap::MapItemFlags ) + #endif //QGSLAYOUTITEMMAP_H diff --git a/src/ui/layout/qgslayoutmaplabelingwidgetbase.ui b/src/ui/layout/qgslayoutmaplabelingwidgetbase.ui index f049072730c..090d5f08054 100644 --- a/src/ui/layout/qgslayoutmaplabelingwidgetbase.ui +++ b/src/ui/layout/qgslayoutmaplabelingwidgetbase.ui @@ -90,6 +90,13 @@ + + + + Allow truncated labels on edges of map + + + diff --git a/tests/src/python/test_qgslayoutmap.py b/tests/src/python/test_qgslayoutmap.py index 144ce329ddb..8ee88153fcc 100644 --- a/tests/src/python/test_qgslayoutmap.py +++ b/tests/src/python/test_qgslayoutmap.py @@ -339,6 +339,69 @@ class TestQgsLayoutMap(unittest.TestCase, LayoutItemTestCase): self.report += checker.report() self.assertTrue(result, message) + def testPartialLabels(self): + """ + Test rendering map item with a show partial labels flag + """ + format = QgsTextFormat() + format.setFont(QgsFontUtils.getStandardTestFont("Bold")) + format.setSize(20) + format.setNamedStyle("Bold") + format.setColor(QColor(0, 0, 0)) + settings = QgsPalLayerSettings() + settings.setFormat(format) + settings.fieldName = "'X'" + settings.isExpression = True + settings.placement = QgsPalLayerSettings.OverPoint + + vl = QgsVectorLayer("Point?crs=epsg:4326&field=id:integer", "vl", "memory") + vl.setRenderer(QgsNullSymbolRenderer()) + f = QgsFeature(vl.fields(), 1) + for x in range(15): + for y in range(15): + f.setGeometry(QgsPoint(x, y)) + vl.dataProvider().addFeature(f) + + vl.setLabeling(QgsVectorLayerSimpleLabeling(settings)) + vl.setLabelsEnabled(True) + + p = QgsProject() + + engine_settings = QgsLabelingEngineSettings() + engine_settings.setFlag(QgsLabelingEngineSettings.UsePartialCandidates, False) + engine_settings.setFlag(QgsLabelingEngineSettings.DrawLabelRectOnly, True) + p.setLabelingEngineSettings(engine_settings) + + p.addMapLayer(vl) + layout = QgsLayout(p) + layout.initializeDefaults() + p.setCrs(QgsCoordinateReferenceSystem('EPSG:4326')) + map = QgsLayoutItemMap(layout) + map.attemptSetSceneRect(QRectF(10, 10, 180, 180)) + map.setFrameEnabled(True) + map.zoomToExtent(vl.extent()) + map.setLayers([vl]) + layout.addLayoutItem(map) + + # default should always be to hide partial labels + self.assertFalse(map.mapFlags() & QgsLayoutItemMap.ShowPartialLabels) + + # hiding partial labels (the default) + map.setMapFlags(QgsLayoutItemMap.MapItemFlags()) + checker = QgsLayoutChecker('composermap_label_nomargin', layout) + checker.setControlPathPrefix("composer_map") + result, message = checker.testLayout() + self.report += checker.report() + self.assertTrue(result, message) + + # showing partial labels + map.setMapFlags(QgsLayoutItemMap.ShowPartialLabels) + checker = QgsLayoutChecker('composermap_show_partial_labels', layout) + checker.setControlPathPrefix("composer_map") + result, message = checker.testLayout() + self.report += checker.report() + self.assertTrue(result, message) + if __name__ == '__main__': unittest.main() diff --git a/tests/src/python/test_qgspallabeling_layout.py b/tests/src/python/test_qgspallabeling_layout.py index c3234ba73d8..089b8f1b4bd 100644 --- a/tests/src/python/test_qgspallabeling_layout.py +++ b/tests/src/python/test_qgspallabeling_layout.py @@ -35,7 +35,8 @@ from qgis.core import (QgsLayout, QgsLayoutExporter, QgsMapSettings, QgsProject, - QgsVectorLayerSimpleLabeling) + QgsVectorLayerSimpleLabeling, + QgsLabelingEngineSettings) from utilities import ( @@ -132,6 +133,8 @@ class TestLayoutBase(TestQgsPalLabeling): """:type: QgsLayoutItemMap""" self._cmap.setFrameEnabled(False) self._cmap.setLayers(self._TestMapSettings.layers()) + if self._TestMapSettings.labelingEngineSettings().flags() & QgsLabelingEngineSettings.UsePartialCandidates: + self._cmap.setMapFlags(QgsLayoutItemMap.ShowPartialLabels) self._c.addLayoutItem(self._cmap) # now expand map to fill page and set its extent self._cmap.attemptSetSceneRect(QRectF(0, 0, paperw, paperw)) diff --git a/tests/testdata/control_images/composer_map/expected_composermap_show_partial_labels/expected_composermap_show_partial_labels.png b/tests/testdata/control_images/composer_map/expected_composermap_show_partial_labels/expected_composermap_show_partial_labels.png new file mode 100644 index 0000000000000000000000000000000000000000..3baacea42aa69bac6c6dda1a5a766cb880a8fa0e GIT binary patch literal 7373 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 literal 0 HcmV?d00001 diff --git a/tests/testdata/qgis_server/test_project.qgs b/tests/testdata/qgis_server/test_project.qgs index 8af946924c2..975a8873cae 100644 --- a/tests/testdata/qgis_server/test_project.qgs +++ b/tests/testdata/qgis_server/test_project.qgs @@ -1130,7 +1130,7 @@ - + @@ -1209,7 +1209,7 @@ - + diff --git a/tests/testdata/qgis_server/test_project_contextual_legend.qgs b/tests/testdata/qgis_server/test_project_contextual_legend.qgs index 0b661c190be..fbeb29632a8 100644 --- a/tests/testdata/qgis_server/test_project_contextual_legend.qgs +++ b/tests/testdata/qgis_server/test_project_contextual_legend.qgs @@ -2921,7 +2921,7 @@ def my_form_open(dialog, layer, feature): - + diff --git a/tests/testdata/qgis_server_accesscontrol/project.qgs b/tests/testdata/qgis_server_accesscontrol/project.qgs index 3e4cea7d465..7cfcdeb89a5 100644 --- a/tests/testdata/qgis_server_accesscontrol/project.qgs +++ b/tests/testdata/qgis_server_accesscontrol/project.qgs @@ -3495,7 +3495,7 @@ def my_form_open(dialog, layer, feature): - + @@ -3708,7 +3708,7 @@ def my_form_open(dialog, layer, feature): - + @@ -3874,7 +3874,7 @@ def my_form_open(dialog, layer, feature): - + @@ -3891,7 +3891,7 @@ def my_form_open(dialog, layer, feature): - + diff --git a/tests/testdata/qgis_server_accesscontrol/project_groups.qgs b/tests/testdata/qgis_server_accesscontrol/project_groups.qgs index 00a255d0d18..022b453440a 100644 --- a/tests/testdata/qgis_server_accesscontrol/project_groups.qgs +++ b/tests/testdata/qgis_server_accesscontrol/project_groups.qgs @@ -4468,7 +4468,7 @@ def my_form_open(dialog, layer, feature): - + @@ -4681,7 +4681,7 @@ def my_form_open(dialog, layer, feature): - + diff --git a/tests/testdata/qgis_server_accesscontrol/project_grp.qgs b/tests/testdata/qgis_server_accesscontrol/project_grp.qgs index a295b4ca363..d413aef84db 100644 --- a/tests/testdata/qgis_server_accesscontrol/project_grp.qgs +++ b/tests/testdata/qgis_server_accesscontrol/project_grp.qgs @@ -3382,7 +3382,7 @@ def my_form_open(dialog, layer, feature): - + @@ -3595,7 +3595,7 @@ def my_form_open(dialog, layer, feature): - + @@ -3761,7 +3761,7 @@ def my_form_open(dialog, layer, feature): - + @@ -3778,7 +3778,7 @@ def my_form_open(dialog, layer, feature): - + diff --git a/tests/testdata/qgis_server_accesscontrol/project_labeling_settings.qgs b/tests/testdata/qgis_server_accesscontrol/project_labeling_settings.qgs index 753863b395b..9af41878b19 100644 --- a/tests/testdata/qgis_server_accesscontrol/project_labeling_settings.qgs +++ b/tests/testdata/qgis_server_accesscontrol/project_labeling_settings.qgs @@ -2929,7 +2929,7 @@ def my_form_open(dialog, layer, feature): - + @@ -3142,7 +3142,7 @@ def my_form_open(dialog, layer, feature): - + @@ -3308,7 +3308,7 @@ def my_form_open(dialog, layer, feature): - + @@ -3325,7 +3325,7 @@ def my_form_open(dialog, layer, feature): - +