From b63018520eaae34f714f3a64ceeafa43bb77abc9 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Sun, 22 Mar 2020 20:04:41 +1000 Subject: [PATCH] Cleanup scalebar widget enabling code by adding flags to QgsScaleBarRenderer subclasses, so that the subclass itself can indicate what settings it respects and we can avoid all the hardcoded logic in the configuration widget --- .../auto_additions/qgsscalebarrenderer.py | 15 +++++ .../qgsdoubleboxscalebarrenderer.sip.in | 2 + .../scalebar/qgshollowscalebarrenderer.sip.in | 2 + .../qgsnumericscalebarrenderer.sip.in | 2 + .../scalebar/qgsscalebarrenderer.sip.in | 27 +++++++++ .../qgssingleboxscalebarrenderer.sip.in | 2 + .../qgssteppedlinescalebarrenderer.sip.in | 4 +- .../scalebar/qgsticksscalebarrenderer.sip.in | 2 + .../scalebar/qgsdoubleboxscalebarrenderer.cpp | 14 +++++ .../scalebar/qgsdoubleboxscalebarrenderer.h | 1 + .../scalebar/qgshollowscalebarrenderer.cpp | 14 +++++ src/core/scalebar/qgshollowscalebarrenderer.h | 1 + .../scalebar/qgsnumericscalebarrenderer.cpp | 5 ++ .../scalebar/qgsnumericscalebarrenderer.h | 1 + src/core/scalebar/qgsscalebarrenderer.cpp | 5 ++ src/core/scalebar/qgsscalebarrenderer.h | 29 ++++++++++ .../scalebar/qgssingleboxscalebarrenderer.cpp | 14 +++++ .../scalebar/qgssingleboxscalebarrenderer.h | 1 + .../qgssteppedlinescalebarrenderer.cpp | 12 ++++ .../scalebar/qgssteppedlinescalebarrenderer.h | 3 +- .../scalebar/qgsticksscalebarrenderer.cpp | 12 ++++ src/core/scalebar/qgsticksscalebarrenderer.h | 1 + src/gui/layout/qgslayoutscalebarwidget.cpp | 55 ++++++------------- 23 files changed, 185 insertions(+), 39 deletions(-) create mode 100644 python/core/auto_additions/qgsscalebarrenderer.py diff --git a/python/core/auto_additions/qgsscalebarrenderer.py b/python/core/auto_additions/qgsscalebarrenderer.py new file mode 100644 index 00000000000..9d458fd429a --- /dev/null +++ b/python/core/auto_additions/qgsscalebarrenderer.py @@ -0,0 +1,15 @@ +# The following has been generated automatically from src/core/scalebar/qgsscalebarrenderer.h +# monkey patching scoped based enum +QgsScaleBarRenderer.Flag.FlagUsesLineSymbol.__doc__ = "Renderer utilises the scalebar line symbol (see QgsScaleBarSettings::lineSymbol() )" +QgsScaleBarRenderer.Flag.FlagUsesFillSymbol.__doc__ = "Renderer utilises the scalebar fill symbol (see QgsScaleBarSettings::fillSymbol() )" +QgsScaleBarRenderer.Flag.FlagUsesAlternateFillSymbol.__doc__ = "Renderer utilises the alternate scalebar fill symbol (see QgsScaleBarSettings::alternateFillSymbol() )" +QgsScaleBarRenderer.Flag.FlagRespectsUnits.__doc__ = "Renderer respects the QgsScaleBarSettings::units() setting" +QgsScaleBarRenderer.Flag.FlagRespectsMapUnitsPerScaleBarUnit.__doc__ = "Renderer respects the QgsScaleBarSettings::mapUnitsPerScaleBarUnit() setting" +QgsScaleBarRenderer.Flag.FlagUsesUnitLabel.__doc__ = "Renderer uses the QgsScaleBarSettings::unitLabel() setting" +QgsScaleBarRenderer.Flag.FlagUsesSegments.__doc__ = "Renderer uses the scalebar segments" +QgsScaleBarRenderer.Flag.FlagUsesLabelBarSpace.__doc__ = "Renderer uses the QgsScaleBarSettings::labelBarSpace() setting" +QgsScaleBarRenderer.Flag.FlagUsesLabelVerticalPlacement.__doc__ = "Renderer uses the QgsScaleBarSettings::labelVerticalPlacement() setting" +QgsScaleBarRenderer.Flag.FlagUsesLabelHorizontalPlacement.__doc__ = "Renderer uses the QgsScaleBarSettings::labelHorizontalPlacement() setting" +QgsScaleBarRenderer.Flag.FlagUsesAlignment.__doc__ = "Renderer uses the QgsScaleBarSettings::alignment() setting" +QgsScaleBarRenderer.Flag.__doc__ = 'Flags which control scalebar renderer behavior.\n\n.. versionadded:: 3.14\n\n' + '* ``FlagUsesLineSymbol``: ' + QgsScaleBarRenderer.Flag.FlagUsesLineSymbol.__doc__ + '\n' + '* ``FlagUsesFillSymbol``: ' + QgsScaleBarRenderer.Flag.FlagUsesFillSymbol.__doc__ + '\n' + '* ``FlagUsesAlternateFillSymbol``: ' + QgsScaleBarRenderer.Flag.FlagUsesAlternateFillSymbol.__doc__ + '\n' + '* ``FlagRespectsUnits``: ' + QgsScaleBarRenderer.Flag.FlagRespectsUnits.__doc__ + '\n' + '* ``FlagRespectsMapUnitsPerScaleBarUnit``: ' + QgsScaleBarRenderer.Flag.FlagRespectsMapUnitsPerScaleBarUnit.__doc__ + '\n' + '* ``FlagUsesUnitLabel``: ' + QgsScaleBarRenderer.Flag.FlagUsesUnitLabel.__doc__ + '\n' + '* ``FlagUsesSegments``: ' + QgsScaleBarRenderer.Flag.FlagUsesSegments.__doc__ + '\n' + '* ``FlagUsesLabelBarSpace``: ' + QgsScaleBarRenderer.Flag.FlagUsesLabelBarSpace.__doc__ + '\n' + '* ``FlagUsesLabelVerticalPlacement``: ' + QgsScaleBarRenderer.Flag.FlagUsesLabelVerticalPlacement.__doc__ + '\n' + '* ``FlagUsesLabelHorizontalPlacement``: ' + QgsScaleBarRenderer.Flag.FlagUsesLabelHorizontalPlacement.__doc__ + '\n' + '* ``FlagUsesAlignment``: ' + QgsScaleBarRenderer.Flag.FlagUsesAlignment.__doc__ +# -- diff --git a/python/core/auto_generated/scalebar/qgsdoubleboxscalebarrenderer.sip.in b/python/core/auto_generated/scalebar/qgsdoubleboxscalebarrenderer.sip.in index e8d3e7d05bf..6801cc345f7 100644 --- a/python/core/auto_generated/scalebar/qgsdoubleboxscalebarrenderer.sip.in +++ b/python/core/auto_generated/scalebar/qgsdoubleboxscalebarrenderer.sip.in @@ -30,6 +30,8 @@ Constructor for QgsDoubleBoxScaleBarRenderer. virtual QString visibleName() const; + virtual Flags flags() const; + virtual int sortKey() const; virtual QgsDoubleBoxScaleBarRenderer *clone() const /Factory/; diff --git a/python/core/auto_generated/scalebar/qgshollowscalebarrenderer.sip.in b/python/core/auto_generated/scalebar/qgshollowscalebarrenderer.sip.in index ba6e3609427..0e5972af0f8 100644 --- a/python/core/auto_generated/scalebar/qgshollowscalebarrenderer.sip.in +++ b/python/core/auto_generated/scalebar/qgshollowscalebarrenderer.sip.in @@ -31,6 +31,8 @@ Constructor for QgsHollowScaleBarRenderer. virtual QString visibleName() const; + virtual Flags flags() const; + virtual int sortKey() const; virtual QgsHollowScaleBarRenderer *clone() const /Factory/; diff --git a/python/core/auto_generated/scalebar/qgsnumericscalebarrenderer.sip.in b/python/core/auto_generated/scalebar/qgsnumericscalebarrenderer.sip.in index 89a8a427fa9..b46f996c314 100644 --- a/python/core/auto_generated/scalebar/qgsnumericscalebarrenderer.sip.in +++ b/python/core/auto_generated/scalebar/qgsnumericscalebarrenderer.sip.in @@ -32,6 +32,8 @@ Constructor for QgsNumericScaleBarRenderer. virtual int sortKey() const; + virtual Flags flags() const; + virtual QgsNumericScaleBarRenderer *clone() const /Factory/; diff --git a/python/core/auto_generated/scalebar/qgsscalebarrenderer.sip.in b/python/core/auto_generated/scalebar/qgsscalebarrenderer.sip.in index b7a510c45a9..33de3a36d53 100644 --- a/python/core/auto_generated/scalebar/qgsscalebarrenderer.sip.in +++ b/python/core/auto_generated/scalebar/qgsscalebarrenderer.sip.in @@ -36,6 +36,23 @@ custom labeling. }; + enum class Flag + { + FlagUsesLineSymbol, + FlagUsesFillSymbol, + FlagUsesAlternateFillSymbol, + FlagRespectsUnits, + FlagRespectsMapUnitsPerScaleBarUnit, + FlagUsesUnitLabel, + FlagUsesSegments, + FlagUsesLabelBarSpace, + FlagUsesLabelVerticalPlacement, + FlagUsesLabelHorizontalPlacement, + FlagUsesAlignment, + }; + typedef QFlags Flags; + + QgsScaleBarRenderer(); %Docstring Constructor for QgsScaleBarRenderer. @@ -61,6 +78,13 @@ Returns the unique ID for this renderer. %Docstring Returns the user friendly, translated name for the renderer. +.. versionadded:: 3.14 +%End + + virtual Flags flags() const; +%Docstring +Returns the scalebar rendering flags, which dictates the renderer's behavior. + .. versionadded:: 3.14 %End @@ -161,6 +185,9 @@ Returns a list of widths of each segment of the scalebar. }; +QFlags operator|(QgsScaleBarRenderer::Flag f1, QFlags f2); + + /************************************************************************ * This file has been generated automatically from * * * diff --git a/python/core/auto_generated/scalebar/qgssingleboxscalebarrenderer.sip.in b/python/core/auto_generated/scalebar/qgssingleboxscalebarrenderer.sip.in index 70b821e2cd4..33168ab3ee9 100644 --- a/python/core/auto_generated/scalebar/qgssingleboxscalebarrenderer.sip.in +++ b/python/core/auto_generated/scalebar/qgssingleboxscalebarrenderer.sip.in @@ -33,6 +33,8 @@ Constructor for QgsSingleBoxScaleBarRenderer. virtual int sortKey() const; + virtual Flags flags() const; + virtual QgsSingleBoxScaleBarRenderer *clone() const /Factory/; diff --git a/python/core/auto_generated/scalebar/qgssteppedlinescalebarrenderer.sip.in b/python/core/auto_generated/scalebar/qgssteppedlinescalebarrenderer.sip.in index 4ac58766337..37e4dde8fdc 100644 --- a/python/core/auto_generated/scalebar/qgssteppedlinescalebarrenderer.sip.in +++ b/python/core/auto_generated/scalebar/qgssteppedlinescalebarrenderer.sip.in @@ -32,7 +32,9 @@ Constructor for QgsSteppedLineScaleBarRenderer. virtual int sortKey() const; - virtual QgsSteppedLineScaleBarRenderer* clone() const /Factory/; + virtual Flags flags() const; + + virtual QgsSteppedLineScaleBarRenderer *clone() const /Factory/; virtual void draw( QgsRenderContext &context, diff --git a/python/core/auto_generated/scalebar/qgsticksscalebarrenderer.sip.in b/python/core/auto_generated/scalebar/qgsticksscalebarrenderer.sip.in index 3cb7e9801b6..25801851f44 100644 --- a/python/core/auto_generated/scalebar/qgsticksscalebarrenderer.sip.in +++ b/python/core/auto_generated/scalebar/qgsticksscalebarrenderer.sip.in @@ -39,6 +39,8 @@ Constructor for QgsTicksScaleBarRenderer. virtual int sortKey() const; + virtual Flags flags() const; + virtual QgsTicksScaleBarRenderer *clone() const /Factory/; diff --git a/src/core/scalebar/qgsdoubleboxscalebarrenderer.cpp b/src/core/scalebar/qgsdoubleboxscalebarrenderer.cpp index d8772f07ff0..903157fd89c 100644 --- a/src/core/scalebar/qgsdoubleboxscalebarrenderer.cpp +++ b/src/core/scalebar/qgsdoubleboxscalebarrenderer.cpp @@ -31,6 +31,20 @@ QString QgsDoubleBoxScaleBarRenderer::visibleName() const return QObject::tr( "Double Box" ); } +QgsScaleBarRenderer::Flags QgsDoubleBoxScaleBarRenderer::flags() const +{ + return Flag::FlagUsesLineSymbol | + Flag::FlagUsesFillSymbol | + Flag::FlagUsesAlternateFillSymbol | + Flag::FlagRespectsUnits | + Flag::FlagRespectsMapUnitsPerScaleBarUnit | + Flag::FlagUsesUnitLabel | + Flag::FlagUsesSegments | + Flag::FlagUsesLabelBarSpace | + Flag::FlagUsesLabelVerticalPlacement | + Flag::FlagUsesLabelHorizontalPlacement; +} + int QgsDoubleBoxScaleBarRenderer::sortKey() const { return 2; diff --git a/src/core/scalebar/qgsdoubleboxscalebarrenderer.h b/src/core/scalebar/qgsdoubleboxscalebarrenderer.h index 338ad3ccdc5..7c0f1fa4e3a 100644 --- a/src/core/scalebar/qgsdoubleboxscalebarrenderer.h +++ b/src/core/scalebar/qgsdoubleboxscalebarrenderer.h @@ -38,6 +38,7 @@ class CORE_EXPORT QgsDoubleBoxScaleBarRenderer: public QgsScaleBarRenderer QString id() const override; QString visibleName() const override; + Flags flags() const override; int sortKey() const override; QgsDoubleBoxScaleBarRenderer *clone() const override SIP_FACTORY; diff --git a/src/core/scalebar/qgshollowscalebarrenderer.cpp b/src/core/scalebar/qgshollowscalebarrenderer.cpp index ed26a5841fe..ec8038911ba 100644 --- a/src/core/scalebar/qgshollowscalebarrenderer.cpp +++ b/src/core/scalebar/qgshollowscalebarrenderer.cpp @@ -32,6 +32,20 @@ QString QgsHollowScaleBarRenderer::visibleName() const return QObject::tr( "Hollow" ); } +QgsScaleBarRenderer::Flags QgsHollowScaleBarRenderer::flags() const +{ + return Flag::FlagUsesLineSymbol | + Flag::FlagUsesFillSymbol | + Flag::FlagUsesAlternateFillSymbol | + Flag::FlagRespectsUnits | + Flag::FlagRespectsMapUnitsPerScaleBarUnit | + Flag::FlagUsesUnitLabel | + Flag::FlagUsesSegments | + Flag::FlagUsesLabelBarSpace | + Flag::FlagUsesLabelVerticalPlacement | + Flag::FlagUsesLabelHorizontalPlacement; +} + int QgsHollowScaleBarRenderer::sortKey() const { return 8; diff --git a/src/core/scalebar/qgshollowscalebarrenderer.h b/src/core/scalebar/qgshollowscalebarrenderer.h index fcb1faebcf9..40a585b197f 100644 --- a/src/core/scalebar/qgshollowscalebarrenderer.h +++ b/src/core/scalebar/qgshollowscalebarrenderer.h @@ -39,6 +39,7 @@ class CORE_EXPORT QgsHollowScaleBarRenderer: public QgsScaleBarRenderer QString id() const override; QString visibleName() const override; + Flags flags() const override; int sortKey() const override; QgsHollowScaleBarRenderer *clone() const override SIP_FACTORY; diff --git a/src/core/scalebar/qgsnumericscalebarrenderer.cpp b/src/core/scalebar/qgsnumericscalebarrenderer.cpp index 9c97ebdbce0..af8f94bfcaf 100644 --- a/src/core/scalebar/qgsnumericscalebarrenderer.cpp +++ b/src/core/scalebar/qgsnumericscalebarrenderer.cpp @@ -36,6 +36,11 @@ int QgsNumericScaleBarRenderer::sortKey() const return 9; } +QgsScaleBarRenderer::Flags QgsNumericScaleBarRenderer::flags() const +{ + return Flag::FlagUsesAlignment; +} + QgsNumericScaleBarRenderer *QgsNumericScaleBarRenderer::clone() const { return new QgsNumericScaleBarRenderer( *this ); diff --git a/src/core/scalebar/qgsnumericscalebarrenderer.h b/src/core/scalebar/qgsnumericscalebarrenderer.h index aee59c49fb6..48ec801b264 100644 --- a/src/core/scalebar/qgsnumericscalebarrenderer.h +++ b/src/core/scalebar/qgsnumericscalebarrenderer.h @@ -39,6 +39,7 @@ class CORE_EXPORT QgsNumericScaleBarRenderer: public QgsScaleBarRenderer QString id() const override; QString visibleName() const override; int sortKey() const override; + Flags flags() const override; QgsNumericScaleBarRenderer *clone() const override SIP_FACTORY; void draw( QgsRenderContext &context, diff --git a/src/core/scalebar/qgsscalebarrenderer.cpp b/src/core/scalebar/qgsscalebarrenderer.cpp index 09fd366c546..b08e8c8a7b7 100644 --- a/src/core/scalebar/qgsscalebarrenderer.cpp +++ b/src/core/scalebar/qgsscalebarrenderer.cpp @@ -145,6 +145,11 @@ void QgsScaleBarRenderer::drawDefaultLabels( QgsRenderContext &context, const Qg painter->restore(); } +QgsScaleBarRenderer::Flags QgsScaleBarRenderer::flags() const +{ + return nullptr; +} + int QgsScaleBarRenderer::sortKey() const { return 100; diff --git a/src/core/scalebar/qgsscalebarrenderer.h b/src/core/scalebar/qgsscalebarrenderer.h index b5ca6009dfd..fbc54fb4c63 100644 --- a/src/core/scalebar/qgsscalebarrenderer.h +++ b/src/core/scalebar/qgsscalebarrenderer.h @@ -64,6 +64,26 @@ class CORE_EXPORT QgsScaleBarRenderer }; + /** + * Flags which control scalebar renderer behavior. + * \since QGIS 3.14 + */ + enum class Flag + { + FlagUsesLineSymbol = 1 << 0, //!< Renderer utilises the scalebar line symbol (see QgsScaleBarSettings::lineSymbol() ) + FlagUsesFillSymbol = 1 << 1, //!< Renderer utilises the scalebar fill symbol (see QgsScaleBarSettings::fillSymbol() ) + FlagUsesAlternateFillSymbol = 1 << 2, //!< Renderer utilises the alternate scalebar fill symbol (see QgsScaleBarSettings::alternateFillSymbol() ) + FlagRespectsUnits = 1 << 3, //!< Renderer respects the QgsScaleBarSettings::units() setting + FlagRespectsMapUnitsPerScaleBarUnit = 1 << 4, //!< Renderer respects the QgsScaleBarSettings::mapUnitsPerScaleBarUnit() setting + FlagUsesUnitLabel = 1 << 5, //!< Renderer uses the QgsScaleBarSettings::unitLabel() setting + FlagUsesSegments = 1 << 6, //!< Renderer uses the scalebar segments + FlagUsesLabelBarSpace = 1 << 7, //!< Renderer uses the QgsScaleBarSettings::labelBarSpace() setting + FlagUsesLabelVerticalPlacement = 1 << 8, //!< Renderer uses the QgsScaleBarSettings::labelVerticalPlacement() setting + FlagUsesLabelHorizontalPlacement = 1 << 8, //!< Renderer uses the QgsScaleBarSettings::labelHorizontalPlacement() setting + FlagUsesAlignment = 1 << 9, //!< Renderer uses the QgsScaleBarSettings::alignment() setting + }; + Q_DECLARE_FLAGS( Flags, Flag ) + /** * Constructor for QgsScaleBarRenderer. */ @@ -88,6 +108,13 @@ class CORE_EXPORT QgsScaleBarRenderer */ virtual QString visibleName() const = 0; + /** + * Returns the scalebar rendering flags, which dictates the renderer's behavior. + * + * \since QGIS 3.14 + */ + virtual Flags flags() const; + /** * Returns a sorting key value, where renderers with a lower sort key will be shown earlier in lists. * @@ -177,4 +204,6 @@ class CORE_EXPORT QgsScaleBarRenderer }; +Q_DECLARE_OPERATORS_FOR_FLAGS( QgsScaleBarRenderer::Flags ) + #endif //QGSSCALEBARRENDERER_H diff --git a/src/core/scalebar/qgssingleboxscalebarrenderer.cpp b/src/core/scalebar/qgssingleboxscalebarrenderer.cpp index 01fd12fda59..9f17cf36fcc 100644 --- a/src/core/scalebar/qgssingleboxscalebarrenderer.cpp +++ b/src/core/scalebar/qgssingleboxscalebarrenderer.cpp @@ -36,6 +36,20 @@ int QgsSingleBoxScaleBarRenderer::sortKey() const return 1; } +QgsScaleBarRenderer::Flags QgsSingleBoxScaleBarRenderer::flags() const +{ + return Flag::FlagUsesLineSymbol | + Flag::FlagUsesFillSymbol | + Flag::FlagUsesAlternateFillSymbol | + Flag::FlagRespectsUnits | + Flag::FlagRespectsMapUnitsPerScaleBarUnit | + Flag::FlagUsesUnitLabel | + Flag::FlagUsesSegments | + Flag::FlagUsesLabelBarSpace | + Flag::FlagUsesLabelVerticalPlacement | + Flag::FlagUsesLabelHorizontalPlacement; +} + QgsSingleBoxScaleBarRenderer *QgsSingleBoxScaleBarRenderer::clone() const { return new QgsSingleBoxScaleBarRenderer( *this ); diff --git a/src/core/scalebar/qgssingleboxscalebarrenderer.h b/src/core/scalebar/qgssingleboxscalebarrenderer.h index ac94bb36328..3ee35edfba7 100644 --- a/src/core/scalebar/qgssingleboxscalebarrenderer.h +++ b/src/core/scalebar/qgssingleboxscalebarrenderer.h @@ -40,6 +40,7 @@ class CORE_EXPORT QgsSingleBoxScaleBarRenderer: public QgsScaleBarRenderer QString id() const override; QString visibleName() const override; int sortKey() const override; + Flags flags() const override; QgsSingleBoxScaleBarRenderer *clone() const override SIP_FACTORY; void draw( QgsRenderContext &context, diff --git a/src/core/scalebar/qgssteppedlinescalebarrenderer.cpp b/src/core/scalebar/qgssteppedlinescalebarrenderer.cpp index cd5d49cf902..740505a0328 100644 --- a/src/core/scalebar/qgssteppedlinescalebarrenderer.cpp +++ b/src/core/scalebar/qgssteppedlinescalebarrenderer.cpp @@ -36,6 +36,18 @@ int QgsSteppedLineScaleBarRenderer::sortKey() const return 7; } +QgsScaleBarRenderer::Flags QgsSteppedLineScaleBarRenderer::flags() const +{ + return Flag::FlagUsesLineSymbol | + Flag::FlagRespectsUnits | + Flag::FlagRespectsMapUnitsPerScaleBarUnit | + Flag::FlagUsesUnitLabel | + Flag::FlagUsesSegments | + Flag::FlagUsesLabelBarSpace | + Flag::FlagUsesLabelVerticalPlacement | + Flag::FlagUsesLabelHorizontalPlacement; +} + QgsSteppedLineScaleBarRenderer *QgsSteppedLineScaleBarRenderer::clone() const { return new QgsSteppedLineScaleBarRenderer( *this ); diff --git a/src/core/scalebar/qgssteppedlinescalebarrenderer.h b/src/core/scalebar/qgssteppedlinescalebarrenderer.h index 9fc38c37336..3efb231bb9c 100644 --- a/src/core/scalebar/qgssteppedlinescalebarrenderer.h +++ b/src/core/scalebar/qgssteppedlinescalebarrenderer.h @@ -39,7 +39,8 @@ class CORE_EXPORT QgsSteppedLineScaleBarRenderer: public QgsScaleBarRenderer QString id() const override; QString visibleName() const override; int sortKey() const override; - QgsSteppedLineScaleBarRenderer* clone() const override SIP_FACTORY; + Flags flags() const override; + QgsSteppedLineScaleBarRenderer *clone() const override SIP_FACTORY; void draw( QgsRenderContext &context, const QgsScaleBarSettings &settings, diff --git a/src/core/scalebar/qgsticksscalebarrenderer.cpp b/src/core/scalebar/qgsticksscalebarrenderer.cpp index 30ab0231263..afb6d9e5751 100644 --- a/src/core/scalebar/qgsticksscalebarrenderer.cpp +++ b/src/core/scalebar/qgsticksscalebarrenderer.cpp @@ -69,6 +69,18 @@ int QgsTicksScaleBarRenderer::sortKey() const return 6; } +QgsScaleBarRenderer::Flags QgsTicksScaleBarRenderer::flags() const +{ + return Flag::FlagUsesLineSymbol | + Flag::FlagRespectsUnits | + Flag::FlagRespectsMapUnitsPerScaleBarUnit | + Flag::FlagUsesUnitLabel | + Flag::FlagUsesSegments | + Flag::FlagUsesLabelBarSpace | + Flag::FlagUsesLabelVerticalPlacement | + Flag::FlagUsesLabelHorizontalPlacement; +} + QgsTicksScaleBarRenderer *QgsTicksScaleBarRenderer::clone() const { return new QgsTicksScaleBarRenderer( * this ); diff --git a/src/core/scalebar/qgsticksscalebarrenderer.h b/src/core/scalebar/qgsticksscalebarrenderer.h index 7d9970d6705..2ae81dda7a5 100644 --- a/src/core/scalebar/qgsticksscalebarrenderer.h +++ b/src/core/scalebar/qgsticksscalebarrenderer.h @@ -46,6 +46,7 @@ class CORE_EXPORT QgsTicksScaleBarRenderer: public QgsScaleBarRenderer QString id() const override; QString visibleName() const override; int sortKey() const override; + Flags flags() const override; QgsTicksScaleBarRenderer *clone() const override SIP_FACTORY; void draw( QgsRenderContext &context, diff --git a/src/gui/layout/qgslayoutscalebarwidget.cpp b/src/gui/layout/qgslayoutscalebarwidget.cpp index 921aa465771..a6524e0bc01 100644 --- a/src/gui/layout/qgslayoutscalebarwidget.cpp +++ b/src/gui/layout/qgslayoutscalebarwidget.cpp @@ -444,44 +444,25 @@ void QgsLayoutScaleBarWidget::mStyleComboBox_currentIndexChanged( const QString void QgsLayoutScaleBarWidget::toggleStyleSpecificControls( const QString &style ) { - if ( style == QLatin1String( "Numeric" ) ) - { - //Disable controls which don't apply to numeric scale bars - mUnitsComboBox->setEnabled( false ); - mUnitsLabel->setEnabled( false ); - mMapUnitsPerBarUnitSpinBox->setEnabled( false ); - mMapUnitsPerBarUnitLabel->setEnabled( false ); - mUnitLabelLineEdit->setEnabled( false ); - mUnitLabelLabel->setEnabled( false ); - mGroupBoxSegments->setEnabled( false ); + std::unique_ptr< QgsScaleBarRenderer > renderer( QgsApplication::scaleBarRendererRegistry()->renderer( style ) ); + + //Selectively enable controls which apply to the scale bar style + mUnitsComboBox->setEnabled( renderer ? renderer->flags() & QgsScaleBarRenderer::Flag::FlagRespectsUnits : true ); + mUnitsLabel->setEnabled( renderer ? renderer->flags() & QgsScaleBarRenderer::Flag::FlagRespectsUnits : true ); + mMapUnitsPerBarUnitSpinBox->setEnabled( renderer ? renderer->flags() & QgsScaleBarRenderer::Flag::FlagRespectsMapUnitsPerScaleBarUnit : true ); + mMapUnitsPerBarUnitLabel->setEnabled( renderer ? renderer->flags() & QgsScaleBarRenderer::Flag::FlagRespectsMapUnitsPerScaleBarUnit : true ); + mUnitLabelLineEdit->setEnabled( renderer ? renderer->flags() & QgsScaleBarRenderer::Flag::FlagUsesUnitLabel : true ); + mUnitLabelLabel->setEnabled( renderer ? renderer->flags() & QgsScaleBarRenderer::Flag::FlagUsesUnitLabel : true ); + mGroupBoxSegments->setEnabled( renderer ? renderer->flags() & QgsScaleBarRenderer::Flag::FlagUsesSegments : true ); + if ( !mGroupBoxUnits->isEnabled() ) mGroupBoxSegments->setCollapsed( true ); - mLabelBarSpaceSpinBox->setEnabled( false ); - mFillSymbol1Button->setEnabled( false ); - mFillSymbol2Button->setEnabled( false ); - mLineStyleButton->setEnabled( false ); - mLabelVerticalPlacementComboBox->setEnabled( false ); - mLabelHorizontalPlacementComboBox->setEnabled( false ); - mAlignmentComboBox->setEnabled( true ); - } - else - { - //Enable controls - mUnitsComboBox->setEnabled( true ); - mUnitsLabel->setEnabled( true ); - mMapUnitsPerBarUnitSpinBox->setEnabled( true ); - mMapUnitsPerBarUnitLabel->setEnabled( true ); - mUnitLabelLineEdit->setEnabled( true ); - mUnitLabelLabel->setEnabled( true ); - mGroupBoxSegments->setEnabled( true ); - mLabelBarSpaceSpinBox->setEnabled( true ); - mLineStyleButton->setEnabled( true ); - const bool hasFill = style == QLatin1String( "Double Box" ) || style == QLatin1String( "Single Box" ) || style == QLatin1String( "hollow" ); - mFillSymbol1Button->setEnabled( hasFill ); - mFillSymbol2Button->setEnabled( hasFill ); - mLabelVerticalPlacementComboBox->setEnabled( true ); - mLabelHorizontalPlacementComboBox->setEnabled( true ); - mAlignmentComboBox->setEnabled( false ); - } + mLabelBarSpaceSpinBox->setEnabled( renderer ? renderer->flags() & QgsScaleBarRenderer::Flag::FlagUsesLabelBarSpace : true ); + mLabelVerticalPlacementComboBox->setEnabled( renderer ? renderer->flags() & QgsScaleBarRenderer::Flag::FlagUsesLabelVerticalPlacement : true ); + mLabelHorizontalPlacementComboBox->setEnabled( renderer ? renderer->flags() & QgsScaleBarRenderer::Flag::FlagUsesLabelHorizontalPlacement : true ); + mAlignmentComboBox->setEnabled( renderer ? renderer->flags() & QgsScaleBarRenderer::Flag::FlagUsesAlignment : true ); + mFillSymbol1Button->setEnabled( renderer ? renderer->flags() & QgsScaleBarRenderer::Flag::FlagUsesFillSymbol : true ); + mFillSymbol2Button->setEnabled( renderer ? renderer->flags() & QgsScaleBarRenderer::Flag::FlagUsesAlternateFillSymbol : true ); + mLineStyleButton->setEnabled( renderer ? renderer->flags() & QgsScaleBarRenderer::Flag::FlagUsesLineSymbol : true ); } void QgsLayoutScaleBarWidget::mLabelBarSpaceSpinBox_valueChanged( double d )