diff --git a/src/FlightMap/MapItems/MissionItemIndicatorDrag.qml b/src/FlightMap/MapItems/MissionItemIndicatorDrag.qml index 094672fd05a26aa0ead0d25adc91d563e418172e..02978635c410a0b397a100dd575d5e5d4089e56f 100644 --- a/src/FlightMap/MapItems/MissionItemIndicatorDrag.qml +++ b/src/FlightMap/MapItems/MissionItemIndicatorDrag.qml @@ -29,6 +29,8 @@ Rectangle { property var itemCoordinate ///< Coordinate we are updating during drag signal clicked + signal dragStart + signal dragStop property bool _preventCoordinateBindingLoop: false @@ -37,6 +39,7 @@ Rectangle { property real _touchHeight: Math.max(itemIndicator.height, ScreenTools.minTouchPixels) property real _touchMarginHorizontal: _mobile ? (_touchWidth - itemIndicator.width) / 2 : 0 property real _touchMarginVertical: _mobile ? (_touchHeight - itemIndicator.height) / 2 : 0 + property bool _dragStartSignalled: false onXChanged: liveDrag() onYChanged: liveDrag() @@ -65,13 +68,18 @@ Rectangle { preventStealing: true onClicked: itemDragger.clicked() - } - - Item { - id: fakeItemIndicator - Item { - id: anchorPoint + property bool dragActive: drag.active + onDragActiveChanged: { + if (dragActive) { + if (!_dragStartSignalled) { + _dragStartSignalled = true + dragStart() + } + } else { + _dragStartSignalled = false + dragStop() + } } } } diff --git a/src/MissionManager/QGCMapPolygon.cc b/src/MissionManager/QGCMapPolygon.cc index 61017ef5bd92a5ef6666c40d3e8e133964e05162..081d007c0ecd8082aa7c9a46139514b3edc0ce45 100644 --- a/src/MissionManager/QGCMapPolygon.cc +++ b/src/MissionManager/QGCMapPolygon.cc @@ -22,6 +22,7 @@ QGCMapPolygon::QGCMapPolygon(QObject* newCoordParent, QObject* parent) : QObject(parent) , _newCoordParent(newCoordParent) , _dirty(false) + , _centerDrag(false) , _ignoreCenterUpdates(false) { connect(&_polygonModel, &QmlObjectListModel::dirtyChanged, this, &QGCMapPolygon::_polygonModelDirtyChanged); @@ -53,7 +54,10 @@ void QGCMapPolygon::clear(void) void QGCMapPolygon::adjustVertex(int vertexIndex, const QGeoCoordinate coordinate) { _polygonPath[vertexIndex] = QVariant::fromValue(coordinate); - emit pathChanged(); + if (!_centerDrag) { + // When dragging center we don't signal path changed until add vertices are updated + emit pathChanged(); + } _polygonModel.value(vertexIndex)->setCoordinate(coordinate); @@ -278,7 +282,22 @@ void QGCMapPolygon::setCenter(QGeoCoordinate newCenter) adjustVertex(i, newVertex); } + if (_centerDrag) { + // When center dragging signals are delayed until all vertices are updated + emit pathChanged(); + } + _ignoreCenterUpdates = false; - _updateCenter(); + + _center = newCenter; + emit centerChanged(newCenter); + } +} + +void QGCMapPolygon::setCenterDrag(bool centerDrag) +{ + if (centerDrag != _centerDrag) { + _centerDrag = centerDrag; + emit centerDragChanged(centerDrag); } } diff --git a/src/MissionManager/QGCMapPolygon.h b/src/MissionManager/QGCMapPolygon.h index 4a4f7f2f7c97d4883879462b8eab66b891577eba..445df1e7ae404ae39ffc67a574879f133ee02af3 100644 --- a/src/MissionManager/QGCMapPolygon.h +++ b/src/MissionManager/QGCMapPolygon.h @@ -26,11 +26,12 @@ class QGCMapPolygon : public QObject public: QGCMapPolygon(QObject* newCoordParent, QObject* parent = NULL); - Q_PROPERTY(int count READ count NOTIFY countChanged) - Q_PROPERTY(QVariantList path READ path NOTIFY pathChanged) - Q_PROPERTY(QmlObjectListModel* pathModel READ qmlPathModel CONSTANT) - Q_PROPERTY(bool dirty READ dirty WRITE setDirty NOTIFY dirtyChanged) - Q_PROPERTY(QGeoCoordinate center READ center WRITE setCenter NOTIFY centerChanged) + Q_PROPERTY(int count READ count NOTIFY countChanged) + Q_PROPERTY(QVariantList path READ path NOTIFY pathChanged) + Q_PROPERTY(QmlObjectListModel* pathModel READ qmlPathModel CONSTANT) + Q_PROPERTY(bool dirty READ dirty WRITE setDirty NOTIFY dirtyChanged) + Q_PROPERTY(QGeoCoordinate center READ center WRITE setCenter NOTIFY centerChanged) + Q_PROPERTY(bool centerDrag READ centerDrag WRITE setCenterDrag NOTIFY centerDragChanged) Q_INVOKABLE void clear(void); Q_INVOKABLE void appendVertex(const QGeoCoordinate& coordinate); @@ -63,28 +64,30 @@ public: // Property methods - int count (void) const { return _polygonPath.count(); } - bool dirty (void) const { return _dirty; } - void setDirty(bool dirty); - QGeoCoordinate center (void) const { return _center; } - + int count (void) const { return _polygonPath.count(); } + bool dirty (void) const { return _dirty; } + void setDirty (bool dirty); + QGeoCoordinate center (void) const { return _center; } + bool centerDrag (void) const { return _centerDrag; } QVariantList path (void) const { return _polygonPath; } QmlObjectListModel* qmlPathModel(void) { return &_polygonModel; } QmlObjectListModel& pathModel (void) { return _polygonModel; } - void setPath(const QList& path); - void setPath(const QVariantList& path); - void setCenter(QGeoCoordinate newCenter); + void setPath (const QList& path); + void setPath (const QVariantList& path); + void setCenter (QGeoCoordinate newCenter); + void setCenterDrag (bool centerDrag); static const char* jsonPolygonKey; signals: - void countChanged (int count); - void pathChanged (void); - void dirtyChanged (bool dirty); - void cleared (void); - void centerChanged (QGeoCoordinate center); + void countChanged (int count); + void pathChanged (void); + void dirtyChanged (bool dirty); + void cleared (void); + void centerChanged (QGeoCoordinate center); + void centerDragChanged (bool centerDrag); private slots: void _polygonModelCountChanged(int count); @@ -101,6 +104,7 @@ private: QmlObjectListModel _polygonModel; bool _dirty; QGeoCoordinate _center; + bool _centerDrag; bool _ignoreCenterUpdates; }; diff --git a/src/MissionManager/QGCMapPolygonVisuals.qml b/src/MissionManager/QGCMapPolygonVisuals.qml index 9e5b0d5123e98876b4854666ae2c552d4d305f36..760099103ec9773a0dcd773b9b2a564b675a0a46 100644 --- a/src/MissionManager/QGCMapPolygonVisuals.qml +++ b/src/MissionManager/QGCMapPolygonVisuals.qml @@ -222,7 +222,9 @@ Item { id: centerDragAreaComponent MissionItemIndicatorDrag { - onItemCoordinateChanged: mapPolygon.center = itemCoordinate + onItemCoordinateChanged: mapPolygon.center = itemCoordinate + onDragStart: mapPolygon.centerDrag = true + onDragStop: mapPolygon.centerDrag = false } }