From 24ca94bdaef0763bb023da7985d01b49c0ba71c3 Mon Sep 17 00:00:00 2001 From: Denis Rouzaud Date: Tue, 5 Feb 2013 15:41:29 +0100 Subject: [PATCH] return results directly from the identify method instead of using a private attribute --- python/gui/qgsmaptoolidentify.sip | 7 +--- src/app/qgsmaptoolidentifyaction.cpp | 8 ++-- src/gui/qgsmaptoolidentify.cpp | 60 +++++++++++----------------- src/gui/qgsmaptoolidentify.h | 19 ++++----- 4 files changed, 37 insertions(+), 57 deletions(-) diff --git a/python/gui/qgsmaptoolidentify.sip b/python/gui/qgsmaptoolidentify.sip index df1c7d271f7..db55e38b137 100644 --- a/python/gui/qgsmaptoolidentify.sip +++ b/python/gui/qgsmaptoolidentify.sip @@ -74,7 +74,7 @@ class QgsMapToolIdentify : QgsMapTool @param layerList Performs the identification within the given list of layers. Default value is an empty list, i.e. uses all the layers. @param mode Identification mode. Can use Qgis default settings or a defined mode. Default mode is DefaultQgsSetting. @return true if identification succeeded and a feature has been found, false otherwise.*/ - bool identify(int x, int y, QList layerList = QList(), IdentifyMode mode = DefaultQgsSetting); + IdentifyResults identify(int x, int y, QList layerList = QList(), IdentifyMode mode = DefaultQgsSetting); /** Performs the identification. To avoid beeing forced to specify IdentifyMode with a list of layers @@ -84,10 +84,7 @@ class QgsMapToolIdentify : QgsMapTool @param mode Identification mode. Can use Qgis default settings or a defined mode. @param layerType Only performs identification in a certain type of layers (raster, vector). Default value is AllLayers. @return true if identification succeeded and a feature has been found, false otherwise.*/ - bool identify(int x, int y, IdentifyMode mode, LayerType layerType = AllLayers); - - /** Access to results */ - IdentifyResults &results(); + IdentifyResults identify(int x, int y, IdentifyMode mode, LayerType layerType = AllLayers); signals: void identifyProgress( int, int ); diff --git a/src/app/qgsmaptoolidentifyaction.cpp b/src/app/qgsmaptoolidentifyaction.cpp index e3e080d363d..6a9e0394873 100644 --- a/src/app/qgsmaptoolidentifyaction.cpp +++ b/src/app/qgsmaptoolidentifyaction.cpp @@ -93,23 +93,23 @@ void QgsMapToolIdentifyAction::canvasReleaseEvent( QMouseEvent *e ) connect( this, SIGNAL( identifyProgress( int, int ) ), QgisApp::instance(), SLOT( showProgress( int, int ) ) ); connect( this, SIGNAL( identifyMessage( QString ) ), QgisApp::instance(), SLOT( showStatusMessage( QString ) ) ); - bool res = QgsMapToolIdentify::identify( e->x(), e->y() ); + IdentifyResults results = QgsMapToolIdentify::identify( e->x(), e->y() ); disconnect( this, SIGNAL( identifyProgress( int, int ) ), QgisApp::instance(), SLOT( showProgress( int, int ) ) ); disconnect( this, SIGNAL( identifyMessage( QString ) ), QgisApp::instance(), SLOT( showStatusMessage( QString ) ) ); QList::const_iterator vresult; - for ( vresult = results().mVectorResults.begin(); vresult != results().mVectorResults.end(); ++vresult ) + for ( vresult = results.mVectorResults.begin(); vresult != results.mVectorResults.end(); ++vresult ) { resultsDialog()->addFeature( vresult->mLayer, vresult->mFeature, vresult->mDerivedAttributes ); } QList::const_iterator rresult; - for ( rresult = results().mRasterResults.begin(); rresult != results().mRasterResults.end(); ++rresult ) + for ( rresult = results.mRasterResults.begin(); rresult != results.mRasterResults.end(); ++rresult ) { resultsDialog()->addFeature( rresult->mLayer, rresult->mLabel, rresult->mAttributes, rresult->mDerivedAttributes, rresult->mFields, rresult->mFeature ); } - if ( res ) + if ( !results.mRasterResults.isEmpty() || !results.mVectorResults.isEmpty() ) { resultsDialog()->show(); } diff --git a/src/gui/qgsmaptoolidentify.cpp b/src/gui/qgsmaptoolidentify.cpp index be3584bcceb..5f4cbd8f3f5 100644 --- a/src/gui/qgsmaptoolidentify.cpp +++ b/src/gui/qgsmaptoolidentify.cpp @@ -68,35 +68,29 @@ void QgsMapToolIdentify::canvasReleaseEvent( QMouseEvent *e ) Q_UNUSED( e ); } -bool QgsMapToolIdentify::identify( int x, int y, QList layerList, IdentifyMode mode ) +QgsMapToolIdentify::IdentifyResults QgsMapToolIdentify::identify ( int x, int y, QList layerList, IdentifyMode mode ) { return identify( x, y, mode, layerList, AllLayers ); } -bool QgsMapToolIdentify::identify( int x, int y, IdentifyMode mode, LayerType layerType ) +QgsMapToolIdentify::IdentifyResults QgsMapToolIdentify::identify( int x, int y, IdentifyMode mode, LayerType layerType ) { return identify( x, y, mode, QList(), layerType ); } -bool QgsMapToolIdentify::identify( int x, int y, IdentifyMode mode, QList layerList, LayerType layerType ) +QgsMapToolIdentify::IdentifyResults QgsMapToolIdentify::identify( int x, int y, IdentifyMode mode, QList layerList, LayerType layerType ) { + IdentifyResults results; + mLastPoint = mCanvas->getCoordinateTransform()->toMapCoordinates( x, y ); mLastExtent = mCanvas->extent(); mLastMapUnitsPerPixel = mCanvas->mapUnitsPerPixel(); - return identify( mLastPoint, mLastExtent, mLastMapUnitsPerPixel, mode, layerList, layerType ); -} -bool QgsMapToolIdentify::identify( QgsPoint point, QgsRectangle viewExtent, double mapUnitsPerPixel, IdentifyMode mode, QList layerList, LayerType layerType ) -{ - bool res = false; if ( !mCanvas || mCanvas->isDrawing() ) { - return res; + return results; } - mResultData.mVectorResults.clear(); - mResultData.mRasterResults.clear(); - if ( mode == DefaultQgsSetting ) { QSettings settings; @@ -110,12 +104,12 @@ bool QgsMapToolIdentify::identify( QgsPoint point, QgsRectangle viewExtent, doub if ( !layer ) { emit identifyMessage( tr( "No active layer. To identify features, you must choose an active layer." ) ); - return res; + return results; } QApplication::setOverrideCursor( Qt::WaitCursor ); - res = identifyLayer( layer, point, viewExtent, mapUnitsPerPixel, layerType ); + identifyLayer( &results, layer, mLastPoint, mLastExtent, mLastMapUnitsPerPixel, layerType ); } else { @@ -145,9 +139,8 @@ bool QgsMapToolIdentify::identify( QgsPoint point, QgsRectangle viewExtent, doub if ( noIdentifyLayerIdList.contains( layer->id() ) ) continue; - if ( identifyLayer( layer, point, viewExtent, mapUnitsPerPixel, layerType ) ) + if ( identifyLayer( &results, layer, mLastPoint, mLastExtent, mLastMapUnitsPerPixel, layerType ) ) { - res = true; if ( mode == TopDownStopAtFirst ) break; } @@ -159,7 +152,7 @@ bool QgsMapToolIdentify::identify( QgsPoint point, QgsRectangle viewExtent, doub QApplication::restoreOverrideCursor(); - return res; + return results; } void QgsMapToolIdentify::activate() @@ -172,15 +165,15 @@ void QgsMapToolIdentify::deactivate() QgsMapTool::deactivate(); } -bool QgsMapToolIdentify::identifyLayer( QgsMapLayer *layer, QgsPoint point, QgsRectangle viewExtent, double mapUnitsPerPixel, LayerType layerType ) +bool QgsMapToolIdentify::identifyLayer( IdentifyResults *results, QgsMapLayer *layer, QgsPoint point, QgsRectangle viewExtent, double mapUnitsPerPixel, LayerType layerType ) { if ( layer->type() == QgsMapLayer::RasterLayer && ( layerType == AllLayers || layerType == RasterLayer ) ) { - return identifyRasterLayer( qobject_cast( layer ), point, viewExtent, mapUnitsPerPixel, mResultData.mRasterResults ); + return identifyRasterLayer( results, qobject_cast( layer ), point, viewExtent, mapUnitsPerPixel ); } else if ( layer->type() == QgsMapLayer::VectorLayer && ( layerType == AllLayers || layerType == VectorLayer ) ) { - return identifyVectorLayer( qobject_cast( layer ), point ); + return identifyVectorLayer( results, qobject_cast( layer ), point ); } else { @@ -188,9 +181,8 @@ bool QgsMapToolIdentify::identifyLayer( QgsMapLayer *layer, QgsPoint point, QgsR } } -bool QgsMapToolIdentify::identifyVectorLayer( QgsVectorLayer *layer, QgsPoint point ) +bool QgsMapToolIdentify::identifyVectorLayer( IdentifyResults *results, QgsVectorLayer *layer, QgsPoint point ) { - QgsDebugMsg( "point = " + point.toString() ); if ( !layer ) return false; @@ -210,7 +202,6 @@ bool QgsMapToolIdentify::identifyVectorLayer( QgsVectorLayer *layer, QgsPoint po QSettings settings; double identifyValue = settings.value( "/Map/identifyRadius", QGis::DEFAULT_IDENTIFY_RADIUS ).toDouble(); - if ( identifyValue <= 0.0 ) identifyValue = QGis::DEFAULT_IDENTIFY_RADIUS; @@ -271,7 +262,7 @@ bool QgsMapToolIdentify::identifyVectorLayer( QgsVectorLayer *layer, QgsPoint po derivedAttributes.insert( tr( "feature id" ), fid < 0 ? tr( "new feature" ) : FID_TO_STRING( fid ) ); - mResultData.mVectorResults.append( VectorResult( layer, *f_it, derivedAttributes ) ); + results->mVectorResults.append( VectorResult( layer, *f_it, derivedAttributes ) ); } if ( renderer && renderer->capabilities() & QgsFeatureRendererV2::ScaleDependent ) @@ -348,7 +339,7 @@ QMap< QString, QString > QgsMapToolIdentify::featureDerivedAttributes( QgsFeatur return derivedAttributes; } -bool QgsMapToolIdentify::identifyRasterLayer( QgsRasterLayer *layer, QgsPoint point, QgsRectangle viewExtent, double mapUnitsPerPixel, QList& rasterResults ) +bool QgsMapToolIdentify::identifyRasterLayer( IdentifyResults *results, QgsRasterLayer *layer, QgsPoint point, QgsRectangle viewExtent, double mapUnitsPerPixel ) { QgsDebugMsg( "point = " + point.toString() ); if ( !layer ) return false; @@ -442,7 +433,7 @@ bool QgsMapToolIdentify::identifyRasterLayer( QgsRasterLayer *layer, QgsPoint po attributes.insert( dprovider->generateBandName( bandNo ), valueString ); } QString label = layer->name(); - rasterResults.append( RasterResult( layer, label, attributes, derivedAttributes ) ); + results->mRasterResults.append( RasterResult( layer, label, attributes, derivedAttributes ) ); } else if ( format == QgsRasterDataProvider::IdentifyFormatFeature ) { @@ -476,7 +467,7 @@ bool QgsMapToolIdentify::identifyRasterLayer( QgsRasterLayer *layer, QgsPoint po QMap< QString, QString > derAttributes = derivedAttributes; derAttributes.unite( featureDerivedAttributes( &feature, layer ) ); - rasterResults.append( RasterResult( layer, labels.join( " / " ), featureStore.fields(), feature, derAttributes ) ); + results->mRasterResults.append( RasterResult( layer, labels.join( " / " ), featureStore.fields(), feature, derAttributes ) ); } } } @@ -491,7 +482,7 @@ bool QgsMapToolIdentify::identifyRasterLayer( QgsRasterLayer *layer, QgsPoint po attributes.insert( "", value ); QString label = layer->subLayers().value( bandNo ); - rasterResults.append( RasterResult( layer, label, attributes, derivedAttributes ) ); + results->mRasterResults.append( RasterResult( layer, label, attributes, derivedAttributes ) ); } } @@ -515,16 +506,13 @@ QGis::UnitType QgsMapToolIdentify::displayUnits() return mCanvas->mapUnits(); } -QgsMapToolIdentify::IdentifyResults &QgsMapToolIdentify::results() -{ - return mResultData; -} - void QgsMapToolIdentify::formatChanged( QgsRasterLayer *layer ) { QgsDebugMsg( "Entered" ); - QList rasterResults; - identifyRasterLayer( layer, mLastPoint, mLastExtent, mLastMapUnitsPerPixel, rasterResults ); - emit changedRasterResults( rasterResults ); + IdentifyResults results; + if ( identifyRasterLayer( &results, layer, mLastPoint, mLastExtent, mLastMapUnitsPerPixel ) ) + { + emit changedRasterResults( results.mRasterResults ); + } } diff --git a/src/gui/qgsmaptoolidentify.h b/src/gui/qgsmaptoolidentify.h index 9dcd4ab8581..d77f0c6adff 100644 --- a/src/gui/qgsmaptoolidentify.h +++ b/src/gui/qgsmaptoolidentify.h @@ -121,7 +121,7 @@ class GUI_EXPORT QgsMapToolIdentify : public QgsMapTool @param layerList Performs the identification within the given list of layers. Default value is an empty list, i.e. uses all the layers. @param mode Identification mode. Can use Qgis default settings or a defined mode. Default mode is DefaultQgsSetting. @return true if identification succeeded and a feature has been found, false otherwise.*/ - bool identify( int x, int y, QList layerList = QList(), IdentifyMode mode = DefaultQgsSetting ); + IdentifyResults identify( int x, int y, QList layerList = QList(), IdentifyMode mode = DefaultQgsSetting ); /** Performs the identification. To avoid beeing forced to specify IdentifyMode with a list of layers @@ -131,10 +131,7 @@ class GUI_EXPORT QgsMapToolIdentify : public QgsMapTool @param mode Identification mode. Can use Qgis default settings or a defined mode. @param layerType Only performs identification in a certain type of layers (raster, vector). Default value is AllLayers. @return true if identification succeeded and a feature has been found, false otherwise.*/ - bool identify( int x, int y, IdentifyMode mode, LayerType layerType = AllLayers ); - - /** Access to results */ - IdentifyResults &results(); + IdentifyResults identify( int x, int y, IdentifyMode mode, LayerType layerType = AllLayers ); public slots: void formatChanged( QgsRasterLayer *layer ); @@ -154,13 +151,13 @@ class GUI_EXPORT QgsMapToolIdentify : public QgsMapTool @param layerList Performs the identification within the given list of layers. @param layerType Only performs identification in a certain type of layers (raster, vector). @return true if identification succeeded and a feature has been found, false otherwise.*/ - bool identify( int x, int y, IdentifyMode mode, QList layerList, LayerType layerType = AllLayers ); + IdentifyResults identify( int x, int y, IdentifyMode mode, QList layerList, LayerType layerType = AllLayers ); - bool identify( QgsPoint point, QgsRectangle viewExtent, double mapUnitsPerPixel, IdentifyMode mode, QList layerList, LayerType layerType = AllLayers ); + /** call the right method depending on layer type */ + bool identifyLayer( IdentifyResults *results, QgsMapLayer *layer, QgsPoint point, QgsRectangle viewExtent, double mapUnitsPerPixel, LayerType layerType = AllLayers ); - bool identifyLayer( QgsMapLayer *layer, QgsPoint point, QgsRectangle viewExtent, double mapUnitsPerPixel, LayerType layerType = AllLayers ); - bool identifyRasterLayer( QgsRasterLayer *layer, QgsPoint point, QgsRectangle viewExtent, double mapUnitsPerPixel, QList& rasterResults ); - bool identifyVectorLayer( QgsVectorLayer *layer, QgsPoint point ); + bool identifyRasterLayer( IdentifyResults *results, QgsRasterLayer *layer, QgsPoint point, QgsRectangle viewExtent, double mapUnitsPerPixel ); + bool identifyVectorLayer( IdentifyResults *results, QgsVectorLayer *layer, QgsPoint point ); //! Private helper virtual void convertMeasurement( QgsDistanceArea &calc, double &measure, QGis::UnitType &u, bool isArea ); @@ -170,8 +167,6 @@ class GUI_EXPORT QgsMapToolIdentify : public QgsMapTool QMap< QString, QString > featureDerivedAttributes( QgsFeature *feature, QgsMapLayer *layer ); - IdentifyResults mResultData; - // Last point in canvas CRS QgsPoint mLastPoint;