diff options
Diffstat (limited to 'src/libs/widgets/metadata/worldmapwidget.cpp')
-rw-r--r-- | src/libs/widgets/metadata/worldmapwidget.cpp | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/src/libs/widgets/metadata/worldmapwidget.cpp b/src/libs/widgets/metadata/worldmapwidget.cpp new file mode 100644 index 00000000..811e9148 --- /dev/null +++ b/src/libs/widgets/metadata/worldmapwidget.cpp @@ -0,0 +1,211 @@ +/* ============================================================ + * + * This file is a part of digiKam project + * http://www.digikam.org + * + * Date : 2006-02-20 + * Description : a widget to display GPS info on a world map + * + * Copyright (C) 2006-2008 by Gilles Caulier <caulier dot gilles at gmail dot com> + * + * This program is free software; you can redistribute it + * and/or modify it under the terms of the GNU General + * Public License as published by the Free Software Foundation; + * either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * ============================================================ */ + +// TQt includes. + +#include <tqpainter.h> +#include <tqstring.h> +#include <tqpixmap.h> +#include <tqlabel.h> + +// KDE includes. + +#include <kstandarddirs.h> +#include <kcursor.h> +#include <tdelocale.h> +#include <kstaticdeleter.h> + +// Local includes. + +#include "ddebug.h" +#include "worldmapwidget.h" +#include "worldmapwidget.moc" + +namespace Digikam +{ + +class WorldMapWidgetPriv +{ + +public: + + WorldMapWidgetPriv() + { + latitude = 0; + longitude = 0; + latLonPos = 0; + } + + int xPos; + int yPos; + int xMousePos; + int yMousePos; + + double latitude; + double longitude; + + TQLabel *latLonPos; + + static TQPixmap *worldMap; +}; + +static KStaticDeleter<TQPixmap> pixmapDeleter; + +TQPixmap *WorldMapWidgetPriv::worldMap = 0; + +WorldMapWidget::WorldMapWidget(int w, int h, TQWidget *parent) + : TQScrollView(parent, 0, TQt::WDestructiveClose) +{ + d = new WorldMapWidgetPriv; + + setVScrollBarMode(TQScrollView::AlwaysOff); + setHScrollBarMode(TQScrollView::AlwaysOff); + viewport()->setMouseTracking(true); + viewport()->setPaletteBackgroundColor(colorGroup().background()); + setMinimumWidth(w); + setMaximumHeight(h); + resizeContents(worldMapPixmap().width(), worldMapPixmap().height()); + + d->latLonPos = new TQLabel(viewport()); + d->latLonPos->setMaximumHeight(fontMetrics().height()); + d->latLonPos->setAlignment(TQt::AlignHCenter | TQt::AlignVCenter); + d->latLonPos->setFrameStyle(TQFrame::Panel | TQFrame::Sunken); + addChild(d->latLonPos); +} + +WorldMapWidget::~WorldMapWidget() +{ + delete d; +} + +TQPixmap &WorldMapWidget::worldMapPixmap() +{ + if (!d->worldMap) + { + TDEGlobal::dirs()->addResourceType("worldmap", TDEGlobal::dirs()->kde_default("data") + "digikam/data"); + TQString directory = TDEGlobal::dirs()->findResourceDir("worldmap", "worldmap.jpg"); + pixmapDeleter.setObject(d->worldMap, new TQPixmap(directory + "worldmap.jpg")); + } + return *d->worldMap; +} + +double WorldMapWidget::getLatitude() +{ + return d->latitude; +} + +double WorldMapWidget::getLongitude() +{ + return d->longitude; +} + +void WorldMapWidget::setEnabled(bool b) +{ + if (!b) + d->latLonPos->hide(); + else + d->latLonPos->show(); + + TQScrollView::setEnabled(b); +} + +void WorldMapWidget::setGPSPosition(double lat, double lng) +{ + d->latitude = lat; + d->longitude = lng; + + double latMid = contentsHeight() / 2.0; + double longMid = contentsWidth() / 2.0; + + double latOffset = ( d->latitude * latMid ) / 90.0; + double longOffset = ( d->longitude * longMid ) / 180.0; + + d->xPos = (int)(longMid + longOffset); + d->yPos = (int)(latMid - latOffset); + + repaintContents(false); + center(d->xPos, d->yPos); + + TQString la, lo; + d->latLonPos->setText(TQString("(%1, %2)").arg(la.setNum(d->latitude, 'f', 2)) + .arg(lo.setNum(d->longitude, 'f', 2))); + + moveChild(d->latLonPos, contentsX()+10, contentsY()+10); +} + +void WorldMapWidget::drawContents(TQPainter *p, int x, int y, int w, int h) +{ + if (isEnabled()) + { + p->drawPixmap(x, y, worldMapPixmap(), x, y, w, h); + p->setPen(TQPen(TQt::white, 0, TQt::SolidLine)); + p->drawLine(d->xPos, 0, d->xPos, contentsHeight()); + p->drawLine(0, d->yPos, contentsWidth(), d->yPos); + p->setPen(TQPen(TQt::red, 0, TQt::DotLine)); + p->drawLine(d->xPos, 0, d->xPos, contentsHeight()); + p->drawLine(0, d->yPos, contentsWidth(), d->yPos); + p->setPen( TQt::red ); + p->setBrush( TQt::red ); + p->drawEllipse( d->xPos-2, d->yPos-2, 4, 4 ); + } + else + { + p->fillRect(x, y, w, h, palette().disabled().background()); + } +} + +void WorldMapWidget::contentsMousePressEvent ( TQMouseEvent * e ) +{ + if ( e->button() == TQt::LeftButton ) + { + d->xMousePos = e->x(); + d->yMousePos = e->y(); + setCursor( KCursor::sizeAllCursor() ); + } +} + +void WorldMapWidget::contentsMouseReleaseEvent ( TQMouseEvent * ) +{ + unsetCursor(); +} + +void WorldMapWidget::contentsMouseMoveEvent( TQMouseEvent * e ) +{ + if ( e->state() == TQt::LeftButton ) + { + uint newxpos = e->x(); + uint newypos = e->y(); + + scrollBy (-(newxpos - d->xMousePos), -(newypos - d->yMousePos)); + repaintContents(false); + + d->xMousePos = newxpos - (newxpos-d->xMousePos); + d->yMousePos = newypos - (newypos-d->yMousePos); + return; + } + + setCursor( KCursor::handCursor() ); +} + +} // namespace Digikam + |