[QGIS Commit] r11439 - in trunk/qgis: python/core src/core/composer
svn_qgis at osgeo.org
svn_qgis at osgeo.org
Wed Aug 19 11:02:55 EDT 2009
Author: mhugent
Date: 2009-08-19 11:02:55 -0400 (Wed, 19 Aug 2009)
New Revision: 11439
Modified:
trunk/qgis/python/core/qgslegendmodel.sip
trunk/qgis/src/core/composer/qgscomposerlegend.cpp
trunk/qgis/src/core/composer/qgscomposerlegend.h
trunk/qgis/src/core/composer/qgslegendmodel.cpp
trunk/qgis/src/core/composer/qgslegendmodel.h
Log:
Consider transparency in composer legend (even though legend items for transparent layers are problematic because of background). Removed private section from qgslegendmodel.sip as private members cannot be used anyway
Modified: trunk/qgis/python/core/qgslegendmodel.sip
===================================================================
--- trunk/qgis/python/core/qgslegendmodel.sip 2009-08-19 15:02:46 UTC (rev 11438)
+++ trunk/qgis/python/core/qgslegendmodel.sip 2009-08-19 15:02:55 UTC (rev 11439)
@@ -32,23 +32,4 @@
signals:
void layersChanged();
-
- private:
- /**Adds classification items of vector layers
- @return 0 in case of success*/
- int addVectorLayerItems( QStandardItem* layerItem, QgsMapLayer* vlayer );
-
- /**Adds item of raster layer
- @return 0 in case of success*/
- int addRasterLayerItem( QStandardItem* layerItem, QgsMapLayer* rlayer );
-
- /**Insert a symbol into QgsLegendModel symbol storage*/
- void insertSymbol( QgsSymbol* s );
- /**Removes and deletes a symbol*/
- void removeSymbol( QgsSymbol* s );
- /**Removes and deletes all stored symbols*/
- void removeAllSymbols();
-
- /**Creates a model item for a vector symbol. The calling function takes ownership*/
- QStandardItem* itemFromSymbol( QgsSymbol* s );
-};
\ No newline at end of file
+};
Modified: trunk/qgis/src/core/composer/qgscomposerlegend.cpp
===================================================================
--- trunk/qgis/src/core/composer/qgscomposerlegend.cpp 2009-08-19 15:02:46 UTC (rev 11438)
+++ trunk/qgis/src/core/composer/qgscomposerlegend.cpp 2009-08-19 15:02:55 UTC (rev 11439)
@@ -108,6 +108,13 @@
if ( currentLayerItem )
{
QString currentLayerId = currentLayerItem->data().toString();
+ int opacity = 255;
+ QgsMapLayer* currentLayer = QgsMapLayerRegistry::instance()->mapLayer( currentLayerId );
+ if ( currentLayer )
+ {
+ opacity = currentLayer->getTransparency();
+ }
+
if ( visibleLayerIds.contains( currentLayerId ) )
{
//Let the user omit the layer title item by having an empty layer title string
@@ -126,7 +133,7 @@
maxXCoord = std::max( maxXCoord, 2 * mBoxSpace + textWidthMillimeters( mLayerFont, currentLayerItem->text() ) );
//and child items
- drawLayerChildItems( painter, currentLayerItem, currentYCoordinate, maxXCoord );
+ drawLayerChildItems( painter, currentLayerItem, currentYCoordinate, maxXCoord, opacity );
}
}
}
@@ -170,7 +177,7 @@
}
}
-void QgsComposerLegend::drawLayerChildItems( QPainter* p, QStandardItem* layerItem, double& currentYCoord, double& maxXCoord )
+void QgsComposerLegend::drawLayerChildItems( QPainter* p, QStandardItem* layerItem, double& currentYCoord, double& maxXCoord, int layerOpacity )
{
if ( !layerItem )
{
@@ -212,7 +219,7 @@
if ( symbol ) //item with symbol?
{
//draw symbol
- drawSymbol( p, symbol, currentYCoord + ( itemHeight - mSymbolHeight ) / 2, currentXCoord, realSymbolHeight );
+ drawSymbol( p, symbol, currentYCoord + ( itemHeight - mSymbolHeight ) / 2, currentXCoord, realSymbolHeight, layerOpacity );
realItemHeight = std::max( realSymbolHeight, itemHeight );
currentXCoord += mIconLabelSpace;
}
@@ -239,7 +246,7 @@
}
}
-void QgsComposerLegend::drawSymbol( QPainter* p, QgsSymbol* s, double currentYCoord, double& currentXPosition, double& symbolHeight ) const
+void QgsComposerLegend::drawSymbol( QPainter* p, QgsSymbol* s, double currentYCoord, double& currentXPosition, double& symbolHeight, int layerOpacity ) const
{
if ( !s )
{
@@ -250,14 +257,14 @@
switch ( symbolType )
{
case QGis::Point:
- drawPointSymbol( p, s, currentYCoord, currentXPosition, symbolHeight );
+ drawPointSymbol( p, s, currentYCoord, currentXPosition, symbolHeight, layerOpacity );
break;
case QGis::Line:
- drawLineSymbol( p, s, currentYCoord, currentXPosition );
+ drawLineSymbol( p, s, currentYCoord, currentXPosition, layerOpacity );
symbolHeight = mSymbolHeight;
break;
case QGis::Polygon:
- drawPolygonSymbol( p, s, currentYCoord, currentXPosition );
+ drawPolygonSymbol( p, s, currentYCoord, currentXPosition, layerOpacity );
symbolHeight = mSymbolHeight;
break;
case QGis::UnknownGeometry:
@@ -266,7 +273,7 @@
}
}
-void QgsComposerLegend::drawPointSymbol( QPainter* p, QgsSymbol* s, double currentYCoord, double& currentXPosition, double& symbolHeight ) const
+void QgsComposerLegend::drawPointSymbol( QPainter* p, QgsSymbol* s, double currentYCoord, double& currentXPosition, double& symbolHeight, int opacity ) const
{
if ( !s )
{
@@ -287,7 +294,7 @@
}
//width scale is 1.0
- pointImage = s->getPointSymbolAsImage( 1.0, false, Qt::yellow, 1.0, 0.0, rasterScaleFactor );
+ pointImage = s->getPointSymbolAsImage( 1.0, false, Qt::yellow, 1.0, 0.0, rasterScaleFactor, opacity / 255.0 );
if ( p )
{
@@ -303,7 +310,7 @@
symbolHeight = s->pointSize(); //pointImage.height() / rasterScaleFactor;
}
-void QgsComposerLegend::drawLineSymbol( QPainter* p, QgsSymbol* s, double currentYCoord, double& currentXPosition ) const
+void QgsComposerLegend::drawLineSymbol( QPainter* p, QgsSymbol* s, double currentYCoord, double& currentXPosition, int opacity ) const
{
if ( !s )
{
@@ -315,7 +322,11 @@
if ( p )
{
p->save();
- p->setPen( s->pen() );
+ QPen symbolPen = s->pen();
+ QColor penColor = symbolPen.color();
+ penColor.setAlpha( opacity );
+ symbolPen.setColor( penColor );
+ p->setPen( symbolPen );
p->drawLine( QPointF( currentXPosition, yCoord ), QPointF( currentXPosition + mSymbolWidth, yCoord ) );
p->restore();
}
@@ -323,7 +334,7 @@
currentXPosition += mSymbolWidth;
}
-void QgsComposerLegend::drawPolygonSymbol( QPainter* p, QgsSymbol* s, double currentYCoord, double& currentXPosition ) const
+void QgsComposerLegend::drawPolygonSymbol( QPainter* p, QgsSymbol* s, double currentYCoord, double& currentXPosition, int opacity ) const
{
if ( !s )
{
@@ -332,8 +343,11 @@
if ( p )
{
- //scale brush
+ //scale brush and set transparencies
QBrush symbolBrush = s->brush();
+ QColor brushColor = symbolBrush.color();
+ brushColor.setAlpha( opacity );
+ symbolBrush.setColor( brushColor );
QPaintDevice* paintDevice = p->device();
if ( paintDevice )
{
@@ -341,7 +355,13 @@
QgsRenderer::scaleBrush( symbolBrush, rasterScaleFactor );
}
p->setBrush( symbolBrush );
- p->setPen( s->pen() );
+
+ QPen symbolPen = s->pen();
+ QColor penColor = symbolPen.color();
+ penColor.setAlpha( opacity );
+ symbolPen.setColor( penColor );
+ p->setPen( symbolPen );
+
p->drawRect( QRectF( currentXPosition, currentYCoord, mSymbolWidth, mSymbolHeight ) );
}
Modified: trunk/qgis/src/core/composer/qgscomposerlegend.h
===================================================================
--- trunk/qgis/src/core/composer/qgscomposerlegend.h 2009-08-19 15:02:46 UTC (rev 11438)
+++ trunk/qgis/src/core/composer/qgscomposerlegend.h 2009-08-19 15:02:55 UTC (rev 11439)
@@ -127,15 +127,16 @@
@param layerItem parent model item (layer)
@param currentYCoord in/out: current y position of legend item
@param maxXCoord in/out: maximum x-coordinate of the whole legend
+ @param layerOpacity opacity of the corresponding map layer
*/
- void drawLayerChildItems( QPainter* p, QStandardItem* layerItem, double& currentYCoord, double& maxXCoord );
+ void drawLayerChildItems( QPainter* p, QStandardItem* layerItem, double& currentYCoord, double& maxXCoord, int layerOpacity = 255 );
/**Draws a symbol at the current y position and returns the new x position. Returns real symbol height, because for points,
it is possible that it differs from mSymbolHeight*/
- void drawSymbol( QPainter* p, QgsSymbol* s, double currentYCoord, double& currentXPosition, double& symbolHeight ) const;
- void drawPointSymbol( QPainter*, QgsSymbol* s, double currentYCoord, double& currentXPosition, double& symbolHeight ) const;
- void drawLineSymbol( QPainter*, QgsSymbol* s, double currentYCoord, double& currentXPosition ) const;
- void drawPolygonSymbol( QPainter* p, QgsSymbol* s, double currentYCoord, double& currentXPosition ) const;
+ void drawSymbol( QPainter* p, QgsSymbol* s, double currentYCoord, double& currentXPosition, double& symbolHeight, int layerOpacity = 255 ) const;
+ void drawPointSymbol( QPainter*, QgsSymbol* s, double currentYCoord, double& currentXPosition, double& symbolHeight, int opacity = 255 ) const;
+ void drawLineSymbol( QPainter*, QgsSymbol* s, double currentYCoord, double& currentXPosition, int opacity = 255 ) const;
+ void drawPolygonSymbol( QPainter* p, QgsSymbol* s, double currentYCoord, double& currentXPosition, int opacity = 255 ) const;
/**Helper function that lists ids of layers contained in map canvas*/
QStringList layerIdList() const;
Modified: trunk/qgis/src/core/composer/qgslegendmodel.cpp
===================================================================
--- trunk/qgis/src/core/composer/qgslegendmodel.cpp 2009-08-19 15:02:46 UTC (rev 11438)
+++ trunk/qgis/src/core/composer/qgslegendmodel.cpp 2009-08-19 15:02:55 UTC (rev 11439)
@@ -91,6 +91,7 @@
{
return 2;
}
+ int opacity = vectorLayer->getTransparency();
const QgsRenderer* vectorRenderer = vectorLayer->renderer();
if ( !vectorRenderer )
@@ -127,7 +128,7 @@
continue;
}
- QStandardItem* currentSymbolItem = itemFromSymbol( *symbolIt );
+ QStandardItem* currentSymbolItem = itemFromSymbol( *symbolIt, opacity );
if ( !currentSymbolItem )
{
continue;
@@ -278,6 +279,7 @@
{
return;
}
+ int opacity = vl->getTransparency();
const QgsRenderer* layerRenderer = vl->renderer();
if ( !layerRenderer )
@@ -297,7 +299,7 @@
if ( currentSymbol->lowerValue() + " - " + currentSymbol->upperValue() == itemText )
{
removeSymbol( symbol );
- parentItem->insertRow( classificationItem->row(), itemFromSymbol( currentSymbol ) );
+ parentItem->insertRow( classificationItem->row(), itemFromSymbol( currentSymbol, opacity ) );
parentItem->removeRow( classificationItem->row() );
return;
}
@@ -311,7 +313,7 @@
if ( currentSymbol->lowerValue() == itemText )
{
removeSymbol( symbol );
- parentItem->insertRow( classificationItem->row(), itemFromSymbol( currentSymbol ) );
+ parentItem->insertRow( classificationItem->row(), itemFromSymbol( currentSymbol, opacity ) );
parentItem->removeRow( classificationItem->row() );
return;
}
@@ -325,7 +327,7 @@
if ( currentSymbol->label() == itemText )
{
removeSymbol( symbol );
- parentItem->insertRow( classificationItem->row(), itemFromSymbol( currentSymbol ) );
+ parentItem->insertRow( classificationItem->row(), itemFromSymbol( currentSymbol, opacity ) );
parentItem->removeRow( classificationItem->row() );
return;
}
@@ -415,7 +417,7 @@
emit layersChanged();
}
-QStandardItem* QgsLegendModel::itemFromSymbol( QgsSymbol* s )
+QStandardItem* QgsLegendModel::itemFromSymbol( QgsSymbol* s, int opacity )
{
QStandardItem* currentSymbolItem = 0;
@@ -444,22 +446,39 @@
}
//icon item
+ QImage symbolImage;
switch ( s->type() )
{
case QGis::Point:
- currentSymbolItem = new QStandardItem( QIcon( QPixmap::fromImage( s->getPointSymbolAsImage() ) ), itemText );
+ symbolImage = s->getPointSymbolAsImage();
break;
case QGis::Line:
- currentSymbolItem = new QStandardItem( QIcon( QPixmap::fromImage( s->getLineSymbolAsImage() ) ), itemText );
+ symbolImage = s->getLineSymbolAsImage();
break;
case QGis::Polygon:
- currentSymbolItem = new QStandardItem( QIcon( QPixmap::fromImage( s->getPolygonSymbolAsImage() ) ), itemText );
+ symbolImage = s->getPolygonSymbolAsImage();
break;
default:
- currentSymbolItem = 0;
- break;
+ 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 QStandardItem( QIcon( QPixmap::fromImage( symbolImage ) ), itemText );
+
if ( !currentSymbolItem )
{
return 0;
Modified: trunk/qgis/src/core/composer/qgslegendmodel.h
===================================================================
--- trunk/qgis/src/core/composer/qgslegendmodel.h 2009-08-19 15:02:46 UTC (rev 11438)
+++ trunk/qgis/src/core/composer/qgslegendmodel.h 2009-08-19 15:02:55 UTC (rev 11439)
@@ -76,7 +76,7 @@
void removeAllSymbols();
/**Creates a model item for a vector symbol. The calling function takes ownership*/
- QStandardItem* itemFromSymbol( QgsSymbol* s );
+ QStandardItem* itemFromSymbol( QgsSymbol* s, int opacity );
/**Keep track of copied symbols to delete them if not used anymore*/
QSet<QgsSymbol*> mSymbols;
More information about the QGIS-commit
mailing list