[Digikam-devel] extragear/libs/kipi-plugins/gpssync

Gilles Caulier caulier.gilles at gmail.com
Sat Feb 9 09:45:16 GMT 2008


SVN commit 772640 by cgilles:

kipi-plugins from trunk (KDE4) : digiKam has a new tool to edit a GPS track list using googlemaps ! 
More than one point can be edited over the ma at the same time...
A fresh screenshot of the tool in action is available here : http://digikam3rdparty.free.fr/Screenshots/gpstracklisteditor.png

BUG: 135451
BUG: 135386

CCMAIL: digikam-devel at kde.org
CCMAIL: kde-imaging at kde.org



 M  +7 -2      gpstracklistcontainer.h  
 M  +19 -7     gpstracklisteditdialog.cpp  
 M  +2 -0      gpstracklisteditdialog.h  
 M  +2 -10     gpstracklistviewitem.cpp  
 M  +1 -1      gpstracklistwidget.cpp  
 M  +51 -2     plugin_gpssync.cpp  


--- trunk/extragear/libs/kipi-plugins/gpssync/gpstracklistcontainer.h #772639:772640
@@ -44,11 +44,11 @@
 {
 public:
 
-    GPSTrackListItem(): m_id(0), m_url(KUrl()), m_gpsData(GPSDataContainer())
+    GPSTrackListItem(): m_dirty(false), m_id(0), m_url(KUrl()), m_gpsData(GPSDataContainer())
     {};
 
     GPSTrackListItem(const KUrl& url, const GPSDataContainer gpsData)
-                   : m_id(0), m_url(url), m_gpsData(gpsData)
+                   : m_dirty(false), m_id(0), m_url(url), m_gpsData(gpsData)
     {};
 
     ~GPSTrackListItem()
@@ -56,16 +56,19 @@
 
     GPSTrackListItem& operator=(const GPSTrackListItem& data)
     {
+        m_dirty    = data.isDirty();
         m_id       = data.id();
         m_url      = data.url();
         m_gpsData  = data.gpsData();
         return *this;
     };
 
+    void setDirty(bool dirty)                        { m_dirty    = dirty;   };
     void setId(int id)                               { m_id       = id;      };
     void setUrl(const KUrl& url)                     { m_url      = url;     };
     void setGPSData(const GPSDataContainer& gpsData) { m_gpsData  = gpsData; };
 
+    int       isDirty()  const       { return m_dirty;          };
     int       id()  const            { return m_id;             };
     KUrl      url() const            { return m_url;            };
     QString   fileName() const       { return m_url.fileName(); };
@@ -73,6 +76,8 @@
     
 private:
 
+    bool             m_dirty;
+
     int              m_id;
 
     KUrl             m_url;
--- trunk/extragear/libs/kipi-plugins/gpssync/gpstracklisteditdialog.cpp #772639:772640
@@ -116,7 +116,7 @@
     // ---------------------------------------------------------------
 
     vlay->addWidget(d->worldMap->view(), 10);
-    vlay->addWidget(d->listView, 3);
+    vlay->addWidget(d->listView, 4);
     vlay->setSpacing(spacingHint());
     vlay->setMargin(0);
 
@@ -172,6 +172,12 @@
     QTimer::singleShot(0, this, SLOT(slotUpdateWorldMap()));
 }
 
+GPSTrackListEditDialog::~GPSTrackListEditDialog()
+{
+    delete d->about;
+    delete d;
+}
+
 void GPSTrackListEditDialog::slotThumbnail(const KUrl& url, const QPixmap& pix)
 {
     Q3ListViewItemIterator it(d->listView);
@@ -187,15 +193,14 @@
     }
 }
 
-GPSTrackListEditDialog::~GPSTrackListEditDialog()
+void GPSTrackListEditDialog::slotHelp()
 {
-    delete d->about;
-    delete d;
+    KToolInvocation::invokeHelp("gpssync", "kipi-plugins");
 }
 
-void GPSTrackListEditDialog::slotHelp()
+GPSTrackList GPSTrackListEditDialog::trackList() const
 {
-    KToolInvocation::invokeHelp("gpssync", "kipi-plugins");
+    return d->gpsTrackList;
 }
 
 void GPSTrackListEditDialog::closeEvent(QCloseEvent *e)
@@ -269,11 +274,18 @@
             data.setLatitude(lat);
             data.setLongitude(lng);
             info.setGPSData(data);
+            info.setDirty(true);
             item->setData(item->dateTime(), info);
-            item->setDirty(true);
+
+            // Update track list info.
+            d->gpsTrackList.remove(item->dateTime());
+            d->gpsTrackList.insert(item->dateTime(), info);
+
+            // Refresh item in list view
             d->listView->repaintItem(item);
             d->listView->setCurrentItem(item);
             d->listView->ensureItemVisible(item);
+
             kDebug() << id << "::" << lat << "::" << lng << endl;
             return;
         }
--- trunk/extragear/libs/kipi-plugins/gpssync/gpstracklisteditdialog.h #772639:772640
@@ -48,6 +48,8 @@
 
     GPSTrackListEditDialog(KIPI::Interface *interface, QWidget *parent, const GPSTrackList& gpsTrackList);
     ~GPSTrackListEditDialog();
+    
+    GPSTrackList trackList() const;
 
 protected slots:
 
--- trunk/extragear/libs/kipi-plugins/gpssync/gpstracklistviewitem.cpp #772639:772640
@@ -44,11 +44,8 @@
 
     GPSTrackListViewItemPriv()
     {
-        dirty = false;
     }
 
-    bool             dirty;
-
     QDateTime        dateTime;
 
     GPSTrackListItem data;
@@ -66,15 +63,9 @@
     delete d;
 }
 
-void GPSTrackListViewItem::setDirty(bool dirty)
-{
-    d->dirty = dirty;
-    setText(7, d->dirty ? i18n("Yes") : i18n("No"));
-}
-
 bool GPSTrackListViewItem::isDirty() const
 {
-    return d->dirty;
+    return d->data.isDirty();
 }
 
 void GPSTrackListViewItem::setData(const QDateTime& dt, const GPSTrackListItem& data)
@@ -87,6 +78,7 @@
     setText(4, QString::number(d->data.gpsData().latitude(),  'g', 12));
     setText(5, QString::number(d->data.gpsData().longitude(), 'g', 12));
     setText(6, QString::number(d->data.gpsData().altitude(),  'g', 12));
+    setText(7, isDirty() ? i18n("Yes") : i18n("No"));
 }
 
 GPSTrackListItem GPSTrackListViewItem::gpsInfo() const
--- trunk/extragear/libs/kipi-plugins/gpssync/gpstracklistwidget.cpp #772639:772640
@@ -110,7 +110,7 @@
         QString latTxt = status.section(",", 1, 1);
         latTxt.remove(0, 5);
         QString lngTxt = status.section(",", 2, 2);
-        lngTxt.remove(0, 6);
+        lngTxt.remove(0, 5);
         int id     = idTxt.toInt();        
         double lat = latTxt.toDouble();
         double lng = lngTxt.toDouble();
--- trunk/extragear/libs/kipi-plugins/gpssync/plugin_gpssync.cpp #772639:772640
@@ -269,13 +269,13 @@
 
     double    alt, lat, lng;
     QDateTime dt;
+    KExiv2Iface::KExiv2 exiv2Iface;
     KIPIGPSSyncPlugin::GPSTrackList trackList;
     KUrl::List urls = images.images();
 
     for( KUrl::List::iterator it = urls.begin() ; 
         it != urls.end() ; ++it)
     {
-        KExiv2Iface::KExiv2 exiv2Iface;
         exiv2Iface.load((*it).path());
         if(exiv2Iface.getGPSInfo(alt, lat, lng))
         {
@@ -299,7 +299,56 @@
 
     if (dlg.exec() == KDialog::Accepted)
     {
-        // TODO
+        trackList = dlg.trackList();
+        KUrl::List  updatedURLs;
+        QStringList errorFiles;
+
+        for( KIPIGPSSyncPlugin::GPSTrackList::iterator it = trackList.begin() ; 
+            it != trackList.end() ; ++it)
+        {
+            if ((*it).isDirty())
+            {
+                KUrl url = (*it).url();
+    
+                // We only add all JPEG files as R/W because Exiv2 can't yet 
+                // update metadata on others file formats.
+    
+                QFileInfo fi(url.path());
+                QString ext = fi.suffix().toUpper();
+                bool ret    = false;
+                if (ext == QString("JPG") || ext == QString("JPEG") || ext == QString("JPE"))
+                {
+                    ret = true;
+                    ret &= exiv2Iface.load(url.path());
+                    if (ret)
+                    {
+                        ret &= exiv2Iface.setGPSInfo((*it).gpsData().altitude(), 
+                                                     (*it).gpsData().latitude(), 
+                                                     (*it).gpsData().longitude());
+                        ret &= exiv2Iface.save(url.path());
+                    }
+                }
+    
+                if (!ret)
+                    errorFiles.append(url.fileName());
+                else 
+                    updatedURLs.append(url);
+            }
+        }
+
+        // We use kipi interface refreshImages() method to tell to host than 
+        // metadata from pictures have changed and need to be re-readed.
+
+        m_interface->refreshImages(updatedURLs);
+
+        if (!errorFiles.isEmpty())
+        {
+            KMessageBox::errorList(
+                        kapp->activeWindow(),
+                        i18n("Unable to save geographical coordinates into:"),
+                        errorFiles,
+                        i18n("Edit Geographical Coordinates"));  
+        }
     }
 }
 



More information about the Digikam-devel mailing list