Commit ccc5f622 authored by Don Gagne's avatar Don Gagne

Merge pull request #1549 from DonLakeFlyer/AirframeConfig

Airframe config
parents 277c1ae1 c9f56212
...@@ -32,6 +32,8 @@ ...@@ -32,6 +32,8 @@
<file alias="QGroundControl/Controls/VehicleSummaryRow.qml">src/QmlControls/VehicleSummaryRow.qml</file> <file alias="QGroundControl/Controls/VehicleSummaryRow.qml">src/QmlControls/VehicleSummaryRow.qml</file>
<file alias="QGroundControl/Controls/arrow-down.png">src/QmlControls/arrow-down.png</file> <file alias="QGroundControl/Controls/arrow-down.png">src/QmlControls/arrow-down.png</file>
<file alias="QGroundControl/Controls/ViewWidget.qml">src/ViewWidgets/ViewWidget.qml</file> <file alias="QGroundControl/Controls/ViewWidget.qml">src/ViewWidgets/ViewWidget.qml</file>
<file alias="QGroundControl/Controls/ViewWithDialog.qml">src/QmlControls/ViewWithDialog.qml</file>
<file alias="QGroundControl/Controls/ParameterEditor.qml">src/QmlControls/ParameterEditor.qml</file> <file alias="QGroundControl/Controls/ParameterEditor.qml">src/QmlControls/ParameterEditor.qml</file>
<file alias="ParameterEditorWidget.qml">src/ViewWidgets/ParameterEditorWidget.qml</file> <file alias="ParameterEditorWidget.qml">src/ViewWidgets/ParameterEditorWidget.qml</file>
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
import QtQuick 2.2 import QtQuick 2.2
import QtQuick.Controls 1.2 import QtQuick.Controls 1.2
import QtQuick.Controls.Styles 1.2 import QtQuick.Controls.Styles 1.2
import QtQuick.Dialogs 1.2
import QGroundControl.FactSystem 1.0 import QGroundControl.FactSystem 1.0
import QGroundControl.FactControls 1.0 import QGroundControl.FactControls 1.0
...@@ -31,10 +32,51 @@ import QGroundControl.Palette 1.0 ...@@ -31,10 +32,51 @@ import QGroundControl.Palette 1.0
import QGroundControl.Controls 1.0 import QGroundControl.Controls 1.0
import QGroundControl.Controllers 1.0 import QGroundControl.Controllers 1.0
FactPanel { ViewWithDialog {
viewComponent: view
Component {
id: view
FactPanel {
id: panel id: panel
anchors.fill: parent
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)
}
}
AirframeComponentController {
id: controller
factPanel: panel
}
AirframeComponentController { id: controller; factPanel: panel } Component {
id: customConfigDialog
QGCLabel {
id: customConfigPanel
anchors.fill: parent
wrapMode: Text.WordWrap
text: "Your vehicle is using a custom airframe configuration. " +
"This configuration can only be modified through the Parameter Editor.\n\n" +
"If you want to Reset your airframe configuration and select a standard configuration, click 'Reset' above."
signal hideDialog
Fact { id: sys_autostart; name: "SYS_AUTOSTART" }
function accept() {
sys_autostart.value = 0
customConfigPanel.hideDialog()
}
}
}
Rectangle { Rectangle {
anchors.fill: parent anchors.fill: parent
...@@ -43,36 +85,52 @@ FactPanel { ...@@ -43,36 +85,52 @@ FactPanel {
color: qgcPal.window color: qgcPal.window
Column {
anchors.fill: parent
QGCLabel { QGCLabel {
text: "AIRFRAME CONFIG" id: header
width: parent.width
font.pointSize: 20 font.pointSize: 20
text: "AIRFRAME CONFIG"
} }
Item { height: 20; width: 10 } // spacer Item {
id: headingSpacer
Row { anchors.top: header.bottom
width: parent.width height: 20
width: 20
}
QGCLabel { QGCLabel {
width: parent.width - applyButton.width anchors.top: headingSpacer.bottom
width: parent.width - applyButton.width - 5
text: "Select you airframe type and specific vehicle bellow. Click 'Apply and Restart' when ready and your vehicle will be disconnected, rebooted to the new settings and re-connected." text: "Select you airframe type and specific vehicle bellow. Click 'Apply and Restart' when ready and your vehicle will be disconnected, rebooted to the new settings and re-connected."
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
} }
QGCButton { QGCButton {
id: applyButton id: applyButton
anchors.top: headingSpacer.bottom
anchors.right: parent.right
text: "Apply and Restart" text: "Apply and Restart"
onClicked: { controller.changeAutostart() } onClicked: { controller.changeAutostart() }
} }
Item {
id: lastSpacer
anchors.top: applyButton.bottom
height: 20
width: 10
} }
Item { height: 20; width: 10 } // spacer ScrollView {
id: scroll
anchors.top: lastSpacer.bottom
anchors.bottom: parent.bottom
width: parent.width
horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff
Flow { Flow {
width: parent.width width: scroll.width
spacing: 10 spacing: 10
ExclusiveGroup { ExclusiveGroup {
...@@ -154,9 +212,10 @@ FactPanel { ...@@ -154,9 +212,10 @@ FactPanel {
} }
} }
} }
} } // Repeater - summary boxes
} } // Flow - summary boxes
} // Scroll View - summary boxes
} } // Rectangle - background
} } // FactPanel
} // Component - View
} }
\ No newline at end of file
...@@ -40,7 +40,8 @@ bool AirframeComponentController::_typesRegistered = false; ...@@ -40,7 +40,8 @@ bool AirframeComponentController::_typesRegistered = false;
AirframeComponentController::AirframeComponentController(void) : AirframeComponentController::AirframeComponentController(void) :
_uas(NULL), _uas(NULL),
_currentVehicleIndex(0), _currentVehicleIndex(0),
_autostartId(0) _autostartId(0),
_showCustomConfigPanel(false)
{ {
_uas = UASManager::instance()->getActiveUAS(); _uas = UASManager::instance()->getActiveUAS();
Q_ASSERT(_uas); Q_ASSERT(_uas);
...@@ -82,10 +83,9 @@ AirframeComponentController::AirframeComponentController(void) : ...@@ -82,10 +83,9 @@ AirframeComponentController::AirframeComponentController(void) :
_airframeTypes.append(QVariant::fromValue(airframeType)); _airframeTypes.append(QVariant::fromValue(airframeType));
} }
if (_autostartId != 0) { if (_autostartId != 0 && !autostartFound) {
// FIXME: Should be a user error _showCustomConfigPanel = true;
Q_UNUSED(autostartFound); emit showCustomConfigPanelChanged(true);
Q_ASSERT(autostartFound);
} }
} }
......
...@@ -44,6 +44,8 @@ public: ...@@ -44,6 +44,8 @@ public:
AirframeComponentController(void); AirframeComponentController(void);
~AirframeComponentController(); ~AirframeComponentController();
Q_PROPERTY(bool showCustomConfigPanel MEMBER _showCustomConfigPanel NOTIFY showCustomConfigPanelChanged)
Q_PROPERTY(QVariantList airframeTypes MEMBER _airframeTypes CONSTANT) Q_PROPERTY(QVariantList airframeTypes MEMBER _airframeTypes CONSTANT)
Q_PROPERTY(QString currentAirframeType MEMBER _currentAirframeType CONSTANT) Q_PROPERTY(QString currentAirframeType MEMBER _currentAirframeType CONSTANT)
...@@ -59,6 +61,7 @@ public: ...@@ -59,6 +61,7 @@ public:
signals: signals:
void autostartIdChanged(int newAutostartId); void autostartIdChanged(int newAutostartId);
void showCustomConfigPanelChanged(bool show);
private: private:
static bool _typesRegistered; static bool _typesRegistered;
...@@ -69,6 +72,7 @@ private: ...@@ -69,6 +72,7 @@ private:
QString _currentVehicleName; QString _currentVehicleName;
int _currentVehicleIndex; int _currentVehicleIndex;
int _autostartId; int _autostartId;
bool _showCustomConfigPanel;
}; };
class Airframe : public QObject class Airframe : public QObject
......
/*=====================================================================
QGroundControl Open Source Ground Control Station
(c) 2009 - 2015 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
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 <http://www.gnu.org/licenses/>.
======================================================================*/
/// @file
/// @author Don Gagne <don@thegagnes.com>
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
...@@ -16,4 +16,5 @@ VehicleRotationCal 1.0 VehicleRotationCal.qml ...@@ -16,4 +16,5 @@ VehicleRotationCal 1.0 VehicleRotationCal.qml
VehicleSummaryRow 1.0 VehicleSummaryRow.qml VehicleSummaryRow 1.0 VehicleSummaryRow.qml
ParameterEditor 1.0 ParameterEditor.qml ParameterEditor 1.0 ParameterEditor.qml
ViewWidget 1.0 ViewWidget.qml ViewWidget 1.0 ViewWidget.qml
ViewWithDialog 1.0 ViewWithDialog.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