aboutsummaryrefslogtreecommitdiff
path: root/src/Compass.qml
blob: 48e9557b82c68827e7f316389d9554544bef105b (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
/*
 * Copyright (C) 2022 - Darrel Griët    <dgriet@gmail.com>
 *               2017 - Florent Revest  <revestflo@gmail.com>
 *                    - Niels Tholenaar <info@123quality.nl>
 *
 * 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 3 of the License, 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.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */

import QtQuick 2.5
import org.asteroid.controls 1.0
import QtSensors 5.3
import QtGraphicalEffects 1.15

Item {
    id: compassRoot

    property int rotation: 0;
    property int calibration: 0;
    property int ringValueOffset: Math.sqrt(Math.pow(Dims.l(40), 2) / 2);

    Compass {
        active: true
        onReadingChanged: {
            compassRoot.rotation = reading.azimuth;
            compassRoot.calibration = reading.calibrationLevel;
        }
    }

    StatusPage {
        //% "<h3>No data</h3>Calibrate the sensor by moving it in an ∞ figure."
        text: qsTrId("id-no-data-calibrate")
        icon: "ios-infinite-outline"
        visible: !compassRoot.calibration
    }

    Item {
        visible: compassRoot.calibration
        anchors.fill: parent

        Item {
            id: centerDisplay
            anchors.fill: parent
            Label {
                id: magneticRotation
                anchors.centerIn: parent
                text: compassRoot.rotation
                font {
                    pixelSize: parent.height / 4
                    capitalization: Font.Capitalize
                    styleName: "SemiCondensed"
                    kerning: true
                    preferShaping: true
                }
            }
            Label {
                id: degreeSymbol
                anchors.top: magneticRotation.top
                anchors.left: magneticRotation.right
                text: "°"
                font {
                    pixelSize: parent.height / 4
                    capitalization: Font.Capitalize
                    styleName: "SemiCondensed"
                    kerning: true
                    preferShaping: true
                }
            }
            Image {
                anchors.top: parent.top
                anchors.centerIn: parent
                anchors.verticalCenterOffset: -Dims.l(35)
                width: Dims.l(10)
                height: width
                source: "compass.svg"
            }
        }

        Item {
            anchors.fill: parent
            rotation: -compassRoot.rotation
            Repeater {
                id: outerRing
                anchors.fill: parent
                model: 8
                Label {
                    property var angle: (index / outerRing.count) * 2 * Math.PI
                    property var cardinalDirections: ["N", "NE", "E", "SE", "S", "SW", "W", "NW"]
                    rotation: compassRoot.rotation
                    color: index == 0 ? "#c2620c" : "white"
                    text: cardinalDirections[index]
                    anchors {
                        centerIn: parent
                        verticalCenterOffset: -Math.cos(angle) * Dims.l(40)
                        horizontalCenterOffset: Math.sin(angle) * Dims.l(40)
                    }
                    font {
                        pixelSize: index % 2 ? Dims.l(8) : Dims.l(10)
                        capitalization: Font.Capitalize
                        styleName: "Condensed Bold"
                        kerning: true
                        preferShaping: true
                    }
                }
            }
        }
    }
}