return results directly from the identify method instead of using a private attribute

This commit is contained in:
Denis Rouzaud 2013-02-05 15:41:29 +01:00
parent cb7f7bfd8b
commit 24ca94bdae
4 changed files with 37 additions and 57 deletions

View File

@ -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 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. @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.*/ @return true if identification succeeded and a feature has been found, false otherwise.*/
bool identify(int x, int y, QList<QgsMapLayer*> layerList = QList<QgsMapLayer*>(), IdentifyMode mode = DefaultQgsSetting); IdentifyResults identify(int x, int y, QList<QgsMapLayer*> layerList = QList<QgsMapLayer*>(), IdentifyMode mode = DefaultQgsSetting);
/** Performs the identification. /** Performs the identification.
To avoid beeing forced to specify IdentifyMode with a list of layers 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 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. @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.*/ @return true if identification succeeded and a feature has been found, false otherwise.*/
bool identify(int x, int y, IdentifyMode mode, LayerType layerType = AllLayers); IdentifyResults identify(int x, int y, IdentifyMode mode, LayerType layerType = AllLayers);
/** Access to results */
IdentifyResults &results();
signals: signals:
void identifyProgress( int, int ); void identifyProgress( int, int );

View File

@ -93,23 +93,23 @@ void QgsMapToolIdentifyAction::canvasReleaseEvent( QMouseEvent *e )
connect( this, SIGNAL( identifyProgress( int, int ) ), QgisApp::instance(), SLOT( showProgress( int, int ) ) ); connect( this, SIGNAL( identifyProgress( int, int ) ), QgisApp::instance(), SLOT( showProgress( int, int ) ) );
connect( this, SIGNAL( identifyMessage( QString ) ), QgisApp::instance(), SLOT( showStatusMessage( QString ) ) ); 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( identifyProgress( int, int ) ), QgisApp::instance(), SLOT( showProgress( int, int ) ) );
disconnect( this, SIGNAL( identifyMessage( QString ) ), QgisApp::instance(), SLOT( showStatusMessage( QString ) ) ); disconnect( this, SIGNAL( identifyMessage( QString ) ), QgisApp::instance(), SLOT( showStatusMessage( QString ) ) );
QList<VectorResult>::const_iterator vresult; QList<VectorResult>::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 ); resultsDialog()->addFeature( vresult->mLayer, vresult->mFeature, vresult->mDerivedAttributes );
} }
QList<RasterResult>::const_iterator rresult; QList<RasterResult>::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 ); 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(); resultsDialog()->show();
} }

View File

@ -68,35 +68,29 @@ void QgsMapToolIdentify::canvasReleaseEvent( QMouseEvent *e )
Q_UNUSED( e ); Q_UNUSED( e );
} }
bool QgsMapToolIdentify::identify( int x, int y, QList<QgsMapLayer *> layerList, IdentifyMode mode ) QgsMapToolIdentify::IdentifyResults QgsMapToolIdentify::identify ( int x, int y, QList<QgsMapLayer *> layerList, IdentifyMode mode )
{ {
return identify( x, y, mode, layerList, AllLayers ); 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<QgsMapLayer*>(), layerType ); return identify( x, y, mode, QList<QgsMapLayer*>(), layerType );
} }
bool QgsMapToolIdentify::identify( int x, int y, IdentifyMode mode, QList<QgsMapLayer*> layerList, LayerType layerType ) QgsMapToolIdentify::IdentifyResults QgsMapToolIdentify::identify( int x, int y, IdentifyMode mode, QList<QgsMapLayer*> layerList, LayerType layerType )
{ {
IdentifyResults results;
mLastPoint = mCanvas->getCoordinateTransform()->toMapCoordinates( x, y ); mLastPoint = mCanvas->getCoordinateTransform()->toMapCoordinates( x, y );
mLastExtent = mCanvas->extent(); mLastExtent = mCanvas->extent();
mLastMapUnitsPerPixel = mCanvas->mapUnitsPerPixel(); mLastMapUnitsPerPixel = mCanvas->mapUnitsPerPixel();
return identify( mLastPoint, mLastExtent, mLastMapUnitsPerPixel, mode, layerList, layerType );
}
bool QgsMapToolIdentify::identify( QgsPoint point, QgsRectangle viewExtent, double mapUnitsPerPixel, IdentifyMode mode, QList<QgsMapLayer*> layerList, LayerType layerType )
{
bool res = false;
if ( !mCanvas || mCanvas->isDrawing() ) if ( !mCanvas || mCanvas->isDrawing() )
{ {
return res; return results;
} }
mResultData.mVectorResults.clear();
mResultData.mRasterResults.clear();
if ( mode == DefaultQgsSetting ) if ( mode == DefaultQgsSetting )
{ {
QSettings settings; QSettings settings;
@ -110,12 +104,12 @@ bool QgsMapToolIdentify::identify( QgsPoint point, QgsRectangle viewExtent, doub
if ( !layer ) if ( !layer )
{ {
emit identifyMessage( tr( "No active layer. To identify features, you must choose an active layer." ) ); emit identifyMessage( tr( "No active layer. To identify features, you must choose an active layer." ) );
return res; return results;
} }
QApplication::setOverrideCursor( Qt::WaitCursor ); QApplication::setOverrideCursor( Qt::WaitCursor );
res = identifyLayer( layer, point, viewExtent, mapUnitsPerPixel, layerType ); identifyLayer( &results, layer, mLastPoint, mLastExtent, mLastMapUnitsPerPixel, layerType );
} }
else else
{ {
@ -145,9 +139,8 @@ bool QgsMapToolIdentify::identify( QgsPoint point, QgsRectangle viewExtent, doub
if ( noIdentifyLayerIdList.contains( layer->id() ) ) if ( noIdentifyLayerIdList.contains( layer->id() ) )
continue; continue;
if ( identifyLayer( layer, point, viewExtent, mapUnitsPerPixel, layerType ) ) if ( identifyLayer( &results, layer, mLastPoint, mLastExtent, mLastMapUnitsPerPixel, layerType ) )
{ {
res = true;
if ( mode == TopDownStopAtFirst ) if ( mode == TopDownStopAtFirst )
break; break;
} }
@ -159,7 +152,7 @@ bool QgsMapToolIdentify::identify( QgsPoint point, QgsRectangle viewExtent, doub
QApplication::restoreOverrideCursor(); QApplication::restoreOverrideCursor();
return res; return results;
} }
void QgsMapToolIdentify::activate() void QgsMapToolIdentify::activate()
@ -172,15 +165,15 @@ void QgsMapToolIdentify::deactivate()
QgsMapTool::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 ) ) if ( layer->type() == QgsMapLayer::RasterLayer && ( layerType == AllLayers || layerType == RasterLayer ) )
{ {
return identifyRasterLayer( qobject_cast<QgsRasterLayer *>( layer ), point, viewExtent, mapUnitsPerPixel, mResultData.mRasterResults ); return identifyRasterLayer( results, qobject_cast<QgsRasterLayer *>( layer ), point, viewExtent, mapUnitsPerPixel );
} }
else if ( layer->type() == QgsMapLayer::VectorLayer && ( layerType == AllLayers || layerType == VectorLayer ) ) else if ( layer->type() == QgsMapLayer::VectorLayer && ( layerType == AllLayers || layerType == VectorLayer ) )
{ {
return identifyVectorLayer( qobject_cast<QgsVectorLayer *>( layer ), point ); return identifyVectorLayer( results, qobject_cast<QgsVectorLayer *>( layer ), point );
} }
else 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 ) if ( !layer )
return false; return false;
@ -210,7 +202,6 @@ bool QgsMapToolIdentify::identifyVectorLayer( QgsVectorLayer *layer, QgsPoint po
QSettings settings; QSettings settings;
double identifyValue = settings.value( "/Map/identifyRadius", QGis::DEFAULT_IDENTIFY_RADIUS ).toDouble(); double identifyValue = settings.value( "/Map/identifyRadius", QGis::DEFAULT_IDENTIFY_RADIUS ).toDouble();
if ( identifyValue <= 0.0 ) if ( identifyValue <= 0.0 )
identifyValue = QGis::DEFAULT_IDENTIFY_RADIUS; 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 ) ); 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 ) if ( renderer && renderer->capabilities() & QgsFeatureRendererV2::ScaleDependent )
@ -348,7 +339,7 @@ QMap< QString, QString > QgsMapToolIdentify::featureDerivedAttributes( QgsFeatur
return derivedAttributes; return derivedAttributes;
} }
bool QgsMapToolIdentify::identifyRasterLayer( QgsRasterLayer *layer, QgsPoint point, QgsRectangle viewExtent, double mapUnitsPerPixel, QList<RasterResult>& rasterResults ) bool QgsMapToolIdentify::identifyRasterLayer( IdentifyResults *results, QgsRasterLayer *layer, QgsPoint point, QgsRectangle viewExtent, double mapUnitsPerPixel )
{ {
QgsDebugMsg( "point = " + point.toString() ); QgsDebugMsg( "point = " + point.toString() );
if ( !layer ) return false; if ( !layer ) return false;
@ -442,7 +433,7 @@ bool QgsMapToolIdentify::identifyRasterLayer( QgsRasterLayer *layer, QgsPoint po
attributes.insert( dprovider->generateBandName( bandNo ), valueString ); attributes.insert( dprovider->generateBandName( bandNo ), valueString );
} }
QString label = layer->name(); QString label = layer->name();
rasterResults.append( RasterResult( layer, label, attributes, derivedAttributes ) ); results->mRasterResults.append( RasterResult( layer, label, attributes, derivedAttributes ) );
} }
else if ( format == QgsRasterDataProvider::IdentifyFormatFeature ) else if ( format == QgsRasterDataProvider::IdentifyFormatFeature )
{ {
@ -476,7 +467,7 @@ bool QgsMapToolIdentify::identifyRasterLayer( QgsRasterLayer *layer, QgsPoint po
QMap< QString, QString > derAttributes = derivedAttributes; QMap< QString, QString > derAttributes = derivedAttributes;
derAttributes.unite( featureDerivedAttributes( &feature, layer ) ); 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 ); attributes.insert( "", value );
QString label = layer->subLayers().value( bandNo ); 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(); return mCanvas->mapUnits();
} }
QgsMapToolIdentify::IdentifyResults &QgsMapToolIdentify::results()
{
return mResultData;
}
void QgsMapToolIdentify::formatChanged( QgsRasterLayer *layer ) void QgsMapToolIdentify::formatChanged( QgsRasterLayer *layer )
{ {
QgsDebugMsg( "Entered" ); QgsDebugMsg( "Entered" );
QList<RasterResult> rasterResults; IdentifyResults results;
identifyRasterLayer( layer, mLastPoint, mLastExtent, mLastMapUnitsPerPixel, rasterResults ); if ( identifyRasterLayer( &results, layer, mLastPoint, mLastExtent, mLastMapUnitsPerPixel ) )
emit changedRasterResults( rasterResults ); {
emit changedRasterResults( results.mRasterResults );
}
} }

View File

@ -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 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. @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.*/ @return true if identification succeeded and a feature has been found, false otherwise.*/
bool identify( int x, int y, QList<QgsMapLayer*> layerList = QList<QgsMapLayer*>(), IdentifyMode mode = DefaultQgsSetting ); IdentifyResults identify( int x, int y, QList<QgsMapLayer*> layerList = QList<QgsMapLayer*>(), IdentifyMode mode = DefaultQgsSetting );
/** Performs the identification. /** Performs the identification.
To avoid beeing forced to specify IdentifyMode with a list of layers 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 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. @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.*/ @return true if identification succeeded and a feature has been found, false otherwise.*/
bool identify( int x, int y, IdentifyMode mode, LayerType layerType = AllLayers ); IdentifyResults identify( int x, int y, IdentifyMode mode, LayerType layerType = AllLayers );
/** Access to results */
IdentifyResults &results();
public slots: public slots:
void formatChanged( QgsRasterLayer *layer ); 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 layerList Performs the identification within the given list of layers.
@param layerType Only performs identification in a certain type of layers (raster, vector). @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.*/ @return true if identification succeeded and a feature has been found, false otherwise.*/
bool identify( int x, int y, IdentifyMode mode, QList<QgsMapLayer*> layerList, LayerType layerType = AllLayers ); IdentifyResults identify( int x, int y, IdentifyMode mode, QList<QgsMapLayer*> layerList, LayerType layerType = AllLayers );
bool identify( QgsPoint point, QgsRectangle viewExtent, double mapUnitsPerPixel, IdentifyMode mode, QList<QgsMapLayer*> 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( IdentifyResults *results, QgsRasterLayer *layer, QgsPoint point, QgsRectangle viewExtent, double mapUnitsPerPixel );
bool identifyRasterLayer( QgsRasterLayer *layer, QgsPoint point, QgsRectangle viewExtent, double mapUnitsPerPixel, QList<RasterResult>& rasterResults ); bool identifyVectorLayer( IdentifyResults *results, QgsVectorLayer *layer, QgsPoint point );
bool identifyVectorLayer( QgsVectorLayer *layer, QgsPoint point );
//! Private helper //! Private helper
virtual void convertMeasurement( QgsDistanceArea &calc, double &measure, QGis::UnitType &u, bool isArea ); 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 ); QMap< QString, QString > featureDerivedAttributes( QgsFeature *feature, QgsMapLayer *layer );
IdentifyResults mResultData;
// Last point in canvas CRS // Last point in canvas CRS
QgsPoint mLastPoint; QgsPoint mLastPoint;