00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include <qgsmapcanvas.h>
00017 #include <qgsmaplayer.h>
00018 #include <qgsvectordataprovider.h>
00019 #include <qgsfield.h>
00020
00021
00022 #include <QPoint>
00023 #include <QToolTip>
00024 #include <QSettings>
00025
00026 #include "qgsmaptip.h"
00027
00028 QgsMapTip::QgsMapTip()
00029 {
00030
00031 mMapTipVisible = false;
00032 }
00033
00034 QgsMapTip::~QgsMapTip()
00035 {
00036
00037 }
00038
00039 void QgsMapTip::showMapTip( QgsMapLayer * thepLayer,
00040 QgsPoint & theMapPosition,
00041 QPoint & thePixelPosition,
00042 QgsMapCanvas *thepMapCanvas )
00043 {
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 QString myTipText = fetchFeature( thepLayer, theMapPosition, thepMapCanvas );
00054 if ( myTipText.length() > 0 )
00055 {
00056 mMapTipVisible = true;
00057 QToolTip::showText( thepMapCanvas->mapToGlobal( thePixelPosition ), myTipText, thepMapCanvas );
00058
00059 mLastPosition = thePixelPosition;
00060 }
00061 else
00062 {
00063 mMapTipVisible = false;
00064 }
00065
00066 }
00067
00068 void QgsMapTip::clear( QgsMapCanvas *mpMapCanvas )
00069 {
00070 if ( mMapTipVisible )
00071 {
00072
00073 QToolTip::showText( mpMapCanvas->mapToGlobal( mLastPosition ), "", mpMapCanvas );
00074
00075 mMapTipVisible = false;
00076 }
00077 }
00078
00079 QString QgsMapTip::fetchFeature( QgsMapLayer *layer, QgsPoint & mapPosition, QgsMapCanvas *mpMapCanvas )
00080 {
00081
00082 QString maptipText = "";
00083
00084 if ( layer )
00085 {
00086
00087 QSettings settings;
00088 double identifyValue = settings.value( "/Map/identifyRadius", QGis::DEFAULT_IDENTIFY_RADIUS ).toDouble();
00089
00090
00091 double searchRadius = mpMapCanvas->extent().width() * ( identifyValue / 100.0 );
00092 QgsRectangle r;
00093 r.setXMinimum( mapPosition.x() - searchRadius );
00094 r.setXMaximum( mapPosition.x() + searchRadius );
00095 r.setYMinimum( mapPosition.y() - searchRadius );
00096 r.setYMaximum( mapPosition.y() + searchRadius );
00097
00098
00099 QgsVectorDataProvider* dataProvider = qobject_cast<QgsVectorLayer *>( layer )->dataProvider();
00100
00101 QgsAttributeList allAttributes = dataProvider->attributeIndexes();
00102
00103 dataProvider->select( allAttributes, r, true, true );
00104
00105 QgsFeature feature;
00106
00107 const QgsFieldMap& fields = dataProvider->fields();
00108
00109 QString fieldIndex = qobject_cast<QgsVectorLayer *>( layer )->displayField();
00110 if ( dataProvider->nextFeature( feature ) )
00111 {
00112
00113 QgsAttributeMap attributes = feature.attributeMap();
00114 for ( QgsAttributeMap::const_iterator it = attributes.begin(); it != attributes.end(); ++it )
00115 {
00116
00117 if ( fields[it.key()].name() == fieldIndex )
00118 {
00119 maptipText = it->toString();
00120
00121 }
00122
00123 }
00124 }
00125 }
00126
00127 return maptipText;
00128 }
00129