Skip to content

Commit dd739ac

Browse files
committedJan 19, 2018
[needs-docs] Allow adding and remove nodes from node tool selection
Holding shift while clicking and dragging adds nodes to selection, holding ctrl removes nodes from selection. Additionally, this commit: - fixes the current 'select node but don't start moving' shortcut, but changes it from ctrl-click on a node to shift-click on a node (since it's 'adding' to the selection) - makes ctrl-click on a single node remove just that node from the selection Fixes #17259
1 parent 67ae36c commit dd739ac

File tree

2 files changed

+80
-15
lines changed

2 files changed

+80
-15
lines changed
 

‎src/app/nodetool/qgsnodetool.cpp

Lines changed: 71 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ void QgsNodeTool::cadCanvasPressEvent( QgsMapMouseEvent *e )
346346

347347
cleanupNodeEditor();
348348

349-
if ( !mDraggingVertex && !mSelectedNodes.isEmpty() )
349+
if ( !mDraggingVertex && !mSelectedNodes.isEmpty() && !( e->modifiers() & Qt::ShiftModifier ) && !( e->modifiers() & Qt::ControlModifier ) )
350350
{
351351
// only remove highlight if not clicked on one of highlighted nodes
352352
bool clickedOnHighlightedNode = false;
@@ -369,16 +369,29 @@ void QgsNodeTool::cadCanvasPressEvent( QgsMapMouseEvent *e )
369369

370370
if ( e->button() == Qt::LeftButton )
371371
{
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 )
374373
{
374+
// shift or ctrl-click nodes to highlight without entering edit mode
375375
QgsPointLocator::Match m = snapToEditableLayer( e );
376376
if ( m.hasVertex() )
377377
{
378378
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;
380394
}
381-
return;
382395
}
383396

384397
// the user may have started dragging a rect to select vertices
@@ -451,13 +464,19 @@ void QgsNodeTool::cadCanvasReleaseEvent( QgsMapMouseEvent *e )
451464
}
452465
}
453466

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 );
455474

456475
stopSelectionRect();
457476
}
458477
else // selection rect is not being dragged
459478
{
460-
if ( e->button() == Qt::LeftButton )
479+
if ( e->button() == Qt::LeftButton && !( e->modifiers() & Qt::ShiftModifier ) && !( e->modifiers() & Qt::ControlModifier ) )
461480
{
462481
// accepting action
463482
if ( mDraggingVertex )
@@ -1700,26 +1719,64 @@ void QgsNodeTool::deleteVertex()
17001719
}
17011720
}
17021721

1703-
void QgsNodeTool::setHighlightedNodes( QList<Vertex> listNodes )
1722+
void QgsNodeTool::setHighlightedNodes( const QList<Vertex> &listNodes, HighlightMode mode )
17041723
{
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+
}
17081737

1709-
for ( const Vertex &node : qgis::as_const( listNodes ) )
1738+
auto createMarkerForNode = [ = ]( const Vertex & node )->bool
17101739
{
17111740
QgsGeometry geom = cachedGeometryForVertex( node );
17121741
QgsVertexId vid;
17131742
if ( !geom.vertexIdFromVertexNr( node.vertexId, vid ) )
1714-
continue; // node may not exist anymore
1743+
return false; // node may not exist anymore
1744+
17151745
QgsVertexMarker *marker = new QgsVertexMarker( canvas() );
17161746
marker->setIconType( QgsVertexMarker::ICON_CIRCLE );
17171747
marker->setPenWidth( 3 );
17181748
marker->setColor( Qt::blue );
17191749
marker->setFillColor( Qt::blue );
17201750
marker->setCenter( toMapCoordinates( node.layer, geom.vertexAt( node.vertexId ) ) );
1721-
mSelectedNodes.append( node );
17221751
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+
}
17231780
}
17241781
}
17251782

‎src/app/nodetool/qgsnodetool.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,15 @@ class APP_EXPORT QgsNodeTool : public QgsMapToolAdvancedDigitizing
165165

166166
void applyEditsToLayers( NodeEdits &edits );
167167

168-
void setHighlightedNodes( QList<Vertex> listNodes );
168+
169+
enum HighlightMode
170+
{
171+
ModeReset, //!< Reset any current selection
172+
ModeAdd, //!< Add to current selection
173+
ModeSubtract, //!< Remove from current selection
174+
};
175+
176+
void setHighlightedNodes( const QList<Vertex> &listNodes, HighlightMode mode = ModeReset );
169177

170178
void setHighlightedNodesVisible( bool visible );
171179

0 commit comments

Comments
 (0)
Please sign in to comment.