diff --git a/app/mmtypeutils.h b/app/mmtypeutils.h index 76f4da156..c53917722 100644 --- a/app/mmtypeutils.h +++ b/app/mmtypeutils.h @@ -24,4 +24,11 @@ struct ForeignGeometry QML_VALUE_TYPE( qgsGeometry ); }; +struct ForeignPoint +{ + Q_GADGET + QML_FOREIGN( QgsPoint ) + QML_VALUE_TYPE( qgsPoint ); +}; + #endif //MMTYPEUTILS_H diff --git a/app/qml/map/components/MMCrosshair.qml b/app/qml/map/components/MMCrosshair.qml index c7755c7cd..54e460cdf 100644 --- a/app/qml/map/components/MMCrosshair.qml +++ b/app/qml/map/components/MMCrosshair.qml @@ -10,20 +10,19 @@ import QtQuick import QtQuick.Controls.impl -import mm 1.0 as MM +import MMInput Item { id: root - /*required*/ property var qgsProject - /*required*/ property var mapSettings + required property var qgsProject + required property var mapSettings property bool shouldUseSnapping: false property point center: Qt.point( root.width / 2, root.height / 2 ) - property var recordPoint: snapUtils.recordPoint - - property point screenPoint: snapUtils.snapped && __activeLayer.vectorLayer ? __inputUtils.transformPointToScreenCoordinates(__activeLayer.vectorLayer.crs, mapSettings, recordPoint) : center + property qgsPoint recordPoint : snapUtils.recordPoint + property point screenPoint : snapUtils.snapped ? snapUtils.snapPoint : root.center property real outerSize: 60 * __dp property real innerDotSize: 10 * __dp @@ -31,7 +30,7 @@ Item { property alias crosshairForeground: crosshairForeground property alias snapUtils: snapUtils - MM.SnapUtils { + SnapUtils { id: snapUtils centerPosition: root.center @@ -39,7 +38,6 @@ Item { qgsProject: root.qgsProject useSnapping: root.shouldUseSnapping destinationLayer: __activeLayer.vectorLayer - } Image { @@ -166,7 +164,7 @@ Item { } } - opacity: snapUtils.snapped && ( snapUtils.snapType === MM.SnapUtils.Vertex || snapUtils.snapType === MM.SnapUtils.Other ) ? 100 : 0 + opacity: snapUtils.snapped && ( snapUtils.snapType === SnapUtils.Vertex || snapUtils.snapType === SnapUtils.Other ) ? 100 : 0 Behavior on opacity { PropertyAnimation { @@ -176,7 +174,7 @@ Item { } } - rotation: snapUtils.snapType === MM.SnapUtils.Other ? 0 : 45 + rotation: snapUtils.snapType === SnapUtils.Other ? 0 : 45 Behavior on rotation { PropertyAnimation { @@ -217,7 +215,7 @@ Item { } } - opacity: snapUtils.snapped && snapUtils.snapType === MM.SnapUtils.Segment ? 100 : 0 + opacity: snapUtils.snapped && snapUtils.snapType === SnapUtils.Segment ? 100 : 0 Behavior on opacity { PropertyAnimation { diff --git a/app/snaputils.cpp b/app/snaputils.cpp index 919d45f0c..191411506 100644 --- a/app/snaputils.cpp +++ b/app/snaputils.cpp @@ -128,6 +128,7 @@ void SnapUtils::getsnap() } setRecordPoint( layerPoint ); + setSnapPoint( InputUtils::transformPointToScreenCoordinates( mDestinationLayer->crs(), mMapSettings, layerPoint ) ); if ( snap.hasVertex() ) { @@ -186,6 +187,17 @@ void SnapUtils::setCenterPosition( QPointF newCenterPosition ) initializeRecordPosition(); } +QPointF SnapUtils::snapPoint() const +{ + return mSnapPoint; +} + +void SnapUtils::setSnapPoint( QPointF newSnapPoint ) +{ + mSnapPoint = newSnapPoint; + emit snapPointChanged( mSnapPoint ); +} + QgsPoint SnapUtils::recordPoint() const { return mRecordPoint; @@ -206,6 +218,9 @@ void SnapUtils::setSnapped( bool newSnapped ) { if ( mSnapped == newSnapped ) return; + + if ( !newSnapped ) resetSnapPoint(); + mSnapped = newSnapped; emit snappedChanged( mSnapped ); } @@ -299,6 +314,11 @@ void SnapUtils::initializeRecordPosition() setRecordPoint( centerPoint ); } +void SnapUtils::resetSnapPoint() +{ + mSnapPoint = QPointF( -1, -1 ); +} + QgsVectorLayer *SnapUtils::destinationLayer() const { return mDestinationLayer; diff --git a/app/snaputils.h b/app/snaputils.h index 4a98df5ea..fd0694082 100644 --- a/app/snaputils.h +++ b/app/snaputils.h @@ -12,6 +12,7 @@ #include #include +#include #include "qgspoint.h" #include "qgsproject.h" @@ -23,6 +24,7 @@ class SnapUtils : public QObject { Q_OBJECT + QML_ELEMENT Q_PROPERTY( QgsProject *qgsProject READ qgsProject WRITE setQgsProject NOTIFY qgsProjectChanged ) Q_PROPERTY( InputMapSettings *mapSettings READ mapSettings WRITE setMapSettings NOTIFY mapSettingsChanged ) @@ -32,7 +34,10 @@ class SnapUtils : public QObject Q_PROPERTY( QgsVectorLayer *destinationLayer READ destinationLayer WRITE setDestinationLayer NOTIFY destinationLayerChanged ) Q_PROPERTY( bool snapped READ snapped WRITE setSnapped NOTIFY snappedChanged ) + // point in map CRS which will be recorded Q_PROPERTY( QgsPoint recordPoint READ recordPoint WRITE setRecordPoint NOTIFY recordPointChanged ) + // point in screen CRS where the crosshair should point if snapping is enabled + Q_PROPERTY( QPointF snapPoint READ snapPoint WRITE setSnapPoint NOTIFY snapPointChanged ) public: SnapUtils( QObject *parent = nullptr ); @@ -58,6 +63,9 @@ class SnapUtils : public QObject QPointF centerPosition() const; void setCenterPosition( QPointF newCenterPosition ); + QPointF snapPoint() const; + void setSnapPoint( QPointF newSnapPoint ); + QgsPoint recordPoint() const; void setRecordPoint( QgsPoint newRecordPoint ); @@ -84,6 +92,8 @@ class SnapUtils : public QObject void centerPositionChanged( QPointF centerPosition ); + void snapPointChanged( QPointF snapPoint ); + void recordPointChanged( QgsPoint recordPoint ); void useSnappingChanged( bool useSnapping ); @@ -98,6 +108,8 @@ class SnapUtils : public QObject void setupSnapping(); void initializeRecordPosition(); + void resetSnapPoint(); + QgsSnappingUtils mSnappingUtils; QgsProject *mQgsProject = nullptr; // not owned @@ -105,6 +117,7 @@ class SnapUtils : public QObject QgsVectorLayer *mDestinationLayer = nullptr; // not owned QPointF mCenterPosition = QPointF( -1, -1 ); + QPointF mSnapPoint = QPointF( -1, -1 ); QgsPoint mRecordPoint = QgsPoint( -1, -1 ); bool mSnapped = false;