[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