@@ -346,7 +346,7 @@ void QgsNodeTool::cadCanvasPressEvent( QgsMapMouseEvent *e )
346
346
347
347
cleanupNodeEditor ();
348
348
349
- if ( !mDraggingVertex && !mSelectedNodes .isEmpty () )
349
+ if ( !mDraggingVertex && !mSelectedNodes .isEmpty () && !( e-> modifiers () & Qt::ShiftModifier ) && !( e-> modifiers () & Qt::ControlModifier ) )
350
350
{
351
351
// only remove highlight if not clicked on one of highlighted nodes
352
352
bool clickedOnHighlightedNode = false ;
@@ -369,16 +369,29 @@ void QgsNodeTool::cadCanvasPressEvent( QgsMapMouseEvent *e )
369
369
370
370
if ( e->button () == Qt::LeftButton )
371
371
{
372
- // Ctrl+Click to highlight nodes without entering editing mode
373
- if ( e->modifiers () & Qt::ControlModifier )
372
+ if ( e->modifiers () & Qt::ControlModifier || e->modifiers () & Qt::ShiftModifier )
374
373
{
374
+ // shift or ctrl-click nodes to highlight without entering edit mode
375
375
QgsPointLocator::Match m = snapToEditableLayer ( e );
376
376
if ( m.hasVertex () )
377
377
{
378
378
Vertex node ( m.layer (), m.featureId (), m.vertexIndex () );
379
- setHighlightedNodes ( QList<Vertex>() << node );
379
+
380
+ HighlightMode mode = ModeReset;
381
+ if ( e->modifiers () & Qt::ShiftModifier )
382
+ {
383
+ // Shift+Click to add node to highlight
384
+ mode = ModeAdd;
385
+ }
386
+ else if ( e->modifiers () & Qt::ControlModifier )
387
+ {
388
+ // Ctrl+Click to remove node
389
+ mode = ModeSubtract;
390
+ }
391
+
392
+ setHighlightedNodes ( QList<Vertex>() << node, mode );
393
+ return ;
380
394
}
381
- return ;
382
395
}
383
396
384
397
// the user may have started dragging a rect to select vertices
@@ -451,13 +464,19 @@ void QgsNodeTool::cadCanvasReleaseEvent( QgsMapMouseEvent *e )
451
464
}
452
465
}
453
466
454
- setHighlightedNodes ( nodes );
467
+ HighlightMode mode = ModeReset;
468
+ if ( e->modifiers () & Qt::ShiftModifier )
469
+ mode = ModeAdd;
470
+ else if ( e->modifiers () & Qt::ControlModifier )
471
+ mode = ModeSubtract;
472
+
473
+ setHighlightedNodes ( nodes, mode );
455
474
456
475
stopSelectionRect ();
457
476
}
458
477
else // selection rect is not being dragged
459
478
{
460
- if ( e->button () == Qt::LeftButton )
479
+ if ( e->button () == Qt::LeftButton && !( e-> modifiers () & Qt::ShiftModifier ) && !( e-> modifiers () & Qt::ControlModifier ) )
461
480
{
462
481
// accepting action
463
482
if ( mDraggingVertex )
@@ -1700,26 +1719,64 @@ void QgsNodeTool::deleteVertex()
1700
1719
}
1701
1720
}
1702
1721
1703
- void QgsNodeTool::setHighlightedNodes ( QList<Vertex> listNodes )
1722
+ void QgsNodeTool::setHighlightedNodes ( const QList<Vertex> & listNodes, HighlightMode mode )
1704
1723
{
1705
- qDeleteAll ( mSelectedNodesMarkers );
1706
- mSelectedNodesMarkers .clear ();
1707
- mSelectedNodes .clear ();
1724
+ if ( mode == ModeReset )
1725
+ {
1726
+ qDeleteAll ( mSelectedNodesMarkers );
1727
+ mSelectedNodesMarkers .clear ();
1728
+ mSelectedNodes .clear ();
1729
+ }
1730
+ else if ( mode == ModeSubtract )
1731
+ {
1732
+ // need to clear node markers, and rebuild later. We have no way to link
1733
+ // a marker to a node in order to remove one-by-one
1734
+ qDeleteAll ( mSelectedNodesMarkers );
1735
+ mSelectedNodesMarkers .clear ();
1736
+ }
1708
1737
1709
- for ( const Vertex &node : qgis::as_const ( listNodes ) )
1738
+ auto createMarkerForNode = [ = ] ( const Vertex & node )-> bool
1710
1739
{
1711
1740
QgsGeometry geom = cachedGeometryForVertex ( node );
1712
1741
QgsVertexId vid;
1713
1742
if ( !geom.vertexIdFromVertexNr ( node.vertexId , vid ) )
1714
- continue ; // node may not exist anymore
1743
+ return false ; // node may not exist anymore
1744
+
1715
1745
QgsVertexMarker *marker = new QgsVertexMarker ( canvas () );
1716
1746
marker->setIconType ( QgsVertexMarker::ICON_CIRCLE );
1717
1747
marker->setPenWidth ( 3 );
1718
1748
marker->setColor ( Qt::blue );
1719
1749
marker->setFillColor ( Qt::blue );
1720
1750
marker->setCenter ( toMapCoordinates ( node.layer , geom.vertexAt ( node.vertexId ) ) );
1721
- mSelectedNodes .append ( node );
1722
1751
mSelectedNodesMarkers .append ( marker );
1752
+ return true ;
1753
+ };
1754
+
1755
+ for ( const Vertex &node : listNodes )
1756
+ {
1757
+ if ( mode == ModeAdd && mSelectedNodes .contains ( node ) )
1758
+ {
1759
+ continue ;
1760
+ }
1761
+ else if ( mode == ModeSubtract )
1762
+ {
1763
+ mSelectedNodes .removeAll ( node );
1764
+ continue ;
1765
+ }
1766
+
1767
+ if ( !createMarkerForNode ( node ) )
1768
+ continue ; // node may not exist anymore
1769
+
1770
+ mSelectedNodes .append ( node );
1771
+ }
1772
+
1773
+ if ( mode == ModeSubtract )
1774
+ {
1775
+ // rebuild markers for remaining selection
1776
+ for ( const Vertex &node : qgis::as_const ( mSelectedNodes ) )
1777
+ {
1778
+ createMarkerForNode ( node );
1779
+ }
1723
1780
}
1724
1781
}
1725
1782
0 commit comments