From deba02f178d907ba777ff6030ec7247ba40909ca Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Wed, 22 Apr 2015 18:18:16 +1000 Subject: [PATCH] Improved placement for diagrams for line layers Previously the diagrams would often be displaced from the line (depending on the line orientation). --- src/core/qgspallabeling.cpp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/core/qgspallabeling.cpp b/src/core/qgspallabeling.cpp index e416efd469a..7fbd35833d7 100644 --- a/src/core/qgspallabeling.cpp +++ b/src/core/qgspallabeling.cpp @@ -3608,7 +3608,7 @@ void QgsPalLabeling::registerDiagramFeature( const QString& layerID, QgsFeature& try { - if ( !layerIt.value().palLayer->registerFeature( lbl->strId(), lbl, diagramWidth, diagramHeight, "", ddPosX, ddPosY, ddPos, 0.0, false, 0, 0, 0, 0, alwaysShow ) ) + if ( !layerIt.value().palLayer->registerFeature( lbl->strId(), lbl, diagramWidth, diagramHeight, "", ddPosX, ddPosY, ddPos, 0.0, true, 0, 0, 0, 0, alwaysShow ) ) { return; } @@ -4112,8 +4112,23 @@ void QgsPalLabeling::drawLabeling( QgsRenderContext& context ) { feature.setFields( &dit.value().fields ); palGeometry->feature( feature ); - QgsPoint outPt = xform.transform(( *it )->getX(), ( *it )->getY() ); - dit.value().renderer->renderDiagram( feature, context, outPt.toQPointF() ); + + //calculate top-left point for diagram + //first, calculate the centroid of the label (accounts for PAL creating + //rotated labels when we do not want to draw the diagrams rotated) + double centerX = 0; + double centerY = 0; + for ( int i = 0; i < 4; ++i ) + { + centerX += ( *it )->getX( i ); + centerY += ( *it )->getY( i ); + } + QgsPoint outPt( centerX / 4.0, centerY / 4.0 ); + //then, calculate the top left point for the diagram with this center position + QgsPoint centerPt = xform.transform( outPt.x() - ( *it )->getWidth() / 2, + outPt.y() - ( *it )->getHeight() / 2 ); + + dit.value().renderer->renderDiagram( feature, context, centerPt.toQPointF() ); } }