QStandardItem* QgsLegendModel::itemFromSymbol( QgsSymbol* s, int opacity, const QString& layerID ) { QgsComposerSymbolItem* currentSymbolItem = 0; //label QString itemText; QString label; QString lowerValue = s->lowerValue(); QString upperValue = s->upperValue(); label = s->label(); //Take the label as item text if it is there if ( !label.isEmpty() ) { itemText = label; } //take single value else if ( lowerValue == upperValue || upperValue.isEmpty() ) { itemText = lowerValue; } else //or value range { itemText = lowerValue + " - " + upperValue; } //icon item QImage symbolImage; switch ( s->type() ) { case QGis::Point: symbolImage = s->getPointSymbolAsImage(); break; case QGis::Line: symbolImage = s->getLineSymbolAsImage(); break; case QGis::Polygon: symbolImage = s->getPolygonSymbolAsImage(); break; default: return 0; } if ( opacity != 255 ) { //todo: manipulate image pixel by pixel... QRgb oldColor; for ( int i = 0; i < symbolImage.height(); ++i ) { QRgb* scanLineBuffer = ( QRgb* ) symbolImage.scanLine( i ); for ( int j = 0; j < symbolImage.width(); ++j ) { oldColor = symbolImage.pixel( j, i ); scanLineBuffer[j] = qRgba( qRed( oldColor ), qGreen( oldColor ), qBlue( oldColor ), opacity ); } } } currentSymbolItem = new QgsComposerSymbolItem( itemText ); if ( mHasTopLevelWindow )//only use QIcon / QPixmap if we have a running x-server { currentSymbolItem->setIcon( QIcon( QPixmap::fromImage( symbolImage ) ) ); } if ( !currentSymbolItem ) { return 0; } //Pass deep copy of QgsSymbol as user data. Cast to void* necessary such that QMetaType handles it QgsSymbol* symbolCopy = new QgsSymbol( *s ); currentSymbolItem->setSymbol( symbolCopy ); currentSymbolItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable ); currentSymbolItem ->setLayerID( layerID ); return currentSymbolItem; }
QStandardItem* QgsComposerSymbolItem::clone() const { QgsComposerSymbolItem* cloneItem = new QgsComposerSymbolItem(); *cloneItem = *this; if ( mSymbol ) { cloneItem->setSymbol( new QgsSymbol( *mSymbol ) ); } return cloneItem; }
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() ) ); } } }