Git commit 417f074c0f89c4ad889ad112cb17bf2631c5a233 by Tobias Leupold. Committed on 31/05/2015 at 21:09. Pushed by tleupold into branch 'gpssearch'. GPS coordinate search functionality for the search dialog as proposed by Re= imar Imhof. M +18 -8 AnnotationDialog/Dialog.cpp M +12 -1 DB/ImageInfo.cpp M +4 -0 DB/ImageInfo.h M +48 -0 DB/ImageSearchInfo.cpp M +16 -0 DB/ImageSearchInfo.h M +39 -0 Map/MapView.cpp M +6 -1 Map/MapView.h http://commits.kde.org/kphotoalbum/417f074c0f89c4ad889ad112cb17bf2631c5a233 diff --git a/AnnotationDialog/Dialog.cpp b/AnnotationDialog/Dialog.cpp index 62d8399..efd659c 100644 --- a/AnnotationDialog/Dialog.cpp +++ b/AnnotationDialog/Dialog.cpp @@ -749,6 +749,10 @@ DB::ImageSearchInfo AnnotationDialog::Dialog::search( = DB::ImageSearchInfo* searc m_oldSearch.setSearchMode( m_ratingSearchMode->currentIndex() ); m_oldSearch.setMegaPixel( m_megapixel->value() ); m_oldSearch.setSearchRAW( m_searchRAW->isChecked() ); +#ifdef HAVE_KGEOMAP + const KGeoMap::GeoCoordinates::Pair regionSelection =3D m_annotati= onMap->mapWidget()->getRegionSelection(); + m_oldSearch.setRegionSelection(regionSelection); +#endif return m_oldSearch; } else @@ -1596,19 +1600,25 @@ void AnnotationDialog::Dialog::mapLoadingFinished(b= ool mapHasImages, bool allIma if (m_setup =3D=3D InputSingleImageConfigMode) { m_annotationMap->displayStatus(Map::MapView::MapStatus::ImageHasNo= Coordinates); } else { - if (mapHasImages) { - if (! allImagesHaveCoordinates) { - m_annotationMap->displayStatus(Map::MapView::MapStatus::So= meImagesHaveNoCoordinates); + if (m_setup =3D=3D SearchMode) { + m_annotationMap->displayStatus(Map::MapView::MapStatus::Search= Coordinates); + } else { + if (mapHasImages) { + if (! allImagesHaveCoordinates) { + m_annotationMap->displayStatus(Map::MapView::MapStatus= ::SomeImagesHaveNoCoordinates); + } else { + m_annotationMap->displayStatus(Map::MapView::MapStatus= ::ImageHasCoordinates); + } } else { - m_annotationMap->displayStatus(Map::MapView::MapStatus::Im= ageHasCoordinates); + m_annotationMap->displayStatus(Map::MapView::MapStatus::No= ImagesHaveNoCoordinates); } - } else { - m_annotationMap->displayStatus(Map::MapView::MapStatus::NoImag= esHaveNoCoordinates); } } = - m_annotationMap->zoomToMarkers(); - updateMapForCurrentImage(); + if (m_setup !=3D SearchMode) { + m_annotationMap->zoomToMarkers(); + updateMapForCurrentImage(); + } } #endif = diff --git a/DB/ImageInfo.cpp b/DB/ImageInfo.cpp index b596033..a7ef696 100644 --- a/DB/ImageInfo.cpp +++ b/DB/ImageInfo.cpp @@ -464,6 +464,10 @@ void ImageInfo::readExif(const DB::FileName& fullPath,= DB::ExifMode mode) Exif::Database::instance()->remove( fullPath ); Exif::Database::instance()->add( fullPath ); #endif +#ifdef HAVE_KGEOMAP + // GPS coords might have changed... + m_coordsIsSet =3D false; +#endif } } = @@ -737,6 +741,10 @@ QRect DB::ImageInfo::areaForTag(QString category, QStr= ing tag) const #ifdef HAVE_KGEOMAP KGeoMap::GeoCoordinates DB::ImageInfo::coordinates() const { + if (m_coordsIsSet) { + return m_coordinates; + } + static const int EXIF_GPS_VERSIONID =3D 0; static const int EXIF_GPS_LATREF =3D 1; static const int EXIF_GPS_LAT =3D 2; @@ -799,7 +807,10 @@ KGeoMap::GeoCoordinates DB::ImageInfo::coordinates() c= onst } } } - return coords; + + m_coordinates =3D coords; + m_coordsIsSet =3D true; + return m_coordinates; } = #endif diff --git a/DB/ImageInfo.h b/DB/ImageInfo.h index e654911..39ffe6d 100644 --- a/DB/ImageInfo.h +++ b/DB/ImageInfo.h @@ -221,6 +221,10 @@ private: StackID m_stackId; unsigned int m_stackOrder; int m_videoLength; +#ifdef HAVE_KGEOMAP + mutable KGeoMap::GeoCoordinates m_coordinates; + mutable bool m_coordsIsSet =3D false; +#endif = // Cache information bool m_locked; diff --git a/DB/ImageSearchInfo.cpp b/DB/ImageSearchInfo.cpp index a9e1a29..f213706 100644 --- a/DB/ImageSearchInfo.cpp +++ b/DB/ImageSearchInfo.cpp @@ -169,6 +169,23 @@ bool ImageSearchInfo::match( ImageInfoPtr info ) const ok =3D ok && ( m_fnPattern.isEmpty() || m_fnPattern.indexIn( info->fileName().relative() ) !=3D -1 ); = + +#ifdef HAVE_KGEOMAP +// Search for GPS Position + if (ok && m_usingRegionSelection) { + ok =3D ok && info->coordinates().hasCoordinates(); + if (ok) { + float infoLat =3D info->coordinates().lat(); + float infoLon =3D info->coordinates().lon(); + ok =3D ok + && m_regionSelectionMinLat <=3D infoLat + && infoLat <=3D m_regionSelectionMaxLat + && m_regionSelectionMinLon <=3D infoLon + && infoLon <=3D m_regionSelectionMaxLon; + } + } +#endif + return ok; } = @@ -310,6 +327,10 @@ ImageSearchInfo::ImageSearchInfo( const ImageSearchInf= o& other ) #ifdef HAVE_EXIV2 m_exifSearchInfo =3D other.m_exifSearchInfo; #endif +#ifdef HAVE_KGEOMAP + m_regionSelection =3D other.m_regionSelection; +#endif + } = void ImageSearchInfo::compile() const @@ -317,6 +338,19 @@ void ImageSearchInfo::compile() const #ifdef HAVE_EXIV2 m_exifSearchInfo.search(); #endif +#ifdef HAVE_KGEOMAP + // Prepare Search for GPS Position + m_usingRegionSelection =3D m_regionSelection.first.hasCoordinates() &&= m_regionSelection.second.hasCoordinates(); + if (m_usingRegionSelection) { + using std::min; + using std::max; + m_regionSelectionMinLat =3D min(m_regionSelection.first.lat(), m_r= egionSelection.second.lat()); + m_regionSelectionMaxLat =3D max(m_regionSelection.first.lat(), m_r= egionSelection.second.lat()); + m_regionSelectionMinLon =3D min(m_regionSelection.first.lon(), m_r= egionSelection.second.lon()); + m_regionSelectionMaxLon =3D max(m_regionSelection.first.lon(), m_r= egionSelection.second.lon()); + } +#endif + deleteMatchers(); = for( QMap::ConstIterator it =3D m_categoryMatchText.b= egin(); it !=3D m_categoryMatchText.end(); ++it ) { @@ -539,4 +573,18 @@ void DB::ImageSearchInfo::renameCategory( const QStrin= g& oldName, const QString& m_categoryMatchText.remove( oldName ); m_compiled =3D false; } + +#ifdef HAVE_KGEOMAP +KGeoMap::GeoCoordinates::Pair ImageSearchInfo::regionSelection() const +{ + return m_regionSelection; +} + +void ImageSearchInfo::setRegionSelection(const KGeoMap::GeoCoordinates::Pa= ir& actRegionSelection) +{ + m_regionSelection =3D actRegionSelection; + m_compiled =3D false; +} +#endif + // vi:expandtab:tabstop=3D4 shiftwidth=3D4: diff --git a/DB/ImageSearchInfo.h b/DB/ImageSearchInfo.h index caff88d..e735e03 100644 --- a/DB/ImageSearchInfo.h +++ b/DB/ImageSearchInfo.h @@ -25,6 +25,8 @@ #include "Exif/SearchInfo.h" #include #include "Utilities/Set.h" +#include "config-kpa-kgeomap.h" +#include = namespace DB { @@ -79,6 +81,11 @@ public: void addExifSearchInfo( const Exif::SearchInfo info ); #endif = +#ifdef HAVE_KGEOMAP + KGeoMap::GeoCoordinates::Pair regionSelection() const; + void setRegionSelection(const KGeoMap::GeoCoordinates::Pair& actRegion= Selection); +#endif + protected: void compile() const; void deleteMatchers() const; @@ -103,6 +110,15 @@ private: #ifdef HAVE_EXIV2 Exif::SearchInfo m_exifSearchInfo; #endif + +#ifdef HAVE_KGEOMAP + KGeoMap::GeoCoordinates::Pair m_regionSelection; + mutable bool m_usingRegionSelection =3D false; + mutable float m_regionSelectionMinLat; + mutable float m_regionSelectionMaxLat; + mutable float m_regionSelectionMinLon; + mutable float m_regionSelectionMaxLon; +#endif // When adding new instance variable, please notice that this class as= an explicit written copy constructor. }; = diff --git a/Map/MapView.cpp b/Map/MapView.cpp index 6d10319..edf1c3b 100644 --- a/Map/MapView.cpp +++ b/Map/MapView.cpp @@ -69,6 +69,12 @@ Map::MapView::MapView(QWidget* parent, UsageType type) := QWidget(parent) m_mapWidget->addWidgetToControlWidget(m_setLastCenterButton); connect(m_setLastCenterButton, SIGNAL(clicked()), this, SLOT(setLastCe= nter())); = + m_DeleteSearchRegionButton =3D new QPushButton; + m_DeleteSearchRegionButton->setIcon(QPixmap(SmallIcon(QString::fromUtf= 8("edit-delete")))); + m_DeleteSearchRegionButton->setToolTip(i18n("Remove Search Region")); + m_mapWidget->addWidgetToControlWidget(m_DeleteSearchRegionButton); + connect(m_DeleteSearchRegionButton, SIGNAL(clicked()), this, SLOT(dele= teSearchRegion())); + // We first try set the default backend "marble" or the first one avai= lable ... const QString defaultBackend =3D QString::fromUtf8("marble"); auto backends =3D m_mapWidget->availableBackends(); @@ -148,9 +154,16 @@ void Map::MapView::displayStatus(MapStatus status) m_statusLabel->setText(i18n("Loading coordinates from the image= s ...")); m_statusLabel->show(); m_mapWidget->hide(); + m_DeleteSearchRegionButton->hide(); + m_mapWidget->clearRegionSelection(); m_setLastCenterButton->setEnabled(false); } else if (status =3D=3D MapStatus::ImageHasCoordinates) { m_statusLabel->hide(); + m_mapWidget->setAvailableMouseModes(KGeoMap::MouseModePan); + m_mapWidget->setVisibleMouseModes(KGeoMap::MouseModePan); + m_mapWidget->setMouseMode(KGeoMap::MouseModePan); + m_DeleteSearchRegionButton->hide(); + m_mapWidget->clearRegionSelection(); m_mapWidget->show(); m_setLastCenterButton->setEnabled(true); } else if (status =3D=3D MapStatus::ImageHasNoCoordinates) { @@ -162,6 +175,21 @@ void Map::MapView::displayStatus(MapStatus status) m_statusLabel->setText(i18n("Some of the selected images do not= contain geographic " "coordinates.")); m_statusLabel->show(); + m_mapWidget->setAvailableMouseModes(KGeoMap::MouseModePan); + m_mapWidget->setVisibleMouseModes(KGeoMap::MouseModePan); + m_mapWidget->setMouseMode(KGeoMap::MouseModePan); + m_DeleteSearchRegionButton->hide(); + m_mapWidget->clearRegionSelection(); + m_mapWidget->show(); + m_setLastCenterButton->setEnabled(true); + } else if (status =3D=3D MapStatus::SearchCoordinates) { + m_statusLabel->setText(i18n("Search geographic " + "coordinates.")); + m_statusLabel->show(); + m_mapWidget->setAvailableMouseModes(KGeoMap::MouseModePan|KGeoMap:= :MouseModeRegionSelection); + m_mapWidget->setVisibleMouseModes(KGeoMap::MouseModePan|KGeoMap::M= ouseModeRegionSelection); + m_mapWidget->setMouseMode(KGeoMap::MouseModePan); + m_DeleteSearchRegionButton->show(); m_mapWidget->show(); m_setLastCenterButton->setEnabled(true); } else if (status =3D=3D MapStatus::NoImagesHaveNoCoordinates) { @@ -169,6 +197,7 @@ void Map::MapView::displayStatus(MapStatus status) "coordinates.")); m_statusLabel->show(); m_mapWidget->hide(); + m_DeleteSearchRegionButton->hide(); m_setLastCenterButton->setEnabled(false); } } @@ -178,4 +207,14 @@ void Map::MapView::setLastCenter() m_mapWidget->setCenter(m_lastCenter); } = +void Map::MapView::deleteSearchRegion() +{ + m_mapWidget->clearRegionSelection(); +} + +KGeoMap::KGeoMapWidget* Map::MapView::mapWidget() +{ + return m_mapWidget; +} + // vi:expandtab:tabstop=3D4 shiftwidth=3D4: diff --git a/Map/MapView.h b/Map/MapView.h index bb5f62b..a762a7d 100644 --- a/Map/MapView.h +++ b/Map/MapView.h @@ -65,7 +65,8 @@ public: ImageHasCoordinates, ImageHasNoCoordinates, NoImagesHaveNoCoordinates, - SomeImagesHaveNoCoordinates + SomeImagesHaveNoCoordinates, + SearchCoordinates }; = explicit MapView( QWidget* parent =3D 0, UsageType type =3D InlineMapV= iew); @@ -98,6 +99,8 @@ public: */ void displayStatus(MapStatus status); = + KGeoMap::KGeoMapWidget* mapWidget(); + public slots: /** * Centers the map on the coordinates of the given image. @@ -108,6 +111,7 @@ public slots: private slots: void saveSettings(); void setLastCenter(); + void deleteSearchRegion(); = private: // Variables KGeoMap::KGeoMapWidget* m_mapWidget; @@ -115,6 +119,7 @@ private: // Variables MapMarkerModelHelper* m_modelHelper; QLabel* m_statusLabel; QPushButton* m_setLastCenterButton; + QPushButton* m_DeleteSearchRegionButton; KGeoMap::GeoCoordinates m_lastCenter; }; =20