summaryrefslogtreecommitdiff
path: root/qmapwatchlet/compassview.cpp
blob: 7ee28535f814f0437ae013a6cde35973690b9ec3 (plain)
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
119
120
121
122
123
124
125
126
127
128
129
130
#include <math.h>

#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(NAN), _altitude(NAN)
{
	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 = NAN;
	if (info.hasAttribute(QGeoPositionInfo::GroundSpeed)) {
		newSpeed = info.attribute(QGeoPositionInfo::GroundSpeed);
	}
	qDebug() << "New speed" << newSpeed;
	if (newSpeed != _speed) {
		_speed = newSpeed;
		emit currentSpeedChanged();
	}

	qreal newAlt = NAN;
	if (info.hasAttribute(QGeoPositionInfo::VerticalAccuracy)) {
		newAlt = info.coordinate().altitude();
	}
	qDebug() << "New altitude" << newAlt;
	if (newAlt != _altitude) {
		_altitude = newAlt;
		emit currentAltitudeChanged();
	}
}