Skip to content

Commit ba229e5

Browse files
committed
Merge branch 'Issue_9094' of https://github.com/ahuarte47/QGIS
2 parents f1aead4 + e3e01fc commit ba229e5

11 files changed

+155
-24
lines changed

src/app/nodetool/qgsmaptoolnodetool.cpp

+58-6
Original file line numberDiff line numberDiff line change
@@ -717,6 +717,30 @@ void QgsMapToolNodeTool::keyPressEvent( QKeyEvent* e )
717717
if ( e->key() == Qt::Key_Control )
718718
{
719719
mCtrl = true;
720+
return;
721+
}
722+
723+
if ( mSelectedFeature && ( e->key() == Qt::Key_Backspace || e->key() == Qt::Key_Delete ) )
724+
{
725+
int firstSelectedIndex = firstSelectedVertex();
726+
if ( firstSelectedIndex == -1) return;
727+
728+
mSelectedFeature->deleteSelectedVertexes();
729+
safeSelectVertex( firstSelectedIndex );
730+
mCanvas->refresh();
731+
732+
// Override default shortcut management in MapCanvas
733+
e->ignore();
734+
}
735+
else
736+
if ( mSelectedFeature && ( e->key() == Qt::Key_Less || e->key() == Qt::Key_Greater ) )
737+
{
738+
int firstSelectedIndex = firstSelectedVertex();
739+
if ( firstSelectedIndex == -1) return;
740+
741+
mSelectedFeature->deselectAllVertexes();
742+
safeSelectVertex( firstSelectedIndex + ( (e->key() == Qt::Key_Less) ? -1 : +1 ) );
743+
mCanvas->refresh();
720744
}
721745
}
722746

@@ -727,12 +751,6 @@ void QgsMapToolNodeTool::keyReleaseEvent( QKeyEvent* e )
727751
mCtrl = false;
728752
return;
729753
}
730-
731-
if ( mSelectedFeature && e->key() == Qt::Key_Delete )
732-
{
733-
mSelectedFeature->deleteSelectedVertexes();
734-
mCanvas->refresh();
735-
}
736754
}
737755

738756
QgsRubberBand* QgsMapToolNodeTool::createRubberBandMarker( QgsPoint center, QgsVectorLayer* vlayer )
@@ -748,3 +766,37 @@ QgsRubberBand* QgsMapToolNodeTool::createRubberBandMarker( QgsPoint center, QgsV
748766
marker->addPoint( pom );
749767
return marker;
750768
}
769+
770+
int QgsMapToolNodeTool::firstSelectedVertex( )
771+
{
772+
if ( mSelectedFeature )
773+
{
774+
QList<QgsVertexEntry*> &vertexMap = mSelectedFeature->vertexMap();
775+
int vertexNr = 0;
776+
777+
foreach ( QgsVertexEntry *entry, vertexMap )
778+
{
779+
if ( entry->isSelected() )
780+
{
781+
return vertexNr;
782+
}
783+
vertexNr++;
784+
}
785+
}
786+
return -1;
787+
}
788+
789+
int QgsMapToolNodeTool::safeSelectVertex( int vertexNr )
790+
{
791+
if ( mSelectedFeature )
792+
{
793+
QList<QgsVertexEntry*> &vertexMap = mSelectedFeature->vertexMap();
794+
795+
if ( vertexNr >= vertexMap.size() ) vertexNr -= vertexMap.size();
796+
if ( vertexNr < 0 ) vertexNr = vertexMap.size() - 1 + vertexNr;
797+
798+
mSelectedFeature->selectVertex( vertexNr );
799+
return vertexNr;
800+
}
801+
return -1;
802+
}

src/app/nodetool/qgsmaptoolnodetool.h

+10
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,16 @@ class QgsMapToolNodeTool: public QgsMapToolVertexEdit
105105
*/
106106
void createTopologyRubberBands( QgsVectorLayer* vlayer, const QList<QgsVertexEntry*> &vertexMap, int vertex );
107107

108+
/**
109+
* Returns the index of first selected vertex, -1 when all unselected
110+
*/
111+
int firstSelectedVertex();
112+
113+
/**
114+
* Select the specified vertex bounded to current index range, returns the valid selected index
115+
*/
116+
int safeSelectVertex( int vertexNr );
117+
108118
/** The position of the vertex to move (in map coordinates) to exclude later from snapping*/
109119
QList<QgsPoint> mExcludePoint;
110120

src/app/qgisapp.cpp

+46-4
Original file line numberDiff line numberDiff line change
@@ -1903,6 +1903,10 @@ void QgisApp::setupConnections()
19031903
connect( mRenderSuppressionCBox, SIGNAL( toggled( bool ) ),
19041904
mMapCanvas, SLOT( setRenderFlag( bool ) ) );
19051905

1906+
// connect MapCanvas keyPress event so we can check if selected feature collection must be deleted
1907+
connect( mMapCanvas, SIGNAL( keyPressed( QKeyEvent * ) ),
1908+
this, SLOT( mapCanvas_keyPressed( QKeyEvent * ) ) );
1909+
19061910
// connect renderer
19071911
connect( mMapCanvas->mapRenderer(), SIGNAL( drawingProgress( int, int ) ),
19081912
this, SLOT( showProgress( int, int ) ) );
@@ -4800,7 +4804,7 @@ void QgisApp::layerProperties()
48004804
showLayerProperties( activeLayer() );
48014805
}
48024806

4803-
void QgisApp::deleteSelected( QgsMapLayer *layer, QWidget* parent )
4807+
void QgisApp::deleteSelected( QgsMapLayer *layer, QWidget* parent, bool promptConfirmation )
48044808
{
48054809
if ( !layer )
48064810
{
@@ -4845,9 +4849,17 @@ void QgisApp::deleteSelected( QgsMapLayer *layer, QWidget* parent )
48454849
return;
48464850
}
48474851

4848-
//display a warning
4852+
//validate selection
48494853
int numberOfDeletedFeatures = vlayer->selectedFeaturesIds().size();
4850-
if ( QMessageBox::warning( parent, tr( "Delete features" ), tr( "Delete %n feature(s)?", "number of features to delete", numberOfDeletedFeatures ), QMessageBox::Ok, QMessageBox::Cancel ) == QMessageBox::Cancel )
4854+
if ( numberOfDeletedFeatures == 0 )
4855+
{
4856+
messageBar()->pushMessage( tr( "No Features Selected" ),
4857+
tr( "The current layer has not selected features" ),
4858+
QgsMessageBar::INFO, messageTimeout() );
4859+
return;
4860+
}
4861+
//display a warning
4862+
if ( promptConfirmation && QMessageBox::warning( parent, tr( "Delete features" ), tr( "Delete %n feature(s)?", "number of features to delete", numberOfDeletedFeatures ), QMessageBox::Ok | QMessageBox::Cancel ) == QMessageBox::Cancel )
48514863
{
48524864
return;
48534865
}
@@ -4859,6 +4871,10 @@ void QgisApp::deleteSelected( QgsMapLayer *layer, QWidget* parent )
48594871
tr( "A problem occured during deletion of features" ),
48604872
QgsMessageBar::WARNING );
48614873
}
4874+
else
4875+
{
4876+
showStatusMessage( tr( "%n feature(s) deleted.", "number of features deleted", numberOfDeletedFeatures ) );
4877+
}
48624878

48634879
vlayer->endEditCommand();
48644880
}
@@ -6477,7 +6493,7 @@ void QgisApp::removeAllLayers()
64776493
QgsMapLayerRegistry::instance()->removeAllMapLayers();
64786494
}
64796495

6480-
void QgisApp::removeLayer()
6496+
void QgisApp::removeLayer( bool promptConfirmation )
64816497
{
64826498
if ( mMapCanvas && mMapCanvas->isDrawing() )
64836499
{
@@ -6496,8 +6512,25 @@ void QgisApp::removeLayer()
64966512
return;
64976513
}
64986514

6515+
//validate selection
6516+
int numberOfRemovedLayers = mMapLegend->selectedLayers().size();
6517+
if ( numberOfRemovedLayers == 0 )
6518+
{
6519+
messageBar()->pushMessage( tr( "No Layer Selected" ),
6520+
tr( "To remove layers, you must select they in the legend" ),
6521+
QgsMessageBar::INFO, messageTimeout() );
6522+
return;
6523+
}
6524+
//display a warning
6525+
if ( promptConfirmation && QMessageBox::warning( this, tr( "Remove layers" ), tr( "Remove %n layer(s)?", "number of layers to remove", numberOfRemovedLayers ), QMessageBox::Ok | QMessageBox::Cancel ) == QMessageBox::Cancel )
6526+
{
6527+
return;
6528+
}
6529+
64996530
mMapLegend->removeSelectedLayers();
65006531

6532+
showStatusMessage( tr( "%n layer(s) removed.", "number of layers removed", numberOfRemovedLayers ) );
6533+
65016534
mMapCanvas->refresh();
65026535
}
65036536

@@ -9061,6 +9094,15 @@ void QgisApp::keyPressEvent( QKeyEvent * e )
90619094
}
90629095
}
90639096

9097+
void QgisApp::mapCanvas_keyPressed( QKeyEvent *e )
9098+
{
9099+
// Delete selected features when it is possible and KeyEvent was not managed by current MapTool
9100+
if ( ( e->key() == Qt::Key_Backspace || e->key() == Qt::Key_Delete ) && e->isAccepted() )
9101+
{
9102+
deleteSelected();
9103+
}
9104+
}
9105+
90649106
#ifdef Q_OS_WIN
90659107
// hope your wearing your peril sensitive sunglasses.
90669108
void QgisApp::contextMenuEvent( QContextMenuEvent *e )

src/app/qgisapp.h

+5-2
Original file line numberDiff line numberDiff line change
@@ -577,7 +577,7 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
577577
void loadGDALSublayers( QString uri, QStringList list );
578578

579579
/**Deletes the selected attributes for the currently selected vector layer*/
580-
void deleteSelected( QgsMapLayer *layer = 0, QWidget* parent = 0 );
580+
void deleteSelected( QgsMapLayer *layer = 0, QWidget* parent = 0, bool promptConfirmation = false );
581581

582582
//! project was written
583583
void writeProject( QDomDocument & );
@@ -686,7 +686,7 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
686686
//! Slot to handle user center input;
687687
void userCenter();
688688
//! Remove a layer from the map and legend
689-
void removeLayer();
689+
void removeLayer( bool promptConfirmation = true );
690690
/** Duplicate map layer(s) in legend
691691
* @note added in 1.9 */
692692
void duplicateLayers( const QList<QgsMapLayer *> lyrList = QList<QgsMapLayer *>() );
@@ -1161,6 +1161,9 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
11611161

11621162
void clipboardChanged();
11631163

1164+
//! catch MapCanvas keyPress event so we can check if selected feature collection must be deleted
1165+
void mapCanvas_keyPressed( QKeyEvent *e );
1166+
11641167
signals:
11651168
/** emitted when a key is pressed and we want non widget sublasses to be able
11661169
to pick up on this (e.g. maplayer) */

src/app/qgsattributetabledialog.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,16 @@ void QgsAttributeTableDialog::closeEvent( QCloseEvent* event )
222222
}
223223
}
224224

225+
void QgsAttributeTableDialog::keyPressEvent( QKeyEvent* event )
226+
{
227+
QDialog::keyPressEvent( event );
228+
229+
if ( ( event->key() == Qt::Key_Backspace || event->key() == Qt::Key_Delete ) && mDeleteSelectedButton->isEnabled() )
230+
{
231+
QgisApp::instance()->deleteSelected( mLayer, this );
232+
}
233+
}
234+
225235
void QgsAttributeTableDialog::columnBoxInit()
226236
{
227237
foreach ( QAction* a, mFilterColumnsMenu->actions() )

src/app/qgsattributetabledialog.h

+6
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,12 @@ class APP_EXPORT QgsAttributeTableDialog : public QDialog, private Ui::QgsAttrib
172172
*/
173173
void closeEvent( QCloseEvent* event );
174174

175+
/*
176+
* Handle KeyPress event of the window
177+
* @param event
178+
*/
179+
void keyPressEvent( QKeyEvent* event );
180+
175181
private slots:
176182
/**
177183
* Initialize column box

src/app/qgsmaptoolannotation.cpp

+4-1
Original file line numberDiff line numberDiff line change
@@ -133,14 +133,17 @@ void QgsMapToolAnnotation::keyPressEvent( QKeyEvent* e )
133133
QgsAnnotationItem* sItem = selectedItem();
134134
if ( sItem )
135135
{
136-
if ( e->key() == Qt::Key_Delete )
136+
if ( e->key() == Qt::Key_Backspace || e->key() == Qt::Key_Delete )
137137
{
138138
if ( mCanvas && mCanvas->scene() )
139139
{
140140
QCursor neutralCursor( sItem->cursorShapeForAction( QgsAnnotationItem::NoAction ) );
141141
mCanvas->scene()->removeItem( sItem );
142142
delete sItem;
143143
mCanvas->setCursor( neutralCursor );
144+
145+
// Override default shortcut management in MapCanvas
146+
e->ignore();
144147
}
145148
}
146149
}

src/app/qgsmaptoolcapture.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,9 @@ void QgsMapToolCapture::keyPressEvent( QKeyEvent* e )
269269
if ( e->key() == Qt::Key_Backspace || e->key() == Qt::Key_Delete )
270270
{
271271
undo();
272+
273+
// Override default shortcut management in MapCanvas
274+
e->ignore();
272275
}
273276
}
274277

src/gui/qgsmapcanvas.cpp

+8-6
Original file line numberDiff line numberDiff line change
@@ -802,10 +802,11 @@ void QgsMapCanvas::keyPressEvent( QKeyEvent * e )
802802
e->ignore();
803803
}
804804

805-
emit keyPressed( e );
806-
807805
if ( mCanvasProperties->mouseButtonDown || mCanvasProperties->panSelectorDown )
806+
{
807+
emit keyPressed( e );
808808
return;
809+
}
809810

810811
QPainter paint;
811812
QPen pen( Qt::gray );
@@ -886,12 +887,14 @@ void QgsMapCanvas::keyPressEvent( QKeyEvent * e )
886887
{
887888
mMapTool->keyPressEvent( e );
888889
}
889-
e->ignore();
890+
else e->ignore();
890891

891892
QgsDebugMsg( "Ignoring key: " + QString::number( e->key() ) );
892-
893893
}
894894
}
895+
896+
emit keyPressed( e );
897+
895898
} //keyPressEvent()
896899

897900
void QgsMapCanvas::keyReleaseEvent( QKeyEvent * e )
@@ -921,8 +924,7 @@ void QgsMapCanvas::keyReleaseEvent( QKeyEvent * e )
921924
{
922925
mMapTool->keyReleaseEvent( e );
923926
}
924-
925-
e->ignore();
927+
else e->ignore();
926928

927929
QgsDebugMsg( "Ignoring key release: " + QString::number( e->key() ) );
928930
}

src/plugins/grass/qgsgrassmapcalc.cpp

+4-1
Original file line numberDiff line numberDiff line change
@@ -829,9 +829,12 @@ void QgsGrassMapcalc::deleteItem()
829829

830830
void QgsGrassMapcalc::keyPressEvent( QKeyEvent * e )
831831
{
832-
if ( e->key() == Qt::Key_Delete )
832+
if ( e->key() == Qt::Key_Backspace || e->key() == Qt::Key_Delete )
833833
{
834834
deleteItem();
835+
836+
// Override default shortcut management in MapCanvas
837+
e->ignore();
835838
}
836839
}
837840

src/ui/qgsattributetabledialog.ui

+1-4
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@
112112
<item>
113113
<widget class="QToolButton" name="mDeleteSelectedButton">
114114
<property name="toolTip">
115-
<string>Delete selected features (Ctrl+D)</string>
115+
<string>Delete selected features (DEL)</string>
116116
</property>
117117
<property name="text">
118118
<string>...</string>
@@ -127,9 +127,6 @@
127127
<height>18</height>
128128
</size>
129129
</property>
130-
<property name="shortcut">
131-
<string>Ctrl+D</string>
132-
</property>
133130
</widget>
134131
</item>
135132
<item>

0 commit comments

Comments
 (0)