import QtQuick 2.4 import FlightGear 1.0 import FlightGear.Launcher 1.0 import "." Item { id: root property alias location: airportData.guid Positioned { id: airportData onGuidChanged: _location.setBaseLocation(this) } readonly property bool isHeliport: airportData.type === Positioned.Heliport readonly property bool haveParking: airportData.airportHasParkings AirportDiagram { id: diagram anchors.fill: parent airport: airportData.guid onClicked: { if (pos === null) return; _location.setDetailLocation(pos) diagram.selection = pos syncUIFromController(); } approachExtensionNm: _location.onFinal ? _location.offsetNm : -1.0 } // not very declarative, try to remove this over time function syncUIFromController() { if (_location.detail.isRunwayType) { runwayRadio.select(); runwayChoice.syncCurrentIndex(); } else if (_location.detail.type == Positioned.Parking) { parkingRadio.select() parkingChoice.syncCurrentIndex(); } } RadioButtonGroup { id: radioGroup } Component.onCompleted: { syncUIFromController(); } Rectangle { id: panel color: "transparent" border.width: 1 border.color: Style.frameColor clip: true anchors { left: parent.left right: parent.right bottom: parent.bottom margins: Style.strutSize } height: selectionGrid.height + Style.margin * 2 // set opacity here only, so we don't make the whole summary pannel translucent Rectangle { id: background anchors.fill: parent z: -1 opacity: Style.panelOpacity color: "white" } Column { id: selectionGrid spacing: Style.margin width: parent.width StyledText { // heading text id: airportHeading width: parent.width font.pixelSize: Style.headingFontPixelSize text: isHeliport ? qsTr("Heliport: ") + airportData.ident + " / " + airportData.name : qsTr("Airport: ") + airportData.ident + " / " + airportData.name } Row { width: parent.width spacing: Style.margin RadioButton { id: runwayRadio anchors.verticalCenter: parent.verticalCenter group: radioGroup onClicked: { if (selected) runwayChoice.setLocation(); } } StyledText { text: isHeliport ? qsTr("Pad") : qsTr("Runway") anchors.verticalCenter: parent.verticalCenter } PopupChoice { id: runwayChoice model: _location.airportRunways displayRole: "ident" width: parent.width * 0.5 anchors.verticalCenter: parent.verticalCenter headerText: qsTr("Active") enabled: runwayRadio.selected onCurrentIndexChanged: { setLocation(); } function setLocation() { if (currentIndex == -1) { _location.useActiveRunway = true; diagram.selection = null; } else { _location.setDetailLocation(_location.airportRunways[currentIndex]) diagram.selection = _location.airportRunways[currentIndex] } } function syncCurrentIndex() { if (_location.useActiveRunway) { currentIndex = -1; return; } for (var i=0; i < _location.airportRunways.length; ++i) { if (_location.airportRunways[i].equals(_location.detail)) { currentIndex = i; return; } } // not found, default to active currentIndex = -1; } } } // runway offset ToggleBox { id: onFinalBox anchors.left: parent.left anchors.leftMargin: Style.strutSize height: onFinalContents.height + onFinalContents.y + Style.margin anchors.right: parent.right anchors.rightMargin: Style.margin // no offset for helipads visible: !isHeliport enabled: runwayRadio.selected selected: _location.onFinal label: qsTr("On final approach") onSelectedChanged: _location.onFinal = selected readonly property bool enableOnFinal: enabled && selected Column { id: onFinalContents y: parent.contentVerticalOffset spacing: Style.margin width: parent.width Row { height: offsetNmEdit.height DoubleSpinbox { id: offsetNmEdit value: _location.offsetNm onCommit: _location.offsetNm = newValue; label: qsTr("At") suffix: "Nm" min: 0.0 max: 40.0 decimals: 1 maxDigits: 5 live: true anchors.verticalCenter: parent.verticalCenter enabled: onFinalBox.enableOnFinal } StyledText { text: qsTr(" from the threshold") anchors.verticalCenter: parent.verticalCenter enabled: onFinalBox.enableOnFinal } Item { height: 1; width: Style.strutSize } ToggleSwitch { id: airspeedToggle enabled: onFinalBox.enableOnFinal checked: _location.speedEnabled onCheckedChanged: _location.speedEnabled = checked; anchors.verticalCenter: parent.verticalCenter } IntegerSpinbox { id: airspeedSpinbox label: qsTr("Airspeed:") suffix: "kts" min: 0 max: 10000 // more for spaceships? step: 5 maxDigits: 5 enabled: _location.speedEnabled && onFinalBox.enableOnFinal value: _location.airspeedKnots onCommit: _location.airspeedKnots = newValue anchors.verticalCenter: parent.verticalCenter } } LocationAltitudeRow { enabled: onFinalBox.enableOnFinal width: parent.width } } // of column } // of runway offset group ToggleSwitch { x: Style.strutSize // no localizer for helipads visible: !isHeliport enabled:runwayRadio.selected // enable if selected runway has ILS label: qsTr("Tune navigation radio (NAV1) to runway localizer") checked: _location.tuneNAV1 onCheckedChanged: { _location.tuneNAV1 = checked } } // parking row Row { width: parent.width spacing: Style.margin // hide if there's no parking locations defined for this airport visible: haveParking RadioButton { id: parkingRadio anchors.verticalCenter: parent.verticalCenter group: radioGroup onClicked: { if (selected) parkingChoice.setLocation(); } } StyledText { text: qsTr("Parking") anchors.verticalCenter: parent.verticalCenter } PopupChoice { id: parkingChoice model: _location.airportParkings displayRole: "name" width: parent.width * 0.5 anchors.verticalCenter: parent.verticalCenter headerText: qsTr("Available") enabled: parkingRadio.selected onCurrentIndexChanged: { setLocation(); } function syncCurrentIndex() { if (_location.useAvailableParking) { currentIndex = -1; return; } for (var i=0; i < _location.airportParkings.length; ++i) { if (_location.airportParkings[i].equals(_location.detail)) { currentIndex = i; return; } } // not found, default to available currentIndex = -1; } function setLocation() { if (currentIndex == -1) { _location.useAvailableParking = true; diagram.selection = null; } else { _location.setDetailLocation(_location.airportParkings[currentIndex]) diagram.selection = _location.airportParkings[currentIndex] } } } } } // main layout column } // main panel rectangle }