diff --git a/qgroundcontrol.qrc b/qgroundcontrol.qrc
index e611bc2..ccabc9b 100644
--- a/qgroundcontrol.qrc
+++ b/qgroundcontrol.qrc
@@ -32,6 +32,8 @@
src/QmlControls/VehicleSummaryRow.qml
src/QmlControls/arrow-down.png
src/ViewWidgets/ViewWidget.qml
+ src/QmlControls/ViewWithDialog.qml
+
src/QmlControls/ParameterEditor.qml
src/ViewWidgets/ParameterEditorWidget.qml
diff --git a/src/QmlControls/ViewWithDialog.qml b/src/QmlControls/ViewWithDialog.qml
new file mode 100644
index 0000000..61d64c4
--- /dev/null
+++ b/src/QmlControls/ViewWithDialog.qml
@@ -0,0 +1,221 @@
+/*=====================================================================
+
+ QGroundControl Open Source Ground Control Station
+
+ (c) 2009 - 2015 QGROUNDCONTROL PROJECT
+
+ This file is part of the QGROUNDCONTROL project
+
+ QGROUNDCONTROL is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ QGROUNDCONTROL is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with QGROUNDCONTROL. If not, see .
+
+ ======================================================================*/
+
+/// @file
+/// @author Don Gagne
+
+import QtQuick 2.3
+import QtQuick.Controls 1.3
+import QtQuick.Dialogs 1.2
+
+import QGroundControl.Controls 1.0
+import QGroundControl.Palette 1.0
+import QGroundControl.ScreenTools 1.0
+import QGroundControl.FactSystem 1.0
+import QGroundControl.FactControls 1.0
+
+Item {
+ property Component viewComponent
+
+ function __showDialog(component, title, charWidth, buttons) {
+ __acceptButton.visible = false
+ __rejectButton.visible = false
+ __dialogCharWidth = charWidth
+ __dialogTitle = title
+
+ if (buttons & StandardButton.Ok) {
+ __acceptButton.text = "Ok"
+ __acceptButton.visible = true
+ } else if (buttons & StandardButton.Open) {
+ __acceptButton.text = "Open"
+ __acceptButton.visible = true
+ } else if (buttons & StandardButton.Save) {
+ __acceptButton.text = "Save"
+ __acceptButton.visible = true
+ } else if (buttons & StandardButton.Cancel) {
+ __rejectButton.text = "Cancel"
+ __rejectButton.visible = true
+ } else if (buttons & StandardButton.Close) {
+ __rejectButton.text = "Cancel"
+ __rejectButton.visible = true
+ } else if (buttons & StandardButton.Apply) {
+ __acceptButton.text = "Apply"
+ __acceptButton.visible = true
+ } else if (buttons & StandardButton.Open) {
+ __acceptButton.text = "Open"
+ __acceptButton.visible = true
+ } else if (buttons & StandardButton.SaveAll) {
+ __acceptButton.text = "Save All"
+ __acceptButton.visible = true
+ } else if (buttons & StandardButton.Yes) {
+ __acceptButton.text = "Yes"
+ __acceptButton.visible = true
+ } else if (buttons & StandardButton.YesToAll) {
+ __acceptButton.text = "Yes to All"
+ __acceptButton.visible = true
+ } else if (buttons & StandardButton.No) {
+ __rejectButton.text = "No"
+ __rejectButton.visible = true
+ } else if (buttons & StandardButton.NoToAll) {
+ __rejectButton.text = "No to All"
+ __rejectButton.visible = true
+ } else if (buttons & StandardButton.Abort) {
+ __rejectButton.text = "Abort"
+ __rejectButton.visible = true
+ } else if (buttons & StandardButton.Retry) {
+ __acceptButton.text = "Retry"
+ __acceptButton.visible = true
+ } else if (buttons & StandardButton.Reset) {
+ __acceptButton.text = "Reset"
+ __acceptButton.visible = true
+ } else if (buttons & StandardButton.RestoreToDefaults) {
+ __acceptButton.text = "Restore to Defaults"
+ __acceptButton.visible = true
+ } else if (buttons & StandardButton.Ignore) {
+ __acceptButton.text = "Ignore"
+ __acceptButton.visible = true
+ }
+ __dialogComponent = component
+ __viewPanel.enabled = false
+ __dialogOverlay.visible = true
+ }
+
+ function __hideDialog() {
+ __dialogComponent = null
+ __viewPanel.enabled = true
+ __dialogOverlay.visible = false
+ }
+
+ QGCPalette { id: __qgcPal; colorGroupEnabled: true }
+ QGCLabel { id: __textMeasure; text: "X"; visible: false }
+
+ property real __textHeight: __textMeasure.contentHeight
+ property real __textWidth: __textMeasure.contentWidth
+
+ /// The width of the dialog panel in characters
+ property int __dialogCharWidth: 75
+
+ /// The title for the dialog panel
+ property string __dialogTitle
+
+ property Component __dialogComponent
+
+ Component.onCompleted: __viewPanel.item.doWorkAfterComponentCompleted()
+
+ Connections {
+ target: __viewPanel.item
+
+ onShowDialog: __showDialog(component, title, charWidth, buttons)
+ onHideDialog: __hideDialog()
+ }
+
+ Connections {
+ target: __dialogComponentLoader.item
+
+ onHideDialog: __hideDialog()
+ }
+
+ Loader {
+ id: __viewPanel
+ anchors.fill: parent
+ focus: true
+ sourceComponent: viewComponent
+ }
+
+ Item {
+ id: __dialogOverlay
+ visible: false
+ anchors.fill: parent
+ z: 5000
+
+ // This covers the parent with an transparent section
+ Rectangle {
+ anchors.top: parent.top
+ anchors.bottom: parent.bottom
+ anchors.left: parent.left
+ anchors.right: __dialogPanel.left
+ opacity: 0.80
+ color: __qgcPal.window
+ }
+
+ // This is the main dialog panel which is anchored to the right edge
+ Rectangle {
+ id: __dialogPanel
+ width: __textWidth * __dialogCharWidth
+ height: parent.height
+ anchors.right: parent.right
+ color: __qgcPal.windowShadeDark
+
+ Rectangle {
+ id: __header
+ width: parent.width
+ height: __acceptButton.height
+ color: __qgcPal.windowShade
+
+ function __hidePanel() {
+ __fullPanel.visible = false
+ }
+
+ QGCLabel {
+ x: __textWidth
+ height: parent.height
+ verticalAlignment: Text.AlignVCenter
+ text: __dialogTitle
+ }
+
+ QGCButton {
+ id: __rejectButton
+ anchors.right: __acceptButton.left
+ anchors.bottom: parent.bottom
+
+ onClicked: __dialogComponentLoader.item.reject()
+ }
+
+ QGCButton {
+ id: __acceptButton
+ anchors.right: parent.right
+ primary: true
+
+ onClicked: __dialogComponentLoader.item.accept()
+ }
+ }
+
+ 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
+ }
+ } // Rectangle - Dialog panel
+ } // Item - Dialog overlay
+}
\ No newline at end of file
diff --git a/src/QmlControls/qmldir b/src/QmlControls/qmldir
index b62af1b..a588343 100644
--- a/src/QmlControls/qmldir
+++ b/src/QmlControls/qmldir
@@ -16,4 +16,5 @@ VehicleRotationCal 1.0 VehicleRotationCal.qml
VehicleSummaryRow 1.0 VehicleSummaryRow.qml
ParameterEditor 1.0 ParameterEditor.qml
ViewWidget 1.0 ViewWidget.qml
+ViewWithDialog 1.0 ViewWithDialog.qml