Commit 3f8dc069 authored by Don Gagne's avatar Don Gagne

QGCViewDialog controls can now call QGCView.showDialog to stack dialogs

parent ba088926
...@@ -97,6 +97,7 @@ ...@@ -97,6 +97,7 @@
<file alias="QGroundControl/Controls/QGCToolBarButton.qml">src/QmlControls/QGCToolBarButton.qml</file> <file alias="QGroundControl/Controls/QGCToolBarButton.qml">src/QmlControls/QGCToolBarButton.qml</file>
<file alias="QGroundControl/Controls/QGCView.qml">src/QmlControls/QGCView.qml</file> <file alias="QGroundControl/Controls/QGCView.qml">src/QmlControls/QGCView.qml</file>
<file alias="QGroundControl/Controls/QGCViewDialog.qml">src/QmlControls/QGCViewDialog.qml</file> <file alias="QGroundControl/Controls/QGCViewDialog.qml">src/QmlControls/QGCViewDialog.qml</file>
<file alias="QGroundControl/Controls/QGCViewDialogContainer.qml">src/QmlControls/QGCViewDialogContainer.qml</file>
<file alias="QGroundControl/Controls/QGCViewMessage.qml">src/QmlControls/QGCViewMessage.qml</file> <file alias="QGroundControl/Controls/QGCViewMessage.qml">src/QmlControls/QGCViewMessage.qml</file>
<file alias="QGroundControl/Controls/QGCViewPanel.qml">src/QmlControls/QGCViewPanel.qml</file> <file alias="QGroundControl/Controls/QGCViewPanel.qml">src/QmlControls/QGCViewPanel.qml</file>
<file alias="QGroundControl/Controls/qmldir">src/QmlControls/QGroundControl.Controls.qmldir</file> <file alias="QGroundControl/Controls/qmldir">src/QmlControls/QGroundControl.Controls.qmldir</file>
......
...@@ -26,7 +26,6 @@ FactPanel { ...@@ -26,7 +26,6 @@ FactPanel {
property var qgcView: _rootItem ///< Used by Fact controls for validation dialogs property var qgcView: _rootItem ///< Used by Fact controls for validation dialogs
property bool completedSignalled: false property bool completedSignalled: false
property real topDialogMargin: 0 ///< Set a top margin for dialog
property var viewPanel property var viewPanel
/// This is signalled when the top level Item reaches Component.onCompleted. This allows /// This is signalled when the top level Item reaches Component.onCompleted. This allows
...@@ -34,68 +33,6 @@ FactPanel { ...@@ -34,68 +33,6 @@ FactPanel {
/// to go. /// to go.
signal completed signal completed
function _setupDialogButtons(buttons) {
_acceptButton.visible = false
_rejectButton.visible = false
// Accept role buttons
if (buttons & StandardButton.Ok) {
_acceptButton.text = qsTr("Ok")
_acceptButton.visible = true
} else if (buttons & StandardButton.Open) {
_acceptButton.text = qsTr("Open")
_acceptButton.visible = true
} else if (buttons & StandardButton.Save) {
_acceptButton.text = qsTr("Save")
_acceptButton.visible = true
} else if (buttons & StandardButton.Apply) {
_acceptButton.text = qsTr("Apply")
_acceptButton.visible = true
} else if (buttons & StandardButton.Open) {
_acceptButton.text = qsTr("Open")
_acceptButton.visible = true
} else if (buttons & StandardButton.SaveAll) {
_acceptButton.text = qsTr("Save All")
_acceptButton.visible = true
} else if (buttons & StandardButton.Yes) {
_acceptButton.text = qsTr("Yes")
_acceptButton.visible = true
} else if (buttons & StandardButton.YesToAll) {
_acceptButton.text = qsTr("Yes to All")
_acceptButton.visible = true
} else if (buttons & StandardButton.Retry) {
_acceptButton.text = qsTr("Retry")
_acceptButton.visible = true
} else if (buttons & StandardButton.Reset) {
_acceptButton.text = qsTr("Reset")
_acceptButton.visible = true
} else if (buttons & StandardButton.RestoreToDefaults) {
_acceptButton.text = qsTr("Restore to Defaults")
_acceptButton.visible = true
} else if (buttons & StandardButton.Ignore) {
_acceptButton.text = qsTr("Ignore")
_acceptButton.visible = true
}
// Reject role buttons
if (buttons & StandardButton.Cancel) {
_rejectButton.text = qsTr("Cancel")
_rejectButton.visible = true
} else if (buttons & StandardButton.Close) {
_rejectButton.text = qsTr("Close")
_rejectButton.visible = true
} else if (buttons & StandardButton.No) {
_rejectButton.text = qsTr("No")
_rejectButton.visible = true
} else if (buttons & StandardButton.NoToAll) {
_rejectButton.text = qsTr("No to All")
_rejectButton.visible = true
} else if (buttons & StandardButton.Abort) {
_rejectButton.text = qsTr("Abort")
_rejectButton.visible = true
}
}
function _checkForEarlyDialog(title) { function _checkForEarlyDialog(title) {
if (!completedSignalled) { if (!completedSignalled) {
console.warn(qsTr("showDialog called before QGCView.completed signalled"), title) console.warn(qsTr("showDialog called before QGCView.completed signalled"), title)
...@@ -116,60 +53,36 @@ FactPanel { ...@@ -116,60 +53,36 @@ FactPanel {
return return
} }
_rejectButton.enabled = true var dialogComponent = Qt.createComponent("QGCViewDialogContainer.qml")
_acceptButton.enabled = true if (dialogComponent.status === Component.Error) {
console.log("Error loading QGCViewDialogContainer.qml: ", dialogComponent.errorString())
_dialogCharWidth = charWidth
_dialogTitle = title
_setupDialogButtons(buttons)
_dialogComponent = component
viewPanel.enabled = false
_dialogOverlay.visible = true
}
function showMessage(title, message, buttons) {
if (_checkForEarlyDialog(title)) {
return return
} }
var dialogWidth = charWidth == showDialogFullWidth ? parent.width : ScreenTools.defaultFontPixelWidth * charWidth
_rejectButton.enabled = true var dialog = dialogComponent.createObject(_rootItem,
_acceptButton.enabled = true {
"anchors.fill": _rootItem,
_dialogCharWidth = showDialogDefaultWidth "dialogWidth": dialogWidth,
_dialogTitle = title "dialogTitle": title,
_messageDialogText = message "dialogComponent": component,
"viewPanel": viewPanel
_setupDialogButtons(buttons) })
dialog.setupDialogButtons(buttons)
_dialogComponent = _messageDialog
viewPanel.enabled = false viewPanel.enabled = false
_dialogOverlay.visible = true
} }
function hideDialog() { function showMessage(title, message, buttons) {
viewPanel.enabled = true _messageDialogText = message
_dialogComponent = null showDialog(_messageDialog, title, showDialogDefaultWidth, buttons)
_dialogOverlay.visible = false
} }
QGCPalette { id: _qgcPal; colorGroupEnabled: true } QGCPalette { id: _qgcPal; colorGroupEnabled: true }
QGCLabel { id: _textMeasure; text: "X"; visible: false }
property real defaultTextHeight: _textMeasure.contentHeight
property real defaultTextWidth: _textMeasure.contentWidth
/// The width of the dialog panel in characters
property int _dialogCharWidth: 75
/// The title for the dialog panel property real defaultTextWidth: ScreenTools.defaultFontPixelWidth
property string _dialogTitle property real defaultTextHeight: ScreenTools.defaultFontPixelHeight
property string _messageDialogText property string _messageDialogText
property Component _dialogComponent
function _signalCompleted() { function _signalCompleted() {
// When we use this control inside a QGCQmlWidgetHolder Component.onCompleted is signalled // When we use this control inside a QGCQmlWidgetHolder Component.onCompleted is signalled
// before the width and height are adjusted. So we need to wait for width and heigth to be // before the width and height are adjusted. So we need to wait for width and heigth to be
...@@ -184,109 +97,6 @@ FactPanel { ...@@ -184,109 +97,6 @@ FactPanel {
onWidthChanged: _signalCompleted() onWidthChanged: _signalCompleted()
onHeightChanged: _signalCompleted() onHeightChanged: _signalCompleted()
Connections {
target: _dialogComponentLoader.item
onHideDialog: _rootItem.hideDialog()
}
Item {
id: _dialogOverlay
visible: false
anchors.fill: parent
z: 5000
// This covers the parent with an transparent section
Rectangle {
id: _transparentSection
height: ScreenTools.availableHeight ? ScreenTools.availableHeight : parent.height
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.right: _dialogPanel.left
opacity: 0.0
color: _qgcPal.window
}
// This is the main dialog panel which is anchored to the right edge
Rectangle {
id: _dialogPanel
width: _dialogCharWidth == showDialogFullWidth ? parent.width : defaultTextWidth * _dialogCharWidth
anchors.topMargin: topDialogMargin
height: ScreenTools.availableHeight ? ScreenTools.availableHeight : parent.height
anchors.bottom: parent.bottom
anchors.right: parent.right
color: _qgcPal.windowShadeDark
Rectangle {
id: _header
width: parent.width
height: _acceptButton.visible ? _acceptButton.height : _rejectButton.height
color: _qgcPal.windowShade
function _hidePanel() {
_fullPanel.visible = false
}
QGCLabel {
x: defaultTextWidth
height: parent.height
verticalAlignment: Text.AlignVCenter
text: _dialogTitle
}
QGCButton {
id: _rejectButton
anchors.right: _acceptButton.visible ? _acceptButton.left : parent.right
anchors.bottom: parent.bottom
onClicked: {
enabled = false // prevent multiple clicks
_dialogComponentLoader.item.reject()
if (!viewPanel.enabled) {
// Dialog was not closed, re-enable button
enabled = true
}
}
}
QGCButton {
id: _acceptButton
anchors.right: parent.right
primary: true
onClicked: {
enabled = false // prevent multiple clicks
_dialogComponentLoader.item.accept()
if (!viewPanel.enabled) {
// Dialog was not closed, re-enable button
enabled = true
}
}
}
}
Item {
id: _spacer
width: 10
height: 10
anchors.top: _header.bottom
}
Loader {
id: _dialogComponentLoader
anchors.margins: 5
anchors.left: parent.left
anchors.right: parent.right
anchors.top: _spacer.bottom
anchors.bottom: parent.bottom
sourceComponent: _dialogComponent
property bool acceptAllowed: _acceptButton.visible
property bool rejectAllowed: _rejectButton.visible
}
} // Rectangle - Dialog panel
} // Item - Dialog overlay
Component { Component {
id: _messageDialog id: _messageDialog
......
...@@ -7,22 +7,21 @@ ...@@ -7,22 +7,21 @@
* *
****************************************************************************/ ****************************************************************************/
/// @file
/// @author Don Gagne <don@thegagnes.com>
import QtQuick 2.3 import QtQuick 2.3
import QtQuick.Controls 1.2 import QtQuick.Controls 1.2
import QGroundControl.Controls 1.0 import QGroundControl.Controls 1.0
import QGroundControl.Palette 1.0 import QGroundControl.Palette 1.0
import QGroundControl.FactSystem 1.0 import QGroundControl.FactSystem 1.0
import QGroundControl.FactControls 1.0 import QGroundControl.FactControls 1.0
import QGroundControl.ScreenTools 1.0
FactPanel { FactPanel {
property var qgcTextFieldforwardKeysTo: this ///< Causes all QGCTextFields to forward keys here if they have focus property var qgcTextFieldforwardKeysTo: this ///< Causes all QGCTextFields to forward keys here if they have focus
property real defaultTextWidth: ScreenTools.defaultFontPixelWidth
property real defaultTextHeight: ScreenTools.defaultFontPixelHeight
QGCPalette { id: __qgcPal; colorGroupEnabled: enabled } QGCPalette { id: __qgcPal; colorGroupEnabled: enabled }
signal hideDialog signal hideDialog
......
/****************************************************************************
*
* (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
import QtQuick.Dialogs 1.2
import QGroundControl.Controls 1.0
import QGroundControl.Palette 1.0
import QGroundControl.ScreenTools 1.0
Item {
id: _root
z: 5000
property alias dialogWidth: _dialogPanel.width
property alias dialogTitle: titleLabel.text
property alias dialogComponent: _dialogComponentLoader.sourceComponent
property var viewPanel
property real _defaultTextHeight: _textMeasure.contentHeight
property real _defaultTextWidth: _textMeasure.contentWidth
function setupDialogButtons(buttons) {
_acceptButton.visible = false
_rejectButton.visible = false
// Accept role buttons
if (buttons & StandardButton.Ok) {
_acceptButton.text = qsTr("Ok")
_acceptButton.visible = true
} else if (buttons & StandardButton.Open) {
_acceptButton.text = qsTr("Open")
_acceptButton.visible = true
} else if (buttons & StandardButton.Save) {
_acceptButton.text = qsTr("Save")
_acceptButton.visible = true
} else if (buttons & StandardButton.Apply) {
_acceptButton.text = qsTr("Apply")
_acceptButton.visible = true
} else if (buttons & StandardButton.Open) {
_acceptButton.text = qsTr("Open")
_acceptButton.visible = true
} else if (buttons & StandardButton.SaveAll) {
_acceptButton.text = qsTr("Save All")
_acceptButton.visible = true
} else if (buttons & StandardButton.Yes) {
_acceptButton.text = qsTr("Yes")
_acceptButton.visible = true
} else if (buttons & StandardButton.YesToAll) {
_acceptButton.text = qsTr("Yes to All")
_acceptButton.visible = true
} else if (buttons & StandardButton.Retry) {
_acceptButton.text = qsTr("Retry")
_acceptButton.visible = true
} else if (buttons & StandardButton.Reset) {
_acceptButton.text = qsTr("Reset")
_acceptButton.visible = true
} else if (buttons & StandardButton.RestoreToDefaults) {
_acceptButton.text = qsTr("Restore to Defaults")
_acceptButton.visible = true
} else if (buttons & StandardButton.Ignore) {
_acceptButton.text = qsTr("Ignore")
_acceptButton.visible = true
}
// Reject role buttons
if (buttons & StandardButton.Cancel) {
_rejectButton.text = qsTr("Cancel")
_rejectButton.visible = true
} else if (buttons & StandardButton.Close) {
_rejectButton.text = qsTr("Close")
_rejectButton.visible = true
} else if (buttons & StandardButton.No) {
_rejectButton.text = qsTr("No")
_rejectButton.visible = true
} else if (buttons & StandardButton.NoToAll) {
_rejectButton.text = qsTr("No to All")
_rejectButton.visible = true
} else if (buttons & StandardButton.Abort) {
_rejectButton.text = qsTr("Abort")
_rejectButton.visible = true
}
}
Connections {
target: _dialogComponentLoader.item
onHideDialog: {
viewPanel.enabled = true
_root.destroy()
}
}
QGCPalette { id: _qgcPal; colorGroupEnabled: true }
QGCLabel { id: _textMeasure; text: "X"; visible: false }
Rectangle {
anchors.top: parent.top
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.right: _dialogPanel.left
opacity: 0.5
color: _qgcPal.window
z: 5000
}
// This is the main dialog panel which is anchored to the right edge
Rectangle {
id: _dialogPanel
height: ScreenTools.availableHeight ? ScreenTools.availableHeight : parent.height
anchors.bottom: parent.bottom
anchors.right: parent.right
color: _qgcPal.windowShadeDark
Rectangle {
id: _header
width: parent.width
height: _acceptButton.visible ? _acceptButton.height : _rejectButton.height
color: _qgcPal.windowShade
function _hidePanel() {
_fullPanel.visible = false
}
QGCLabel {
id: titleLabel
x: _defaultTextWidth
height: parent.height
verticalAlignment: Text.AlignVCenter
}
QGCButton {
id: _rejectButton
anchors.right: _acceptButton.visible ? _acceptButton.left : parent.right
anchors.bottom: parent.bottom
onClicked: {
enabled = false // prevent multiple clicks
_dialogComponentLoader.item.reject()
if (!viewPanel.enabled) {
// Dialog was not closed, re-enable button
enabled = true
}
}
}
QGCButton {
id: _acceptButton
anchors.right: parent.right
primary: true
onClicked: {
enabled = false // prevent multiple clicks
_dialogComponentLoader.item.accept()
if (!viewPanel.enabled) {
// Dialog was not closed, re-enable button
enabled = true
}
}
}
}
Item {
id: _spacer
width: 10
height: 10
anchors.top: _header.bottom
}
Loader {
id: _dialogComponentLoader
anchors.margins: 5
anchors.left: parent.left
anchors.right: parent.right
anchors.top: _spacer.bottom
anchors.bottom: parent.bottom
sourceComponent: _dialogComponent
property bool acceptAllowed: _acceptButton.visible
property bool rejectAllowed: _rejectButton.visible
}
} // Rectangle - Dialog panel
}
...@@ -57,6 +57,7 @@ QGCTextField 1.0 QGCTextField.qml ...@@ -57,6 +57,7 @@ QGCTextField 1.0 QGCTextField.qml
QGCToolBarButton 1.0 QGCToolBarButton.qml QGCToolBarButton 1.0 QGCToolBarButton.qml
QGCView 1.0 QGCView.qml QGCView 1.0 QGCView.qml
QGCViewDialog 1.0 QGCViewDialog.qml QGCViewDialog 1.0 QGCViewDialog.qml
QGCViewDialogContainer 1.0 QGCViewDialogContainer.qml
QGCViewMessage 1.0 QGCViewMessage.qml QGCViewMessage 1.0 QGCViewMessage.qml
QGCViewPanel 1.0 QGCViewPanel.qml QGCViewPanel 1.0 QGCViewPanel.qml
RoundButton 1.0 RoundButton.qml RoundButton 1.0 RoundButton.qml
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment