std::unique_ptr<QgsMarkerSymbolLayer> backgroundToMarkerLayer( const QgsTextBackgroundSettings &settings ) { std::unique_ptr<QgsMarkerSymbolLayer> layer; switch ( settings.type() ) { case QgsTextBackgroundSettings::ShapeSVG: { QgsSvgMarkerSymbolLayer *svg = new QgsSvgMarkerSymbolLayer( settings.svgFile() ); svg->setStrokeWidth( settings.strokeWidth() ); svg->setStrokeWidthUnit( settings.strokeWidthUnit() ); layer.reset( svg ); break; } case QgsTextBackgroundSettings::ShapeCircle: case QgsTextBackgroundSettings::ShapeEllipse: case QgsTextBackgroundSettings::ShapeRectangle: case QgsTextBackgroundSettings::ShapeSquare: { QgsSimpleMarkerSymbolLayer *marker = new QgsSimpleMarkerSymbolLayer(); // default value QgsSimpleMarkerSymbolLayerBase::Shape shape = QgsSimpleMarkerSymbolLayerBase::Diamond; switch ( settings.type() ) { case QgsTextBackgroundSettings::ShapeCircle: case QgsTextBackgroundSettings::ShapeEllipse: shape = QgsSimpleMarkerSymbolLayerBase::Circle; break; case QgsTextBackgroundSettings::ShapeRectangle: case QgsTextBackgroundSettings::ShapeSquare: shape = QgsSimpleMarkerSymbolLayerBase::Square; break; case QgsTextBackgroundSettings::ShapeSVG: break; } marker->setShape( shape ); marker->setStrokeWidth( settings.strokeWidth() ); marker->setStrokeWidthUnit( settings.strokeWidthUnit() ); layer.reset( marker ); } } layer->setEnabled( true ); // a marker does not have a size x and y, just a size (and it should be at least one) QSizeF size = settings.size(); layer->setSize( std::max( 1., std::max( size.width(), size.height() ) ) ); layer->setSizeUnit( settings.sizeUnit() ); // fill and stroke QColor fillColor = settings.fillColor(); QColor strokeColor = settings.strokeColor(); if ( settings.opacity() < 1 ) { int alpha = std::round( settings.opacity() * 255 ); fillColor.setAlpha( alpha ); strokeColor.setAlpha( alpha ); } layer->setFillColor( fillColor ); layer->setStrokeColor( strokeColor ); // rotation if ( settings.rotationType() == QgsTextBackgroundSettings::RotationFixed ) { layer->setAngle( settings.rotation() ); } // offset layer->setOffset( settings.offset() ); layer->setOffsetUnit( settings.offsetUnit() ); return layer; }
QgsGrassEditRenderer::QgsGrassEditRenderer() : QgsFeatureRenderer( QStringLiteral( "grassEdit" ) ) { QHash<int, QColor> colors; //colors.insert( QgsGrassVectorMap::TopoUndefined, QColor( 125, 125, 125 ) ); colors.insert( QgsGrassVectorMap::TopoLine, QColor( Qt::black ) ); colors.insert( QgsGrassVectorMap::TopoBoundaryError, QColor( Qt::red ) ); colors.insert( QgsGrassVectorMap::TopoBoundaryErrorLeft, QColor( 255, 125, 0 ) ); colors.insert( QgsGrassVectorMap::TopoBoundaryErrorRight, QColor( 255, 125, 0 ) ); colors.insert( QgsGrassVectorMap::TopoBoundaryOk, QColor( Qt::green ) ); QHash<int, QString> labels; //labels.insert( QgsGrassVectorMap::TopoUndefined, "Unknown type" ); labels.insert( QgsGrassVectorMap::TopoLine, QStringLiteral( "Line" ) ); labels.insert( QgsGrassVectorMap::TopoBoundaryError, QStringLiteral( "Boundary (topological error on both sides)" ) ); labels.insert( QgsGrassVectorMap::TopoBoundaryErrorLeft, QStringLiteral( "Boundary (topological error on the left side)" ) ); labels.insert( QgsGrassVectorMap::TopoBoundaryErrorRight, QStringLiteral( "Boundary (topological error on the right side)" ) ); labels.insert( QgsGrassVectorMap::TopoBoundaryOk, QStringLiteral( "Boundary (correct)" ) ); QgsCategoryList categoryList; // first/last vertex marker to distinguish vertices from nodes QgsMarkerLineSymbolLayer *firstVertexMarkerLine = new QgsMarkerLineSymbolLayer( false ); QgsSimpleMarkerSymbolLayer *markerSymbolLayer = new QgsSimpleMarkerSymbolLayer( QgsSimpleMarkerSymbolLayerBase::Cross2, 2 ); markerSymbolLayer->setColor( QColor( 255, 0, 0 ) ); markerSymbolLayer->setStrokeColor( QColor( 255, 0, 0 ) ); markerSymbolLayer->setStrokeWidth( 0.5 ); QgsSymbolLayerList markerLayers; markerLayers << markerSymbolLayer; QgsMarkerSymbol *markerSymbol = new QgsMarkerSymbol( markerLayers ); firstVertexMarkerLine->setSubSymbol( markerSymbol ); firstVertexMarkerLine->setPlacement( QgsTemplatedLineSymbolLayerBase::FirstVertex ); QgsMarkerLineSymbolLayer *lastVertexMarkerLine = static_cast<QgsMarkerLineSymbolLayer *>( firstVertexMarkerLine->clone() ); lastVertexMarkerLine->setPlacement( QgsTemplatedLineSymbolLayerBase::LastVertex ); Q_FOREACH ( int value, colors.keys() ) { QgsSymbol *symbol = QgsSymbol::defaultSymbol( QgsWkbTypes::LineGeometry ); symbol->setColor( colors.value( value ) ); symbol->appendSymbolLayer( firstVertexMarkerLine->clone() ); symbol->appendSymbolLayer( lastVertexMarkerLine->clone() ); categoryList << QgsRendererCategory( QVariant( value ), symbol, labels.value( value ) ); } delete firstVertexMarkerLine; delete lastVertexMarkerLine; mLineRenderer = new QgsCategorizedSymbolRenderer( QStringLiteral( "topo_symbol" ), categoryList ); colors.clear(); labels.clear(); colors.insert( QgsGrassVectorMap::TopoPoint, QColor( 0, 255, 255 ) ); colors.insert( QgsGrassVectorMap::TopoCentroidIn, QColor( 0, 255, 0 ) ); colors.insert( QgsGrassVectorMap::TopoCentroidOut, QColor( 255, 0, 0 ) ); colors.insert( QgsGrassVectorMap::TopoCentroidDupl, QColor( 255, 0, 255 ) ); labels.insert( QgsGrassVectorMap::TopoPoint, QStringLiteral( "Point" ) ); labels.insert( QgsGrassVectorMap::TopoCentroidIn, QStringLiteral( "Centroid in area" ) ); labels.insert( QgsGrassVectorMap::TopoCentroidOut, QStringLiteral( "Centroid outside area" ) ); labels.insert( QgsGrassVectorMap::TopoCentroidDupl, QStringLiteral( "Duplicate centroid" ) ); categoryList.clear(); Q_FOREACH ( int value, colors.keys() ) { QgsSymbol *symbol = QgsSymbol::defaultSymbol( QgsWkbTypes::PointGeometry ); symbol->setColor( colors.value( value ) ); categoryList << QgsRendererCategory( QVariant( value ), symbol, labels.value( value ) ); } mMarkerRenderer = new QgsCategorizedSymbolRenderer( QStringLiteral( "topo_symbol" ), categoryList ); }