diff options
Diffstat (limited to 'qmapwatchlet/compassview.cpp')
-rw-r--r-- | qmapwatchlet/compassview.cpp | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/qmapwatchlet/compassview.cpp b/qmapwatchlet/compassview.cpp new file mode 100644 index 0000000..5de44a5 --- /dev/null +++ b/qmapwatchlet/compassview.cpp @@ -0,0 +1,118 @@ +#include "qmapwatchletplugin.h" +#include "compassview.h" + +using namespace sowatch; +QTM_USE_NAMESPACE + +CompassView::CompassView(QDeclarativeItem *parent) : + QDeclarativeItem(parent), + _enabled(false), + _image(SOWATCH_QML_DIR "/qmapwatchlet/compass.png"), + _posSource(QGeoPositionInfoSource::createDefaultSource(this)), + _direction(-1.0), _speed(-1.0), _altitude(-1.0) +{ + if (_posSource) { + connect(_posSource, SIGNAL(positionUpdated(QGeoPositionInfo)), + SLOT(handlePositionUpdate(QGeoPositionInfo))); + _posSource->lastKnownPosition(); + } else { + qWarning() << "No position source for moving map!"; + } + + setFlag(QGraphicsItem::ItemHasNoContents, false); +} + +bool CompassView::updateEnabled() const +{ + return _enabled; +} + +void CompassView::setUpdateEnabled(bool enabled) +{ + if (_posSource && _enabled != enabled) { + if (enabled) { + qDebug() << "Start position updates"; + _posSource->startUpdates(); + } else { + qDebug() << "Stop position updates"; + _posSource->stopUpdates(); + } + _enabled = enabled; + + emit updateEnabledChanged(); + } + +} + +int CompassView::updateInterval() const +{ + if (_posSource) { + return _posSource->updateInterval(); + } else { + return 0; + } +} + +void CompassView::setUpdateInterval(int msec) +{ + if (_posSource) { + _posSource->setUpdateInterval(msec); + emit updateIntervalChanged(); + } +} + +qreal CompassView::currentSpeed() const +{ + return _speed; +} + +qreal CompassView::currentAltitude() const +{ + return _altitude; +} + +void CompassView::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +{ + Q_UNUSED(widget); + // Now render the arrow indicator + const int centerX = _size.width() / 2, centerY = _size.height() / 2; + + if (_direction >= 0.0) { + painter->save(); + painter->translate(centerX, centerY); + painter->rotate(_direction); + painter->drawImage(-_image.width() / 2, -_image.height() / 2, _image); + painter->restore(); + } +} + +void CompassView::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) +{ + Q_UNUSED(oldGeometry); + _size = newGeometry.size().toSize(); +} + +void CompassView::handlePositionUpdate(const QGeoPositionInfo &info) +{ + qDebug() << "Pos update"; + + qreal newDirection = -1.0; + if (info.hasAttribute(QGeoPositionInfo::Direction)) { + newDirection = info.attribute(QGeoPositionInfo::Direction); + } + qDebug() << "New dir" << newDirection; + if (newDirection != _direction) { + _direction = newDirection; + update(); + } + + qreal newSpeed = -1.0; + if (info.hasAttribute(QGeoPositionInfo::GroundSpeed)) { + newSpeed = info.attribute(QGeoPositionInfo::GroundSpeed); + } + qDebug() << "New speed" << newSpeed; + if (newSpeed != _speed) { + _speed = newSpeed; + emit currentSpeedChanged(); + } +} |