summaryrefslogtreecommitdiff
path: root/qmapwatchlet/compassview.cpp
blob: 5de44a5cad75d0a2e4c4b9317365da7b01220833 (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
#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();
	}
}