bool QgsComposerTable::calculateMaxColumnWidths( QMap<int, double>& maxWidthMap, const QList<QgsAttributeMap>& attributeMaps ) const { maxWidthMap.clear(); QList<QgsComposerTableColumn*>::const_iterator columnIt = mColumns.constBegin(); int col = 0; for ( ; columnIt != mColumns.constEnd(); ++columnIt ) { maxWidthMap.insert( col, textWidthMillimeters( mHeaderFont, ( *columnIt )->heading() ) ); col++; } //go through all the attributes and adapt the max width values QList<QgsAttributeMap>::const_iterator attIt = attributeMaps.constBegin(); double currentAttributeTextWidth; for ( ; attIt != attributeMaps.constEnd(); ++attIt ) { QgsAttributeMap::const_iterator attIt2 = attIt->constBegin(); for ( ; attIt2 != attIt->constEnd(); ++attIt2 ) { currentAttributeTextWidth = textWidthMillimeters( mContentFont, attIt2.value().toString() ); if ( currentAttributeTextWidth > maxWidthMap[ attIt2.key()] ) { maxWidthMap[ attIt2.key()] = currentAttributeTextWidth; } } } return true; }
void QgsComposerScaleBar::paint( QPainter* painter, const QStyleOptionGraphicsItem* itemStyle, QWidget* pWidget ) { Q_UNUSED( itemStyle ); Q_UNUSED( pWidget ); if ( !mStyle || !painter ) { return; } drawBackground( painter ); painter->setPen( QPen( QColor( 0, 0, 0 ) ) ); //draw all text black //x-offset is half of first label width because labels are drawn centered QString firstLabel = firstLabelString(); double firstLabelWidth = textWidthMillimeters( mFont, firstLabel ); mStyle->draw( painter, firstLabelWidth / 2 ); //draw frame and selection boxes if necessary drawFrame( painter ); if ( isSelected() ) { drawSelectionBoxes( painter ); } }
void QgsComposerLabel::adjustSizeToText() { double textWidth = textWidthMillimeters( mFont, displayText() ); double fontAscent = fontAscentMillimeters( mFont ); setSceneRect( QRectF( transform().dx(), transform().dy(), textWidth + 2 * mMargin + 2 * pen().widthF() + 1, \ fontAscent + 2 * mMargin + 2 * pen().widthF() + 1 ) ); }
void QgsComposerLegend::drawLayerItem( QPainter* p, QgsComposerLayerItem* layerItem, double& currentYCoord, double& maxXCoord ) { if ( !layerItem ) { return; } int opacity = 255; QgsMapLayer* currentLayer = QgsMapLayerRegistry::instance()->mapLayer( layerItem->layerID() ); if ( currentLayer ) { opacity = currentLayer->getTransparency(); } //Let the user omit the layer title item by having an empty layer title string if ( !layerItem->text().isEmpty() ) { currentYCoord += mLayerSpace; currentYCoord += fontAscentMillimeters( mLayerFont ); //draw layer Item if ( p ) { p->setPen( QColor( 0, 0, 0 ) ); drawText( p, mBoxSpace, currentYCoord, layerItem->text(), mLayerFont ); } maxXCoord = qMax( maxXCoord, 2 * mBoxSpace + textWidthMillimeters( mLayerFont, layerItem->text() ) ); } else //layer title omited { //symbol space will be added before the item later currentYCoord += ( mLayerSpace - mSymbolSpace ); } //and child items drawLayerChildItems( p, layerItem, currentYCoord, maxXCoord, opacity ); }
void QgsComposerLegend::drawGroupItem( QPainter* p, QgsComposerGroupItem* groupItem, double& currentYCoord, double& maxXCoord ) { if ( !p || !groupItem ) { return; } currentYCoord += mLayerSpace; currentYCoord += fontAscentMillimeters( mGroupFont ); p->setPen( QColor( 0, 0, 0 ) ); drawText( p, mBoxSpace, currentYCoord, groupItem->text(), mGroupFont ); //maximum x-coordinate of current item double currentMaxXCoord = 2 * mBoxSpace + textWidthMillimeters( mGroupFont, groupItem->text() ); maxXCoord = qMax( currentMaxXCoord, maxXCoord ); //children can be other group items or layer items int numChildItems = groupItem->rowCount(); QStandardItem* currentChildItem = 0; for ( int i = 0; i < numChildItems; ++i ) { currentChildItem = groupItem->child( i ); QgsComposerLegendItem* currentLegendItem = dynamic_cast<QgsComposerLegendItem*>( currentChildItem ); QgsComposerLegendItem::ItemType type = currentLegendItem->itemType(); if ( type == QgsComposerLegendItem::GroupItem ) { drawGroupItem( p, dynamic_cast<QgsComposerGroupItem*>( currentLegendItem ), currentYCoord, currentMaxXCoord ); maxXCoord = qMax( currentMaxXCoord, maxXCoord ); } else if ( type == QgsComposerLegendItem::LayerItem ) { drawLayerItem( p, dynamic_cast<QgsComposerLayerItem*>( currentLegendItem ), currentYCoord, currentMaxXCoord ); maxXCoord = qMax( currentMaxXCoord, maxXCoord ); } } }
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 ); }
QSizeF QgsComposerLegend::paintAndDetermineSize( QPainter* painter ) { QSizeF size; double maxXCoord = 0; //go through model... QStandardItem* rootItem = mLegendModel.invisibleRootItem(); if ( !rootItem ) { return size; } if ( painter ) { painter->save(); drawBackground( painter ); painter->setPen( QPen( QColor( 0, 0, 0 ) ) ); } int numLayerItems = rootItem->rowCount(); QStandardItem* currentLayerItem = 0; double currentYCoordinate = mBoxSpace; //font metrics //draw title currentYCoordinate += fontAscentMillimeters( mTitleFont ); if ( painter ) { painter->setPen( QColor( 0, 0, 0 ) ); drawText( painter, mBoxSpace, currentYCoordinate, mTitle, mTitleFont ); } maxXCoord = 2 * mBoxSpace + textWidthMillimeters( mTitleFont, mTitle ); double currentItemMaxX = 0; //maximum x-coordinate for current item for ( int i = 0; i < numLayerItems; ++i ) { currentLayerItem = rootItem->child( i ); QgsComposerLegendItem* currentLegendItem = dynamic_cast<QgsComposerLegendItem*>( currentLayerItem ); if ( currentLegendItem ) { QgsComposerLegendItem::ItemType type = currentLegendItem->itemType(); if ( type == QgsComposerLegendItem::GroupItem ) { drawGroupItem( painter, dynamic_cast<QgsComposerGroupItem*>( currentLegendItem ), currentYCoordinate, currentItemMaxX ); maxXCoord = qMax( maxXCoord, currentItemMaxX ); } else if ( type == QgsComposerLegendItem::LayerItem ) { drawLayerItem( painter, dynamic_cast<QgsComposerLayerItem*>( currentLegendItem ), currentYCoordinate, currentItemMaxX ); maxXCoord = qMax( maxXCoord, currentItemMaxX ); } } } currentYCoordinate += mBoxSpace; size.setHeight( currentYCoordinate ); size.setWidth( maxXCoord ); //adjust box if width or height is to small if ( painter && currentYCoordinate > rect().height() ) { setSceneRect( QRectF( transform().dx(), transform().dy(), rect().width(), currentYCoordinate ) ); } if ( painter && maxXCoord > rect().width() ) { setSceneRect( QRectF( transform().dx(), transform().dy(), maxXCoord, rect().height() ) ); } if ( painter ) { painter->restore(); //draw frame and selection boxes if necessary drawFrame( painter ); if ( isSelected() ) { drawSelectionBoxes( painter ); } } return size; }
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() ) ); } } }