You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
digikam/digikam/libs/widgets/metadata/worldmapwidget.cpp

212 lines
5.4 KiB

/* ============================================================
*
* 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