diff --git a/python/core/core.sip b/python/core/core.sip index b9180a987470..bd9ea624b382 100644 --- a/python/core/core.sip +++ b/python/core/core.sip @@ -52,6 +52,7 @@ %Include qgsmaprendererjob.sip %Include qgsmapsettings.sip %Include qgsmaptopixel.sip +%Include qgsmapunitscale.sip %Include qgsmessagelog.sip %Include qgsmessageoutput.sip %Include qgsmimedatautils.sip @@ -217,3 +218,5 @@ %Include symbology-ng/qgssymbologyv2conversion.sip %Include dxf/qgsdxfexport.sip + + diff --git a/python/core/qgsmapunitscale.sip b/python/core/qgsmapunitscale.sip new file mode 100644 index 000000000000..1aaa7113b999 --- /dev/null +++ b/python/core/qgsmapunitscale.sip @@ -0,0 +1,27 @@ +/*! + * \class QgsMapUnitScale + * \brief Struct for storing maximum and minimum scales for measurements in map units + * + * For measurements in map units, a minimum and a maximum scale can be defined. + * Outside this range, the measurements aren't scaled anymore proportionally to + * the map scale. + */ + +class QgsMapUnitScale +{ +%TypeHeaderCode +#include +%End +public: + QgsMapUnitScale(); + + /** The minimum scale, or 0.0 if unset */ + double minScale; + /** The maximum scale, or 0.0 if unset */ + double maxScale; + + double computeMapUnitsPerPixel(const QgsRenderContext& c) const; +}; + + + diff --git a/python/core/symbology-ng/qgsellipsesymbollayerv2.sip b/python/core/symbology-ng/qgsellipsesymbollayerv2.sip index 8ccc8b8d1b20..f6876fd456d8 100644 --- a/python/core/symbology-ng/qgsellipsesymbollayerv2.sip +++ b/python/core/symbology-ng/qgsellipsesymbollayerv2.sip @@ -46,13 +46,27 @@ class QgsEllipseSymbolLayerV2 : QgsMarkerSymbolLayerV2 void setSymbolWidthUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit symbolWidthUnit() const; + + void setSymbolWidthMapUnitScale( const QgsMapUnitScale& scale); + const QgsMapUnitScale& symbolWidthMapUnitScale() const; void setSymbolHeightUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit symbolHeightUnit() const; + + void setSymbolHeightMapUnitScale( const QgsMapUnitScale& scale); + const QgsMapUnitScale& symbolHeightMapUnitScale() const; void setOutlineWidthUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit outlineWidthUnit() const; + + void setOutlineWidthMapUnitScale( const QgsMapUnitScale& scale); + const QgsMapUnitScale& outlineWidthMapUnitScale() const; void setOutputUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit outputUnit() const; + + void setMapUnitScale( const QgsMapUnitScale& scale); + QgsMapUnitScale mapUnitScale() const; }; + + diff --git a/python/core/symbology-ng/qgsfillsymbollayerv2.sip b/python/core/symbology-ng/qgsfillsymbollayerv2.sip index 311650deaea6..46e9d7ee2c98 100644 --- a/python/core/symbology-ng/qgsfillsymbollayerv2.sip +++ b/python/core/symbology-ng/qgsfillsymbollayerv2.sip @@ -70,12 +70,21 @@ class QgsSimpleFillSymbolLayerV2 : QgsFillSymbolLayerV2 void setBorderWidthUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit borderWidthUnit() const; + + void setBorderWidthMapUnitScale( const QgsMapUnitScale& scale); + const QgsMapUnitScale& borderWidthMapUnitScale() const; void setOffsetUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit offsetUnit() const; + + void setOffsetMapUnitScale( const QgsMapUnitScale& scale); + const QgsMapUnitScale& offsetMapUnitScale() const; void setOutputUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit outputUnit() const; + + void setMapUnitScale(const QgsMapUnitScale &scale); + QgsMapUnitScale mapUnitScale() const; double estimateMaxBleed() const; @@ -199,6 +208,15 @@ class QgsGradientFillSymbolLayerV2 : QgsFillSymbolLayerV2 /**Units for gradient fill offset*/ void setOffsetUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit offsetUnit() const; + + void setOffsetMapUnitScale( const QgsMapUnitScale& scale); + const QgsMapUnitScale& offsetMapUnitScale() const; + + void setOutputUnit(QgsSymbolV2::OutputUnit unit); + QgsSymbolV2::OutputUnit outputUnit() const; + + void setMapUnitScale(const QgsMapUnitScale &scale); + QgsMapUnitScale mapUnitScale() const; }; @@ -400,6 +418,9 @@ class QgsShapeburstFillSymbolLayerV2 : QgsFillSymbolLayerV2 * @see setOffsetUnit */ QgsSymbolV2::OutputUnit offsetUnit() const; + + void setOffsetMapUnitScale( const QgsMapUnitScale& scale); + const QgsMapUnitScale& offsetMapUnitScale() const; }; @@ -420,6 +441,15 @@ class QgsImageFillSymbolLayer: QgsFillSymbolLayerV2 void setOutlineWidthUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit outlineWidthUnit() const; + + void setOutlineWidthMapUnitScale( const QgsMapUnitScale& scale); + const QgsMapUnitScale& outlineWidthMapUnitScale() const; + + void setOutputUnit(QgsSymbolV2::OutputUnit unit); + QgsSymbolV2::OutputUnit outputUnit() const; + + void setMapUnitScale(const QgsMapUnitScale &scale); + QgsMapUnitScale mapUnitScale() const; virtual double estimateMaxBleed() const; @@ -472,9 +502,15 @@ class QgsSVGFillSymbolLayer: QgsImageFillSymbolLayer void setPatternWidthUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit patternWidthUnit() const; + + void setPatternWidthMapUnitScale( const QgsMapUnitScale& scale); + const QgsMapUnitScale& patternWidthMapUnitScale() const; void setSvgOutlineWidthUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit svgOutlineWidthUnit() const; + + void setSvgOutlineWidthMapUnitScale( const QgsMapUnitScale& scale); + const QgsMapUnitScale& svgOutlineWidthMapUnitScale() const; void setOutputUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit outputUnit() const; @@ -525,15 +561,27 @@ class QgsLinePatternFillSymbolLayer: QgsImageFillSymbolLayer void setDistanceUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit distanceUnit() const; + + void setDistanceMapUnitScale( const QgsMapUnitScale& scale); + const QgsMapUnitScale& distanceMapUnitScale() const; void setLineWidthUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit lineWidthUnit() const; + + void setLineWidthMapUnitScale( const QgsMapUnitScale& scale); + const QgsMapUnitScale& lineWidthMapUnitScale() const; void setOffsetUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit offsetUnit() const; + + void setOffsetMapUnitScale( const QgsMapUnitScale& scale); + const QgsMapUnitScale& offsetMapUnitScale() const; void setOutputUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit outputUnit() const; + + void setMapUnitScale( const QgsMapUnitScale& scale); + QgsMapUnitScale mapUnitScale() const; bool setSubSymbol( QgsSymbolV2* symbol ); QgsSymbolV2* subSymbol(); @@ -584,18 +632,33 @@ class QgsPointPatternFillSymbolLayer : QgsImageFillSymbolLayer void setDistanceXUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit distanceXUnit() const; + + void setDistanceXMapUnitScale( const QgsMapUnitScale& scale); + const QgsMapUnitScale& distanceXMapUnitScale() const; void setDistanceYUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit distanceYUnit() const; + + void setDistanceYMapUnitScale( const QgsMapUnitScale& scale); + const QgsMapUnitScale& distanceYMapUnitScale() const; void setDisplacementXUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit displacementXUnit() const; + + void setDisplacementXMapUnitScale( const QgsMapUnitScale& scale); + const QgsMapUnitScale& displacementXMapUnitScale() const; void setDisplacementYUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit displacementYUnit() const; + + void setDisplacementYMapUnitScale( const QgsMapUnitScale& scale); + const QgsMapUnitScale& displacementYMapUnitScale() const; void setOutputUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit outputUnit() const; + + void setMapUnitScale(const QgsMapUnitScale &scale); + QgsMapUnitScale mapUnitScale() const; virtual QSet usedAttributes() const; @@ -641,6 +704,11 @@ class QgsCentroidFillSymbolLayerV2 : QgsFillSymbolLayerV2 void setOutputUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit outputUnit() const; + + void setMapUnitScale(const QgsMapUnitScale &scale); + QgsMapUnitScale mapUnitScale() const; virtual QSet usedAttributes() const; }; + + diff --git a/python/core/symbology-ng/qgslinesymbollayerv2.sip b/python/core/symbology-ng/qgslinesymbollayerv2.sip index 0ee54218ec3c..1271ff30e808 100644 --- a/python/core/symbology-ng/qgslinesymbollayerv2.sip +++ b/python/core/symbology-ng/qgslinesymbollayerv2.sip @@ -34,6 +34,9 @@ class QgsSimpleLineSymbolLayerV2 : QgsLineSymbolLayerV2 void setOutputUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit outputUnit() const; + + void setMapUnitScale(const QgsMapUnitScale &scale); + QgsMapUnitScale mapUnitScale() const; double estimateMaxBleed() const; @@ -51,14 +54,20 @@ class QgsSimpleLineSymbolLayerV2 : QgsLineSymbolLayerV2 double offset() const; void setOffset( double offset ); - QgsSymbolV2::OutputUnit offsetUnit() const; void setOffsetUnit( QgsSymbolV2::OutputUnit unit ); + QgsSymbolV2::OutputUnit offsetUnit() const; + + void setOffsetMapUnitScale( const QgsMapUnitScale& scale); + const QgsMapUnitScale& offsetMapUnitScale() const; bool useCustomDashPattern() const; void setUseCustomDashPattern( bool b ); QgsSymbolV2::OutputUnit customDashPatternUnit() const; void setCustomDashPatternUnit( QgsSymbolV2::OutputUnit unit ); + + const QgsMapUnitScale& customDashPatternMapUnitScale() const; + void setCustomDashPatternMapUnitScale( const QgsMapUnitScale& scale); QVector customDashVector() const; void setCustomDashVector( const QVector& vector ); @@ -180,15 +189,34 @@ class QgsMarkerLineSymbolLayerV2 : QgsLineSymbolLayerV2 * @see setOffsetAlongLine */ void setOffsetAlongLineUnit( QgsSymbolV2::OutputUnit unit ); + + /**Returns the map unit scale used for calculating the offset in map units along line for markers. + * @returns Offset along line map unit scale. + */ + const QgsMapUnitScale& offsetAlongLineMapUnitScale() const; + + /**Sets the map unit scale used for calculating the offset in map units along line for markers. + * @param scale Offset along line map unit scale. + */ + void setOffsetAlongLineMapUnitScale(const QgsMapUnitScale& scale); QgsSymbolV2::OutputUnit intervalUnit() const; void setIntervalUnit( QgsSymbolV2::OutputUnit unit ); + + void setIntervalMapUnitScale( const QgsMapUnitScale& scale); + const QgsMapUnitScale& intervalMapUnitScale() const; QgsSymbolV2::OutputUnit offsetUnit() const; void setOffsetUnit( QgsSymbolV2::OutputUnit unit ); + + void setOffsetMapUnitScale( const QgsMapUnitScale& scale); + const QgsMapUnitScale& offsetMapUnitScale() const; void setOutputUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit outputUnit() const; + + void setMapUnitScale( const QgsMapUnitScale& scale); + QgsMapUnitScale mapUnitScale() const; protected: @@ -197,3 +225,5 @@ class QgsMarkerLineSymbolLayerV2 : QgsLineSymbolLayerV2 void renderPolylineCentral( const QPolygonF& points, QgsSymbolV2RenderContext& context ); double markerAngle( const QPolygonF& points, bool isRing, int vertex ); }; + + diff --git a/python/core/symbology-ng/qgsmarkersymbollayerv2.sip b/python/core/symbology-ng/qgsmarkersymbollayerv2.sip index e0257c4542b0..a7974e724da7 100644 --- a/python/core/symbology-ng/qgsmarkersymbollayerv2.sip +++ b/python/core/symbology-ng/qgsmarkersymbollayerv2.sip @@ -63,6 +63,9 @@ class QgsSimpleMarkerSymbolLayerV2 : QgsMarkerSymbolLayerV2 QgsSymbolV2::OutputUnit outlineWidthUnit() const; void setOutlineWidthUnit( QgsSymbolV2::OutputUnit u ); + + void setOutlineWidthMapUnitScale( const QgsMapUnitScale& scale); + const QgsMapUnitScale& outlineWidthMapUnitScale() const; bool writeDxf( QgsDxfExport& e, double mmMapUnitScaleFactor, const QString& layerName, const QgsSymbolV2RenderContext* context, const QgsFeature* f, const QPointF& shift = QPointF( 0.0, 0.0 ) ) const; @@ -124,6 +127,9 @@ class QgsSvgMarkerSymbolLayerV2 : QgsMarkerSymbolLayerV2 void setOutlineWidthUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit outlineWidthUnit() const; + + void setOutlineWidthMapUnitScale( const QgsMapUnitScale& scale); + const QgsMapUnitScale& outlineWidthMapUnitScale() const; void setOutputUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit outputUnit() const; @@ -173,3 +179,5 @@ class QgsFontMarkerSymbolLayerV2 : QgsMarkerSymbolLayerV2 QChar character() const; void setCharacter( QChar ch ); }; + + diff --git a/python/core/symbology-ng/qgssymbollayerv2.sip b/python/core/symbology-ng/qgssymbollayerv2.sip index 68f127fd0a33..928209e39f3b 100644 --- a/python/core/symbology-ng/qgssymbollayerv2.sip +++ b/python/core/symbology-ng/qgssymbollayerv2.sip @@ -110,6 +110,9 @@ class QgsSymbolLayerV2 virtual void setOutputUnit( QgsSymbolV2::OutputUnit unit ); virtual QgsSymbolV2::OutputUnit outputUnit() const; + + virtual void setMapUnitScale( const QgsMapUnitScale& mapUnitScale ); + virtual QgsMapUnitScale mapUnitScale() const; // used only with rending with symbol levels is turned on (0 = first pass, 1 = second, ...) void setRenderingPass( int renderingPass ); @@ -197,12 +200,21 @@ class QgsMarkerSymbolLayerV2 : QgsSymbolLayerV2 void setOffsetUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit offsetUnit() const; + + void setOffsetMapUnitScale( const QgsMapUnitScale& scale); + const QgsMapUnitScale& offsetMapUnitScale() const; void setSizeUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit sizeUnit() const; + + void setSizeMapUnitScale( const QgsMapUnitScale& scale); + const QgsMapUnitScale& sizeMapUnitScale() const; virtual void setOutputUnit( QgsSymbolV2::OutputUnit unit ); virtual QgsSymbolV2::OutputUnit outputUnit() const; + + void setMapUnitScale( const QgsMapUnitScale& scale); + QgsMapUnitScale mapUnitScale() const; void setHorizontalAnchorPoint( HorizontalAnchorPoint h ); HorizontalAnchorPoint horizontalAnchorPoint() const; @@ -219,7 +231,8 @@ class QgsMarkerSymbolLayerV2 : QgsSymbolLayerV2 //! @note available in python bindings as markerOffset2 void markerOffset( const QgsSymbolV2RenderContext& context, double width, double height, QgsSymbolV2::OutputUnit widthUnit, QgsSymbolV2::OutputUnit heightUnit, - double& offsetX, double& offsetY ) const /PyName=markerOffset2/; + double& offsetX, double& offsetY, + const QgsMapUnitScale& widthMapUnitScale, const QgsMapUnitScale& heightMapUnitScale ) const /PyName=markerOffset2/; static QPointF _rotatedOffset( const QPointF& offset, double angle ); }; @@ -241,6 +254,9 @@ class QgsLineSymbolLayerV2 : QgsSymbolLayerV2 void setWidthUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit widthUnit() const; + + void setWidthMapUnitScale( const QgsMapUnitScale& scale); + const QgsMapUnitScale& widthMapUnitScale() const; void drawPreviewIcon( QgsSymbolV2RenderContext& context, QSize size ); @@ -269,3 +285,5 @@ class QgsFillSymbolLayerV2 : QgsSymbolLayerV2 /**Default method to render polygon*/ void _renderPolygon( QPainter* p, const QPolygonF& points, const QList* rings, QgsSymbolV2RenderContext& context ); }; + + diff --git a/python/core/symbology-ng/qgssymbollayerv2utils.sip b/python/core/symbology-ng/qgssymbollayerv2utils.sip index ba82bb949d6f..1e85ac593215 100644 --- a/python/core/symbology-ng/qgssymbollayerv2utils.sip +++ b/python/core/symbology-ng/qgssymbollayerv2utils.sip @@ -58,7 +58,7 @@ class QgsSymbolLayerV2Utils static QgsSymbolV2::ScaleMethod decodeScaleMethod( QString str ); static QIcon symbolPreviewIcon( QgsSymbolV2* symbol, QSize size ); - static QIcon symbolLayerPreviewIcon( QgsSymbolLayerV2* layer, QgsSymbolV2::OutputUnit u, QSize size ); + static QIcon symbolLayerPreviewIcon( QgsSymbolLayerV2* layer, QgsSymbolV2::OutputUnit u, QSize size, const QgsMapUnitScale& scale = QgsMapUnitScale() ); static QIcon colorRampPreviewIcon( QgsVectorColorRampV2* ramp, QSize size ); static void drawStippledBackround( QPainter* painter, QRect rect ); @@ -190,9 +190,9 @@ class QgsSymbolLayerV2Utils static QColor parseColor( QString colorStr ); /**Returns the line width scale factor depending on the unit and the paint device*/ - static double lineWidthScaleFactor( const QgsRenderContext& c, QgsSymbolV2::OutputUnit u ); + static double lineWidthScaleFactor( const QgsRenderContext& c, QgsSymbolV2::OutputUnit u, const QgsMapUnitScale& mapUnitScale = QgsMapUnitScale() ); /**Returns scale factor painter units -> pixel dimensions*/ - static double pixelSizeScaleFactor( const QgsRenderContext& c, QgsSymbolV2::OutputUnit u ); + static double pixelSizeScaleFactor( const QgsRenderContext& c, QgsSymbolV2::OutputUnit u, const QgsMapUnitScale& mapUnitScale = QgsMapUnitScale() ); /**Creates a render context for a pixel based device*/ static QgsRenderContext createRenderContext( QPainter* p ); @@ -248,3 +248,5 @@ class QgsSymbolLayerV2Utils */ static QString fieldOrExpressionFromExpression( QgsExpression* expression ); }; + + diff --git a/python/core/symbology-ng/qgssymbolv2.sip b/python/core/symbology-ng/qgssymbolv2.sip index 44386102b73c..44f27649f89c 100644 --- a/python/core/symbology-ng/qgssymbolv2.sip +++ b/python/core/symbology-ng/qgssymbolv2.sip @@ -92,6 +92,9 @@ class QgsSymbolV2 OutputUnit outputUnit() const; void setOutputUnit( OutputUnit u ); + + QgsMapUnitScale mapUnitScale() const; + void setMapUnitScale( const QgsMapUnitScale& scale ); //! Get alpha transparency 1 for opaque, 0 for invisible qreal alpha() const; @@ -128,7 +131,7 @@ class QgsSymbolV2RenderContext %End public: - QgsSymbolV2RenderContext( QgsRenderContext& c, QgsSymbolV2::OutputUnit u , qreal alpha = 1.0, bool selected = false, int renderHints = 0, const QgsFeature* f = 0, const QgsFields* fields = 0 ); + QgsSymbolV2RenderContext( QgsRenderContext& c, QgsSymbolV2::OutputUnit u , qreal alpha = 1.0, bool selected = false, int renderHints = 0, const QgsFeature* f = 0, const QgsFields* fields = 0, const QgsMapUnitScale& mapUnitScale = QgsMapUnitScale() ); ~QgsSymbolV2RenderContext(); QgsRenderContext& renderContext(); @@ -136,6 +139,9 @@ class QgsSymbolV2RenderContext QgsSymbolV2::OutputUnit outputUnit() const; void setOutputUnit( QgsSymbolV2::OutputUnit u ); + + QgsMapUnitScale mapUnitScale() const; + void setMapUnitScale( const QgsMapUnitScale& scale); //! Get alpha transparency 1 for opaque, 0 for invisible qreal alpha() const; @@ -249,3 +255,5 @@ class QgsFillSymbolV2 : QgsSymbolV2 virtual QgsSymbolV2* clone() const /Factory/; }; + + diff --git a/python/core/symbology-ng/qgsvectorfieldsymbollayer.sip b/python/core/symbology-ng/qgsvectorfieldsymbollayer.sip index 433523cd2620..b8920e32020a 100644 --- a/python/core/symbology-ng/qgsvectorfieldsymbollayer.sip +++ b/python/core/symbology-ng/qgsvectorfieldsymbollayer.sip @@ -63,7 +63,15 @@ class QgsVectorFieldSymbolLayer : QgsMarkerSymbolLayerV2 void setOutputUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit outputUnit() const; + + void setMapUnitScale( const QgsMapUnitScale& scale); + QgsMapUnitScale mapUnitScale() const; void setDistanceUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit distanceUnit() const; + + void setDistanceMapUnitScale( const QgsMapUnitScale& scale); + const QgsMapUnitScale& distanceMapUnitScale() const; }; + + diff --git a/python/gui/symbology-ng/qgssymbollayerv2widget.sip b/python/gui/symbology-ng/qgssymbollayerv2widget.sip index a1c564af65e4..6409d4869c87 100644 --- a/python/gui/symbology-ng/qgssymbollayerv2widget.sip +++ b/python/gui/symbology-ng/qgssymbollayerv2widget.sip @@ -39,9 +39,9 @@ class QgsSimpleLineSymbolLayerV2Widget : QgsSymbolLayerV2Widget void offsetChanged(); void on_mCustomCheckBox_stateChanged( int state ); void on_mChangePatternButton_clicked(); - void on_mPenWidthUnitComboBox_currentIndexChanged( int index ); - void on_mOffsetUnitComboBox_currentIndexChanged( int index ); - void on_mDashPatternUnitComboBox_currentIndexChanged( int index ); + void on_mPenWidthUnitWidget_changed( ); + void on_mOffsetUnitWidget_changed( ); + void on_mDashPatternUnitWidget_changed( ); void on_mDataDefinedPropertiesButton_clicked(); void on_mDrawInsideCheckBox_stateChanged( int state ); @@ -74,9 +74,9 @@ class QgsSimpleMarkerSymbolLayerV2Widget : QgsSymbolLayerV2Widget void setSize(); void setAngle(); void setOffset(); - void on_mSizeUnitComboBox_currentIndexChanged( int index ); - void on_mOffsetUnitComboBox_currentIndexChanged( int index ); - void on_mOutlineWidthUnitComboBox_currentIndexChanged( int index ); + void on_mSizeUnitWidget_changed( ); + void on_mOffsetUnitWidget_changed( ); + void on_mOutlineWidthUnitWidget_changed( ); void on_mDataDefinedPropertiesButton_clicked(); void on_mOutlineStyleComboBox_currentIndexChanged( int index ); void on_mOutlineWidthSpinBox_valueChanged( double d ); @@ -108,8 +108,8 @@ class QgsSimpleFillSymbolLayerV2Widget : QgsSymbolLayerV2Widget void borderWidthChanged(); void borderStyleChanged(); void offsetChanged(); - void on_mBorderWidthUnitComboBox_currentIndexChanged( int index ); - void on_mOffsetUnitComboBox_currentIndexChanged( int index ); + void on_mBorderWidthUnitWidget_changed( ); + void on_mOffsetUnitWidget_changed( ); void on_mDataDefinedPropertiesButton_clicked(); }; @@ -139,7 +139,7 @@ class QgsGradientFillSymbolLayerV2Widget : QgsSymbolLayerV2Widget void setGradientSpread( int index ); void offsetChanged(); void referencePointChanged(); - void on_mOffsetUnitComboBox_currentIndexChanged( int index ); + void on_mOffsetUnitWidget_changed( ); void on_mDataDefinedPropertiesButton_clicked(); void colorModeChanged(); void on_mSpinAngle_valueChanged( double value ); @@ -167,11 +167,11 @@ class QgsShapeburstFillSymbolLayerV2Widget : QgsSymbolLayerV2Widget void colorModeChanged(); void on_mSpinBlurRadius_valueChanged( int value ); void on_mSpinMaxDistance_valueChanged( double value ); - void on_mDistanceUnitComboBox_currentIndexChanged( int index ); + void on_mDistanceUnitWidget_changed( ); void on_mRadioUseWholeShape_toggled( bool value ); void applyColorRamp(); void offsetChanged(); - void on_mOffsetUnitComboBox_currentIndexChanged( int index ); + void on_mOffsetUnitWidget_changed( ); void on_mDataDefinedPropertiesButton_clicked(); }; @@ -198,9 +198,9 @@ class QgsMarkerLineSymbolLayerV2Widget : QgsSymbolLayerV2Widget void setRotate(); void setOffset(); void setPlacement(); - void on_mIntervalUnitComboBox_currentIndexChanged( int index ); - void on_mOffsetUnitComboBox_currentIndexChanged( int index ); - void on_mOffsetAlongLineUnitComboBox_currentIndexChanged( int index ); + void on_mIntervalUnitWidget_changed( ); + void on_mOffsetUnitWidget_changed( ); + void on_mOffsetAlongLineUnitWidget_changed( ); void on_mDataDefinedPropertiesButton_clicked(); }; @@ -235,9 +235,9 @@ class QgsSvgMarkerSymbolLayerV2Widget : QgsSymbolLayerV2Widget void on_mChangeColorButton_colorChanged( const QColor& color ); void on_mChangeBorderColorButton_colorChanged( const QColor& color ); void on_mBorderWidthSpinBox_valueChanged( double d ); - void on_mSizeUnitComboBox_currentIndexChanged( int index ); - void on_mBorderWidthUnitComboBox_currentIndexChanged( int index ); - void on_mOffsetUnitComboBox_currentIndexChanged( int index ); + void on_mSizeUnitWidget_changed( ); + void on_mBorderWidthUnitWidget_changed( ); + void on_mOffsetUnitWidget_changed( ); void on_mDataDefinedPropertiesButton_clicked(); void on_mHorizontalAnchorComboBox_currentIndexChanged( int index ); void on_mVerticalAnchorComboBox_currentIndexChanged( int index ); @@ -334,8 +334,8 @@ class QgsFontMarkerSymbolLayerV2Widget : QgsSymbolLayerV2Widget void setAngle( double angle ); void setCharacter( const QChar& chr ); void setOffset(); - void on_mSizeUnitComboBox_currentIndexChanged( int index ); - void on_mOffsetUnitComboBox_currentIndexChanged( int index ); + void on_mSizeUnitWidget_changed( ); + void on_mOffsetUnitWidget_changed( ); void on_mHorizontalAnchorComboBox_currentIndexChanged( int index ); void on_mVerticalAnchorComboBox_currentIndexChanged( int index ); }; @@ -357,3 +357,5 @@ class QgsCentroidFillSymbolLayerV2Widget : QgsSymbolLayerV2Widget virtual void setSymbolLayer( QgsSymbolLayerV2* layer ); virtual QgsSymbolLayerV2* symbolLayer(); }; + + diff --git a/python/gui/symbology-ng/qgssymbolslistwidget.sip b/python/gui/symbology-ng/qgssymbolslistwidget.sip index 7999fcdf35b4..e3891eba2cfa 100644 --- a/python/gui/symbology-ng/qgssymbolslistwidget.sip +++ b/python/gui/symbology-ng/qgssymbolslistwidget.sip @@ -14,7 +14,7 @@ class QgsSymbolsListWidget : QWidget void setLineWidth( double width ); void addSymbolToStyle(); void symbolAddedToStyle( QString name, QgsSymbolV2* symbol ); - void on_mSymbolUnitComboBox_currentIndexChanged( const QString & text ); + void on_mSymbolUnitWidget_changed( ); void on_mTransparencySlider_valueChanged( int value ); void on_groupsCombo_currentIndexChanged( int index ); @@ -31,3 +31,5 @@ class QgsSymbolsListWidget : QWidget void updateSymbolColor(); void updateSymbolInfo(); }; + + diff --git a/python/qsci_apis/PyQGIS-2.0.api b/python/qsci_apis/PyQGIS-2.0.api index a4d78c2da9e9..0c6e7de86d47 100644 --- a/python/qsci_apis/PyQGIS-2.0.api +++ b/python/qsci_apis/PyQGIS-2.0.api @@ -8127,9 +8127,9 @@ qgis.gui.QgsSimpleLineSymbolLayerV2Widget.penStyleChanged?4() qgis.gui.QgsSimpleLineSymbolLayerV2Widget.offsetChanged?4() qgis.gui.QgsSimpleLineSymbolLayerV2Widget.on_mCustomCheckBox_stateChanged?4(int) qgis.gui.QgsSimpleLineSymbolLayerV2Widget.on_mChangePatternButton_clicked?4() -qgis.gui.QgsSimpleLineSymbolLayerV2Widget.on_mPenWidthUnitComboBox_currentIndexChanged?4(int) -qgis.gui.QgsSimpleLineSymbolLayerV2Widget.on_mOffsetUnitComboBox_currentIndexChanged?4(int) -qgis.gui.QgsSimpleLineSymbolLayerV2Widget.on_mDashPatternUnitComboBox_currentIndexChanged?4(int) +qgis.gui.QgsSimpleLineSymbolLayerV2Widget.on_mPenWidthUnitWidget_changed?4() +qgis.gui.QgsSimpleLineSymbolLayerV2Widget.on_mOffsetUnitWidget_changed?4() +qgis.gui.QgsSimpleLineSymbolLayerV2Widget.on_mDashPatternUnitWidget_changed?4() qgis.gui.QgsSimpleLineSymbolLayerV2Widget.on_mDataDefinedPropertiesButton_clicked?4() qgis.gui.QgsSimpleLineSymbolLayerV2Widget.updatePatternIcon?4() qgis.gui.QgsSimpleMarkerSymbolLayerV2Widget?1(QgsVectorLayer, QWidget parent=None) @@ -8143,9 +8143,9 @@ qgis.gui.QgsSimpleMarkerSymbolLayerV2Widget.setColorFill?4(QColor) qgis.gui.QgsSimpleMarkerSymbolLayerV2Widget.setSize?4() qgis.gui.QgsSimpleMarkerSymbolLayerV2Widget.setAngle?4() qgis.gui.QgsSimpleMarkerSymbolLayerV2Widget.setOffset?4() -qgis.gui.QgsSimpleMarkerSymbolLayerV2Widget.on_mSizeUnitComboBox_currentIndexChanged?4(int) -qgis.gui.QgsSimpleMarkerSymbolLayerV2Widget.on_mOffsetUnitComboBox_currentIndexChanged?4(int) -qgis.gui.QgsSimpleMarkerSymbolLayerV2Widget.on_mOutlineWidthUnitComboBox_currentIndexChanged?4(int) +qgis.gui.QgsSimpleMarkerSymbolLayerV2Widget.on_mSizeUnitWidget_changed?4() +qgis.gui.QgsSimpleMarkerSymbolLayerV2Widget.on_mOffsetUnitWidget_changed?4() +qgis.gui.QgsSimpleMarkerSymbolLayerV2Widget.on_mOutlineWidthUnitWidget_changed?4() qgis.gui.QgsSimpleMarkerSymbolLayerV2Widget.on_mDataDefinedPropertiesButton_clicked?4() qgis.gui.QgsSimpleMarkerSymbolLayerV2Widget.on_mOutlineWidthSpinBox_valueChanged?4(float) qgis.gui.QgsSimpleFillSymbolLayerV2Widget?1(QgsVectorLayer, QWidget parent=None) @@ -8159,8 +8159,8 @@ qgis.gui.QgsSimpleFillSymbolLayerV2Widget.setBrushStyle?4() qgis.gui.QgsSimpleFillSymbolLayerV2Widget.borderWidthChanged?4() qgis.gui.QgsSimpleFillSymbolLayerV2Widget.borderStyleChanged?4() qgis.gui.QgsSimpleFillSymbolLayerV2Widget.offsetChanged?4() -qgis.gui.QgsSimpleFillSymbolLayerV2Widget.on_mBorderWidthUnitComboBox_currentIndexChanged?4(int) -qgis.gui.QgsSimpleFillSymbolLayerV2Widget.on_mOffsetUnitComboBox_currentIndexChanged?4(int) +qgis.gui.QgsSimpleFillSymbolLayerV2Widget.on_mBorderWidthUnitWidget_changed?4() +qgis.gui.QgsSimpleFillSymbolLayerV2Widget.on_mOffsetUnitWidget_changed?4() qgis.gui.QgsSimpleFillSymbolLayerV2Widget.on_mDataDefinedPropertiesButton_clicked?4() qgis.gui.QgsMarkerLineSymbolLayerV2Widget?1(QgsVectorLayer, QWidget parent=None) qgis.gui.QgsMarkerLineSymbolLayerV2Widget.__init__?1(self, QgsVectorLayer, QWidget parent=None) @@ -8171,8 +8171,8 @@ qgis.gui.QgsMarkerLineSymbolLayerV2Widget.setInterval?4(float) qgis.gui.QgsMarkerLineSymbolLayerV2Widget.setRotate?4() qgis.gui.QgsMarkerLineSymbolLayerV2Widget.setOffset?4() qgis.gui.QgsMarkerLineSymbolLayerV2Widget.setPlacement?4() -qgis.gui.QgsMarkerLineSymbolLayerV2Widget.on_mIntervalUnitComboBox_currentIndexChanged?4(int) -qgis.gui.QgsMarkerLineSymbolLayerV2Widget.on_mOffsetUnitComboBox_currentIndexChanged?4(int) +qgis.gui.QgsMarkerLineSymbolLayerV2Widget.on_mIntervalUnitWidget_changed?4() +qgis.gui.QgsMarkerLineSymbolLayerV2Widget.on_mOffsetUnitWidget_changed?4() qgis.gui.QgsMarkerLineSymbolLayerV2Widget.on_mDataDefinedPropertiesButton_clicked?4() qgis.gui.QgsSvgMarkerSymbolLayerV2Widget?1(QgsVectorLayer, QWidget parent=None) qgis.gui.QgsSvgMarkerSymbolLayerV2Widget.__init__?1(self, QgsVectorLayer, QWidget parent=None) @@ -8190,9 +8190,9 @@ qgis.gui.QgsSvgMarkerSymbolLayerV2Widget.on_mFileLineEdit_editingFinished?4() qgis.gui.QgsSvgMarkerSymbolLayerV2Widget.on_mChangeColorButton_colorChanged?4(QColor) qgis.gui.QgsSvgMarkerSymbolLayerV2Widget.on_mChangeBorderColorButton_colorChanged?4(QColor) qgis.gui.QgsSvgMarkerSymbolLayerV2Widget.on_mBorderWidthSpinBox_valueChanged?4(float) -qgis.gui.QgsSvgMarkerSymbolLayerV2Widget.on_mSizeUnitComboBox_currentIndexChanged?4(int) -qgis.gui.QgsSvgMarkerSymbolLayerV2Widget.on_mBorderWidthUnitComboBox_currentIndexChanged?4(int) -qgis.gui.QgsSvgMarkerSymbolLayerV2Widget.on_mOffsetUnitComboBox_currentIndexChanged?4(int) +qgis.gui.QgsSvgMarkerSymbolLayerV2Widget.on_mSizeUnitWidget_changed?4() +qgis.gui.QgsSvgMarkerSymbolLayerV2Widget.on_mBorderWidthUnitWidget_changed?4() +qgis.gui.QgsSvgMarkerSymbolLayerV2Widget.on_mOffsetUnitWidget_changed?4() qgis.gui.QgsSvgMarkerSymbolLayerV2Widget.on_mDataDefinedPropertiesButton_clicked?4() qgis.gui.QgsSvgMarkerSymbolLayerV2Widget.populateList?4() qgis.gui.QgsSvgMarkerSymbolLayerV2Widget.setGuiForSvg?4(QgsSvgMarkerSymbolLayerV2) @@ -8224,8 +8224,8 @@ qgis.gui.QgsFontMarkerSymbolLayerV2Widget.setSize?4(float) qgis.gui.QgsFontMarkerSymbolLayerV2Widget.setAngle?4(float) qgis.gui.QgsFontMarkerSymbolLayerV2Widget.setCharacter?4(QChar) qgis.gui.QgsFontMarkerSymbolLayerV2Widget.setOffset?4() -qgis.gui.QgsFontMarkerSymbolLayerV2Widget.on_mSizeUnitComboBox_currentIndexChanged?4(int) -qgis.gui.QgsFontMarkerSymbolLayerV2Widget.on_mOffsetUnitComboBox_currentIndexChanged?4(int) +qgis.gui.QgsFontMarkerSymbolLayerV2Widget.on_mSizeUnitWidget_changed?4() +qgis.gui.QgsFontMarkerSymbolLayerV2Widget.on_mOffsetUnitWidget_changed?4() qgis.gui.QgsCentroidFillSymbolLayerV2Widget?1(QgsVectorLayer, QWidget parent=None) qgis.gui.QgsCentroidFillSymbolLayerV2Widget.__init__?1(self, QgsVectorLayer, QWidget parent=None) qgis.gui.QgsCentroidFillSymbolLayerV2Widget.create?4(QgsVectorLayer) -> QgsSymbolLayerV2Widget @@ -8245,7 +8245,7 @@ qgis.gui.QgsSymbolsListWidget.setMarkerAngle?4(float) qgis.gui.QgsSymbolsListWidget.setMarkerSize?4(float) qgis.gui.QgsSymbolsListWidget.setLineWidth?4(float) qgis.gui.QgsSymbolsListWidget.addSymbolToStyle?4() -qgis.gui.QgsSymbolsListWidget.on_mSymbolUnitComboBox_currentIndexChanged?4(QString) +qgis.gui.QgsSymbolsListWidget.on_mSymbolUnitWidget_changed?4() qgis.gui.QgsSymbolsListWidget.on_mTransparencySlider_valueChanged?4(int) qgis.gui.QgsSymbolsListWidget.on_groupsCombo_currentIndexChanged?4(int) qgis.gui.QgsSymbolsListWidget.on_groupsCombo_editTextChanged?4(QString) @@ -8693,3 +8693,4 @@ qgis.networkanalysis.QgsGraphAnalyzer?1(QgsGraphAnalyzer) qgis.networkanalysis.QgsGraphAnalyzer.__init__?1(self, QgsGraphAnalyzer) qgis.networkanalysis.QgsGraphAnalyzer.dijkstra?4(QgsGraph, int, int) -> list qgis.networkanalysis.QgsGraphAnalyzer.shortestTree?4(QgsGraph, int, int) -> QgsGraph + diff --git a/src/app/qgslabelinggui.cpp b/src/app/qgslabelinggui.cpp index ba52dcba91c0..6ad252567b92 100644 --- a/src/app/qgslabelinggui.cpp +++ b/src/app/qgslabelinggui.cpp @@ -52,6 +52,17 @@ QgsLabelingGui::QgsLabelingGui( QgsVectorLayer* layer, QgsMapCanvas* mapCanvas, return; setupUi( this ); + mFontSizeUnitWidget->setUnits( QStringList() << tr( "points" ) << tr( "map units" ), 1 ); + mBufferUnitWidget->setUnits( QStringList() << tr( "mm" ) << tr( "map units" ), 1 ); + mShapeSizeUnitWidget->setUnits( QStringList() << tr( "mm" ) << tr( "map units" ), 1 ); + mShapeOffsetUnitWidget->setUnits( QStringList() << tr( "mm" ) << tr( "map units" ), 1 ); + mShapeRadiusUnitWidget->setUnits( QStringList() << tr( "mm" ) << tr( "map units" ) << tr( "% of length" ), 1 ); + mShapeBorderWidthUnitWidget->setUnits( QStringList() << tr( "mm" ) << tr( "map units" ), 1 ); + mShadowOffsetUnitWidget->setUnits( QStringList() << tr( "mm" ) << tr( "map units" ), 1 ); + mShadowRadiusUnitWidget->setUnits( QStringList() << tr( "mm" ) << tr( "map units" ), 1 ); + mPointOffsetUnitWidget->setUnits( QStringList() << tr( "mm" ) << tr( "map units" ), 1 ); + mLineDistanceUnitWidget->setUnits( QStringList() << tr( "mm" ) << tr( "map units" ), 1 ); + mCharDlg = new QgsCharacterSelectorDialog( this ); mRefFont = lblFontPreview->font(); @@ -246,8 +257,6 @@ void QgsLabelingGui::init() mFieldExpressionWidget->setField( lyr.fieldName ); // populate placement options - int distUnitIndex = lyr.distInMapUnits ? 1 : 0; - mCentroidRadioWhole->setChecked( lyr.centroidWhole ); switch ( lyr.placement ) { @@ -256,7 +265,8 @@ void QgsLabelingGui::init() radAroundCentroid->setChecked( true ); mLineDistanceSpnBx->setValue( lyr.dist ); - mLineDistanceUnitComboBox->setCurrentIndex( distUnitIndex ); + mLineDistanceUnitWidget->setUnit( lyr.distInMapUnits ? 1 : 0 ); + mLineDistanceUnitWidget->setMapUnitScale( lyr.distMapUnitScale ); //spinAngle->setValue( lyr.angle ); // TODO: uncomment when supported break; case QgsPalLayerSettings::OverPoint: @@ -266,7 +276,8 @@ void QgsLabelingGui::init() mQuadrantBtnGrp->button(( int )lyr.quadOffset )->setChecked( true ); mPointOffsetXSpinBox->setValue( lyr.xOffset ); mPointOffsetYSpinBox->setValue( lyr.yOffset ); - mPointOffsetUnitsComboBox->setCurrentIndex( lyr.labelOffsetInMapUnits ? 1 : 0 ); + mPointOffsetUnitWidget->setUnit( lyr.labelOffsetInMapUnits ? 1 : 0 ); + mPointOffsetUnitWidget->setMapUnitScale( lyr.labelOffsetMapUnitScale ); mPointAngleSpinBox->setValue( lyr.angleOffset ); break; case QgsPalLayerSettings::Line: @@ -288,7 +299,8 @@ void QgsLabelingGui::init() if ( lyr.placement == QgsPalLayerSettings::Line || lyr.placement == QgsPalLayerSettings::Curved ) { mLineDistanceSpnBx->setValue( lyr.dist ); - mLineDistanceUnitComboBox->setCurrentIndex( distUnitIndex ); + mLineDistanceUnitWidget->setUnit( lyr.distInMapUnits ? 1 : 0 ); + mLineDistanceUnitWidget->setMapUnitScale( lyr.distMapUnitScale ); chkLineAbove->setChecked( lyr.placementFlags & QgsPalLayerSettings::AboveLine ); chkLineBelow->setChecked( lyr.placementFlags & QgsPalLayerSettings::BelowLine ); chkLineOn->setChecked( lyr.placementFlags & QgsPalLayerSettings::OnLine ); @@ -334,7 +346,8 @@ void QgsLabelingGui::init() // buffer mBufferDrawChkBx->setChecked( lyr.bufferDraw ); spinBufferSize->setValue( lyr.bufferSize ); - mBufferUnitComboBox->setCurrentIndex( lyr.bufferSizeInMapUnits ? 1 : 0 ); + mBufferUnitWidget->setUnit( lyr.bufferSizeInMapUnits ? 1 : 0 ); + mBufferUnitWidget->setMapUnitScale( lyr.bufferSizeMapUnitScale ); btnBufferColor->setColor( lyr.bufferColor ); mBufferTranspSpinBox->setValue( lyr.bufferTransp ); mBufferJoinStyleComboBox->setPenJoinStyle( lyr.bufferJoinStyle ); @@ -351,7 +364,8 @@ void QgsLabelingGui::init() mMinPixelLimit = lyr.fontMinPixelSize; // ignored after first settings save mFontMinPixelSpinBox->setValue( lyr.fontMinPixelSize == 0 ? 3 : lyr.fontMinPixelSize ); mFontMaxPixelSpinBox->setValue( lyr.fontMaxPixelSize ); - mFontSizeUnitComboBox->setCurrentIndex( lyr.fontSizeInMapUnits ? 1 : 0 ); + mFontSizeUnitWidget->setUnit( lyr.fontSizeInMapUnits ? 1 : 0 ); + mFontSizeUnitWidget->setMapUnitScale( lyr.fontSizeMapUnitScale ); mRefFont = lyr.textFont; mFontSizeSpinBox->setValue( lyr.textFont.pointSizeF() ); @@ -391,22 +405,26 @@ void QgsLabelingGui::init() mShapeSizeCmbBx->setCurrentIndex( lyr.shapeSizeType ); mShapeSizeXSpnBx->setValue( lyr.shapeSize.x() ); mShapeSizeYSpnBx->setValue( lyr.shapeSize.y() ); - mShapeSizeUnitsCmbBx->setCurrentIndex( lyr.shapeSizeUnits - 1 ); + mShapeSizeUnitWidget->setUnit( lyr.shapeSizeUnits - 1 ); + mShapeSizeUnitWidget->setMapUnitScale( lyr.shapeSizeMapUnitScale ); mShapeRotationCmbBx->setCurrentIndex( lyr.shapeRotationType ); mShapeRotationDblSpnBx->setEnabled( lyr.shapeRotationType != QgsPalLayerSettings::RotationSync ); mShapeRotationDDBtn->setEnabled( lyr.shapeRotationType != QgsPalLayerSettings::RotationSync ); mShapeRotationDblSpnBx->setValue( lyr.shapeRotation ); mShapeOffsetXSpnBx->setValue( lyr.shapeOffset.x() ); mShapeOffsetYSpnBx->setValue( lyr.shapeOffset.y() ); - mShapeOffsetUnitsCmbBx->setCurrentIndex( lyr.shapeOffsetUnits - 1 ); + mShapeOffsetUnitWidget->setUnit( lyr.shapeOffsetUnits - 1 ); + mShapeOffsetUnitWidget->setMapUnitScale( lyr.shapeOffsetMapUnitScale ); mShapeRadiusXDbSpnBx->setValue( lyr.shapeRadii.x() ); mShapeRadiusYDbSpnBx->setValue( lyr.shapeRadii.y() ); - mShapeRadiusUnitsCmbBx->setCurrentIndex( lyr.shapeRadiiUnits - 1 ); + mShapeRadiusUnitWidget->setUnit( lyr.shapeRadiiUnits - 1 ); + mShapeRadiusUnitWidget->setMapUnitScale( lyr.shapeRadiiMapUnitScale ); mShapeFillColorBtn->setColor( lyr.shapeFillColor ); mShapeBorderColorBtn->setColor( lyr.shapeBorderColor ); mShapeBorderWidthSpnBx->setValue( lyr.shapeBorderWidth ); - mShapeBorderWidthUnitsCmbBx->setCurrentIndex( lyr.shapeBorderWidthUnits - 1 ); + mShapeBorderWidthUnitWidget->setUnit( lyr.shapeBorderWidthUnits - 1 ); + mShapeBorderWidthUnitWidget->setMapUnitScale( lyr.shapeBorderWidthMapUnitScale ); mShapePenStyleCmbBx->setPenJoinStyle( lyr.shapeJoinStyle ); mShapeTranspSpinBox->setValue( lyr.shapeTransparency ); @@ -420,11 +438,13 @@ void QgsLabelingGui::init() mShadowUnderCmbBx->setCurrentIndex( lyr.shadowUnder ); mShadowOffsetAngleSpnBx->setValue( lyr.shadowOffsetAngle ); mShadowOffsetSpnBx->setValue( lyr.shadowOffsetDist ); - mShadowOffsetUnitsCmbBx->setCurrentIndex( lyr.shadowOffsetUnits - 1 ); + mShadowOffsetUnitWidget->setUnit( lyr.shadowOffsetUnits - 1 ); + mShadowOffsetUnitWidget->setMapUnitScale( lyr.shadowOffsetMapUnitScale ); mShadowOffsetGlobalChkBx->setChecked( lyr.shadowOffsetGlobal ); mShadowRadiusDblSpnBx->setValue( lyr.shadowRadius ); - mShadowRadiusUnitsCmbBx->setCurrentIndex( lyr.shadowRadiusUnits - 1 ); + mShadowRadiusUnitWidget->setUnit( lyr.shadowRadiusUnits - 1 ); + mShadowRadiusUnitWidget->setMapUnitScale( lyr.shadowRadiusMapUnitScale ); mShadowRadiusAlphaChkBx->setChecked( lyr.shadowRadiusAlphaOnly ); mShadowTranspSpnBx->setValue( lyr.shadowTransparency ); mShadowScaleSpnBx->setValue( lyr.shadowScale ); @@ -524,7 +544,8 @@ QgsPalLayerSettings QgsLabelingGui::layerSettings() { lyr.placement = QgsPalLayerSettings::AroundPoint; lyr.dist = mLineDistanceSpnBx->value(); - lyr.distInMapUnits = ( mLineDistanceUnitComboBox->currentIndex() == 1 ); + lyr.distInMapUnits = ( mLineDistanceUnitWidget->getUnit() == 1 ); + lyr.distMapUnitScale = mLineDistanceUnitWidget->getMapUnitScale(); } else if (( curPlacementWdgt == pagePoint && radOverPoint->isChecked() ) || ( curPlacementWdgt == pagePolygon && radOverCentroid->isChecked() ) ) @@ -533,7 +554,8 @@ QgsPalLayerSettings QgsLabelingGui::layerSettings() lyr.quadOffset = ( QgsPalLayerSettings::QuadrantPosition )mQuadrantBtnGrp->checkedId(); lyr.xOffset = mPointOffsetXSpinBox->value(); lyr.yOffset = mPointOffsetYSpinBox->value(); - lyr.labelOffsetInMapUnits = ( mPointOffsetUnitsComboBox->currentIndex() == 1 ); + lyr.labelOffsetInMapUnits = ( mPointOffsetUnitWidget->getUnit() == 1 ); + lyr.labelOffsetMapUnitScale = mPointOffsetUnitWidget->getMapUnitScale(); lyr.angleOffset = mPointAngleSpinBox->value(); } else if (( curPlacementWdgt == pageLine && radLineParallel->isChecked() ) @@ -543,7 +565,8 @@ QgsPalLayerSettings QgsLabelingGui::layerSettings() bool curved = ( curPlacementWdgt == pageLine && radLineCurved->isChecked() ); lyr.placement = ( curved ? QgsPalLayerSettings::Curved : QgsPalLayerSettings::Line ); lyr.dist = mLineDistanceSpnBx->value(); - lyr.distInMapUnits = ( mLineDistanceUnitComboBox->currentIndex() == 1 ); + lyr.distInMapUnits = ( mLineDistanceUnitWidget->getUnit() == 1 ); + lyr.distMapUnitScale = mLineDistanceUnitWidget->getMapUnitScale(); if ( chkLineAbove->isChecked() ) lyr.placementFlags |= QgsPalLayerSettings::AboveLine; if ( chkLineBelow->isChecked() ) @@ -591,7 +614,8 @@ QgsPalLayerSettings QgsLabelingGui::layerSettings() lyr.bufferSize = spinBufferSize->value(); lyr.bufferColor = btnBufferColor->color(); lyr.bufferTransp = mBufferTranspSpinBox->value(); - lyr.bufferSizeInMapUnits = ( mBufferUnitComboBox->currentIndex() == 1 ); + lyr.bufferSizeInMapUnits = ( mBufferUnitWidget->getUnit() == 1 ); + lyr.bufferSizeMapUnitScale = mBufferUnitWidget->getMapUnitScale(); lyr.bufferJoinStyle = mBufferJoinStyleComboBox->penJoinStyle(); lyr.bufferNoFill = !mBufferTranspFillChbx->isChecked(); lyr.bufferBlendMode = comboBufferBlendMode->blendMode(); @@ -603,18 +627,22 @@ QgsPalLayerSettings QgsLabelingGui::layerSettings() lyr.shapeSizeType = ( QgsPalLayerSettings::SizeType )mShapeSizeCmbBx->currentIndex(); lyr.shapeSize = QPointF( mShapeSizeXSpnBx->value(), mShapeSizeYSpnBx->value() ); - lyr.shapeSizeUnits = ( QgsPalLayerSettings::SizeUnit )( mShapeSizeUnitsCmbBx->currentIndex() + 1 ); + lyr.shapeSizeUnits = ( QgsPalLayerSettings::SizeUnit )( mShapeSizeUnitWidget->getUnit() + 1 ); + lyr.shapeSizeMapUnitScale = mShapeSizeUnitWidget->getMapUnitScale(); lyr.shapeRotationType = ( QgsPalLayerSettings::RotationType )( mShapeRotationCmbBx->currentIndex() ); lyr.shapeRotation = mShapeRotationDblSpnBx->value(); lyr.shapeOffset = QPointF( mShapeOffsetXSpnBx->value(), mShapeOffsetYSpnBx->value() ); - lyr.shapeOffsetUnits = ( QgsPalLayerSettings::SizeUnit )( mShapeOffsetUnitsCmbBx->currentIndex() + 1 ); + lyr.shapeOffsetUnits = ( QgsPalLayerSettings::SizeUnit )( mShapeOffsetUnitWidget->getUnit() + 1 ); + lyr.shapeOffsetMapUnitScale = mShapeOffsetUnitWidget->getMapUnitScale(); lyr.shapeRadii = QPointF( mShapeRadiusXDbSpnBx->value(), mShapeRadiusYDbSpnBx->value() ); - lyr.shapeRadiiUnits = ( QgsPalLayerSettings::SizeUnit )( mShapeRadiusUnitsCmbBx->currentIndex() + 1 ); + lyr.shapeRadiiUnits = ( QgsPalLayerSettings::SizeUnit )( mShapeRadiusUnitWidget->getUnit() + 1 ); + lyr.shapeRadiiMapUnitScale = mShapeRadiusUnitWidget->getMapUnitScale(); lyr.shapeFillColor = mShapeFillColorBtn->color(); lyr.shapeBorderColor = mShapeBorderColorBtn->color(); lyr.shapeBorderWidth = mShapeBorderWidthSpnBx->value(); - lyr.shapeBorderWidthUnits = ( QgsPalLayerSettings::SizeUnit )( mShapeBorderWidthUnitsCmbBx->currentIndex() + 1 ); + lyr.shapeBorderWidthUnits = ( QgsPalLayerSettings::SizeUnit )( mShapeBorderWidthUnitWidget->getUnit() + 1 ); + lyr.shapeBorderWidthMapUnitScale = mShapeBorderWidthUnitWidget->getMapUnitScale(); lyr.shapeJoinStyle = mShapePenStyleCmbBx->penJoinStyle(); lyr.shapeTransparency = mShapeTranspSpinBox->value(); lyr.shapeBlendMode = mShapeBlendCmbBx->blendMode(); @@ -624,10 +652,12 @@ QgsPalLayerSettings QgsLabelingGui::layerSettings() lyr.shadowUnder = ( QgsPalLayerSettings::ShadowType )mShadowUnderCmbBx->currentIndex(); lyr.shadowOffsetAngle = mShadowOffsetAngleSpnBx->value(); lyr.shadowOffsetDist = mShadowOffsetSpnBx->value(); - lyr.shadowOffsetUnits = ( QgsPalLayerSettings::SizeUnit )( mShadowOffsetUnitsCmbBx->currentIndex() + 1 ); + lyr.shadowOffsetUnits = ( QgsPalLayerSettings::SizeUnit )( mShadowOffsetUnitWidget->getUnit() + 1 ); + lyr.shadowOffsetMapUnitScale = mShadowOffsetUnitWidget->getMapUnitScale(); lyr.shadowOffsetGlobal = mShadowOffsetGlobalChkBx->isChecked(); lyr.shadowRadius = mShadowRadiusDblSpnBx->value(); - lyr.shadowRadiusUnits = ( QgsPalLayerSettings::SizeUnit )( mShadowRadiusUnitsCmbBx->currentIndex() + 1 ); + lyr.shadowRadiusUnits = ( QgsPalLayerSettings::SizeUnit )( mShadowRadiusUnitWidget->getUnit() + 1 ); + lyr.shadowRadiusMapUnitScale = mShadowRadiusUnitWidget->getMapUnitScale(); lyr.shadowRadiusAlphaOnly = mShadowRadiusAlphaChkBx->isChecked(); lyr.shadowTransparency = mShadowTranspSpnBx->value(); lyr.shadowScale = mShadowScaleSpnBx->value(); @@ -655,7 +685,8 @@ QgsPalLayerSettings QgsLabelingGui::layerSettings() lyr.minFeatureSize = mMinSizeSpinBox->value(); lyr.limitNumLabels = mLimitLabelChkBox->isChecked(); lyr.maxNumLabels = mLimitLabelSpinBox->value(); - lyr.fontSizeInMapUnits = ( mFontSizeUnitComboBox->currentIndex() == 1 ); + lyr.fontSizeInMapUnits = ( mFontSizeUnitWidget->getUnit() == 1 ); + lyr.fontSizeMapUnitScale = mFontSizeUnitWidget->getMapUnitScale(); lyr.fontLimitPixelSize = mFontLimitPixelChkBox->isChecked(); lyr.fontMinPixelSize = mFontMinPixelSpinBox->value(); lyr.fontMaxPixelSize = mFontMaxPixelSpinBox->value(); @@ -1083,7 +1114,7 @@ void QgsLabelingGui::updatePreview() QString grpboxtitle; QString sampleTxt = tr( "Text/Buffer sample" ); - if ( mFontSizeUnitComboBox->currentIndex() == 1 ) // map units + if ( mFontSizeUnitWidget->getUnit() == 1 ) // map units { // TODO: maybe match current map zoom level instead? previewFont.setPointSize( mPreviewSize ); @@ -1095,7 +1126,7 @@ void QgsLabelingGui::updatePreview() if ( mBufferDrawChkBx->isChecked() ) { - if ( mBufferUnitComboBox->currentIndex() == 1 ) // map units + if ( mBufferUnitWidget->getUnit() == 1 ) // map units { bufferSize = previewRatio * spinBufferSize->value() / 3.527; } @@ -1115,7 +1146,7 @@ void QgsLabelingGui::updatePreview() if ( mBufferDrawChkBx->isChecked() ) { - if ( mBufferUnitComboBox->currentIndex() == 0 ) // millimeters + if ( mBufferUnitWidget->getUnit() == 0 ) // millimeters { bufferSize = spinBufferSize->value(); } @@ -1336,8 +1367,9 @@ void QgsLabelingGui::on_mFontLetterSpacingSpinBox_valueChanged( double spacing ) updateFont( mRefFont ); } -void QgsLabelingGui::on_mFontSizeUnitComboBox_currentIndexChanged( int index ) +void QgsLabelingGui::on_mFontSizeUnitWidget_changed() { + int index = mFontSizeUnitWidget->getUnit(); // disable pixel size limiting for labels defined in points if ( index == 0 ) { @@ -1371,9 +1403,8 @@ void QgsLabelingGui::on_mFontMaxPixelSpinBox_valueChanged( int px ) mFontMaxPixelSpinBox->setMinimum( mFontMinPixelSpinBox->value() ); } -void QgsLabelingGui::on_mBufferUnitComboBox_currentIndexChanged( int index ) +void QgsLabelingGui::on_mBufferUnitWidget_changed() { - Q_UNUSED( index ); updateFont( mRefFont ); } @@ -1444,7 +1475,7 @@ void QgsLabelingGui::on_mShapeTypeCmbBx_currentIndexChanged( int index ) } // TODO: fix overriding SVG symbol's border width units in QgsSvgCache // currently broken, fall back to symbol units only - mShapeBorderWidthUnitsCmbBx->setVisible( !isSVG ); + mShapeBorderWidthUnitWidget->setVisible( !isSVG ); mShapeSVGUnitsLabel->setVisible( isSVG ); mShapeBorderUnitsDDBtn->setEnabled( !isSVG ); } @@ -1498,7 +1529,7 @@ void QgsLabelingGui::updateSvgWidgets( const QString& svgPath ) // TODO: fix overriding SVG symbol's border width units in QgsSvgCache // currently broken, fall back to symbol's - //mShapeBorderWidthUnitsCmbBx->setEnabled( validSVG && outlineWidthParam ); + //mShapeBorderWidthUnitWidget->setEnabled( validSVG && outlineWidthParam ); //mShapeBorderUnitsDDBtn->setEnabled( validSVG && outlineWidthParam ); mShapeSVGUnitsLabel->setEnabled( validSVG && outlineWidthParam ); } @@ -1580,7 +1611,7 @@ void QgsLabelingGui::showBackgroundRadius( bool show ) mShapeRadiusYDbSpnBx->setVisible( show ); - mShapeRadiusUnitsCmbBx->setVisible( show ); + mShapeRadiusUnitWidget->setVisible( show ); mShapeRadiusDDBtn->setVisible( show ); mShapeRadiusUnitsDDBtn->setVisible( show ); @@ -1598,3 +1629,5 @@ void QgsLabelingGui::enableDataDefinedAlignment( bool enable ) { mCoordAlignmentFrame->setEnabled( enable ); } + + diff --git a/src/app/qgslabelinggui.h b/src/app/qgslabelinggui.h index 14d5767bb794..09a7c9c4971f 100644 --- a/src/app/qgslabelinggui.h +++ b/src/app/qgslabelinggui.h @@ -62,10 +62,10 @@ class APP_EXPORT QgsLabelingGui : public QWidget, private Ui::QgsLabelingGuiBase void on_mFontStrikethroughBtn_toggled( bool ckd ); void on_mFontWordSpacingSpinBox_valueChanged( double spacing ); void on_mFontLetterSpacingSpinBox_valueChanged( double spacing ); - void on_mFontSizeUnitComboBox_currentIndexChanged( int index ); + void on_mFontSizeUnitWidget_changed(); void on_mFontMinPixelSpinBox_valueChanged( int px ); void on_mFontMaxPixelSpinBox_valueChanged( int px ); - void on_mBufferUnitComboBox_currentIndexChanged( int index ); + void on_mBufferUnitWidget_changed(); void on_mCoordXDDBtn_dataDefinedActivated( bool active ); void on_mCoordYDDBtn_dataDefinedActivated( bool active ); @@ -126,3 +126,5 @@ class APP_EXPORT QgsLabelingGui : public QWidget, private Ui::QgsLabelingGuiBase }; #endif + + diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 4ffb2b098b18..0229bff23a38 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -437,6 +437,7 @@ SET(QGIS_CORE_HDRS qgsmaprenderer.h qgsmapsettings.h qgsmaptopixel.h + qgsmapunitscale.h qgsmessageoutput.h qgsmimedatautils.h qgsnetworkreplyparser.h diff --git a/src/core/qgsmapunitscale.h b/src/core/qgsmapunitscale.h new file mode 100644 index 000000000000..e5ecf51db69d --- /dev/null +++ b/src/core/qgsmapunitscale.h @@ -0,0 +1,65 @@ +/*************************************************************************** + qgsmapunitscale.h + Struct for storing maximum and minimum scales for measurements in map units + ------------------- + begin : April 2014 + copyright : (C) Sandro Mani + email : smani at sourcepole dot ch + + *************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef QGSMAPUNITSCALE_H +#define QGSMAPUNITSCALE_H + +#include +#include "qgsrendercontext.h" + +class QgsMapUnitScale +{ + public: + QgsMapUnitScale() : minScale( 0.0 ), maxScale( 0.0 ) {} + QgsMapUnitScale( float _minScale, float _maxScale ) : minScale( _minScale ), maxScale( _maxScale ) {} + + /** The minimum scale, or 0.0 if unset */ + double minScale; + /** The maximum scale, or 0.0 if unset */ + double maxScale; + + double computeMapUnitsPerPixel( const QgsRenderContext& c ) const + { + double mup = c.mapToPixel().mapUnitsPerPixel(); + double renderScale = c.rendererScale(); // Note: this value is 1 / scale + if ( minScale != 0 ) + { + mup = qMin( mup / ( minScale * renderScale ), mup ); + } + if ( maxScale != 0 ) + { + mup = qMax( mup / ( maxScale * renderScale ), mup ); + } + return mup; + } + + bool operator==( const QgsMapUnitScale& other ) const + { + return minScale == other.minScale && maxScale == other.maxScale; + } + + bool operator!=( const QgsMapUnitScale& other ) const + { + return minScale != other.minScale || maxScale != other.maxScale; + } +}; + + +#endif // QGSMAPUNITSCALE_H + + + diff --git a/src/core/qgspallabeling.cpp b/src/core/qgspallabeling.cpp index b9ddee1a384e..8bdedf88a6d9 100644 --- a/src/core/qgspallabeling.cpp +++ b/src/core/qgspallabeling.cpp @@ -2,9 +2,9 @@ qgspallabeling.cpp Smart labeling for vector layers ------------------- - begin : June 2009 - copyright : (C) Martin Dobias - email : wonder dot sk at gmail dot com + begin : June 2009 + copyright : (C) Martin Dobias + email : wonder dot sk at gmail dot com *************************************************************************** * * @@ -463,6 +463,7 @@ QgsPalLayerSettings::QgsPalLayerSettings( const QgsPalLayerSettings& s ) textFont = s.textFont; textNamedStyle = s.textNamedStyle; fontSizeInMapUnits = s.fontSizeInMapUnits; + fontSizeMapUnitScale = s.fontSizeMapUnitScale; textColor = s.textColor; textTransp = s.textTransp; blendMode = s.blendMode; @@ -488,6 +489,7 @@ QgsPalLayerSettings::QgsPalLayerSettings( const QgsPalLayerSettings& s ) bufferDraw = s.bufferDraw; bufferSize = s.bufferSize; bufferSizeInMapUnits = s.bufferSizeInMapUnits; + bufferSizeMapUnitScale = s.bufferSizeMapUnitScale; bufferColor = s.bufferColor; bufferTransp = s.bufferTransp; bufferNoFill = s.bufferNoFill; @@ -502,8 +504,10 @@ QgsPalLayerSettings::QgsPalLayerSettings( const QgsPalLayerSettings& s ) xOffset = s.xOffset; yOffset = s.yOffset; labelOffsetInMapUnits = s.labelOffsetInMapUnits; + labelOffsetMapUnitScale = s.labelOffsetMapUnitScale; dist = s.dist; distInMapUnits = s.distInMapUnits; + distMapUnitScale = s.distMapUnitScale; angleOffset = s.angleOffset; preserveRotation = s.preserveRotation; maxCurvedCharAngleIn = s.maxCurvedCharAngleIn; @@ -534,16 +538,20 @@ QgsPalLayerSettings::QgsPalLayerSettings( const QgsPalLayerSettings& s ) shapeSizeType = s.shapeSizeType; shapeSize = s.shapeSize; shapeSizeUnits = s.shapeSizeUnits; + shapeSizeMapUnitScale = s.shapeSizeMapUnitScale; shapeRotationType = s.shapeRotationType; shapeRotation = s.shapeRotation; shapeOffset = s.shapeOffset; shapeOffsetUnits = s.shapeOffsetUnits; + shapeOffsetMapUnitScale = s.shapeOffsetMapUnitScale; shapeRadii = s.shapeRadii; shapeRadiiUnits = s.shapeRadiiUnits; + shapeRadiiMapUnitScale = s.shapeRadiiMapUnitScale; shapeFillColor = s.shapeFillColor; shapeBorderColor = s.shapeBorderColor; shapeBorderWidth = s.shapeBorderWidth; shapeBorderWidthUnits = s.shapeBorderWidthUnits; + shapeBorderWidthMapUnitScale = s.shapeBorderWidthMapUnitScale; shapeJoinStyle = s.shapeJoinStyle; shapeTransparency = s.shapeTransparency; shapeBlendMode = s.shapeBlendMode; @@ -554,9 +562,11 @@ QgsPalLayerSettings::QgsPalLayerSettings( const QgsPalLayerSettings& s ) shadowOffsetAngle = s.shadowOffsetAngle; shadowOffsetDist = s.shadowOffsetDist; shadowOffsetUnits = s.shadowOffsetUnits; + shadowOffsetMapUnitScale = s.shadowOffsetMapUnitScale; shadowOffsetGlobal = s.shadowOffsetGlobal; shadowRadius = s.shadowRadius; shadowRadiusUnits = s.shadowRadiusUnits; + shadowRadiusMapUnitScale = s.shadowRadiusMapUnitScale; shadowRadiusAlphaOnly = s.shadowRadiusAlphaOnly; shadowTransparency = s.shadowTransparency; shadowScale = s.shadowScale; @@ -861,6 +871,8 @@ void QgsPalLayerSettings::readFromLayer( QgsVectorLayer* layer ) double fontSize = layer->customProperty( "labeling/fontSize" ).toDouble(); fontSizeInMapUnits = layer->customProperty( "labeling/fontSizeInMapUnits" ).toBool(); + fontSizeMapUnitScale.minScale = layer->customProperty( "labeling/fontSizeMapUnitMinScale", 0.0 ).toDouble(); + fontSizeMapUnitScale.maxScale = layer->customProperty( "labeling/fontSizeMapUnitMaxScale", 0.0 ).toDouble(); int fontWeight = layer->customProperty( "labeling/fontWeight" ).toInt(); bool fontItalic = layer->customProperty( "labeling/fontItalic" ).toBool(); textFont = QFont( fontFamily, fontSize, fontWeight, fontItalic ); @@ -914,6 +926,8 @@ void QgsPalLayerSettings::readFromLayer( QgsVectorLayer* layer ) } bufferSizeInMapUnits = layer->customProperty( "labeling/bufferSizeInMapUnits" ).toBool(); + bufferSizeMapUnitScale.minScale = layer->customProperty( "labeling/bufferSizeMapUnitMinScale", 0.0 ).toDouble(); + bufferSizeMapUnitScale.maxScale = layer->customProperty( "labeling/bufferSizeMapUnitMaxScale", 0.0 ).toDouble(); bufferColor = _readColor( layer, "labeling/bufferColor", Qt::white, false ); bufferTransp = layer->customProperty( "labeling/bufferTransp" ).toInt(); bufferBlendMode = QgsMapRenderer::getCompositionMode( @@ -929,18 +943,26 @@ void QgsPalLayerSettings::readFromLayer( QgsVectorLayer* layer ) shapeSize = QPointF( layer->customProperty( "labeling/shapeSizeX", QVariant( 0.0 ) ).toDouble(), layer->customProperty( "labeling/shapeSizeY", QVariant( 0.0 ) ).toDouble() ); shapeSizeUnits = ( SizeUnit )layer->customProperty( "labeling/shapeSizeUnits", QVariant( MM ) ).toUInt(); + shapeSizeMapUnitScale.minScale = layer->customProperty( "labeling/shapeSizeMapUnitMinScale", 0.0 ).toDouble(); + shapeSizeMapUnitScale.maxScale = layer->customProperty( "labeling/shapeSizeMapUnitMaxScale", 0.0 ).toDouble(); shapeRotationType = ( RotationType )layer->customProperty( "labeling/shapeRotationType", QVariant( RotationSync ) ).toUInt(); shapeRotation = layer->customProperty( "labeling/shapeRotation", QVariant( 0.0 ) ).toDouble(); shapeOffset = QPointF( layer->customProperty( "labeling/shapeOffsetX", QVariant( 0.0 ) ).toDouble(), layer->customProperty( "labeling/shapeOffsetY", QVariant( 0.0 ) ).toDouble() ); shapeOffsetUnits = ( SizeUnit )layer->customProperty( "labeling/shapeOffsetUnits", QVariant( MM ) ).toUInt(); + shapeOffsetMapUnitScale.minScale = layer->customProperty( "labeling/shapeOffsetMapUnitMinScale", 0.0 ).toDouble(); + shapeOffsetMapUnitScale.maxScale = layer->customProperty( "labeling/shapeOffsetMapUnitMaxScale", 0.0 ).toDouble(); shapeRadii = QPointF( layer->customProperty( "labeling/shapeRadiiX", QVariant( 0.0 ) ).toDouble(), layer->customProperty( "labeling/shapeRadiiY", QVariant( 0.0 ) ).toDouble() ); shapeRadiiUnits = ( SizeUnit )layer->customProperty( "labeling/shapeRadiiUnits", QVariant( MM ) ).toUInt(); + shapeRadiiMapUnitScale.minScale = layer->customProperty( "labeling/shapeRaddiMapUnitMinScale", 0.0 ).toDouble(); + shapeRadiiMapUnitScale.maxScale = layer->customProperty( "labeling/shapeRaddiMapUnitMaxScale", 0.0 ).toDouble(); shapeFillColor = _readColor( layer, "labeling/shapeFillColor", Qt::white, true ); shapeBorderColor = _readColor( layer, "labeling/shapeBorderColor", Qt::darkGray, true ); shapeBorderWidth = layer->customProperty( "labeling/shapeBorderWidth", QVariant( .0 ) ).toDouble(); shapeBorderWidthUnits = ( SizeUnit )layer->customProperty( "labeling/shapeBorderWidthUnits", QVariant( MM ) ).toUInt(); + shapeBorderWidthMapUnitScale.minScale = layer->customProperty( "labeling/shapeBorderWidthMapUnitMinScale", 0.0 ).toDouble(); + shapeBorderWidthMapUnitScale.maxScale = layer->customProperty( "labeling/shapeBorderWidthMapUnitMaxScale", 0.0 ).toDouble(); shapeJoinStyle = ( Qt::PenJoinStyle )layer->customProperty( "labeling/shapeJoinStyle", QVariant( Qt::BevelJoin ) ).toUInt(); shapeTransparency = layer->customProperty( "labeling/shapeTransparency", QVariant( 0 ) ).toInt(); shapeBlendMode = QgsMapRenderer::getCompositionMode( @@ -952,9 +974,13 @@ void QgsPalLayerSettings::readFromLayer( QgsVectorLayer* layer ) shadowOffsetAngle = layer->customProperty( "labeling/shadowOffsetAngle", QVariant( 135 ) ).toInt(); shadowOffsetDist = layer->customProperty( "labeling/shadowOffsetDist", QVariant( 1.0 ) ).toDouble(); shadowOffsetUnits = ( SizeUnit )layer->customProperty( "labeling/shadowOffsetUnits", QVariant( MM ) ).toUInt(); + shadowOffsetMapUnitScale.minScale = layer->customProperty( "labeling/shadowOffsetMapUnitMinScale", 0.0 ).toDouble(); + shadowOffsetMapUnitScale.maxScale = layer->customProperty( "labeling/shadowOffsetMapUnitMaxScale", 0.0 ).toDouble(); shadowOffsetGlobal = layer->customProperty( "labeling/shadowOffsetGlobal", QVariant( true ) ).toBool(); shadowRadius = layer->customProperty( "labeling/shadowRadius", QVariant( 1.5 ) ).toDouble(); shadowRadiusUnits = ( SizeUnit )layer->customProperty( "labeling/shadowRadiusUnits", QVariant( MM ) ).toUInt(); + shadowRadiusMapUnitScale.minScale = layer->customProperty( "labeling/shadowRadiusMapUnitMinScale", 0.0 ).toDouble(); + shadowRadiusMapUnitScale.maxScale = layer->customProperty( "labeling/shadowRadiusMapUnitMaxScale", 0.0 ).toDouble(); shadowRadiusAlphaOnly = layer->customProperty( "labeling/shadowRadiusAlphaOnly", QVariant( false ) ).toBool(); shadowTransparency = layer->customProperty( "labeling/shadowTransparency", QVariant( 30 ) ).toInt(); shadowScale = layer->customProperty( "labeling/shadowScale", QVariant( 100 ) ).toInt(); @@ -968,10 +994,14 @@ void QgsPalLayerSettings::readFromLayer( QgsVectorLayer* layer ) centroidWhole = layer->customProperty( "labeling/centroidWhole", QVariant( false ) ).toBool(); dist = layer->customProperty( "labeling/dist" ).toDouble(); distInMapUnits = layer->customProperty( "labeling/distInMapUnits" ).toBool(); + distMapUnitScale.minScale = layer->customProperty( "labeling/distMapUnitMinScale", 0.0 ).toDouble(); + distMapUnitScale.maxScale = layer->customProperty( "labeling/distMapUnitMaxScale", 0.0 ).toDouble(); quadOffset = ( QuadrantPosition )layer->customProperty( "labeling/quadOffset", QVariant( QuadrantOver ) ).toUInt(); xOffset = layer->customProperty( "labeling/xOffset", QVariant( 0.0 ) ).toDouble(); yOffset = layer->customProperty( "labeling/yOffset", QVariant( 0.0 ) ).toDouble(); labelOffsetInMapUnits = layer->customProperty( "labeling/labelOffsetInMapUnits", QVariant( true ) ).toBool(); + labelOffsetMapUnitScale.minScale = layer->customProperty( "labeling/labelOffsetMapUnitMinScale", 0.0 ).toDouble(); + labelOffsetMapUnitScale.maxScale = layer->customProperty( "labeling/labelOffsetMapUnitMaxScale", 0.0 ).toDouble(); angleOffset = layer->customProperty( "labeling/angleOffset", QVariant( 0.0 ) ).toDouble(); preserveRotation = layer->customProperty( "labeling/preserveRotation", QVariant( true ) ).toBool(); maxCurvedCharAngleIn = layer->customProperty( "labeling/maxCurvedCharAngleIn", QVariant( 20.0 ) ).toDouble(); @@ -1033,6 +1063,8 @@ void QgsPalLayerSettings::writeToLayer( QgsVectorLayer* layer ) layer->setCustomProperty( "labeling/namedStyle", textNamedStyle ); layer->setCustomProperty( "labeling/fontSize", textFont.pointSizeF() ); layer->setCustomProperty( "labeling/fontSizeInMapUnits", fontSizeInMapUnits ); + layer->setCustomProperty( "labeling/fontSizeMapUnitMinScale", fontSizeMapUnitScale.minScale ); + layer->setCustomProperty( "labeling/fontSizeMapUnitMaxScale", fontSizeMapUnitScale.maxScale ); layer->setCustomProperty( "labeling/fontWeight", textFont.weight() ); layer->setCustomProperty( "labeling/fontItalic", textFont.italic() ); layer->setCustomProperty( "labeling/fontBold", textFont.bold() ); @@ -1063,6 +1095,8 @@ void QgsPalLayerSettings::writeToLayer( QgsVectorLayer* layer ) layer->setCustomProperty( "labeling/bufferDraw", bufferDraw ); layer->setCustomProperty( "labeling/bufferSize", bufferSize ); layer->setCustomProperty( "labeling/bufferSizeInMapUnits", bufferSizeInMapUnits ); + layer->setCustomProperty( "labeling/bufferSizeMapUnitMinScale", bufferSizeMapUnitScale.minScale ); + layer->setCustomProperty( "labeling/bufferSizeMapUnitMaxScale", bufferSizeMapUnitScale.maxScale ); _writeColor( layer, "labeling/bufferColor", bufferColor ); layer->setCustomProperty( "labeling/bufferNoFill", bufferNoFill ); layer->setCustomProperty( "labeling/bufferTransp", bufferTransp ); @@ -1077,18 +1111,26 @@ void QgsPalLayerSettings::writeToLayer( QgsVectorLayer* layer ) layer->setCustomProperty( "labeling/shapeSizeX", shapeSize.x() ); layer->setCustomProperty( "labeling/shapeSizeY", shapeSize.y() ); layer->setCustomProperty( "labeling/shapeSizeUnits", ( unsigned int )shapeSizeUnits ); + layer->setCustomProperty( "labeling/shapeSizeMapUnitMinScale", shapeSizeMapUnitScale.minScale ); + layer->setCustomProperty( "labeling/shapeSizeMapUnitMaxScale", shapeSizeMapUnitScale.maxScale ); layer->setCustomProperty( "labeling/shapeRotationType", ( unsigned int )shapeRotationType ); layer->setCustomProperty( "labeling/shapeRotation", shapeRotation ); layer->setCustomProperty( "labeling/shapeOffsetX", shapeOffset.x() ); layer->setCustomProperty( "labeling/shapeOffsetY", shapeOffset.y() ); layer->setCustomProperty( "labeling/shapeOffsetUnits", ( unsigned int )shapeOffsetUnits ); + layer->setCustomProperty( "labeling/shapeOffsetMapUnitMinScale", shapeOffsetMapUnitScale.minScale ); + layer->setCustomProperty( "labeling/shapeOffsetMapUnitMaxScale", shapeOffsetMapUnitScale.maxScale ); layer->setCustomProperty( "labeling/shapeRadiiX", shapeRadii.x() ); layer->setCustomProperty( "labeling/shapeRadiiY", shapeRadii.y() ); layer->setCustomProperty( "labeling/shapeRadiiUnits", ( unsigned int )shapeRadiiUnits ); + layer->setCustomProperty( "labeling/shapeRadiiMapUnitMinScale", shapeRadiiMapUnitScale.minScale ); + layer->setCustomProperty( "labeling/shapeRadiiMapUnitMaxScale", shapeRadiiMapUnitScale.maxScale ); _writeColor( layer, "labeling/shapeFillColor", shapeFillColor, true ); _writeColor( layer, "labeling/shapeBorderColor", shapeBorderColor, true ); layer->setCustomProperty( "labeling/shapeBorderWidth", shapeBorderWidth ); layer->setCustomProperty( "labeling/shapeBorderWidthUnits", ( unsigned int )shapeBorderWidthUnits ); + layer->setCustomProperty( "labeling/shapeBorderWidthMapUnitMinScale", shapeBorderWidthMapUnitScale.minScale ); + layer->setCustomProperty( "labeling/shapeBorderWidthMapUnitMaxScale", shapeBorderWidthMapUnitScale.maxScale ); layer->setCustomProperty( "labeling/shapeJoinStyle", ( unsigned int )shapeJoinStyle ); layer->setCustomProperty( "labeling/shapeTransparency", shapeTransparency ); layer->setCustomProperty( "labeling/shapeBlendMode", QgsMapRenderer::getBlendModeEnum( shapeBlendMode ) ); @@ -1099,9 +1141,13 @@ void QgsPalLayerSettings::writeToLayer( QgsVectorLayer* layer ) layer->setCustomProperty( "labeling/shadowOffsetAngle", shadowOffsetAngle ); layer->setCustomProperty( "labeling/shadowOffsetDist", shadowOffsetDist ); layer->setCustomProperty( "labeling/shadowOffsetUnits", ( unsigned int )shadowOffsetUnits ); + layer->setCustomProperty( "labeling/shadowOffsetMapUnitMinScale", shadowOffsetMapUnitScale.minScale ); + layer->setCustomProperty( "labeling/shadowOffsetMapUnitMaxScale", shadowOffsetMapUnitScale.maxScale ); layer->setCustomProperty( "labeling/shadowOffsetGlobal", shadowOffsetGlobal ); layer->setCustomProperty( "labeling/shadowRadius", shadowRadius ); layer->setCustomProperty( "labeling/shadowRadiusUnits", ( unsigned int )shadowRadiusUnits ); + layer->setCustomProperty( "labeling/shadowRadiusMapUnitMinScale", shadowRadiusMapUnitScale.minScale ); + layer->setCustomProperty( "labeling/shadowRadiusMapUnitMaxScale", shadowRadiusMapUnitScale.maxScale ); layer->setCustomProperty( "labeling/shadowRadiusAlphaOnly", shadowRadiusAlphaOnly ); layer->setCustomProperty( "labeling/shadowTransparency", shadowTransparency ); layer->setCustomProperty( "labeling/shadowScale", shadowScale ); @@ -1114,10 +1160,14 @@ void QgsPalLayerSettings::writeToLayer( QgsVectorLayer* layer ) layer->setCustomProperty( "labeling/centroidWhole", centroidWhole ); layer->setCustomProperty( "labeling/dist", dist ); layer->setCustomProperty( "labeling/distInMapUnits", distInMapUnits ); + layer->setCustomProperty( "labeling/distMapUnitMinScale", distMapUnitScale.minScale ); + layer->setCustomProperty( "labeling/distMapUnitMaxScale", distMapUnitScale.maxScale ); layer->setCustomProperty( "labeling/quadOffset", ( unsigned int )quadOffset ); layer->setCustomProperty( "labeling/xOffset", xOffset ); layer->setCustomProperty( "labeling/yOffset", yOffset ); layer->setCustomProperty( "labeling/labelOffsetInMapUnits", labelOffsetInMapUnits ); + layer->setCustomProperty( "labeling/labelOffsetMapUnitMinScale", labelOffsetMapUnitScale.minScale ); + layer->setCustomProperty( "labeling/labelOffsetMapUnitMaxScale", labelOffsetMapUnitScale.maxScale ); layer->setCustomProperty( "labeling/angleOffset", angleOffset ); layer->setCustomProperty( "labeling/preserveRotation", preserveRotation ); layer->setCustomProperty( "labeling/maxCurvedCharAngleIn", maxCurvedCharAngleIn ); @@ -1619,7 +1669,7 @@ void QgsPalLayerSettings::registerFeature( QgsFeature& f, const QgsRenderContext return; } - int fontPixelSize = sizeToPixel( fontSize, context, fontunits, true ); + int fontPixelSize = sizeToPixel( fontSize, context, fontunits, true, fontSizeMapUnitScale ); // don't try to show font sizes less than 1 pixel (Qt complains) if ( fontPixelSize < 1 ) { @@ -1989,7 +2039,7 @@ void QgsPalLayerSettings::registerFeature( QgsFeature& f, const QgsRenderContext // adjust offset of labels to match chosen unit and map scale // offsets match those of symbology: -x = left, -y = up - double mapUntsPerMM = context.mapToPixel().mapUnitsPerPixel() * context.scaleFactor(); + double mapUntsPerMM = labelOffsetMapUnitScale.computeMapUnitsPerPixel( context ) * context.scaleFactor(); if ( xOff != 0 ) { offsetX = xOff; // must be positive to match symbology offset direction @@ -2214,7 +2264,7 @@ void QgsPalLayerSettings::registerFeature( QgsFeature& f, const QgsRenderContext { if ( distinmapunit ) //convert distance from mm/map units to pixels { - distance /= context.mapToPixel().mapUnitsPerPixel(); + distance /= distMapUnitScale.computeMapUnitsPerPixel( context ); } else //mm { @@ -2530,7 +2580,7 @@ void QgsPalLayerSettings::parseTextStyle( QFont& labelFont, wordspace = wspacing; } } - labelFont.setWordSpacing( sizeToPixel( wordspace, context, fontunits, false ) ); + labelFont.setWordSpacing( sizeToPixel( wordspace, context, fontunits, false, fontSizeMapUnitScale ) ); // data defined letter spacing? double letterspace = labelFont.letterSpacing(); @@ -2544,7 +2594,7 @@ void QgsPalLayerSettings::parseTextStyle( QFont& labelFont, letterspace = lspacing; } } - labelFont.setLetterSpacing( QFont::AbsoluteSpacing, sizeToPixel( letterspace, context, fontunits, false ) ); + labelFont.setLetterSpacing( QFont::AbsoluteSpacing, sizeToPixel( letterspace, context, fontunits, false, fontSizeMapUnitScale ) ); // data defined font capitalization? QFont::Capitalization fontcaps = labelFont.capitalization(); @@ -3041,15 +3091,15 @@ void QgsPalLayerSettings::parseDropShadow() dataDefinedValEval( "blendmode", QgsPalLayerSettings::ShadowBlendMode, exprVal ); } -int QgsPalLayerSettings::sizeToPixel( double size, const QgsRenderContext& c, SizeUnit unit, bool rasterfactor ) const +int QgsPalLayerSettings::sizeToPixel( double size, const QgsRenderContext& c, SizeUnit unit, bool rasterfactor, const QgsMapUnitScale& mapUnitScale ) const { - return ( int )( scaleToPixelContext( size, c, unit, rasterfactor ) + 0.5 ); + return ( int )( scaleToPixelContext( size, c, unit, rasterfactor, mapUnitScale ) + 0.5 ); } -double QgsPalLayerSettings::scaleToPixelContext( double size, const QgsRenderContext& c, SizeUnit unit, bool rasterfactor ) const +double QgsPalLayerSettings::scaleToPixelContext( double size, const QgsRenderContext& c, SizeUnit unit, bool rasterfactor, const QgsMapUnitScale& mapUnitScale ) const { // if render context is that of device (i.e. not a scaled map), just return size - double mapUnitsPerPixel = c.mapToPixel().mapUnitsPerPixel(); + double mapUnitsPerPixel = mapUnitScale.computeMapUnitsPerPixel( c ); if ( unit == MapUnits && mapUnitsPerPixel > 0.0 ) { @@ -4365,7 +4415,7 @@ void QgsPalLabeling::drawLabelBuffer( QgsRenderContext& context, QPainter* p = context.painter(); double penSize = tmpLyr.scaleToPixelContext( tmpLyr.bufferSize, context, - ( tmpLyr.bufferSizeInMapUnits ? QgsPalLayerSettings::MapUnits : QgsPalLayerSettings::MM ), true ); + ( tmpLyr.bufferSizeInMapUnits ? QgsPalLayerSettings::MapUnits : QgsPalLayerSettings::MM ), true, tmpLyr.bufferSizeMapUnitScale ); QPainterPath path; path.addText( 0, 0, tmpLyr.textFont, component.text() ); @@ -4437,7 +4487,7 @@ void QgsPalLabeling::drawLabelBackground( QgsRenderContext& context, } // mm to map units conversion factor - double mmToMapUnits = context.mapToPixel().mapUnitsPerPixel() * context.scaleFactor(); + double mmToMapUnits = tmpLyr.shapeSizeMapUnitScale.computeMapUnitsPerPixel( context ) * context.scaleFactor(); // TODO: the following label-buffered generated shapes and SVG symbols should be moved into marker symbology classes @@ -4474,7 +4524,7 @@ void QgsPalLabeling::drawLabelBackground( QgsRenderContext& context, // don't bother rendering symbols smaller than 1x1 pixels in size // TODO: add option to not show any svgs under/over a certian size - if ( tmpLyr.scaleToPixelContext( sizeOut, context, tmpLyr.shapeSizeUnits ) < 1.0 ) + if ( tmpLyr.scaleToPixelContext( sizeOut, context, tmpLyr.shapeSizeUnits, false, tmpLyr.shapeSizeMapUnitScale ) < 1.0 ) return; QgsStringMap map; // for SVG symbology marker @@ -4528,7 +4578,7 @@ void QgsPalLabeling::drawLabelBackground( QgsRenderContext& context, QgsSymbolV2RenderContext svgShdwContext( shdwContext, QgsSymbolV2::Mixed, ( 100.0 - ( double )( tmpLyr.shapeTransparency ) ) / 100.0 ); - double svgSize = tmpLyr.scaleToPixelContext( sizeOut, context, tmpLyr.shapeSizeUnits, true ); + double svgSize = tmpLyr.scaleToPixelContext( sizeOut, context, tmpLyr.shapeSizeUnits, true, tmpLyr.shapeSizeMapUnitScale ); svgShdwM->renderPoint( QPointF( svgSize / 2, -svgSize / 2 ), svgShdwContext ); svgp.end(); @@ -4544,8 +4594,8 @@ void QgsPalLabeling::drawLabelBackground( QgsRenderContext& context, p->translate( component.center().x(), component.center().y() ); p->rotate( component.rotation() ); p->scale( 1.0 / tmpLyr.rasterCompressFactor, 1.0 / tmpLyr.rasterCompressFactor ); - double xoff = tmpLyr.scaleToPixelContext( tmpLyr.shapeOffset.x(), context, tmpLyr.shapeOffsetUnits, true ); - double yoff = tmpLyr.scaleToPixelContext( tmpLyr.shapeOffset.y(), context, tmpLyr.shapeOffsetUnits, true ); + double xoff = tmpLyr.scaleToPixelContext( tmpLyr.shapeOffset.x(), context, tmpLyr.shapeOffsetUnits, true, tmpLyr.shapeOffsetMapUnitScale ); + double yoff = tmpLyr.scaleToPixelContext( tmpLyr.shapeOffset.y(), context, tmpLyr.shapeOffsetUnits, true, tmpLyr.shapeOffsetMapUnitScale ); p->translate( QPointF( xoff, yoff ) ); p->rotate( component.rotationOffset() ); p->translate( -svgSize / 2, svgSize / 2 ); @@ -4570,8 +4620,8 @@ void QgsPalLabeling::drawLabelBackground( QgsRenderContext& context, } p->translate( component.center().x(), component.center().y() ); p->rotate( component.rotation() ); - double xoff = tmpLyr.scaleToPixelContext( tmpLyr.shapeOffset.x(), context, tmpLyr.shapeOffsetUnits ); - double yoff = tmpLyr.scaleToPixelContext( tmpLyr.shapeOffset.y(), context, tmpLyr.shapeOffsetUnits ); + double xoff = tmpLyr.scaleToPixelContext( tmpLyr.shapeOffset.x(), context, tmpLyr.shapeOffsetUnits, false, tmpLyr.shapeOffsetMapUnitScale ); + double yoff = tmpLyr.scaleToPixelContext( tmpLyr.shapeOffset.y(), context, tmpLyr.shapeOffsetUnits, false, tmpLyr.shapeOffsetMapUnitScale ); p->translate( QPointF( xoff, yoff ) ); p->rotate( component.rotationOffset() ); svgM->renderPoint( QPointF( 0, 0 ), svgContext ); @@ -4624,8 +4674,8 @@ void QgsPalLabeling::drawLabelBackground( QgsRenderContext& context, } // convert everything over to map pixels from here on - w = tmpLyr.scaleToPixelContext( w, context, tmpLyr.shapeSizeUnits, true ); - h = tmpLyr.scaleToPixelContext( h, context, tmpLyr.shapeSizeUnits, true ); + w = tmpLyr.scaleToPixelContext( w, context, tmpLyr.shapeSizeUnits, true, tmpLyr.shapeSizeMapUnitScale ); + h = tmpLyr.scaleToPixelContext( h, context, tmpLyr.shapeSizeUnits, true, tmpLyr.shapeSizeMapUnitScale ); // offsets match those of symbology: -x = left, -y = up QRectF rect( -w / 2.0, - h / 2.0, w, h ); @@ -4636,12 +4686,12 @@ void QgsPalLabeling::drawLabelBackground( QgsRenderContext& context, p->save(); p->translate( QPointF( component.center().x(), component.center().y() ) ); p->rotate( component.rotation() ); - double xoff = tmpLyr.scaleToPixelContext( tmpLyr.shapeOffset.x(), context, tmpLyr.shapeOffsetUnits, false ); - double yoff = tmpLyr.scaleToPixelContext( tmpLyr.shapeOffset.y(), context, tmpLyr.shapeOffsetUnits, false ); + double xoff = tmpLyr.scaleToPixelContext( tmpLyr.shapeOffset.x(), context, tmpLyr.shapeOffsetUnits, false, tmpLyr.shapeOffsetMapUnitScale ); + double yoff = tmpLyr.scaleToPixelContext( tmpLyr.shapeOffset.y(), context, tmpLyr.shapeOffsetUnits, false, tmpLyr.shapeOffsetMapUnitScale ); p->translate( QPointF( xoff, yoff ) ); p->rotate( component.rotationOffset() ); - double penSize = tmpLyr.scaleToPixelContext( tmpLyr.shapeBorderWidth, context, tmpLyr.shapeBorderWidthUnits, true ); + double penSize = tmpLyr.scaleToPixelContext( tmpLyr.shapeBorderWidth, context, tmpLyr.shapeBorderWidthUnits, true, tmpLyr.shapeBorderWidthMapUnitScale ); QPen pen; if ( tmpLyr.shapeBorderWidth > 0 ) @@ -4672,8 +4722,8 @@ void QgsPalLabeling::drawLabelBackground( QgsRenderContext& context, } else { - double xRadius = tmpLyr.scaleToPixelContext( tmpLyr.shapeRadii.x(), context, tmpLyr.shapeRadiiUnits, true ); - double yRadius = tmpLyr.scaleToPixelContext( tmpLyr.shapeRadii.y(), context, tmpLyr.shapeRadiiUnits, true ); + double xRadius = tmpLyr.scaleToPixelContext( tmpLyr.shapeRadii.x(), context, tmpLyr.shapeRadiiUnits, true, tmpLyr.shapeRadiiMapUnitScale ); + double yRadius = tmpLyr.scaleToPixelContext( tmpLyr.shapeRadii.y(), context, tmpLyr.shapeRadiiUnits, true, tmpLyr.shapeRadiiMapUnitScale ); shapep.drawRoundedRect( rect, xRadius, yRadius ); } } @@ -4725,7 +4775,7 @@ void QgsPalLabeling::drawLabelShadow( QgsRenderContext& context, // generate pixmap representation of label component drawing bool mapUnits = ( tmpLyr.shadowRadiusUnits == QgsPalLayerSettings::MapUnits ); - double radius = tmpLyr.scaleToPixelContext( tmpLyr.shadowRadius , context, tmpLyr.shadowRadiusUnits, !mapUnits ); + double radius = tmpLyr.scaleToPixelContext( tmpLyr.shadowRadius , context, tmpLyr.shadowRadiusUnits, !mapUnits, tmpLyr.shadowRadiusMapUnitScale ); radius /= ( mapUnits ? tmpLyr.vectorScaleFactor / component.dpiRatio() : 1 ); radius = ( int )( radius + 0.5 ); @@ -4786,7 +4836,7 @@ void QgsPalLabeling::drawLabelShadow( QgsRenderContext& context, picti.end(); } - double offsetDist = tmpLyr.scaleToPixelContext( tmpLyr.shadowOffsetDist, context, tmpLyr.shadowOffsetUnits, true ); + double offsetDist = tmpLyr.scaleToPixelContext( tmpLyr.shadowOffsetDist, context, tmpLyr.shadowOffsetUnits, true, tmpLyr.shadowOffsetMapUnitScale ); double angleRad = tmpLyr.shadowOffsetAngle * M_PI / 180; // to radians if ( tmpLyr.shadowOffsetGlobal ) { diff --git a/src/core/qgspallabeling.h b/src/core/qgspallabeling.h index 0f2dd29abcf1..8c2631270042 100644 --- a/src/core/qgspallabeling.h +++ b/src/core/qgspallabeling.h @@ -2,9 +2,9 @@ qgspallabeling.h Smart labeling for vector layers ------------------- - begin : June 2009 - copyright : (C) Martin Dobias - email : wonder dot sk at gmail dot com + begin : June 2009 + copyright : (C) Martin Dobias + email : wonder dot sk at gmail dot com *************************************************************************** * * @@ -56,6 +56,7 @@ class QgsFeature; #include "qgsexpression.h" #include "qgsdatadefined.h" #include "qgsdiagramrendererv2.h" +#include "qgsmapunitscale.h" class QgsPalGeometry; class QgsVectorLayer; @@ -285,6 +286,7 @@ class CORE_EXPORT QgsPalLayerSettings QFont textFont; QString textNamedStyle; bool fontSizeInMapUnits; //true if font size is in map units (otherwise in points) + QgsMapUnitScale fontSizeMapUnitScale; // scale range for map units for font size QColor textColor; int textTransp; QPainter::CompositionMode blendMode; @@ -314,6 +316,7 @@ class CORE_EXPORT QgsPalLayerSettings bool bufferDraw; double bufferSize; // buffer size bool bufferSizeInMapUnits; //true if buffer is in map units (otherwise in mm) + QgsMapUnitScale bufferSizeMapUnitScale; // scale range for map units for buffer size QColor bufferColor; bool bufferNoFill; //set interior of buffer to 100% transparent int bufferTransp; @@ -328,18 +331,22 @@ class CORE_EXPORT QgsPalLayerSettings SizeType shapeSizeType; QPointF shapeSize; SizeUnit shapeSizeUnits; + QgsMapUnitScale shapeSizeMapUnitScale; RotationType shapeRotationType; double shapeRotation; QPointF shapeOffset; SizeUnit shapeOffsetUnits; + QgsMapUnitScale shapeOffsetMapUnitScale; QPointF shapeRadii; SizeUnit shapeRadiiUnits; + QgsMapUnitScale shapeRadiiMapUnitScale; int shapeTransparency; QPainter::CompositionMode shapeBlendMode; QColor shapeFillColor; QColor shapeBorderColor; double shapeBorderWidth; SizeUnit shapeBorderWidthUnits; + QgsMapUnitScale shapeBorderWidthMapUnitScale; Qt::PenJoinStyle shapeJoinStyle; //-- drop shadow @@ -349,9 +356,11 @@ class CORE_EXPORT QgsPalLayerSettings int shadowOffsetAngle; double shadowOffsetDist; SizeUnit shadowOffsetUnits; + QgsMapUnitScale shadowOffsetMapUnitScale; bool shadowOffsetGlobal; double shadowRadius; SizeUnit shadowRadiusUnits; + QgsMapUnitScale shadowRadiusMapUnitScale; bool shadowRadiusAlphaOnly; int shadowTransparency; int shadowScale; @@ -366,6 +375,7 @@ class CORE_EXPORT QgsPalLayerSettings bool centroidWhole; // whether centroid calculated from whole or visible polygon double dist; // distance from the feature (in mm) bool distInMapUnits; //true if distance is in map units (otherwise in mm) + QgsMapUnitScale distMapUnitScale; // offset labels of point/centroid features default to center // move label to quadrant: left/down, don't move, right/up (-1, 0, 1) @@ -374,6 +384,7 @@ class CORE_EXPORT QgsPalLayerSettings double xOffset; // offset from point in mm or map units double yOffset; // offset from point in mm or map units bool labelOffsetInMapUnits; //true if label offset is in map units (otherwise in mm) + QgsMapUnitScale labelOffsetMapUnitScale; double angleOffset; // rotation applied to offset labels bool preserveRotation; // preserve predefined rotation data during label pin/unpin operations @@ -471,19 +482,21 @@ class CORE_EXPORT QgsPalLayerSettings * @param c rendercontext * @param unit SizeUnit enum value of size * @param rasterfactor whether to consider oversampling + * @param mapUnitScale a mapUnitScale clamper * @return font pixel size */ - int sizeToPixel( double size, const QgsRenderContext& c , SizeUnit unit, bool rasterfactor = false ) const; + int sizeToPixel( double size, const QgsRenderContext& c , SizeUnit unit, bool rasterfactor = false, const QgsMapUnitScale& mapUnitScale = QgsMapUnitScale() ) const; /** Calculates size (considering output size should be in pixel or map units, scale factors and optionally oversampling) * @param size size to convert * @param c rendercontext * @param unit SizeUnit enum value of size * @param rasterfactor whether to consider oversampling + * @param mapUnitScale a mapUnitScale clamper * @return size that will render, as double * @note added in 1.9, as a better precision replacement for sizeToPixel */ - double scaleToPixelContext( double size, const QgsRenderContext& c, SizeUnit unit, bool rasterfactor = false ) const; + double scaleToPixelContext( double size, const QgsRenderContext& c, SizeUnit unit, bool rasterfactor = false, const QgsMapUnitScale& mapUnitScale = QgsMapUnitScale() ) const; /** Map of data defined enum to names and old-style indecies * The QPair contains a new string for layer property key, and a reference to old-style numeric key (< QGIS 2.0) @@ -840,3 +853,5 @@ class CORE_EXPORT QgsPalLabeling : public QgsLabelingEngineInterface }; #endif // QGSPALLABELING_H + + diff --git a/src/core/symbology-ng/qgsellipsesymbollayerv2.cpp b/src/core/symbology-ng/qgsellipsesymbollayerv2.cpp index b6201b1ca72c..9adf123f6a85 100644 --- a/src/core/symbology-ng/qgsellipsesymbollayerv2.cpp +++ b/src/core/symbology-ng/qgsellipsesymbollayerv2.cpp @@ -1,9 +1,9 @@ /*************************************************************************** - qgsellipsesymbollayerv2.cpp - --------------------- - begin : June 2011 - copyright : (C) 2011 by Marco Hugentobler - email : marco dot hugentobler at sourcepole dot ch + qgsellipsesymbollayerv2.cpp + --------------------- + begin : June 2011 + copyright : (C) 2011 by Marco Hugentobler + email : marco dot hugentobler at sourcepole dot ch *************************************************************************** * * * This program is free software; you can redistribute it and/or modify * @@ -58,6 +58,10 @@ QgsSymbolLayerV2* QgsEllipseSymbolLayerV2::create( const QgsStringMap& propertie { layer->setSymbolWidthUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( properties["symbol_width_unit"] ) ); } + if ( properties.contains( "symbol_width_map_unit_scale" ) ) + { + layer->setSymbolWidthMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( properties["symbol_width_map_unit_scale"] ) ); + } if ( properties.contains( "symbol_height" ) ) { layer->setSymbolHeight( properties["symbol_height"].toDouble() ); @@ -66,6 +70,10 @@ QgsSymbolLayerV2* QgsEllipseSymbolLayerV2::create( const QgsStringMap& propertie { layer->setSymbolHeightUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( properties["symbol_height_unit"] ) ); } + if ( properties.contains( "symbol_height_map_unit_scale" ) ) + { + layer->setSymbolHeightMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( properties["symbol_height_map_unit_scale"] ) ); + } if ( properties.contains( "angle" ) ) { layer->setAngle( properties["angle"].toDouble() ); @@ -82,6 +90,10 @@ QgsSymbolLayerV2* QgsEllipseSymbolLayerV2::create( const QgsStringMap& propertie { layer->setOutlineWidthUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( properties["outline_width_unit"] ) ); } + if ( properties.contains( "outline_width_map_unit_scale" ) ) + { + layer->setOutlineWidthMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( properties["outline_width_map_unit_scale"] ) ); + } if ( properties.contains( "fill_color" ) ) { layer->setFillColor( QgsSymbolLayerV2Utils::decodeColor( properties["fill_color"] ) ); @@ -90,6 +102,18 @@ QgsSymbolLayerV2* QgsEllipseSymbolLayerV2::create( const QgsStringMap& propertie { layer->setOutlineColor( QgsSymbolLayerV2Utils::decodeColor( properties["outline_color"] ) ); } + if ( properties.contains( "size" ) ) + { + layer->setSize( properties["size"].toDouble() ); + } + if ( properties.contains( "size_unit" ) ) + { + layer->setSizeUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( properties["size_unit"] ) ); + } + if ( properties.contains( "size_map_unit_scale" ) ) + { + layer->setSizeMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( properties["size_map_unit_scale"] ) ); + } if ( properties.contains( "offset" ) ) { layer->setOffset( QgsSymbolLayerV2Utils::decodePoint( properties["offset"] ) ); @@ -98,6 +122,10 @@ QgsSymbolLayerV2* QgsEllipseSymbolLayerV2::create( const QgsStringMap& propertie { layer->setOffsetUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( properties["offset_unit"] ) ); } + if ( properties.contains( "offset_map_unit_scale" ) ) + { + layer->setOffsetMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( properties["offset_map_unit_scale"] ) ); + } if ( properties.contains( "horizontal_anchor_point" ) ) { layer->setHorizontalAnchorPoint( QgsMarkerSymbolLayerV2::HorizontalAnchorPoint( properties[ "horizontal_anchor_point" ].toInt() ) ); @@ -195,7 +223,7 @@ void QgsEllipseSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV2Rend if ( outlineWidthExpression ) { double width = outlineWidthExpression->evaluate( const_cast( context.feature() ) ).toDouble(); - width *= QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOutlineWidthUnit ); + width *= QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOutlineWidthUnit, mOutlineWidthMapUnitScale ); mPen.setWidthF( width ); } if ( fillColorExpression ) @@ -221,7 +249,7 @@ void QgsEllipseSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV2Rend //offset double offsetX = 0; double offsetY = 0; - markerOffset( context, mSymbolWidth, mSymbolHeight, mSymbolWidthUnit, mSymbolHeightUnit, offsetX, offsetY ); + markerOffset( context, mSymbolWidth, mSymbolHeight, mSymbolWidthUnit, mSymbolHeightUnit, offsetX, offsetY, mSymbolWidthMapUnitScale, mSymbolHeightMapUnitScale ); QPointF off( offsetX, offsetY ); QPainter* p = context.renderContext().painter(); @@ -268,7 +296,7 @@ void QgsEllipseSymbolLayerV2::startRender( QgsSymbolV2RenderContext& context ) } mPen.setColor( mOutlineColor ); mPen.setStyle( mOutlineStyle ); - mPen.setWidthF( mOutlineWidth * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOutlineWidthUnit ) ); + mPen.setWidthF( mOutlineWidth * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOutlineWidthUnit, mOutlineWidthMapUnitScale ) ); mBrush.setColor( mFillColor ); prepareExpressions( context.fields(), context.renderContext().rendererScale() ); } @@ -401,16 +429,23 @@ QgsStringMap QgsEllipseSymbolLayerV2::properties() const map["symbol_name"] = mSymbolName; map["symbol_width"] = QString::number( mSymbolWidth ); map["symbol_width_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mSymbolWidthUnit ); + map["symbol_width_map_unit_scale"] = QgsSymbolLayerV2Utils::encodeMapUnitScale( mSymbolWidthMapUnitScale ); map["symbol_height"] = QString::number( mSymbolHeight ); map["symbol_height_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mSymbolHeightUnit ); + map["symbol_height_map_unit_scale"] = QgsSymbolLayerV2Utils::encodeMapUnitScale( mSymbolHeightMapUnitScale ); map["angle"] = QString::number( mAngle ); map["outline_style"] = QgsSymbolLayerV2Utils::encodePenStyle( mOutlineStyle ); map["outline_width"] = QString::number( mOutlineWidth ); map["outline_width_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mOutlineWidthUnit ); + map["outline_width_map_unit_scale"] = QgsSymbolLayerV2Utils::encodeMapUnitScale( mOutlineWidthMapUnitScale ); map["fill_color"] = QgsSymbolLayerV2Utils::encodeColor( mFillColor ); map["outline_color"] = QgsSymbolLayerV2Utils::encodeColor( mOutlineColor ); map["offset"] = QgsSymbolLayerV2Utils::encodePoint( mOffset ); map["offset_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mOffsetUnit ); + map["offset_map_unit_scale"] = QgsSymbolLayerV2Utils::encodeMapUnitScale( mOffsetMapUnitScale ); + map["size"] = QString::number( mSize ); + map["size_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mSizeUnit ); + map["size_map_unit_scale"] = QgsSymbolLayerV2Utils::encodeMapUnitScale( mSizeMapUnitScale ); map["horizontal_anchor_point"] = QString::number( mHorizontalAnchorPoint ); map["vertical_anchor_point"] = QString::number( mVerticalAnchorPoint ); saveDataDefinedProperties( map ); @@ -444,7 +479,7 @@ void QgsEllipseSymbolLayerV2::preparePath( const QString& symbolName, QgsSymbolV { width = mSymbolWidth; } - width *= QgsSymbolLayerV2Utils::lineWidthScaleFactor( ct, mSymbolWidthUnit ); + width *= QgsSymbolLayerV2Utils::lineWidthScaleFactor( ct, mSymbolWidthUnit, mSymbolHeightMapUnitScale ); double height = 0; QgsExpression* heightExpression = expression( "height" ); @@ -460,7 +495,7 @@ void QgsEllipseSymbolLayerV2::preparePath( const QString& symbolName, QgsSymbolV { height = mSymbolHeight; } - height *= QgsSymbolLayerV2Utils::lineWidthScaleFactor( ct, mSymbolHeightUnit ); + height *= QgsSymbolLayerV2Utils::lineWidthScaleFactor( ct, mSymbolHeightUnit, mSymbolHeightMapUnitScale ); if ( symbolName == "circle" ) { @@ -488,6 +523,7 @@ void QgsEllipseSymbolLayerV2::preparePath( const QString& symbolName, QgsSymbolV void QgsEllipseSymbolLayerV2::setOutputUnit( QgsSymbolV2::OutputUnit unit ) { + QgsMarkerSymbolLayerV2::setOutputUnit( unit ); mSymbolWidthUnit = unit; mSymbolHeightUnit = unit; mOutlineWidthUnit = unit; @@ -495,14 +531,33 @@ void QgsEllipseSymbolLayerV2::setOutputUnit( QgsSymbolV2::OutputUnit unit ) QgsSymbolV2::OutputUnit QgsEllipseSymbolLayerV2::outputUnit() const { - QgsSymbolV2::OutputUnit unit = mSymbolWidthUnit; - if ( mSymbolHeightUnit != unit || mOutlineWidthUnit != unit ) + QgsSymbolV2::OutputUnit unit = QgsMarkerSymbolLayerV2::outputUnit(); + if ( mSymbolWidthUnit != unit || mSymbolHeightUnit != unit || mOutlineWidthUnit != unit ) { return QgsSymbolV2::Mixed; } return unit; } +void QgsEllipseSymbolLayerV2::setMapUnitScale( const QgsMapUnitScale &scale ) +{ + QgsMarkerSymbolLayerV2::setMapUnitScale( scale ); + mSymbolWidthMapUnitScale = scale; + mSymbolHeightMapUnitScale = scale; + mOutlineWidthMapUnitScale = scale; +} + +QgsMapUnitScale QgsEllipseSymbolLayerV2::mapUnitScale() const +{ + if ( QgsMarkerSymbolLayerV2::mapUnitScale() == mSymbolWidthMapUnitScale && + mSymbolWidthMapUnitScale == mSymbolHeightMapUnitScale && + mSymbolHeightMapUnitScale == mOutlineWidthMapUnitScale ) + { + return mSymbolWidthMapUnitScale; + } + return QgsMapUnitScale(); +} + bool QgsEllipseSymbolLayerV2::writeDxf( QgsDxfExport& e, double mmMapUnitScaleFactor, const QString& layerName, const QgsSymbolV2RenderContext* context, const QgsFeature* f, const QPointF& shift ) const { //width @@ -638,3 +693,5 @@ bool QgsEllipseSymbolLayerV2::writeDxf( QgsDxfExport& e, double mmMapUnitScaleFa return false; //soon... } + + diff --git a/src/core/symbology-ng/qgsellipsesymbollayerv2.h b/src/core/symbology-ng/qgsellipsesymbollayerv2.h index 3762e38a2d03..b300bb22fae4 100644 --- a/src/core/symbology-ng/qgsellipsesymbollayerv2.h +++ b/src/core/symbology-ng/qgsellipsesymbollayerv2.h @@ -1,9 +1,9 @@ /*************************************************************************** - qgsellipsesymbollayerv2.h - --------------------- - begin : June 2011 - copyright : (C) 2011 by Marco Hugentobler - email : marco dot hugentobler at sourcepole dot ch + qgsellipsesymbollayerv2.h + --------------------- + begin : June 2011 + copyright : (C) 2011 by Marco Hugentobler + email : marco dot hugentobler at sourcepole dot ch *************************************************************************** * * * This program is free software; you can redistribute it and/or modify * @@ -66,26 +66,41 @@ class CORE_EXPORT QgsEllipseSymbolLayerV2: public QgsMarkerSymbolLayerV2 void setSymbolWidthUnit( QgsSymbolV2::OutputUnit unit ) { mSymbolWidthUnit = unit; } QgsSymbolV2::OutputUnit symbolWidthUnit() const { return mSymbolWidthUnit; } + void setSymbolWidthMapUnitScale( const QgsMapUnitScale& scale ) { mSymbolWidthMapUnitScale = scale; } + const QgsMapUnitScale& symbolWidthMapUnitScale() const { return mSymbolWidthMapUnitScale; } + void setSymbolHeightUnit( QgsSymbolV2::OutputUnit unit ) { mSymbolHeightUnit = unit; } QgsSymbolV2::OutputUnit symbolHeightUnit() const { return mSymbolHeightUnit; } + void setSymbolHeightMapUnitScale( const QgsMapUnitScale& scale ) { mSymbolHeightMapUnitScale = scale; } + const QgsMapUnitScale& symbolHeightMapUnitScale() const { return mSymbolHeightMapUnitScale; } + void setOutlineWidthUnit( QgsSymbolV2::OutputUnit unit ) { mOutlineWidthUnit = unit; } QgsSymbolV2::OutputUnit outlineWidthUnit() const { return mOutlineWidthUnit; } + void setOutlineWidthMapUnitScale( const QgsMapUnitScale& scale ) { mOutlineWidthMapUnitScale = scale; } + const QgsMapUnitScale& outlineWidthMapUnitScale() const { return mOutlineWidthMapUnitScale; } + void setOutputUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit outputUnit() const; + void setMapUnitScale( const QgsMapUnitScale& scale ); + QgsMapUnitScale mapUnitScale() const; + private: QString mSymbolName; double mSymbolWidth; QgsSymbolV2::OutputUnit mSymbolWidthUnit; + QgsMapUnitScale mSymbolWidthMapUnitScale; double mSymbolHeight; QgsSymbolV2::OutputUnit mSymbolHeightUnit; + QgsMapUnitScale mSymbolHeightMapUnitScale; QColor mFillColor; QColor mOutlineColor; Qt::PenStyle mOutlineStyle; double mOutlineWidth; QgsSymbolV2::OutputUnit mOutlineWidthUnit; + QgsMapUnitScale mOutlineWidthMapUnitScale; QPainterPath mPainterPath; @@ -103,3 +118,5 @@ class CORE_EXPORT QgsEllipseSymbolLayerV2: public QgsMarkerSymbolLayerV2 }; #endif // QGSELLIPSESYMBOLLAYERV2_H + + diff --git a/src/core/symbology-ng/qgsfillsymbollayerv2.cpp b/src/core/symbology-ng/qgsfillsymbollayerv2.cpp index 95061095a20b..9ce6b274bf66 100644 --- a/src/core/symbology-ng/qgsfillsymbollayerv2.cpp +++ b/src/core/symbology-ng/qgsfillsymbollayerv2.cpp @@ -1,9 +1,9 @@ /*************************************************************************** - qgsfillsymbollayerv2.cpp - --------------------- - begin : November 2009 - copyright : (C) 2009 by Martin Dobias - email : wonder dot sk at gmail dot com + qgsfillsymbollayerv2.cpp + --------------------- + begin : November 2009 + copyright : (C) 2009 by Martin Dobias + email : wonder dot sk at gmail dot com *************************************************************************** * * * This program is free software; you can redistribute it and/or modify * @@ -60,6 +60,21 @@ QgsSymbolV2::OutputUnit QgsSimpleFillSymbolLayerV2::outputUnit() const return unit; } +void QgsSimpleFillSymbolLayerV2::setMapUnitScale( const QgsMapUnitScale &scale ) +{ + mBorderWidthMapUnitScale = scale; + mOffsetMapUnitScale = scale; +} + +QgsMapUnitScale QgsSimpleFillSymbolLayerV2::mapUnitScale() const +{ + if ( mBorderWidthMapUnitScale == mOffsetMapUnitScale ) + { + return mBorderWidthMapUnitScale; + } + return QgsMapUnitScale(); +} + void QgsSimpleFillSymbolLayerV2::applyDataDefinedSymbology( QgsSymbolV2RenderContext& context, QBrush& brush, QPen& pen, QPen& selPen ) { QgsExpression* colorExpression = expression( "color" ); @@ -76,7 +91,7 @@ void QgsSimpleFillSymbolLayerV2::applyDataDefinedSymbology( QgsSymbolV2RenderCon if ( widthBorderExpression ) { double width = widthBorderExpression->evaluate( const_cast( context.feature() ) ).toDouble(); - width *= QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mBorderWidthUnit ); + width *= QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mBorderWidthUnit, mBorderWidthMapUnitScale ); pen.setWidthF( width ); selPen.setWidthF( width ); } @@ -115,6 +130,11 @@ QgsSymbolLayerV2* QgsSimpleFillSymbolLayerV2::create( const QgsStringMap& props if ( props.contains( "offset_unit" ) ) sl->setOffsetUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( props["offset_unit"] ) ); + if ( props.contains( "border_width_map_unit_scale" ) ) + sl->setBorderWidthMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( props["border_width_map_unit_scale"] ) ); + if ( props.contains( "offset_map_unit_scale" ) ) + sl->setOffsetMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( props["offset_map_unit_scale"] ) ); + if ( props.contains( "color_expression" ) ) { sl->setDataDefinedProperty( "color", props["color_expression"] ); @@ -163,7 +183,7 @@ void QgsSimpleFillSymbolLayerV2::startRender( QgsSymbolV2RenderContext& context mPen = QPen( borderColor ); mSelPen = QPen( selPenColor ); mPen.setStyle( mBorderStyle ); - mPen.setWidthF( mBorderWidth * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mBorderWidthUnit ) ); + mPen.setWidthF( mBorderWidth * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mBorderWidthUnit, mBorderWidthMapUnitScale ) ); mPen.setJoinStyle( mPenJoinStyle ); prepareExpressions( context.fields(), context.renderContext().rendererScale() ); } @@ -189,8 +209,8 @@ void QgsSimpleFillSymbolLayerV2::renderPolygon( const QPolygonF& points, QListtranslate( offset ); } @@ -211,9 +231,11 @@ QgsStringMap QgsSimpleFillSymbolLayerV2::properties() const map["style_border"] = QgsSymbolLayerV2Utils::encodePenStyle( mBorderStyle ); map["width_border"] = QString::number( mBorderWidth ); map["border_width_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mBorderWidthUnit ); + map["border_width_map_unit_scale"] = QgsSymbolLayerV2Utils::encodeMapUnitScale( mBorderWidthMapUnitScale ); map["joinstyle"] = QgsSymbolLayerV2Utils::encodePenJoinStyle( mPenJoinStyle ); map["offset"] = QgsSymbolLayerV2Utils::encodePoint( mOffset ); map["offset_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mOffsetUnit ); + map["offset_map_unit_scale"] = QgsSymbolLayerV2Utils::encodeMapUnitScale( mOffsetMapUnitScale ); saveDataDefinedProperties( map ); return map; } @@ -223,7 +245,9 @@ QgsSymbolLayerV2* QgsSimpleFillSymbolLayerV2::clone() const QgsSimpleFillSymbolLayerV2* sl = new QgsSimpleFillSymbolLayerV2( mColor, mBrushStyle, mBorderColor, mBorderStyle, mBorderWidth, mPenJoinStyle ); sl->setOffset( mOffset ); sl->setOffsetUnit( mOffsetUnit ); + sl->setOffsetMapUnitScale( mOffsetMapUnitScale ); sl->setBorderWidthUnit( mBorderWidthUnit ); + sl->setBorderWidthMapUnitScale( mBorderWidthMapUnitScale ); copyDataDefinedProperties( sl ); return sl; } @@ -416,6 +440,8 @@ QgsSymbolLayerV2* QgsGradientFillSymbolLayerV2::create( const QgsStringMap& prop sl->setOffset( offset ); if ( props.contains( "offset_unit" ) ) sl->setOffsetUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( props["offset_unit"] ) ); + if ( props.contains( "offset_map_unit_scale" ) ) + sl->setOffsetMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( props["offset_map_unit_scale"] ) ); sl->setReferencePoint1( referencePoint1 ); sl->setReferencePoint1IsCentroid( refPoint1IsCentroid ); sl->setReferencePoint2( referencePoint2 ); @@ -734,8 +760,8 @@ void QgsGradientFillSymbolLayerV2::renderPolygon( const QPolygonF& points, QList QPointF offset; if ( !mOffset.isNull() ) { - offset.setX( mOffset.x() * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit ) ); - offset.setY( mOffset.y() * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit ) ); + offset.setX( mOffset.x() * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit, mOffsetMapUnitScale ) ); + offset.setY( mOffset.y() * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit, mOffsetMapUnitScale ) ); p->translate( offset ); } @@ -763,6 +789,7 @@ QgsStringMap QgsGradientFillSymbolLayerV2::properties() const map["angle"] = QString::number( mAngle ); map["offset"] = QgsSymbolLayerV2Utils::encodePoint( mOffset ); map["offset_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mOffsetUnit ); + map["offset_map_unit_scale"] = QgsSymbolLayerV2Utils::encodeMapUnitScale( mOffsetMapUnitScale ); saveDataDefinedProperties( map ); if ( mGradientRamp ) { @@ -783,6 +810,7 @@ QgsSymbolLayerV2* QgsGradientFillSymbolLayerV2::clone() const sl->setAngle( mAngle ); sl->setOffset( mOffset ); sl->setOffsetUnit( mOffsetUnit ); + sl->setOffsetMapUnitScale( mOffsetMapUnitScale ); copyDataDefinedProperties( sl ); return sl; } @@ -793,6 +821,26 @@ double QgsGradientFillSymbolLayerV2::estimateMaxBleed() const return offsetBleed; } +void QgsGradientFillSymbolLayerV2::setOutputUnit( QgsSymbolV2::OutputUnit unit ) +{ + mOffsetUnit = unit; +} + +QgsSymbolV2::OutputUnit QgsGradientFillSymbolLayerV2::outputUnit() const +{ + return mOffsetUnit; +} + +void QgsGradientFillSymbolLayerV2::setMapUnitScale( const QgsMapUnitScale &scale ) +{ + mOffsetMapUnitScale = scale; +} + +QgsMapUnitScale QgsGradientFillSymbolLayerV2::mapUnitScale() const +{ + return mOffsetMapUnitScale; +} + //QgsShapeburstFillSymbolLayer QgsShapeburstFillSymbolLayerV2::QgsShapeburstFillSymbolLayerV2( QColor color, QColor color2, ShapeburstColorType colorType, @@ -871,6 +919,14 @@ QgsSymbolLayerV2* QgsShapeburstFillSymbolLayerV2::create( const QgsStringMap& pr { sl->setDistanceUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( props["distance_unit"] ) ); } + if ( props.contains( "offset_map_unit_scale" ) ) + { + sl->setOffsetMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( props["offset_map_unit_scale"] ) ); + } + if ( props.contains( "distance_map_unit_scale" ) ) + { + sl->setDistanceMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( props["distance_map_unit_scale"] ) ); + } if ( props.contains( "ignore_rings" ) ) { sl->setIgnoreRings( props["ignore_rings"].toInt() ); @@ -978,8 +1034,8 @@ void QgsShapeburstFillSymbolLayerV2::renderPolygon( const QPolygonF& points, QLi QPointF offset; if ( !mOffset.isNull() ) { - offset.setX( mOffset.x() * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit ) ); - offset.setY( mOffset.y() * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit ) ); + offset.setX( mOffset.x() * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit, mOffsetMapUnitScale ) ); + offset.setY( mOffset.y() * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit, mOffsetMapUnitScale ) ); p->translate( offset ); } _renderPolygon( p, points, rings, context ); @@ -1004,7 +1060,7 @@ void QgsShapeburstFillSymbolLayerV2::renderPolygon( const QPolygonF& points, QLi { //convert max distance to pixels const QgsRenderContext& ctx = context.renderContext(); - outputPixelMaxDist = maxDistance * QgsSymbolLayerV2Utils::pixelSizeScaleFactor( ctx, mDistanceUnit ); + outputPixelMaxDist = maxDistance * QgsSymbolLayerV2Utils::pixelSizeScaleFactor( ctx, mDistanceUnit, mDistanceMapUnitScale ); } //if we are using the two color mode, create a gradient ramp @@ -1098,8 +1154,8 @@ void QgsShapeburstFillSymbolLayerV2::renderPolygon( const QPolygonF& points, QLi QPointF offset; if ( !mOffset.isNull() ) { - offset.setX( mOffset.x() * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit ) ); - offset.setY( mOffset.y() * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit ) ); + offset.setX( mOffset.x() * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit, mOffsetMapUnitScale ) ); + offset.setY( mOffset.y() * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit, mOffsetMapUnitScale ) ); p->translate( offset ); } @@ -1291,9 +1347,11 @@ QgsStringMap QgsShapeburstFillSymbolLayerV2::properties() const map["use_whole_shape"] = QString::number( mUseWholeShape ); map["max_distance"] = QString::number( mMaxDistance ); map["distance_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mDistanceUnit ); + map["distance_map_unit_scale"] = QgsSymbolLayerV2Utils::encodeMapUnitScale( mDistanceMapUnitScale ); map["ignore_rings"] = QString::number( mIgnoreRings ); map["offset"] = QgsSymbolLayerV2Utils::encodePoint( mOffset ); map["offset_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mOffsetUnit ); + map["offset_map_unit_scale"] = QgsSymbolLayerV2Utils::encodeMapUnitScale( mOffsetMapUnitScale ); saveDataDefinedProperties( map ); @@ -1313,9 +1371,11 @@ QgsSymbolLayerV2* QgsShapeburstFillSymbolLayerV2::clone() const sl->setColorRamp( mGradientRamp->clone() ); } sl->setDistanceUnit( mDistanceUnit ); + sl->setDistanceMapUnitScale( mDistanceMapUnitScale ); sl->setIgnoreRings( mIgnoreRings ); sl->setOffset( mOffset ); sl->setOffsetUnit( mOffsetUnit ); + sl->setOffsetMapUnitScale( mOffsetMapUnitScale ); copyDataDefinedProperties( sl ); return sl; } @@ -1326,6 +1386,37 @@ double QgsShapeburstFillSymbolLayerV2::estimateMaxBleed() const return offsetBleed; } +void QgsShapeburstFillSymbolLayerV2::setOutputUnit( QgsSymbolV2::OutputUnit unit ) +{ + mDistanceUnit = unit; + mOffsetUnit = unit; +} + +QgsSymbolV2::OutputUnit QgsShapeburstFillSymbolLayerV2::outputUnit() const +{ + if ( mDistanceUnit == mOffsetUnit ) + { + return mDistanceUnit; + } + return QgsSymbolV2::Mixed; +} + +void QgsShapeburstFillSymbolLayerV2::setMapUnitScale( const QgsMapUnitScale &scale ) +{ + mDistanceMapUnitScale = scale; + mOffsetMapUnitScale = scale; +} + +QgsMapUnitScale QgsShapeburstFillSymbolLayerV2::mapUnitScale() const +{ + if ( mDistanceMapUnitScale == mOffsetMapUnitScale ) + { + return mDistanceMapUnitScale; + } + return QgsMapUnitScale(); +} + + //QgsImageFillSymbolLayer QgsImageFillSymbolLayer::QgsImageFillSymbolLayer(): mOutlineWidth( 0.0 ), mOutlineWidthUnit( QgsSymbolV2::MM ), mOutline( 0 ) @@ -1413,6 +1504,25 @@ bool QgsImageFillSymbolLayer::setSubSymbol( QgsSymbolV2* symbol ) return false; } +void QgsImageFillSymbolLayer::setOutputUnit( QgsSymbolV2::OutputUnit unit ) +{ + mOutlineWidthUnit = unit; +} + +QgsSymbolV2::OutputUnit QgsImageFillSymbolLayer::outputUnit() const +{ + return mOutlineWidthUnit; +} + +void QgsImageFillSymbolLayer::setMapUnitScale( const QgsMapUnitScale& scale ) +{ + mOutlineWidthMapUnitScale = scale; +} + +QgsMapUnitScale QgsImageFillSymbolLayer::mapUnitScale() const +{ + return mOutlineWidthMapUnitScale; +} double QgsImageFillSymbolLayer::estimateMaxBleed() const { @@ -1496,6 +1606,7 @@ QgsSVGFillSymbolLayer::~QgsSVGFillSymbolLayer() void QgsSVGFillSymbolLayer::setOutputUnit( QgsSymbolV2::OutputUnit unit ) { + QgsImageFillSymbolLayer::setOutputUnit( unit ); mPatternWidthUnit = unit; mSvgOutlineWidthUnit = unit; mOutlineWidthUnit = unit; @@ -1503,14 +1614,33 @@ void QgsSVGFillSymbolLayer::setOutputUnit( QgsSymbolV2::OutputUnit unit ) QgsSymbolV2::OutputUnit QgsSVGFillSymbolLayer::outputUnit() const { - QgsSymbolV2::OutputUnit unit = mPatternWidthUnit; - if ( mSvgOutlineWidthUnit != unit || mOutlineWidthUnit != unit ) + QgsSymbolV2::OutputUnit unit = QgsImageFillSymbolLayer::outputUnit(); + if ( mPatternWidthUnit != unit || mSvgOutlineWidthUnit != unit || mOutlineWidthUnit != unit ) { return QgsSymbolV2::Mixed; } return unit; } +void QgsSVGFillSymbolLayer::setMapUnitScale( const QgsMapUnitScale &scale ) +{ + QgsImageFillSymbolLayer::setMapUnitScale( scale ); + mPatternWidthMapUnitScale = scale; + mSvgOutlineWidthMapUnitScale = scale; + mOutlineWidthMapUnitScale = scale; +} + +QgsMapUnitScale QgsSVGFillSymbolLayer::mapUnitScale() const +{ + if ( QgsImageFillSymbolLayer::mapUnitScale() == mPatternWidthMapUnitScale && + mPatternWidthMapUnitScale == mSvgOutlineWidthMapUnitScale && + mSvgOutlineWidthMapUnitScale == mOutlineWidthMapUnitScale ) + { + return mPatternWidthMapUnitScale; + } + return QgsMapUnitScale(); +} + void QgsSVGFillSymbolLayer::setSvgFilePath( const QString& svgPath ) { mSvgData = QgsSvgCache::instance()->getImageData( svgPath ); @@ -1575,14 +1705,26 @@ QgsSymbolLayerV2* QgsSVGFillSymbolLayer::create( const QgsStringMap& properties { symbolLayer->setPatternWidthUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( properties["pattern_width_unit"] ) ); } + if ( properties.contains( "pattern_width_map_unit_scale" ) ) + { + symbolLayer->setPatternWidthMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( properties["pattern_width_map_unit_scale"] ) ); + } if ( properties.contains( "svg_outline_width_unit" ) ) { symbolLayer->setSvgOutlineWidthUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( properties["svg_outline_width_unit"] ) ); } + if ( properties.contains( "svg_outline_width_map_unit_scale" ) ) + { + symbolLayer->setSvgOutlineWidthMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( properties["svg_outline_width_map_unit_scale"] ) ); + } if ( properties.contains( "outline_width_unit" ) ) { symbolLayer->setOutlineWidthUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( properties["outline_width_unit"] ) ); } + if ( properties.contains( "outline_width_map_unit_scale" ) ) + { + symbolLayer->setOutlineWidthMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( properties["outline_width_map_unit_scale"] ) ); + } if ( properties.contains( "width_expression" ) ) symbolLayer->setDataDefinedProperty( "width", properties["width_expression"] ); @@ -1607,7 +1749,8 @@ QString QgsSVGFillSymbolLayer::layerType() const void QgsSVGFillSymbolLayer::applyPattern( QBrush& brush, const QString& svgFilePath, double patternWidth, QgsSymbolV2::OutputUnit patternWidthUnit, const QColor& svgFillColor, const QColor& svgOutlineColor, double svgOutlineWidth, - QgsSymbolV2::OutputUnit svgOutlineWidthUnit, const QgsSymbolV2RenderContext& context ) + QgsSymbolV2::OutputUnit svgOutlineWidthUnit, const QgsSymbolV2RenderContext& context, + const QgsMapUnitScale& patternWidthMapUnitScale, const QgsMapUnitScale& svgOutlineWidthMapUnitScale ) { if ( mSvgViewBox.isNull() ) { @@ -1616,7 +1759,7 @@ void QgsSVGFillSymbolLayer::applyPattern( QBrush& brush, const QString& svgFileP delete mSvgPattern; mSvgPattern = 0; - double size = patternWidth * QgsSymbolLayerV2Utils::pixelSizeScaleFactor( context.renderContext(), patternWidthUnit ); + double size = patternWidth * QgsSymbolLayerV2Utils::pixelSizeScaleFactor( context.renderContext(), patternWidthUnit, patternWidthMapUnitScale ); if (( int )size < 1.0 || 10000.0 < size ) { @@ -1626,7 +1769,7 @@ void QgsSVGFillSymbolLayer::applyPattern( QBrush& brush, const QString& svgFileP else { bool fitsInCache = true; - double outlineWidth = svgOutlineWidth * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), svgOutlineWidthUnit ); + double outlineWidth = svgOutlineWidth * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), svgOutlineWidthUnit, svgOutlineWidthMapUnitScale ); const QImage& patternImage = QgsSvgCache::instance()->svgAsImage( svgFilePath, size, svgFillColor, svgOutlineColor, outlineWidth, context.renderContext().scaleFactor(), context.renderContext().rasterScaleFactor(), fitsInCache ); if ( !fitsInCache ) @@ -1664,7 +1807,7 @@ void QgsSVGFillSymbolLayer::applyPattern( QBrush& brush, const QString& svgFileP void QgsSVGFillSymbolLayer::startRender( QgsSymbolV2RenderContext& context ) { - applyPattern( mBrush, mSvgFilePath, mPatternWidth, mPatternWidthUnit, mSvgFillColor, mSvgOutlineColor, mSvgOutlineWidth, mSvgOutlineWidthUnit, context ); + applyPattern( mBrush, mSvgFilePath, mPatternWidth, mPatternWidthUnit, mSvgFillColor, mSvgOutlineColor, mSvgOutlineWidth, mSvgOutlineWidthUnit, context, mPatternWidthMapUnitScale, mSvgOutlineWidthMapUnitScale ); if ( mOutline ) { @@ -1703,9 +1846,12 @@ QgsStringMap QgsSVGFillSymbolLayer::properties() const map.insert( "svgOutlineWidth", QString::number( mSvgOutlineWidth ) ); //units - map["pattern_width_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mPatternWidthUnit ); - map["svg_outline_width_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mSvgOutlineWidthUnit ); - map["outline_width_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mOutlineWidthUnit ); + map.insert( "pattern_width_unit", QgsSymbolLayerV2Utils::encodeOutputUnit( mPatternWidthUnit ) ); + map.insert( "pattern_width_map_unit_scale", QgsSymbolLayerV2Utils::encodeMapUnitScale( mPatternWidthMapUnitScale ) ); + map.insert( "svg_outline_width_unit", QgsSymbolLayerV2Utils::encodeOutputUnit( mSvgOutlineWidthUnit ) ); + map.insert( "svg_outline_width_map_unit_scale", QgsSymbolLayerV2Utils::encodeMapUnitScale( mSvgOutlineWidthMapUnitScale ) ); + map.insert( "outline_width_unit", QgsSymbolLayerV2Utils::encodeOutputUnit( mOutlineWidthUnit ) ); + map.insert( "outline_width_map_unit_scale", QgsSymbolLayerV2Utils::encodeMapUnitScale( mOutlineWidthMapUnitScale ) ); saveDataDefinedProperties( map ); return map; @@ -1727,8 +1873,11 @@ QgsSymbolLayerV2* QgsSVGFillSymbolLayer::clone() const } clonedLayer->setPatternWidthUnit( mPatternWidthUnit ); + clonedLayer->setPatternWidthMapUnitScale( mPatternWidthMapUnitScale ); clonedLayer->setSvgOutlineWidthUnit( mSvgOutlineWidthUnit ); + clonedLayer->setSvgOutlineWidthMapUnitScale( mSvgOutlineWidthMapUnitScale ); clonedLayer->setOutlineWidthUnit( mOutlineWidthUnit ); + clonedLayer->setOutlineWidthMapUnitScale( mOutlineWidthMapUnitScale ); if ( mOutline ) { @@ -1899,7 +2048,7 @@ void QgsSVGFillSymbolLayer::applyDataDefinedSettings( const QgsSymbolV2RenderCon outlineWidth = outlineWidthExpression->evaluate( const_cast( context.feature() ) ).toDouble(); } applyPattern( mBrush, svgFile, width, mPatternWidthUnit, svgFillColor, svgOutlineColor, outlineWidth, - mSvgOutlineWidthUnit, context ); + mSvgOutlineWidthUnit, context, mPatternWidthMapUnitScale, mSvgOutlineWidthMapUnitScale ); } @@ -2010,6 +2159,7 @@ double QgsLinePatternFillSymbolLayer::estimateMaxBleed() const void QgsLinePatternFillSymbolLayer::setOutputUnit( QgsSymbolV2::OutputUnit unit ) { + QgsImageFillSymbolLayer::setOutputUnit( unit ); mDistanceUnit = unit; mLineWidthUnit = unit; mOffsetUnit = unit; @@ -2017,14 +2167,33 @@ void QgsLinePatternFillSymbolLayer::setOutputUnit( QgsSymbolV2::OutputUnit unit QgsSymbolV2::OutputUnit QgsLinePatternFillSymbolLayer::outputUnit() const { - QgsSymbolV2::OutputUnit unit = mDistanceUnit; - if ( mLineWidthUnit != unit || mOffsetUnit != unit ) + QgsSymbolV2::OutputUnit unit = QgsImageFillSymbolLayer::outputUnit(); + if ( mDistanceUnit != unit || mLineWidthUnit != unit || mOffsetUnit != unit ) { return QgsSymbolV2::Mixed; } return unit; } +void QgsLinePatternFillSymbolLayer::setMapUnitScale( const QgsMapUnitScale &scale ) +{ + QgsImageFillSymbolLayer::setMapUnitScale( scale ); + mDistanceMapUnitScale = scale; + mLineWidthMapUnitScale = scale; + mOffsetMapUnitScale = scale; +} + +QgsMapUnitScale QgsLinePatternFillSymbolLayer::mapUnitScale() const +{ + if ( QgsImageFillSymbolLayer::mapUnitScale() == mDistanceMapUnitScale && + mDistanceMapUnitScale == mLineWidthMapUnitScale && + mLineWidthMapUnitScale == mOffsetMapUnitScale ) + { + return mDistanceMapUnitScale; + } + return QgsMapUnitScale(); +} + QgsSymbolLayerV2* QgsLinePatternFillSymbolLayer::create( const QgsStringMap& properties ) { QgsLinePatternFillSymbolLayer* patternLayer = new QgsLinePatternFillSymbolLayer(); @@ -2071,14 +2240,35 @@ QgsSymbolLayerV2* QgsLinePatternFillSymbolLayer::create( const QgsStringMap& pro { patternLayer->setDistanceUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( properties["distance_unit"] ) ); } + if ( properties.contains( "distance_map_unit_scale" ) ) + { + patternLayer->setDistanceMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( properties["distance_map_unit_scale"] ) ); + } if ( properties.contains( "line_width_unit" ) ) { patternLayer->setLineWidthUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( properties["line_width_unit"] ) ); } + if ( properties.contains( "line_width_map_unit_scale" ) ) + { + patternLayer->setLineWidthMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( properties["line_width_map_unit_scale"] ) ); + } if ( properties.contains( "offset_unit" ) ) { patternLayer->setOffsetUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( properties["offset_unit"] ) ); } + if ( properties.contains( "offset_map_unit_scale" ) ) + { + patternLayer->setOffsetMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( properties["offset_map_unit_scale"] ) ); + } + if ( properties.contains( "outline_width_unit" ) ) + { + patternLayer->setOutlineWidthUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( properties["outline_width_unit"] ) ); + } + if ( properties.contains( "outline_width_map_unit_scale" ) ) + { + patternLayer->setOutlineWidthMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( properties["outline_width_map_unit_scale"] ) ); + } + //data defined properties if ( properties.contains( "lineangle_expression" ) ) @@ -2125,9 +2315,9 @@ void QgsLinePatternFillSymbolLayer::applyPattern( const QgsSymbolV2RenderContext } const QgsRenderContext& ctx = context.renderContext(); - //double outlinePixelWidth = lineWidth * QgsSymbolLayerV2Utils::pixelSizeScaleFactor( ctx, mLineWidthUnit ); - double outputPixelDist = distance * QgsSymbolLayerV2Utils::pixelSizeScaleFactor( ctx, mDistanceUnit ); - double outputPixelOffset = mOffset * QgsSymbolLayerV2Utils::pixelSizeScaleFactor( ctx, mOffsetUnit ); + //double outlinePixelWidth = lineWidth * QgsSymbolLayerV2Utils::pixelSizeScaleFactor( ctx, mLineWidthUnit, mLineWidthMapUnitScale ); + double outputPixelDist = distance * QgsSymbolLayerV2Utils::pixelSizeScaleFactor( ctx, mDistanceUnit, mDistanceMapUnitScale ); + double outputPixelOffset = mOffset * QgsSymbolLayerV2Utils::pixelSizeScaleFactor( ctx, mOffsetUnit, mOffsetMapUnitScale ); // To get all patterns into image, we have to consider symbols size (estimateMaxBleed()). // For marker lines we have to get markers interval. @@ -2149,7 +2339,7 @@ void QgsLinePatternFillSymbolLayer::applyPattern( const QgsSymbolV2RenderContext QgsMarkerLineSymbolLayerV2 *markerLineLayer = dynamic_cast( layer ); if ( markerLineLayer ) { - double outputPixelLayerInterval = markerLineLayer->interval() * QgsSymbolLayerV2Utils::pixelSizeScaleFactor( ctx, markerLineLayer->intervalUnit() ); + double outputPixelLayerInterval = markerLineLayer->interval() * QgsSymbolLayerV2Utils::pixelSizeScaleFactor( ctx, markerLineLayer->intervalUnit(), markerLineLayer->intervalMapUnitScale() ); // There may be multiple marker lines with different intervals. // In theory we should find the least common multiple, but that could be too @@ -2420,6 +2610,11 @@ QgsStringMap QgsLinePatternFillSymbolLayer::properties() const map.insert( "distance_unit", QgsSymbolLayerV2Utils::encodeOutputUnit( mDistanceUnit ) ); map.insert( "line_width_unit", QgsSymbolLayerV2Utils::encodeOutputUnit( mLineWidthUnit ) ); map.insert( "offset_unit", QgsSymbolLayerV2Utils::encodeOutputUnit( mOffsetUnit ) ); + map.insert( "distance_map_unit_scale", QgsSymbolLayerV2Utils::encodeMapUnitScale( mDistanceMapUnitScale ) ); + map.insert( "line_width_map_unit_scale", QgsSymbolLayerV2Utils::encodeMapUnitScale( mLineWidthMapUnitScale ) ); + map.insert( "offset_map_unit_scale", QgsSymbolLayerV2Utils::encodeMapUnitScale( mOffsetMapUnitScale ) ); + map.insert( "outline_width_unit", QgsSymbolLayerV2Utils::encodeOutputUnit( mOutlineWidthUnit ) ); + map.insert( "outline_width_map_unit_scale", QgsSymbolLayerV2Utils::encodeMapUnitScale( mOutlineWidthMapUnitScale ) ); saveDataDefinedProperties( map ); return map; } @@ -2431,10 +2626,6 @@ QgsSymbolLayerV2* QgsLinePatternFillSymbolLayer::clone() const { clonedLayer->setSubSymbol( mFillLineSymbol->clone() ); } - clonedLayer->setDistanceUnit( mDistanceUnit ); - clonedLayer->setLineWidthUnit( mLineWidthUnit ); - clonedLayer->setOffsetUnit( mOffsetUnit ); - copyDataDefinedProperties( clonedLayer ); return clonedLayer; } @@ -2620,6 +2811,7 @@ QgsPointPatternFillSymbolLayer::~QgsPointPatternFillSymbolLayer() void QgsPointPatternFillSymbolLayer::setOutputUnit( QgsSymbolV2::OutputUnit unit ) { + QgsImageFillSymbolLayer::setOutputUnit( unit ); mDistanceXUnit = unit; mDistanceYUnit = unit; mDisplacementXUnit = unit; @@ -2628,14 +2820,35 @@ void QgsPointPatternFillSymbolLayer::setOutputUnit( QgsSymbolV2::OutputUnit unit QgsSymbolV2::OutputUnit QgsPointPatternFillSymbolLayer::outputUnit() const { - QgsSymbolV2::OutputUnit unit = mDistanceXUnit; - if ( mDistanceYUnit != unit || mDisplacementXUnit != unit || mDisplacementYUnit != unit ) + QgsSymbolV2::OutputUnit unit = QgsImageFillSymbolLayer::outputUnit(); + if ( mDistanceXUnit != unit || mDistanceYUnit != unit || mDisplacementXUnit != unit || mDisplacementYUnit != unit ) { return QgsSymbolV2::Mixed; } return unit; } +void QgsPointPatternFillSymbolLayer::setMapUnitScale( const QgsMapUnitScale &scale ) +{ + QgsImageFillSymbolLayer::setMapUnitScale( scale ); + mDistanceXMapUnitScale = scale; + mDistanceYMapUnitScale = scale; + mDisplacementXMapUnitScale = scale; + mDisplacementYMapUnitScale = scale; +} + +QgsMapUnitScale QgsPointPatternFillSymbolLayer::mapUnitScale() const +{ + if ( QgsImageFillSymbolLayer::mapUnitScale() == mDistanceXMapUnitScale && + mDistanceXMapUnitScale == mDistanceYMapUnitScale && + mDistanceYMapUnitScale == mDisplacementXMapUnitScale && + mDisplacementXMapUnitScale == mDisplacementYMapUnitScale ) + { + return mDistanceXMapUnitScale; + } + return QgsMapUnitScale(); +} + QgsSymbolLayerV2* QgsPointPatternFillSymbolLayer::create( const QgsStringMap& properties ) { QgsPointPatternFillSymbolLayer* layer = new QgsPointPatternFillSymbolLayer(); @@ -2660,18 +2873,42 @@ QgsSymbolLayerV2* QgsPointPatternFillSymbolLayer::create( const QgsStringMap& pr { layer->setDistanceXUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( properties["distance_x_unit"] ) ); } + if ( properties.contains( "distance_x_map_unit_scale" ) ) + { + layer->setDistanceXMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( properties["distance_x_map_unit_scale"] ) ); + } if ( properties.contains( "distance_y_unit" ) ) { layer->setDistanceYUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( properties["distance_y_unit"] ) ); } + if ( properties.contains( "distance_y_map_unit_scale" ) ) + { + layer->setDistanceYMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( properties["distance_y_map_unit_scale"] ) ); + } if ( properties.contains( "displacement_x_unit" ) ) { layer->setDisplacementXUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( properties["displacement_x_unit"] ) ); } + if ( properties.contains( "displacement_x_map_unit_scale" ) ) + { + layer->setDisplacementXMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( properties["displacement_x_map_unit_scale"] ) ); + } if ( properties.contains( "displacement_y_unit" ) ) { layer->setDisplacementYUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( properties["displacement_y_unit"] ) ); } + if ( properties.contains( "displacement_y_map_unit_scale" ) ) + { + layer->setDisplacementYMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( properties["displacement_y_map_unit_scale"] ) ); + } + if ( properties.contains( "outline_width_unit" ) ) + { + layer->setOutlineWidthUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( properties["outline_width_unit"] ) ); + } + if ( properties.contains( "outline_width_map_unit_scale" ) ) + { + layer->setOutlineWidthMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( properties["outline_width_map_unit_scale"] ) ); + } //data defined properties if ( properties.contains( "distance_x_expression" ) ) @@ -2703,8 +2940,8 @@ void QgsPointPatternFillSymbolLayer::applyPattern( const QgsSymbolV2RenderContex { //render 3 rows and columns in one go to easily incorporate displacement const QgsRenderContext& ctx = context.renderContext(); - double width = distanceX * QgsSymbolLayerV2Utils::pixelSizeScaleFactor( ctx, mDistanceXUnit ) * 2.0; - double height = distanceY * QgsSymbolLayerV2Utils::pixelSizeScaleFactor( ctx, mDistanceYUnit ) * 2.0; + double width = distanceX * QgsSymbolLayerV2Utils::pixelSizeScaleFactor( ctx, mDistanceXUnit, mDistanceXMapUnitScale ) * 2.0; + double height = distanceY * QgsSymbolLayerV2Utils::pixelSizeScaleFactor( ctx, mDistanceYUnit, mDisplacementYMapUnitScale ) * 2.0; if ( width > 10000 || height > 10000 ) //protect symbol layer from eating too much memory { @@ -2738,8 +2975,8 @@ void QgsPointPatternFillSymbolLayer::applyPattern( const QgsSymbolV2RenderContex mMarkerSymbol->renderPoint( QPointF( width, height ), context.feature(), pointRenderContext ); //render displaced points - double displacementPixelX = displacementX * QgsSymbolLayerV2Utils::pixelSizeScaleFactor( ctx, mDisplacementXUnit ); - double displacementPixelY = displacementY * QgsSymbolLayerV2Utils::pixelSizeScaleFactor( ctx, mDisplacementYUnit ); + double displacementPixelX = displacementX * QgsSymbolLayerV2Utils::pixelSizeScaleFactor( ctx, mDisplacementXUnit, mDisplacementXMapUnitScale ); + double displacementPixelY = displacementY * QgsSymbolLayerV2Utils::pixelSizeScaleFactor( ctx, mDisplacementYUnit, mDisplacementYMapUnitScale ); mMarkerSymbol->renderPoint( QPointF( width / 2.0, -displacementPixelY ), context.feature(), pointRenderContext ); mMarkerSymbol->renderPoint( QPointF( displacementPixelX, height / 2.0 ), context.feature(), pointRenderContext ); mMarkerSymbol->renderPoint( QPointF( width / 2.0 + displacementPixelX, height / 2.0 - displacementPixelY ), context.feature(), pointRenderContext ); @@ -2785,17 +3022,23 @@ void QgsPointPatternFillSymbolLayer::stopRender( QgsSymbolV2RenderContext& conte QgsStringMap QgsPointPatternFillSymbolLayer::properties() const { - QgsStringMap propertyMap; - propertyMap["distance_x"] = QString::number( mDistanceX ); - propertyMap["distance_y"] = QString::number( mDistanceY ); - propertyMap["displacement_x"] = QString::number( mDisplacementX ); - propertyMap["displacement_y"] = QString::number( mDisplacementY ); - propertyMap["distance_x_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mDistanceXUnit ); - propertyMap["distance_y_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mDistanceYUnit ); - propertyMap["displacement_x_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mDisplacementXUnit ); - propertyMap["displacement_y_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mDisplacementYUnit ); - saveDataDefinedProperties( propertyMap ); - return propertyMap; + QgsStringMap map; + map.insert( "distance_x", QString::number( mDistanceX ) ); + map.insert( "distance_y", QString::number( mDistanceY ) ); + map.insert( "displacement_x", QString::number( mDisplacementX ) ); + map.insert( "displacement_y", QString::number( mDisplacementY ) ); + map.insert( "distance_x_unit", QgsSymbolLayerV2Utils::encodeOutputUnit( mDistanceXUnit ) ); + map.insert( "distance_y_unit", QgsSymbolLayerV2Utils::encodeOutputUnit( mDistanceYUnit ) ); + map.insert( "displacement_x_unit", QgsSymbolLayerV2Utils::encodeOutputUnit( mDisplacementXUnit ) ); + map.insert( "displacement_y_unit", QgsSymbolLayerV2Utils::encodeOutputUnit( mDisplacementYUnit ) ); + map.insert( "distance_x_map_unit_scale", QgsSymbolLayerV2Utils::encodeMapUnitScale( mDistanceXMapUnitScale ) ); + map.insert( "distance_y_map_unit_scale", QgsSymbolLayerV2Utils::encodeMapUnitScale( mDistanceYMapUnitScale ) ); + map.insert( "displacement_x_map_unit_scale", QgsSymbolLayerV2Utils::encodeMapUnitScale( mDisplacementXMapUnitScale ) ); + map.insert( "displacement_y_map_unit_scale", QgsSymbolLayerV2Utils::encodeMapUnitScale( mDisplacementYMapUnitScale ) ); + map.insert( "outline_width_unit", QgsSymbolLayerV2Utils::encodeOutputUnit( mOutlineWidthUnit ) ); + map.insert( "outline_width_map_unit_scale", QgsSymbolLayerV2Utils::encodeMapUnitScale( mOutlineWidthMapUnitScale ) ); + saveDataDefinedProperties( map ); + return map; } QgsSymbolLayerV2* QgsPointPatternFillSymbolLayer::clone() const @@ -2805,7 +3048,6 @@ QgsSymbolLayerV2* QgsPointPatternFillSymbolLayer::clone() const { clonedLayer->setSubSymbol( mMarkerSymbol->clone() ); } - copyDataDefinedProperties( clonedLayer ); return clonedLayer; } @@ -2978,6 +3220,8 @@ QgsStringMap QgsCentroidFillSymbolLayerV2::properties() const QgsSymbolLayerV2* QgsCentroidFillSymbolLayerV2::clone() const { QgsCentroidFillSymbolLayerV2* x = new QgsCentroidFillSymbolLayerV2(); + x->mAngle = mAngle; + x->mColor = mColor; x->setSubSymbol( mMarker->clone() ); return x; } @@ -3039,6 +3283,14 @@ QSet QgsCentroidFillSymbolLayerV2::usedAttributes() const return attributes; } +void QgsCentroidFillSymbolLayerV2::setOutputUnit( QgsSymbolV2::OutputUnit unit ) +{ + if ( mMarker ) + { + mMarker->setOutputUnit( unit ); + } +} + QgsSymbolV2::OutputUnit QgsCentroidFillSymbolLayerV2::outputUnit() const { if ( mMarker ) @@ -3047,3 +3299,22 @@ QgsSymbolV2::OutputUnit QgsCentroidFillSymbolLayerV2::outputUnit() const } return QgsSymbolV2::Mixed; //mOutputUnit; } + +void QgsCentroidFillSymbolLayerV2::setMapUnitScale( const QgsMapUnitScale &scale ) +{ + if ( mMarker ) + { + mMarker->setMapUnitScale( scale ); + } +} + +QgsMapUnitScale QgsCentroidFillSymbolLayerV2::mapUnitScale() const +{ + if ( mMarker ) + { + return mMarker->mapUnitScale(); + } + return QgsMapUnitScale(); +} + + diff --git a/src/core/symbology-ng/qgsfillsymbollayerv2.h b/src/core/symbology-ng/qgsfillsymbollayerv2.h index d561eef634df..c6ed7c529b62 100644 --- a/src/core/symbology-ng/qgsfillsymbollayerv2.h +++ b/src/core/symbology-ng/qgsfillsymbollayerv2.h @@ -1,9 +1,9 @@ /*************************************************************************** - qgsfillsymbollayerv2.h - --------------------- - begin : November 2009 - copyright : (C) 2009 by Martin Dobias - email : wonder dot sk at gmail dot com + qgsfillsymbollayerv2.h + --------------------- + begin : November 2009 + copyright : (C) 2009 by Martin Dobias + email : wonder dot sk at gmail dot com *************************************************************************** * * * This program is free software; you can redistribute it and/or modify * @@ -99,12 +99,21 @@ class CORE_EXPORT QgsSimpleFillSymbolLayerV2 : public QgsFillSymbolLayerV2 void setBorderWidthUnit( QgsSymbolV2::OutputUnit unit ) { mBorderWidthUnit = unit; } QgsSymbolV2::OutputUnit borderWidthUnit() const { return mBorderWidthUnit; } + void setBorderWidthMapUnitScale( const QgsMapUnitScale& scale ) { mBorderWidthMapUnitScale = scale; } + const QgsMapUnitScale& borderWidthMapUnitScale() const { return mBorderWidthMapUnitScale; } + void setOffsetUnit( QgsSymbolV2::OutputUnit unit ) { mOffsetUnit = unit; } QgsSymbolV2::OutputUnit offsetUnit() const { return mOffsetUnit; } + void setOffsetMapUnitScale( const QgsMapUnitScale& scale ) { mOffsetMapUnitScale = scale; } + const QgsMapUnitScale& offsetMapUnitScale() const { return mOffsetMapUnitScale; } + void setOutputUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit outputUnit() const; + void setMapUnitScale( const QgsMapUnitScale &scale ); + QgsMapUnitScale mapUnitScale() const; + double estimateMaxBleed() const; double dxfWidth( const QgsDxfExport& e, const QgsSymbolV2RenderContext& context ) const; @@ -119,12 +128,14 @@ class CORE_EXPORT QgsSimpleFillSymbolLayerV2 : public QgsFillSymbolLayerV2 Qt::PenStyle mBorderStyle; double mBorderWidth; QgsSymbolV2::OutputUnit mBorderWidthUnit; + QgsMapUnitScale mBorderWidthMapUnitScale; Qt::PenJoinStyle mPenJoinStyle; QPen mPen; QPen mSelPen; QPointF mOffset; QgsSymbolV2::OutputUnit mOffsetUnit; + QgsMapUnitScale mOffsetMapUnitScale; private: //helper functions for data defined symbology @@ -194,56 +205,65 @@ class CORE_EXPORT QgsGradientFillSymbolLayerV2 : public QgsFillSymbolLayerV2 double estimateMaxBleed() const; /**Type of gradient, eg linear or radial*/ - GradientType gradientType() const { return mGradientType; }; - void setGradientType( GradientType gradientType ) { mGradientType = gradientType; }; + GradientType gradientType() const { return mGradientType; } + void setGradientType( GradientType gradientType ) { mGradientType = gradientType; } /**Gradient color mode, controls how gradient color stops are created*/ - GradientColorType gradientColorType() const { return mGradientColorType; }; - void setGradientColorType( GradientColorType gradientColorType ) { mGradientColorType = gradientColorType; }; + GradientColorType gradientColorType() const { return mGradientColorType; } + void setGradientColorType( GradientColorType gradientColorType ) { mGradientColorType = gradientColorType; } /**Color ramp used for the gradient fill, only used if the gradient color type is set to ColorRamp*/ - QgsVectorColorRampV2* colorRamp() { return mGradientRamp; }; + QgsVectorColorRampV2* colorRamp() { return mGradientRamp; } void setColorRamp( QgsVectorColorRampV2* ramp ); /**Color for endpoint of gradient, only used if the gradient color type is set to SimpleTwoColor*/ - QColor color2() const { return mColor2; }; - void setColor2( QColor color2 ) { mColor2 = color2; }; + QColor color2() const { return mColor2; } + void setColor2( QColor color2 ) { mColor2 = color2; } /**Coordinate mode for gradient. Controls how the gradient stops are positioned.*/ - GradientCoordinateMode coordinateMode() const { return mCoordinateMode; }; - void setCoordinateMode( GradientCoordinateMode coordinateMode ) { mCoordinateMode = coordinateMode; }; + GradientCoordinateMode coordinateMode() const { return mCoordinateMode; } + void setCoordinateMode( GradientCoordinateMode coordinateMode ) { mCoordinateMode = coordinateMode; } /**Gradient spread mode. Controls how the gradient behaves outside of the predefined stops*/ - GradientSpread gradientSpread() const { return mGradientSpread; }; - void setGradientSpread( GradientSpread gradientSpread ) { mGradientSpread = gradientSpread; }; + GradientSpread gradientSpread() const { return mGradientSpread; } + void setGradientSpread( GradientSpread gradientSpread ) { mGradientSpread = gradientSpread; } /**Starting point of gradient fill, in the range [0,0] - [1,1]*/ - void setReferencePoint1( QPointF referencePoint ) { mReferencePoint1 = referencePoint; }; - QPointF referencePoint1() const { return mReferencePoint1; }; + void setReferencePoint1( QPointF referencePoint ) { mReferencePoint1 = referencePoint; } + QPointF referencePoint1() const { return mReferencePoint1; } /**Sets the starting point of the gradient to be the feature centroid*/ - void setReferencePoint1IsCentroid( bool isCentroid ) { mReferencePoint1IsCentroid = isCentroid; }; - bool referencePoint1IsCentroid() const { return mReferencePoint1IsCentroid; }; + void setReferencePoint1IsCentroid( bool isCentroid ) { mReferencePoint1IsCentroid = isCentroid; } + bool referencePoint1IsCentroid() const { return mReferencePoint1IsCentroid; } /**End point of gradient fill, in the range [0,0] - [1,1]*/ - void setReferencePoint2( QPointF referencePoint ) { mReferencePoint2 = referencePoint; }; - QPointF referencePoint2() const { return mReferencePoint2; }; + void setReferencePoint2( QPointF referencePoint ) { mReferencePoint2 = referencePoint; } + QPointF referencePoint2() const { return mReferencePoint2; } /**Sets the end point of the gradient to be the feature centroid*/ - void setReferencePoint2IsCentroid( bool isCentroid ) { mReferencePoint2IsCentroid = isCentroid; }; - bool referencePoint2IsCentroid() const { return mReferencePoint2IsCentroid; }; + void setReferencePoint2IsCentroid( bool isCentroid ) { mReferencePoint2IsCentroid = isCentroid; } + bool referencePoint2IsCentroid() const { return mReferencePoint2IsCentroid; } /**Rotation angle for gradient fill. Can be used to rotate a gradient around its centre point*/ - void setAngle( double angle ) { mAngle = angle; }; - double angle() const { return mAngle; }; + void setAngle( double angle ) { mAngle = angle; } + double angle() const { return mAngle; } /**Offset for gradient fill*/ - void setOffset( QPointF offset ) { mOffset = offset; }; - QPointF offset() const { return mOffset; }; + void setOffset( QPointF offset ) { mOffset = offset; } + QPointF offset() const { return mOffset; } /**Units for gradient fill offset*/ - void setOffsetUnit( QgsSymbolV2::OutputUnit unit ) { mOffsetUnit = unit; }; - QgsSymbolV2::OutputUnit offsetUnit() const { return mOffsetUnit; }; + void setOffsetUnit( QgsSymbolV2::OutputUnit unit ) { mOffsetUnit = unit; } + QgsSymbolV2::OutputUnit offsetUnit() const { return mOffsetUnit; } + + void setOffsetMapUnitScale( const QgsMapUnitScale& scale ) { mOffsetMapUnitScale = scale; } + const QgsMapUnitScale& offsetMapUnitScale() const { return mOffsetMapUnitScale; } + + void setOutputUnit( QgsSymbolV2::OutputUnit unit ); + QgsSymbolV2::OutputUnit outputUnit() const; + + void setMapUnitScale( const QgsMapUnitScale &scale ); + QgsMapUnitScale mapUnitScale() const; protected: QBrush mBrush; @@ -264,6 +284,7 @@ class CORE_EXPORT QgsGradientFillSymbolLayerV2 : public QgsFillSymbolLayerV2 QPointF mOffset; QgsSymbolV2::OutputUnit mOffsetUnit; + QgsMapUnitScale mOffsetMapUnitScale; private: @@ -321,13 +342,13 @@ class CORE_EXPORT QgsShapeburstFillSymbolLayerV2 : public QgsFillSymbolLayerV2 * @note added in 2.3 * @see blurRadius */ - void setBlurRadius( int blurRadius ) { mBlurRadius = blurRadius; }; + void setBlurRadius( int blurRadius ) { mBlurRadius = blurRadius; } /**Returns the blur radius, which controls the amount of blurring applied to the fill. * @returns Integer representing the radius for fill blur. Higher values indicate a stronger blur. A 0 value indicates that blurring is disabled. * @note added in 2.3 * @see setBlurRadius */ - int blurRadius() const { return mBlurRadius; }; + int blurRadius() const { return mBlurRadius; } /**Sets whether the shapeburst fill should be drawn using the entire shape. * @param useWholeShape Set to true if shapeburst should cover entire shape. If false, setMaxDistance is used to calculate how far from the boundary of the shape should @@ -336,14 +357,14 @@ class CORE_EXPORT QgsShapeburstFillSymbolLayerV2 : public QgsFillSymbolLayerV2 * @see useWholeShape * @see setMaxDistance */ - void setUseWholeShape( double useWholeShape ) { mUseWholeShape = useWholeShape; }; + void setUseWholeShape( double useWholeShape ) { mUseWholeShape = useWholeShape; } /**Returns whether the shapeburst fill is set to cover the entire shape. * @returns True if shapeburst fill will cover the entire shape. If false, shapeburst is drawn to a distance of maxDistance from the polygon's boundary. * @note added in 2.3 * @see setUseWholeShape * @see maxDistance */ - double useWholeShape() const { return mUseWholeShape; }; + double useWholeShape() const { return mUseWholeShape; } /**Sets the maximum distance to shape inside of the shape from the polygon's boundary. * @param maxDistance distance from boundary to shade. setUseWholeShape must be set to false for this parameter to take effect. Distance unit is controlled by setDistanceUnit. @@ -352,7 +373,7 @@ class CORE_EXPORT QgsShapeburstFillSymbolLayerV2 : public QgsFillSymbolLayerV2 * @see setUseWholeShape * @see setDistanceUnit */ - void setMaxDistance( double maxDistance ) { mMaxDistance = maxDistance; }; + void setMaxDistance( double maxDistance ) { mMaxDistance = maxDistance; } /**Returns the maximum distance from the shape's boundary which is shaded. This parameter is only effective if useWholeShape is false. * @returns the maximum distance from the polygon's boundary which is shaded. Distance units are indicated by distanceUnit. * @note added in 2.3 @@ -360,7 +381,7 @@ class CORE_EXPORT QgsShapeburstFillSymbolLayerV2 : public QgsFillSymbolLayerV2 * @see setMaxDistance * @see distanceUnit */ - double maxDistance() const { return mMaxDistance; }; + double maxDistance() const { return mMaxDistance; } /**Sets the unit for the maximum distance to shade inside of the shape from the polygon's boundary. * @param unit distance unit for the maximum distance @@ -377,6 +398,9 @@ class CORE_EXPORT QgsShapeburstFillSymbolLayerV2 : public QgsFillSymbolLayerV2 */ QgsSymbolV2::OutputUnit distanceUnit() const { return mDistanceUnit; } + void setDistanceMapUnitScale( const QgsMapUnitScale& scale ) { mDistanceMapUnitScale = scale; } + const QgsMapUnitScale& distanceMapUnitScale() const { return mDistanceMapUnitScale; } + /**Sets the color mode to use for the shapeburst fill. Shapeburst can either be drawn using a QgsVectorColorRampV2 color ramp * or by simply specificing a start and end color. setColorType is used to specify which mode to use for the fill. * @param colorType color type to use for shapeburst fill @@ -386,7 +410,7 @@ class CORE_EXPORT QgsShapeburstFillSymbolLayerV2 : public QgsFillSymbolLayerV2 * @see setColor2 * @see setColorRamp */ - void setColorType( ShapeburstColorType colorType ) { mColorType = colorType; }; + void setColorType( ShapeburstColorType colorType ) { mColorType = colorType; } /**Returns the color mode used for the shapeburst fill. Shapeburst can either be drawn using a QgsVectorColorRampV2 color ramp * or by simply specificing a start and end color. * @returns current color mode used for the shapeburst fill @@ -396,7 +420,7 @@ class CORE_EXPORT QgsShapeburstFillSymbolLayerV2 : public QgsFillSymbolLayerV2 * @see color2 * @see colorRamp */ - ShapeburstColorType colorType() const { return mColorType; }; + ShapeburstColorType colorType() const { return mColorType; } /**Sets the color ramp used to draw the shapeburst fill. Color ramps are only used if setColorType is set ShapeburstColorType::ColorRamp. * @param ramp color ramp to use for shapeburst fill @@ -411,7 +435,7 @@ class CORE_EXPORT QgsShapeburstFillSymbolLayerV2 : public QgsFillSymbolLayerV2 * @see setColorRamp * @see colorType */ - QgsVectorColorRampV2* colorRamp() { return mGradientRamp; }; + QgsVectorColorRampV2* colorRamp() { return mGradientRamp; } /**Sets the color for the endpoint of the shapeburst fill. This color is only used if setColorType is set ShapeburstColorType::SimpleTwoColor. * @param color2 QColor to use for endpoint of gradient @@ -419,14 +443,14 @@ class CORE_EXPORT QgsShapeburstFillSymbolLayerV2 : public QgsFillSymbolLayerV2 * @see setColorType * @see color2 */ - void setColor2( QColor color2 ) { mColor2 = color2; }; + void setColor2( QColor color2 ) { mColor2 = color2; } /**Returns the color used for the endpoint of the shapeburst fill. This color is only used if the colorType is set to ShapeburstColorType::SimpleTwoColor * @returns a QColor indicating the color of the endpoint of the gradient * @note added in 2.3 * @see setColor2 * @see colorType */ - QColor color2() const { return mColor2; }; + QColor color2() const { return mColor2; } /**Sets whether the shapeburst fill should ignore polygon rings when calculating * the buffered shading. @@ -434,13 +458,13 @@ class CORE_EXPORT QgsShapeburstFillSymbolLayerV2 : public QgsFillSymbolLayerV2 * @note added in 2.3 * @see ignoreRings */ - void setIgnoreRings( double ignoreRings ) { mIgnoreRings = ignoreRings; }; + void setIgnoreRings( double ignoreRings ) { mIgnoreRings = ignoreRings; } /**Returns whether the shapeburst fill is set to ignore polygon interior rings. * @returns True if the shapeburst fill will ignore interior rings when calculating buffered shading. * @note added in 2.3 * @see setIgnoreRings */ - double ignoreRings() const { return mIgnoreRings; }; + double ignoreRings() const { return mIgnoreRings; } /**Sets the offset for the shapeburst fill. * @param offset QPointF indicating the horizontal/vertical offset amount @@ -448,14 +472,14 @@ class CORE_EXPORT QgsShapeburstFillSymbolLayerV2 : public QgsFillSymbolLayerV2 * @see offset * @see setOffsetUnit */ - void setOffset( QPointF offset ) { mOffset = offset; }; + void setOffset( QPointF offset ) { mOffset = offset; } /**Returns the offset for the shapeburst fill. * @returns a QPointF indicating the horizontal/vertical offset amount * @note added in 2.3 * @see setOffset * @see offsetUnit */ - QPointF offset() const { return mOffset; }; + QPointF offset() const { return mOffset; } /**Sets the units used for the offset for the shapeburst fill. * @param unit units for fill offset @@ -463,14 +487,23 @@ class CORE_EXPORT QgsShapeburstFillSymbolLayerV2 : public QgsFillSymbolLayerV2 * @see setOffset * @see offsetUnit */ - void setOffsetUnit( QgsSymbolV2::OutputUnit unit ) { mOffsetUnit = unit; }; + void setOffsetUnit( QgsSymbolV2::OutputUnit unit ) { mOffsetUnit = unit; } /**Returns the units used for the offset of the shapeburst fill. * @returns units used for the fill offset * @note added in 2.3 * @see offset * @see setOffsetUnit */ - QgsSymbolV2::OutputUnit offsetUnit() const { return mOffsetUnit; }; + QgsSymbolV2::OutputUnit offsetUnit() const { return mOffsetUnit; } + + void setOffsetMapUnitScale( const QgsMapUnitScale& scale ) { mOffsetMapUnitScale = scale; } + const QgsMapUnitScale& offsetMapUnitScale() const { return mOffsetMapUnitScale; } + + void setOutputUnit( QgsSymbolV2::OutputUnit unit ); + QgsSymbolV2::OutputUnit outputUnit() const; + + void setMapUnitScale( const QgsMapUnitScale &scale ); + QgsMapUnitScale mapUnitScale() const; protected: QBrush mBrush; @@ -481,6 +514,7 @@ class CORE_EXPORT QgsShapeburstFillSymbolLayerV2 : public QgsFillSymbolLayerV2 bool mUseWholeShape; double mMaxDistance; QgsSymbolV2::OutputUnit mDistanceUnit; + QgsMapUnitScale mDistanceMapUnitScale; ShapeburstColorType mColorType; QColor mColor2; @@ -491,6 +525,7 @@ class CORE_EXPORT QgsShapeburstFillSymbolLayerV2 : public QgsFillSymbolLayerV2 QPointF mOffset; QgsSymbolV2::OutputUnit mOffsetUnit; + QgsMapUnitScale mOffsetMapUnitScale; private: @@ -523,6 +558,15 @@ class CORE_EXPORT QgsImageFillSymbolLayer: public QgsFillSymbolLayerV2 void setOutlineWidthUnit( QgsSymbolV2::OutputUnit unit ) { mOutlineWidthUnit = unit; } QgsSymbolV2::OutputUnit outlineWidthUnit() const { return mOutlineWidthUnit; } + void setOutlineWidthMapUnitScale( const QgsMapUnitScale& scale ) { mOutlineWidthMapUnitScale = scale; } + const QgsMapUnitScale& outlineWidthMapUnitScale() const { return mOutlineWidthMapUnitScale; } + + void setOutputUnit( QgsSymbolV2::OutputUnit unit ); + QgsSymbolV2::OutputUnit outputUnit() const; + + void setMapUnitScale( const QgsMapUnitScale& scale ); + QgsMapUnitScale mapUnitScale() const; + virtual double estimateMaxBleed() const; virtual double dxfWidth( const QgsDxfExport& e, const QgsSymbolV2RenderContext& context ) const; @@ -536,6 +580,7 @@ class CORE_EXPORT QgsImageFillSymbolLayer: public QgsFillSymbolLayerV2 /**Outline width*/ double mOutlineWidth; QgsSymbolV2::OutputUnit mOutlineWidthUnit; + QgsMapUnitScale mOutlineWidthMapUnitScale; /**Custom outline*/ QgsLineSymbolV2* mOutline; @@ -584,16 +629,26 @@ class CORE_EXPORT QgsSVGFillSymbolLayer: public QgsImageFillSymbolLayer void setPatternWidthUnit( QgsSymbolV2::OutputUnit unit ) { mPatternWidthUnit = unit; } QgsSymbolV2::OutputUnit patternWidthUnit() const { return mPatternWidthUnit; } + void setPatternWidthMapUnitScale( const QgsMapUnitScale& scale ) { mPatternWidthMapUnitScale = scale; } + const QgsMapUnitScale& patternWidthMapUnitScale() const { return mPatternWidthMapUnitScale; } + void setSvgOutlineWidthUnit( QgsSymbolV2::OutputUnit unit ) { mSvgOutlineWidthUnit = unit; } QgsSymbolV2::OutputUnit svgOutlineWidthUnit() const { return mSvgOutlineWidthUnit; } + void setSvgOutlineWidthMapUnitScale( const QgsMapUnitScale& scale ) { mSvgOutlineWidthMapUnitScale = scale; } + const QgsMapUnitScale& svgOutlineWidthMapUnitScale() const { return mSvgOutlineWidthMapUnitScale; } + void setOutputUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit outputUnit() const; + void setMapUnitScale( const QgsMapUnitScale &scale ); + QgsMapUnitScale mapUnitScale() const; + protected: /**Width of the pattern (in output units)*/ double mPatternWidth; QgsSymbolV2::OutputUnit mPatternWidthUnit; + QgsMapUnitScale mPatternWidthMapUnitScale; /**SVG data*/ QByteArray mSvgData; @@ -611,6 +666,7 @@ class CORE_EXPORT QgsSVGFillSymbolLayer: public QgsImageFillSymbolLayer QColor mSvgOutlineColor; double mSvgOutlineWidth; QgsSymbolV2::OutputUnit mSvgOutlineWidthUnit; + QgsMapUnitScale mSvgOutlineWidthMapUnitScale; void applyDataDefinedSettings( const QgsSymbolV2RenderContext& context ); @@ -621,7 +677,7 @@ class CORE_EXPORT QgsSVGFillSymbolLayer: public QgsImageFillSymbolLayer /**Applies the svg pattern to the brush*/ void applyPattern( QBrush& brush, const QString& svgFilePath, double patternWidth, QgsSymbolV2::OutputUnit patternWidthUnit, const QColor& svgFillColor, const QColor& svgOutlineColor, - double svgOutlineWidth, QgsSymbolV2::OutputUnit svgOutlineWidthUnit, const QgsSymbolV2RenderContext& context ); + double svgOutlineWidth, QgsSymbolV2::OutputUnit svgOutlineWidthUnit, const QgsSymbolV2RenderContext& context, const QgsMapUnitScale& patternWidthMapUnitScale , const QgsMapUnitScale &svgOutlineWidthMapUnitScale ); }; class CORE_EXPORT QgsLinePatternFillSymbolLayer: public QgsImageFillSymbolLayer @@ -664,15 +720,27 @@ class CORE_EXPORT QgsLinePatternFillSymbolLayer: public QgsImageFillSymbolLayer void setDistanceUnit( QgsSymbolV2::OutputUnit unit ) { mDistanceUnit = unit; } QgsSymbolV2::OutputUnit distanceUnit() const { return mDistanceUnit; } + void setDistanceMapUnitScale( const QgsMapUnitScale& scale ) { mDistanceMapUnitScale = scale; } + const QgsMapUnitScale& distanceMapUnitScale() const { return mDistanceMapUnitScale; } + void setLineWidthUnit( QgsSymbolV2::OutputUnit unit ) { mLineWidthUnit = unit; } QgsSymbolV2::OutputUnit lineWidthUnit() const { return mLineWidthUnit; } + void setLineWidthMapUnitScale( const QgsMapUnitScale& scale ) { mLineWidthMapUnitScale = scale; } + const QgsMapUnitScale& lineWidthMapUnitScale() const { return mLineWidthMapUnitScale; } + void setOffsetUnit( QgsSymbolV2::OutputUnit unit ) { mOffsetUnit = unit; } QgsSymbolV2::OutputUnit offsetUnit() const { return mOffsetUnit; } + void setOffsetMapUnitScale( const QgsMapUnitScale& scale ) { mOffsetMapUnitScale = scale; } + const QgsMapUnitScale& offsetMapUnitScale() const { return mOffsetMapUnitScale; } + void setOutputUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit outputUnit() const; + void setMapUnitScale( const QgsMapUnitScale& scale ); + QgsMapUnitScale mapUnitScale() const; + bool setSubSymbol( QgsSymbolV2* symbol ); QgsSymbolV2* subSymbol(); @@ -680,15 +748,18 @@ class CORE_EXPORT QgsLinePatternFillSymbolLayer: public QgsImageFillSymbolLayer /**Distance (in mm or map units) between lines*/ double mDistance; QgsSymbolV2::OutputUnit mDistanceUnit; + QgsMapUnitScale mDistanceMapUnitScale; /**Line width (in mm or map units)*/ double mLineWidth; QgsSymbolV2::OutputUnit mLineWidthUnit; + QgsMapUnitScale mLineWidthMapUnitScale; QColor mColor; /**Vector line angle in degrees (0 = horizontal, counterclockwise)*/ double mLineAngle; /**Offset perpendicular to line direction*/ double mOffset; QgsSymbolV2::OutputUnit mOffsetUnit; + QgsMapUnitScale mOffsetMapUnitScale; void applyDataDefinedSettings( const QgsSymbolV2RenderContext& context ); @@ -742,30 +813,49 @@ class CORE_EXPORT QgsPointPatternFillSymbolLayer: public QgsImageFillSymbolLayer void setDistanceXUnit( QgsSymbolV2::OutputUnit unit ) { mDistanceXUnit = unit; } QgsSymbolV2::OutputUnit distanceXUnit() const { return mDistanceXUnit; } + void setDistanceXMapUnitScale( const QgsMapUnitScale& scale ) { mDistanceXMapUnitScale = scale; } + const QgsMapUnitScale& distanceXMapUnitScale() const { return mDistanceXMapUnitScale; } + void setDistanceYUnit( QgsSymbolV2::OutputUnit unit ) { mDistanceYUnit = unit; } QgsSymbolV2::OutputUnit distanceYUnit() const { return mDistanceYUnit; } + void setDistanceYMapUnitScale( const QgsMapUnitScale& scale ) { mDistanceYMapUnitScale = scale; } + const QgsMapUnitScale& distanceYMapUnitScale() const { return mDistanceYMapUnitScale; } + void setDisplacementXUnit( QgsSymbolV2::OutputUnit unit ) { mDisplacementXUnit = unit; } QgsSymbolV2::OutputUnit displacementXUnit() const { return mDisplacementXUnit; } + void setDisplacementXMapUnitScale( const QgsMapUnitScale& scale ) { mDisplacementXMapUnitScale = scale; } + const QgsMapUnitScale& displacementXMapUnitScale() const { return mDisplacementXMapUnitScale; } + void setDisplacementYUnit( QgsSymbolV2::OutputUnit unit ) { mDisplacementYUnit = unit; } QgsSymbolV2::OutputUnit displacementYUnit() const { return mDisplacementYUnit; } + void setDisplacementYMapUnitScale( const QgsMapUnitScale& scale ) { mDisplacementYMapUnitScale = scale; } + const QgsMapUnitScale& displacementYMapUnitScale() const { return mDisplacementYMapUnitScale; } + void setOutputUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit outputUnit() const; + void setMapUnitScale( const QgsMapUnitScale &scale ); + QgsMapUnitScale mapUnitScale() const; + virtual QSet usedAttributes() const; protected: QgsMarkerSymbolV2* mMarkerSymbol; double mDistanceX; QgsSymbolV2::OutputUnit mDistanceXUnit; + QgsMapUnitScale mDistanceXMapUnitScale; double mDistanceY; QgsSymbolV2::OutputUnit mDistanceYUnit; + QgsMapUnitScale mDistanceYMapUnitScale; double mDisplacementX; QgsSymbolV2::OutputUnit mDisplacementXUnit; + QgsMapUnitScale mDisplacementXMapUnitScale; double mDisplacementY; QgsSymbolV2::OutputUnit mDisplacementYUnit; + QgsMapUnitScale mDisplacementYMapUnitScale; void applyDataDefinedSettings( const QgsSymbolV2RenderContext& context ); @@ -806,9 +896,12 @@ class CORE_EXPORT QgsCentroidFillSymbolLayerV2 : public QgsFillSymbolLayerV2 QgsSymbolV2* subSymbol(); bool setSubSymbol( QgsSymbolV2* symbol ); - void setOutputUnit( QgsSymbolV2::OutputUnit unit ) { Q_UNUSED( unit ); } + void setOutputUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit outputUnit() const; + void setMapUnitScale( const QgsMapUnitScale &scale ); + QgsMapUnitScale mapUnitScale() const; + virtual QSet usedAttributes() const; protected: @@ -816,3 +909,5 @@ class CORE_EXPORT QgsCentroidFillSymbolLayerV2 : public QgsFillSymbolLayerV2 }; #endif + + diff --git a/src/core/symbology-ng/qgslinesymbollayerv2.cpp b/src/core/symbology-ng/qgslinesymbollayerv2.cpp index 603b41dcec82..dbeedee15899 100644 --- a/src/core/symbology-ng/qgslinesymbollayerv2.cpp +++ b/src/core/symbology-ng/qgslinesymbollayerv2.cpp @@ -1,9 +1,9 @@ /*************************************************************************** - qgslinesymbollayerv2.cpp - --------------------- - begin : November 2009 - copyright : (C) 2009 by Martin Dobias - email : wonder dot sk at gmail dot com + qgslinesymbollayerv2.cpp + --------------------- + begin : November 2009 + copyright : (C) 2009 by Martin Dobias + email : wonder dot sk at gmail dot com *************************************************************************** * * * This program is free software; you can redistribute it and/or modify * @@ -39,6 +39,7 @@ QgsSimpleLineSymbolLayerV2::QgsSimpleLineSymbolLayerV2( QColor color, double wid void QgsSimpleLineSymbolLayerV2::setOutputUnit( QgsSymbolV2::OutputUnit unit ) { + QgsLineSymbolLayerV2::setOutputUnit( unit ); mWidthUnit = unit; mOffsetUnit = unit; mCustomDashPatternUnit = unit; @@ -46,14 +47,32 @@ void QgsSimpleLineSymbolLayerV2::setOutputUnit( QgsSymbolV2::OutputUnit unit ) QgsSymbolV2::OutputUnit QgsSimpleLineSymbolLayerV2::outputUnit() const { - QgsSymbolV2::OutputUnit unit = mWidthUnit; - if ( mOffsetUnit != unit || mCustomDashPatternUnit != unit ) + QgsSymbolV2::OutputUnit unit = QgsLineSymbolLayerV2::outputUnit(); + if ( mWidthUnit != unit || mOffsetUnit != unit || mCustomDashPatternUnit != unit ) { return QgsSymbolV2::Mixed; } return unit; } +void QgsSimpleLineSymbolLayerV2::setMapUnitScale( const QgsMapUnitScale &scale ) +{ + QgsLineSymbolLayerV2::setMapUnitScale( scale ); + mWidthMapUnitScale = scale; + mOffsetMapUnitScale = scale; + mCustomDashPatternMapUnitScale = scale; +} + +QgsMapUnitScale QgsSimpleLineSymbolLayerV2::mapUnitScale() const +{ + if ( QgsLineSymbolLayerV2::mapUnitScale() == mWidthMapUnitScale && + mWidthMapUnitScale == mOffsetMapUnitScale && + mOffsetMapUnitScale == mCustomDashPatternMapUnitScale ) + { + return mWidthMapUnitScale; + } + return QgsMapUnitScale(); +} QgsSymbolLayerV2* QgsSimpleLineSymbolLayerV2::create( const QgsStringMap& props ) { @@ -76,6 +95,8 @@ QgsSymbolLayerV2* QgsSimpleLineSymbolLayerV2::create( const QgsStringMap& props l->setOffset( props["offset"].toDouble() ); if ( props.contains( "offset_unit" ) ) l->setOffsetUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( props["offset_unit"] ) ); + if ( props.contains( "offset_map_unit_scale" ) ) + l->setOffsetMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( props["offset_map_unit_scale"] ) ); if ( props.contains( "joinstyle" ) ) l->setPenJoinStyle( QgsSymbolLayerV2Utils::decodePenJoinStyle( props["joinstyle"] ) ); if ( props.contains( "capstyle" ) ) @@ -93,6 +114,10 @@ QgsSymbolLayerV2* QgsSimpleLineSymbolLayerV2::create( const QgsStringMap& props { l->setCustomDashPatternUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( props["customdash_unit"] ) ); } + if ( props.contains( "customdash_map_unit_scale" ) ) + { + l->setCustomDashPatternMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( props["customdash_map_unit_scale"] ) ); + } if ( props.contains( "draw_inside_polygon" ) ) { @@ -127,7 +152,7 @@ void QgsSimpleLineSymbolLayerV2::startRender( QgsSymbolV2RenderContext& context QColor penColor = mColor; penColor.setAlphaF( mColor.alphaF() * context.alpha() ); mPen.setColor( penColor ); - double scaledWidth = mWidth * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mWidthUnit ); + double scaledWidth = mWidth * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mWidthUnit, mWidthMapUnitScale ); mPen.setWidthF( scaledWidth ); if ( mUseCustomDashPattern && scaledWidth != 0 ) { @@ -148,7 +173,7 @@ void QgsSimpleLineSymbolLayerV2::startRender( QgsSymbolV2RenderContext& context for ( ; it != mCustomDashVector.constEnd(); ++it ) { //the dash is specified in terms of pen widths, therefore the division - scaledVector << ( *it ) * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mCustomDashPatternUnit ) / dashWidthDiv; + scaledVector << ( *it ) * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mCustomDashPatternUnit, mCustomDashPatternMapUnitScale ) / dashWidthDiv; } mPen.setDashPattern( scaledVector ); } @@ -249,7 +274,7 @@ void QgsSimpleLineSymbolLayerV2::renderPolyline( const QPolygonF& points, QgsSym } else { - double scaledOffset = offset * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit ); + double scaledOffset = offset * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit, mOffsetMapUnitScale ); p->drawPolyline( ::offsetLine( points, scaledOffset ) ); } } @@ -260,14 +285,17 @@ QgsStringMap QgsSimpleLineSymbolLayerV2::properties() const map["color"] = QgsSymbolLayerV2Utils::encodeColor( mColor ); map["width"] = QString::number( mWidth ); map["width_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mWidthUnit ); + map["width_map_unit_scale"] = QgsSymbolLayerV2Utils::encodeMapUnitScale( mWidthMapUnitScale ); map["penstyle"] = QgsSymbolLayerV2Utils::encodePenStyle( mPenStyle ); map["joinstyle"] = QgsSymbolLayerV2Utils::encodePenJoinStyle( mPenJoinStyle ); map["capstyle"] = QgsSymbolLayerV2Utils::encodePenCapStyle( mPenCapStyle ); map["offset"] = QString::number( mOffset ); map["offset_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mOffsetUnit ); + map["offset_map_unit_scale"] = QgsSymbolLayerV2Utils::encodeMapUnitScale( mOffsetMapUnitScale ); map["use_custom_dash"] = ( mUseCustomDashPattern ? "1" : "0" ); map["customdash"] = QgsSymbolLayerV2Utils::encodeRealVector( mCustomDashVector ); map["customdash_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mCustomDashPatternUnit ); + map["customdash_map_unit_scale"] = QgsSymbolLayerV2Utils::encodeMapUnitScale( mCustomDashPatternMapUnitScale ); map["draw_inside_polygon"] = ( mDrawInsidePolygon ? "1" : "0" ); saveDataDefinedProperties( map ); return map; @@ -277,8 +305,11 @@ QgsSymbolLayerV2* QgsSimpleLineSymbolLayerV2::clone() const { QgsSimpleLineSymbolLayerV2* l = new QgsSimpleLineSymbolLayerV2( mColor, mWidth, mPenStyle ); l->setWidthUnit( mWidthUnit ); + l->setWidthMapUnitScale( mWidthMapUnitScale ); l->setOffsetUnit( mOffsetUnit ); + l->setOffsetMapUnitScale( mOffsetMapUnitScale ); l->setCustomDashPatternUnit( mCustomDashPatternUnit ); + l->setCustomDashPatternMapUnitScale( mCustomDashPatternMapUnitScale ); l->setOffset( mOffset ); l->setPenJoinStyle( mPenJoinStyle ); l->setPenCapStyle( mPenCapStyle ); @@ -382,13 +413,13 @@ void QgsSimpleLineSymbolLayerV2::applyDataDefinedSymbology( QgsSymbolV2RenderCon if ( strokeWidthExpression ) { scaledWidth = strokeWidthExpression->evaluate( const_cast( context.feature() ) ).toDouble() - * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mWidthUnit ); + * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mWidthUnit, mWidthMapUnitScale ); pen.setWidthF( scaledWidth ); selPen.setWidthF( scaledWidth ); } else if ( context.renderHints() & QgsSymbolV2::DataDefinedSizeScale ) { - scaledWidth = mWidth * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mWidthUnit ); + scaledWidth = mWidth * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mWidthUnit, mWidthMapUnitScale ); pen.setWidthF( scaledWidth ); selPen.setWidthF( scaledWidth ); } @@ -417,7 +448,7 @@ void QgsSimpleLineSymbolLayerV2::applyDataDefinedSymbology( QgsSymbolV2RenderCon QStringList::const_iterator dashIt = dashList.constBegin(); for ( ; dashIt != dashList.constEnd(); ++dashIt ) { - dashVector.push_back( dashIt->toDouble() * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mCustomDashPatternUnit ) / mPen.widthF() ); + dashVector.push_back( dashIt->toDouble() * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mCustomDashPatternUnit, mCustomDashPatternMapUnitScale ) / mPen.widthF() ); } pen.setDashPattern( dashVector ); } @@ -473,7 +504,7 @@ double QgsSimpleLineSymbolLayerV2::dxfWidth( const QgsDxfExport& e, const QgsSym } else if ( context.renderHints() & QgsSymbolV2::DataDefinedSizeScale ) { - width = mWidth * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mWidthUnit ); + width = mWidth * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mWidthUnit, mWidthMapUnitScale ); } return width * e.mapUnitScaleFactor( e.symbologyScaleDenominator(), widthUnit(), e.mapUnits() ); @@ -584,6 +615,18 @@ QgsSymbolLayerV2* QgsMarkerLineSymbolLayerV2::create( const QgsStringMap& props rotate = ( props["rotate"] == "1" ); QgsMarkerLineSymbolLayerV2* x = new QgsMarkerLineSymbolLayerV2( rotate, interval ); + if ( props.contains( "width" ) ) + { + x->setWidth( props["width"].toDouble() ); + } + if ( props.contains( "width_unit" ) ) + { + x->setWidthUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( props["width_unit"] ) ); + } + if ( props.contains( "width_map_unit_scale" ) ) + { + x->setWidthMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( props["width_map_unit_scale"] ) ); + } if ( props.contains( "offset" ) ) { x->setOffset( props["offset"].toDouble() ); @@ -604,6 +647,19 @@ QgsSymbolLayerV2* QgsMarkerLineSymbolLayerV2::create( const QgsStringMap& props { x->setOffsetAlongLineUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( props["offset_along_line_unit"] ) ); } + if ( props.contains(( "offset_along_line_map_unit_scale" ) ) ) + { + x->setOffsetAlongLineMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( props["offset_along_line_map_unit_scale"] ) ); + } + + if ( props.contains( "offset_map_unit_scale" ) ) + { + x->setOffsetMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( props["offset_map_unit_scale"] ) ); + } + if ( props.contains( "interval_map_unit_scale" ) ) + { + x->setIntervalMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( props["interval_map_unit_scale"] ) ); + } if ( props.contains( "placement" ) ) { @@ -721,7 +777,7 @@ void QgsMarkerLineSymbolLayerV2::renderPolyline( const QPolygonF& points, QgsSym } else { - QPolygonF points2 = ::offsetLine( points, offset * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit ) ); + QPolygonF points2 = ::offsetLine( points, offset * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit, mOffsetMapUnitScale ) ); if ( placement == Interval ) renderPolylineInterval( points2, context ); else if ( placement == CentralPoint ) @@ -760,8 +816,8 @@ void QgsMarkerLineSymbolLayerV2::renderPolylineInterval( const QPolygonF& points offsetAlongLine = offsetAlongLineExpression->evaluate( const_cast( context.feature() ) ).toDouble(); } - double painterUnitInterval = interval * QgsSymbolLayerV2Utils::lineWidthScaleFactor( rc, mIntervalUnit ); - lengthLeft = painterUnitInterval - offsetAlongLine * QgsSymbolLayerV2Utils::lineWidthScaleFactor( rc, mIntervalUnit ); + double painterUnitInterval = interval * QgsSymbolLayerV2Utils::lineWidthScaleFactor( rc, mIntervalUnit, mIntervalMapUnitScale ); + lengthLeft = painterUnitInterval - offsetAlongLine * QgsSymbolLayerV2Utils::lineWidthScaleFactor( rc, mIntervalUnit, mIntervalMapUnitScale ); for ( int i = 1; i < points.count(); ++i ) { @@ -841,7 +897,7 @@ void QgsMarkerLineSymbolLayerV2::renderPolylineVertex( const QPolygonF& points, if ( offsetAlongLine != 0 ) { //scale offset along line - offsetAlongLine *= QgsSymbolLayerV2Utils::lineWidthScaleFactor( rc, mOffsetAlongLineUnit ); + offsetAlongLine *= QgsSymbolLayerV2Utils::lineWidthScaleFactor( rc, mOffsetAlongLineUnit, mOffsetAlongLineMapUnitScale ); } if ( placement == FirstVertex ) @@ -1081,10 +1137,16 @@ QgsStringMap QgsMarkerLineSymbolLayerV2::properties() const map["rotate"] = ( mRotateMarker ? "1" : "0" ); map["interval"] = QString::number( mInterval ); map["offset"] = QString::number( mOffset ); + map["width"] = QString::number( mWidth ); + map["width_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mWidthUnit ); + map["width_map_unit_scale"] = QgsSymbolLayerV2Utils::encodeMapUnitScale( mWidthMapUnitScale ); map["offset_along_line"] = QString::number( mOffsetAlongLine ); map["offset_along_line_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mOffsetAlongLineUnit ); + map["offset_along_line_map_unit_scale"] = QgsSymbolLayerV2Utils::encodeMapUnitScale( mOffsetAlongLineMapUnitScale ); map["offset_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mOffsetUnit ); + map["offset_map_unit_scale"] = QgsSymbolLayerV2Utils::encodeMapUnitScale( mOffsetMapUnitScale ); map["interval_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mIntervalUnit ); + map["interval_map_unit_scale"] = QgsSymbolLayerV2Utils::encodeMapUnitScale( mIntervalMapUnitScale ); if ( mPlacement == Vertex ) map["placement"] = "vertex"; else if ( mPlacement == LastVertex ) @@ -1125,9 +1187,15 @@ QgsSymbolLayerV2* QgsMarkerLineSymbolLayerV2::clone() const x->setSubSymbol( mMarker->clone() ); x->setOffset( mOffset ); x->setPlacement( mPlacement ); + x->setWidth( mWidth ); + x->setWidthUnit( mWidthUnit ); + x->setWidthMapUnitScale( mWidthMapUnitScale ); x->setOffsetUnit( mOffsetUnit ); + x->setOffsetMapUnitScale( mOffsetMapUnitScale ); x->setIntervalUnit( mIntervalUnit ); + x->setIntervalMapUnitScale( mIntervalMapUnitScale ); x->setOffsetAlongLine( mOffsetAlongLine ); + x->setOffsetAlongLineMapUnitScale( mOffsetAlongLineMapUnitScale ); x->setOffsetAlongLineUnit( mOffsetAlongLineUnit ); copyDataDefinedProperties( x ); return x; @@ -1293,22 +1361,45 @@ double QgsMarkerLineSymbolLayerV2::width() const void QgsMarkerLineSymbolLayerV2::setOutputUnit( QgsSymbolV2::OutputUnit unit ) { + QgsLineSymbolLayerV2::setOutputUnit( unit ); mIntervalUnit = unit; mOffsetUnit = unit; + mOffsetAlongLineUnit = unit; } QgsSymbolV2::OutputUnit QgsMarkerLineSymbolLayerV2::outputUnit() const { - QgsSymbolV2::OutputUnit unit = mIntervalUnit; - if ( mOffsetUnit != unit ) + QgsSymbolV2::OutputUnit unit = QgsLineSymbolLayerV2::outputUnit(); + if ( mIntervalUnit != unit || mOffsetUnit != unit || mOffsetAlongLineUnit != unit ) { return QgsSymbolV2::Mixed; } return unit; } +void QgsMarkerLineSymbolLayerV2::setMapUnitScale( const QgsMapUnitScale &scale ) +{ + QgsLineSymbolLayerV2::setMapUnitScale( scale ); + mIntervalMapUnitScale = scale; + mOffsetMapUnitScale = scale; + mOffsetAlongLineMapUnitScale = scale; +} + +QgsMapUnitScale QgsMarkerLineSymbolLayerV2::mapUnitScale() const +{ + if ( QgsLineSymbolLayerV2::mapUnitScale() == mIntervalMapUnitScale && + mIntervalMapUnitScale == mOffsetMapUnitScale && + mOffsetMapUnitScale == mOffsetAlongLineMapUnitScale ) + { + return mOffsetMapUnitScale; + } + return QgsMapUnitScale(); +} + double QgsMarkerLineSymbolLayerV2::estimateMaxBleed() const { return ( mMarker->size() / 2.0 ) + mOffset; } + + diff --git a/src/core/symbology-ng/qgslinesymbollayerv2.h b/src/core/symbology-ng/qgslinesymbollayerv2.h index d056721acdad..398432b4f996 100644 --- a/src/core/symbology-ng/qgslinesymbollayerv2.h +++ b/src/core/symbology-ng/qgslinesymbollayerv2.h @@ -1,9 +1,9 @@ /*************************************************************************** - qgslinesymbollayerv2.h - --------------------- - begin : November 2009 - copyright : (C) 2009 by Martin Dobias - email : wonder dot sk at gmail dot com + qgslinesymbollayerv2.h + --------------------- + begin : November 2009 + copyright : (C) 2009 by Martin Dobias + email : wonder dot sk at gmail dot com *************************************************************************** * * * This program is free software; you can redistribute it and/or modify * @@ -66,6 +66,9 @@ class CORE_EXPORT QgsSimpleLineSymbolLayerV2 : public QgsLineSymbolLayerV2 void setOutputUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit outputUnit() const; + void setMapUnitScale( const QgsMapUnitScale &scale ); + QgsMapUnitScale mapUnitScale() const; + double estimateMaxBleed() const; // new stuff @@ -82,14 +85,20 @@ class CORE_EXPORT QgsSimpleLineSymbolLayerV2 : public QgsLineSymbolLayerV2 double offset() const { return mOffset; } void setOffset( double offset ) { mOffset = offset; } - QgsSymbolV2::OutputUnit offsetUnit() const { return mOffsetUnit; } void setOffsetUnit( QgsSymbolV2::OutputUnit unit ) { mOffsetUnit = unit; } + QgsSymbolV2::OutputUnit offsetUnit() const { return mOffsetUnit; } + + void setOffsetMapUnitScale( const QgsMapUnitScale& scale ) { mOffsetMapUnitScale = scale; } + const QgsMapUnitScale& offsetMapUnitScale() const { return mOffsetMapUnitScale; } bool useCustomDashPattern() const { return mUseCustomDashPattern; } void setUseCustomDashPattern( bool b ) { mUseCustomDashPattern = b; } - QgsSymbolV2::OutputUnit customDashPatternUnit() const { return mCustomDashPatternUnit; } void setCustomDashPatternUnit( QgsSymbolV2::OutputUnit unit ) { mCustomDashPatternUnit = unit; } + QgsSymbolV2::OutputUnit customDashPatternUnit() const { return mCustomDashPatternUnit; } + + const QgsMapUnitScale& customDashPatternMapUnitScale() const { return mCustomDashPatternMapUnitScale; } + void setCustomDashPatternMapUnitScale( const QgsMapUnitScale& scale ) { mCustomDashPatternMapUnitScale = scale; } QVector customDashVector() const { return mCustomDashVector; } void setCustomDashVector( const QVector& vector ) { mCustomDashVector = vector; } @@ -113,10 +122,12 @@ class CORE_EXPORT QgsSimpleLineSymbolLayerV2 : public QgsLineSymbolLayerV2 QPen mSelPen; double mOffset; QgsSymbolV2::OutputUnit mOffsetUnit; + QgsMapUnitScale mOffsetMapUnitScale; //use a custom dash dot pattern instead of the predefined ones bool mUseCustomDashPattern; QgsSymbolV2::OutputUnit mCustomDashPatternUnit; + QgsMapUnitScale mCustomDashPatternMapUnitScale; /**Vector with an even number of entries for the */ QVector mCustomDashVector; @@ -234,15 +245,34 @@ class CORE_EXPORT QgsMarkerLineSymbolLayerV2 : public QgsLineSymbolLayerV2 */ void setOffsetAlongLineUnit( QgsSymbolV2::OutputUnit unit ) { mOffsetAlongLineUnit = unit; } - QgsSymbolV2::OutputUnit intervalUnit() const { return mIntervalUnit; } + /**Returns the map unit scale used for calculating the offset in map units along line for markers. + * @returns Offset along line map unit scale. + */ + const QgsMapUnitScale& offsetAlongLineMapUnitScale() const { return mOffsetAlongLineMapUnitScale; } + + /**Sets the map unit scale used for calculating the offset in map units along line for markers. + * @param scale Offset along line map unit scale. + */ + void setOffsetAlongLineMapUnitScale( const QgsMapUnitScale& scale ) { mOffsetAlongLineMapUnitScale = scale; } + void setIntervalUnit( QgsSymbolV2::OutputUnit unit ) { mIntervalUnit = unit; } + QgsSymbolV2::OutputUnit intervalUnit() const { return mIntervalUnit; } + + void setIntervalMapUnitScale( const QgsMapUnitScale& scale ) { mIntervalMapUnitScale = scale; } + const QgsMapUnitScale& intervalMapUnitScale() const { return mIntervalMapUnitScale; } - QgsSymbolV2::OutputUnit offsetUnit() const { return mOffsetUnit; } void setOffsetUnit( QgsSymbolV2::OutputUnit unit ) { mOffsetUnit = unit; } + QgsSymbolV2::OutputUnit offsetUnit() const { return mOffsetUnit; } + + void setOffsetMapUnitScale( const QgsMapUnitScale& scale ) { mOffsetMapUnitScale = scale; } + const QgsMapUnitScale& offsetMapUnitScale() const { return mOffsetMapUnitScale; } void setOutputUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit outputUnit() const; + void setMapUnitScale( const QgsMapUnitScale& scale ); + QgsMapUnitScale mapUnitScale() const; + protected: void renderPolylineInterval( const QPolygonF& points, QgsSymbolV2RenderContext& context ); @@ -253,12 +283,15 @@ class CORE_EXPORT QgsMarkerLineSymbolLayerV2 : public QgsLineSymbolLayerV2 bool mRotateMarker; double mInterval; QgsSymbolV2::OutputUnit mIntervalUnit; + QgsMapUnitScale mIntervalMapUnitScale; QgsMarkerSymbolV2* mMarker; double mOffset; QgsSymbolV2::OutputUnit mOffsetUnit; + QgsMapUnitScale mOffsetMapUnitScale; Placement mPlacement; double mOffsetAlongLine; //distance to offset along line before marker is drawn QgsSymbolV2::OutputUnit mOffsetAlongLineUnit; //unit for offset along line + QgsMapUnitScale mOffsetAlongLineMapUnitScale; private: @@ -276,3 +309,5 @@ class CORE_EXPORT QgsMarkerLineSymbolLayerV2 : public QgsLineSymbolLayerV2 }; #endif + + diff --git a/src/core/symbology-ng/qgsmarkersymbollayerv2.cpp b/src/core/symbology-ng/qgsmarkersymbollayerv2.cpp index 1264cdae2af2..80210796f8f9 100644 --- a/src/core/symbology-ng/qgsmarkersymbollayerv2.cpp +++ b/src/core/symbology-ng/qgsmarkersymbollayerv2.cpp @@ -1,9 +1,9 @@ /*************************************************************************** - qgsmarkersymbollayerv2.cpp - --------------------- - begin : November 2009 - copyright : (C) 2009 by Martin Dobias - email : wonder dot sk at gmail dot com + qgsmarkersymbollayerv2.cpp + --------------------- + begin : November 2009 + copyright : (C) 2009 by Martin Dobias + email : wonder dot sk at gmail dot com *************************************************************************** * * * This program is free software; you can redistribute it and/or modify * @@ -90,8 +90,12 @@ QgsSymbolLayerV2* QgsSimpleMarkerSymbolLayerV2::create( const QgsStringMap& prop m->setOffset( QgsSymbolLayerV2Utils::decodePoint( props["offset"] ) ); if ( props.contains( "offset_unit" ) ) m->setOffsetUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( props["offset_unit"] ) ); + if ( props.contains( "offset_map_unit_scale" ) ) + m->setOffsetMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( props["offset_map_unit_scale"] ) ); if ( props.contains( "size_unit" ) ) m->setSizeUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( props["size_unit"] ) ); + if ( props.contains( "size_map_unit_scale" ) ) + m->setSizeMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( props["size_map_unit_scale"] ) ); if ( props.contains( "outline_style" ) ) { @@ -105,6 +109,10 @@ QgsSymbolLayerV2* QgsSimpleMarkerSymbolLayerV2::create( const QgsStringMap& prop { m->setOutlineWidthUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( props["outline_width_unit"] ) ); } + if ( props.contains( "outline_width_map_unit_scale" ) ) + { + m->setOutlineWidthMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( props["outline_width_map_unit_scale"] ) ); + } if ( props.contains( "horizontal_anchor_point" ) ) { @@ -172,7 +180,7 @@ void QgsSimpleMarkerSymbolLayerV2::startRender( QgsSymbolV2RenderContext& contex mBrush = QBrush( brushColor ); mPen = QPen( penColor ); mPen.setStyle( mOutlineStyle ); - mPen.setWidthF( mOutlineWidth * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOutlineWidthUnit ) ); + mPen.setWidthF( mOutlineWidth * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOutlineWidthUnit, mOutlineWidthMapUnitScale ) ); QColor selBrushColor = context.renderContext().selectionColor(); QColor selPenColor = selBrushColor == mColor ? selBrushColor : mBorderColor; @@ -184,7 +192,7 @@ void QgsSimpleMarkerSymbolLayerV2::startRender( QgsSymbolV2RenderContext& contex mSelBrush = QBrush( selBrushColor ); mSelPen = QPen( selPenColor ); mSelPen.setStyle( mOutlineStyle ); - mSelPen.setWidthF( mOutlineWidth * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOutlineWidthUnit ) ); + mSelPen.setWidthF( mOutlineWidth * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOutlineWidthUnit, mOutlineWidthMapUnitScale ) ); bool hasDataDefinedRotation = context.renderHints() & QgsSymbolV2::DataDefinedRotation || dataDefinedProperty( "angle" ); bool hasDataDefinedSize = context.renderHints() & QgsSymbolV2::DataDefinedSizeScale || dataDefinedProperty( "size" ); @@ -220,7 +228,7 @@ void QgsSimpleMarkerSymbolLayerV2::startRender( QgsSymbolV2RenderContext& contex // scale the shape (if the size is not going to be modified) if ( !hasDataDefinedSize ) { - double scaledSize = mSize * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mSizeUnit ); + double scaledSize = mSize * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mSizeUnit, mSizeMapUnitScale ); if ( mUsingCache ) scaledSize *= context.renderContext().rasterScaleFactor(); double half = scaledSize / 2.0; @@ -261,7 +269,7 @@ void QgsSimpleMarkerSymbolLayerV2::startRender( QgsSymbolV2RenderContext& contex bool QgsSimpleMarkerSymbolLayerV2::prepareCache( QgsSymbolV2RenderContext& context ) { - double scaledSize = mSize * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mSizeUnit ); + double scaledSize = mSize * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mSizeUnit, mSizeMapUnitScale ); // calculate necessary image size for the cache double pw = (( mPen.widthF() == 0 ? 1 : mPen.widthF() ) + 1 ) / 2 * 2; // make even (round up); handle cosmetic pen @@ -535,7 +543,7 @@ void QgsSimpleMarkerSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV break; } - scaledSize *= QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mSizeUnit ); + scaledSize *= QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mSizeUnit, mSizeMapUnitScale ); double half = scaledSize / 2.0; transform.scale( half, half ); @@ -560,8 +568,8 @@ void QgsSimpleMarkerSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV if ( outlineWidthExpression ) { double outlineWidth = outlineWidthExpression->evaluate( const_cast( context.feature() ) ).toDouble(); - mPen.setWidthF( outlineWidth * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOutlineWidthUnit ) ); - mSelPen.setWidthF( outlineWidth * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOutlineWidthUnit ) ); + mPen.setWidthF( outlineWidth * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOutlineWidthUnit, mOutlineWidthMapUnitScale ) ); + mSelPen.setWidthF( outlineWidth * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOutlineWidthUnit, mOutlineWidthMapUnitScale ) ); } p->setBrush( context.selected() ? mSelBrush : mBrush ); @@ -583,16 +591,20 @@ QgsStringMap QgsSimpleMarkerSymbolLayerV2::properties() const map["color_border"] = QgsSymbolLayerV2Utils::encodeColor( mBorderColor ); map["size"] = QString::number( mSize ); map["size_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mSizeUnit ); + map["size_map_unit_scale"] = QgsSymbolLayerV2Utils::encodeMapUnitScale( mSizeMapUnitScale ); map["angle"] = QString::number( mAngle ); map["offset"] = QgsSymbolLayerV2Utils::encodePoint( mOffset ); map["offset_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mOffsetUnit ); + map["offset_map_unit_scale"] = QgsSymbolLayerV2Utils::encodeMapUnitScale( mOffsetMapUnitScale ); map["scale_method"] = QgsSymbolLayerV2Utils::encodeScaleMethod( mScaleMethod ); map["outline_style"] = QgsSymbolLayerV2Utils::encodePenStyle( mOutlineStyle ); map["outline_width"] = QString::number( mOutlineWidth ); map["outline_width_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mOutlineWidthUnit ); + map["outline_width_map_unit_scale"] = QgsSymbolLayerV2Utils::encodeMapUnitScale( mOutlineWidthMapUnitScale ); map["horizontal_anchor_point"] = QString::number( mHorizontalAnchorPoint ); map["vertical_anchor_point"] = QString::number( mVerticalAnchorPoint ); + //data define properties saveDataDefinedProperties( map ); return map; @@ -603,10 +615,13 @@ QgsSymbolLayerV2* QgsSimpleMarkerSymbolLayerV2::clone() const QgsSimpleMarkerSymbolLayerV2* m = new QgsSimpleMarkerSymbolLayerV2( mName, mColor, mBorderColor, mSize, mAngle, mScaleMethod ); m->setOffset( mOffset ); m->setSizeUnit( mSizeUnit ); + m->setSizeMapUnitScale( mSizeMapUnitScale ); m->setOffsetUnit( mOffsetUnit ); + m->setOffsetMapUnitScale( mOffsetMapUnitScale ); m->setOutlineStyle( mOutlineStyle ); m->setOutlineWidth( mOutlineWidth ); m->setOutlineWidthUnit( mOutlineWidthUnit ); + m->setOutlineWidthMapUnitScale( mOutlineWidthMapUnitScale ); m->setHorizontalAnchorPoint( mHorizontalAnchorPoint ); m->setVerticalAnchorPoint( mVerticalAnchorPoint ); copyDataDefinedProperties( m ); @@ -780,7 +795,7 @@ bool QgsSimpleMarkerSymbolLayerV2::writeDxf( QgsDxfExport& e, double mmMapUnitSc break; } - size *= QgsSymbolLayerV2Utils::lineWidthScaleFactor( context->renderContext(), mSizeUnit ); + size *= QgsSymbolLayerV2Utils::lineWidthScaleFactor( context->renderContext(), mSizeUnit, mSizeMapUnitScale ); } if ( mSizeUnit == QgsSymbolV2::MM ) { @@ -927,6 +942,37 @@ bool QgsSimpleMarkerSymbolLayerV2::writeDxf( QgsDxfExport& e, double mmMapUnitSc return true; } + +void QgsSimpleMarkerSymbolLayerV2::setOutputUnit( QgsSymbolV2::OutputUnit unit ) +{ + QgsMarkerSymbolLayerV2::setOutputUnit( unit ); + mOutlineWidthUnit = unit; +} + +QgsSymbolV2::OutputUnit QgsSimpleMarkerSymbolLayerV2::outputUnit() const +{ + if ( QgsMarkerSymbolLayerV2::outputUnit() == mOutlineWidthUnit ) + { + return mOutlineWidthUnit; + } + return QgsSymbolV2::Mixed; +} + +void QgsSimpleMarkerSymbolLayerV2::setMapUnitScale( const QgsMapUnitScale& scale ) +{ + QgsMarkerSymbolLayerV2::setMapUnitScale( scale ); + mOutlineWidthMapUnitScale = scale; +} + +QgsMapUnitScale QgsSimpleMarkerSymbolLayerV2::mapUnitScale() const +{ + if ( QgsMarkerSymbolLayerV2::mapUnitScale() == mOutlineWidthMapUnitScale ) + { + return mOutlineWidthMapUnitScale; + } + return QgsMapUnitScale(); +} + ////////// @@ -981,10 +1027,14 @@ QgsSymbolLayerV2* QgsSvgMarkerSymbolLayerV2::create( const QgsStringMap& props ) if ( props.contains( "size_unit" ) ) m->setSizeUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( props["size_unit"] ) ); + if ( props.contains( "size_map_unit_scale" ) ) + m->setSizeMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( props["size_map_unit_scale"] ) ); if ( props.contains( "offset" ) ) m->setOffset( QgsSymbolLayerV2Utils::decodePoint( props["offset"] ) ); if ( props.contains( "offset_unit" ) ) m->setOffsetUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( props["offset_unit"] ) ); + if ( props.contains( "offset_map_unit_scale" ) ) + m->setOffsetMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( props["offset_map_unit_scale"] ) ); if ( props.contains( "fill" ) ) m->setFillColor( QColor( props["fill"] ) ); if ( props.contains( "outline" ) ) @@ -993,6 +1043,8 @@ QgsSymbolLayerV2* QgsSvgMarkerSymbolLayerV2::create( const QgsStringMap& props ) m->setOutlineWidth( props["outline-width"].toDouble() ); if ( props.contains( "outline_width_unit" ) ) m->setOutlineWidthUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( props["outline_width_unit"] ) ); + if ( props.contains( "outline_width_map_unit_scale" ) ) + m->setOutlineWidthMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( props["outline_width_map_unit_scale"] ) ); if ( props.contains( "horizontal_anchor_point" ) ) { @@ -1108,7 +1160,7 @@ void QgsSvgMarkerSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV2Re break; } } - size *= QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mSizeUnit ); + size *= QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mSizeUnit, mSizeMapUnitScale ); //don't render symbols with size below one or above 10,000 pixels if (( int )size < 1 || 10000.0 < size ) @@ -1238,13 +1290,16 @@ QgsStringMap QgsSvgMarkerSymbolLayerV2::properties() const map["name"] = QgsSymbolLayerV2Utils::symbolPathToName( mPath ); map["size"] = QString::number( mSize ); map["size_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mSizeUnit ); + map["size_map_unit_scale"] = QgsSymbolLayerV2Utils::encodeMapUnitScale( mSizeMapUnitScale ); map["angle"] = QString::number( mAngle ); map["offset"] = QgsSymbolLayerV2Utils::encodePoint( mOffset ); map["offset_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mOffsetUnit ); + map["offset_map_unit_scale"] = QgsSymbolLayerV2Utils::encodeMapUnitScale( mOffsetMapUnitScale ); map["fill"] = mFillColor.name(); map["outline"] = mOutlineColor.name(); map["outline-width"] = QString::number( mOutlineWidth ); map["outline_width_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mOutlineWidthUnit ); + map["outline_width_map_unit_scale"] = QgsSymbolLayerV2Utils::encodeMapUnitScale( mOutlineWidthMapUnitScale ); map["horizontal_anchor_point"] = QString::number( mHorizontalAnchorPoint ); map["vertical_anchor_point"] = QString::number( mVerticalAnchorPoint ); @@ -1259,9 +1314,12 @@ QgsSymbolLayerV2* QgsSvgMarkerSymbolLayerV2::clone() const m->setOutlineColor( mOutlineColor ); m->setOutlineWidth( mOutlineWidth ); m->setOutlineWidthUnit( mOutlineWidthUnit ); + m->setOutlineWidthMapUnitScale( mOutlineWidthMapUnitScale ); m->setOffset( mOffset ); m->setOffsetUnit( mOffsetUnit ); + m->setOffsetMapUnitScale( mOffsetMapUnitScale ); m->setSizeUnit( mSizeUnit ); + m->setSizeMapUnitScale( mSizeMapUnitScale ); m->setHorizontalAnchorPoint( mHorizontalAnchorPoint ); m->setVerticalAnchorPoint( mVerticalAnchorPoint ); copyDataDefinedProperties( m ); @@ -1270,21 +1328,35 @@ QgsSymbolLayerV2* QgsSvgMarkerSymbolLayerV2::clone() const void QgsSvgMarkerSymbolLayerV2::setOutputUnit( QgsSymbolV2::OutputUnit unit ) { - mSizeUnit = unit; - mOffsetUnit = unit; + QgsMarkerSymbolLayerV2::setOutputUnit( unit ); mOutlineWidthUnit = unit; } QgsSymbolV2::OutputUnit QgsSvgMarkerSymbolLayerV2::outputUnit() const { - QgsSymbolV2::OutputUnit unit = mSizeUnit; - if ( unit != mOffsetUnit || unit != mOutlineWidthUnit ) + QgsSymbolV2::OutputUnit unit = QgsMarkerSymbolLayerV2::outputUnit(); + if ( unit != mOutlineWidthUnit ) { return QgsSymbolV2::Mixed; } return unit; } +void QgsSvgMarkerSymbolLayerV2::setMapUnitScale( const QgsMapUnitScale &scale ) +{ + QgsMarkerSymbolLayerV2::setMapUnitScale( scale ); + mOutlineWidthMapUnitScale = scale; +} + +QgsMapUnitScale QgsSvgMarkerSymbolLayerV2::mapUnitScale() const +{ + if ( QgsMarkerSymbolLayerV2::mapUnitScale() == mOutlineWidthMapUnitScale ) + { + return mOutlineWidthMapUnitScale; + } + return QgsMapUnitScale(); +} + void QgsSvgMarkerSymbolLayerV2::writeSldMarker( QDomDocument &doc, QDomElement &element, QgsStringMap props ) const { // @@ -1478,8 +1550,12 @@ QgsSymbolLayerV2* QgsFontMarkerSymbolLayerV2::create( const QgsStringMap& props m->setOffset( QgsSymbolLayerV2Utils::decodePoint( props["offset"] ) ); if ( props.contains( "offset_unit" ) ) m->setOffsetUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( props["offset_unit" ] ) ); + if ( props.contains( "offset_map_unit_scale" ) ) + m->setOffsetMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( props["offset_map_unit_scale" ] ) ); if ( props.contains( "size_unit" ) ) m->setSizeUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( props["size_unit"] ) ); + if ( props.contains( "size_map_unit_scale" ) ) + m->setSizeMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( props["size_map_unit_scale"] ) ); if ( props.contains( "horizontal_anchor_point" ) ) { m->setHorizontalAnchorPoint( QgsMarkerSymbolLayerV2::HorizontalAnchorPoint( props[ "horizontal_anchor_point" ].toInt() ) ); @@ -1499,7 +1575,7 @@ QString QgsFontMarkerSymbolLayerV2::layerType() const void QgsFontMarkerSymbolLayerV2::startRender( QgsSymbolV2RenderContext& context ) { mFont = QFont( mFontFamily ); - mFont.setPixelSize( mSize * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mSizeUnit ) ); + mFont.setPixelSize( mSize * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mSizeUnit, mSizeMapUnitScale ) ); QFontMetrics fm( mFont ); mChrOffset = QPointF( fm.width( mChr ) / 2, -fm.ascent() / 2 ); @@ -1552,10 +1628,12 @@ QgsStringMap QgsFontMarkerSymbolLayerV2::properties() const props["chr"] = mChr; props["size"] = QString::number( mSize ); props["size_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mSizeUnit ); + props["size_map_unit_scale"] = QgsSymbolLayerV2Utils::encodeMapUnitScale( mSizeMapUnitScale ); props["color"] = QgsSymbolLayerV2Utils::encodeColor( mColor ); props["angle"] = QString::number( mAngle ); props["offset"] = QgsSymbolLayerV2Utils::encodePoint( mOffset ); props["offset_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mOffsetUnit ); + props["offset_map_unit_scale"] = QgsSymbolLayerV2Utils::encodeMapUnitScale( mOffsetMapUnitScale ); props["horizontal_anchor_point"] = QString::number( mHorizontalAnchorPoint ); props["vertical_anchor_point"] = QString::number( mVerticalAnchorPoint ); return props; @@ -1566,7 +1644,9 @@ QgsSymbolLayerV2* QgsFontMarkerSymbolLayerV2::clone() const QgsFontMarkerSymbolLayerV2* m = new QgsFontMarkerSymbolLayerV2( mFontFamily, mChr, mSize, mColor, mAngle ); m->setOffset( mOffset ); m->setOffsetUnit( mOffsetUnit ); + m->setOffsetMapUnitScale( mOffsetMapUnitScale ); m->setSizeUnit( mSizeUnit ); + m->setSizeMapUnitScale( mSizeMapUnitScale ); m->setHorizontalAnchorPoint( mHorizontalAnchorPoint ); m->setVerticalAnchorPoint( mVerticalAnchorPoint ); return m; @@ -1639,3 +1719,5 @@ QgsSymbolLayerV2* QgsFontMarkerSymbolLayerV2::createFromSld( QDomElement &elemen m->setOffset( offset ); return m; } + + diff --git a/src/core/symbology-ng/qgsmarkersymbollayerv2.h b/src/core/symbology-ng/qgsmarkersymbollayerv2.h index c9271581f2d7..8d86d8146238 100644 --- a/src/core/symbology-ng/qgsmarkersymbollayerv2.h +++ b/src/core/symbology-ng/qgsmarkersymbollayerv2.h @@ -1,9 +1,9 @@ /*************************************************************************** - qgsmarkersymbollayerv2.h - --------------------- - begin : November 2009 - copyright : (C) 2009 by Martin Dobias - email : wonder dot sk at gmail dot com + qgsmarkersymbollayerv2.h + --------------------- + begin : November 2009 + copyright : (C) 2009 by Martin Dobias + email : wonder dot sk at gmail dot com *************************************************************************** * * * This program is free software; you can redistribute it and/or modify * @@ -90,11 +90,21 @@ class CORE_EXPORT QgsSimpleMarkerSymbolLayerV2 : public QgsMarkerSymbolLayerV2 double outlineWidth() const { return mOutlineWidth; } void setOutlineWidth( double w ) { mOutlineWidth = w; } - QgsSymbolV2::OutputUnit outlineWidthUnit() const { return mOutlineWidthUnit; } void setOutlineWidthUnit( QgsSymbolV2::OutputUnit u ) { mOutlineWidthUnit = u; } + QgsSymbolV2::OutputUnit outlineWidthUnit() const { return mOutlineWidthUnit; } + + void setOutlineWidthMapUnitScale( const QgsMapUnitScale& scale ) { mOutlineWidthMapUnitScale = scale; } + const QgsMapUnitScale& outlineWidthMapUnitScale() const { return mOutlineWidthMapUnitScale; } bool writeDxf( QgsDxfExport& e, double mmMapUnitScaleFactor, const QString& layerName, const QgsSymbolV2RenderContext* context, const QgsFeature* f, const QPointF& shift = QPointF( 0.0, 0.0 ) ) const; + + void setOutputUnit( QgsSymbolV2::OutputUnit unit ); + QgsSymbolV2::OutputUnit outputUnit() const; + + void setMapUnitScale( const QgsMapUnitScale& scale ); + QgsMapUnitScale mapUnitScale() const; + protected: void drawMarker( QPainter* p, QgsSymbolV2RenderContext& context ); @@ -110,6 +120,7 @@ class CORE_EXPORT QgsSimpleMarkerSymbolLayerV2 : public QgsMarkerSymbolLayerV2 Qt::PenStyle mOutlineStyle; double mOutlineWidth; QgsSymbolV2::OutputUnit mOutlineWidthUnit; + QgsMapUnitScale mOutlineWidthMapUnitScale; QPen mPen; QBrush mBrush; QPolygonF mPolygon; @@ -178,9 +189,15 @@ class CORE_EXPORT QgsSvgMarkerSymbolLayerV2 : public QgsMarkerSymbolLayerV2 void setOutlineWidthUnit( QgsSymbolV2::OutputUnit unit ) { mOutlineWidthUnit = unit; } QgsSymbolV2::OutputUnit outlineWidthUnit() const { return mOutlineWidthUnit; } + void setOutlineWidthMapUnitScale( const QgsMapUnitScale& scale ) { mOutlineWidthMapUnitScale = scale; } + const QgsMapUnitScale& outlineWidthMapUnitScale() const { return mOutlineWidthMapUnitScale; } + void setOutputUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit outputUnit() const; + void setMapUnitScale( const QgsMapUnitScale& scale ); + QgsMapUnitScale mapUnitScale() const; + bool writeDxf( QgsDxfExport& e, double mmMapUnitScaleFactor, const QString& layerName, const QgsSymbolV2RenderContext* context, const QgsFeature* f, const QPointF& shift = QPointF( 0.0, 0.0 ) ) const; protected: @@ -192,6 +209,7 @@ class CORE_EXPORT QgsSvgMarkerSymbolLayerV2 : public QgsMarkerSymbolLayerV2 QColor mOutlineColor; double mOutlineWidth; QgsSymbolV2::OutputUnit mOutlineWidthUnit; + QgsMapUnitScale mOutlineWidthMapUnitScale; double mOrigSize; }; @@ -257,3 +275,5 @@ class CORE_EXPORT QgsFontMarkerSymbolLayerV2 : public QgsMarkerSymbolLayerV2 #endif + + diff --git a/src/core/symbology-ng/qgspointdisplacementrenderer.cpp b/src/core/symbology-ng/qgspointdisplacementrenderer.cpp index 1a4196320e4a..84650aa80a49 100644 --- a/src/core/symbology-ng/qgspointdisplacementrenderer.cpp +++ b/src/core/symbology-ng/qgspointdisplacementrenderer.cpp @@ -1,6 +1,6 @@ /*************************************************************************** - qgspointdisplacementrenderer.cpp - -------------------------------- + qgspointdisplacementrenderer.cpp + -------------------------------- begin : January 26, 2010 copyright : (C) 2010 by Marco Hugentobler email : marco at hugis dot net @@ -149,7 +149,7 @@ void QgsPointDisplacementRenderer::drawGroup( const DisplacementGroup& group, Qg { if ( *it ) { - currentWidthFactor = QgsSymbolLayerV2Utils::lineWidthScaleFactor( context, ( *it )->outputUnit() ); + currentWidthFactor = QgsSymbolLayerV2Utils::lineWidthScaleFactor( context, ( *it )->outputUnit(), ( *it )->mapUnitScale() ); double currentDiagonal = sqrt( 2 * (( *it )->size() * ( *it )->size() ) ) * currentWidthFactor; if ( currentDiagonal > diagonal ) { @@ -516,3 +516,5 @@ QgsSymbolV2* QgsPointDisplacementRenderer::firstSymbolForFeature( QgsFeatureRend return symbolList.at( 0 ); } + + diff --git a/src/core/symbology-ng/qgssymbollayerv2.cpp b/src/core/symbology-ng/qgssymbollayerv2.cpp index c53e6ec06719..f06ad43ca3c2 100644 --- a/src/core/symbology-ng/qgssymbollayerv2.cpp +++ b/src/core/symbology-ng/qgssymbollayerv2.cpp @@ -1,9 +1,9 @@ /*************************************************************************** - qgssymbollayerv2.cpp - --------------------- - begin : November 2009 - copyright : (C) 2009 by Martin Dobias - email : wonder dot sk at gmail dot com + qgssymbollayerv2.cpp + --------------------- + begin : November 2009 + copyright : (C) 2009 by Martin Dobias + email : wonder dot sk at gmail dot com *************************************************************************** * * * This program is free software; you can redistribute it and/or modify * @@ -226,20 +226,14 @@ void QgsMarkerSymbolLayerV2::drawPreviewIcon( QgsSymbolV2RenderContext& context, stopRender( context ); } -void QgsMarkerSymbolLayerV2::setOutputUnit( QgsSymbolV2::OutputUnit unit ) -{ - mSizeUnit = unit; - mOffsetUnit = unit; -} - void QgsMarkerSymbolLayerV2::markerOffset( const QgsSymbolV2RenderContext& context, double& offsetX, double& offsetY ) const { - markerOffset( context, mSize, mSize, mSizeUnit, mSizeUnit, offsetX, offsetY ); + markerOffset( context, mSize, mSize, mSizeUnit, mSizeUnit, offsetX, offsetY, mSizeMapUnitScale, mSizeMapUnitScale ); } void QgsMarkerSymbolLayerV2::markerOffset( const QgsSymbolV2RenderContext& context, double width, double height, QgsSymbolV2::OutputUnit widthUnit, QgsSymbolV2::OutputUnit heightUnit, - double& offsetX, double& offsetY ) const + double& offsetX, double& offsetY, const QgsMapUnitScale& widthMapUnitScale, const QgsMapUnitScale& heightMapUnitScale ) const { offsetX = mOffset.x(); offsetY = mOffset.y(); @@ -251,8 +245,8 @@ void QgsMarkerSymbolLayerV2::markerOffset( const QgsSymbolV2RenderContext& conte offsetY = offset.y(); } - offsetX *= QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit ); - offsetY *= QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit ); + offsetX *= QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit, mOffsetMapUnitScale ); + offsetY *= QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit, mOffsetMapUnitScale ); HorizontalAnchorPoint horizontalAnchorPoint = mHorizontalAnchorPoint; VerticalAnchorPoint verticalAnchorPoint = mVerticalAnchorPoint; @@ -271,8 +265,8 @@ void QgsMarkerSymbolLayerV2::markerOffset( const QgsSymbolV2RenderContext& conte return; } - double anchorPointCorrectionX = width * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), widthUnit ) / 2.0; - double anchorPointCorrectionY = height * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), heightUnit ) / 2.0; + double anchorPointCorrectionX = width * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), widthUnit, widthMapUnitScale ) / 2.0; + double anchorPointCorrectionY = height * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), heightUnit, heightMapUnitScale ) / 2.0; if ( horizontalAnchorPoint == Left ) { offsetX += anchorPointCorrectionX; @@ -332,16 +326,57 @@ QgsMarkerSymbolLayerV2::VerticalAnchorPoint QgsMarkerSymbolLayerV2::decodeVertic } } +void QgsMarkerSymbolLayerV2::setOutputUnit( QgsSymbolV2::OutputUnit unit ) +{ + mSizeUnit = unit; + mOffsetUnit = unit; +} + QgsSymbolV2::OutputUnit QgsMarkerSymbolLayerV2::outputUnit() const { - QgsSymbolV2::OutputUnit unit = mSizeUnit; - if ( mOffsetUnit != unit ) + if ( mOffsetUnit != mSizeUnit ) { return QgsSymbolV2::Mixed; } - return unit; + return mOffsetUnit; } +void QgsMarkerSymbolLayerV2::setMapUnitScale( const QgsMapUnitScale &scale ) +{ + mSizeMapUnitScale = scale; + mOffsetMapUnitScale = scale; +} + +QgsMapUnitScale QgsMarkerSymbolLayerV2::mapUnitScale() const +{ + if ( mSizeMapUnitScale == mOffsetMapUnitScale ) + { + return mSizeMapUnitScale; + } + return QgsMapUnitScale(); +} + +void QgsLineSymbolLayerV2::setOutputUnit( QgsSymbolV2::OutputUnit unit ) +{ + mWidthUnit = unit; +} + +QgsSymbolV2::OutputUnit QgsLineSymbolLayerV2::outputUnit() const +{ + return mWidthUnit; +} + +void QgsLineSymbolLayerV2::setMapUnitScale( const QgsMapUnitScale& scale ) +{ + mWidthMapUnitScale = scale; +} + +QgsMapUnitScale QgsLineSymbolLayerV2::mapUnitScale() const +{ + return mWidthMapUnitScale; +} + + void QgsLineSymbolLayerV2::drawPreviewIcon( QgsSymbolV2RenderContext& context, QSize size ) { QPolygonF points; @@ -432,3 +467,5 @@ void QgsMarkerSymbolLayerV2::toSld( QDomDocument &doc, QDomElement &element, Qgs writeSldMarker( doc, symbolizerElem, props ); } + + diff --git a/src/core/symbology-ng/qgssymbollayerv2.h b/src/core/symbology-ng/qgssymbollayerv2.h index 8481ad14e3dc..f7e335e0817a 100644 --- a/src/core/symbology-ng/qgssymbollayerv2.h +++ b/src/core/symbology-ng/qgssymbollayerv2.h @@ -1,9 +1,9 @@ /*************************************************************************** - qgssymbollayerv2.h - --------------------- - begin : November 2009 - copyright : (C) 2009 by Martin Dobias - email : wonder dot sk at gmail dot com + qgssymbollayerv2.h + --------------------- + begin : November 2009 + copyright : (C) 2009 by Martin Dobias + email : wonder dot sk at gmail dot com *************************************************************************** * * * This program is free software; you can redistribute it and/or modify * @@ -98,6 +98,9 @@ class CORE_EXPORT QgsSymbolLayerV2 virtual void setOutputUnit( QgsSymbolV2::OutputUnit unit ) { Q_UNUSED( unit ); } //= 0; virtual QgsSymbolV2::OutputUnit outputUnit() const { return QgsSymbolV2::Mixed; } //= 0; + virtual void setMapUnitScale( const QgsMapUnitScale& scale ) { Q_UNUSED( scale ); } //= 0; + virtual QgsMapUnitScale mapUnitScale() const { return QgsMapUnitScale(); } //= 0; + // used only with rending with symbol levels is turned on (0 = first pass, 1 = second, ...) void setRenderingPass( int renderingPass ) { mRenderingPass = renderingPass; } int renderingPass() const { return mRenderingPass; } @@ -196,11 +199,20 @@ class CORE_EXPORT QgsMarkerSymbolLayerV2 : public QgsSymbolLayerV2 void setOffsetUnit( QgsSymbolV2::OutputUnit unit ) { mOffsetUnit = unit; } QgsSymbolV2::OutputUnit offsetUnit() const { return mOffsetUnit; } + void setOffsetMapUnitScale( const QgsMapUnitScale& scale ) { mOffsetMapUnitScale = scale; } + const QgsMapUnitScale& offsetMapUnitScale() const { return mOffsetMapUnitScale; } + void setSizeUnit( QgsSymbolV2::OutputUnit unit ) { mSizeUnit = unit; } QgsSymbolV2::OutputUnit sizeUnit() const { return mSizeUnit; } - virtual void setOutputUnit( QgsSymbolV2::OutputUnit unit ); - virtual QgsSymbolV2::OutputUnit outputUnit() const; + void setSizeMapUnitScale( const QgsMapUnitScale& scale ) { mSizeMapUnitScale = scale; } + const QgsMapUnitScale& sizeMapUnitScale() const { return mSizeMapUnitScale; } + + void setOutputUnit( QgsSymbolV2::OutputUnit unit ); + QgsSymbolV2::OutputUnit outputUnit() const; + + void setMapUnitScale( const QgsMapUnitScale& scale ); + QgsMapUnitScale mapUnitScale() const; void setHorizontalAnchorPoint( HorizontalAnchorPoint h ) { mHorizontalAnchorPoint = h; } HorizontalAnchorPoint horizontalAnchorPoint() const { return mHorizontalAnchorPoint; } @@ -217,15 +229,18 @@ class CORE_EXPORT QgsMarkerSymbolLayerV2 : public QgsSymbolLayerV2 //! @note available in python bindings as markerOffset2 void markerOffset( const QgsSymbolV2RenderContext& context, double width, double height, QgsSymbolV2::OutputUnit widthUnit, QgsSymbolV2::OutputUnit heightUnit, - double& offsetX, double& offsetY ) const; + double& offsetX, double& offsetY, + const QgsMapUnitScale &widthMapUnitScale, const QgsMapUnitScale &heightMapUnitScale ) const; static QPointF _rotatedOffset( const QPointF& offset, double angle ); double mAngle; double mSize; QgsSymbolV2::OutputUnit mSizeUnit; + QgsMapUnitScale mSizeMapUnitScale; QPointF mOffset; QgsSymbolV2::OutputUnit mOffsetUnit; + QgsMapUnitScale mOffsetMapUnitScale; QgsSymbolV2::ScaleMethod mScaleMethod; HorizontalAnchorPoint mHorizontalAnchorPoint; VerticalAnchorPoint mVerticalAnchorPoint; @@ -253,6 +268,15 @@ class CORE_EXPORT QgsLineSymbolLayerV2 : public QgsSymbolLayerV2 void setWidthUnit( QgsSymbolV2::OutputUnit unit ) { mWidthUnit = unit; } QgsSymbolV2::OutputUnit widthUnit() const { return mWidthUnit; } + void setWidthMapUnitScale( const QgsMapUnitScale& scale ) { mWidthMapUnitScale = scale; } + const QgsMapUnitScale& widthMapUnitScale() const { return mWidthMapUnitScale; } + + void setOutputUnit( QgsSymbolV2::OutputUnit unit ); + QgsSymbolV2::OutputUnit outputUnit() const; + + void setMapUnitScale( const QgsMapUnitScale& scale ); + QgsMapUnitScale mapUnitScale() const; + void drawPreviewIcon( QgsSymbolV2RenderContext& context, QSize size ); virtual double dxfWidth( const QgsDxfExport& e, const QgsSymbolV2RenderContext& context ) const; @@ -262,6 +286,7 @@ class CORE_EXPORT QgsLineSymbolLayerV2 : public QgsSymbolLayerV2 double mWidth; QgsSymbolV2::OutputUnit mWidthUnit; + QgsMapUnitScale mWidthMapUnitScale; }; class CORE_EXPORT QgsFillSymbolLayerV2 : public QgsSymbolLayerV2 @@ -285,3 +310,5 @@ class CORE_EXPORT QgsFillSymbolLayerV2 : public QgsSymbolLayerV2 class QgsSymbolLayerV2Widget; // why does SIP fail, when this isn't here #endif + + diff --git a/src/core/symbology-ng/qgssymbollayerv2utils.cpp b/src/core/symbology-ng/qgssymbollayerv2utils.cpp index 47dde2eace08..20752b2e53e4 100644 --- a/src/core/symbology-ng/qgssymbollayerv2utils.cpp +++ b/src/core/symbology-ng/qgssymbollayerv2utils.cpp @@ -1,9 +1,9 @@ /*************************************************************************** - qgssymbollayerv2utils.cpp - --------------------- - begin : November 2009 - copyright : (C) 2009 by Martin Dobias - email : wonder dot sk at gmail dot com + qgssymbollayerv2utils.cpp + --------------------- + begin : November 2009 + copyright : (C) 2009 by Martin Dobias + email : wonder dot sk at gmail dot com *************************************************************************** * * * This program is free software; you can redistribute it and/or modify * @@ -325,6 +325,19 @@ QPointF QgsSymbolLayerV2Utils::decodePoint( QString str ) return QPointF( lst[0].toDouble(), lst[1].toDouble() ); } +QString QgsSymbolLayerV2Utils::encodeMapUnitScale( const QgsMapUnitScale& mapUnitScale ) +{ + return QString( "%1,%2" ).arg( mapUnitScale.minScale ).arg( mapUnitScale.maxScale ); +} + +QgsMapUnitScale QgsSymbolLayerV2Utils::decodeMapUnitScale( const QString& str ) +{ + QStringList lst = str.split( ',' ); + if ( lst.count() != 2 ) + return QgsMapUnitScale(); + return QgsMapUnitScale( lst[0].toDouble(), lst[1].toDouble() ); +} + QString QgsSymbolLayerV2Utils::encodeOutputUnit( QgsSymbolV2::OutputUnit unit ) { switch ( unit ) @@ -518,7 +531,7 @@ double QgsSymbolLayerV2Utils::estimateMaxSymbolBleed( QgsSymbolV2* symbol ) return maxBleed; } -QIcon QgsSymbolLayerV2Utils::symbolLayerPreviewIcon( QgsSymbolLayerV2* layer, QgsSymbolV2::OutputUnit u, QSize size ) +QIcon QgsSymbolLayerV2Utils::symbolLayerPreviewIcon( QgsSymbolLayerV2* layer, QgsSymbolV2::OutputUnit u, QSize size, const QgsMapUnitScale& scale ) { QPixmap pixmap( size ); pixmap.fill( Qt::transparent ); @@ -526,7 +539,7 @@ QIcon QgsSymbolLayerV2Utils::symbolLayerPreviewIcon( QgsSymbolLayerV2* layer, Qg painter.begin( &pixmap ); painter.setRenderHint( QPainter::Antialiasing ); QgsRenderContext renderContext = createRenderContext( &painter ); - QgsSymbolV2RenderContext symbolContext( renderContext, u ); + QgsSymbolV2RenderContext symbolContext( renderContext, u, 1.0, false, 0, 0, 0, scale ); layer->drawPreviewIcon( symbolContext, size ); painter.end(); return QIcon( pixmap ); @@ -586,7 +599,7 @@ void QgsSymbolLayerV2Utils::drawStippledBackround( QPainter* painter, QRect rect #if !defined(GEOS_VERSION_MAJOR) || !defined(GEOS_VERSION_MINOR) || \ - ((GEOS_VERSION_MAJOR<3) || ((GEOS_VERSION_MAJOR==3) && (GEOS_VERSION_MINOR<3))) + ((GEOS_VERSION_MAJOR<3) || ((GEOS_VERSION_MAJOR==3) && (GEOS_VERSION_MINOR<3))) // calculate line's angle and tangent static bool lineInfo( QPointF p1, QPointF p2, double& angle, double& t ) { @@ -658,7 +671,7 @@ QPolygonF offsetLine( QPolygonF polyline, double dist ) // need at least geos 3.3 for OffsetCurve tool #if defined(GEOS_VERSION_MAJOR) && defined(GEOS_VERSION_MINOR) && \ - ((GEOS_VERSION_MAJOR>3) || ((GEOS_VERSION_MAJOR==3) && (GEOS_VERSION_MINOR>=3))) + ((GEOS_VERSION_MAJOR>3) || ((GEOS_VERSION_MAJOR==3) && (GEOS_VERSION_MINOR>=3))) unsigned int i, pointCount = polyline.count(); @@ -799,6 +812,13 @@ QgsSymbolV2* QgsSymbolLayerV2Utils::loadSymbol( QDomElement& element ) { symbol->setOutputUnit( decodeOutputUnit( element.attribute( "outputUnit" ) ) ); } + if ( element.hasAttribute(( "mapUnitScale" ) ) ) + { + QgsMapUnitScale mapUnitScale; + mapUnitScale.minScale = element.attribute( "mapUnitMinScale", "0.0" ).toDouble(); + mapUnitScale.maxScale = element.attribute( "mapUnitMaxScale", "0.0" ).toDouble(); + symbol->setMapUnitScale( mapUnitScale ); + } symbol->setAlpha( element.attribute( "alpha", "1.0" ).toDouble() ); return symbol; @@ -1281,9 +1301,9 @@ bool QgsSymbolLayerV2Utils::convertPolygonSymbolizerToPointMarker( QDomElement & QgsDebugMsg( "Entered." ); /* SE 1.1 says about PolygonSymbolizer: - if a point geometry is referenced instead of a polygon, - then a small, square, ortho-normal polygon should be - constructed for rendering. + if a point geometry is referenced instead of a polygon, + then a small, square, ortho-normal polygon should be + constructed for rendering. */ QgsSymbolLayerV2List layers; @@ -2615,7 +2635,7 @@ QColor QgsSymbolLayerV2Utils::parseColor( QString colorStr ) return QColor( p[0].toInt(), p[1].toInt(), p[2].toInt() ); } -double QgsSymbolLayerV2Utils::lineWidthScaleFactor( const QgsRenderContext& c, QgsSymbolV2::OutputUnit u ) +double QgsSymbolLayerV2Utils::lineWidthScaleFactor( const QgsRenderContext& c, QgsSymbolV2::OutputUnit u, const QgsMapUnitScale& scale ) { if ( u == QgsSymbolV2::MM ) @@ -2624,7 +2644,7 @@ double QgsSymbolLayerV2Utils::lineWidthScaleFactor( const QgsRenderContext& c, Q } else //QgsSymbol::MapUnit { - double mup = c.mapToPixel().mapUnitsPerPixel(); + double mup = scale.computeMapUnitsPerPixel( c ); if ( mup > 0 ) { return 1.0 / mup; @@ -2636,7 +2656,7 @@ double QgsSymbolLayerV2Utils::lineWidthScaleFactor( const QgsRenderContext& c, Q } } -double QgsSymbolLayerV2Utils::pixelSizeScaleFactor( const QgsRenderContext& c, QgsSymbolV2::OutputUnit u ) +double QgsSymbolLayerV2Utils::pixelSizeScaleFactor( const QgsRenderContext& c, QgsSymbolV2::OutputUnit u, const QgsMapUnitScale& scale ) { if ( u == QgsSymbolV2::MM ) { @@ -2644,10 +2664,10 @@ double QgsSymbolLayerV2Utils::pixelSizeScaleFactor( const QgsRenderContext& c, Q } else //QgsSymbol::MapUnit { - double mup = c.mapToPixel().mapUnitsPerPixel(); + double mup = scale.computeMapUnitsPerPixel( c ); if ( mup > 0 ) { - return c.rasterScaleFactor() / c.mapToPixel().mapUnitsPerPixel(); + return c.rasterScaleFactor() / mup; } else { @@ -3064,3 +3084,5 @@ QString QgsSymbolLayerV2Utils::fieldOrExpressionFromExpression( QgsExpression* e return expression->expression(); } + + diff --git a/src/core/symbology-ng/qgssymbollayerv2utils.h b/src/core/symbology-ng/qgssymbollayerv2utils.h index 331e79217997..028782ad8a07 100644 --- a/src/core/symbology-ng/qgssymbollayerv2utils.h +++ b/src/core/symbology-ng/qgssymbollayerv2utils.h @@ -1,9 +1,9 @@ /*************************************************************************** - qgssymbollayerv2utils.h - --------------------- - begin : November 2009 - copyright : (C) 2009 by Martin Dobias - email : wonder dot sk at gmail dot com + qgssymbollayerv2utils.h + --------------------- + begin : November 2009 + copyright : (C) 2009 by Martin Dobias + email : wonder dot sk at gmail dot com *************************************************************************** * * * This program is free software; you can redistribute it and/or modify * @@ -24,6 +24,7 @@ #include #include "qgssymbolv2.h" #include "qgis.h" +#include "qgsmapunitscale.h" class QgsExpression; class QgsSymbolLayerV2; @@ -79,6 +80,9 @@ class CORE_EXPORT QgsSymbolLayerV2Utils static QString encodePoint( QPointF point ); static QPointF decodePoint( QString str ); + static QString encodeMapUnitScale( const QgsMapUnitScale& mapUnitScale ); + static QgsMapUnitScale decodeMapUnitScale( const QString& str ); + static QString encodeRealVector( const QVector& v ); static QVector decodeRealVector( const QString& s ); @@ -95,7 +99,7 @@ class CORE_EXPORT QgsSymbolLayerV2Utils static QgsSymbolV2::ScaleMethod decodeScaleMethod( QString str ); static QIcon symbolPreviewIcon( QgsSymbolV2* symbol, QSize size ); - static QIcon symbolLayerPreviewIcon( QgsSymbolLayerV2* layer, QgsSymbolV2::OutputUnit u, QSize size ); + static QIcon symbolLayerPreviewIcon( QgsSymbolLayerV2* layer, QgsSymbolV2::OutputUnit u, QSize size, const QgsMapUnitScale& scale = QgsMapUnitScale() ); static QIcon colorRampPreviewIcon( QgsVectorColorRampV2* ramp, QSize size ); static void drawStippledBackround( QPainter* painter, QRect rect ); @@ -183,7 +187,7 @@ class CORE_EXPORT QgsSymbolLayerV2Utils double offset = 0.0, const QVector* dashPattern = 0 ); /**Create ogr feature style string for brush - @param fillColr fill color*/ + @param fillColr fill color*/ static QString ogrFeatureStyleBrush( const QColor& fillColr ); static void createRotationElement( QDomDocument &doc, QDomElement &element, QString rotationFunc ); @@ -225,9 +229,9 @@ class CORE_EXPORT QgsSymbolLayerV2Utils static QColor parseColor( QString colorStr ); /**Returns the line width scale factor depending on the unit and the paint device*/ - static double lineWidthScaleFactor( const QgsRenderContext& c, QgsSymbolV2::OutputUnit u ); + static double lineWidthScaleFactor( const QgsRenderContext& c, QgsSymbolV2::OutputUnit u, const QgsMapUnitScale& scale = QgsMapUnitScale() ); /**Returns scale factor painter units -> pixel dimensions*/ - static double pixelSizeScaleFactor( const QgsRenderContext& c, QgsSymbolV2::OutputUnit u ); + static double pixelSizeScaleFactor( const QgsRenderContext& c, QgsSymbolV2::OutputUnit u, const QgsMapUnitScale& scale = QgsMapUnitScale() ); /**Creates a render context for a pixel based device*/ static QgsRenderContext createRenderContext( QPainter* p ); @@ -291,3 +295,5 @@ QPolygonF offsetLine( QPolygonF polyline, double dist ); #endif + + diff --git a/src/core/symbology-ng/qgssymbolv2.cpp b/src/core/symbology-ng/qgssymbolv2.cpp index bd714c177c53..5e6e82213327 100644 --- a/src/core/symbology-ng/qgssymbolv2.cpp +++ b/src/core/symbology-ng/qgssymbolv2.cpp @@ -1,9 +1,9 @@ /*************************************************************************** - qgssymbolv2.cpp - --------------------- - begin : November 2009 - copyright : (C) 2009 by Martin Dobias - email : wonder dot sk at gmail dot com + qgssymbolv2.cpp + --------------------- + begin : November 2009 + copyright : (C) 2009 by Martin Dobias + email : wonder dot sk at gmail dot com *************************************************************************** * * * This program is free software; you can redistribute it and/or modify * @@ -62,25 +62,45 @@ QgsSymbolV2::~QgsSymbolV2() QgsSymbolV2::OutputUnit QgsSymbolV2::outputUnit() const { - QgsSymbolV2::OutputUnit unit( QgsSymbolV2::Mixed ); + if ( mLayers.empty() ) + { + return QgsSymbolV2::Mixed; + } QgsSymbolLayerV2List::const_iterator it = mLayers.constBegin(); + + QgsSymbolV2::OutputUnit unit = ( *it )->outputUnit(); + for ( ; it != mLayers.constEnd(); ++it ) { - if ( it == mLayers.constBegin() ) + if (( *it )->outputUnit() != unit ) { - unit = ( *it )->outputUnit(); + return QgsSymbolV2::Mixed; } - else + } + return unit; +} + +QgsMapUnitScale QgsSymbolV2::mapUnitScale() const +{ + if ( mLayers.empty() ) + { + return QgsMapUnitScale(); + } + + QgsSymbolLayerV2List::const_iterator it = mLayers.constBegin(); + + QgsMapUnitScale scale = ( *it )->mapUnitScale(); + ++it; + + for ( ; it != mLayers.constEnd(); ++it ) + { + if (( *it )->mapUnitScale() != scale ) { - if (( *it )->outputUnit() != unit ) - { - return QgsSymbolV2::Mixed; - } + return QgsMapUnitScale(); } } - - return unit; + return scale; } void QgsSymbolV2::setOutputUnit( QgsSymbolV2::OutputUnit u ) @@ -92,6 +112,15 @@ void QgsSymbolV2::setOutputUnit( QgsSymbolV2::OutputUnit u ) } } +void QgsSymbolV2::setMapUnitScale( const QgsMapUnitScale &scale ) +{ + QgsSymbolLayerV2List::iterator it = mLayers.begin(); + for ( ; it != mLayers.end(); ++it ) + { + ( *it )->setMapUnitScale( scale ); + } +} + QgsSymbolV2* QgsSymbolV2::defaultSymbol( QGis::GeometryType geomType ) { QgsSymbolV2* s = 0; @@ -215,7 +244,7 @@ bool QgsSymbolV2::changeSymbolLayer( int index, QgsSymbolLayerV2* layer ) void QgsSymbolV2::startRender( QgsRenderContext& context, const QgsFields* fields ) { - QgsSymbolV2RenderContext symbolContext( context, outputUnit(), mAlpha, false, mRenderHints, 0, fields ); + QgsSymbolV2RenderContext symbolContext( context, outputUnit(), mAlpha, false, mRenderHints, 0, fields, mapUnitScale() ); for ( QgsSymbolLayerV2List::iterator it = mLayers.begin(); it != mLayers.end(); ++it ) @@ -224,7 +253,7 @@ void QgsSymbolV2::startRender( QgsRenderContext& context, const QgsFields* field void QgsSymbolV2::stopRender( QgsRenderContext& context ) { - QgsSymbolV2RenderContext symbolContext( context, outputUnit(), mAlpha, false, mRenderHints ); + QgsSymbolV2RenderContext symbolContext( context, outputUnit(), mAlpha, false, mRenderHints, 0, 0, mapUnitScale() ); for ( QgsSymbolLayerV2List::iterator it = mLayers.begin(); it != mLayers.end(); ++it ) ( *it )->stopRender( symbolContext ); @@ -255,7 +284,7 @@ QColor QgsSymbolV2::color() const void QgsSymbolV2::drawPreviewIcon( QPainter* painter, QSize size ) { QgsRenderContext context = QgsSymbolLayerV2Utils::createRenderContext( painter ); - QgsSymbolV2RenderContext symbolContext( context, outputUnit(), mAlpha, false, mRenderHints ); + QgsSymbolV2RenderContext symbolContext( context, outputUnit(), mAlpha, false, mRenderHints, 0, 0, mapUnitScale() ); for ( QgsSymbolLayerV2List::iterator it = mLayers.begin(); it != mLayers.end(); ++it ) { @@ -380,8 +409,8 @@ QSet QgsSymbolV2::usedAttributes() const //////////////////// -QgsSymbolV2RenderContext::QgsSymbolV2RenderContext( QgsRenderContext& c, QgsSymbolV2::OutputUnit u, qreal alpha, bool selected, int renderHints, const QgsFeature* f, const QgsFields* fields ) - : mRenderContext( c ), mOutputUnit( u ), mAlpha( alpha ), mSelected( selected ), mRenderHints( renderHints ), mFeature( f ), mFields( fields ) +QgsSymbolV2RenderContext::QgsSymbolV2RenderContext( QgsRenderContext& c, QgsSymbolV2::OutputUnit u, qreal alpha, bool selected, int renderHints, const QgsFeature* f, const QgsFields* fields, const QgsMapUnitScale& mapUnitScale ) + : mRenderContext( c ), mOutputUnit( u ), mMapUnitScale( mapUnitScale ), mAlpha( alpha ), mSelected( selected ), mRenderHints( renderHints ), mFeature( f ), mFields( fields ) { } @@ -394,12 +423,12 @@ QgsSymbolV2RenderContext::~QgsSymbolV2RenderContext() double QgsSymbolV2RenderContext::outputLineWidth( double width ) const { - return width * QgsSymbolLayerV2Utils::lineWidthScaleFactor( mRenderContext, mOutputUnit ); + return width * QgsSymbolLayerV2Utils::lineWidthScaleFactor( mRenderContext, mOutputUnit, mMapUnitScale ); } double QgsSymbolV2RenderContext::outputPixelSize( double size ) const { - return size * QgsSymbolLayerV2Utils::pixelSizeScaleFactor( mRenderContext, mOutputUnit ); + return size * QgsSymbolLayerV2Utils::pixelSizeScaleFactor( mRenderContext, mOutputUnit, mMapUnitScale ); } QgsSymbolV2RenderContext& QgsSymbolV2RenderContext::operator=( const QgsSymbolV2RenderContext& ) @@ -536,7 +565,7 @@ QgsSymbolV2::ScaleMethod QgsMarkerSymbolV2::scaleMethod() void QgsMarkerSymbolV2::renderPoint( const QPointF& point, const QgsFeature* f, QgsRenderContext& context, int layer, bool selected ) { - QgsSymbolV2RenderContext symbolContext( context, outputUnit(), mAlpha, selected, mRenderHints, f ); + QgsSymbolV2RenderContext symbolContext( context, outputUnit(), mAlpha, selected, mRenderHints, f, 0, mapUnitScale() ); if ( layer != -1 ) { @@ -605,7 +634,7 @@ double QgsLineSymbolV2::width() void QgsLineSymbolV2::renderPolyline( const QPolygonF& points, const QgsFeature* f, QgsRenderContext& context, int layer, bool selected ) { - QgsSymbolV2RenderContext symbolContext( context, outputUnit(), mAlpha, selected, mRenderHints, f ); + QgsSymbolV2RenderContext symbolContext( context, outputUnit(), mAlpha, selected, mRenderHints, f, 0, mapUnitScale() ); if ( layer != -1 ) { @@ -641,7 +670,7 @@ QgsFillSymbolV2::QgsFillSymbolV2( QgsSymbolLayerV2List layers ) void QgsFillSymbolV2::renderPolygon( const QPolygonF& points, QList* rings, const QgsFeature* f, QgsRenderContext& context, int layer, bool selected ) { - QgsSymbolV2RenderContext symbolContext( context, outputUnit(), mAlpha, selected, mRenderHints, f ); + QgsSymbolV2RenderContext symbolContext( context, outputUnit(), mAlpha, selected, mRenderHints, f, 0, mapUnitScale() ); if ( layer != -1 ) { @@ -688,3 +717,5 @@ void QgsFillSymbolV2::setAngle( double angle ) layer->setAngle( angle ); } } + + diff --git a/src/core/symbology-ng/qgssymbolv2.h b/src/core/symbology-ng/qgssymbolv2.h index 2b7bf9ea5a42..b041156fbfb6 100644 --- a/src/core/symbology-ng/qgssymbolv2.h +++ b/src/core/symbology-ng/qgssymbolv2.h @@ -1,9 +1,9 @@ /*************************************************************************** - qgssymbolv2.h - --------------------- - begin : November 2009 - copyright : (C) 2009 by Martin Dobias - email : wonder dot sk at gmail dot com + qgssymbolv2.h + --------------------- + begin : November 2009 + copyright : (C) 2009 by Martin Dobias + email : wonder dot sk at gmail dot com *************************************************************************** * * * This program is free software; you can redistribute it and/or modify * @@ -19,6 +19,7 @@ #include "qgis.h" #include #include +#include "qgsmapunitscale.h" class QColor; class QImage; @@ -117,6 +118,9 @@ class CORE_EXPORT QgsSymbolV2 QgsSymbolV2::OutputUnit outputUnit() const; void setOutputUnit( QgsSymbolV2::OutputUnit u ); + QgsMapUnitScale mapUnitScale() const; + void setMapUnitScale( const QgsMapUnitScale& scale ); + //! Get alpha transparency 1 for opaque, 0 for invisible qreal alpha() const { return mAlpha; } //! Set alpha transparency 1 for opaque, 0 for invisible @@ -158,7 +162,7 @@ class CORE_EXPORT QgsSymbolV2 class CORE_EXPORT QgsSymbolV2RenderContext { public: - QgsSymbolV2RenderContext( QgsRenderContext& c, QgsSymbolV2::OutputUnit u , qreal alpha = 1.0, bool selected = false, int renderHints = 0, const QgsFeature* f = 0, const QgsFields* = 0 ); + QgsSymbolV2RenderContext( QgsRenderContext& c, QgsSymbolV2::OutputUnit u , qreal alpha = 1.0, bool selected = false, int renderHints = 0, const QgsFeature* f = 0, const QgsFields* = 0, const QgsMapUnitScale& mapUnitScale = QgsMapUnitScale() ); ~QgsSymbolV2RenderContext(); QgsRenderContext& renderContext() { return mRenderContext; } @@ -168,6 +172,9 @@ class CORE_EXPORT QgsSymbolV2RenderContext QgsSymbolV2::OutputUnit outputUnit() const { return mOutputUnit; } void setOutputUnit( QgsSymbolV2::OutputUnit u ) { mOutputUnit = u; } + QgsMapUnitScale mapUnitScale() const { return mMapUnitScale; } + void setMapUnitScale( const QgsMapUnitScale& scale ) { mMapUnitScale = scale; } + //! Get alpha transparency 1 for opaque, 0 for invisible qreal alpha() const { return mAlpha; } //! Set alpha transparency 1 for opaque, 0 for invisible @@ -200,6 +207,7 @@ class CORE_EXPORT QgsSymbolV2RenderContext private: QgsRenderContext& mRenderContext; QgsSymbolV2::OutputUnit mOutputUnit; + QgsMapUnitScale mMapUnitScale; qreal mAlpha; bool mSelected; int mRenderHints; @@ -301,3 +309,5 @@ QgsLineSymbol* s = new LineSymbol( [ sl ] ); rend = QgsSingleSymbolRenderer( new LineSymbol() ); */ + + diff --git a/src/core/symbology-ng/qgsvectorfieldsymbollayer.cpp b/src/core/symbology-ng/qgsvectorfieldsymbollayer.cpp index 667aad79a4b3..87120ed66cac 100644 --- a/src/core/symbology-ng/qgsvectorfieldsymbollayer.cpp +++ b/src/core/symbology-ng/qgsvectorfieldsymbollayer.cpp @@ -1,6 +1,6 @@ /*************************************************************************** - qgsvectorfieldsymbollayer.cpp - ----------------------------- + qgsvectorfieldsymbollayer.cpp + ----------------------------- begin : Octorer 25, 2011 copyright : (C) 2011 by Marco Hugentobler email : marco dot hugentobler at sourcepole dot ch @@ -30,12 +30,32 @@ QgsVectorFieldSymbolLayer::~QgsVectorFieldSymbolLayer() void QgsVectorFieldSymbolLayer::setOutputUnit( QgsSymbolV2::OutputUnit unit ) { - mDistanceUnit = unit; //other units are not used + QgsMarkerSymbolLayerV2::setOutputUnit( unit ); + mDistanceUnit = unit; } QgsSymbolV2::OutputUnit QgsVectorFieldSymbolLayer::outputUnit() const { - return mDistanceUnit; + if ( QgsMarkerSymbolLayerV2::outputUnit() == mDistanceUnit ) + { + return mDistanceUnit; + } + return QgsSymbolV2::Mixed; +} + +void QgsVectorFieldSymbolLayer::setMapUnitScale( const QgsMapUnitScale &scale ) +{ + QgsMarkerSymbolLayerV2::setMapUnitScale( scale ); + mDistanceMapUnitScale = scale; +} + +QgsMapUnitScale QgsVectorFieldSymbolLayer::mapUnitScale() const +{ + if ( QgsMarkerSymbolLayerV2::mapUnitScale() == mDistanceMapUnitScale ) + { + return mDistanceMapUnitScale; + } + return QgsMapUnitScale(); } QgsSymbolLayerV2* QgsVectorFieldSymbolLayer::create( const QgsStringMap& properties ) @@ -53,6 +73,10 @@ QgsSymbolLayerV2* QgsVectorFieldSymbolLayer::create( const QgsStringMap& propert { symbolLayer->setDistanceUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( properties["distance_unit"] ) ); } + if ( properties.contains( "distance_map_unit_scale" ) ) + { + symbolLayer->setDistanceMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( properties["distance_map_unit_scale"] ) ); + } if ( properties.contains( "scale" ) ) { symbolLayer->setScale( properties["scale"].toDouble() ); @@ -69,6 +93,30 @@ QgsSymbolLayerV2* QgsVectorFieldSymbolLayer::create( const QgsStringMap& propert { symbolLayer->setAngleUnits(( AngleUnits )( properties["angle_units"].toInt() ) ); } + if ( properties.contains( "size" ) ) + { + symbolLayer->setSize( properties["size"].toDouble() ); + } + if ( properties.contains( "size_unit" ) ) + { + symbolLayer->setSizeUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( properties["size_unit"] ) ); + } + if ( properties.contains( "size_map_unit_scale" ) ) + { + symbolLayer->setSizeMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( properties["size_map_unit_scale"] ) ); + } + if ( properties.contains( "offset" ) ) + { + symbolLayer->setOffset( QgsSymbolLayerV2Utils::decodePoint( properties["offset"] ) ); + } + if ( properties.contains( "offset_unit" ) ) + { + symbolLayer->setOffsetUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( properties["offset_unit"] ) ); + } + if ( properties.contains( "offset_map_unit_scale" ) ) + { + symbolLayer->setOffsetMapUnitScale( QgsSymbolLayerV2Utils::decodeMapUnitScale( properties["offset_map_unit_scale"] ) ); + } return symbolLayer; } @@ -118,17 +166,17 @@ void QgsVectorFieldSymbolLayer::renderPoint( const QPointF& point, QgsSymbolV2Re switch ( mVectorFieldType ) { case Cartesian: - xComponent = xVal * QgsSymbolLayerV2Utils::lineWidthScaleFactor( ctx, mDistanceUnit ); - yComponent = yVal * QgsSymbolLayerV2Utils::lineWidthScaleFactor( ctx, mDistanceUnit ); + xComponent = xVal * QgsSymbolLayerV2Utils::lineWidthScaleFactor( ctx, mDistanceUnit, mDistanceMapUnitScale ); + yComponent = yVal * QgsSymbolLayerV2Utils::lineWidthScaleFactor( ctx, mDistanceUnit, mDistanceMapUnitScale ); break; case Polar: convertPolarToCartesian( xVal, yVal, xComponent, yComponent ); - xComponent = xComponent * QgsSymbolLayerV2Utils::lineWidthScaleFactor( ctx, mDistanceUnit ); - yComponent = yComponent * QgsSymbolLayerV2Utils::lineWidthScaleFactor( ctx, mDistanceUnit ); + xComponent = xComponent * QgsSymbolLayerV2Utils::lineWidthScaleFactor( ctx, mDistanceUnit, mDistanceMapUnitScale ); + yComponent = yComponent * QgsSymbolLayerV2Utils::lineWidthScaleFactor( ctx, mDistanceUnit, mDistanceMapUnitScale ); break; case Height: xComponent = 0; - yComponent = yVal * QgsSymbolLayerV2Utils::lineWidthScaleFactor( ctx, mDistanceUnit ); + yComponent = yVal * QgsSymbolLayerV2Utils::lineWidthScaleFactor( ctx, mDistanceUnit, mDistanceMapUnitScale ); break; default: break; @@ -187,10 +235,17 @@ QgsStringMap QgsVectorFieldSymbolLayer::properties() const properties["x_attribute"] = mXAttribute; properties["y_attribute"] = mYAttribute; properties["distance_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mDistanceUnit ); + properties["distance_map_unit_scale"] = QgsSymbolLayerV2Utils::encodeMapUnitScale( mDistanceMapUnitScale ); properties["scale"] = QString::number( mScale ); properties["vector_field_type"] = QString::number( mVectorFieldType ); properties["angle_orientation"] = QString::number( mAngleOrientation ); properties["angle_units"] = QString::number( mAngleUnits ); + properties["size"] = QString::number( mSize ); + properties["size_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mSizeUnit ); + properties["size_map_unit_scale"] = QgsSymbolLayerV2Utils::encodeMapUnitScale( mSizeMapUnitScale ); + properties["offset"] = QgsSymbolLayerV2Utils::encodePoint( mOffset ); + properties["offset_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mOffsetUnit ); + properties["offset_map_unit_scale"] = QgsSymbolLayerV2Utils::encodeMapUnitScale( mOffsetMapUnitScale ); return properties; } @@ -251,3 +306,5 @@ void QgsVectorFieldSymbolLayer::convertPolarToCartesian( double length, double a x = length * sin( angle ); y = length * cos( angle ); } + + diff --git a/src/core/symbology-ng/qgsvectorfieldsymbollayer.h b/src/core/symbology-ng/qgsvectorfieldsymbollayer.h index 7a6cdc82d035..cccbb5e797f7 100644 --- a/src/core/symbology-ng/qgsvectorfieldsymbollayer.h +++ b/src/core/symbology-ng/qgsvectorfieldsymbollayer.h @@ -1,6 +1,6 @@ /*************************************************************************** - qgsvectorfieldsymbollayer.h - ------------------------- + qgsvectorfieldsymbollayer.h + ------------------------- begin : Octorer 25, 2011 copyright : (C) 2011 by Marco Hugentobler email : marco dot hugentobler at sourcepole dot ch @@ -84,13 +84,20 @@ class CORE_EXPORT QgsVectorFieldSymbolLayer: public QgsMarkerSymbolLayerV2 void setOutputUnit( QgsSymbolV2::OutputUnit unit ); QgsSymbolV2::OutputUnit outputUnit() const; + void setMapUnitScale( const QgsMapUnitScale& scale ); + QgsMapUnitScale mapUnitScale() const; + void setDistanceUnit( QgsSymbolV2::OutputUnit unit ) { mDistanceUnit = unit; } QgsSymbolV2::OutputUnit distanceUnit() const { return mDistanceUnit; } + void setDistanceMapUnitScale( const QgsMapUnitScale& scale ) { mDistanceMapUnitScale = scale; } + const QgsMapUnitScale& distanceMapUnitScale() const { return mDistanceMapUnitScale; } + private: QString mXAttribute; QString mYAttribute; QgsSymbolV2::OutputUnit mDistanceUnit; + QgsMapUnitScale mDistanceMapUnitScale; double mScale; VectorFieldType mVectorFieldType; AngleOrientation mAngleOrientation; @@ -107,3 +114,5 @@ class CORE_EXPORT QgsVectorFieldSymbolLayer: public QgsMarkerSymbolLayerV2 }; #endif // QGSVECTORFIELDSYMBOLLAYER_H + + diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index 38d4fb341b7a..fb51f83252cf 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -142,6 +142,7 @@ qgssublayersdialog.cpp qgssvgannotationitem.cpp qgstextannotationitem.cpp qgsvertexmarker.cpp +qgsunitselectionwidget.cpp ) IF (WITH_TOUCH) @@ -275,6 +276,7 @@ qgsrelationmanagerdialog.h qgsscalecombobox.h qgssearchquerybuilder.h qgssublayersdialog.h +qgsunitselectionwidget.h ) QT4_WRAP_CPP(QGIS_GUI_MOC_SRCS ${QGIS_GUI_MOC_HDRS}) @@ -345,6 +347,7 @@ qgstextannotationitem.h qgssvgannotationitem.h qgscomposerruler.h qgsdetaileditemdata.h +qgsunitselectionwidget.h attributetable/qgsattributetabledelegate.h attributetable/qgsattributetablefiltermodel.h diff --git a/src/gui/qgsscalecombobox.cpp b/src/gui/qgsscalecombobox.cpp index d84d40256c80..173749f2b0c9 100644 --- a/src/gui/qgsscalecombobox.cpp +++ b/src/gui/qgsscalecombobox.cpp @@ -1,6 +1,6 @@ /*************************************************************************** - qgsscalecombobox.h - ------------------------ + qgsscalecombobox.h + ------------------------ begin : January 7, 2012 copyright : (C) 2012 by Alexander Bruy email : alexander dot bruy at gmail dot com @@ -191,7 +191,11 @@ void QgsScaleComboBox::fixupScale() QString QgsScaleComboBox::toString( double scale ) { - if ( scale > 1 ) + if ( scale == 0 ) + { + return "0"; + } + else if ( scale > 1 ) { return QString( "%1:1" ).arg( QLocale::system().toString( qRound( scale ) ) ); } @@ -237,3 +241,5 @@ double QgsScaleComboBox::toDouble( QString scaleString, bool * returnOk ) } return scale; } + + diff --git a/src/gui/qgsunitselectionwidget.cpp b/src/gui/qgsunitselectionwidget.cpp new file mode 100644 index 000000000000..6c38c8e9f432 --- /dev/null +++ b/src/gui/qgsunitselectionwidget.cpp @@ -0,0 +1,122 @@ +/*************************************************************************** + qgsunitselectionwidget.h + ------------------- + begin : Mar 24, 2014 + copyright : (C) 2014 Sandro Mani + email : smani@sourcepole.ch + + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "qgsunitselectionwidget.h" + +QgsMapUnitScaleDialog::QgsMapUnitScaleDialog( QWidget* parent ) + : QDialog( parent ) +{ + setupUi( this ); + mComboBoxMinScale->setScale( 0.0000001 ); + mComboBoxMaxScale->setScale( 1 ); + connect( mCheckBoxMinScale, SIGNAL( toggled( bool ) ), this, SLOT( configureMinComboBox() ) ); + connect( mCheckBoxMaxScale, SIGNAL( toggled( bool ) ), this, SLOT( configureMaxComboBox() ) ); + connect( mComboBoxMinScale, SIGNAL( scaleChanged() ), this, SLOT( configureMaxComboBox() ) ); + connect( mComboBoxMaxScale, SIGNAL( scaleChanged() ), this, SLOT( configureMinComboBox() ) ); +} + +void QgsMapUnitScaleDialog::setMapUnitScale( const QgsMapUnitScale &scale ) +{ + mComboBoxMinScale->setScale( scale.minScale > 0.0 ? scale.minScale : 0.0000001 ); + mCheckBoxMinScale->setChecked( scale.minScale > 0.0 ); + mComboBoxMinScale->setEnabled( scale.minScale > 0.0 ); + mComboBoxMaxScale->setScale( scale.maxScale > 0.0 ? scale.maxScale : 1.0 ); + mCheckBoxMaxScale->setChecked( scale.maxScale > 0.0 ); + mComboBoxMaxScale->setEnabled( scale.maxScale > 0.0 ); +} + +void QgsMapUnitScaleDialog::configureMinComboBox() +{ + mComboBoxMinScale->setEnabled( mCheckBoxMinScale->isChecked() ); + if ( mCheckBoxMinScale->isChecked() && mComboBoxMinScale->scale() > mComboBoxMaxScale->scale() ) + { + mComboBoxMinScale->setScale( mComboBoxMaxScale->scale() ); + } +} + +void QgsMapUnitScaleDialog::configureMaxComboBox() +{ + mComboBoxMaxScale->setEnabled( mCheckBoxMaxScale->isChecked() ); + if ( mCheckBoxMaxScale->isChecked() && mComboBoxMaxScale->scale() < mComboBoxMinScale->scale() ) + { + mComboBoxMaxScale->setScale( mComboBoxMinScale->scale() ); + } +} + +QgsMapUnitScale QgsMapUnitScaleDialog::getMapUnitScale() const +{ + QgsMapUnitScale scale; + scale.minScale = mCheckBoxMinScale->isChecked() ? mComboBoxMinScale->scale() : 0; + scale.maxScale = mCheckBoxMaxScale->isChecked() ? mComboBoxMaxScale->scale() : 0; + return scale; +} + + +QgsUnitSelectionWidget::QgsUnitSelectionWidget( QWidget *parent ) + : QWidget( parent ) +{ + mMapUnitIdx = -1; + mUnitScaleDialog = new QgsMapUnitScaleDialog( this ); + + setupUi( this ); + mMapScaleButton->setVisible( false ); + + connect( mUnitCombo, SIGNAL( currentIndexChanged( int ) ), this, SLOT( toggleUnitRangeButton() ) ); + connect( mMapScaleButton, SIGNAL( clicked() ), this, SLOT( showDialog() ) ); + connect( mUnitCombo, SIGNAL( currentIndexChanged( int ) ), this, SIGNAL( changed() ) ); +} + +void QgsUnitSelectionWidget::setUnits( const QStringList &units, int mapUnitIdx ) +{ + blockSignals( true ); + mUnitCombo->addItems( units ); + mMapUnitIdx = mapUnitIdx; + blockSignals( false ); +} + +void QgsUnitSelectionWidget::setUnit( int unitIndex ) +{ + blockSignals( true ); + mUnitCombo->setCurrentIndex( unitIndex ); + blockSignals( false ); +} + +void QgsUnitSelectionWidget::showDialog() +{ + QgsMapUnitScale scale = mUnitScaleDialog->getMapUnitScale(); + if ( mUnitScaleDialog->exec() != QDialog::Accepted ) + { + mUnitScaleDialog->setMapUnitScale( scale ); + } + else + { + QgsMapUnitScale newScale = mUnitScaleDialog->getMapUnitScale(); + if ( scale.minScale != newScale.minScale || scale.maxScale != newScale.maxScale ) + { + emit changed(); + } + } +} + +void QgsUnitSelectionWidget::toggleUnitRangeButton() +{ + mMapScaleButton->setVisible( mMapUnitIdx != -1 && mUnitCombo->currentIndex() == mMapUnitIdx ); +} + + + diff --git a/src/gui/qgsunitselectionwidget.h b/src/gui/qgsunitselectionwidget.h new file mode 100644 index 000000000000..d6702e59c406 --- /dev/null +++ b/src/gui/qgsunitselectionwidget.h @@ -0,0 +1,81 @@ +/*************************************************************************** + qgsunitselectionwidget.h + ------------------- + begin : Mar 24, 2014 + copyright : (C) 2014 Sandro Mani + email : smani@sourcepole.ch + + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ +#ifndef QGSUNITSELECTIONWIDGET_H +#define QGSUNITSELECTIONWIDGET_H + +#include +#include "qgssymbolv2.h" +#include "ui_qgsunitselectionwidget.h" +#include "ui_qgsmapunitscaledialog.h" + + +/** Dialog allowing the user to choose the minimum and maximum scale of an object in map units */ +class QgsMapUnitScaleDialog : public QDialog, private Ui::QgsMapUnitScaleDialog +{ + Q_OBJECT + + public: + QgsMapUnitScaleDialog( QWidget* parent ); + + /** Returns the map unit scale */ + QgsMapUnitScale getMapUnitScale() const; + /** Sets the map unit scale */ + void setMapUnitScale( const QgsMapUnitScale& scale ); + + private slots: + void configureMinComboBox(); + void configureMaxComboBox(); +}; + +/** Widget displaying a combobox allowing the user to choose between millimeter and map units + * If the user chooses map units, a button appears allowing the specification of minimum and maximum scale */ +class QgsUnitSelectionWidget : public QWidget, private Ui::QgsUnitSelectionWidget +{ + Q_OBJECT + + private: + QgsMapUnitScaleDialog* mUnitScaleDialog; + int mMapUnitIdx; + + public: + QgsUnitSelectionWidget( QWidget* parent = 0 ); + + /** Sets the units which the user can choose from in the combobox. mapUnitIdx specifies which entry corresponds to the map units, or -1 if none */ + void setUnits( const QStringList& units, int mapUnitIdx ); + + /** Get the selected unit index */ + int getUnit() const { return mUnitCombo->currentIndex(); } + /** Sets the selected unit index */ + void setUnit( int unitIndex ); + /** Returns the map unit scale */ + QgsMapUnitScale getMapUnitScale() const { return mUnitScaleDialog->getMapUnitScale(); } + /** Sets the map unit scale */ + void setMapUnitScale( const QgsMapUnitScale& scale ) { mUnitScaleDialog->setMapUnitScale( scale ); } + + signals: + void changed(); + + private slots: + void showDialog(); + void toggleUnitRangeButton(); +}; + +#endif // QGSUNITSELECTIONWIDGET_H + + + diff --git a/src/gui/symbology-ng/qgsellipsesymbollayerv2widget.cpp b/src/gui/symbology-ng/qgsellipsesymbollayerv2widget.cpp index b3f2566af8db..8c5db4dcc268 100644 --- a/src/gui/symbology-ng/qgsellipsesymbollayerv2widget.cpp +++ b/src/gui/symbology-ng/qgsellipsesymbollayerv2widget.cpp @@ -1,9 +1,9 @@ /*************************************************************************** - qgsellipsesymbollayerv2widget.cpp - --------------------- - begin : June 2011 - copyright : (C) 2011 by Marco Hugentobler - email : marco dot hugentobler at sourcepole dot ch + qgsellipsesymbollayerv2widget.cpp + --------------------- + begin : June 2011 + copyright : (C) 2011 by Marco Hugentobler + email : marco dot hugentobler at sourcepole dot ch *************************************************************************** * * * This program is free software; you can redistribute it and/or modify * @@ -75,9 +75,12 @@ void QgsEllipseSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer ) blockComboSignals( true ); if ( mLayer ) { - mSymbolWidthUnitComboBox->setCurrentIndex( mLayer->symbolWidthUnit() ); - mOutlineWidthUnitComboBox->setCurrentIndex( mLayer->outlineWidthUnit() ); - mSymbolHeightUnitComboBox->setCurrentIndex( mLayer->symbolHeightUnit() ); + mSymbolWidthUnitWidget->setUnit( mLayer->symbolWidthUnit() ); + mSymbolWidthUnitWidget->setMapUnitScale( mLayer->symbolWidthMapUnitScale() ); + mOutlineWidthUnitWidget->setUnit( mLayer->outlineWidthUnit() ); + mOutlineWidthUnitWidget->setMapUnitScale( mLayer->outlineWidthMapUnitScale()); + mSymbolHeightUnitWidget->setUnit( mLayer->symbolHeightUnit() ); + mSymbolHeightUnitWidget->setMapUnitScale( mLayer->symbolHeightMapUnitScale() ); } QPointF offsetPt = mLayer->offset(); @@ -213,9 +216,9 @@ void QgsEllipseSymbolLayerV2Widget::on_mOffsetUnitComboBox_currentIndexChanged( void QgsEllipseSymbolLayerV2Widget::blockComboSignals( bool block ) { - mSymbolWidthUnitComboBox->blockSignals( block ); - mOutlineWidthUnitComboBox->blockSignals( block ); - mSymbolHeightUnitComboBox->blockSignals( block ); + mSymbolWidthUnitWidget->blockSignals( block ); + mOutlineWidthUnitWidget->blockSignals( block ); + mSymbolHeightUnitWidget->blockSignals( block ); mHorizontalAnchorComboBox->blockSignals( block ); mVerticalAnchorComboBox->blockSignals( block ); } @@ -290,3 +293,5 @@ void QgsEllipseSymbolLayerV2Widget::setOffset() mLayer->setOffset( QPointF( spinOffsetX->value(), spinOffsetY->value() ) ); emit changed(); } + + diff --git a/src/gui/symbology-ng/qgssymbollayerv2widget.cpp b/src/gui/symbology-ng/qgssymbollayerv2widget.cpp index 1df8a48a1af0..0be497242947 100644 --- a/src/gui/symbology-ng/qgssymbollayerv2widget.cpp +++ b/src/gui/symbology-ng/qgssymbollayerv2widget.cpp @@ -1,10 +1,10 @@ /*************************************************************************** - qgssymbollayerv2widget.cpp - symbol layer widgets + qgssymbollayerv2widget.cpp - symbol layer widgets - --------------------- - begin : November 2009 - copyright : (C) 2009 by Martin Dobias - email : wonder dot sk at gmail dot com + --------------------- + begin : November 2009 + copyright : (C) 2009 by Martin Dobias + email : wonder dot sk at gmail dot com *************************************************************************** * * * This program is free software; you can redistribute it and/or modify * @@ -72,6 +72,9 @@ QgsSimpleLineSymbolLayerV2Widget::QgsSimpleLineSymbolLayerV2Widget( const QgsVec mLayer = NULL; setupUi( this ); + mPenWidthUnitWidget->setUnits( QStringList() << tr( "Millimeter" ) << tr( "Map unit" ), 1 ); + mOffsetUnitWidget->setUnits( QStringList() << tr( "Millimeter" ) << tr( "Map unit" ), 1 ); + mDashPatternUnitWidget->setUnits( QStringList() << tr( "Millimeter" ) << tr( "Map unit" ), 1 ); if ( vl && vl->geometryType() != QGis::Polygon ) { @@ -98,15 +101,19 @@ void QgsSimpleLineSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer ) mLayer = static_cast( layer ); // set units - mPenWidthUnitComboBox->blockSignals( true ); - mPenWidthUnitComboBox->setCurrentIndex( mLayer->widthUnit() ); - mPenWidthUnitComboBox->blockSignals( false ); - mOffsetUnitComboBox->blockSignals( true ); - mOffsetUnitComboBox->setCurrentIndex( mLayer->offsetUnit() ); - mOffsetUnitComboBox->blockSignals( false ); - mDashPatternUnitComboBox->blockSignals( true ); - mDashPatternUnitComboBox->setCurrentIndex( mLayer->customDashPatternUnit() ); - mDashPatternUnitComboBox->blockSignals( false ); + mPenWidthUnitWidget->blockSignals( true ); + mPenWidthUnitWidget->setUnit( mLayer->widthUnit() ); + mPenWidthUnitWidget->setMapUnitScale( mLayer->widthMapUnitScale() ); + mPenWidthUnitWidget->blockSignals( false ); + mOffsetUnitWidget->blockSignals( true ); + mOffsetUnitWidget->setUnit( mLayer->offsetUnit() ); + mOffsetUnitWidget->setMapUnitScale( mLayer->offsetMapUnitScale() ); + mOffsetUnitWidget->blockSignals( false ); + mDashPatternUnitWidget->blockSignals( true ); + mDashPatternUnitWidget->setUnit( mLayer->customDashPatternUnit() ); + mDashPatternUnitWidget->setMapUnitScale( mLayer->customDashPatternMapUnitScale() ); + mDashPatternUnitWidget->setMapUnitScale( mLayer->customDashPatternMapUnitScale() ); + mDashPatternUnitWidget->blockSignals( false ); // set values spinWidth->blockSignals( true ); @@ -203,30 +210,37 @@ void QgsSimpleLineSymbolLayerV2Widget::on_mChangePatternButton_clicked() } } -void QgsSimpleLineSymbolLayerV2Widget::on_mPenWidthUnitComboBox_currentIndexChanged( int index ) +void QgsSimpleLineSymbolLayerV2Widget::on_mPenWidthUnitWidget_changed( ) { if ( mLayer ) { - mLayer->setWidthUnit(( QgsSymbolV2::OutputUnit )index ); + QgsSymbolV2::OutputUnit unit = static_cast( mPenWidthUnitWidget->getUnit() ); + mLayer->setWidthUnit( unit ); + mLayer->setWidthMapUnitScale( mPenWidthUnitWidget->getMapUnitScale() ); + emit changed(); } } -void QgsSimpleLineSymbolLayerV2Widget::on_mOffsetUnitComboBox_currentIndexChanged( int index ) +void QgsSimpleLineSymbolLayerV2Widget::on_mOffsetUnitWidget_changed( ) { if ( mLayer ) { - mLayer->setOffsetUnit(( QgsSymbolV2::OutputUnit )index ); + QgsSymbolV2::OutputUnit unit = static_cast( mOffsetUnitWidget->getUnit() ); + mLayer->setOffsetUnit( unit ); + mLayer->setOffsetMapUnitScale( mOffsetUnitWidget->getMapUnitScale() ); + emit changed(); } - emit changed(); } -void QgsSimpleLineSymbolLayerV2Widget::on_mDashPatternUnitComboBox_currentIndexChanged( int index ) +void QgsSimpleLineSymbolLayerV2Widget::on_mDashPatternUnitWidget_changed( ) { if ( mLayer ) { - mLayer->setCustomDashPatternUnit(( QgsSymbolV2::OutputUnit )index ); + QgsSymbolV2::OutputUnit unit = static_cast( mDashPatternUnitWidget->getUnit() ); + mLayer->setCustomDashPatternUnit( unit ); + mLayer->setCustomDashPatternMapUnitScale( mDashPatternUnitWidget->getMapUnitScale() ); + emit changed(); } - emit changed(); } void QgsSimpleLineSymbolLayerV2Widget::on_mDrawInsideCheckBox_stateChanged( int state ) @@ -300,6 +314,9 @@ QgsSimpleMarkerSymbolLayerV2Widget::QgsSimpleMarkerSymbolLayerV2Widget( const Qg mLayer = NULL; setupUi( this ); + mSizeUnitWidget->setUnits( QStringList() << tr( "Millimeter" ) << tr( "Map unit" ), 1 ); + mOffsetUnitWidget->setUnits( QStringList() << tr( "Millimeter" ) << tr( "Map unit" ), 1 ); + mOutlineWidthUnitWidget->setUnits( QStringList() << tr( "Millimeter" ) << tr( "Map unit" ), 1 ); QSize size = lstNames->iconSize(); QStringList names; @@ -371,15 +388,18 @@ void QgsSimpleMarkerSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer spinOffsetY->setValue( mLayer->offset().y() ); spinOffsetY->blockSignals( false ); - mSizeUnitComboBox->blockSignals( true ); - mSizeUnitComboBox->setCurrentIndex( mLayer->sizeUnit() ); - mSizeUnitComboBox->blockSignals( false ); - mOffsetUnitComboBox->blockSignals( true ); - mOffsetUnitComboBox->setCurrentIndex( mLayer->offsetUnit() ); - mOffsetUnitComboBox->blockSignals( false ); - mOutlineWidthUnitComboBox->blockSignals( true ); - mOutlineWidthUnitComboBox->setCurrentIndex( mLayer->outlineWidthUnit() ); - mOutlineWidthUnitComboBox->blockSignals( false ); + mSizeUnitWidget->blockSignals( true ); + mSizeUnitWidget->setUnit( mLayer->sizeUnit() ); + mSizeUnitWidget->setMapUnitScale( mLayer->sizeMapUnitScale() ); + mSizeUnitWidget->blockSignals( false ); + mOffsetUnitWidget->blockSignals( true ); + mOffsetUnitWidget->setUnit( mLayer->offsetUnit() ); + mOffsetUnitWidget->setMapUnitScale( mLayer->offsetMapUnitScale() ); + mOffsetUnitWidget->blockSignals( false ); + mOutlineWidthUnitWidget->blockSignals( true ); + mOutlineWidthUnitWidget->setUnit( mLayer->outlineWidthUnit() ); + mOutlineWidthUnitWidget->setMapUnitScale( mLayer->outlineWidthMapUnitScale() ); + mOutlineWidthUnitWidget->blockSignals( false ); //anchor points mHorizontalAnchorComboBox->blockSignals( true ); @@ -451,29 +471,35 @@ void QgsSimpleMarkerSymbolLayerV2Widget::on_mOutlineWidthSpinBox_valueChanged( d } } -void QgsSimpleMarkerSymbolLayerV2Widget::on_mSizeUnitComboBox_currentIndexChanged( int index ) +void QgsSimpleMarkerSymbolLayerV2Widget::on_mSizeUnitWidget_changed( ) { if ( mLayer ) { - mLayer->setSizeUnit(( QgsSymbolV2::OutputUnit ) index ); + QgsSymbolV2::OutputUnit unit = static_cast( mSizeUnitWidget->getUnit() ); + mLayer->setSizeUnit( unit ); + mLayer->setSizeMapUnitScale( mSizeUnitWidget->getMapUnitScale() ); emit changed(); } } -void QgsSimpleMarkerSymbolLayerV2Widget::on_mOffsetUnitComboBox_currentIndexChanged( int index ) +void QgsSimpleMarkerSymbolLayerV2Widget::on_mOffsetUnitWidget_changed( ) { if ( mLayer ) { - mLayer->setOffsetUnit(( QgsSymbolV2::OutputUnit ) index ); + QgsSymbolV2::OutputUnit unit = static_cast( mOffsetUnitWidget->getUnit() ); + mLayer->setOffsetUnit( unit ); + mLayer->setOffsetMapUnitScale( mOffsetUnitWidget->getMapUnitScale() ); emit changed(); } } -void QgsSimpleMarkerSymbolLayerV2Widget::on_mOutlineWidthUnitComboBox_currentIndexChanged( int index ) +void QgsSimpleMarkerSymbolLayerV2Widget::on_mOutlineWidthUnitWidget_changed( ) { if ( mLayer ) { - mLayer->setOutlineWidthUnit(( QgsSymbolV2::OutputUnit ) index ); + QgsSymbolV2::OutputUnit unit = static_cast( mOutlineWidthUnitWidget->getUnit() ); + mLayer->setOutlineWidthUnit( unit ); + mLayer->setOutlineWidthMapUnitScale( mOutlineWidthUnitWidget->getMapUnitScale() ); emit changed(); } } @@ -550,6 +576,8 @@ QgsSimpleFillSymbolLayerV2Widget::QgsSimpleFillSymbolLayerV2Widget( const QgsVec mLayer = NULL; setupUi( this ); + mBorderWidthUnitWidget->setUnits( QStringList() << tr( "Millimeter" ) << tr( "Map unit" ), 1 ); + mOffsetUnitWidget->setUnits( QStringList() << tr( "Millimeter" ) << tr( "Map unit" ), 1 ); connect( btnChangeColor, SIGNAL( colorChanged( const QColor& ) ), this, SLOT( setColor( const QColor& ) ) ); connect( cboFillStyle, SIGNAL( currentIndexChanged( int ) ), this, SLOT( setBrushStyle() ) ); @@ -597,12 +625,14 @@ void QgsSimpleFillSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer ) spinOffsetY->setValue( mLayer->offset().y() ); spinOffsetY->blockSignals( false ); - mBorderWidthUnitComboBox->blockSignals( true ); - mBorderWidthUnitComboBox->setCurrentIndex( mLayer->borderWidthUnit() ); - mBorderWidthUnitComboBox->blockSignals( false ); - mOffsetUnitComboBox->blockSignals( true ); - mOffsetUnitComboBox->setCurrentIndex( mLayer->offsetUnit() ); - mOffsetUnitComboBox->blockSignals( false ); + mBorderWidthUnitWidget->blockSignals( true ); + mBorderWidthUnitWidget->setUnit( mLayer->borderWidthUnit() ); + mBorderWidthUnitWidget->setMapUnitScale( mLayer->borderWidthMapUnitScale() ); + mBorderWidthUnitWidget->blockSignals( false ); + mOffsetUnitWidget->blockSignals( true ); + mOffsetUnitWidget->setUnit( mLayer->offsetUnit() ); + mOffsetUnitWidget->setMapUnitScale( mLayer->offsetMapUnitScale() ); + mOffsetUnitWidget->blockSignals( false ); } QgsSymbolLayerV2* QgsSimpleFillSymbolLayerV2Widget::symbolLayer() @@ -647,20 +677,24 @@ void QgsSimpleFillSymbolLayerV2Widget::offsetChanged() emit changed(); } -void QgsSimpleFillSymbolLayerV2Widget::on_mBorderWidthUnitComboBox_currentIndexChanged( int index ) +void QgsSimpleFillSymbolLayerV2Widget::on_mBorderWidthUnitWidget_changed( ) { if ( mLayer ) { - mLayer->setBorderWidthUnit(( QgsSymbolV2::OutputUnit ) index ); + QgsSymbolV2::OutputUnit unit = static_cast( mBorderWidthUnitWidget->getUnit() ); + mLayer->setBorderWidthUnit( unit ); + mLayer->setBorderWidthMapUnitScale( mBorderWidthUnitWidget->getMapUnitScale() ); emit changed(); } } -void QgsSimpleFillSymbolLayerV2Widget::on_mOffsetUnitComboBox_currentIndexChanged( int index ) +void QgsSimpleFillSymbolLayerV2Widget::on_mOffsetUnitWidget_changed( ) { if ( mLayer ) { - mLayer->setOffsetUnit(( QgsSymbolV2::OutputUnit ) index ); + QgsSymbolV2::OutputUnit unit = static_cast( mOffsetUnitWidget->getUnit() ); + mLayer->setOffsetUnit( unit ); + mLayer->setOffsetMapUnitScale( mOffsetUnitWidget->getMapUnitScale() ); emit changed(); } } @@ -705,6 +739,7 @@ QgsGradientFillSymbolLayerV2Widget::QgsGradientFillSymbolLayerV2Widget( const Qg mLayer = NULL; setupUi( this ); + mOffsetUnitWidget->setUnits( QStringList() << tr( "Millimeter" ) << tr( "Map unit" ), 1 ); cboGradientColorRamp->setShowGradientOnly( true ); cboGradientColorRamp->populate( QgsStyleV2::defaultStyle() ); @@ -848,9 +883,10 @@ void QgsGradientFillSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer mSpinAngle->setValue( mLayer->angle() ); mSpinAngle->blockSignals( false ); - mOffsetUnitComboBox->blockSignals( true ); - mOffsetUnitComboBox->setCurrentIndex( mLayer->offsetUnit() ); - mOffsetUnitComboBox->blockSignals( false ); + mOffsetUnitWidget->blockSignals( true ); + mOffsetUnitWidget->setUnit( mLayer->offsetUnit() ); + mOffsetUnitWidget->setMapUnitScale( mLayer->offsetMapUnitScale() ); + mOffsetUnitWidget->blockSignals( false ); } QgsSymbolLayerV2* QgsGradientFillSymbolLayerV2Widget::symbolLayer() @@ -989,11 +1025,13 @@ void QgsGradientFillSymbolLayerV2Widget::on_mSpinAngle_valueChanged( double valu emit changed(); } -void QgsGradientFillSymbolLayerV2Widget::on_mOffsetUnitComboBox_currentIndexChanged( int index ) +void QgsGradientFillSymbolLayerV2Widget::on_mOffsetUnitWidget_changed( ) { if ( mLayer ) { - mLayer->setOffsetUnit(( QgsSymbolV2::OutputUnit ) index ); + QgsSymbolV2::OutputUnit unit = static_cast( mOffsetUnitWidget->getUnit() ); + mLayer->setOffsetUnit( unit ); + mLayer->setOffsetMapUnitScale( mOffsetUnitWidget->getMapUnitScale() ); emit changed(); } } @@ -1054,6 +1092,8 @@ QgsShapeburstFillSymbolLayerV2Widget::QgsShapeburstFillSymbolLayerV2Widget( cons mLayer = NULL; setupUi( this ); + mDistanceUnitWidget->setUnits( QStringList() << tr( "Millimeter" ) << tr( "Map unit" ), 1 ); + mOffsetUnitWidget->setUnits( QStringList() << tr( "Millimeter" ) << tr( "Map unit" ), 1 ); cboGradientColorRamp->setShowGradientOnly( true ); cboGradientColorRamp->populate( QgsStyleV2::defaultStyle() ); @@ -1116,20 +1156,21 @@ void QgsShapeburstFillSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* lay { mRadioUseWholeShape->setChecked( true ); mSpinMaxDistance->setEnabled( false ); - mDistanceUnitComboBox->setEnabled( false ); + mDistanceUnitWidget->setEnabled( false ); } else { mRadioUseMaxDistance->setChecked( true ); mSpinMaxDistance->setEnabled( true ); - mDistanceUnitComboBox->setEnabled( true ); + mDistanceUnitWidget->setEnabled( true ); } mRadioUseWholeShape->blockSignals( false ); mRadioUseMaxDistance->blockSignals( false ); - mDistanceUnitComboBox->blockSignals( true ); - mDistanceUnitComboBox->setCurrentIndex( mLayer->distanceUnit() ); - mDistanceUnitComboBox->blockSignals( false ); + mDistanceUnitWidget->blockSignals( true ); + mDistanceUnitWidget->setUnit( mLayer->distanceUnit() ); + mDistanceUnitWidget->setMapUnitScale( mLayer->distanceMapUnitScale() ); + mDistanceUnitWidget->blockSignals( false ); mIgnoreRingsCheckBox->blockSignals( true ); mIgnoreRingsCheckBox->setCheckState( mLayer->ignoreRings() ? Qt::Checked : Qt::Unchecked ); @@ -1149,9 +1190,10 @@ void QgsShapeburstFillSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* lay spinOffsetY->blockSignals( true ); spinOffsetY->setValue( mLayer->offset().y() ); spinOffsetY->blockSignals( false ); - mOffsetUnitComboBox->blockSignals( true ); - mOffsetUnitComboBox->setCurrentIndex( mLayer->offsetUnit() ); - mOffsetUnitComboBox->blockSignals( false ); + mOffsetUnitWidget->blockSignals( true ); + mOffsetUnitWidget->setUnit( mLayer->offsetUnit() ); + mOffsetUnitWidget->setMapUnitScale( mLayer->offsetMapUnitScale() ); + mOffsetUnitWidget->blockSignals( false ); } QgsSymbolLayerV2* QgsShapeburstFillSymbolLayerV2Widget::symbolLayer() @@ -1213,11 +1255,13 @@ void QgsShapeburstFillSymbolLayerV2Widget::on_mSpinMaxDistance_valueChanged( dou } } -void QgsShapeburstFillSymbolLayerV2Widget::on_mDistanceUnitComboBox_currentIndexChanged( int index ) +void QgsShapeburstFillSymbolLayerV2Widget::on_mDistanceUnitWidget_changed( ) { if ( mLayer ) { - mLayer->setDistanceUnit(( QgsSymbolV2::OutputUnit ) index ); + QgsSymbolV2::OutputUnit unit = static_cast( mDistanceUnitWidget->getUnit() ); + mLayer->setDistanceUnit( unit ); + mLayer->setDistanceMapUnitScale( mDistanceUnitWidget->getMapUnitScale() ); emit changed(); } } @@ -1250,11 +1294,13 @@ void QgsShapeburstFillSymbolLayerV2Widget::offsetChanged() } } -void QgsShapeburstFillSymbolLayerV2Widget::on_mOffsetUnitComboBox_currentIndexChanged( int index ) +void QgsShapeburstFillSymbolLayerV2Widget::on_mOffsetUnitWidget_changed( ) { if ( mLayer ) { - mLayer->setOffsetUnit(( QgsSymbolV2::OutputUnit ) index ); + QgsSymbolV2::OutputUnit unit = static_cast( mOffsetUnitWidget->getUnit() ); + mLayer->setOffsetUnit( unit ); + mLayer->setOffsetMapUnitScale( mOffsetUnitWidget->getMapUnitScale() ); emit changed(); } } @@ -1309,6 +1355,9 @@ QgsMarkerLineSymbolLayerV2Widget::QgsMarkerLineSymbolLayerV2Widget( const QgsVec mLayer = NULL; setupUi( this ); + mIntervalUnitWidget->setUnits( QStringList() << tr( "Millimeter" ) << tr( "Map unit" ), 1 ); + mOffsetUnitWidget->setUnits( QStringList() << tr( "Millimeter" ) << tr( "Map unit" ), 1 ); + mOffsetAlongLineUnitWidget->setUnits( QStringList() << tr( "Millimeter" ) << tr( "Map unit" ), 1 ); connect( spinInterval, SIGNAL( valueChanged( double ) ), this, SLOT( setInterval( double ) ) ); connect( mSpinOffsetAlongLine, SIGNAL( valueChanged( double ) ), this, SLOT( setOffsetAlongLine( double ) ) ); @@ -1354,15 +1403,18 @@ void QgsMarkerLineSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer ) radVertexFirst->setChecked( true ); // set units - mIntervalUnitComboBox->blockSignals( true ); - mIntervalUnitComboBox->setCurrentIndex( mLayer->intervalUnit() ); - mIntervalUnitComboBox->blockSignals( false ); - mOffsetUnitComboBox->blockSignals( true ); - mOffsetUnitComboBox->setCurrentIndex( mLayer->offsetUnit() ); - mOffsetUnitComboBox->blockSignals( false ); - mOffsetAlongLineUnitComboBox->blockSignals( true ); - mOffsetAlongLineUnitComboBox->setCurrentIndex( mLayer->offsetAlongLineUnit() ); - mOffsetAlongLineUnitComboBox->blockSignals( false ); + mIntervalUnitWidget->blockSignals( true ); + mIntervalUnitWidget->setUnit( mLayer->intervalUnit() ); + mIntervalUnitWidget->setMapUnitScale( mLayer->intervalMapUnitScale() ); + mIntervalUnitWidget->blockSignals( false ); + mOffsetUnitWidget->blockSignals( true ); + mOffsetUnitWidget->setUnit( mLayer->offsetUnit() ); + mOffsetUnitWidget->setMapUnitScale( mLayer->offsetMapUnitScale() ); + mOffsetUnitWidget->blockSignals( false ); + mOffsetAlongLineUnitWidget->blockSignals( true ); + mOffsetAlongLineUnitWidget->setUnit( mLayer->offsetAlongLineUnit() ); + mOffsetAlongLineUnitWidget->setMapUnitScale( mLayer->offsetAlongLineMapUnitScale() ); + mOffsetAlongLineUnitWidget->blockSignals( false ); setPlacement(); // update gui } @@ -1416,29 +1468,35 @@ void QgsMarkerLineSymbolLayerV2Widget::setPlacement() emit changed(); } -void QgsMarkerLineSymbolLayerV2Widget::on_mIntervalUnitComboBox_currentIndexChanged( int index ) +void QgsMarkerLineSymbolLayerV2Widget::on_mIntervalUnitWidget_changed( ) { if ( mLayer ) { - mLayer->setIntervalUnit(( QgsSymbolV2::OutputUnit ) index ); + QgsSymbolV2::OutputUnit unit = static_cast( mIntervalUnitWidget->getUnit() ); + mLayer->setIntervalUnit( unit ); + mLayer->setIntervalMapUnitScale( mIntervalUnitWidget->getMapUnitScale() ); + emit changed(); } - emit changed(); } -void QgsMarkerLineSymbolLayerV2Widget::on_mOffsetUnitComboBox_currentIndexChanged( int index ) +void QgsMarkerLineSymbolLayerV2Widget::on_mOffsetUnitWidget_changed( ) { if ( mLayer ) { - mLayer->setOffsetUnit(( QgsSymbolV2::OutputUnit ) index ); + QgsSymbolV2::OutputUnit unit = static_cast( mOffsetUnitWidget->getUnit() ); + mLayer->setOffsetUnit( unit ); + mLayer->setOffsetMapUnitScale( mOffsetUnitWidget->getMapUnitScale() ); + emit changed(); } - emit changed(); } -void QgsMarkerLineSymbolLayerV2Widget::on_mOffsetAlongLineUnitComboBox_currentIndexChanged( int index ) +void QgsMarkerLineSymbolLayerV2Widget::on_mOffsetAlongLineUnitWidget_changed( ) { if ( mLayer ) { - mLayer->setOffsetAlongLineUnit(( QgsSymbolV2::OutputUnit ) index ); + QgsSymbolV2::OutputUnit unit = static_cast( mOffsetAlongLineUnitWidget->getUnit() ); + mLayer->setOffsetAlongLineUnit( unit ); + mLayer->setOffsetAlongLineMapUnitScale( mOffsetAlongLineUnitWidget->getMapUnitScale() ); } emit changed(); } @@ -1487,6 +1545,9 @@ QgsSvgMarkerSymbolLayerV2Widget::QgsSvgMarkerSymbolLayerV2Widget( const QgsVecto mLayer = NULL; setupUi( this ); + mSizeUnitWidget->setUnits( QStringList() << tr( "Millimeter" ) << tr( "Map unit" ), 1 ); + mBorderWidthUnitWidget->setUnits( QStringList() << tr( "Millimeter" ) << tr( "Map unit" ), 1 ); + mOffsetUnitWidget->setUnits( QStringList() << tr( "Millimeter" ) << tr( "Map unit" ), 1 ); viewGroups->setHeaderHidden( true ); populateList(); @@ -1732,15 +1793,18 @@ void QgsSvgMarkerSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer ) spinOffsetY->setValue( mLayer->offset().y() ); spinOffsetY->blockSignals( false ); - mSizeUnitComboBox->blockSignals( true ); - mSizeUnitComboBox->setCurrentIndex( mLayer->sizeUnit() ); - mSizeUnitComboBox->blockSignals( false ); - mBorderWidthUnitComboBox->blockSignals( true ); - mBorderWidthUnitComboBox->setCurrentIndex( mLayer->outlineWidthUnit() ); - mBorderWidthUnitComboBox->blockSignals( false ); - mOffsetUnitComboBox->blockSignals( true ); - mOffsetUnitComboBox->setCurrentIndex( mLayer->offsetUnit() ); - mOffsetUnitComboBox->blockSignals( false ); + mSizeUnitWidget->blockSignals( true ); + mSizeUnitWidget->setUnit( mLayer->sizeUnit() ); + mSizeUnitWidget->setMapUnitScale( mLayer->sizeMapUnitScale() ); + mSizeUnitWidget->blockSignals( false ); + mBorderWidthUnitWidget->blockSignals( true ); + mBorderWidthUnitWidget->setUnit( mLayer->outlineWidthUnit() ); + mBorderWidthUnitWidget->setMapUnitScale( mLayer->outlineWidthMapUnitScale() ); + mBorderWidthUnitWidget->blockSignals( false ); + mOffsetUnitWidget->blockSignals( true ); + mOffsetUnitWidget->setUnit( mLayer->offsetUnit() ); + mOffsetUnitWidget->setMapUnitScale( mLayer->offsetMapUnitScale() ); + mOffsetUnitWidget->blockSignals( false ); //anchor points mHorizontalAnchorComboBox->blockSignals( true ); @@ -1865,31 +1929,37 @@ void QgsSvgMarkerSymbolLayerV2Widget::on_mBorderWidthSpinBox_valueChanged( doubl } } -void QgsSvgMarkerSymbolLayerV2Widget::on_mSizeUnitComboBox_currentIndexChanged( int index ) +void QgsSvgMarkerSymbolLayerV2Widget::on_mSizeUnitWidget_changed( ) { if ( mLayer ) { - mLayer->setSizeUnit(( QgsSymbolV2::OutputUnit ) index ); + QgsSymbolV2::OutputUnit unit = static_cast( mSizeUnitWidget->getUnit() ); + mLayer->setSizeUnit( unit ); + mLayer->setSizeMapUnitScale( mSizeUnitWidget->getMapUnitScale() ); + emit changed(); } - emit changed(); } -void QgsSvgMarkerSymbolLayerV2Widget::on_mBorderWidthUnitComboBox_currentIndexChanged( int index ) +void QgsSvgMarkerSymbolLayerV2Widget::on_mBorderWidthUnitWidget_changed( ) { if ( mLayer ) { - mLayer->setOutlineWidthUnit(( QgsSymbolV2::OutputUnit ) index ); + QgsSymbolV2::OutputUnit unit = static_cast( mBorderWidthUnitWidget->getUnit() ); + mLayer->setOutlineWidthUnit( unit ); + mLayer->setOutlineWidthMapUnitScale( mBorderWidthUnitWidget->getMapUnitScale() ); + emit changed(); } - emit changed(); } -void QgsSvgMarkerSymbolLayerV2Widget::on_mOffsetUnitComboBox_currentIndexChanged( int index ) +void QgsSvgMarkerSymbolLayerV2Widget::on_mOffsetUnitWidget_changed( ) { if ( mLayer ) { - mLayer->setOffsetUnit(( QgsSymbolV2::OutputUnit ) index ); + QgsSymbolV2::OutputUnit unit = static_cast( mOffsetUnitWidget->getUnit() ); + mLayer->setOffsetUnit( unit ); + mLayer->setOffsetMapUnitScale( mOffsetUnitWidget->getMapUnitScale() ); + emit changed(); } - emit changed(); } void QgsSvgMarkerSymbolLayerV2Widget::on_mDataDefinedPropertiesButton_clicked() @@ -1963,6 +2033,8 @@ QgsSVGFillSymbolLayerWidget::QgsSVGFillSymbolLayerWidget( const QgsVectorLayer* { mLayer = 0; setupUi( this ); + mTextureWidthUnitWidget->setUnits( QStringList() << tr( "Millimeter" ) << tr( "Map unit" ), 1 ); + mSvgOutlineWidthUnitWidget->setUnits( QStringList() << tr( "Millimeter" ) << tr( "Map unit" ), 1 ); mSvgTreeView->setHeaderHidden( true ); insertIcons(); @@ -1993,12 +2065,14 @@ void QgsSVGFillSymbolLayerWidget::setSymbolLayer( QgsSymbolLayerV2* layer ) mRotationSpinBox->blockSignals( true ); mRotationSpinBox->setValue( mLayer->angle() ); mRotationSpinBox->blockSignals( false ); - mTextureWidthUnitComboBox->blockSignals( true ); - mTextureWidthUnitComboBox->setCurrentIndex( mLayer->patternWidthUnit() ); - mTextureWidthUnitComboBox->blockSignals( false ); - mSvgOutlineWidthUnitComboBox->blockSignals( true ); - mSvgOutlineWidthUnitComboBox->setCurrentIndex( mLayer->svgOutlineWidthUnit() ); - mSvgOutlineWidthUnitComboBox->blockSignals( false ); + mTextureWidthUnitWidget->blockSignals( true ); + mTextureWidthUnitWidget->setUnit( mLayer->patternWidthUnit() ); + mTextureWidthUnitWidget->setMapUnitScale( mLayer->patternWidthMapUnitScale() ); + mTextureWidthUnitWidget->blockSignals( false ); + mSvgOutlineWidthUnitWidget->blockSignals( true ); + mSvgOutlineWidthUnitWidget->setUnit( mLayer->svgOutlineWidthUnit() ); + mSvgOutlineWidthUnitWidget->setMapUnitScale( mLayer->svgOutlineWidthMapUnitScale() ); + mSvgOutlineWidthUnitWidget->blockSignals( false ); mChangeColorButton->blockSignals( true ); mChangeColorButton->setColor( mLayer->svgFillColor() ); mChangeColorButton->blockSignals( false ); @@ -2179,20 +2253,24 @@ void QgsSVGFillSymbolLayerWidget::on_mBorderWidthSpinBox_valueChanged( double d } } -void QgsSVGFillSymbolLayerWidget::on_mTextureWidthUnitComboBox_currentIndexChanged( int index ) +void QgsSVGFillSymbolLayerWidget::on_mTextureWidthUnitWidget_changed( ) { if ( mLayer ) { - mLayer->setPatternWidthUnit(( QgsSymbolV2::OutputUnit ) index ); + QgsSymbolV2::OutputUnit unit = static_cast( mTextureWidthUnitWidget->getUnit() ); + mLayer->setPatternWidthUnit( unit ); + mLayer->setPatternWidthMapUnitScale( mTextureWidthUnitWidget->getMapUnitScale() ); emit changed(); } } -void QgsSVGFillSymbolLayerWidget::on_mSvgOutlineWidthUnitComboBox_currentIndexChanged( int index ) +void QgsSVGFillSymbolLayerWidget::on_mSvgOutlineWidthUnitWidget_changed( ) { if ( mLayer ) { - mLayer->setSvgOutlineWidthUnit(( QgsSymbolV2::OutputUnit ) index ); + QgsSymbolV2::OutputUnit unit = static_cast( mSvgOutlineWidthUnitWidget->getUnit() ); + mLayer->setSvgOutlineWidthUnit( unit ); + mLayer->setSvgOutlineWidthMapUnitScale( mSvgOutlineWidthUnitWidget->getMapUnitScale() ); emit changed(); } } @@ -2242,6 +2320,8 @@ QgsLinePatternFillSymbolLayerWidget::QgsLinePatternFillSymbolLayerWidget( const QgsSymbolLayerV2Widget( parent, vl ), mLayer( 0 ) { setupUi( this ); + mDistanceUnitWidget->setUnits( QStringList() << tr( "Millimeter" ) << tr( "Map unit" ), 1 ); + mOffsetUnitWidget->setUnits( QStringList() << tr( "Millimeter" ) << tr( "Map unit" ), 1 ); } void QgsLinePatternFillSymbolLayerWidget::setSymbolLayer( QgsSymbolLayerV2* layer ) @@ -2266,12 +2346,14 @@ void QgsLinePatternFillSymbolLayerWidget::setSymbolLayer( QgsSymbolLayerV2* laye mOffsetSpinBox->blockSignals( false ); //units - mDistanceUnitComboBox->blockSignals( true ); - mDistanceUnitComboBox->setCurrentIndex( mLayer->distanceUnit() ); - mDistanceUnitComboBox->blockSignals( false ); - mOffsetUnitComboBox->blockSignals( true ); - mOffsetUnitComboBox->setCurrentIndex( mLayer->offsetUnit() ); - mOffsetUnitComboBox->blockSignals( false ); + mDistanceUnitWidget->blockSignals( true ); + mDistanceUnitWidget->setUnit( mLayer->distanceUnit() ); + mDistanceUnitWidget->setMapUnitScale( mLayer->distanceMapUnitScale() ); + mDistanceUnitWidget->blockSignals( false ); + mOffsetUnitWidget->blockSignals( true ); + mOffsetUnitWidget->setUnit( mLayer->offsetUnit() ); + mOffsetUnitWidget->setMapUnitScale( mLayer->offsetMapUnitScale() ); + mOffsetUnitWidget->blockSignals( false ); } } @@ -2307,20 +2389,24 @@ void QgsLinePatternFillSymbolLayerWidget::on_mOffsetSpinBox_valueChanged( double } } -void QgsLinePatternFillSymbolLayerWidget::on_mDistanceUnitComboBox_currentIndexChanged( int index ) +void QgsLinePatternFillSymbolLayerWidget::on_mDistanceUnitWidget_changed( ) { if ( mLayer ) { - mLayer->setDistanceUnit(( QgsSymbolV2::OutputUnit ) index ); + QgsSymbolV2::OutputUnit unit = static_cast( mDistanceUnitWidget->getUnit() ); + mLayer->setDistanceUnit( unit ); + mLayer->setDistanceMapUnitScale( mDistanceUnitWidget->getMapUnitScale() ); emit changed(); } } -void QgsLinePatternFillSymbolLayerWidget::on_mOffsetUnitComboBox_currentIndexChanged( int index ) +void QgsLinePatternFillSymbolLayerWidget::on_mOffsetUnitWidget_changed( ) { if ( mLayer ) { - mLayer->setOffsetUnit(( QgsSymbolV2::OutputUnit ) index ); + QgsSymbolV2::OutputUnit unit = static_cast( mOffsetUnitWidget->getUnit() ); + mLayer->setOffsetUnit( unit ); + mLayer->setOffsetMapUnitScale( mOffsetUnitWidget->getMapUnitScale() ); emit changed(); } } @@ -2367,6 +2453,10 @@ QgsPointPatternFillSymbolLayerWidget::QgsPointPatternFillSymbolLayerWidget( cons QgsSymbolLayerV2Widget( parent, vl ), mLayer( 0 ) { setupUi( this ); + mHorizontalDistanceUnitWidget->setUnits( QStringList() << tr( "Millimeter" ) << tr( "Map unit" ), 1 ); + mVerticalDistanceUnitWidget->setUnits( QStringList() << tr( "Millimeter" ) << tr( "Map unit" ), 1 ); + mHorizontalDisplacementUnitWidget->setUnits( QStringList() << tr( "Millimeter" ) << tr( "Map unit" ), 1 ); + mVerticalDisplacementUnitWidget->setUnits( QStringList() << tr( "Millimeter" ) << tr( "Map unit" ), 1 ); } @@ -2391,18 +2481,22 @@ void QgsPointPatternFillSymbolLayerWidget::setSymbolLayer( QgsSymbolLayerV2* lay mVerticalDisplacementSpinBox->setValue( mLayer->displacementY() ); mVerticalDisplacementSpinBox->blockSignals( false ); - mHorizontalDistanceUnitComboBox->blockSignals( true ); - mHorizontalDistanceUnitComboBox->setCurrentIndex( mLayer->distanceXUnit() ); - mHorizontalDistanceUnitComboBox->blockSignals( false ); - mVerticalDistanceUnitComboBox->blockSignals( true ); - mVerticalDistanceUnitComboBox->setCurrentIndex( mLayer->distanceYUnit() ); - mVerticalDistanceUnitComboBox->blockSignals( false ); - mHorizontalDisplacementUnitComboBox->blockSignals( true ); - mHorizontalDisplacementUnitComboBox->setCurrentIndex( mLayer->displacementXUnit() ); - mHorizontalDisplacementUnitComboBox->blockSignals( false ); - mVerticalDisplacementUnitComboBox->blockSignals( true ); - mVerticalDisplacementUnitComboBox->setCurrentIndex( mLayer->displacementYUnit() ); - mVerticalDisplacementUnitComboBox->blockSignals( false ); + mHorizontalDistanceUnitWidget->blockSignals( true ); + mHorizontalDistanceUnitWidget->setUnit( mLayer->distanceXUnit() ); + mHorizontalDistanceUnitWidget->setMapUnitScale( mLayer->distanceXMapUnitScale() ); + mHorizontalDistanceUnitWidget->blockSignals( false ); + mVerticalDistanceUnitWidget->blockSignals( true ) ; + mVerticalDistanceUnitWidget->setUnit( mLayer->distanceYUnit() ); + mVerticalDistanceUnitWidget->setMapUnitScale( mLayer->distanceYMapUnitScale() ); + mVerticalDistanceUnitWidget->blockSignals( false ); + mHorizontalDisplacementUnitWidget->blockSignals( true ); + mHorizontalDisplacementUnitWidget->setUnit( mLayer->displacementXUnit() ); + mHorizontalDisplacementUnitWidget->setMapUnitScale( mLayer->displacementXMapUnitScale() ); + mHorizontalDisplacementUnitWidget->blockSignals( false ); + mVerticalDisplacementUnitWidget->blockSignals( true ); + mVerticalDisplacementUnitWidget->setUnit( mLayer->displacementYUnit() ); + mVerticalDisplacementUnitWidget->setMapUnitScale( mLayer->displacementYMapUnitScale() ); + mVerticalDisplacementUnitWidget->blockSignals( false ); } QgsSymbolLayerV2* QgsPointPatternFillSymbolLayerWidget::symbolLayer() @@ -2446,38 +2540,46 @@ void QgsPointPatternFillSymbolLayerWidget::on_mVerticalDisplacementSpinBox_value } } -void QgsPointPatternFillSymbolLayerWidget::on_mHorizontalDistanceUnitComboBox_currentIndexChanged( int index ) +void QgsPointPatternFillSymbolLayerWidget::on_mHorizontalDistanceUnitWidget_changed( ) { if ( mLayer ) { - mLayer->setDistanceXUnit(( QgsSymbolV2::OutputUnit ) index ); + QgsSymbolV2::OutputUnit unit = static_cast( mHorizontalDistanceUnitWidget->getUnit() ); + mLayer->setDistanceXUnit( unit ); + mLayer->setDistanceXMapUnitScale( mHorizontalDistanceUnitWidget->getMapUnitScale() ); emit changed(); } } -void QgsPointPatternFillSymbolLayerWidget::on_mVerticalDistanceUnitComboBox_currentIndexChanged( int index ) +void QgsPointPatternFillSymbolLayerWidget::on_mVerticalDistanceUnitWidget_changed( ) { if ( mLayer ) { - mLayer->setDistanceYUnit(( QgsSymbolV2::OutputUnit ) index ); + QgsSymbolV2::OutputUnit unit = static_cast( mVerticalDistanceUnitWidget->getUnit() ); + mLayer->setDistanceYUnit( unit ); + mLayer->setDistanceYMapUnitScale( mVerticalDistanceUnitWidget->getMapUnitScale() ); emit changed(); } } -void QgsPointPatternFillSymbolLayerWidget::on_mHorizontalDisplacementUnitComboBox_currentIndexChanged( int index ) +void QgsPointPatternFillSymbolLayerWidget::on_mHorizontalDisplacementUnitWidget_changed( ) { if ( mLayer ) { - mLayer->setDisplacementXUnit(( QgsSymbolV2::OutputUnit ) index ); + QgsSymbolV2::OutputUnit unit = static_cast( mHorizontalDisplacementUnitWidget->getUnit() ); + mLayer->setDisplacementXUnit( unit ); + mLayer->setDisplacementXMapUnitScale( mHorizontalDisplacementUnitWidget->getMapUnitScale() ); emit changed(); } } -void QgsPointPatternFillSymbolLayerWidget::on_mVerticalDisplacementUnitComboBox_currentIndexChanged( int index ) +void QgsPointPatternFillSymbolLayerWidget::on_mVerticalDisplacementUnitWidget_changed( ) { if ( mLayer ) { - mLayer->setDisplacementYUnit(( QgsSymbolV2::OutputUnit ) index ); + QgsSymbolV2::OutputUnit unit = static_cast( mVerticalDisplacementUnitWidget->getUnit() ); + mLayer->setDisplacementYUnit( unit ); + mLayer->setDisplacementYMapUnitScale( mVerticalDisplacementUnitWidget->getMapUnitScale() ); emit changed(); } } @@ -2525,6 +2627,8 @@ QgsFontMarkerSymbolLayerV2Widget::QgsFontMarkerSymbolLayerV2Widget( const QgsVec mLayer = NULL; setupUi( this ); + mSizeUnitWidget->setUnits( QStringList() << tr( "Millimeter" ) << tr( "Map unit" ), 1 ); + mOffsetUnitWidget->setUnits( QStringList() << tr( "Millimeter" ) << tr( "Map unit" ), 1 ); widgetChar = new CharacterWidget; scrollArea->setWidget( widgetChar ); @@ -2569,13 +2673,15 @@ void QgsFontMarkerSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer ) spinOffsetY->setValue( mLayer->offset().y() ); spinOffsetY->blockSignals( false ); - mSizeUnitComboBox->blockSignals( true ); - mSizeUnitComboBox->setCurrentIndex( mLayer->sizeUnit() ); - mSizeUnitComboBox->blockSignals( false ); + mSizeUnitWidget->blockSignals( true ); + mSizeUnitWidget->setUnit( mLayer->sizeUnit() ); + mSizeUnitWidget->setMapUnitScale( mLayer->sizeMapUnitScale() ); + mSizeUnitWidget->blockSignals( false ); - mOffsetUnitComboBox->blockSignals( true ); - mOffsetUnitComboBox->setCurrentIndex( mLayer->offsetUnit() ); - mOffsetUnitComboBox->blockSignals( false ); + mOffsetUnitWidget->blockSignals( true ); + mOffsetUnitWidget->setUnit( mLayer->offsetUnit() ); + mOffsetUnitWidget->setMapUnitScale( mLayer->offsetMapUnitScale() ); + mOffsetUnitWidget->blockSignals( false ); //anchor points mHorizontalAnchorComboBox->blockSignals( true ); @@ -2629,22 +2735,26 @@ void QgsFontMarkerSymbolLayerV2Widget::setOffset() emit changed(); } -void QgsFontMarkerSymbolLayerV2Widget::on_mSizeUnitComboBox_currentIndexChanged( int index ) +void QgsFontMarkerSymbolLayerV2Widget::on_mSizeUnitWidget_changed( ) { if ( mLayer ) { - mLayer->setSizeUnit(( QgsSymbolV2::OutputUnit ) index ); + QgsSymbolV2::OutputUnit unit = static_cast( mSizeUnitWidget->getUnit() ); + mLayer->setSizeUnit( unit ); + mLayer->setSizeMapUnitScale( mSizeUnitWidget->getMapUnitScale() ); + emit changed(); } - emit changed(); } -void QgsFontMarkerSymbolLayerV2Widget::on_mOffsetUnitComboBox_currentIndexChanged( int index ) +void QgsFontMarkerSymbolLayerV2Widget::on_mOffsetUnitWidget_changed( ) { if ( mLayer ) { - mLayer->setOffsetUnit(( QgsSymbolV2::OutputUnit ) index ); + QgsSymbolV2::OutputUnit unit = static_cast( mOffsetUnitWidget->getUnit() ); + mLayer->setOffsetUnit( unit ); + mLayer->setOffsetMapUnitScale( mOffsetUnitWidget->getMapUnitScale() ); + emit changed(); } - emit changed(); } void QgsFontMarkerSymbolLayerV2Widget::on_mHorizontalAnchorComboBox_currentIndexChanged( int index ) @@ -2691,3 +2801,5 @@ QgsSymbolLayerV2* QgsCentroidFillSymbolLayerV2Widget::symbolLayer() return mLayer; } + + diff --git a/src/gui/symbology-ng/qgssymbollayerv2widget.h b/src/gui/symbology-ng/qgssymbollayerv2widget.h index f3057f942577..0474e5b7348f 100644 --- a/src/gui/symbology-ng/qgssymbollayerv2widget.h +++ b/src/gui/symbology-ng/qgssymbollayerv2widget.h @@ -1,10 +1,10 @@ /*************************************************************************** - qgssymbollayerv2widget.h - symbol layer widgets + qgssymbollayerv2widget.h - symbol layer widgets - --------------------- - begin : November 2009 - copyright : (C) 2009 by Martin Dobias - email : wonder dot sk at gmail dot com + --------------------- + begin : November 2009 + copyright : (C) 2009 by Martin Dobias + email : wonder dot sk at gmail dot com *************************************************************************** * * * This program is free software; you can redistribute it and/or modify * @@ -71,9 +71,9 @@ class GUI_EXPORT QgsSimpleLineSymbolLayerV2Widget : public QgsSymbolLayerV2Widge void offsetChanged(); void on_mCustomCheckBox_stateChanged( int state ); void on_mChangePatternButton_clicked(); - void on_mPenWidthUnitComboBox_currentIndexChanged( int index ); - void on_mOffsetUnitComboBox_currentIndexChanged( int index ); - void on_mDashPatternUnitComboBox_currentIndexChanged( int index ); + void on_mPenWidthUnitWidget_changed( ); + void on_mOffsetUnitWidget_changed( ); + void on_mDashPatternUnitWidget_changed( ); void on_mDataDefinedPropertiesButton_clicked(); void on_mDrawInsideCheckBox_stateChanged( int state ); @@ -110,9 +110,9 @@ class GUI_EXPORT QgsSimpleMarkerSymbolLayerV2Widget : public QgsSymbolLayerV2Wid void setSize(); void setAngle(); void setOffset(); - void on_mSizeUnitComboBox_currentIndexChanged( int index ); - void on_mOffsetUnitComboBox_currentIndexChanged( int index ); - void on_mOutlineWidthUnitComboBox_currentIndexChanged( int index ); + void on_mSizeUnitWidget_changed( ); + void on_mOffsetUnitWidget_changed( ); + void on_mOutlineWidthUnitWidget_changed( ); void on_mDataDefinedPropertiesButton_clicked(); void on_mOutlineStyleComboBox_currentIndexChanged( int index ); void on_mOutlineWidthSpinBox_valueChanged( double d ); @@ -149,8 +149,8 @@ class GUI_EXPORT QgsSimpleFillSymbolLayerV2Widget : public QgsSymbolLayerV2Widge void borderWidthChanged(); void borderStyleChanged(); void offsetChanged(); - void on_mBorderWidthUnitComboBox_currentIndexChanged( int index ); - void on_mOffsetUnitComboBox_currentIndexChanged( int index ); + void on_mBorderWidthUnitWidget_changed( ); + void on_mOffsetUnitWidget_changed( ); void on_mDataDefinedPropertiesButton_clicked(); protected: @@ -186,7 +186,7 @@ class GUI_EXPORT QgsGradientFillSymbolLayerV2Widget : public QgsSymbolLayerV2Wid void setGradientSpread( int index ); void offsetChanged(); void referencePointChanged(); - void on_mOffsetUnitComboBox_currentIndexChanged( int index ); + void on_mOffsetUnitWidget_changed( ); void on_mDataDefinedPropertiesButton_clicked(); void colorModeChanged(); void on_mSpinAngle_valueChanged( double value ); @@ -220,11 +220,11 @@ class GUI_EXPORT QgsShapeburstFillSymbolLayerV2Widget : public QgsSymbolLayerV2W void colorModeChanged(); void on_mSpinBlurRadius_valueChanged( int value ); void on_mSpinMaxDistance_valueChanged( double value ); - void on_mDistanceUnitComboBox_currentIndexChanged( int index ); + void on_mDistanceUnitWidget_changed( ); void on_mRadioUseWholeShape_toggled( bool value ); void applyColorRamp(); void offsetChanged(); - void on_mOffsetUnitComboBox_currentIndexChanged( int index ); + void on_mOffsetUnitWidget_changed( ); void on_mDataDefinedPropertiesButton_clicked(); void on_mIgnoreRingsCheckBox_stateChanged( int state ); @@ -258,9 +258,9 @@ class GUI_EXPORT QgsMarkerLineSymbolLayerV2Widget : public QgsSymbolLayerV2Widge void setRotate(); void setOffset(); void setPlacement(); - void on_mIntervalUnitComboBox_currentIndexChanged( int index ); - void on_mOffsetUnitComboBox_currentIndexChanged( int index ); - void on_mOffsetAlongLineUnitComboBox_currentIndexChanged( int index ); + void on_mIntervalUnitWidget_changed( ); + void on_mOffsetUnitWidget_changed( ); + void on_mOffsetAlongLineUnitWidget_changed( ); void on_mDataDefinedPropertiesButton_clicked(); protected: @@ -300,9 +300,9 @@ class GUI_EXPORT QgsSvgMarkerSymbolLayerV2Widget : public QgsSymbolLayerV2Widget void on_mChangeColorButton_colorChanged( const QColor& color ); void on_mChangeBorderColorButton_colorChanged( const QColor& color ); void on_mBorderWidthSpinBox_valueChanged( double d ); - void on_mSizeUnitComboBox_currentIndexChanged( int index ); - void on_mBorderWidthUnitComboBox_currentIndexChanged( int index ); - void on_mOffsetUnitComboBox_currentIndexChanged( int index ); + void on_mSizeUnitWidget_changed( ); + void on_mBorderWidthUnitWidget_changed( ); + void on_mOffsetUnitWidget_changed( ); void on_mDataDefinedPropertiesButton_clicked(); void on_mHorizontalAnchorComboBox_currentIndexChanged( int index ); void on_mVerticalAnchorComboBox_currentIndexChanged( int index ); @@ -358,8 +358,8 @@ class GUI_EXPORT QgsSVGFillSymbolLayerWidget : public QgsSymbolLayerV2Widget, pr void on_mChangeColorButton_colorChanged( const QColor& color ); void on_mChangeBorderColorButton_colorChanged( const QColor& color ); void on_mBorderWidthSpinBox_valueChanged( double d ); - void on_mTextureWidthUnitComboBox_currentIndexChanged( int index ); - void on_mSvgOutlineWidthUnitComboBox_currentIndexChanged( int index ); + void on_mTextureWidthUnitWidget_changed( ); + void on_mSvgOutlineWidthUnitWidget_changed( ); void on_mDataDefinedPropertiesButton_clicked(); }; @@ -388,8 +388,8 @@ class GUI_EXPORT QgsLinePatternFillSymbolLayerWidget : public QgsSymbolLayerV2Wi void on_mAngleSpinBox_valueChanged( double d ); void on_mDistanceSpinBox_valueChanged( double d ); void on_mOffsetSpinBox_valueChanged( double d ); - void on_mDistanceUnitComboBox_currentIndexChanged( int index ); - void on_mOffsetUnitComboBox_currentIndexChanged( int index ); + void on_mDistanceUnitWidget_changed( ); + void on_mOffsetUnitWidget_changed( ); void on_mDataDefinedPropertiesButton_clicked(); }; @@ -418,10 +418,10 @@ class GUI_EXPORT QgsPointPatternFillSymbolLayerWidget: public QgsSymbolLayerV2Wi void on_mVerticalDistanceSpinBox_valueChanged( double d ); void on_mHorizontalDisplacementSpinBox_valueChanged( double d ); void on_mVerticalDisplacementSpinBox_valueChanged( double d ); - void on_mHorizontalDistanceUnitComboBox_currentIndexChanged( int index ); - void on_mVerticalDistanceUnitComboBox_currentIndexChanged( int index ); - void on_mHorizontalDisplacementUnitComboBox_currentIndexChanged( int index ); - void on_mVerticalDisplacementUnitComboBox_currentIndexChanged( int index ); + void on_mHorizontalDistanceUnitWidget_changed( ); + void on_mVerticalDistanceUnitWidget_changed( ); + void on_mHorizontalDisplacementUnitWidget_changed( ); + void on_mVerticalDisplacementUnitWidget_changed( ); void on_mDataDefinedPropertiesButton_clicked(); }; @@ -452,8 +452,8 @@ class GUI_EXPORT QgsFontMarkerSymbolLayerV2Widget : public QgsSymbolLayerV2Widge void setAngle( double angle ); void setCharacter( const QChar& chr ); void setOffset(); - void on_mSizeUnitComboBox_currentIndexChanged( int index ); - void on_mOffsetUnitComboBox_currentIndexChanged( int index ); + void on_mSizeUnitWidget_changed( ); + void on_mOffsetUnitWidget_changed( ); void on_mHorizontalAnchorComboBox_currentIndexChanged( int index ); void on_mVerticalAnchorComboBox_currentIndexChanged( int index ); @@ -488,3 +488,5 @@ class GUI_EXPORT QgsCentroidFillSymbolLayerV2Widget : public QgsSymbolLayerV2Wid #endif + + diff --git a/src/gui/symbology-ng/qgssymbolslistwidget.cpp b/src/gui/symbology-ng/qgssymbolslistwidget.cpp index 5b0fb0d41212..3d0c5aa20dd8 100644 --- a/src/gui/symbology-ng/qgssymbolslistwidget.cpp +++ b/src/gui/symbology-ng/qgssymbolslistwidget.cpp @@ -1,9 +1,9 @@ /*************************************************************************** - qgssymbolslist.cpp - --------------------- - begin : June 2012 - copyright : (C) 2012 by Arunmozhi - email : aruntheguy at gmail.com + qgssymbolslist.cpp + --------------------- + begin : June 2012 + copyright : (C) 2012 by Arunmozhi + email : aruntheguy at gmail.com *************************************************************************** * * * This program is free software; you can redistribute it and/or modify * @@ -42,6 +42,8 @@ QgsSymbolsListWidget::QgsSymbolsListWidget( QgsSymbolV2* symbol, QgsStyleV2* sty setupUi( this ); + mSymbolUnitWidget->setUnits( QStringList() << tr( "Millimeter" ) << tr( "Map unit" ), 1 ); + btnAdvanced->hide(); // advanced button is hidden by default if ( menu ) // show it if there is a menu pointer { @@ -71,9 +73,10 @@ QgsSymbolsListWidget::QgsSymbolsListWidget( QgsSymbolV2* symbol, QgsStyleV2* sty if ( mSymbol ) { // output unit - mSymbolUnitComboBox->blockSignals( true ); - mSymbolUnitComboBox->setCurrentIndex( mSymbol->outputUnit() ); - mSymbolUnitComboBox->blockSignals( false ); + mSymbolUnitWidget->blockSignals( true ); + mSymbolUnitWidget->setUnit( mSymbol->outputUnit() ); + mSymbolUnitWidget->setMapUnitScale( mSymbol->mapUnitScale() ); + mSymbolUnitWidget->blockSignals( false ); mTransparencySlider->blockSignals( true ); double transparency = 1 - symbol->alpha(); @@ -237,12 +240,13 @@ void QgsSymbolsListWidget::addSymbolToStyle() populateSymbolView(); } -void QgsSymbolsListWidget::on_mSymbolUnitComboBox_currentIndexChanged( const QString & text ) +void QgsSymbolsListWidget::on_mSymbolUnitWidget_changed( ) { - Q_UNUSED( text ); if ( mSymbol ) { - mSymbol->setOutputUnit(( QgsSymbolV2::OutputUnit ) mSymbolUnitComboBox->currentIndex() ); + QgsSymbolV2::OutputUnit unit = static_cast( mSymbolUnitWidget->getUnit() ); + mSymbol->setOutputUnit( unit ); + mSymbol->setMapUnitScale( mSymbolUnitWidget->getMapUnitScale() ); emit changed(); } @@ -342,3 +346,5 @@ void QgsSymbolsListWidget::on_groupsCombo_editTextChanged( const QString &text ) QStringList symbols = mStyle->findSymbols( QgsStyleV2::SymbolEntity, text ); populateSymbols( symbols ); } + + diff --git a/src/gui/symbology-ng/qgssymbolslistwidget.h b/src/gui/symbology-ng/qgssymbolslistwidget.h index 4b91011cf4eb..937c67b90598 100644 --- a/src/gui/symbology-ng/qgssymbolslistwidget.h +++ b/src/gui/symbology-ng/qgssymbolslistwidget.h @@ -1,9 +1,9 @@ /*************************************************************************** - qgssymbolslistwidget.h - --------------------- - begin : June 2012 - copyright : (C) 2012 by Arunmozhi - email : aruntheguy at gmail.com + qgssymbolslistwidget.h + --------------------- + begin : June 2012 + copyright : (C) 2012 by Arunmozhi + email : aruntheguy at gmail.com *************************************************************************** * * * This program is free software; you can redistribute it and/or modify * @@ -40,7 +40,7 @@ class GUI_EXPORT QgsSymbolsListWidget : public QWidget, private Ui::SymbolsListW void setLineWidth( double width ); void addSymbolToStyle(); void symbolAddedToStyle( QString name, QgsSymbolV2* symbol ); - void on_mSymbolUnitComboBox_currentIndexChanged( const QString & text ); + void on_mSymbolUnitWidget_changed( ); void on_mTransparencySlider_valueChanged( int value ); void on_groupsCombo_currentIndexChanged( int index ); @@ -69,3 +69,5 @@ class GUI_EXPORT QgsSymbolsListWidget : public QWidget, private Ui::SymbolsListW #endif //QGSSYMBOLSLISTWIDGET_H + + diff --git a/src/gui/symbology-ng/qgsvectorfieldsymbollayerwidget.cpp b/src/gui/symbology-ng/qgsvectorfieldsymbollayerwidget.cpp index ca04d9493614..6e1c420f2886 100644 --- a/src/gui/symbology-ng/qgsvectorfieldsymbollayerwidget.cpp +++ b/src/gui/symbology-ng/qgsvectorfieldsymbollayerwidget.cpp @@ -1,9 +1,9 @@ /*************************************************************************** - qgsvectorfieldsymbollayerwidget.cpp - --------------------- - begin : October 2011 - copyright : (C) 2011 by Marco Hugentobler - email : marco dot hugentobler at sourcepole dot ch + qgsvectorfieldsymbollayerwidget.cpp + --------------------- + begin : October 2011 + copyright : (C) 2011 by Marco Hugentobler + email : marco dot hugentobler at sourcepole dot ch *************************************************************************** * * * This program is free software; you can redistribute it and/or modify * @@ -87,9 +87,10 @@ void QgsVectorFieldSymbolLayerWidget::setSymbolLayer( QgsSymbolLayerV2* layer ) mRadiansRadioButton->setChecked( true ); } - mDistanceUnitComboBox->blockSignals( true ); - mDistanceUnitComboBox->setCurrentIndex( mLayer->distanceUnit() ); - mDistanceUnitComboBox->blockSignals( false ); + mDistanceUnitWidget->blockSignals( true ); + mDistanceUnitWidget->setUnit( mLayer->distanceUnit() ); + mDistanceUnitWidget->setMapUnitScale( mLayer->distanceMapUnitScale() ); + mDistanceUnitWidget->blockSignals( false ); emit changed(); } @@ -208,3 +209,5 @@ void QgsVectorFieldSymbolLayerWidget::on_mDistanceUnitComboBox_currentIndexChang emit changed(); } } + + diff --git a/src/ui/qgslabelingguibase.ui b/src/ui/qgslabelingguibase.ui index dc0fd1337524..473e7b2327ab 100644 --- a/src/ui/qgslabelingguibase.ui +++ b/src/ui/qgslabelingguibase.ui @@ -14,7 +14,16 @@ Layer labeling settings - + + 6 + + + 6 + + + 6 + + 6 @@ -23,7 +32,16 @@ - + + 0 + + + 0 + + + 0 + + 0 @@ -103,7 +121,16 @@ QFrame::Raised - + + 0 + + + 0 + + + 0 + + 0 @@ -162,7 +189,7 @@ 0 0 - 602 + 606 300 @@ -382,10 +409,19 @@ QFrame::Raised - + + 0 + + + 0 + + + 0 + + 0 - + 0 @@ -566,7 +602,16 @@ - + + 0 + + + 0 + + + 0 + + 0 @@ -592,8 +637,8 @@ 0 0 - 566 - 392 + 584 + 397 @@ -624,7 +669,16 @@ - + + 0 + + + 0 + + + 0 + + 0 @@ -828,7 +882,16 @@ - + + 0 + + + 0 + + + 0 + + 0 @@ -914,26 +977,6 @@ - - - - - 0 - 0 - - - - - points - - - - - map units - - - - @@ -1231,7 +1274,16 @@ - + + 0 + + + 0 + + + 0 + + 0 @@ -1264,6 +1316,9 @@ font-style: italic; + + + @@ -1288,7 +1343,16 @@ font-style: italic; - + + 0 + + + 0 + + + 0 + + 0 @@ -1314,8 +1378,8 @@ font-style: italic; 0 0 - 383 - 389 + 584 + 397 @@ -1498,7 +1562,16 @@ font-style: italic; - + + 0 + + + 0 + + + 0 + + 0 @@ -1577,7 +1650,16 @@ font-style: italic; 0 - + + 0 + + + 0 + + + 0 + + 0 @@ -1632,7 +1714,16 @@ font-style: italic; 0 - + + 0 + + + 0 + + + 0 + + 0 @@ -1690,7 +1781,16 @@ font-style: italic; - + + 0 + + + 0 + + + 0 + + 0 @@ -1899,7 +1999,16 @@ font-style: italic; - + + 0 + + + 0 + + + 0 + + 0 @@ -1925,8 +2034,8 @@ font-style: italic; 0 0 - 298 - 261 + 584 + 397 @@ -2076,7 +2185,16 @@ font-style: italic; - + + 0 + + + 0 + + + 0 + + 0 @@ -2215,29 +2333,6 @@ font-style: italic; - - - - true - - - - 0 - 0 - - - - - mm - - - - - map units - - - - @@ -2251,6 +2346,9 @@ font-style: italic; + + + @@ -2277,7 +2375,16 @@ font-style: italic; - + + 0 + + + 0 + + + 0 + + 0 @@ -2303,8 +2410,8 @@ font-style: italic; 0 0 - 362 - 711 + 570 + 606 @@ -2459,23 +2566,6 @@ font-style: italic; - - - - 0 - - - - mm - - - - - map units - - - - @@ -2513,7 +2603,16 @@ font-style: italic; - + + 0 + + + 0 + + + 0 + + 0 @@ -2795,25 +2894,6 @@ font-style: italic; - - - - - mm - - - - - map units - - - - - % of length - - - - @@ -2843,7 +2923,16 @@ font-style: italic; - + + 0 + + + 0 + + + 0 + + 0 @@ -2905,21 +2994,7 @@ font-style: italic; - - - 0 - - - - mm - - - - - map units - - - + @@ -2996,23 +3071,6 @@ font-style: italic; - - - - 0 - - - - mm - - - - - map units - - - - @@ -3082,6 +3140,15 @@ font-style: italic; + + + + + + + + + @@ -3108,7 +3175,16 @@ font-style: italic; - + + 0 + + + 0 + + + 0 + + 0 @@ -3134,8 +3210,8 @@ font-style: italic; 0 0 - 325 - 430 + 584 + 397 @@ -3273,23 +3349,6 @@ font-style: italic; - - - - 0 - - - - mm - - - - - map units - - - - @@ -3306,23 +3365,6 @@ font-style: italic; - - - - 0 - - - - mm - - - - - map units - - - - @@ -3576,6 +3618,12 @@ font-style: italic; + + + + + + @@ -3602,7 +3650,16 @@ font-style: italic; - + + 0 + + + 0 + + + 0 + + 0 @@ -3628,8 +3685,8 @@ font-style: italic; 0 0 - 377 - 737 + 570 + 673 @@ -3660,7 +3717,16 @@ font-style: italic; QFrame::Sunken - + + 0 + + + 0 + + + 0 + + 0 @@ -3676,7 +3742,16 @@ font-style: italic; - + + 0 + + + 0 + + + 0 + + 0 @@ -3706,7 +3781,16 @@ font-style: italic; - + + 0 + + + 0 + + + 0 + + 0 @@ -3749,7 +3833,16 @@ font-style: italic; - + + 0 + + + 0 + + + 0 + + 0 @@ -3830,7 +3923,16 @@ font-style: italic; QFrame::Raised - + + 0 + + + 0 + + + 0 + + 0 @@ -3905,7 +4007,16 @@ font-style: italic; QFrame::Raised - + + 0 + + + 0 + + + 0 + + 0 @@ -3966,7 +4077,16 @@ font-style: italic; - + + 0 + + + 0 + + + 0 + + 0 @@ -4242,35 +4362,21 @@ font-style: italic; QFrame::Raised - - 12 + + 0 - + 0 - - - - - 0 - 0 - - - - 0 - - - - mm - - - - - map units - - - - + + 0 + + + 0 + + + 12 + @@ -4348,6 +4454,9 @@ font-style: italic; + + + @@ -4366,26 +4475,21 @@ font-style: italic; QFrame::Raised - - 12 + + 0 - + 0 - - - - - mm - - - - - map units - - - - + + 0 + + + 0 + + + 12 + @@ -4426,6 +4530,9 @@ font-style: italic; + + + @@ -4444,7 +4551,16 @@ font-style: italic; QFrame::Raised - + + 0 + + + 0 + + + 0 + + 0 @@ -4498,12 +4614,21 @@ font-style: italic; - - 12 + + 0 + + + 0 + + + 0 - + 0 + + 12 + @@ -4734,7 +4859,16 @@ font-style: italic; - + + 0 + + + 0 + + + 0 + + 0 @@ -4868,7 +5002,16 @@ font-style: italic; - + + 0 + + + 0 + + + 0 + + 0 @@ -4894,8 +5037,8 @@ font-style: italic; 0 0 - 421 - 622 + 570 + 575 @@ -5205,7 +5348,16 @@ font-style: italic; QFrame::Raised - + + 0 + + + 0 + + + 0 + + 0 @@ -5303,7 +5455,16 @@ font-style: italic; - + + 0 + + + 0 + + + 0 + + 0 @@ -5406,7 +5567,16 @@ font-style: italic; - + + 0 + + + 0 + + + 0 + + 0 @@ -5460,7 +5630,16 @@ font-style: italic; - + + 0 + + + 0 + + + 0 + + 0 @@ -5583,6 +5762,11 @@ font-style: italic; QgsFieldExpressionWidget QWidget
qgsfieldexpressionwidget.h
+ + + QgsUnitSelectionWidget + QWidget +
qgsunitselectionwidget.h
1
diff --git a/src/ui/qgsmapunitscaledialog.ui b/src/ui/qgsmapunitscaledialog.ui new file mode 100644 index 000000000000..61954d477a5c --- /dev/null +++ b/src/ui/qgsmapunitscaledialog.ui @@ -0,0 +1,98 @@ + + + QgsMapUnitScaleDialog + + + + 0 + 0 + 320 + 126 + + + + Adjust map unit scales + + + + :/images/themes/default/mActionOptions.png:/images/themes/default/mActionOptions.png + + + + + + Maximum scale: + + + + + + + Minimum scale: + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + + + + + + QgsScaleComboBox + QComboBox +
qgsscalecombobox.h
+
+
+ + + + + + mButtonBox + accepted() + QgsMapUnitScaleDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + mButtonBox + rejected() + QgsMapUnitScaleDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + +
+ diff --git a/src/ui/qgsunitselectionwidget.ui b/src/ui/qgsunitselectionwidget.ui new file mode 100644 index 000000000000..75455254063e --- /dev/null +++ b/src/ui/qgsunitselectionwidget.ui @@ -0,0 +1,74 @@ + + + QgsUnitSelectionWidget + + + + 0 + 0 + 109 + 22 + + + + + 0 + 0 + + + + Form + + + + 2 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + QPushButton {margin: 0s; } + + + + + + + :/options.png:/options.png + + + + + + + + + + diff --git a/src/ui/symbollayer/widget_ellipse.ui b/src/ui/symbollayer/widget_ellipse.ui index e16d2a83e374..f4945945a77b 100644 --- a/src/ui/symbollayer/widget_ellipse.ui +++ b/src/ui/symbollayer/widget_ellipse.ui @@ -6,7 +6,7 @@ 0 0 - 404 + 416 436
@@ -153,24 +153,7 @@
- - - - 0 - 0 - - - - - Millimeter - - - - - Map unit - - - +
@@ -196,18 +179,7 @@
- - - - Millimeter - - - - - Map unit - - - +
@@ -268,7 +240,7 @@
- + @@ -292,18 +264,7 @@
- - - - Millimeter - - - - - Map unit - - - + @@ -369,18 +330,7 @@ - - - - Millimeter - - - - - Map unit - - - + @@ -453,6 +403,17 @@ QPushButton
qgscolorbutton.h
+ + QgsUnitSelectionWidget + QWidget +
qgsunitselectionwidget.h
+ 1 +
+ + QgsPenStyleComboBox + QWidget +
qgspenstylecombobox.h
+
diff --git a/src/ui/symbollayer/widget_fontmarker.ui b/src/ui/symbollayer/widget_fontmarker.ui index e8ce717a7ecb..40691be1c1de 100644 --- a/src/ui/symbollayer/widget_fontmarker.ui +++ b/src/ui/symbollayer/widget_fontmarker.ui @@ -6,7 +6,7 @@ 0 0 - 406 + 452 354 @@ -84,18 +84,7 @@ - - - - Millimeter - - - - - Map unit - - - + @@ -176,18 +165,7 @@ - - - - Millimeter - - - - - Map unit - - - + @@ -264,6 +242,12 @@ QPushButton
qgscolorbutton.h
+ + QgsUnitSelectionWidget + QWidget +
qgsunitselectionwidget.h
+ 1 +
diff --git a/src/ui/symbollayer/widget_gradientfill.ui b/src/ui/symbollayer/widget_gradientfill.ui index abc4971d9988..bfac88f2fd7e 100644 --- a/src/ui/symbollayer/widget_gradientfill.ui +++ b/src/ui/symbollayer/widget_gradientfill.ui @@ -23,7 +23,16 @@ 28 - + + 1 + + + 1 + + + 1 + + 1 @@ -405,18 +414,7 @@ - - - - Millimeter - - - - - Map unit - - - + @@ -435,6 +433,12 @@ QPushButton
qgscolorbutton.h
+ + QgsUnitSelectionWidget + QWidget +
qgsunitselectionwidget.h
+ 1 +
QgsColorRampComboBox QComboBox diff --git a/src/ui/symbollayer/widget_linepatternfill.ui b/src/ui/symbollayer/widget_linepatternfill.ui index 06b6f83de2a4..37db8ecb5953 100644 --- a/src/ui/symbollayer/widget_linepatternfill.ui +++ b/src/ui/symbollayer/widget_linepatternfill.ui @@ -23,7 +23,16 @@ 28 - + + 1 + + + 1 + + + 1 + + 1 @@ -69,18 +78,7 @@ - - - - Millimeter - - - - - Map unit - - - + @@ -116,18 +114,7 @@ - - - - Millimeter - - - - - Map unit - - - + @@ -146,6 +133,14 @@ + + + QgsUnitSelectionWidget + QWidget +
qgsunitselectionwidget.h
+ 1 +
+
diff --git a/src/ui/symbollayer/widget_markerline.ui b/src/ui/symbollayer/widget_markerline.ui index 7e9bda40c93e..0f1dea0cce24 100644 --- a/src/ui/symbollayer/widget_markerline.ui +++ b/src/ui/symbollayer/widget_markerline.ui @@ -70,18 +70,7 @@ - - - - Millimeter - - - - - Map unit - - - + @@ -145,18 +134,7 @@ - - - - Millimeter - - - - - Map unit - - - + @@ -219,23 +197,20 @@ - - - - Millimeter - - - - - Map unit - - - + + + + QgsUnitSelectionWidget + QWidget +
qgsunitselectionwidget.h
+ 1 +
+
chkRotateMarker diff --git a/src/ui/symbollayer/widget_pointpatternfill.ui b/src/ui/symbollayer/widget_pointpatternfill.ui index 4c053a71e165..7da27b1d6f92 100644 --- a/src/ui/symbollayer/widget_pointpatternfill.ui +++ b/src/ui/symbollayer/widget_pointpatternfill.ui @@ -23,7 +23,16 @@ 28 - + + 1 + + + 1 + + + 1 + + 1 @@ -55,18 +64,7 @@ - - - - Millimeter - - - - - Map unit - - - + @@ -99,18 +97,7 @@ - - - - Millimeter - - - - - Map unit - - - + @@ -143,18 +130,7 @@ - - - - Millimeter - - - - - Map unit - - - + @@ -187,18 +163,7 @@ - - - - Millimeter - - - - - Map unit - - - + @@ -217,6 +182,14 @@ + + + QgsUnitSelectionWidget + QWidget +
qgsunitselectionwidget.h
+ 1 +
+
diff --git a/src/ui/symbollayer/widget_shapeburstfill.ui b/src/ui/symbollayer/widget_shapeburstfill.ui index 87bbaab3d806..865c04d5017a 100644 --- a/src/ui/symbollayer/widget_shapeburstfill.ui +++ b/src/ui/symbollayer/widget_shapeburstfill.ui @@ -141,18 +141,7 @@ - - - - Millimeter - - - - - Map unit - - - + @@ -256,18 +245,7 @@ - - - - Millimeter - - - - - Map unit - - - + @@ -292,6 +270,12 @@ QPushButton
qgscolorbutton.h
+ + QgsUnitSelectionWidget + QWidget +
qgsunitselectionwidget.h
+ 1 +
QgsColorRampComboBox QComboBox @@ -316,22 +300,6 @@ - - mRadioUseMaxDistance - toggled(bool) - mDistanceUnitComboBox - setEnabled(bool) - - - 115 - 160 - - - 400 - 163 - - - radioTwoColor toggled(bool) @@ -382,3 +350,4 @@
+ diff --git a/src/ui/symbollayer/widget_simplefill.ui b/src/ui/symbollayer/widget_simplefill.ui index 002aec4fe0b4..f04c04ed509d 100644 --- a/src/ui/symbollayer/widget_simplefill.ui +++ b/src/ui/symbollayer/widget_simplefill.ui @@ -120,7 +120,7 @@ - + @@ -161,18 +161,7 @@ - - - - Millimeter - - - - - Map unit - - - + @@ -230,18 +219,7 @@ - - - - Millimeter - - - - - Map unit - - - + @@ -261,19 +239,25 @@ + + QgsPenJoinStyleComboBox + QComboBox +
qgspenstylecombobox.h
+
QgsColorButton QPushButton
qgscolorbutton.h
- QgsPenStyleComboBox - QComboBox -
qgspenstylecombobox.h
+ QgsUnitSelectionWidget + QWidget +
qgsunitselectionwidget.h
+ 1
- QgsPenJoinStyleComboBox - QComboBox + QgsPenStyleComboBox + QWidget
qgspenstylecombobox.h
diff --git a/src/ui/symbollayer/widget_simpleline.ui b/src/ui/symbollayer/widget_simpleline.ui index 4ffaacd28259..c94f186fd849 100644 --- a/src/ui/symbollayer/widget_simpleline.ui +++ b/src/ui/symbollayer/widget_simpleline.ui @@ -102,24 +102,7 @@ - - - - 0 - 0 - - - - - Millimeter - - - - - Map unit - - - + @@ -158,24 +141,7 @@ - - - - 0 - 0 - - - - - Millimeter - - - - - Map unit - - - + @@ -187,7 +153,7 @@ - + @@ -237,20 +203,6 @@ - - - - - Millimeter - - - - - Map unit - - - - @@ -275,22 +227,31 @@ + + + + + QgsPenJoinStyleComboBox + QComboBox +
qgspenstylecombobox.h
+
QgsColorButton QPushButton
qgscolorbutton.h
- QgsPenStyleComboBox - QComboBox -
qgspenstylecombobox.h
+ QgsUnitSelectionWidget + QWidget +
qgsunitselectionwidget.h
+ 1
- QgsPenJoinStyleComboBox - QComboBox + QgsPenStyleComboBox + QWidget
qgspenstylecombobox.h
diff --git a/src/ui/symbollayer/widget_simplemarker.ui b/src/ui/symbollayer/widget_simplemarker.ui index a54fa37a6ed2..6598985d05dd 100644 --- a/src/ui/symbollayer/widget_simplemarker.ui +++ b/src/ui/symbollayer/widget_simplemarker.ui @@ -6,7 +6,7 @@ 0 0 - 365 + 408 424 @@ -128,18 +128,7 @@ - - - - Millimeter - - - - - Map unit - - - + @@ -151,7 +140,7 @@ - + @@ -176,18 +165,7 @@ - - - - Millimeter - - - - - Map unit - - - + @@ -262,18 +240,7 @@ - - - - Millimeter - - - - - Map unit - - - + @@ -390,6 +357,17 @@ QPushButton
qgscolorbutton.h
+ + QgsUnitSelectionWidget + QWidget +
qgsunitselectionwidget.h
+ 1 +
+ + QgsPenStyleComboBox + QWidget +
qgspenstylecombobox.h
+
lstNames diff --git a/src/ui/symbollayer/widget_svgfill.ui b/src/ui/symbollayer/widget_svgfill.ui index 7770f6a622c9..cd9c5569d86d 100644 --- a/src/ui/symbollayer/widget_svgfill.ui +++ b/src/ui/symbollayer/widget_svgfill.ui @@ -14,7 +14,16 @@ Form - + + 1 + + + 1 + + + 1 + + 1 @@ -121,18 +130,7 @@ - - - - Millimeter - - - - - Map unit - - - + @@ -267,18 +265,7 @@ - - - - Millimeter - - - - - Map unit - - - + @@ -305,6 +292,12 @@ QPushButton
qgscolorbutton.h
+ + QgsUnitSelectionWidget + QWidget +
qgsunitselectionwidget.h
+ 1 +
diff --git a/src/ui/symbollayer/widget_svgmarker.ui b/src/ui/symbollayer/widget_svgmarker.ui index cdfc49134e61..cd57153564aa 100644 --- a/src/ui/symbollayer/widget_svgmarker.ui +++ b/src/ui/symbollayer/widget_svgmarker.ui @@ -6,7 +6,7 @@ 0 0 - 406 + 453 471 @@ -54,18 +54,7 @@ - - - - Millimeter - - - - - Map unit - - - + @@ -203,18 +192,7 @@ - - - - Millimeter - - - - - Map unit - - - + @@ -272,18 +250,7 @@ - - - - Millimeter - - - - - Map unit - - - + @@ -443,6 +410,12 @@ QPushButton
qgscolorbutton.h
+ + QgsUnitSelectionWidget + QWidget +
qgsunitselectionwidget.h
+ 1 +
spinOffsetX diff --git a/src/ui/symbollayer/widget_symbolslist.ui b/src/ui/symbollayer/widget_symbolslist.ui index 2b6dbc9f824d..9785488842bf 100644 --- a/src/ui/symbollayer/widget_symbolslist.ui +++ b/src/ui/symbollayer/widget_symbolslist.ui @@ -14,12 +14,21 @@ Form - - 4 + + 0 + + + 0 + + + 0 - + 0 + + 4 + @@ -29,23 +38,6 @@ Unit - - mSymbolUnitComboBox - - - - - - - - Millimeter - - - - - Map unit - - @@ -103,6 +95,9 @@ + + + @@ -195,7 +190,16 @@ - + + 0 + + + 0 + + + 0 + + 0 @@ -330,6 +334,12 @@ QPushButton
qgscolorbutton.h
+ + QgsUnitSelectionWidget + QWidget +
qgsunitselectionwidget.h
+ 1 +
diff --git a/src/ui/symbollayer/widget_vectorfield.ui b/src/ui/symbollayer/widget_vectorfield.ui index 4fbe73c658e0..4d6072935332 100644 --- a/src/ui/symbollayer/widget_vectorfield.ui +++ b/src/ui/symbollayer/widget_vectorfield.ui @@ -14,7 +14,16 @@ Form - + + 1 + + + 1 + + + 1 + + 1 @@ -87,26 +96,6 @@
- - - - - 3 - 0 - - - - - Millimeter - - - - - Map unit - - - - @@ -133,6 +122,9 @@ + + + @@ -230,6 +222,14 @@ + + + QgsUnitSelectionWidget + QWidget +
qgsunitselectionwidget.h
+ 1 +
+