diff --git a/qgroundcontrol.qrc b/qgroundcontrol.qrc
index ccabc9be31c3c8ebd738baa43a49810da4170be0..a8df5dd55aa1c800b50fa4ed31037f99c22e2ecd 100644
--- a/qgroundcontrol.qrc
+++ b/qgroundcontrol.qrc
@@ -32,7 +32,10 @@
src/QmlControls/VehicleSummaryRow.qml
src/QmlControls/arrow-down.png
src/ViewWidgets/ViewWidget.qml
- src/QmlControls/ViewWithDialog.qml
+
+ src/QmlControls/QGCView.qml
+ src/QmlControls/QGCViewPanel.qml
+ src/QmlControls/QGCViewDialog.qml
src/QmlControls/ParameterEditor.qml
diff --git a/src/AutoPilotPlugins/PX4/AirframeComponent.qml b/src/AutoPilotPlugins/PX4/AirframeComponent.qml
index 37a58d2f3d72328f61d26c0d956965a2126e1e0d..277458be031cc5cb28f7d99d2f150c7dd56a67e6 100644
--- a/src/AutoPilotPlugins/PX4/AirframeComponent.qml
+++ b/src/AutoPilotPlugins/PX4/AirframeComponent.qml
@@ -32,8 +32,9 @@ import QGroundControl.Palette 1.0
import QGroundControl.Controls 1.0
import QGroundControl.Controllers 1.0
-ViewWithDialog {
- viewComponent: view
+QGCView {
+ id: rootQGCView
+ viewComponent: view
Component {
id: view
@@ -45,9 +46,13 @@ ViewWithDialog {
signal showDialog(Component component, string title, int charWidth, int buttons)
signal hideDialog
- function doWorkAfterComponentCompleted() {
- if (controller.showCustomConfigPanel) {
- panel.showDialog(customConfigDialog, "Custom Airframe Config", 50, StandardButton.Reset)
+ Connections {
+ target: rootQGCView
+
+ onCompleted: {
+ if (controller.showCustomConfigPanel) {
+ panel.showDialog(customConfigDialog, "Custom Airframe Config", 50, StandardButton.Reset)
+ }
}
}
diff --git a/src/QmlControls/ParameterEditor.qml b/src/QmlControls/ParameterEditor.qml
index d40f849b2df4277505bcbd73badc3d8a3a99f2b3..0d39e0302957116019dbe73d3cbdabfcb1558345 100644
--- a/src/QmlControls/ParameterEditor.qml
+++ b/src/QmlControls/ParameterEditor.qml
@@ -36,384 +36,336 @@ import QGroundControl.Controllers 1.0
import QGroundControl.FactSystem 1.0
import QGroundControl.FactControls 1.0
-Rectangle {
- /// true: show full information, false: for use in smaller widgets
- property bool fullMode: true
-
- QGCPalette { id: __qgcPal; colorGroupEnabled: true }
- ParameterEditorController { id: __controller }
- QGCLabel { id: __textControl; text: "X"; visible: false }
-
- readonly property real __leftMargin: 10
- readonly property real __rightMargin: 20
- readonly property int __maxParamChars: 16
-
- color: __qgcPal.window
-
- // We use an ExclusiveGroup to maintain the visibility of a single editing control at a time
- ExclusiveGroup {
- id: __exclusiveEditorGroup
- }
-
- property Fact __editorOverlayFact: Fact { }
- property real __textHeight: __textControl.contentHeight
- property real __textWidth: __textControl.contentWidth
-
- Item {
- id: __editorOverlay
-
- anchors.fill: parent
- visible: false
- z: 100
-
- Rectangle {
- width: __textWidth * 75
- height: parent.height
- anchors.left: parent.left
- anchors.right: editorDialog.left
- opacity: 0.80
- color: __qgcPal.window
- }
+QGCView {
+ viewComponent: parameterList
- Rectangle {
- id: editorDialog
- width: fullMode ? __textWidth * 50 : parent.width
- height: parent.height
- anchors.right: parent.right
- color: __qgcPal.windowShadeDark
+ /// true: show full information, false: for use in smaller widgets
+ property bool fullMode: true
- Column {
- spacing: __textHeight
- anchors.fill: parent
+ QGCPalette { id: __qgcPal; colorGroupEnabled: true }
+ ParameterEditorController { id: __controller }
+ QGCLabel { id: __textMeasure; text: "X"; visible: false }
+ property Fact __editorDialogFact: Fact { }
- Rectangle {
- width: parent.width
- height: saveButton.height
- color: __qgcPal.windowShade
- QGCLabel {
- x: __textWidth
- height: parent.height
- verticalAlignment: Text.AlignVCenter
- text: "Edit Parameter"
- }
+ readonly property real __leftMargin: 10
+ readonly property real __rightMargin: 20
+ readonly property int __maxParamChars: 16
- QGCButton {
- anchors.right: saveButton.left
- anchors.bottom: parent.bottom
- text: "Cancel"
+ property real __textHeight: __textMeasure.contentHeight
+ property real __textWidth: __textMeasure.contentWidth
- onClicked: {
- __editorOverlay.visible = false
- }
- }
+ Component {
+ id: parameterList
- QGCButton {
- id: saveButton
- anchors.right: parent.right
- primary: true
- text: "Save"
+ QGCViewPanel {
+ id: panel
- onClicked: {
- __editorOverlayFact.value = valueField.text
- __editorOverlay.visible = false
- }
- }
- }
+ Component {
+ id: factRowsComponent
Column {
- spacing: __textHeight
- anchors.leftMargin: __textWidth * 2
- anchors.rightMargin: __textWidth
- anchors.left: parent.left
- anchors.right: parent.right
+ id: factColumn
+ x: __leftMargin
QGCLabel {
- width: parent.width
- wrapMode: Text.WordWrap
- text: __editorOverlayFact.shortDescription ? __editorOverlayFact.shortDescription : "Description missing"
+ height: __textHeight + (ScreenTools.pixelSizeFactor * (9))
+ text: group
+ verticalAlignment: Text.AlignVCenter
+ font.pointSize: ScreenTools.fontPointFactor * (16);
}
- QGCLabel {
- width: parent.width
- wrapMode: Text.WordWrap
- visible: __editorOverlayFact.longDescription
- text: __editorOverlayFact.longDescription
+ Rectangle {
+ width: parent.width
+ height: 1
+ color: __qgcPal.text
}
- QGCTextField {
- id: valueField
- text: __editorOverlayFact.valueString
- }
+ Repeater {
+ model: __controller.getFactsForGroup(componentId, group)
- QGCLabel { text: __editorOverlayFact.name }
+ Column {
+ Item {
+ x: __leftMargin
+ width: parent.width
+ height: __textHeight + (ScreenTools.pixelSizeFactor * (9))
- Row {
- spacing: __textWidth
+ Fact {
+ id: modelFact
- QGCLabel { text: "Units:" }
- QGCLabel { text: __editorOverlayFact.units ? __editorOverlayFact.units : "none" }
- }
+ Component.onCompleted: {
+ name = modelData + ":" + componentId
+ }
+ }
+
+ QGCLabel {
+ id: nameLabel
+ width: __textWidth * (__maxParamChars + 1)
+ height: parent.height
+ verticalAlignment: Text.AlignVCenter
+ text: modelFact.name
+ }
+
+ QGCLabel {
+ id: valueLabel
+ width: __textWidth * 20
+ height: parent.height
+ anchors.left: nameLabel.right
+ verticalAlignment: Text.AlignVCenter
+ color: modelFact.valueEqualsDefault ? __qgcPal.text : "orange"
+ text: modelFact.valueString + " " + modelFact.units
+ }
+
+ QGCLabel {
+ height: parent.height
+ anchors.left: valueLabel.right
+ verticalAlignment: Text.AlignVCenter
+ visible: fullMode
+ text: modelFact.shortDescription
+ }
+
+ MouseArea {
+ anchors.fill: parent
+ acceptedButtons: Qt.LeftButton
+
+ onClicked: {
+ __editorDialogFact = modelFact
+ panel.showDialog(editorDialogComponent, "Parameter Editor", fullMode ? 50 : -1, StandardButton.Cancel | StandardButton.Save)
+ }
+ }
+ }
- Row {
- spacing: __textWidth
+ Rectangle {
+ x: __leftMargin
+ width: factColumn.width - __leftMargin - __rightMargin
+ height: 1
+ color: __qgcPal.windowShade
+ }
+ } // Column - Fact
+ } // Repeater - Facts
+ } // Column - Facts
+ } // Component - factRowsComponent
- QGCLabel { text: "Minimum value:" }
- QGCLabel { text: __editorOverlayFact.min }
- }
+ Column {
+ anchors.fill: parent
- Row {
- spacing: __textWidth
+ Item {
+ width: parent.width
+ height: firstButton.height
- QGCLabel { text: "Maxmimum value:" }
- QGCLabel { text: __editorOverlayFact.max }
+ QGCLabel {
+ font.pointSize: ScreenTools.fontPointFactor * (20)
+ visible: fullMode
+ text: "PARAMETER EDITOR"
}
Row {
- spacing: __textWidth
-
- QGCLabel { text: "Default value:" }
- QGCLabel { text: __editorOverlayFact.defaultValueAvailable ? __editorOverlayFact.defaultValue : "none" }
- }
+ spacing: 10
+ layoutDirection: Qt.RightToLeft
+ width: parent.width
- QGCLabel {
- width: parent.width
- wrapMode: Text.WordWrap
- text: "Warning: Modifying parameters while vehicle is in flight can lead to vehicle instability and possible vehicle loss. " +
- "Make sure you know what you are doing and double-check your values before Save!"
+ QGCButton {
+ text: "Clear RC to Param"
+ onClicked: __controller.clearRCToParam()
+ }
+ QGCButton {
+ text: "Save to file"
+ visible: fullMode
+ onClicked: __controller.saveToFile()
+ }
+ QGCButton {
+ text: "Load from file"
+ visible: fullMode
+ onClicked: __controller.loadFromFile()
+ }
+ QGCButton {
+ id: firstButton
+ text: "Refresh"
+ onClicked: __controller.refresh()
+ }
}
- } // Column - Fact information
- } // Column - Header + Fact information
-
-
- QGCButton {
- anchors.rightMargin: __textWidth
- anchors.right: rcButton.left
- anchors.bottom: parent.bottom
- visible: __editorOverlayFact.defaultValueAvailable
- text: "Reset to default"
+ }
- onClicked: {
- __editorOverlayFact.value = __editorOverlayFact.defaultValue
- __editorOverlay.visible = false
+ Item {
+ id: lastSpacer
+ height: 10
+ width: 5
}
- }
- QGCButton {
- id: rcButton
- anchors.right: parent.right
- anchors.bottom: parent.bottom
- visible: __editorOverlayFact.defaultValueAvailable
- text: "Set RC to Param..."
- onClicked: __controller.setRCToParam(__editorOverlayFact.name)
- }
- } // Rectangle - editorDialog
- } // Item - editorOverlay
+ Item {
+ width: parent.width
+ height: parent.height - (lastSpacer.y + lastSpacer.height)
- Component {
- id: factRowsComponent
+ ScrollView {
+ id : groupScroll
+ width: __textWidth * 25
+ height: parent.height
- Column {
- id: factColumn
- x: __leftMargin
+ Column {
+ Repeater {
+ model: __controller.componentIds
- QGCLabel {
- height: __textHeight + (ScreenTools.pixelSizeFactor * (9))
- text: group
- verticalAlignment: Text.AlignVCenter
- font.pointSize: ScreenTools.fontPointFactor * (16);
- }
+ Column {
+ id: componentColumn
- Rectangle {
- width: parent.width
- height: 1
- color: __qgcPal.text
- }
+ readonly property int componentId: parseInt(modelData)
- Repeater {
- model: __controller.getFactsForGroup(componentId, group)
+ QGCLabel {
+ height: contentHeight + (ScreenTools.pixelSizeFactor * (9))
+ text: "Component #: " + componentId.toString()
+ verticalAlignment: Text.AlignVCenter
+ font.pointSize: ScreenTools.fontPointFactor * (16);
+ }
- Column {
- Item {
- x: __leftMargin
- width: parent.width
- height: __textHeight + (ScreenTools.pixelSizeFactor * (9))
+ Repeater {
+ model: __controller.getGroupsForComponent(componentColumn.componentId)
+
+ Column {
+ QGCButton {
+ x: __leftMargin
+ width: groupScroll.width - __leftMargin - __rightMargin
+ text: modelData
+
+ onClicked: {
+ factRowsLoader.sourceComponent = null
+ factRowsLoader.componentId = componentId
+ factRowsLoader.group = modelData
+ factRowsLoader.sourceComponent = factRowsComponent
+ }
+ }
+
+ Item {
+ width: 1
+ height: ScreenTools.pixelSizeFactor * (3)
+ }
+ } // Column - Group
+ } // Repeater - Groups
- Fact {
- id: modelFact
+ Item {
+ height: 10
+ width: 10
+ }
+ } // Column - Component
+ } // Repeater - Components
+ } // Column - Component
+ } // ScrollView - Groups
- Component.onCompleted: {
- name = modelData + ":" + componentId
- }
- }
+ ScrollView {
+ id: factScrollView
+ anchors.left: groupScroll.right
+ anchors.right: parent.right
+ height: parent.height
- QGCLabel {
- id: nameLabel
- width: __textWidth * (__maxParamChars + 1)
- height: parent.height
- verticalAlignment: Text.AlignVCenter
- text: modelFact.name
- }
+ Loader {
+ id: factRowsLoader
+ width: factScrollView.width
- QGCLabel {
- id: valueLabel
- width: __textWidth * 20
- height: parent.height
- anchors.left: nameLabel.right
- verticalAlignment: Text.AlignVCenter
- color: modelFact.valueEqualsDefault ? __qgcPal.text : "orange"
- text: modelFact.valueString + " " + modelFact.units
+ property int componentId: __controller.componentIds[0]
+ property string group: __controller.getGroupsForComponent(__controller.componentIds[0])[0]
+ sourceComponent: factRowsComponent
}
+ } // ScrollView - Facts
+ } // Item - Group ScrollView + Facts
+ } // Column - Outer
+ }
+ } // Component - Parameter List
- QGCLabel {
- height: parent.height
- anchors.left: valueLabel.right
- verticalAlignment: Text.AlignVCenter
- visible: fullMode
- text: modelFact.shortDescription
- }
+ Component {
+ id: editorDialogComponent
- MouseArea {
- anchors.fill: parent
- acceptedButtons: Qt.LeftButton
+ QGCViewDialog {
+ id: editorDialog
- onClicked: {
- __editorOverlayFact = modelFact
- __editorOverlay.visible = true
- }
- }
- }
+ property bool fullMode: true
- Rectangle {
- x: __leftMargin
- width: factColumn.width - __leftMargin - __rightMargin
- height: 1
- color: __qgcPal.windowShade
- }
- } // Column - Fact
- } // Repeater - Facts
- } // Column - Facts
- } // Component - factRowsComponent
-
- Column {
- anchors.fill: parent
-
- Item {
- width: parent.width
- height: firstButton.height
-
- QGCLabel {
- font.pointSize: ScreenTools.fontPointFactor * (20)
- visible: fullMode
- text: "PARAMETER EDITOR"
+ function accept() {
+ __editorDialogFact.value = valueField.text
+ editorDialog.hideDialog()
}
- Row {
- spacing: 10
- layoutDirection: Qt.RightToLeft
- width: parent.width
+ Column {
+ spacing: __textHeight
+ anchors.left: parent.left
+ anchors.right: parent.right
- QGCButton {
- text: "Clear RC to Param"
- onClicked: __controller.clearRCToParam()
+ QGCLabel {
+ width: parent.width
+ wrapMode: Text.WordWrap
+ text: __editorDialogFact.shortDescription ? __editorDialogFact.shortDescription : "Description missing"
}
- QGCButton {
- text: "Save to file"
- visible: fullMode
- onClicked: __controller.saveToFile()
- }
- QGCButton {
- text: "Load from file"
- visible: fullMode
- onClicked: __controller.loadFromFile()
- }
- QGCButton {
- id: firstButton
- text: "Refresh"
- onClicked: __controller.refresh()
+
+ QGCLabel {
+ width: parent.width
+ wrapMode: Text.WordWrap
+ visible: __editorDialogFact.longDescription
+ text: __editorDialogFact.longDescription
}
- }
- }
- Item {
- id: lastSpacer
- height: 10
- width: 5
- }
+ QGCTextField {
+ id: valueField
+ text: __editorDialogFact.valueString
+ }
- Item {
- width: parent.width
- height: parent.height - (lastSpacer.y + lastSpacer.height)
+ QGCLabel { text: __editorDialogFact.name }
- ScrollView {
- id : groupScroll
- width: __textWidth * 25
- height: parent.height
+ Row {
+ spacing: __textWidth
- Column {
- Repeater {
- model: __controller.componentIds
+ QGCLabel { text: "Units:" }
+ QGCLabel { text: __editorDialogFact.units ? __editorDialogFact.units : "none" }
+ }
- Column {
- id: componentColumn
+ Row {
+ spacing: __textWidth
- readonly property int componentId: parseInt(modelData)
+ QGCLabel { text: "Minimum value:" }
+ QGCLabel { text: __editorDialogFact.min }
+ }
- QGCLabel {
- height: contentHeight + (ScreenTools.pixelSizeFactor * (9))
- text: "Component #: " + componentId.toString()
- verticalAlignment: Text.AlignVCenter
- font.pointSize: ScreenTools.fontPointFactor * (16);
- }
+ Row {
+ spacing: __textWidth
- Repeater {
- model: __controller.getGroupsForComponent(componentColumn.componentId)
+ QGCLabel { text: "Maxmimum value:" }
+ QGCLabel { text: __editorDialogFact.max }
+ }
- Column {
- QGCButton {
- x: __leftMargin
- width: groupScroll.width - __leftMargin - __rightMargin
- text: modelData
-
- onClicked: {
- factRowsLoader.sourceComponent = null
- factRowsLoader.componentId = componentId
- factRowsLoader.group = modelData
- factRowsLoader.sourceComponent = factRowsComponent
- }
- }
+ Row {
+ spacing: __textWidth
- Item {
- width: 1
- height: ScreenTools.pixelSizeFactor * (3)
- }
- } // Column - Group
- } // Repeater - Groups
+ QGCLabel { text: "Default value:" }
+ QGCLabel { text: __editorDialogFact.defaultValueAvailable ? __editorDialogFact.defaultValue : "none" }
+ }
- Item {
- height: 10
- width: 10
- }
- } // Column - Component
- } // Repeater - Components
- } // Column - Component
- } // ScrollView - Groups
+ QGCLabel {
+ width: parent.width
+ wrapMode: Text.WordWrap
+ text: "Warning: Modifying parameters while vehicle is in flight can lead to vehicle instability and possible vehicle loss. " +
+ "Make sure you know what you are doing and double-check your values before Save!"
+ }
+ } // Column - Fact information
- ScrollView {
- id: factScrollView
- anchors.left: groupScroll.right
- anchors.right: parent.right
- height: parent.height
- Loader {
- id: factRowsLoader
- width: factScrollView.width
+ QGCButton {
+ anchors.rightMargin: __textWidth
+ anchors.right: rcButton.left
+ anchors.bottom: parent.bottom
+ visible: __editorDialogFact.defaultValueAvailable
+ text: "Reset to default"
- property int componentId: __controller.componentIds[0]
- property string group: __controller.getGroupsForComponent(__controller.componentIds[0])[0]
- sourceComponent: factRowsComponent
+ onClicked: {
+ __editorDialogFact.value = __editorDialogFact.defaultValue
+ editorDialog.hideDialog()
}
- } // ScrollView - Facts
- } // Item - Group ScrollView + Facts
- } // Column - Outer
-}
+ }
+
+ QGCButton {
+ id: rcButton
+ anchors.right: parent.right
+ anchors.bottom: parent.bottom
+ visible: __editorDialogFact.defaultValueAvailable
+ text: "Set RC to Param..."
+ onClicked: __controller.setRCToParam(__editorDialogFact.name)
+ }
+ } // Rectangle - editorDialog
+ } // Component - Editor Dialog
+} // QGCView
\ No newline at end of file
diff --git a/src/QmlControls/ViewWithDialog.qml b/src/QmlControls/QGCView.qml
similarity index 93%
rename from src/QmlControls/ViewWithDialog.qml
rename to src/QmlControls/QGCView.qml
index 61d64c41bbaffb4c7b3c0a5eded26a3af23570d8..001c2e59e7c1bbacce2ce404cd5cc5c446f6220d 100644
--- a/src/QmlControls/ViewWithDialog.qml
+++ b/src/QmlControls/QGCView.qml
@@ -35,14 +35,22 @@ import QGroundControl.FactSystem 1.0
import QGroundControl.FactControls 1.0
Item {
+ id: __rootItem
+
property Component viewComponent
+ /// 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
+
function __showDialog(component, title, charWidth, buttons) {
__acceptButton.visible = false
__rejectButton.visible = false
__dialogCharWidth = charWidth
__dialogTitle = title
+ // Accept role buttons
if (buttons & StandardButton.Ok) {
__acceptButton.text = "Ok"
__acceptButton.visible = true
@@ -52,12 +60,6 @@ Item {
} 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
@@ -73,15 +75,6 @@ Item {
} 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
@@ -95,6 +88,25 @@ Item {
__acceptButton.text = "Ignore"
__acceptButton.visible = true
}
+
+ // Reject role buttons
+ 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.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
+ }
+
__dialogComponent = component
__viewPanel.enabled = false
__dialogOverlay.visible = true
@@ -120,7 +132,7 @@ Item {
property Component __dialogComponent
- Component.onCompleted: __viewPanel.item.doWorkAfterComponentCompleted()
+ Component.onCompleted: completed()
Connections {
target: __viewPanel.item
@@ -161,7 +173,7 @@ Item {
// This is the main dialog panel which is anchored to the right edge
Rectangle {
id: __dialogPanel
- width: __textWidth * __dialogCharWidth
+ width: __dialogCharWidth == -1 ? parent.width : __textWidth * __dialogCharWidth
height: parent.height
anchors.right: parent.right
color: __qgcPal.windowShadeDark
diff --git a/src/QmlControls/QGCViewDialog.qml b/src/QmlControls/QGCViewDialog.qml
new file mode 100644
index 0000000000000000000000000000000000000000..f65b9d61296c5d31430784b5001d5f2a03ef6abc
--- /dev/null
+++ b/src/QmlControls/QGCViewDialog.qml
@@ -0,0 +1,47 @@
+/*=====================================================================
+
+ 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 QGroundControl.Controls 1.0
+import QGroundControl.Palette 1.0
+
+Rectangle {
+ QGCPalette { id: qgcPal; colorGroupEnabled: enabled }
+
+ signal hideDialog
+
+ function accept() {
+ hideDialog()
+ }
+
+ function reject() {
+ hideDialog()
+ }
+
+ color: qgcPal.windowShadeDark
+}
diff --git a/src/QmlControls/QGCViewPanel.qml b/src/QmlControls/QGCViewPanel.qml
new file mode 100644
index 0000000000000000000000000000000000000000..3bf89d9e84660ee2d671337e8b1056af1d3604a2
--- /dev/null
+++ b/src/QmlControls/QGCViewPanel.qml
@@ -0,0 +1,40 @@
+/*=====================================================================
+
+ 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 QGroundControl.Palette 1.0
+import QGroundControl.Controls 1.0
+
+Rectangle {
+ QGCPalette { id: qgcPal; colorGroupEnabled: enabled }
+
+ signal showDialog(Component component, string title, int charWidth, int buttons)
+ signal hideDialog
+
+ color: qgcPal.window
+}
diff --git a/src/QmlControls/qmldir b/src/QmlControls/qmldir
index a588343b36f613226ad807df77765cea3020797e..5c30f2a0d5b974f6ead3384828496b3546e9cae1 100644
--- a/src/QmlControls/qmldir
+++ b/src/QmlControls/qmldir
@@ -16,5 +16,8 @@ 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
+
+QGCView 1.0 QGCView.qml
+QGCViewPanel 1.0 QGCViewPanel.qml
+QGCViewDialog 1.0 QGCViewDialog.qml