1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
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();
}
}
|