Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Separate units for line width, line offset, dash pattern
  • Loading branch information
mhugent committed Mar 7, 2013
1 parent 7bc758e commit 01734bd
Show file tree
Hide file tree
Showing 10 changed files with 312 additions and 192 deletions.
28 changes: 24 additions & 4 deletions src/core/symbology-ng/qgslinesymbollayerv2.cpp
Expand Up @@ -33,6 +33,23 @@ QgsSimpleLineSymbolLayerV2::QgsSimpleLineSymbolLayerV2( QColor color, double wid
mCustomDashVector << 5 << 2;
}

void QgsSimpleLineSymbolLayerV2::setOutputUnit( QgsSymbolV2::OutputUnit unit )
{
mWidthUnit = unit;
mOffsetUnit = unit;
mCustomDashPatternUnit = unit;
}

QgsSymbolV2::OutputUnit QgsSimpleLineSymbolLayerV2::outputUnit() const
{
QgsSymbolV2::OutputUnit unit = mWidthUnit;
if ( mOffsetUnit != unit || mCustomDashPatternUnit != unit )
{
return QgsSymbolV2::Mixed;
}
return unit;
}


QgsSymbolLayerV2* QgsSimpleLineSymbolLayerV2::create( const QgsStringMap& props )
{
Expand Down Expand Up @@ -78,7 +95,7 @@ void QgsSimpleLineSymbolLayerV2::startRender( QgsSymbolV2RenderContext& context
QColor penColor = mColor;
penColor.setAlphaF( mColor.alphaF() * context.alpha() );
mPen.setColor( penColor );
double scaledWidth = context.outputLineWidth( mWidth );
double scaledWidth = mWidth * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mWidthUnit );
mPen.setWidthF( scaledWidth );
if ( mUseCustomDashPattern && scaledWidth != 0 )
{
Expand All @@ -90,7 +107,7 @@ void QgsSimpleLineSymbolLayerV2::startRender( QgsSymbolV2RenderContext& context
for ( ; it != mCustomDashVector.constEnd(); ++it )
{
//the dash is specified in terms of pen widths, therefore the division
scaledVector << context.outputLineWidth(( *it ) / scaledWidth );
scaledVector << ( *it ) * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mCustomDashPatternUnit ) / scaledWidth;
}
mPen.setDashPattern( scaledVector );
}
Expand Down Expand Up @@ -123,7 +140,7 @@ void QgsSimpleLineSymbolLayerV2::renderPolyline( const QPolygonF& points, QgsSym

if ( context.renderHints() & QgsSymbolV2::DataDefinedSizeScale )
{
double scaledWidth = context.outputLineWidth( mWidth );
double scaledWidth = mWidth * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mWidthUnit );
mPen.setWidthF( scaledWidth );
mSelPen.setWidthF( scaledWidth );
}
Expand All @@ -135,7 +152,7 @@ void QgsSimpleLineSymbolLayerV2::renderPolyline( const QPolygonF& points, QgsSym
}
else
{
double scaledOffset = context.outputLineWidth( mOffset );
double scaledOffset = mOffset * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit );
p->drawPolyline( ::offsetLine( points, scaledOffset ) );
}
}
Expand All @@ -157,6 +174,9 @@ QgsStringMap QgsSimpleLineSymbolLayerV2::properties() const
QgsSymbolLayerV2* QgsSimpleLineSymbolLayerV2::clone() const
{
QgsSimpleLineSymbolLayerV2* l = new QgsSimpleLineSymbolLayerV2( mColor, mWidth, mPenStyle );
l->setWidthUnit( mWidthUnit );
l->setOffsetUnit( mOffsetUnit );
l->setCustomDashPatternUnit( mCustomDashPatternUnit );
l->setOffset( mOffset );
l->setPenJoinStyle( mPenJoinStyle );
l->setPenCapStyle( mPenCapStyle );
Expand Down
13 changes: 13 additions & 0 deletions src/core/symbology-ng/qgslinesymbollayerv2.h
Expand Up @@ -58,6 +58,9 @@ class CORE_EXPORT QgsSimpleLineSymbolLayerV2 : public QgsLineSymbolLayerV2

QString ogrFeatureStyle( double mmScaleFactor, double mapUnitScaleFactor ) const;

void setOutputUnit( QgsSymbolV2::OutputUnit unit );
QgsSymbolV2::OutputUnit outputUnit() const;

// new stuff

Qt::PenStyle penStyle() const { return mPenStyle; }
Expand All @@ -72,9 +75,15 @@ 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; }

bool useCustomDashPattern() const { return mUseCustomDashPattern; }
void setUseCustomDashPattern( bool b ) { mUseCustomDashPattern = b; }

QgsSymbolV2::OutputUnit customDashPatternUnit() const { return mCustomDashPatternUnit; }
void setCustomDashPatternUnit( QgsSymbolV2::OutputUnit unit ) { mCustomDashPatternUnit = unit; }

QVector<qreal> customDashVector() const { return mCustomDashVector; }
void setCustomDashVector( const QVector<qreal>& vector ) { mCustomDashVector = vector; }

Expand All @@ -85,8 +94,12 @@ class CORE_EXPORT QgsSimpleLineSymbolLayerV2 : public QgsLineSymbolLayerV2
QPen mPen;
QPen mSelPen;
double mOffset;
QgsSymbolV2::OutputUnit mOffsetUnit;

//use a custom dash dot pattern instead of the predefined ones
bool mUseCustomDashPattern;
QgsSymbolV2::OutputUnit mCustomDashPatternUnit;

/**Vector with an even number of entries for the */
QVector<qreal> mCustomDashVector;
};
Expand Down
2 changes: 1 addition & 1 deletion src/core/symbology-ng/qgssymbollayerv2.cpp
Expand Up @@ -31,7 +31,7 @@ QgsMarkerSymbolLayerV2::QgsMarkerSymbolLayerV2( bool locked )
}

QgsLineSymbolLayerV2::QgsLineSymbolLayerV2( bool locked )
: QgsSymbolLayerV2( QgsSymbolV2::Line, locked )
: QgsSymbolLayerV2( QgsSymbolV2::Line, locked ), mWidthUnit( QgsSymbolV2::MM )
{
}

Expand Down
7 changes: 7 additions & 0 deletions src/core/symbology-ng/qgssymbollayerv2.h
Expand Up @@ -69,6 +69,9 @@ class CORE_EXPORT QgsSymbolLayerV2
void setLocked( bool locked ) { mLocked = locked; }
bool isLocked() const { return mLocked; }

virtual void setOutputUnit( QgsSymbolV2::OutputUnit unit ) {} //= 0;
virtual QgsSymbolV2::OutputUnit outputUnit() const { return QgsSymbolV2::Mixed; } //= 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; }
Expand Down Expand Up @@ -138,12 +141,16 @@ class CORE_EXPORT QgsLineSymbolLayerV2 : public QgsSymbolLayerV2
virtual void setWidth( double width ) { mWidth = width; }
virtual double width() const { return mWidth; }

void setWidthUnit( QgsSymbolV2::OutputUnit unit ) { mWidthUnit = unit; }
QgsSymbolV2::OutputUnit widthUnit() const { return mWidthUnit; }

void drawPreviewIcon( QgsSymbolV2RenderContext& context, QSize size );

protected:
QgsLineSymbolLayerV2( bool locked = false );

double mWidth;
QgsSymbolV2::OutputUnit mWidthUnit;
};

class CORE_EXPORT QgsFillSymbolLayerV2 : public QgsSymbolLayerV2
Expand Down
51 changes: 41 additions & 10 deletions src/core/symbology-ng/qgssymbolv2.cpp
Expand Up @@ -35,7 +35,7 @@
#include <cmath>

QgsSymbolV2::QgsSymbolV2( SymbolType type, QgsSymbolLayerV2List layers )
: mType( type ), mLayers( layers ), mOutputUnit( MM ), mAlpha( 1.0 ), mRenderHints( 0 )
: mType( type ), mLayers( layers ), mAlpha( 1.0 ), mRenderHints( 0 )
{

// check they're all correct symbol layers
Expand All @@ -61,6 +61,38 @@ QgsSymbolV2::~QgsSymbolV2()
delete *it;
}

QgsSymbolV2::OutputUnit QgsSymbolV2::outputUnit() const
{
QgsSymbolV2::OutputUnit unit;

QgsSymbolLayerV2List::const_iterator it = mLayers.constBegin();
for ( ; it != mLayers.constEnd(); ++it )
{
if ( it == mLayers.constBegin() )
{
unit = ( *it )->outputUnit();
}
else
{
if (( *it )->outputUnit() != unit )
{
return QgsSymbolV2::Mixed;
}
}
}

return unit;
}

void QgsSymbolV2::setOutputUnit( QgsSymbolV2::OutputUnit u )
{
QgsSymbolLayerV2List::iterator it = mLayers.begin();
for ( ; it != mLayers.end(); ++it )
{
( *it )->setOutputUnit( u );
}
}

QgsSymbolV2* QgsSymbolV2::defaultSymbol( QGis::GeometryType geomType )
{
QgsSymbolV2* s = 0;
Expand Down Expand Up @@ -184,15 +216,15 @@ bool QgsSymbolV2::changeSymbolLayer( int index, QgsSymbolLayerV2* layer )

void QgsSymbolV2::startRender( QgsRenderContext& context, const QgsVectorLayer* layer )
{
QgsSymbolV2RenderContext symbolContext( context, mOutputUnit, mAlpha, false, mRenderHints );
QgsSymbolV2RenderContext symbolContext( context, outputUnit(), mAlpha, false, mRenderHints );
symbolContext.setLayer( layer );
for ( QgsSymbolLayerV2List::iterator it = mLayers.begin(); it != mLayers.end(); ++it )
( *it )->startRender( symbolContext );
}

void QgsSymbolV2::stopRender( QgsRenderContext& context )
{
QgsSymbolV2RenderContext symbolContext( context, mOutputUnit, mAlpha, false, mRenderHints );
QgsSymbolV2RenderContext symbolContext( context, outputUnit(), mAlpha, false, mRenderHints );
for ( QgsSymbolLayerV2List::iterator it = mLayers.begin(); it != mLayers.end(); ++it )
( *it )->stopRender( symbolContext );
}
Expand Down Expand Up @@ -220,7 +252,7 @@ QColor QgsSymbolV2::color()
void QgsSymbolV2::drawPreviewIcon( QPainter* painter, QSize size )
{
QgsRenderContext context = QgsSymbolLayerV2Utils::createRenderContext( painter );
QgsSymbolV2RenderContext symbolContext( context, mOutputUnit, mAlpha, false, mRenderHints );
QgsSymbolV2RenderContext symbolContext( context, outputUnit(), mAlpha, false, mRenderHints );
for ( QgsSymbolLayerV2List::iterator it = mLayers.begin(); it != mLayers.end(); ++it )
{
if ( mType == Fill && ( *it )->type() == Line )
Expand Down Expand Up @@ -504,7 +536,7 @@ QgsSymbolV2::ScaleMethod QgsMarkerSymbolV2::scaleMethod()

void QgsMarkerSymbolV2::renderPoint( const QPointF& point, const QgsFeature* f, QgsRenderContext& context, int layer, bool selected )
{
QgsSymbolV2RenderContext symbolContext( context, mOutputUnit, mAlpha, selected, mRenderHints, f );
QgsSymbolV2RenderContext symbolContext( context, outputUnit(), mAlpha, selected, mRenderHints, f );
if ( layer != -1 )
{
if ( layer >= 0 && layer < mLayers.count() )
Expand All @@ -522,7 +554,7 @@ void QgsMarkerSymbolV2::renderPoint( const QPointF& point, const QgsFeature* f,
QgsSymbolV2* QgsMarkerSymbolV2::clone() const
{
QgsSymbolV2* cloneSymbol = new QgsMarkerSymbolV2( cloneLayers() );
cloneSymbol->setOutputUnit( mOutputUnit );
cloneSymbol->setOutputUnit( outputUnit() );
cloneSymbol->setAlpha( mAlpha );
return cloneSymbol;
}
Expand Down Expand Up @@ -573,7 +605,7 @@ double QgsLineSymbolV2::width()

void QgsLineSymbolV2::renderPolyline( const QPolygonF& points, const QgsFeature* f, QgsRenderContext& context, int layer, bool selected )
{
QgsSymbolV2RenderContext symbolContext( context, mOutputUnit, mAlpha, selected, mRenderHints, f );
QgsSymbolV2RenderContext symbolContext( context, outputUnit(), mAlpha, selected, mRenderHints, f );
if ( layer != -1 )
{
if ( layer >= 0 && layer < mLayers.count() )
Expand All @@ -592,7 +624,6 @@ void QgsLineSymbolV2::renderPolyline( const QPolygonF& points, const QgsFeature*
QgsSymbolV2* QgsLineSymbolV2::clone() const
{
QgsSymbolV2* cloneSymbol = new QgsLineSymbolV2( cloneLayers() );
cloneSymbol->setOutputUnit( mOutputUnit );
cloneSymbol->setAlpha( mAlpha );
return cloneSymbol;
}
Expand All @@ -609,7 +640,7 @@ QgsFillSymbolV2::QgsFillSymbolV2( QgsSymbolLayerV2List layers )

void QgsFillSymbolV2::renderPolygon( const QPolygonF& points, QList<QPolygonF>* rings, const QgsFeature* f, QgsRenderContext& context, int layer, bool selected )
{
QgsSymbolV2RenderContext symbolContext( context, mOutputUnit, mAlpha, selected, mRenderHints, f );
QgsSymbolV2RenderContext symbolContext( context, outputUnit(), mAlpha, selected, mRenderHints, f );
if ( layer != -1 )
{
if ( layer >= 0 && layer < mLayers.count() )
Expand Down Expand Up @@ -643,7 +674,7 @@ void QgsFillSymbolV2::renderPolygon( const QPolygonF& points, QList<QPolygonF>*
QgsSymbolV2* QgsFillSymbolV2::clone() const
{
QgsSymbolV2* cloneSymbol = new QgsFillSymbolV2( cloneLayers() );
cloneSymbol->setOutputUnit( mOutputUnit );
cloneSymbol->setOutputUnit( outputUnit() );
cloneSymbol->setAlpha( mAlpha );
return cloneSymbol;
}
Expand Down
11 changes: 5 additions & 6 deletions src/core/symbology-ng/qgssymbolv2.h
Expand Up @@ -44,8 +44,9 @@ class CORE_EXPORT QgsSymbolV2

enum OutputUnit
{
MM,
MapUnit
MM = 0,
MapUnit,
Mixed //mixed units in symbol layers
};

enum SymbolType
Expand Down Expand Up @@ -112,8 +113,8 @@ class CORE_EXPORT QgsSymbolV2

void toSld( QDomDocument &doc, QDomElement &element, QgsStringMap props ) const;

OutputUnit outputUnit() const { return mOutputUnit; }
void setOutputUnit( OutputUnit u ) { mOutputUnit = u; }
QgsSymbolV2::OutputUnit outputUnit() const;
void setOutputUnit( QgsSymbolV2::OutputUnit u );

//! Get alpha transparency 1 for opaque, 0 for invisible
qreal alpha() const { return mAlpha; }
Expand All @@ -140,8 +141,6 @@ class CORE_EXPORT QgsSymbolV2
SymbolType mType;
QgsSymbolLayerV2List mLayers;

OutputUnit mOutputUnit;

/**Symbol opacity (in the range 0 - 1)*/
qreal mAlpha;

Expand Down
26 changes: 25 additions & 1 deletion src/gui/symbology-ng/qgssymbollayerv2widget.cpp
Expand Up @@ -63,12 +63,20 @@ QgsSimpleLineSymbolLayerV2Widget::QgsSimpleLineSymbolLayerV2Widget( const QgsVec

void QgsSimpleLineSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer )
{
if ( layer->layerType() != "SimpleLine" )
if ( !layer || layer->layerType() != "SimpleLine" )
return;

// layer type is correct, we can do the cast
mLayer = static_cast<QgsSimpleLineSymbolLayerV2*>( layer );

// set units
mPenWidthUnitComboBox->blockSignals( true );
mPenWidthUnitComboBox->setCurrentIndex( mLayer->widthUnit() );
mPenWidthUnitComboBox->blockSignals( false );
mOffsetUnitComboBox->blockSignals( true );
mOffsetUnitComboBox->setCurrentIndex( mLayer->offsetUnit() );
mOffsetUnitComboBox->blockSignals( false );

// set values
spinWidth->setValue( mLayer->width() );
btnChangeColor->setColor( mLayer->color() );
Expand Down Expand Up @@ -161,6 +169,22 @@ void QgsSimpleLineSymbolLayerV2Widget::on_mChangePatternButton_clicked()
}
}

void QgsSimpleLineSymbolLayerV2Widget::on_mPenWidthUnitComboBox_currentIndexChanged( int index )
{
if ( mLayer )
{
mLayer->setWidthUnit(( QgsSymbolV2::OutputUnit )index );
}
}

void QgsSimpleLineSymbolLayerV2Widget::on_mOffsetUnitComboBox_currentIndexChanged( int index )
{
if ( mLayer )
{
mLayer->setOffsetUnit(( QgsSymbolV2::OutputUnit )index );
}
}

void QgsSimpleLineSymbolLayerV2Widget::updatePatternIcon()
{
if ( !mLayer )
Expand Down
2 changes: 2 additions & 0 deletions src/gui/symbology-ng/qgssymbollayerv2widget.h
Expand Up @@ -67,6 +67,8 @@ 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 );


protected:
Expand Down

0 comments on commit 01734bd

Please sign in to comment.