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