diff --git a/src/app/legend/qgslegend.cpp b/src/app/legend/qgslegend.cpp index 622693f51bd3..c83c0d9f0480 100644 --- a/src/app/legend/qgslegend.cpp +++ b/src/app/legend/qgslegend.cpp @@ -113,6 +113,8 @@ QgsLegend::QgsLegend( QgsMapCanvas *canvas, QWidget * parent, const char *name ) connect( mMapCanvas, SIGNAL( layersChanged() ), this, SLOT( refreshCheckStates() ) ); + connect( mMapCanvas, SIGNAL( extentsChanged() ), + this, SLOT( updateLegendItemSymbologies() ) ); // Initialise the line indicator widget. mInsertionLine = new QWidget( viewport() ); @@ -141,6 +143,7 @@ QgsLegend::QgsLegend( QgsMapCanvas *canvas, QWidget * parent, const char *name ) QgsLegend::~QgsLegend() { delete mInsertionLine; + delete mGetLegendGraphicPopup; } #ifdef QGISDEBUG @@ -395,6 +398,24 @@ void QgsLegend::mousePressEvent( QMouseEvent * e ) { if ( e->button() == Qt::LeftButton ) { + // show WMS legend in case itemAt( e->pos() ) is a wms legend + // if it's not a legend later it return a null pixmap + QImage legend = getWmsLegendPixmap( itemAt( e->pos() ) ); + if ( !legend.isNull() ) + { + mGetLegendGraphicPopup = new QFrame(); + mGetLegendGraphicPopup->setFrameStyle(QFrame::Box | QFrame::Raised); + mGetLegendGraphicPopup->setLineWidth(2); + mGetLegendGraphicPopup->setAutoFillBackground(true); + QVBoxLayout *layout = new QVBoxLayout; + QLabel *label = new QLabel(mGetLegendGraphicPopup); + label->setPixmap( QPixmap::fromImage(legend) ); + layout->addWidget(label); + mGetLegendGraphicPopup->setLayout(layout); + mGetLegendGraphicPopup->move(e->globalX(), e->globalY()); + mGetLegendGraphicPopup->show(); + } + mMousePressedFlag = true; mDropTarget = itemAt( e->pos() ); if ( !mDropTarget ) @@ -624,6 +645,11 @@ void QgsLegend::updateGroupCheckStates( QTreeWidgetItem *item ) void QgsLegend::mouseReleaseEvent( QMouseEvent * e ) { + if (mGetLegendGraphicPopup) { + delete mGetLegendGraphicPopup; + mGetLegendGraphicPopup = 0; + } + QStringList layersPriorToEvent = layerIDs(); QTreeWidget::mouseReleaseEvent( e ); mMousePressedFlag = false; @@ -3208,3 +3234,43 @@ void QgsLegend::updateLegendItemSymbologies() ll->refreshSymbology( ll->layer()->id() ); } } + +QImage QgsLegend::getWmsLegendPixmap( QTreeWidgetItem *item ) +{ + if ( !item ) + { + return QImage(); + } + + QTreeWidgetItem *parent = item->parent(); + if ( !parent ) + { + return QImage(); + } + + QgsLegendItem* li = dynamic_cast( parent ); + if ( !li ) + { + return QImage(); + } + + if ( li->type() != QgsLegendItem::LEGEND_LAYER ) + { + return QImage(); + } + + QgsLegendLayer *lyr = qobject_cast( li ); + QgsRasterLayer *rasterLayer = dynamic_cast( lyr->layer() ); + if ( !rasterLayer ) + { + return QImage(); + } + + if ( rasterLayer->providerType() != "wms" ) + { + return QImage(); + } + + return rasterLayer->dataProvider()->getLegendGraphic( canvas()->scale() ); +} + diff --git a/src/app/legend/qgslegend.h b/src/app/legend/qgslegend.h index 0874bc1b09e8..8cd822316ddd 100644 --- a/src/app/legend/qgslegend.h +++ b/src/app/legend/qgslegend.h @@ -590,6 +590,16 @@ class QgsLegend : public QTreeWidget bool verifyDrawingOrder(); + /*! + * Check if current LegendItem belogs to a WMS layer + * @param item LegendItem to check if belongs to a WMS layer + * @return QImage A valid Legend image if belogs to WMS otherwise QImage() + */ + QImage getWmsLegendPixmap( QTreeWidgetItem *item ); + + //! popup QFrame containing WMS getLegendGraphic pixmap + QFrame *mGetLegendGraphicPopup; + signals: void itemAdded( QModelIndex index ); void itemMoved( QModelIndex oldIndex, QModelIndex newIndex ); diff --git a/src/app/legend/qgslegendlayer.cpp b/src/app/legend/qgslegendlayer.cpp index 5695c95de51a..c93837caf596 100644 --- a/src/app/legend/qgslegendlayer.cpp +++ b/src/app/legend/qgslegendlayer.cpp @@ -208,6 +208,26 @@ void QgsLegendLayer::rasterLayerSymbology( QgsRasterLayer* layer ) #if QT_VERSION >= 0x40700 itemList.reserve( rasterItemList.size() ); #endif + + // GetLegendGraphics in case of WMS service... pixmap can return null if GetLegendGraphics + // is not supported by server + QgsDebugMsg( QString( "layer providertype:: %1" ).arg( layer->providerType() ) ); + if ( layer->providerType() == "wms" ) + { + double currentScale = legend()->canvas()->scale(); + + QImage legendGraphic = layer->dataProvider()->getLegendGraphic( currentScale ); + if ( !legendGraphic.isNull() ) + { + QgsDebugMsg( QString( "downloaded legend with dimension Width:" )+QString::number(legendGraphic.width())+QString(" and Height:")+QString::number(legendGraphic.height()) ); + +#if QT_VERSION >= 0x40700 + if ( rasterItemList.size() == 0) itemList.reserve( 1 ); +#endif + itemList.append( qMakePair( QString(""), legendGraphic ) ); + } + } + // Paletted raster may have many colors, for example UInt16 may have 65536 colors // and it is very slow, so we limit max count QSize iconSize = treeWidget()->iconSize();