[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [kphotoalbum/gpssearch] /: GPS coordinate search functionality for the search dialog as proposed by
From: Tobias Leupold <tobias.leupold () web ! de>
Date: 2015-05-31 21:09:46
Message-ID: E1YzAUM-0006Yz-1K () scm ! kde ! org
[Download RAW message or body]
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 Reimar \
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 = \
m_annotationMap->mapWidget()->getRegionSelection(); + \
m_oldSearch.setRegionSelection(regionSelection); +#endif
return m_oldSearch;
}
else
@@ -1596,19 +1600,25 @@ void AnnotationDialog::Dialog::mapLoadingFinished(bool \
mapHasImages, bool allIma if (m_setup == InputSingleImageConfigMode) {
m_annotationMap->displayStatus(Map::MapView::MapStatus::ImageHasNoCoordinates);
} else {
- if (mapHasImages) {
- if (! allImagesHaveCoordinates) {
- m_annotationMap->displayStatus(Map::MapView::MapStatus::SomeImagesHaveNoCoordinates);
+ if (m_setup == SearchMode) {
+ m_annotationMap->displayStatus(Map::MapView::MapStatus::SearchCoordinates);
+ } 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::ImageHasCoordinates);
+ m_annotationMap->displayStatus(Map::MapView::MapStatus::NoImagesHaveNoCoordinates);
}
- } else {
- m_annotationMap->displayStatus(Map::MapView::MapStatus::NoImagesHaveNoCoordinates);
}
}
- m_annotationMap->zoomToMarkers();
- updateMapForCurrentImage();
+ if (m_setup != 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 = false;
+#endif
}
}
@@ -737,6 +741,10 @@ QRect DB::ImageInfo::areaForTag(QString category, QString tag) \
const #ifdef HAVE_KGEOMAP
KGeoMap::GeoCoordinates DB::ImageInfo::coordinates() const
{
+ if (m_coordsIsSet) {
+ return m_coordinates;
+ }
+
static const int EXIF_GPS_VERSIONID = 0;
static const int EXIF_GPS_LATREF = 1;
static const int EXIF_GPS_LAT = 2;
@@ -799,7 +807,10 @@ KGeoMap::GeoCoordinates DB::ImageInfo::coordinates() const
}
}
}
- return coords;
+
+ m_coordinates = coords;
+ m_coordsIsSet = 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 = 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 = ok && ( m_fnPattern.isEmpty() ||
m_fnPattern.indexIn( info->fileName().relative() ) != -1 );
+
+#ifdef HAVE_KGEOMAP
+// Search for GPS Position
+ if (ok && m_usingRegionSelection) {
+ ok = ok && info->coordinates().hasCoordinates();
+ if (ok) {
+ float infoLat = info->coordinates().lat();
+ float infoLon = info->coordinates().lon();
+ ok = ok
+ && m_regionSelectionMinLat <= infoLat
+ && infoLat <= m_regionSelectionMaxLat
+ && m_regionSelectionMinLon <= infoLon
+ && infoLon <= m_regionSelectionMaxLon;
+ }
+ }
+#endif
+
return ok;
}
@@ -310,6 +327,10 @@ ImageSearchInfo::ImageSearchInfo( const ImageSearchInfo& other )
#ifdef HAVE_EXIV2
m_exifSearchInfo = other.m_exifSearchInfo;
#endif
+#ifdef HAVE_KGEOMAP
+ m_regionSelection = 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 = m_regionSelection.first.hasCoordinates() && \
m_regionSelection.second.hasCoordinates(); + if (m_usingRegionSelection) {
+ using std::min;
+ using std::max;
+ m_regionSelectionMinLat = min(m_regionSelection.first.lat(), \
m_regionSelection.second.lat()); + m_regionSelectionMaxLat = \
max(m_regionSelection.first.lat(), m_regionSelection.second.lat()); + \
m_regionSelectionMinLon = min(m_regionSelection.first.lon(), \
m_regionSelection.second.lon()); + m_regionSelectionMaxLon = \
max(m_regionSelection.first.lon(), m_regionSelection.second.lon()); + }
+#endif
+
deleteMatchers();
for( QMap<QString,QString>::ConstIterator it = m_categoryMatchText.begin(); it \
!= m_categoryMatchText.end(); ++it ) { @@ -539,4 +573,18 @@ void \
DB::ImageSearchInfo::renameCategory( const QString& oldName, const QString& \
m_categoryMatchText.remove( oldName ); m_compiled = false;
}
+
+#ifdef HAVE_KGEOMAP
+KGeoMap::GeoCoordinates::Pair ImageSearchInfo::regionSelection() const
+{
+ return m_regionSelection;
+}
+
+void ImageSearchInfo::setRegionSelection(const KGeoMap::GeoCoordinates::Pair& \
actRegionSelection) +{
+ m_regionSelection = actRegionSelection;
+ m_compiled = false;
+}
+#endif
+
// vi:expandtab:tabstop=4 shiftwidth=4:
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 <config-kpa-exiv2.h>
#include "Utilities/Set.h"
+#include "config-kpa-kgeomap.h"
+#include <libkgeomap/geocoordinates.h>
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& \
actRegionSelection); +#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 = 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(setLastCenter()));
+ m_DeleteSearchRegionButton = new QPushButton;
+ m_DeleteSearchRegionButton->setIcon(QPixmap(SmallIcon(QString::fromUtf8("edit-delete"))));
+ m_DeleteSearchRegionButton->setToolTip(i18n("Remove Search Region"));
+ m_mapWidget->addWidgetToControlWidget(m_DeleteSearchRegionButton);
+ connect(m_DeleteSearchRegionButton, SIGNAL(clicked()), this, \
SLOT(deleteSearchRegion())); +
// We first try set the default backend "marble" or the first one available ...
const QString defaultBackend = QString::fromUtf8("marble");
auto backends = m_mapWidget->availableBackends();
@@ -148,9 +154,16 @@ void Map::MapView::displayStatus(MapStatus status)
m_statusLabel->setText(i18n("<i>Loading coordinates from the images \
...</i>")); m_statusLabel->show();
m_mapWidget->hide();
+ m_DeleteSearchRegionButton->hide();
+ m_mapWidget->clearRegionSelection();
m_setLastCenterButton->setEnabled(false);
} else if (status == 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 == MapStatus::ImageHasNoCoordinates) {
@@ -162,6 +175,21 @@ void Map::MapView::displayStatus(MapStatus status)
m_statusLabel->setText(i18n("<i>Some of the selected images do not contain \
geographic " "coordinates.</i>"));
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 == MapStatus::SearchCoordinates) {
+ m_statusLabel->setText(i18n("<i>Search geographic "
+ "coordinates.</i>"));
+ m_statusLabel->show();
+ m_mapWidget->setAvailableMouseModes(KGeoMap::MouseModePan|KGeoMap::MouseModeRegionSelection);
+ m_mapWidget->setVisibleMouseModes(KGeoMap::MouseModePan|KGeoMap::MouseModeRegionSelection);
+ m_mapWidget->setMouseMode(KGeoMap::MouseModePan);
+ m_DeleteSearchRegionButton->show();
m_mapWidget->show();
m_setLastCenterButton->setEnabled(true);
} else if (status == MapStatus::NoImagesHaveNoCoordinates) {
@@ -169,6 +197,7 @@ void Map::MapView::displayStatus(MapStatus status)
"coordinates.</i>"));
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=4 shiftwidth=4:
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 = 0, UsageType type = InlineMapView);
@@ -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;
};
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic