void QgsDecorationGrid::drawCoordinateAnnotation( QPainter* p, QPointF pos, const QString& annotationString ) { Border frameBorder = borderForLineCoord( pos, p ); double textWidth = textWidthMillimeters( mGridAnnotationFont, annotationString ); //relevant for annotations is the height of digits double textHeight = fontHeightCharacterMM( mGridAnnotationFont, QChar( '0' ) ); double xpos = pos.x(); double ypos = pos.y(); int rotation = 0; if ( frameBorder == Left ) { if ( mGridAnnotationPosition == InsideMapFrame ) { if ( mGridAnnotationDirection == Vertical || mGridAnnotationDirection == BoundaryDirection ) { xpos += textHeight + mAnnotationFrameDistance; ypos += textWidth / 2.0; rotation = 270; } else { xpos += mAnnotationFrameDistance; ypos += textHeight / 2.0; } } else //Outside map frame { if ( mGridAnnotationDirection == Vertical || mGridAnnotationDirection == BoundaryDirection ) { xpos -= mAnnotationFrameDistance; ypos += textWidth / 2.0; rotation = 270; } else { xpos -= textWidth + mAnnotationFrameDistance; ypos += textHeight / 2.0; } } } else if ( frameBorder == Right ) { if ( mGridAnnotationPosition == InsideMapFrame ) { if ( mGridAnnotationDirection == Vertical || mGridAnnotationDirection == BoundaryDirection ) { xpos -= mAnnotationFrameDistance; ypos += textWidth / 2.0; rotation = 270; } else //Horizontal { xpos -= textWidth + mAnnotationFrameDistance; ypos += textHeight / 2.0; } } else //OutsideMapFrame { if ( mGridAnnotationDirection == Vertical || mGridAnnotationDirection == BoundaryDirection ) { xpos += textHeight + mAnnotationFrameDistance; ypos += textWidth / 2.0; rotation = 270; } else //Horizontal { xpos += mAnnotationFrameDistance; ypos += textHeight / 2.0; } } } else if ( frameBorder == Bottom ) { if ( mGridAnnotationPosition == InsideMapFrame ) { if ( mGridAnnotationDirection == Horizontal || mGridAnnotationDirection == BoundaryDirection ) { ypos -= mAnnotationFrameDistance; xpos -= textWidth / 2.0; } else //Vertical { xpos += textHeight / 2.0; ypos -= mAnnotationFrameDistance; rotation = 270; } } else //OutsideMapFrame { if ( mGridAnnotationDirection == Horizontal || mGridAnnotationDirection == BoundaryDirection ) { ypos += mAnnotationFrameDistance + textHeight; xpos -= textWidth / 2.0; } else //Vertical { xpos += textHeight / 2.0; ypos += textWidth + mAnnotationFrameDistance; rotation = 270; } } } else //Top { if ( mGridAnnotationPosition == InsideMapFrame ) { if ( mGridAnnotationDirection == Horizontal || mGridAnnotationDirection == BoundaryDirection ) { xpos -= textWidth / 2.0; ypos += textHeight + mAnnotationFrameDistance; } else //Vertical { xpos += textHeight / 2.0; ypos += textWidth + mAnnotationFrameDistance; rotation = 270; } } else //OutsideMapFrame { if ( mGridAnnotationDirection == Horizontal || mGridAnnotationDirection == BoundaryDirection ) { xpos -= textWidth / 2.0; ypos -= mAnnotationFrameDistance; } else //Vertical { xpos += textHeight / 2.0; ypos -= mAnnotationFrameDistance; rotation = 270; } } } drawAnnotation( p, QPointF( xpos, ypos ), rotation, annotationString ); }
void QgsComposerLegend::drawLayerChildItems( QPainter* p, QStandardItem* layerItem, double& currentYCoord, double& maxXCoord, int layerOpacity ) { if ( !layerItem ) { return; } //Draw all symbols first and the texts after (to find out the x coordinate to have the text aligned) QList<double> childYCoords; QList<double> realItemHeights; double textHeight = fontHeightCharacterMM( mItemFont, QChar( '0' ) ); double itemHeight = qMax( mSymbolHeight, textHeight ); double textAlignCoord = 0; //alignment for legend text QStandardItem* currentItem; int numChildren = layerItem->rowCount(); for ( int i = 0; i < numChildren; ++i ) { //real symbol height. Can be different from standard height in case of point symbols double realSymbolHeight; double realItemHeight = itemHeight; //will be adjusted if realSymbolHeight turns out to be larger currentYCoord += mSymbolSpace; double currentXCoord = mBoxSpace; currentItem = layerItem->child( i, 0 ); if ( !currentItem ) { continue; } QgsSymbol* symbol = 0; QgsComposerSymbolItem* symbolItem = dynamic_cast<QgsComposerSymbolItem*>( currentItem ); if ( symbolItem ) { symbol = symbolItem->symbol(); } QgsSymbolV2* symbolNg = 0; QgsComposerSymbolV2Item* symbolV2Item = dynamic_cast<QgsComposerSymbolV2Item*>( currentItem ); if ( symbolV2Item ) { symbolNg = symbolV2Item->symbolV2(); } QgsComposerRasterSymbolItem* rasterItem = dynamic_cast<QgsComposerRasterSymbolItem*>( currentItem ); if ( symbol ) //item with symbol? { //draw symbol drawSymbol( p, symbol, currentYCoord + ( itemHeight - mSymbolHeight ) / 2, currentXCoord, realSymbolHeight, layerOpacity ); realItemHeight = qMax( realSymbolHeight, itemHeight ); currentXCoord += mIconLabelSpace; } else if ( symbolNg ) //item with symbol NG? { drawSymbolV2( p, symbolNg, currentYCoord + ( itemHeight - mSymbolHeight ) / 2, currentXCoord, realSymbolHeight, layerOpacity ); realItemHeight = qMax( realSymbolHeight, itemHeight ); currentXCoord += mIconLabelSpace; } else if ( rasterItem ) { if ( p ) { p->setBrush( rasterItem->color() ); p->drawRect( QRectF( currentXCoord, currentYCoord + ( itemHeight - mSymbolHeight ) / 2, mSymbolWidth, mSymbolHeight ) ); } currentXCoord += mSymbolWidth; currentXCoord += mIconLabelSpace; } else //item with icon? { QIcon symbolIcon = currentItem->icon(); if ( !symbolIcon.isNull() && p ) { symbolIcon.paint( p, currentXCoord, currentYCoord + ( itemHeight - mSymbolHeight ) / 2, mSymbolWidth, mSymbolHeight ); currentXCoord += mSymbolWidth; currentXCoord += mIconLabelSpace; } } childYCoords.push_back( currentYCoord ); realItemHeights.push_back( realItemHeight ); currentYCoord += realItemHeight; textAlignCoord = qMax( currentXCoord, textAlignCoord ); } maxXCoord = qMax( maxXCoord, textAlignCoord ); for ( int i = 0; i < numChildren; ++i ) { if ( p ) { p->setPen( QColor( 0, 0, 0 ) ); drawText( p, textAlignCoord, childYCoords.at( i ) + textHeight + ( realItemHeights.at( i ) - textHeight ) / 2, layerItem->child( i, 0 )->text(), mItemFont ); maxXCoord = qMax( maxXCoord, textAlignCoord + mBoxSpace + textWidthMillimeters( mItemFont, layerItem->child( i, 0 )->text() ) ); } } }