地面站终端 App
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

159 lines
5.1 KiB

import QtQuick 2.3
import QtQuick.Controls 1.2
import QtQuick.Dialogs 1.2
import QGroundControl 1.0
import QGroundControl.ScreenTools 1.0
import QGroundControl.Palette 1.0
import QGroundControl.Controllers 1.0
/// This control is meant to be a direct replacement for the standard Qml FileDialog control.
/// It differs for mobile builds which uses a completely custom file picker.
Item {
id: _root
visible: false
property var qgcView
property string folder
property var nameFilters
property string fileExtension
property string title
property bool selectExisting
property bool selectFolder
property bool _openForLoad
property real _margins: ScreenTools.defaultFontPixelHeight / 2
function openForLoad() {
_openForLoad = true
if (ScreenTools.isMobile && folder.length !== 0) {
qgcView.showDialog(mobileFileOpenDialog, title, qgcView.showDialogDefaultWidth, StandardButton.Cancel)
} else {
fullFileDialog.open()
}
}
function openForSave() {
_openForLoad = false
if (ScreenTools.isMobile && folder.length !== 0) {
qgcView.showDialog(mobileFileSaveDialog, title, qgcView.showDialogDefaultWidth, StandardButton.Cancel | StandardButton.Ok)
} else {
fullFileDialog.open()
}
}
function close() {
fullFileDialog.close()
}
signal acceptedForLoad(string file)
signal acceptedForSave(string file)
signal rejected
QFileDialogController { id: controller }
QGCPalette { id: qgcPal; colorGroupEnabled: true }
FileDialog {
id: fullFileDialog
folder: "file://" + _root.folder
nameFilters: _root.nameFilters
title: _root.title
selectExisting: _root.selectExisting
selectMultiple: false
selectFolder: _root.selectFolder
onAccepted: {
if (_openForLoad) {
_root.acceptedForLoad(controller.urlToLocalFile(fileUrl))
} else {
_root.acceptedForSave(controller.urlToLocalFile(fileUrl))
}
}
onRejected: _root.rejected()
}
Component {
id: mobileFileOpenDialog
QGCViewDialog {
Item {
anchors.margins: _margins
anchors.fill: parent
QGCListView {
id: listView
anchors.fill: parent
spacing: _margins / 2
orientation: ListView.Vertical
model: controller.getFiles(folder, fileExtension)
delegate: QGCButton {
text: modelData
onClicked: {
hideDialog()
_root.acceptedForLoad(controller.fullyQualifiedFilename(folder, modelData, fileExtension))
}
}
}
QGCLabel {
text: qsTr("No files")
visible: listView.model.length == 0
}
}
}
}
Component {
id: mobileFileSaveDialog
QGCViewDialog {
function accept() {
if (filenameTextField.text == "") {
return
}
if (!replaceMessage.visible) {
if (controller.fileExists(controller.fullyQualifiedFilename(folder, filenameTextField.text, fileExtension))) {
replaceMessage.visible = true
return
}
}
_root.acceptedForSave(controller.fullyQualifiedFilename(folder, filenameTextField.text, fileExtension))
hideDialog()
}
Column {
anchors.left: parent.left
anchors.right: parent.right
spacing: ScreenTools.defaultFontPixelHeight
QGCLabel {
text: qsTr("File name:")
}
QGCTextField {
id: filenameTextField
onTextChanged: replaceMessage.visible = false
}
QGCLabel {
anchors.left: parent.left
anchors.right: parent.right
wrapMode: Text.WordWrap
text: qsTr("File names must end with .%1 file extension. If missing it will be added.").arg(fileExtension)
}
QGCLabel {
id: replaceMessage
anchors.left: parent.left
anchors.right: parent.right
wrapMode: Text.WordWrap
text: qsTr("The file %1 exists. Click Save again to replace it.").arg(filenameTextField.text)
visible: false
color: qgcPal.warningText
}
}
}
}
}