|
|
|
@ -22,90 +22,83 @@ import QGroundControl.FactSystem 1.0
@@ -22,90 +22,83 @@ import QGroundControl.FactSystem 1.0
|
|
|
|
|
import QGroundControl.FactControls 1.0 |
|
|
|
|
|
|
|
|
|
FactPanel { |
|
|
|
|
id: __rootItem |
|
|
|
|
id: _rootItem |
|
|
|
|
|
|
|
|
|
property var qgcView: __rootItem ///< Used by Fact controls for validation dialogs |
|
|
|
|
property bool completedSignalled: false |
|
|
|
|
property real topDialogMargin: 0 ///< Set a top margin for dialog |
|
|
|
|
|
|
|
|
|
property var viewPanel |
|
|
|
|
property var qgcView: _rootItem ///< Used by Fact controls for validation dialogs |
|
|
|
|
property bool completedSignalled: false |
|
|
|
|
property real topDialogMargin: 0 ///< Set a top margin for dialog |
|
|
|
|
property var viewPanel |
|
|
|
|
|
|
|
|
|
/// This is signalled when the top level Item reaches Component.onCompleted. This allows |
|
|
|
|
/// the view subcomponent to connect to this signal and do work once the full ui is ready |
|
|
|
|
/// to go. |
|
|
|
|
signal completed |
|
|
|
|
signal completed |
|
|
|
|
|
|
|
|
|
function __setupDialogButtons(buttons) { |
|
|
|
|
__acceptButton.visible = false |
|
|
|
|
__rejectButton.visible = false |
|
|
|
|
function _setupDialogButtons(buttons) { |
|
|
|
|
_acceptButton.visible = false |
|
|
|
|
_rejectButton.visible = false |
|
|
|
|
|
|
|
|
|
// Accept role buttons |
|
|
|
|
if (buttons & StandardButton.Ok) { |
|
|
|
|
__acceptButton.text = qsTr("Ok") |
|
|
|
|
__acceptButton.visible = true |
|
|
|
|
_acceptButton.text = qsTr("Ok") |
|
|
|
|
_acceptButton.visible = true |
|
|
|
|
} else if (buttons & StandardButton.Open) { |
|
|
|
|
__acceptButton.text = qsTr("Open") |
|
|
|
|
__acceptButton.visible = true |
|
|
|
|
_acceptButton.text = qsTr("Open") |
|
|
|
|
_acceptButton.visible = true |
|
|
|
|
} else if (buttons & StandardButton.Save) { |
|
|
|
|
__acceptButton.text = qsTr("Save") |
|
|
|
|
__acceptButton.visible = true |
|
|
|
|
_acceptButton.text = qsTr("Save") |
|
|
|
|
_acceptButton.visible = true |
|
|
|
|
} else if (buttons & StandardButton.Apply) { |
|
|
|
|
__acceptButton.text = qsTr("Apply") |
|
|
|
|
__acceptButton.visible = true |
|
|
|
|
_acceptButton.text = qsTr("Apply") |
|
|
|
|
_acceptButton.visible = true |
|
|
|
|
} else if (buttons & StandardButton.Open) { |
|
|
|
|
__acceptButton.text = qsTr("Open") |
|
|
|
|
__acceptButton.visible = true |
|
|
|
|
_acceptButton.text = qsTr("Open") |
|
|
|
|
_acceptButton.visible = true |
|
|
|
|
} else if (buttons & StandardButton.SaveAll) { |
|
|
|
|
__acceptButton.text = qsTr("Save All") |
|
|
|
|
__acceptButton.visible = true |
|
|
|
|
_acceptButton.text = qsTr("Save All") |
|
|
|
|
_acceptButton.visible = true |
|
|
|
|
} else if (buttons & StandardButton.Yes) { |
|
|
|
|
__acceptButton.text = qsTr("Yes") |
|
|
|
|
__acceptButton.visible = true |
|
|
|
|
_acceptButton.text = qsTr("Yes") |
|
|
|
|
_acceptButton.visible = true |
|
|
|
|
} else if (buttons & StandardButton.YesToAll) { |
|
|
|
|
__acceptButton.text = qsTr("Yes to All") |
|
|
|
|
__acceptButton.visible = true |
|
|
|
|
_acceptButton.text = qsTr("Yes to All") |
|
|
|
|
_acceptButton.visible = true |
|
|
|
|
} else if (buttons & StandardButton.Retry) { |
|
|
|
|
__acceptButton.text = qsTr("Retry") |
|
|
|
|
__acceptButton.visible = true |
|
|
|
|
_acceptButton.text = qsTr("Retry") |
|
|
|
|
_acceptButton.visible = true |
|
|
|
|
} else if (buttons & StandardButton.Reset) { |
|
|
|
|
__acceptButton.text = qsTr("Reset") |
|
|
|
|
__acceptButton.visible = true |
|
|
|
|
_acceptButton.text = qsTr("Reset") |
|
|
|
|
_acceptButton.visible = true |
|
|
|
|
} else if (buttons & StandardButton.RestoreToDefaults) { |
|
|
|
|
__acceptButton.text = qsTr("Restore to Defaults") |
|
|
|
|
__acceptButton.visible = true |
|
|
|
|
_acceptButton.text = qsTr("Restore to Defaults") |
|
|
|
|
_acceptButton.visible = true |
|
|
|
|
} else if (buttons & StandardButton.Ignore) { |
|
|
|
|
__acceptButton.text = qsTr("Ignore") |
|
|
|
|
__acceptButton.visible = true |
|
|
|
|
_acceptButton.text = qsTr("Ignore") |
|
|
|
|
_acceptButton.visible = true |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Reject role buttons |
|
|
|
|
if (buttons & StandardButton.Cancel) { |
|
|
|
|
__rejectButton.text = qsTr("Cancel") |
|
|
|
|
__rejectButton.visible = true |
|
|
|
|
_rejectButton.text = qsTr("Cancel") |
|
|
|
|
_rejectButton.visible = true |
|
|
|
|
} else if (buttons & StandardButton.Close) { |
|
|
|
|
__rejectButton.text = qsTr("Close") |
|
|
|
|
__rejectButton.visible = true |
|
|
|
|
_rejectButton.text = qsTr("Close") |
|
|
|
|
_rejectButton.visible = true |
|
|
|
|
} else if (buttons & StandardButton.No) { |
|
|
|
|
__rejectButton.text = qsTr("No") |
|
|
|
|
__rejectButton.visible = true |
|
|
|
|
_rejectButton.text = qsTr("No") |
|
|
|
|
_rejectButton.visible = true |
|
|
|
|
} else if (buttons & StandardButton.NoToAll) { |
|
|
|
|
__rejectButton.text = qsTr("No to All") |
|
|
|
|
__rejectButton.visible = true |
|
|
|
|
_rejectButton.text = qsTr("No to All") |
|
|
|
|
_rejectButton.visible = true |
|
|
|
|
} else if (buttons & StandardButton.Abort) { |
|
|
|
|
__rejectButton.text = qsTr("Abort") |
|
|
|
|
__rejectButton.visible = true |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function __stopAllAnimations() { |
|
|
|
|
if (__animateHideDialog.running) { |
|
|
|
|
__animateHideDialog.stop() |
|
|
|
|
_rejectButton.text = qsTr("Abort") |
|
|
|
|
_rejectButton.visible = true |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function __checkForEarlyDialog(title) { |
|
|
|
|
function _checkForEarlyDialog(title) { |
|
|
|
|
if (!completedSignalled) { |
|
|
|
|
console.warn(qsTr("showDialog|Message called before QGCView.completed signalled"), title) |
|
|
|
|
console.warn(qsTr("showDialog called before QGCView.completed signalled"), title) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -119,77 +112,65 @@ FactPanel {
@@ -119,77 +112,65 @@ FactPanel {
|
|
|
|
|
readonly property int showDialogDefaultWidth: 40 ///< Use for default dialog width |
|
|
|
|
|
|
|
|
|
function showDialog(component, title, charWidth, buttons) { |
|
|
|
|
if (__checkForEarlyDialog(title)) { |
|
|
|
|
if (_checkForEarlyDialog(title)) { |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
__rejectButton.enabled = true |
|
|
|
|
__acceptButton.enabled = true |
|
|
|
|
_rejectButton.enabled = true |
|
|
|
|
_acceptButton.enabled = true |
|
|
|
|
|
|
|
|
|
__stopAllAnimations() |
|
|
|
|
_dialogCharWidth = charWidth |
|
|
|
|
_dialogTitle = title |
|
|
|
|
|
|
|
|
|
__dialogCharWidth = charWidth |
|
|
|
|
__dialogTitle = title |
|
|
|
|
_setupDialogButtons(buttons) |
|
|
|
|
|
|
|
|
|
__setupDialogButtons(buttons) |
|
|
|
|
|
|
|
|
|
__dialogComponent = component |
|
|
|
|
_dialogComponent = component |
|
|
|
|
viewPanel.enabled = false |
|
|
|
|
__dialogOverlay.visible = true |
|
|
|
|
|
|
|
|
|
//__dialogComponentLoader.item.forceActiveFocus() |
|
|
|
|
|
|
|
|
|
__animateShowDialog.start() |
|
|
|
|
_dialogOverlay.visible = true |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function showMessage(title, message, buttons) { |
|
|
|
|
if (__checkForEarlyDialog(title)) { |
|
|
|
|
if (_checkForEarlyDialog(title)) { |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
__rejectButton.enabled = true |
|
|
|
|
__acceptButton.enabled = true |
|
|
|
|
_rejectButton.enabled = true |
|
|
|
|
_acceptButton.enabled = true |
|
|
|
|
|
|
|
|
|
__stopAllAnimations() |
|
|
|
|
_dialogCharWidth = showDialogDefaultWidth |
|
|
|
|
_dialogTitle = title |
|
|
|
|
_messageDialogText = message |
|
|
|
|
|
|
|
|
|
__dialogCharWidth = showDialogDefaultWidth |
|
|
|
|
__dialogTitle = title |
|
|
|
|
__messageDialogText = message |
|
|
|
|
_setupDialogButtons(buttons) |
|
|
|
|
|
|
|
|
|
__setupDialogButtons(buttons) |
|
|
|
|
|
|
|
|
|
__dialogComponent = __messageDialog |
|
|
|
|
_dialogComponent = _messageDialog |
|
|
|
|
viewPanel.enabled = false |
|
|
|
|
__dialogOverlay.visible = true |
|
|
|
|
|
|
|
|
|
__dialogComponentLoader.item.forceActiveFocus() |
|
|
|
|
|
|
|
|
|
__animateShowDialog.start() |
|
|
|
|
_dialogOverlay.visible = true |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function hideDialog() { |
|
|
|
|
//__dialogComponentLoader.item.focus = false |
|
|
|
|
viewPanel.enabled = true |
|
|
|
|
__animateHideDialog.start() |
|
|
|
|
_dialogComponent = null |
|
|
|
|
_dialogOverlay.visible = false |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
QGCPalette { id: __qgcPal; colorGroupEnabled: true } |
|
|
|
|
QGCLabel { id: __textMeasure; text: "X"; visible: false } |
|
|
|
|
QGCPalette { id: _qgcPal; colorGroupEnabled: true } |
|
|
|
|
QGCLabel { id: _textMeasure; text: "X"; visible: false } |
|
|
|
|
|
|
|
|
|
property real defaultTextHeight: __textMeasure.contentHeight |
|
|
|
|
property real defaultTextWidth: __textMeasure.contentWidth |
|
|
|
|
property real defaultTextHeight: _textMeasure.contentHeight |
|
|
|
|
property real defaultTextWidth: _textMeasure.contentWidth |
|
|
|
|
|
|
|
|
|
/// The width of the dialog panel in characters |
|
|
|
|
property int __dialogCharWidth: 75 |
|
|
|
|
property int _dialogCharWidth: 75 |
|
|
|
|
|
|
|
|
|
/// The title for the dialog panel |
|
|
|
|
property string __dialogTitle |
|
|
|
|
property string _dialogTitle |
|
|
|
|
|
|
|
|
|
property string __messageDialogText |
|
|
|
|
property string _messageDialogText |
|
|
|
|
|
|
|
|
|
property Component __dialogComponent |
|
|
|
|
property Component _dialogComponent |
|
|
|
|
|
|
|
|
|
function __signalCompleted() { |
|
|
|
|
function _signalCompleted() { |
|
|
|
|
// 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 |
|
|
|
|
// set before we signal our own completed signal. |
|
|
|
@ -199,160 +180,118 @@ FactPanel {
@@ -199,160 +180,118 @@ FactPanel {
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Component.onCompleted: __signalCompleted() |
|
|
|
|
onWidthChanged: __signalCompleted() |
|
|
|
|
onHeightChanged: __signalCompleted() |
|
|
|
|
Component.onCompleted: _signalCompleted() |
|
|
|
|
onWidthChanged: _signalCompleted() |
|
|
|
|
onHeightChanged: _signalCompleted() |
|
|
|
|
|
|
|
|
|
Connections { |
|
|
|
|
target: __dialogComponentLoader.item |
|
|
|
|
target: _dialogComponentLoader.item |
|
|
|
|
|
|
|
|
|
onHideDialog: __rootItem.hideDialog() |
|
|
|
|
onHideDialog: _rootItem.hideDialog() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Item { |
|
|
|
|
id: __dialogOverlay |
|
|
|
|
id: _dialogOverlay |
|
|
|
|
visible: false |
|
|
|
|
anchors.fill: parent |
|
|
|
|
z: 5000 |
|
|
|
|
|
|
|
|
|
readonly property int __animationDuration: 200 |
|
|
|
|
|
|
|
|
|
ParallelAnimation { |
|
|
|
|
id: __animateShowDialog |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
NumberAnimation { |
|
|
|
|
target: __transparentSection |
|
|
|
|
properties: "opacity" |
|
|
|
|
from: 0.0 |
|
|
|
|
to: 0.8 |
|
|
|
|
duration: __dialogOverlay.__animationDuration |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
NumberAnimation { |
|
|
|
|
target: __transparentSection |
|
|
|
|
properties: "width" |
|
|
|
|
from: __dialogOverlay.width |
|
|
|
|
to: __dialogOverlay.width - __dialogPanel.width |
|
|
|
|
duration: __dialogOverlay.__animationDuration |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ParallelAnimation { |
|
|
|
|
id: __animateHideDialog |
|
|
|
|
|
|
|
|
|
NumberAnimation { |
|
|
|
|
target: __transparentSection |
|
|
|
|
properties: "opacity" |
|
|
|
|
from: 0.8 |
|
|
|
|
to: 0.0 |
|
|
|
|
duration: __dialogOverlay.__animationDuration |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
NumberAnimation { |
|
|
|
|
target: __transparentSection |
|
|
|
|
properties: "width" |
|
|
|
|
from: __dialogOverlay.width - __dialogPanel.width |
|
|
|
|
to: __dialogOverlay.width |
|
|
|
|
duration: __dialogOverlay.__animationDuration |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
onRunningChanged: { |
|
|
|
|
if (!running) { |
|
|
|
|
__dialogComponent = null |
|
|
|
|
__dialogOverlay.visible = false |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// This covers the parent with an transparent section |
|
|
|
|
Rectangle { |
|
|
|
|
id: __transparentSection |
|
|
|
|
id: _transparentSection |
|
|
|
|
height: ScreenTools.availableHeight ? ScreenTools.availableHeight : parent.height |
|
|
|
|
anchors.bottom: parent.bottom |
|
|
|
|
anchors.left: parent.left |
|
|
|
|
anchors.right: __dialogPanel.left |
|
|
|
|
anchors.right: _dialogPanel.left |
|
|
|
|
opacity: 0.0 |
|
|
|
|
color: __qgcPal.window |
|
|
|
|
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 |
|
|
|
|
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 |
|
|
|
|
color: _qgcPal.windowShadeDark |
|
|
|
|
|
|
|
|
|
Rectangle { |
|
|
|
|
id: __header |
|
|
|
|
id: _header |
|
|
|
|
width: parent.width |
|
|
|
|
height: __acceptButton.visible ? __acceptButton.height : __rejectButton.height |
|
|
|
|
color: __qgcPal.windowShade |
|
|
|
|
height: _acceptButton.visible ? _acceptButton.height : _rejectButton.height |
|
|
|
|
color: _qgcPal.windowShade |
|
|
|
|
|
|
|
|
|
function __hidePanel() { |
|
|
|
|
__fullPanel.visible = false |
|
|
|
|
function _hidePanel() { |
|
|
|
|
_fullPanel.visible = false |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
QGCLabel { |
|
|
|
|
x: defaultTextWidth |
|
|
|
|
height: parent.height |
|
|
|
|
verticalAlignment: Text.AlignVCenter |
|
|
|
|
text: __dialogTitle |
|
|
|
|
text: _dialogTitle |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
QGCButton { |
|
|
|
|
id: __rejectButton |
|
|
|
|
anchors.right: __acceptButton.visible ? __acceptButton.left : parent.right |
|
|
|
|
id: _rejectButton |
|
|
|
|
anchors.right: _acceptButton.visible ? _acceptButton.left : parent.right |
|
|
|
|
anchors.bottom: parent.bottom |
|
|
|
|
|
|
|
|
|
onClicked: { |
|
|
|
|
enabled = false // prevent multiple clicks |
|
|
|
|
__dialogComponentLoader.item.reject() |
|
|
|
|
_dialogComponentLoader.item.reject() |
|
|
|
|
if (!viewPanel.enabled) { |
|
|
|
|
// Dialog was not closed, re-enable button |
|
|
|
|
enabled = true |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
QGCButton { |
|
|
|
|
id: __acceptButton |
|
|
|
|
id: _acceptButton |
|
|
|
|
anchors.right: parent.right |
|
|
|
|
primary: true |
|
|
|
|
|
|
|
|
|
onClicked: { |
|
|
|
|
enabled = false // prevent multiple clicks |
|
|
|
|
__dialogComponentLoader.item.accept() |
|
|
|
|
_dialogComponentLoader.item.accept() |
|
|
|
|
if (!viewPanel.enabled) { |
|
|
|
|
// Dialog was not closed, re-enable button |
|
|
|
|
enabled = true |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Item { |
|
|
|
|
id: __spacer |
|
|
|
|
id: _spacer |
|
|
|
|
width: 10 |
|
|
|
|
height: 10 |
|
|
|
|
anchors.top: __header.bottom |
|
|
|
|
anchors.top: _header.bottom |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Loader { |
|
|
|
|
id: __dialogComponentLoader |
|
|
|
|
id: _dialogComponentLoader |
|
|
|
|
anchors.margins: 5 |
|
|
|
|
anchors.left: parent.left |
|
|
|
|
anchors.right: parent.right |
|
|
|
|
anchors.top: __spacer.bottom |
|
|
|
|
anchors.top: _spacer.bottom |
|
|
|
|
anchors.bottom: parent.bottom |
|
|
|
|
sourceComponent: __dialogComponent |
|
|
|
|
sourceComponent: _dialogComponent |
|
|
|
|
|
|
|
|
|
property bool acceptAllowed: __acceptButton.visible |
|
|
|
|
property bool rejectAllowed: __rejectButton.visible |
|
|
|
|
property bool acceptAllowed: _acceptButton.visible |
|
|
|
|
property bool rejectAllowed: _rejectButton.visible |
|
|
|
|
} |
|
|
|
|
} // Rectangle - Dialog panel |
|
|
|
|
} // Item - Dialog overlay |
|
|
|
|
|
|
|
|
|
Component { |
|
|
|
|
id: __messageDialog |
|
|
|
|
id: _messageDialog |
|
|
|
|
|
|
|
|
|
QGCViewMessage { |
|
|
|
|
message: __messageDialogText |
|
|
|
|
message: _messageDialogText |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|