Revision control
Copy as Markdown
// Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
import QtPositioning
import QtQuick
import QtQuick.Controls.Basic as QC
import QtQuick.Layouts
import SatelliteInformation
Rectangle {
id: root
required property SatelliteModel satellitesModel
required property SortFilterModel sortFilterModel
property color inUseColor: Theme.inUseColor
property color inViewColor: Theme.inViewColor
property bool simulation: false
color: Theme.darkBackgroundColor
function toggleState() {
switch (statesItem.state) {
case "stopped":
statesItem.state = "single"
break
case "single":
statesItem.state = "running"
break
case "running":
statesItem.state = "stopped"
break
}
}
function updateActive(state) {
satelliteSource.active = state
positionSource.active = state
}
function enterSingle() {
updateActive(false)
satelliteSource.update()
positionSource.update()
}
//! [0]
SatelliteSource {
id: satelliteSource
name: root.simulation ? "nmea" : ""
//! [0]
PluginParameter {
name: "nmea.source"
}
//! [1]
onSatellitesInViewChanged: root.satellitesModel.updateSatellitesInView(satellitesInView)
onSatellitesInUseChanged: root.satellitesModel.updateSatellitesInUse(satellitesInUse)
//! [1]
onSourceErrorChanged: {
if (sourceError !== SatelliteSource.NoError) {
// If the positionSource is in simulation mode, switch the
// whole app into this mode. Otherwise show an error.
if (positionSource.name !== "nmea") {
applicationHeader.statusString =
qsTr("SatelliteSource Error: %1").arg(sourceError)
applicationHeader.redStatus = true
} else {
root.simulation = true
active = true
}
}
}
//! [2]
}
//! [2]
//! [3]
PositionSource {
id: positionSource
name: root.simulation ? "nmea" : ""
//! [3]
PluginParameter {
name: "nmea.source"
}
//! [4]
onPositionChanged: {
let posData = position.coordinate.toString().split(", ")
positionBox.latitudeString = posData[0]
positionBox.longitudeString = posData[1]
}
// ![4]
onSourceErrorChanged: {
if (sourceError !== PositionSource.NoError) {
// If the satelliteSource is in simulation mode, switch the
// whole app into this mode. Otherwise show an error.
if (satelliteSource.name !== "nmea") {
applicationHeader.statusString =
qsTr("PositionSource Error: %1").arg(sourceError)
applicationHeader.redStatus = true
} else {
root.simulation = true
active = true
}
}
}
//! [5]
}
//! [5]
Header {
id: applicationHeader
width: parent.width
anchors.top: parent.top
simulation: root.simulation
}
StackLayout {
id: viewsLayout
width: parent.width
anchors {
top: applicationHeader.bottom
bottom: positionBox.top
}
currentIndex: navigationTab.currentIndex !== navigationTab.settingsIndex
? navigationTab.currentIndex : currentIndex
SkyView {
satellitesModel: root.satellitesModel
inViewColor: root.inViewColor
inUseColor: root.inUseColor
}
SatelliteView {
sortFilterModel: root.sortFilterModel
inViewColor: root.inViewColor
inUseColor: root.inUseColor
onCleanupFocus: {
modeButton.forceActiveFocus()
}
}
RssiView {
satellitesModel: root.satellitesModel
inViewColor: root.inViewColor
inUseColor: root.inUseColor
}
}
PositionBox {
id: positionBox
width: parent.width
anchors.bottom: modeButton.top
visible: viewsLayout.currentIndex !== navigationTab.tableViewIndex
height: visible ? implicitHeight : 0
}
Button {
id: modeButton
anchors {
horizontalCenter: parent.horizontalCenter
bottom: separator.top
bottomMargin: Theme.defaultSpacing
}
width: parent.width * 0.8
onClicked: root.toggleState()
}
Rectangle {
id: separator
anchors.bottom: navigationTab.top
color: Theme.separatorColor
height: 1
width: parent.width
}
ViewSwitch {
id: navigationTab
anchors.bottom: parent.bottom
width: parent.width
onCurrentIndexChanged: {
if (currentIndex === navigationTab.settingsIndex)
settingsView.open()
else
settingsView.close()
}
}
QC.Drawer {
id: settingsView
dragMargin: -1
edge: Qt.RightEdge
height: root.height - navigationTab.height
width: root.width / 2
onClosed: navigationTab.currentIndex = viewsLayout.currentIndex
SettingsView {
anchors.fill: parent
onShowHelp: {
settingsView.close()
helpPopup.open()
}
onToggleMode: {
settingsView.close()
Theme.darkMode = !Theme.darkMode
}
}
}
HelpPopup {
id: helpPopup
width: root.width
height: root.height
}
Item {
id: statesItem
visible: false
state: "running"
states: [
State {
name: "stopped"
PropertyChanges {
modeButton {
text: qsTr("Single")
redHover: false
}
}
PropertyChanges {
applicationHeader {
statusString: qsTr("Stopped")
redStatus: true
}
}
StateChangeScript {
script: root.updateActive(false)
}
},
State {
name: "single"
PropertyChanges {
modeButton {
text: qsTr("Start")
redHover: false
}
}
PropertyChanges {
applicationHeader {
statusString: qsTr("Single Request")
redStatus: false
}
}
StateChangeScript {
script: root.enterSingle()
}
},
State {
name: "running"
PropertyChanges {
modeButton {
text: qsTr("Stop")
redHover: true
}
}
PropertyChanges {
applicationHeader {
statusString: qsTr("Running")
redStatus: false
}
}
StateChangeScript {
script: root.updateActive(true)
}
}
]
}
}