diff --git a/qgroundcontrol.qrc b/qgroundcontrol.qrc index f89dcb2c91ff48d16ca6a8fe18040ee6ac85f987..91be3ffb18b39269825427a6795867b6cead19d6 100644 --- a/qgroundcontrol.qrc +++ b/qgroundcontrol.qrc @@ -202,6 +202,7 @@ src/FlightMap/Widgets/QGCPitchIndicator.qml src/FlightMap/QGCVideoBackground.qml src/QmlControls/QGroundControl/FlightMap/qmldir + src/FlightMap/MapItems/SplitIndicator.qml src/FlightMap/MapItems/VehicleMapItem.qml src/QmlControls/QGroundControl/ScreenTools/qmldir src/QmlControls/ScreenTools.qml diff --git a/src/FlightMap/MapItems/SplitIndicator.qml b/src/FlightMap/MapItems/SplitIndicator.qml new file mode 100644 index 0000000000000000000000000000000000000000..a09461794e7a6d2eab42947a049a1135fe090500 --- /dev/null +++ b/src/FlightMap/MapItems/SplitIndicator.qml @@ -0,0 +1,50 @@ +/**************************************************************************** + * + * (c) 2009-2016 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +import QtQuick 2.11 +import QtQuick.Controls 2.4 + +import QGroundControl.ScreenTools 1.0 +import QGroundControl.Controls 1.0 + +Rectangle { + id: _root + width: ScreenTools.defaultFontPixelHeight * 1.5 + height: width + radius: width / 2 + border.color: indicatorColor + color: "transparent" + + property color indicatorColor: "white" + + signal clicked + + Rectangle { + anchors.margins: _root.height / 6 + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.horizontalCenter: parent.horizontalCenter + width: 1 + color: indicatorColor + } + + Rectangle { + anchors.margins: _root.height / 6 + anchors.left: parent.left + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + height: 1 + color: indicatorColor + } + + QGCMouseArea { + fillItem: parent + onClicked: _root.clicked() + } +} diff --git a/src/MissionManager/MissionController.cc b/src/MissionManager/MissionController.cc index a11afb3317e70bf6a2a32d068025d06bba9b30f0..a45272535bfca4121107d478a87992cd4527d020 100644 --- a/src/MissionManager/MissionController.cc +++ b/src/MissionManager/MissionController.cc @@ -69,6 +69,7 @@ MissionController::MissionController(PlanMasterController* masterController, QOb , _progressPct (0) , _currentPlanViewIndex (-1) , _currentPlanViewItem (nullptr) + , _splitSegment (nullptr) { _resetMissionFlightStatus(); managerVehicleChanged(_managerVehicle); @@ -2106,6 +2107,7 @@ VisualMissionItem* MissionController::currentPlanViewItem(void) const void MissionController::setCurrentPlanViewIndex(int sequenceNumber, bool force) { if(_visualItems && (force || sequenceNumber != _currentPlanViewIndex)) { + _splitSegment = nullptr; _currentPlanViewItem = nullptr; _currentPlanViewIndex = -1; for (int i = 0; i < _visualItems->count(); i++) { @@ -2114,12 +2116,26 @@ void MissionController::setCurrentPlanViewIndex(int sequenceNumber, bool force) pVI->setIsCurrentItem(true); _currentPlanViewItem = pVI; _currentPlanViewIndex = sequenceNumber; + + if (pVI->specifiesCoordinate() && !pVI->isStandaloneCoordinate()) { + // Determine split segment used to display line split editing ui. + for (int j=i-1; j>0; j--) { + VisualMissionItem* pPrev = qobject_cast(_visualItems->get(j)); + if (pPrev->specifiesCoordinate() && !pPrev->isStandaloneCoordinate()) { + VisualItemPair splitPair(pPrev, pVI); + if (_linesTable.contains(splitPair)) { + _splitSegment = _linesTable[splitPair]; + } + } + } + } } else { pVI->setIsCurrentItem(false); } } emit currentPlanViewIndexChanged(); emit currentPlanViewItemChanged(); + emit splitSegmentChanged(); } } diff --git a/src/MissionManager/MissionController.h b/src/MissionManager/MissionController.h index 62b4235ec26b74c160022d7a93262207bc76ed8d..4deb2f9456e0b206d6f0f7446c8ea97dfc8c924a 100644 --- a/src/MissionManager/MissionController.h +++ b/src/MissionManager/MissionController.h @@ -73,6 +73,7 @@ public: Q_PROPERTY(QmlObjectListModel* directionArrows READ directionArrows CONSTANT) Q_PROPERTY(QStringList complexMissionItemNames READ complexMissionItemNames NOTIFY complexMissionItemNamesChanged) Q_PROPERTY(QGeoCoordinate plannedHomePosition READ plannedHomePosition NOTIFY plannedHomePositionChanged) + Q_PROPERTY(CoordinateVector* splitSegment MEMBER _splitSegment NOTIFY splitSegmentChanged) ///< Segment which show show + split ui element Q_PROPERTY(double progressPct READ progressPct NOTIFY progressPctChanged) @@ -207,6 +208,7 @@ public: signals: void visualItemsChanged (void); void waypointPathChanged (void); + void splitSegmentChanged (void); void newItemsFromVehicle (void); void missionDistanceChanged (double missionDistance); void missionTimeChanged (void); @@ -302,6 +304,7 @@ private: QTimer _updateTimer; QGCGeoBoundingCube _travelBoundingCube; QGeoCoordinate _takeoffCoordinate; + CoordinateVector* _splitSegment; static const char* _settingsGroup; diff --git a/src/PlanView/PlanView.qml b/src/PlanView/PlanView.qml index d7d9b16b9e230b4c8288ec123ed5b87faf1e5ece..b8dce7330adc8efeab9feb18d7cc2d17f9dff0c9 100644 --- a/src/PlanView/PlanView.qml +++ b/src/PlanView/PlanView.qml @@ -7,7 +7,6 @@ * ****************************************************************************/ - import QtQuick 2.3 import QtQuick.Controls 1.2 import QtQuick.Dialogs 1.2 @@ -28,8 +27,6 @@ import QGroundControl.ShapeFileHelper 1.0 import QGroundControl.Airspace 1.0 import QGroundControl.Airmap 1.0 -/// Mission Editor - Item { property bool planControlColapsed: false @@ -258,6 +255,7 @@ Item { Connections { target: _missionController + onNewItemsFromVehicle: { if (_visualItems && _visualItems.count !== 1) { mapFitFunctions.fitMapViewportToMissionItems() @@ -478,8 +476,41 @@ Item { delegate: MapLineArrow { fromCoord: object ? object.coordinate1 : undefined toCoord: object ? object.coordinate2 : undefined - arrowPosition: 2 - z: QGroundControl.zOrderWaypointLines + arrowPosition: 3 + z: QGroundControl.zOrderWaypointLines + 1 + } + } + + // UI for splitting the current segment + MapQuickItem { + id: splitSegmentItem + anchorPoint.x: sourceItem.width / 2 + anchorPoint.y: sourceItem.height / 2 + z: QGroundControl.zOrderWaypointLines + 1 + + sourceItem: SplitIndicator { + onClicked: insertSimpleMissionItem(splitSegmentItem.coordinate, _missionController.currentPlanViewIndex) + } + + function _updateSplitCoord() { + if (_missionController.splitSegment) { + var distance = _missionController.splitSegment.coordinate1.distanceTo(_missionController.splitSegment.coordinate2) + var azimuth = _missionController.splitSegment.coordinate1.azimuthTo(_missionController.splitSegment.coordinate2) + splitSegmentItem.coordinate = _missionController.splitSegment.coordinate1.atDistanceAndAzimuth(distance / 2, azimuth) + } else { + coordinate = QtPositioning.coordinate() + } + } + + Connections { + target: _missionController + onSplitSegmentChanged: splitSegmentItem._updateSplitCoord() + } + + Connections { + target: _missionController.splitSegment + onCoordinate1Changed: splitSegmentItem._updateSplitCoord() + onCoordinate2Changed: splitSegmentItem._updateSplitCoord() } } diff --git a/src/QmlControls/QGroundControl/FlightMap/qmldir b/src/QmlControls/QGroundControl/FlightMap/qmldir index 3db7e850072e9a62b47760bd9a61c014aa4cc5c2..c356917dd58d1325585a9cb0dd5de2d56bf826cf 100644 --- a/src/QmlControls/QGroundControl/FlightMap/qmldir +++ b/src/QmlControls/QGroundControl/FlightMap/qmldir @@ -27,4 +27,5 @@ MissionItemView 1.0 MissionItemView.qml MissionLineView 1.0 MissionLineView.qml PlanMapItems 1.0 PlanMapItems.qml PolygonEditor 1.0 PolygonEditor.qml +SplitIndicator 1.0 SplitIndicator.qml VehicleMapItem 1.0 VehicleMapItem.qml