void CompassFloatItem::paintContent( GeoPainter *painter, ViewportParams *viewport, const QString& renderPos, GeoSceneLayer * layer ) { Q_UNUSED( layer ) Q_UNUSED( renderPos ) painter->save(); painter->setRenderHint( QPainter::Antialiasing, true ); QRectF compassRect( contentRect() ); m_polarity = viewport->polarity(); QString dirstr = tr( "N" ); if ( m_polarity == -1 ) dirstr = tr( "S" ); if ( m_polarity == 0 ) dirstr = ""; int fontheight = QFontMetrics( font() ).ascent(); int fontwidth = QFontMetrics( font() ).boundingRect( dirstr ).width(); QPen outlinepen( background().color() ); outlinepen.setWidth( 2 ); QBrush outlinebrush( pen().color() ); QPainterPath outlinepath; const QPointF baseline( 0.5 * (qreal)( compassRect.width() - fontwidth ), (qreal)(fontheight) + 2.0 ); outlinepath.addText( baseline, font(), dirstr ); painter->setPen( outlinepen ); painter->setBrush( outlinebrush ); painter->drawPath( outlinepath ); painter->setPen( Qt::NoPen ); painter->drawPath( outlinepath ); painter->autoMapQuality(); int compassLength = static_cast<int>( compassRect.height() ) - 5 - fontheight; QSize compassSize( compassLength, compassLength ); // Rerender compass pixmap if the size has changed if ( m_compass.isNull() || m_compass.size() != compassSize ) { m_compass = QPixmap( compassSize ); m_compass.fill( Qt::transparent ); QPainter mapPainter( &m_compass ); mapPainter.setViewport( m_compass.rect() ); m_svgobj->render( &mapPainter ); mapPainter.setViewport( QRect( QPoint( 0, 0 ), viewport->size() ) ); } painter->drawPixmap( QPoint( static_cast<int>( compassRect.width() - compassLength ) / 2, fontheight + 5 ), m_compass ); painter->restore(); }
void CompassFloatItem::paintContent( QPainter *painter ) { painter->save(); QRectF compassRect( contentRect() ); const QString dirstr = (m_polarity == +1) ? tr("N") : (m_polarity == -1) ? tr("S") : /*else*/ QString(); int fontheight = QFontMetrics( font() ).ascent(); int fontwidth = QFontMetrics( font() ).boundingRect( dirstr ).width(); QPen outlinepen( background().color() ); outlinepen.setWidth( 2 ); QBrush outlinebrush( pen().color() ); QPainterPath outlinepath; const QPointF baseline( 0.5 * (qreal)( compassRect.width() - fontwidth ), (qreal)(fontheight) + 2.0 ); outlinepath.addText( baseline, font(), dirstr ); painter->setPen( outlinepen ); painter->setBrush( outlinebrush ); painter->drawPath( outlinepath ); painter->setPen( Qt::NoPen ); painter->drawPath( outlinepath ); int compassLength = static_cast<int>( compassRect.height() ) - 5 - fontheight; QSize compassSize( compassLength, compassLength ); // Rerender compass pixmap if the size has changed if ( m_compass.isNull() || m_compass.size() != compassSize ) { m_compass = QPixmap( compassSize ); m_compass.fill( Qt::transparent ); QPainter mapPainter( &m_compass ); mapPainter.setViewport( m_compass.rect() ); m_svgobj->render( &mapPainter ); } painter->drawPixmap( QPoint( static_cast<int>( compassRect.width() - compassLength ) / 2, fontheight + 5 ), m_compass ); painter->restore(); }