[Digikam-devel] extragear/graphics/digikam/libs/imageproperties
Gilles Caulier
caulier.gilles at gmail.com
Thu Apr 3 18:21:49 BST 2008
SVN commit 793334 by cgilles:
digiKam from trunk : Marble widget integration into right sidebar as new Geolocation of picture!
A screenshot of digiKam using Marble can be seen here:
http://digikam3rdparty.free.fr/Screenshots/marbleintegrationforphotogeolocation.png
CCMAIL: digikam-devel at kde.org
BUG: 138290
M +5 -5 imagepropertiesgpstab.cpp
M +2 -2 imagepropertiesgpstab.h
M +1 -1 imagepropertiessidebarcamgui.cpp
M +2 -1 imagepropertiessidebardb.cpp
M +79 -95 worldmapwidget.cpp
M +13 -16 worldmapwidget.h
--- trunk/extragear/graphics/digikam/libs/imageproperties/imagepropertiesgpstab.cpp #793333:793334
@@ -238,15 +238,15 @@
}
DMetadata meta(url.path());
- setMetadata(meta);
+ setMetadata(meta, url);
}
-void ImagePropertiesGPSTab::setMetadata(const DMetadata& meta)
+void ImagePropertiesGPSTab::setMetadata(const DMetadata& meta, const KUrl& url)
{
double alt, lat, lon;
QDateTime dt = meta.getImageDateTime();
if (meta.getGPSInfo(alt, lat, lon))
- setGPSInfo(lat, lon, alt, dt);
+ setGPSInfo(lat, lon, alt, dt, url);
else
setGPSInfo();
}
@@ -260,14 +260,14 @@
setEnabled(false);
}
-void ImagePropertiesGPSTab::setGPSInfo(double lat, double lon, long alt, const QDateTime& dt)
+void ImagePropertiesGPSTab::setGPSInfo(double lat, double lon, long alt, const QDateTime& dt, const KUrl& url)
{
d->altitude->setText(QString("%1 m").arg(QString::number(alt)));
d->latitude->setText(QString::number(lat));
d->longitude->setText(QString::number(lon));
d->date->setText(KGlobal::locale()->formatDateTime(dt, KLocale::ShortDate, true));
setEnabled(true);
- d->map->setGPSPosition(lat, lon);
+ d->map->setGPSPosition(lat, lon, alt, dt, url);
}
} // namespace Digikam
--- trunk/extragear/graphics/digikam/libs/imageproperties/imagepropertiesgpstab.h #793333:793334
@@ -64,10 +64,10 @@
~ImagePropertiesGPSTab();
void setGPSInfo();
- void setGPSInfo(double lat, double lon, long alt, const QDateTime& dt);
+ void setGPSInfo(double lat, double lon, long alt, const QDateTime& dt, const KUrl& url);
void setCurrentURL(const KUrl& url=KUrl());
- void setMetadata(const DMetadata& meta);
+ void setMetadata(const DMetadata& meta, const KUrl& url);
int getWebGPSLocator();
void setWebGPSLocator(int locator);
--- trunk/extragear/graphics/digikam/libs/imageproperties/imagepropertiessidebarcamgui.cpp #793333:793334
@@ -179,7 +179,7 @@
}
else if (tab == d->gpsTab && !d->dirtyGpsTab)
{
- d->gpsTab->setMetadata(d->metaData);
+ d->gpsTab->setMetadata(d->metaData, d->currentURL);
d->dirtyGpsTab = true;
}
--- trunk/extragear/graphics/digikam/libs/imageproperties/imagepropertiessidebardb.cpp #793333:793334
@@ -281,7 +281,8 @@
m_gpsTab->setGPSInfo(pos.latitudeNumber(),
pos.longitudeNumber(),
pos.altitude(),
- d->currentInfos.first().dateTime());
+ d->currentInfos.first().dateTime(),
+ d->currentInfos.first().fileUrl());
m_dirtyGpsTab = true;
}
}
--- trunk/extragear/graphics/digikam/libs/imageproperties/worldmapwidget.cpp #793333:793334
@@ -23,17 +23,16 @@
// Qt includes.
-#include <QPainter>
-#include <QString>
-#include <QPixmap>
-#include <QLabel>
-#include <QFrame>
+#include <QVBoxLayout>
+#include <QStyle>
+#include <QDomDocument>
+#include <QTextStream>
+#include <QFile>
// KDE includes.
-#include <kstandarddirs.h>
-#include <kcursor.h>
-#include <klocale.h>
+#include <ktemporaryfile.h>
+#include <marble/MarbleWidget.h>
// Local includes.
@@ -51,33 +50,39 @@
WorldMapWidgetPriv()
{
- latitude = 0;
- longitude = 0;
+ latitude = 0;
+ longitude = 0;
+ altitude = 0;
+ marbleWidget = 0;
}
- int xPos;
- int yPos;
- int xMousePos;
- int yMousePos;
+ double latitude;
+ double longitude;
+ double altitude;
- double latitude;
- double longitude;
-};
+ QDateTime dt;
-K_GLOBAL_STATIC(QPixmap, worldMap)
+ KUrl url;
+ MarbleWidget *marbleWidget;
+};
+
WorldMapWidget::WorldMapWidget(int w, int h, QWidget *parent)
- : Q3ScrollView(parent)
+ : QFrame(parent)
{
- d = new WorldMapWidgetPriv;
-
setAttribute(Qt::WA_DeleteOnClose);
- setVScrollBarMode(Q3ScrollView::AlwaysOff);
- setHScrollBarMode(Q3ScrollView::AlwaysOff);
- viewport()->setMouseTracking(true);
setMinimumWidth(w);
setMinimumHeight(h);
- resizeContents(worldMapPixmap().width(), worldMapPixmap().height());
+ setFrameStyle(QFrame::StyledPanel | QFrame::Sunken);
+ setLineWidth(style()->pixelMetric(QStyle::PM_DefaultFrameWidth));
+
+ d = new WorldMapWidgetPriv;
+ d->marbleWidget = new MarbleWidget(this);
+
+ QVBoxLayout *vlay = new QVBoxLayout(this);
+ vlay->addWidget(d->marbleWidget);
+ vlay->setMargin(0);
+ vlay->setSpacing(0);
}
WorldMapWidget::~WorldMapWidget()
@@ -85,100 +90,79 @@
delete d;
}
-QPixmap &WorldMapWidget::worldMapPixmap()
+double WorldMapWidget::getLatitude()
{
- if (worldMap->isNull())
- {
- QString mapPath = KStandardDirs::locate("data", "digikam/data/worldmap.jpg");
- *worldMap = QPixmap(mapPath);
- }
- return *worldMap;
-}
-
-double WorldMapWidget::getLatitude(void)
-{
return d->latitude;
}
-double WorldMapWidget::getLongitude(void)
+double WorldMapWidget::getLongitude()
{
return d->longitude;
}
-void WorldMapWidget::setGPSPosition(double lat, double lng)
+void WorldMapWidget::setGPSPosition(double lat, double lng, double alt, const QDateTime& dt, const KUrl& url)
{
d->latitude = lat;
d->longitude = lng;
+ d->altitude = alt;
+ d->dt = dt;
+ d->url = url;
- double latMid = contentsHeight() / 2.0;
- double longMid = contentsWidth() / 2.0;
+ d->marbleWidget->setHome(lng, lat);
+ d->marbleWidget->centerOn(lng, lat);
- double latOffset = ( d->latitude * latMid ) / 90.0;
- double longOffset = ( d->longitude * longMid ) / 180.0;
+ // NOTE: There is no method currently to place a mark over the map in Marble 0.5.1.
+ // The only way is to use a temporary KML file with all informations that
+ // we need.
- d->xPos = (int)(longMid + longOffset);
- d->yPos = (int)(latMid - latOffset);
+ QDomDocument kmlDocument;
+ QDomImplementation impl;
+ QDomProcessingInstruction instr = kmlDocument.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
+ kmlDocument.appendChild(instr);
+ QDomElement kmlRoot = kmlDocument.createElementNS( "http://earth.google.com/kml/2.1","kml");
+ kmlDocument.appendChild(kmlRoot);
- viewport()->repaint();
- center(d->xPos, d->yPos);
-}
+ QDomElement kmlAlbum = addKmlElement(kmlDocument, kmlRoot, "Document");
+ QDomElement kmlName = addKmlTextElement(kmlDocument, kmlAlbum, "name", "Geolocation");
+ QDomElement kmlPlacemark = addKmlElement(kmlDocument, kmlAlbum, "Placemark");
+ addKmlTextElement(kmlDocument, kmlPlacemark, "name", d->url.fileName());
-void WorldMapWidget::drawContents(QPainter *p, int x, int y, int w, int h)
-{
- if (isEnabled())
- {
- p->drawPixmap(x, y, worldMapPixmap(), x, y, w, h);
- p->setPen(QPen(Qt::white, 0, Qt::SolidLine));
- p->drawLine(d->xPos, 0, d->xPos, contentsHeight());
- p->drawLine(0, d->yPos, contentsWidth(), d->yPos);
- p->setPen(QPen(Qt::red, 0, Qt::DotLine));
- p->drawLine(d->xPos, 0, d->xPos, contentsHeight());
- p->drawLine(0, d->yPos, contentsWidth(), d->yPos);
- p->setPen( Qt::red );
- p->setBrush( Qt::red );
- p->drawEllipse( d->xPos-2, d->yPos-2, 4, 4 );
- }
- else
- {
- p->fillRect(x, y, w, h, palette().color(QPalette::Disabled, QPalette::Background));
- }
-}
+ QDomElement kmlGeometry = addKmlElement(kmlDocument, kmlPlacemark, "Point");
+ addKmlTextElement(kmlDocument, kmlGeometry, "coordinates", QString("%1,%2").arg(lng).arg(lat));
+ addKmlTextElement(kmlDocument, kmlGeometry, "altitudeMode", "clampToGround");
+ addKmlTextElement(kmlDocument, kmlGeometry, "extrude", "1");
-void WorldMapWidget::contentsMousePressEvent(QMouseEvent *e)
-{
- if (!e) return;
+ QDomElement kmlTimeStamp = addKmlElement(kmlDocument, kmlPlacemark, "TimeStamp");
+ addKmlTextElement(kmlDocument, kmlTimeStamp, "when", d->dt.toString("yyyy-MM-ddThh:mm:ssZ"));
- if (e->button() == Qt::LeftButton)
- {
- d->xMousePos = e->x();
- d->yMousePos = e->y();
- setCursor( Qt::SizeAllCursor );
- }
+ KTemporaryFile KMLFile;
+ KMLFile.setSuffix(".kml");
+ KMLFile.setAutoRemove(true);
+ KMLFile.open();
+ QFile file(KMLFile.fileName());
+ file.open(QIODevice::WriteOnly);
+ QTextStream stream(&file);
+ stream << kmlDocument.toString();
+ file.close();
+
+ DDebug() << KMLFile.fileName() << endl;
+ d->marbleWidget->addPlaceMarkFile(KMLFile.fileName());
}
-void WorldMapWidget::contentsMouseMoveEvent(QMouseEvent *e)
+QDomElement WorldMapWidget::addKmlElement(QDomDocument &kmlDocument, QDomElement &target, const QString& tag)
{
- if (!e) return;
-
- if (e->buttons() & Qt::LeftButton)
- {
- uint newxpos = e->x();
- uint newypos = e->y();
-
- scrollBy (-(newxpos - d->xMousePos), -(newypos - d->yMousePos));
- viewport()->repaint();
-
- d->xMousePos = newxpos - (newxpos-d->xMousePos);
- d->yMousePos = newypos - (newypos-d->yMousePos);
- return;
- }
-
- setCursor( Qt::PointingHandCursor );
+ QDomElement kmlElement = kmlDocument.createElement(tag);
+ target.appendChild(kmlElement);
+ return kmlElement;
}
-void WorldMapWidget::contentsMouseReleaseEvent(QMouseEvent*)
+QDomElement WorldMapWidget::addKmlTextElement(QDomDocument &kmlDocument, QDomElement &target, const QString& tag, const QString& text)
{
- unsetCursor();
+ QDomElement kmlElement = kmlDocument.createElement(tag);
+ target.appendChild(kmlElement);
+ QDomText kmlTextElement = kmlDocument.createTextNode(text);
+ kmlElement.appendChild(kmlTextElement);
+ return kmlElement;
}
} // namespace Digikam
--- trunk/extragear/graphics/digikam/libs/imageproperties/worldmapwidget.h #793333:793334
@@ -26,10 +26,14 @@
// Qt includes.
-#include <Q3ScrollView>
-#include <QPixmap>
-#include <QMouseEvent>
+#include <QFrame>
+#include <QDateTime>
+#include <QDomDocument>
+// KDE includes.
+
+#include <kurl.h>
+
// Local includes
#include "digikam_export.h"
@@ -39,7 +43,7 @@
class WorldMapWidgetPriv;
-class DIGIKAM_EXPORT WorldMapWidget : public Q3ScrollView
+class DIGIKAM_EXPORT WorldMapWidget : public QFrame
{
Q_OBJECT
@@ -48,23 +52,16 @@
WorldMapWidget(int w, int h, QWidget *parent);
~WorldMapWidget();
- void setGPSPosition(double lat, double lng);
+ void setGPSPosition(double lat, double lng, double alt, const QDateTime& dt, const KUrl& url);
- double getLatitude(void);
- double getLongitude(void);
+ double getLatitude();
+ double getLongitude();
-protected:
-
- void drawContents(QPainter *p, int x, int y, int w, int h);
-
private:
- void contentsMousePressEvent ( QMouseEvent * e );
- void contentsMouseReleaseEvent ( QMouseEvent * e );
- void contentsMouseMoveEvent( QMouseEvent * e );
+ QDomElement addKmlElement(QDomDocument &kmlDocument, QDomElement &target, const QString& tag);
+ QDomElement addKmlTextElement(QDomDocument &kmlDocument, QDomElement &target, const QString& tag, const QString& text);
- QPixmap &worldMapPixmap();
-
private:
WorldMapWidgetPriv *d;
More information about the Digikam-devel
mailing list