[QGIS Commit] r13118 - trunk/qgis/src/core/composer
svn_qgis at osgeo.org
svn_qgis at osgeo.org
Sat Mar 20 18:41:02 EDT 2010
Author: mhugent
Date: 2010-03-20 18:41:01 -0400 (Sat, 20 Mar 2010)
New Revision: 13118
Modified:
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:
Added symbology-ng capability to composer legend
Modified: trunk/qgis/src/core/composer/qgscomposerlegend.cpp
===================================================================
--- trunk/qgis/src/core/composer/qgscomposerlegend.cpp 2010-03-20 22:39:47 UTC (rev 13117)
+++ trunk/qgis/src/core/composer/qgscomposerlegend.cpp 2010-03-20 22:41:01 UTC (rev 13118)
@@ -21,6 +21,7 @@
#include "qgsmaprenderer.h"
#include "qgsrenderer.h" //for brush scaling
#include "qgssymbol.h"
+#include "qgssymbolv2.h"
#include <QDomDocument>
#include <QDomElement>
#include <QPainter>
@@ -218,6 +219,15 @@
symbol = ( QgsSymbol* )( symbolData );
}
+ //take QgsSymbolV2* from user data if there
+ QVariant symbolNgVariant = currentItem->data( Qt::UserRole + 2 );
+ QgsSymbolV2* symbolNg = 0;
+ if ( symbolNgVariant.canConvert<void*>() )
+ {
+ void* symbolNgData = symbolNgVariant.value<void*>();
+ symbolNg = ( QgsSymbolV2* )symbolNgData;
+ }
+
if ( symbol ) //item with symbol?
{
//draw symbol
@@ -225,6 +235,12 @@
realItemHeight = std::max( realSymbolHeight, itemHeight );
currentXCoord += mIconLabelSpace;
}
+ else if ( symbolNg ) //item with symbol NG?
+ {
+ drawSymbolV2( p, symbolNg, currentYCoord + ( itemHeight - mSymbolHeight ) / 2, currentXCoord, realSymbolHeight, layerOpacity );
+ realItemHeight = std::max( realSymbolHeight, itemHeight );
+ currentXCoord += mIconLabelSpace;
+ }
else //item with icon?
{
QIcon symbolIcon = currentItem->icon();
@@ -276,6 +292,32 @@
}
}
+void QgsComposerLegend::drawSymbolV2( QPainter* p, QgsSymbolV2* s, double currentYCoord, double& currentXPosition, double& symbolHeight, int layerOpacity ) const
+{
+ if ( !p || !s )
+ {
+ return;
+ }
+
+ double rasterScaleFactor = 1.0;
+ if ( p )
+ {
+ QPaintDevice* paintDevice = p->device();
+ if ( !paintDevice )
+ {
+ return;
+ }
+ rasterScaleFactor = ( paintDevice->logicalDpiX() + paintDevice->logicalDpiY() ) / 2.0 / 25.4;
+ }
+ p->save();
+ p->translate( currentXPosition, currentYCoord );
+ p->scale( 1.0 / rasterScaleFactor, 1.0 / rasterScaleFactor );
+ s->drawPreviewIcon( p, QSize( mSymbolWidth * rasterScaleFactor, mSymbolHeight * rasterScaleFactor ) );
+ p->restore();
+ currentXPosition += mSymbolWidth;
+ symbolHeight = mSymbolHeight;
+}
+
void QgsComposerLegend::drawPointSymbol( QPainter* p, QgsSymbol* s, double currentYCoord, double& currentXPosition, double& symbolHeight, int opacity ) const
{
if ( !s )
Modified: trunk/qgis/src/core/composer/qgscomposerlegend.h
===================================================================
--- trunk/qgis/src/core/composer/qgscomposerlegend.h 2010-03-20 22:39:47 UTC (rev 13117)
+++ trunk/qgis/src/core/composer/qgscomposerlegend.h 2010-03-20 22:41:01 UTC (rev 13118)
@@ -22,6 +22,7 @@
#include "qgslegendmodel.h"
class QgsSymbol;
+class QgsSymbolV2;
/** \ingroup MapComposer
* A legend that can be placed onto a map composition
@@ -133,6 +134,7 @@
/**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, int layerOpacity = 255 ) const;
+ void drawSymbolV2( QPainter* p, QgsSymbolV2* 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;
Modified: trunk/qgis/src/core/composer/qgslegendmodel.cpp
===================================================================
--- trunk/qgis/src/core/composer/qgslegendmodel.cpp 2010-03-20 22:39:47 UTC (rev 13117)
+++ trunk/qgis/src/core/composer/qgslegendmodel.cpp 2010-03-20 22:41:01 UTC (rev 13118)
@@ -21,6 +21,8 @@
#include "qgsmaplayerregistry.h"
#include "qgsrasterlayer.h"
#include "qgsrenderer.h"
+#include "qgsrendererv2.h"
+#include "qgssymbollayerv2utils.h"
#include "qgssymbol.h"
#include "qgsvectordataprovider.h"
#include "qgsvectorlayer.h"
@@ -40,6 +42,7 @@
QgsLegendModel::~QgsLegendModel()
{
removeAllSymbols();
+ removeAllSymbolsV2();
}
void QgsLegendModel::setLayerSet( const QStringList& layerIds )
@@ -48,6 +51,8 @@
//for now clear the model and add the new entries
clear();
+ removeAllSymbols();
+ removeAllSymbolsV2();
QStringList::const_iterator idIter = mLayerIds.constBegin();
QgsMapLayer* currentLayer = 0;
@@ -67,8 +72,21 @@
switch ( currentLayer->type() )
{
case QgsMapLayer::VectorLayer:
- addVectorLayerItems( layerItem, currentLayer );
+ {
+ QgsVectorLayer* vl = dynamic_cast<QgsVectorLayer*>( currentLayer );
+ if ( vl )
+ {
+ if ( vl->isUsingRendererV2() )
+ {
+ addVectorLayerItemsV2( layerItem, vl );
+ }
+ else
+ {
+ addVectorLayerItems( layerItem, vl );
+ }
+ }
break;
+ }
case QgsMapLayer::RasterLayer:
addRasterLayerItem( layerItem, currentLayer );
break;
@@ -79,21 +97,47 @@
}
-int QgsLegendModel::addVectorLayerItems( QStandardItem* layerItem, QgsMapLayer* vlayer )
+int QgsLegendModel::addVectorLayerItemsV2( QStandardItem* layerItem, QgsVectorLayer* vlayer )
{
if ( !layerItem || !vlayer )
{
return 1;
}
- QgsVectorLayer* vectorLayer = qobject_cast<QgsVectorLayer *>( vlayer );
- if ( !vectorLayer )
+ QgsFeatureRendererV2* renderer = vlayer->rendererV2();
+ if ( !renderer )
{
return 2;
}
- int opacity = vectorLayer->getTransparency();
- const QgsRenderer* vectorRenderer = vectorLayer->renderer();
+ QgsLegendSymbolList lst = renderer->legendSymbolItems();
+ QgsLegendSymbolList::const_iterator symbolIt = lst.constBegin();
+ for ( ; symbolIt != lst.constEnd(); ++symbolIt )
+ {
+ QStandardItem* currentSymbolItem = new QStandardItem( symbolIt->first );
+ if ( symbolIt->second )
+ {
+ currentSymbolItem->setIcon( QgsSymbolLayerV2Utils::symbolPreviewIcon( symbolIt->second, QSize( 30, 30 ) ) );
+ //reserve Qt::UserRole + 2 for symbology-ng
+ QgsSymbolV2* newSymbol = symbolIt->second->clone();
+ insertSymbolV2( newSymbol );
+ currentSymbolItem->setData( QVariant::fromValue(( void* )( newSymbol ) ), Qt::UserRole + 2 );
+ }
+ currentSymbolItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
+ layerItem->setChild( layerItem->rowCount(), 0, currentSymbolItem );
+ }
+}
+
+int QgsLegendModel::addVectorLayerItems( QStandardItem* layerItem, QgsVectorLayer* vlayer )
+{
+ if ( !layerItem || !vlayer )
+ {
+ return 1;
+ }
+
+ int opacity = vlayer->getTransparency();
+
+ const QgsRenderer* vectorRenderer = vlayer->renderer();
if ( !vectorRenderer )
{
return 3;
@@ -103,7 +147,7 @@
QSettings settings;
if ( settings.value( "/qgis/showLegendClassifiers", false ).toBool() )
{
- QgsFieldMap layerFields = vectorLayer->pendingFields();
+ QgsFieldMap layerFields = vlayer->pendingFields();
QgsAttributeList attributes = vectorRenderer->classificationAttributes();
QgsAttributeList::const_iterator att_it = attributes.constBegin();
for ( ; att_it != attributes.constEnd(); ++att_it )
@@ -111,7 +155,7 @@
QgsFieldMap::const_iterator fieldIt = layerFields.find( *att_it );
if ( fieldIt != layerFields.constEnd() )
{
- QString attributeName = vectorLayer->attributeDisplayName( fieldIt.key() );
+ QString attributeName = vlayer->attributeDisplayName( fieldIt.key() );
QStandardItem* attributeItem = new QStandardItem( attributeName );
layerItem->setChild( layerItem->rowCount(), 0, attributeItem );
}
@@ -172,11 +216,26 @@
mSymbols.insert( s );
}
+void QgsLegendModel::insertSymbolV2( QgsSymbolV2* s )
+{
+ QSet<QgsSymbolV2*>::iterator it = mSymbolsV2.find( s );
+ if ( it != mSymbolsV2.end() )
+ {
+ delete( *it ); //very unlikely
+ }
+ mSymbolsV2.insert( s );
+}
+
void QgsLegendModel::removeSymbol( QgsSymbol* s )
{
mSymbols.remove( s );
}
+void QgsLegendModel::removeSymbolV2( QgsSymbolV2* s )
+{
+ mSymbolsV2.remove( s );
+}
+
void QgsLegendModel::removeAllSymbols()
{
QSet<QgsSymbol*>::iterator it = mSymbols.begin();
@@ -187,6 +246,16 @@
mSymbols.clear();
}
+void QgsLegendModel::removeAllSymbolsV2()
+{
+ QSet<QgsSymbolV2*>::iterator it = mSymbolsV2.begin();
+ for ( ; it != mSymbolsV2.end(); ++it )
+ {
+ delete *it;
+ }
+ mSymbolsV2.clear();
+}
+
void QgsLegendModel::updateItem( QStandardItem* item )
{
if ( !item )
@@ -211,10 +280,22 @@
symbol = ( QgsSymbol* )( symbolData );
}
+ QVariant symbolNgVariant = item->data( Qt::UserRole + 2 );
+ QgsSymbolV2* symbolNg = 0;
+ if ( symbolNgVariant.canConvert<void*>() )
+ {
+ void* symbolNgData = symbolVariant.value<void*>();
+ symbolNg = ( QgsSymbolV2* )symbolNgData;
+ }
+
if ( symbol ) //vector classification item
{
updateVectorClassificationItem( item, symbol, item->text() );
}
+ else if ( symbolNg )
+ {
+ updateVectorV2ClassificationItem( item, symbolNg, item->text() );
+ }
else if ( !item->icon().isNull() ) //raster classification item
{
updateRasterClassificationItem( item );
@@ -243,8 +324,21 @@
switch ( mapLayer->type() )
{
case QgsMapLayer::VectorLayer:
- addVectorLayerItems( layerItem, mapLayer );
- break;
+ {
+ QgsVectorLayer* vLayer = dynamic_cast<QgsVectorLayer*>( mapLayer );
+ if ( vLayer )
+ {
+ if ( vLayer->isUsingRendererV2() )
+ {
+ addVectorLayerItemsV2( layerItem, vLayer );
+ }
+ else
+ {
+ addVectorLayerItems( layerItem, vLayer );
+ }
+ }
+ }
+ break;
case QgsMapLayer::RasterLayer:
addRasterLayerItem( layerItem, mapLayer );
break;
@@ -334,7 +428,12 @@
}
}
+void QgsLegendModel::updateVectorV2ClassificationItem( QStandardItem* classificationItem, QgsSymbolV2* symbol, QString itemText )
+{
+ //todo...
+}
+
void QgsLegendModel::updateRasterClassificationItem( QStandardItem* classificationItem )
{
if ( !classificationItem )
@@ -406,8 +505,21 @@
switch ( theMapLayer->type() )
{
case QgsMapLayer::VectorLayer:
- addVectorLayerItems( layerItem, theMapLayer );
+ {
+ QgsVectorLayer* vl = dynamic_cast<QgsVectorLayer*>( theMapLayer );
+ if ( vl )
+ {
+ if ( vl->isUsingRendererV2() )
+ {
+ addVectorLayerItemsV2( layerItem, vl );
+ }
+ else
+ {
+ addVectorLayerItems( layerItem, vl );
+ }
+ }
break;
+ }
case QgsMapLayer::RasterLayer:
addRasterLayerItem( layerItem, theMapLayer );
break;
@@ -522,17 +634,38 @@
//store text and QgsSymbol for vector classification items
QVariant symbolVariant = currentClassificationItem->data();
+ QVariant symbolNgVariant = currentClassificationItem->data( Qt::UserRole + 2 );
QgsSymbol* symbol = 0;
+ QgsSymbolV2* symbolNg = 0;
+
if ( symbolVariant.canConvert<void*>() )
{
void* symbolData = symbolVariant.value<void*>();
- symbol = ( QgsSymbol* )( symbolData );
+ symbol = ( QgsSymbol* )symbolData;
}
- if ( symbol )
+ else if ( symbolNgVariant.canConvert<void*>() )
{
- QDomElement vectorClassElem = doc.createElement( "VectorClassificationItem" );
+ void* symbolNgData = symbolNgVariant.value<void*>();
+ symbolNg = ( QgsSymbolV2* )symbolNgData;
+ }
+
+ if ( symbol || symbolNg )
+ {
+ QDomElement vectorClassElem;
+ if ( symbol )
+ {
+ vectorClassElem = doc.createElement( "VectorClassificationItem" );
+ symbol->writeXML( vectorClassElem, doc, 0 );
+ }
+ else if ( symbolNg )
+ {
+ vectorClassElem = doc.createElement( "VectorClassificationItemNg" );
+ QgsSymbolV2Map saveSymbolMap;
+ saveSymbolMap.insert( "classificationSymbol", symbolNg );
+ QDomElement symbolsElem = QgsSymbolLayerV2Utils::saveSymbols( saveSymbolMap, "symbols", doc );
+ vectorClassElem.appendChild( symbolsElem );
+ }
vectorClassElem.setAttribute( "text", currentClassificationItem->text() );
- symbol->writeXML( vectorClassElem, doc, 0 );
newLayerItem.appendChild( vectorClassElem );
continue;
}
@@ -639,6 +772,23 @@
}
layerItem->setChild( layerItem->rowCount(), 0, childItem );
}
+ else if ( currentChildElement.tagName() == "VectorClassificationItemNg" )
+ {
+ QDomElement symbolNgElem = currentChildElement.firstChildElement( "symbols" );
+ if ( !symbolNgElem.isNull() )
+ {
+ QgsSymbolV2Map loadSymbolMap = QgsSymbolLayerV2Utils::loadSymbols( symbolNgElem );
+ //we assume there is only one symbol in the map...
+ QgsSymbolV2Map::iterator mapIt = loadSymbolMap.begin();
+ if ( mapIt != loadSymbolMap.end() )
+ {
+ QgsSymbolV2* symbolNg = mapIt.value();
+ childItem->setData( QVariant::fromValue(( void* )symbolNg ), Qt::UserRole + 2 );
+ childItem->setIcon( QgsSymbolLayerV2Utils::symbolPreviewIcon( symbolNg, QSize( 30, 30 ) ) );
+ }
+ layerItem->setChild( layerItem->rowCount(), 0, childItem );
+ }
+ }
else if ( currentChildElement.tagName() == "TextItem" )
{
layerItem->setChild( layerItem->rowCount(), 0, childItem );
Modified: trunk/qgis/src/core/composer/qgslegendmodel.h
===================================================================
--- trunk/qgis/src/core/composer/qgslegendmodel.h 2010-03-20 22:39:47 UTC (rev 13117)
+++ trunk/qgis/src/core/composer/qgslegendmodel.h 2010-03-20 22:41:01 UTC (rev 13118)
@@ -26,6 +26,8 @@
class QDomElement;
class QgsMapLayer;
class QgsSymbol;
+class QgsSymbolV2;
+class QgsVectorLayer;
/** \ingroup MapComposer
* A model that provides layers as root items. The classification items are
@@ -47,6 +49,7 @@
void updateLayer( QStandardItem* layerItem );
/**Tries to update a single classification item*/
void updateVectorClassificationItem( QStandardItem* classificationItem, QgsSymbol* symbol, QString itemText );
+ void updateVectorV2ClassificationItem( QStandardItem* classificationItem, QgsSymbolV2* symbol, QString itemText );
void updateRasterClassificationItem( QStandardItem* classificationItem );
bool writeXML( QDomElement& composerLegendElem, QDomDocument& doc ) const;
@@ -62,24 +65,32 @@
private:
/**Adds classification items of vector layers
@return 0 in case of success*/
- int addVectorLayerItems( QStandardItem* layerItem, QgsMapLayer* vlayer );
+ int addVectorLayerItems( QStandardItem* layerItem, QgsVectorLayer* vlayer );
+ /**Adds classification items of vector layers using new symbology*/
+ int addVectorLayerItemsV2( QStandardItem* layerItem, QgsVectorLayer* 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 );
+ void insertSymbolV2( QgsSymbolV2* s );
/**Removes and deletes a symbol*/
void removeSymbol( QgsSymbol* s );
+ void removeSymbolV2( QgsSymbolV2* s );
/**Removes and deletes all stored symbols*/
void removeAllSymbols();
+ void removeAllSymbolsV2();
/**Creates a model item for a vector symbol. The calling function takes ownership*/
QStandardItem* itemFromSymbol( QgsSymbol* s, int opacity );
/**Keep track of copied symbols to delete them if not used anymore*/
QSet<QgsSymbol*> mSymbols;
+ /**Keep track of copied symbols v2*/
+ QSet<QgsSymbolV2*> mSymbolsV2;
protected:
QStringList mLayerIds;
More information about the QGIS-commit
mailing list