Newer
Older
/****************************************************************************
*
* (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
*
* QGroundControl is licensed according to the terms in the file
* COPYING.md in the root of the source code directory.
*
****************************************************************************/
import QtQuick 2.3
import QtQuick.Controls 1.2
Gus Grubba
committed
import QtQuick.Dialogs 1.2
import QGroundControl 1.0
import QGroundControl.Controls 1.0
import QGroundControl.Palette 1.0
import QGroundControl.ScreenTools 1.0
import QGroundControl.Controllers 1.0
import QGroundControl.FactSystem 1.0
import QGroundControl.FactControls 1.0
Gus Grubba
committed
Item {
id: _root
property int _rowHeight: ScreenTools.defaultFontPixelHeight * 2
Gus Grubba
committed
property int _rowWidth: 10 // Dynamic adjusted at runtime
property bool _searchFilter: searchText.text.trim() != "" ///< true: showing results of search
Gus Grubba
committed
property var _searchResults ///< List of parameter names from search results
property bool _showRCToParam: !ScreenTools.isMobile && QGroundControl.multiVehicleManager.activeVehicle.px4Firmware
mainWindow.showMessageDialog(qsTr("Parameter Editor"), qsTr("Parameter Load Errors"))
ExclusiveGroup { id: sectionGroup }
Gus Grubba
committed
//---------------------------------------------
//-- Header
Row {
id: header
anchors.left: parent.left
anchors.right: parent.right
spacing: ScreenTools.defaultFontPixelWidth
Timer {
id: clearTimer
interval: 100;
running: false;
repeat: false
onTriggered: {
searchText.text = ""
controller.searchText = ""
}
}
Gus Grubba
committed
QGCLabel {
anchors.verticalCenter: parent.verticalCenter
text: qsTr("Search:")
}
Gus Grubba
committed
QGCTextField {
id: searchText
text: controller.searchText
onDisplayTextChanged: controller.searchText = displayText
anchors.verticalCenter: parent.verticalCenter
}
QGCButton {
text: qsTr("Clear")
onClicked: {
if(ScreenTools.isMobile) {
Qt.inputMethod.hide();
Gus Grubba
committed
clearTimer.start()
Gus Grubba
committed
anchors.verticalCenter: parent.verticalCenter
}
Gus Grubba
committed
QGCCheckBox {
text: qsTr("Show modified only")
checked: controller.showModifiedOnly
anchors.verticalCenter: parent.verticalCenter
onClicked: {
controller.showModifiedOnly = !controller.showModifiedOnly
Gus Grubba
committed
}
} // Row - Header
QGCButton {
anchors.top: header.top
anchors.bottom: header.bottom
anchors.right: parent.right
text: qsTr("Tools")
visible: !_searchFilter
Gus Grubba
committed
text: qsTr("Refresh")
onTriggered: controller.refresh()
}
text: qsTr("Reset all to firmware's defaults")
visible: !activeVehicle.apmFirmware
onTriggered: mainWindow.showComponentDialog(resetToDefaultConfirmComponent, qsTr("Reset All"), mainWindow.showDialogDefaultWidth, StandardButton.Cancel | StandardButton.Reset)
text: qsTr("Reset to vehicle's configuration defaults")
visible: !activeVehicle.apmFirmware
onTriggered: mainWindow.showComponentDialog(resetToVehicleConfigurationConfirmComponent, qsTr("Reset All"), mainWindow.showDialogDefaultWidth, StandardButton.Cancel | StandardButton.Reset)
text: qsTr("Load from file...")
onTriggered: {
fileDialog.title = qsTr("Load Parameters")
fileDialog.selectExisting = true
fileDialog.openForLoad()
Gus Grubba
committed
}
text: qsTr("Save to file...")
onTriggered: {
fileDialog.title = qsTr("Save Parameters")
fileDialog.selectExisting = false
fileDialog.openForSave()
Gus Grubba
committed
}
QGCMenuSeparator { visible: _showRCToParam }
QGCMenuItem {
text: qsTr("Clear RC to Param")
onTriggered: controller.clearRCToParam()
visible: _showRCToParam
}
onTriggered: mainWindow.showComponentDialog(rebootVehicleConfirmComponent, qsTr("Reboot Vehicle"), mainWindow.showDialogDefaultWidth, StandardButton.Cancel | StandardButton.Ok)
Gus Grubba
committed
}
Gus Grubba
committed
/// Group buttons
QGCFlickable {
id : groupScroll
width: ScreenTools.defaultFontPixelWidth * 25
anchors.top: header.bottom
anchors.bottom: parent.bottom
clip: true
pixelAligned: true
contentHeight: groupedViewCategoryColumn.height
flickableDirection: Flickable.VerticalFlick
visible: !_searchFilter && !controller.showModifiedOnly
ColumnLayout {
id: groupedViewCategoryColumn
anchors.left: parent.left
anchors.right: parent.right
spacing: Math.ceil(ScreenTools.defaultFontPixelHeight * 0.25)
Gus Grubba
committed
Repeater {
model: controller.categories
Gus Grubba
committed
Column {
Layout.fillWidth: true
spacing: Math.ceil(ScreenTools.defaultFontPixelHeight * 0.25)
Gus Grubba
committed
readonly property string category: modelData
Gus Grubba
committed
SectionHeader {
id: categoryHeader
text: category
checked: controller.currentCategory === text
exclusiveGroup: sectionGroup
Gus Grubba
committed
onCheckedChanged: {
if (checked) {
controller.currentCategory = category
controller.currentGroup = controller.getGroupsForCategory(category)[0]
Gus Grubba
committed
}
Gus Grubba
committed
ExclusiveGroup { id: buttonGroup }
Gus Grubba
committed
Repeater {
model: categoryHeader.checked ? controller.getGroupsForCategory(category) : 0
Gus Grubba
committed
QGCButton {
width: ScreenTools.defaultFontPixelWidth * 25
text: groupName
height: _rowHeight
checked: controller.currentGroup === text
exclusiveGroup: buttonGroup
Gus Grubba
committed
readonly property string groupName: modelData
Gus Grubba
committed
onClicked: {
checked = true
_rowWidth = 10
controller.currentCategory = category
controller.currentGroup = groupName
Gus Grubba
committed
}
Gus Grubba
committed
/// Parameter list
QGCListView {
id: editorListView
anchors.leftMargin: ScreenTools.defaultFontPixelWidth
anchors.left: (_searchFilter || controller.showModifiedOnly) ? parent.left : groupScroll.right
anchors.right: parent.right
anchors.top: header.bottom
anchors.bottom: parent.bottom
orientation: ListView.Vertical
model: controller.parameters
cacheBuffer: height > 0 ? height * 2 : 0
clip: true
delegate: Rectangle {
height: _rowHeight
width: _rowWidth
color: Qt.rgba(0,0,0,0)
Row {
id: factRow
spacing: Math.ceil(ScreenTools.defaultFontPixelWidth * 0.5)
anchors.verticalCenter: parent.verticalCenter
Gus Grubba
committed
property Fact modelFact: object
Gus Grubba
committed
QGCLabel {
id: nameLabel
width: ScreenTools.defaultFontPixelWidth * 20
text: factRow.modelFact.name
clip: true
}
Gus Grubba
committed
QGCLabel {
id: valueLabel
width: ScreenTools.defaultFontPixelWidth * 20
color: factRow.modelFact.defaultValueAvailable ? (factRow.modelFact.valueEqualsDefault ? qgcPal.text : qgcPal.warningText) : qgcPal.text
text: factRow.modelFact.enumStrings.length === 0 ? factRow.modelFact.valueString + " " + factRow.modelFact.units : factRow.modelFact.enumStringValue
clip: true
}
Gus Grubba
committed
QGCLabel {
text: factRow.modelFact.shortDescription
}
Gus Grubba
committed
Component.onCompleted: {
if(_rowWidth < factRow.width + ScreenTools.defaultFontPixelWidth) {
_rowWidth = factRow.width + ScreenTools.defaultFontPixelWidth
Gus Grubba
committed
}
Gus Grubba
committed
Rectangle {
width: _rowWidth
height: 1
color: qgcPal.text
opacity: 0.15
anchors.bottom: parent.bottom
anchors.left: parent.left
}
Gus Grubba
committed
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.LeftButton
onClicked: {
_editorDialogFact = factRow.modelFact
mainWindow.showComponentDialog(editorDialogComponent, qsTr("Parameter Editor"), mainWindow.showDialogDefaultWidth, StandardButton.Cancel | StandardButton.Save)
Gus Grubba
committed
}
QGCFileDialog {
id: fileDialog
folder: _appSettings.parameterSavePath
fileExtension: _appSettings.parameterFileExtension
nameFilters: [ qsTr("Parameter Files (*.%1)").arg(_appSettings.parameterFileExtension) , qsTr("All Files (*.*)") ]
onAcceptedForSave: {
controller.saveToFile(file)
close()
onAcceptedForLoad: {
controller.loadFromFile(file)
close()
id: editorDialogComponent
ParameterEditorDialog {
fact: _editorDialogFact
showRCToParam: _showRCToParam
Component {
id: resetToDefaultConfirmComponent
QGCViewDialog {
function accept() {
controller.resetAllToDefaults()
hideDialog()
}
QGCLabel {
width: parent.width
wrapMode: Text.WordWrap
text: qsTr("Select Reset to reset all parameters to their defaults.")
}
}
}
Component {
id: resetToVehicleConfigurationConfirmComponent
QGCViewDialog {
function accept() {
controller.resetAllToVehicleConfiguration()
hideDialog()
}
QGCLabel {
width: parent.width
wrapMode: Text.WordWrap
text: qsTr("Select Reset to reset all parameters to the vehicle's configuration defaults.")
}
}
}
Component {
id: rebootVehicleConfirmComponent
QGCViewDialog {
function accept() {
activeVehicle.rebootVehicle()
hideDialog()
}
QGCLabel {
width: parent.width
wrapMode: Text.WordWrap
text: qsTr("Select Ok to reboot vehicle.")
}
}
}