diff --git a/src/core/symbology-ng/qgsellipsesymbollayerv2.cpp b/src/core/symbology-ng/qgsellipsesymbollayerv2.cpp index 2f2c4182572..8f7c515dc59 100644 --- a/src/core/symbology-ng/qgsellipsesymbollayerv2.cpp +++ b/src/core/symbology-ng/qgsellipsesymbollayerv2.cpp @@ -1,6 +1,7 @@ #include "qgsellipsesymbollayerv2.h" #include "qgsfeature.h" #include "qgsrendercontext.h" +#include "qgsvectorlayer.h" #include #include @@ -14,13 +15,13 @@ QgsEllipseSymbolLayerV2::QgsEllipseSymbolLayerV2(): mSymbolName( "circle" ), mSy mBrush.setStyle( Qt::SolidPattern ); mAngle = 0; - mWidthField.first = -1; - mHeightField.first = -1; - mRotationField.first = -1; - mOutlineWidthField.first = -1; - mFillColorField.first = -1; - mOutlineColorField.first = -1; - mSymbolNameField.first = -1; + mWidthIndex = -1; + mHeightIndex = -1; + mRotationIndex = -1; + mOutlineWidthIndex = -1; + mFillColorIndex = -1; + mOutlineColorIndex = -1; + mSymbolNameIndex = -1; } QgsEllipseSymbolLayerV2::~QgsEllipseSymbolLayerV2() @@ -60,33 +61,33 @@ QgsSymbolLayerV2* QgsEllipseSymbolLayerV2::create( const QgsStringMap& propertie } //data defined properties - if ( properties.contains( "height_index" ) && properties.contains( "height_field" ) ) + if ( properties.contains( "height_field" ) ) { - layer->setHeightField( properties["height_index"].toInt(), properties["height_field"] ); + layer->setHeightField( properties["height_field"] ); } - if ( properties.contains( "width_index" ) && properties.contains( "width_field" ) ) + if ( properties.contains( "width_field" ) ) { - layer->setWidthField( properties["width_index"].toInt(), properties["width_field"] ); + layer->setWidthField( properties["width_field"] ); } - if ( properties.contains( "rotation_index" ) && properties.contains( "rotation_field" ) ) + if ( properties.contains( "rotation_field" ) ) { - layer->setRotationField( properties["rotation_index"].toInt(), properties["rotation_field"] ); + layer->setRotationField( properties["rotation_field"] ); } - if ( properties.contains( "outline_width_index" ) && properties.contains( "outline_width_field" ) ) + if ( properties.contains( "outline_width_field" ) ) { - layer->setOutlineWidthField( properties["outline_width_index"].toInt(), properties["outline_width_field"] ); + layer->setOutlineWidthField( properties["outline_width_field"] ); } - if ( properties.contains( "fill_color_index" ) && properties.contains( "fill_color_field" ) ) + if ( properties.contains( "fill_color_field" ) ) { - layer->setFillColorField( properties["fill_color_index"].toInt(), properties["fill_color_field"] ); + layer->setFillColorField( properties["fill_color_field"] ); } - if ( properties.contains( "outline_color_index" ) && properties.contains( "outline_color_field" ) ) + if ( properties.contains( "outline_color_field" ) ) { - layer->setOutlineColorField( properties["outline_color_index"].toInt(), properties["outline_color_field"] ); + layer->setOutlineColorField( properties["outline_color_field"] ); } - if ( properties.contains( "symbol_name_index" ) && properties.contains( "symbol_name_field" ) ) + if ( properties.contains( "symbol_name_field" ) ) { - layer->setSymbolNameField( properties["symbol_name_index"].toInt(), properties["symbol_name_field"] ); + layer->setSymbolNameField( properties["symbol_name_field"] ); } return layer; @@ -98,23 +99,23 @@ void QgsEllipseSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV2Rend if ( f ) { - if ( mOutlineWidthField.first != -1 ) + if ( mOutlineWidthIndex != -1 ) { - double width = context.outputLineWidth( f->attributeMap()[mOutlineWidthField.first].toDouble() ); + double width = context.outputLineWidth( f->attributeMap()[mOutlineWidthIndex].toDouble() ); mPen.setWidthF( width ); } - if ( mFillColorField.first != -1 ) + if ( mFillColorIndex != -1 ) { - mBrush.setColor( QColor( f->attributeMap()[mFillColorField.first].toString() ) ); + mBrush.setColor( QColor( f->attributeMap()[mFillColorIndex].toString() ) ); } - if ( mOutlineColorField.first != -1 ) + if ( mOutlineColorIndex != -1 ) { - mPen.setColor( QColor( f->attributeMap()[mOutlineColorField.first].toString() ) ); + mPen.setColor( QColor( f->attributeMap()[mOutlineColorIndex].toString() ) ); } - if ( mWidthField.first != -1 || mHeightField.first != -1 || mSymbolNameField.first != -1 ) + if ( mWidthIndex != -1 || mHeightIndex != -1 || mSymbolNameIndex != -1 ) { - QString symbolName = ( mSymbolNameField.first == -1 ) ? mSymbolName : f->attributeMap()[mSymbolNameField.first].toString(); + QString symbolName = ( mSymbolNameIndex == -1 ) ? mSymbolName : f->attributeMap()[mSymbolNameIndex].toString(); preparePath( symbolName, context, f ); } } @@ -127,9 +128,9 @@ void QgsEllipseSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV2Rend //priority for rotation: 1. data defined symbol level, 2. symbol layer rotation (mAngle) double rotation = 0.0; - if ( f && mRotationField.first != -1 ) + if ( f && mRotationIndex != -1 ) { - rotation = f->attributeMap()[mRotationField.first].toDouble(); + rotation = f->attributeMap()[mRotationIndex].toDouble(); } else if ( !doubleNear( mAngle, 0.0 ) ) { @@ -162,6 +163,19 @@ void QgsEllipseSymbolLayerV2::startRender( QgsSymbolV2RenderContext& context ) mPen.setColor( mOutlineColor ); mPen.setWidthF( context.outputLineWidth( mOutlineWidth ) ); mBrush.setColor( mFillColor ); + + //resolve data defined attribute indices + const QgsVectorLayer* vlayer = context.layer(); + if ( vlayer ) + { + mWidthIndex = vlayer->fieldNameIndex( mWidthField ); + mHeightIndex = vlayer->fieldNameIndex( mHeightField ); + mRotationIndex = vlayer->fieldNameIndex( mRotationField ); + mOutlineWidthIndex = vlayer->fieldNameIndex( mOutlineWidthField ); + mFillColorIndex = vlayer->fieldNameIndex( mFillColorField ); + mOutlineColorIndex = vlayer->fieldNameIndex( mOutlineColorField ); + mSymbolNameIndex = vlayer->fieldNameIndex( mSymbolNameField ); + } } void QgsEllipseSymbolLayerV2::stopRender( QgsSymbolV2RenderContext & ) @@ -178,32 +192,25 @@ QgsStringMap QgsEllipseSymbolLayerV2::properties() const QgsStringMap map; map["symbol_name"] = mSymbolName; map["symbol_width"] = QString::number( mSymbolWidth ); - map["width_index"] = QString::number( mWidthField.first ); - map["width_field"] = mWidthField.second; + map["width_field"] = mWidthField; map["symbol_height"] = QString::number( mSymbolHeight ); - map["height_index"] = QString::number( mHeightField.first ); - map["height_field"] = mHeightField.second; + map["height_field"] = mHeightField; map["angle"] = QString::number( mAngle ); - map["rotation_index"] = QString::number( mRotationField.first ); - map["rotation_field"] = mRotationField.second; + map["rotation_field"] = mRotationField; map["outline_width"] = QString::number( mOutlineWidth ); - map["outline_width_index"] = QString::number( mOutlineWidthField.first ); - map["outline_width_field"] = mOutlineWidthField.second; + map["outline_width_field"] = mOutlineWidthField; map["fill_color"] = QgsSymbolLayerV2Utils::encodeColor( mFillColor ); - map["fill_color_index"] = QString::number( mFillColorField.first ); - map["fill_color_field"] = mFillColorField.second; + map["fill_color_field"] = mFillColorField; map["outline_color"] = QgsSymbolLayerV2Utils::encodeColor( mOutlineColor ); - map["outline_color_index"] = QString::number( mOutlineColorField.first ); - map["outline_color_field"] = mOutlineColorField.second; - map["symbol_name_index"] = QString::number( mSymbolNameField.first ); - map["symbol_name_field"] = mSymbolNameField.second; + map["outline_color_field"] = mOutlineColorField; + map["symbol_name_field"] = mSymbolNameField; return map; } bool QgsEllipseSymbolLayerV2::hasDataDefinedProperty() const { - return ( mWidthField.first != -1 || mHeightField.first != -1 || mOutlineWidthField.first != -1 - || mFillColorField.first != -1 || mOutlineColorField.first != -1 ); + return ( mWidthIndex != -1 || mHeightIndex != -1 || mOutlineWidthIndex != -1 + || mFillColorIndex != -1 || mOutlineColorIndex != -1 ); } void QgsEllipseSymbolLayerV2::preparePath( const QString& symbolName, QgsSymbolV2RenderContext& context, const QgsFeature* f ) @@ -212,9 +219,9 @@ void QgsEllipseSymbolLayerV2::preparePath( const QString& symbolName, QgsSymbolV double width = 0; - if ( f && mWidthField.first != -1 ) //1. priority: data defined setting on symbol layer level + if ( f && mWidthIndex != -1 ) //1. priority: data defined setting on symbol layer level { - width = context.outputLineWidth( f->attributeMap()[mWidthField.first].toDouble() ); + width = context.outputLineWidth( f->attributeMap()[mWidthIndex].toDouble() ); } else if ( context.renderHints() & QgsSymbolV2::DataDefinedSizeScale ) //2. priority: is data defined size on symbol level { @@ -226,9 +233,9 @@ void QgsEllipseSymbolLayerV2::preparePath( const QString& symbolName, QgsSymbolV } double height = 0; - if ( f && mHeightField.first != -1 ) //1. priority: data defined setting on symbol layer level + if ( f && mHeightIndex != -1 ) //1. priority: data defined setting on symbol layer level { - height = context.outputLineWidth( f->attributeMap()[mHeightField.first].toDouble() ); + height = context.outputLineWidth( f->attributeMap()[mHeightIndex].toDouble() ); } else if ( context.renderHints() & QgsSymbolV2::DataDefinedSizeScale ) //2. priority: is data defined size on symbol level { @@ -266,75 +273,33 @@ void QgsEllipseSymbolLayerV2::preparePath( const QString& symbolName, QgsSymbolV QSet QgsEllipseSymbolLayerV2::usedAttributes() const { QSet dataDefinedAttributes; - if ( mWidthField.first != -1 ) + if ( !mWidthField.isEmpty() ) { - dataDefinedAttributes.insert( mWidthField.second ); + dataDefinedAttributes.insert( mWidthField ); } - if ( mHeightField.first != -1 ) + if ( !mHeightField.isEmpty() ) { - dataDefinedAttributes.insert( mHeightField.second ); + dataDefinedAttributes.insert( mHeightField ); } - if ( mRotationField.first != -1 ) + if ( !mRotationField.isEmpty() ) { - dataDefinedAttributes.insert( mRotationField.second ); + dataDefinedAttributes.insert( mRotationField ); } - if ( mOutlineWidthField.first != -1 ) + if ( !mOutlineWidthField.isEmpty() ) { - dataDefinedAttributes.insert( mOutlineWidthField.second ); + dataDefinedAttributes.insert( mOutlineWidthField ); } - if ( mFillColorField.first != -1 ) + if ( !mFillColorField.isEmpty() ) { - dataDefinedAttributes.insert( mFillColorField.second ); + dataDefinedAttributes.insert( mFillColorField ); } - if ( mOutlineColorField.first != -1 ) + if ( !mOutlineColorField.isEmpty() ) { - dataDefinedAttributes.insert( mOutlineColorField.second ); + dataDefinedAttributes.insert( mOutlineColorField ); } - if ( mSymbolNameField.first != -1 ) + if ( !mSymbolNameField.isEmpty() ) { - dataDefinedAttributes.insert( mSymbolNameField.second ); + dataDefinedAttributes.insert( mSymbolNameField ); } return dataDefinedAttributes; } - -void QgsEllipseSymbolLayerV2::setSymbolNameField( int index, const QString& field ) -{ - mSymbolNameField.first = index; - mSymbolNameField.second = field; -} - -void QgsEllipseSymbolLayerV2::setWidthField( int index, const QString& field ) -{ - mWidthField.first = index; - mWidthField.second = field; -} - -void QgsEllipseSymbolLayerV2::setHeightField( int index, const QString& field ) -{ - mHeightField.first = index; - mHeightField.second = field; -} - -void QgsEllipseSymbolLayerV2::setRotationField( int index, const QString& field ) -{ - mRotationField.first = index; - mRotationField.second = field; -} - -void QgsEllipseSymbolLayerV2::setOutlineWidthField( int index, const QString& field ) -{ - mOutlineWidthField.first = index; - mOutlineWidthField.second = field; -} - -void QgsEllipseSymbolLayerV2::setFillColorField( int index, const QString& field ) -{ - mFillColorField.first = index; - mFillColorField.second = field; -} - -void QgsEllipseSymbolLayerV2::setOutlineColorField( int index, const QString& field ) -{ - mOutlineColorField.first = index; - mOutlineColorField.second = field; -} diff --git a/src/core/symbology-ng/qgsellipsesymbollayerv2.h b/src/core/symbology-ng/qgsellipsesymbollayerv2.h index 388be83449b..c234e3bb67e 100644 --- a/src/core/symbology-ng/qgsellipsesymbollayerv2.h +++ b/src/core/symbology-ng/qgsellipsesymbollayerv2.h @@ -23,41 +23,41 @@ class CORE_EXPORT QgsEllipseSymbolLayerV2: public QgsMarkerSymbolLayerV2 void setSymbolName( const QString& name ) { mSymbolName = name; } QString symbolName() const { return mSymbolName; } - void setSymbolNameField( int index, const QString& field ); - const QPair& symbolNameField() const { return mSymbolNameField; } + void setSymbolNameField( const QString& field ) { mSymbolNameField = field; } + const QString& symbolNameField() const { return mSymbolNameField; } void setSymbolWidth( double w ) { mSymbolWidth = w; } double symbolWidth() const { return mSymbolWidth; } - void setWidthField( int index, const QString& field ); - const QPair& widthField() const { return mWidthField; } + void setWidthField( const QString& field ) { mWidthField = field; } + const QString& widthField() const { return mWidthField; } void setSymbolHeight( double h ) { mSymbolHeight = h; } double symbolHeight() const { return mSymbolHeight; } - void setHeightField( int index, const QString& field ); - const QPair& heightField() const { return mHeightField; } + void setHeightField( const QString& field ) { mHeightField = field; } + const QString& heightField() const { return mHeightField; } - void setRotationField( int index, const QString& field ); - const QPair& rotationField() const { return mRotationField; } + void setRotationField( const QString& field ) { mRotationField = field; } + const QString& rotationField() const { return mRotationField; } void setOutlineWidth( double w ) { mOutlineWidth = w; } double outlineWidth() const { return mOutlineWidth; } - void setOutlineWidthField( int index, const QString& field ); - const QPair& outlineWidthField() const { return mOutlineWidthField; } + void setOutlineWidthField( const QString& field ) { mOutlineWidthField = field; } + const QString& outlineWidthField() const { return mOutlineWidthField; } void setFillColor( const QColor& c ) { mFillColor = c;} QColor fillColor() const { return mFillColor; } - void setFillColorField( int index, const QString& field ); - const QPair& fillColorField() const { return mFillColorField; } + void setFillColorField( const QString& field ) { mFillColorField = field; } + const QString& fillColorField() const { return mFillColorField; } void setOutlineColor( const QColor& c ) { mOutlineColor = c; } QColor outlineColor() const { return mOutlineColor; } - void setOutlineColorField( int index, const QString& field ); - const QPair& outlineColorField() const { return mOutlineColorField; } + void setOutlineColorField( const QString& field ) { mOutlineColorField = field; } + const QString& outlineColorField() const { return mOutlineColorField; } QSet usedAttributes() const; @@ -69,6 +69,7 @@ class CORE_EXPORT QgsEllipseSymbolLayerV2: public QgsMarkerSymbolLayerV2 QColor mOutlineColor; double mOutlineWidth; +#if 0 /**Take width from attribute (-1 if fixed width)*/ QPair mWidthField; /**Take height from attribute (-1 if fixed height)*/ @@ -83,6 +84,26 @@ class CORE_EXPORT QgsEllipseSymbolLayerV2: public QgsMarkerSymbolLayerV2 QPair mOutlineColorField; /**Take shape name from attribute (-1 if fixed shape type)*/ QPair mSymbolNameField; +#endif //0 + + //data defined property fields + QString mWidthField; + QString mHeightField; + QString mRotationField; + QString mOutlineWidthField; + QString mFillColorField; + QString mOutlineColorField; + QString mSymbolNameField; + + //field indices for data defined properties + //resolved in startRender method + int mWidthIndex; + int mHeightIndex; + int mRotationIndex; + int mOutlineWidthIndex; + int mFillColorIndex; + int mOutlineColorIndex; + int mSymbolNameIndex; QPainterPath mPainterPath; diff --git a/src/gui/symbology-ng/qgsellipsesymbollayerv2widget.cpp b/src/gui/symbology-ng/qgsellipsesymbollayerv2widget.cpp index d93306fa2f9..24766a5ae0b 100644 --- a/src/gui/symbology-ng/qgsellipsesymbollayerv2widget.cpp +++ b/src/gui/symbology-ng/qgsellipsesymbollayerv2widget.cpp @@ -55,33 +55,62 @@ void QgsEllipseSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer ) blockComboSignals( true ); if ( mLayer ) { - if ( mLayer->widthField().first != -1 ) + + if ( mLayer->widthField().isEmpty() ) { - mDDSymbolWidthComboBox->setCurrentIndex( mDDSymbolWidthComboBox->findText( mLayer->widthField().second ) ); + mDDSymbolWidthComboBox->setCurrentIndex( 0 ); } - if ( mLayer->heightField().first != -1 ) + else { - mDDSymbolHeightComboBox->setCurrentIndex( mDDSymbolHeightComboBox->findText( mLayer->heightField().second ) ); + mDDSymbolWidthComboBox->setCurrentIndex( mDDSymbolWidthComboBox->findText( mLayer->widthField() ) ); } - if ( mLayer->rotationField().first != -1 ) + if ( mLayer->heightField().isEmpty() ) { - mDDRotationComboBox->setCurrentIndex( mDDRotationComboBox->findText( mLayer->rotationField().second ) ); + mDDSymbolHeightComboBox->setCurrentIndex( 0 ); } - if ( mLayer->outlineWidthField().first != -1 ) + else { - mDDOutlineWidthComboBox->setCurrentIndex( mDDOutlineWidthComboBox->findText( mLayer->outlineWidthField().second ) ); + mDDSymbolHeightComboBox->setCurrentIndex( mDDSymbolHeightComboBox->findText( mLayer->heightField() ) ); } - if ( mLayer->fillColorField().first != -1 ) + if ( mLayer->rotationField().isEmpty() ) { - mDDFillColorComboBox->setCurrentIndex( mDDFillColorComboBox->findText( mLayer->fillColorField().second ) ); + mDDRotationComboBox->setCurrentIndex( 0 ); } - if ( mLayer->outlineColorField().first != -1 ) + else { - mDDOutlineColorComboBox->setCurrentIndex( mDDOutlineColorComboBox->findText( mLayer->outlineColorField().second ) ); + mDDRotationComboBox->setCurrentIndex( mDDRotationComboBox->findText( mLayer->rotationField() ) ); } - if ( mLayer->symbolNameField().first != -1 ) + if ( mLayer->outlineWidthField().isEmpty() ) { - mDDShapeComboBox->setCurrentIndex( mDDShapeComboBox->findText( mLayer->symbolNameField().second ) ); + mDDOutlineWidthComboBox->setCurrentIndex( 0 ); + } + else + { + mDDOutlineWidthComboBox->setCurrentIndex( mDDOutlineWidthComboBox->findText( mLayer->outlineWidthField() ) ); + } + if ( mLayer->fillColorField().isEmpty() ) + { + mDDFillColorComboBox->setCurrentIndex( 0 ); + } + else + { + mDDFillColorComboBox->setCurrentIndex( mDDFillColorComboBox->findText( mLayer->fillColorField() ) ); + } + if ( mLayer->outlineColorField().isEmpty() ) + { + mDDOutlineColorComboBox->setCurrentIndex( 0 ); + } + else + { + mDDOutlineColorComboBox->setCurrentIndex( mDDOutlineColorComboBox->findText( mLayer->outlineColorField() ) ); + } + if ( mLayer->symbolNameField().isEmpty() ) + { + mDDShapeComboBox->setCurrentIndex( 0 ); + } + else + { + mDDShapeComboBox->setCurrentIndex( mDDShapeComboBox->findText( mLayer->symbolNameField() ) ); } } blockComboSignals( false ); @@ -208,7 +237,7 @@ void QgsEllipseSymbolLayerV2Widget::on_mDDSymbolWidthComboBox_currentIndexChange { if ( mLayer ) { - mLayer->setWidthField( mDDSymbolWidthComboBox->itemData( idx ).toInt(), mDDSymbolWidthComboBox->itemText( idx ) ); + mLayer->setWidthField( mDDSymbolWidthComboBox->itemText( idx ) ); emit changed(); } } @@ -217,7 +246,7 @@ void QgsEllipseSymbolLayerV2Widget::on_mDDSymbolHeightComboBox_currentIndexChang { if ( mLayer ) { - mLayer->setHeightField( mDDSymbolHeightComboBox->itemData( idx ).toInt(), mDDSymbolHeightComboBox->itemText( idx ) ); + mLayer->setHeightField( mDDSymbolHeightComboBox->itemText( idx ) ); emit changed(); } } @@ -226,7 +255,7 @@ void QgsEllipseSymbolLayerV2Widget::on_mDDRotationComboBox_currentIndexChanged( { if ( mLayer ) { - mLayer->setRotationField( mDDRotationComboBox->itemData( idx ).toInt(), mDDRotationComboBox->itemText( idx ) ); + mLayer->setRotationField( mDDRotationComboBox->itemText( idx ) ); emit changed(); } } @@ -235,7 +264,7 @@ void QgsEllipseSymbolLayerV2Widget::on_mDDOutlineWidthComboBox_currentIndexChang { if ( mLayer ) { - mLayer->setOutlineWidthField( mDDOutlineWidthComboBox->itemData( idx ).toInt(), mDDOutlineWidthComboBox->itemText( idx ) ); + mLayer->setOutlineWidthField( mDDOutlineWidthComboBox->itemText( idx ) ); emit changed(); } } @@ -244,7 +273,7 @@ void QgsEllipseSymbolLayerV2Widget::on_mDDFillColorComboBox_currentIndexChanged( { if ( mLayer ) { - mLayer->setFillColorField( mDDFillColorComboBox->itemData( idx ).toInt(), mDDFillColorComboBox->itemText( idx ) ); + mLayer->setFillColorField( mDDFillColorComboBox->itemText( idx ) ); emit changed(); } } @@ -253,7 +282,7 @@ void QgsEllipseSymbolLayerV2Widget::on_mDDOutlineColorComboBox_currentIndexChang { if ( mLayer ) { - mLayer->setOutlineColorField( mDDOutlineColorComboBox->itemData( idx ).toInt(), mDDOutlineColorComboBox->itemText( idx ) ); + mLayer->setOutlineColorField( mDDOutlineColorComboBox->itemText( idx ) ); emit changed(); } } @@ -262,7 +291,7 @@ void QgsEllipseSymbolLayerV2Widget::on_mDDShapeComboBox_currentIndexChanged( int { if ( mLayer ) { - mLayer->setSymbolNameField( mDDShapeComboBox->itemData( idx ).toInt(), mDDShapeComboBox->itemText( idx ) ); + mLayer->setSymbolNameField( mDDShapeComboBox->itemText( idx ) ); } }