Skip to content

Commit 57fb7ce

Browse files
Patrick Valsecchinyalldawson
Patrick Valsecchi
authored andcommitted
Add select all and invert selection to Attributes Toolbar
Took the opportunity to fix a bug where the selectByExpression action was not disabled when a raster layer was selected.
1 parent 45489f6 commit 57fb7ce

File tree

5 files changed

+108
-6
lines changed

5 files changed

+108
-6
lines changed

images/images.qrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,7 @@
276276
<file>themes/default/mActionSaveMapAsImage.png</file>
277277
<file>themes/default/mActionScaleBar.png</file>
278278
<file>themes/default/mActionSelect.svg</file>
279+
<file>themes/default/mActionSelectAll.png</file>
279280
<file>themes/default/mActionSelectedToTop.png</file>
280281
<file>themes/default/mActionSelectFreehand.svg</file>
281282
<file>themes/default/mActionSelectPan.png</file>
539 Bytes
Loading

src/app/qgisapp.cpp

Lines changed: 78 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1385,6 +1385,8 @@ void QgisApp::createActions()
13851385
connect( mActionSelectFreehand, SIGNAL( triggered() ), this, SLOT( selectByFreehand() ) );
13861386
connect( mActionSelectRadius, SIGNAL( triggered() ), this, SLOT( selectByRadius() ) );
13871387
connect( mActionDeselectAll, SIGNAL( triggered() ), this, SLOT( deselectAll() ) );
1388+
connect( mActionSelectAll, SIGNAL( triggered() ), this, SLOT( selectAll() ) );
1389+
connect( mActionInvertSelection, SIGNAL( triggered() ), this, SLOT( invertSelection() ) );
13881390
connect( mActionSelectByExpression, SIGNAL( triggered() ), this, SLOT( selectByExpression() ) );
13891391
connect( mActionIdentify, SIGNAL( triggered() ), this, SLOT( identify() ) );
13901392
connect( mActionFeatureAction, SIGNAL( triggered() ), this, SLOT( doFeatureAction() ) );
@@ -1624,6 +1626,8 @@ void QgisApp::createActionGroups()
16241626
mMapToolGroup->addAction( mActionSelectFreehand );
16251627
mMapToolGroup->addAction( mActionSelectRadius );
16261628
mMapToolGroup->addAction( mActionDeselectAll );
1629+
mMapToolGroup->addAction( mActionSelectAll );
1630+
mMapToolGroup->addAction( mActionInvertSelection );
16271631
mMapToolGroup->addAction( mActionMeasure );
16281632
mMapToolGroup->addAction( mActionMeasureArea );
16291633
mMapToolGroup->addAction( mActionMeasureAngle );
@@ -1834,14 +1838,25 @@ void QgisApp::createToolBars()
18341838

18351839
mToolbarMenu->addActions( toolbarMenuActions );
18361840

1837-
// select tool button
1841+
// selection tool button
18381842

18391843
QToolButton *bt = new QToolButton( mAttributesToolBar );
18401844
bt->setPopupMode( QToolButton::MenuButtonPopup );
18411845
QList<QAction*> selectActions;
1842-
selectActions << mActionSelectFeatures << mActionSelectPolygon
1843-
<< mActionSelectFreehand << mActionSelectRadius;
1846+
selectActions << mActionDeselectAll << mActionSelectAll
1847+
<< mActionInvertSelection << mActionSelectByExpression;
18441848
bt->addActions( selectActions );
1849+
bt->setDefaultAction( mActionDeselectAll );
1850+
QAction* selectionAction = mAttributesToolBar->insertWidget( mActionOpenTable, bt );
1851+
1852+
// select tool button
1853+
1854+
bt = new QToolButton( mAttributesToolBar );
1855+
bt->setPopupMode( QToolButton::MenuButtonPopup );
1856+
QList<QAction*> selectionActions;
1857+
selectionActions << mActionSelectFeatures << mActionSelectPolygon
1858+
<< mActionSelectFreehand << mActionSelectRadius;
1859+
bt->addActions( selectionActions );
18451860

18461861
QAction* defSelectAction = mActionSelectFeatures;
18471862
switch ( settings.value( "/UI/selectTool", 0 ).toInt() )
@@ -1863,7 +1878,7 @@ void QgisApp::createToolBars()
18631878
break;
18641879
}
18651880
bt->setDefaultAction( defSelectAction );
1866-
QAction* selectAction = mAttributesToolBar->insertWidget( mActionDeselectAll, bt );
1881+
QAction* selectAction = mAttributesToolBar->insertWidget( selectionAction, bt );
18671882
selectAction->setObjectName( "ActionSelect" );
18681883
connect( bt, SIGNAL( triggered( QAction * ) ), this, SLOT( toolButtonActionTriggered( QAction * ) ) );
18691884

@@ -2294,6 +2309,8 @@ void QgisApp::setTheme( const QString& theThemeName )
22942309
mActionSelectFreehand->setIcon( QgsApplication::getThemeIcon( "/mActionSelectFreehand.svg" ) );
22952310
mActionSelectRadius->setIcon( QgsApplication::getThemeIcon( "/mActionSelectRadius.svg" ) );
22962311
mActionDeselectAll->setIcon( QgsApplication::getThemeIcon( "/mActionDeselectAll.svg" ) );
2312+
mActionSelectAll->setIcon( QgsApplication::getThemeIcon( "/mActionSelectAll.png" ) );
2313+
mActionInvertSelection->setIcon( QgsApplication::getThemeIcon( "/mActionInvertSelection.png" ) );
22972314
mActionSelectByExpression->setIcon( QgsApplication::getThemeIcon( "/mIconExpressionSelect.svg" ) );
22982315
mActionOpenTable->setIcon( QgsApplication::getThemeIcon( "/mActionOpenTable.png" ) );
22992316
mActionOpenFieldCalc->setIcon( QgsApplication::getThemeIcon( "/mActionCalculateField.png" ) );
@@ -6676,6 +6693,56 @@ void QgisApp::deselectAll()
66766693
mMapCanvas->setRenderFlag( true );
66776694
}
66786695

6696+
void QgisApp::invertSelection()
6697+
{
6698+
QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( mMapCanvas->currentLayer() );
6699+
if ( !vlayer )
6700+
{
6701+
messageBar()->pushMessage(
6702+
tr( "No active vector layer" ),
6703+
tr( "To invert selection, choose a vector layer in the legend" ),
6704+
QgsMessageBar::INFO,
6705+
messageTimeout() );
6706+
return;
6707+
}
6708+
6709+
// Turn off rendering to improve speed.
6710+
bool renderFlagState = mMapCanvas->renderFlag();
6711+
if ( renderFlagState )
6712+
mMapCanvas->setRenderFlag( false );
6713+
6714+
vlayer->invertSelection();
6715+
6716+
// Turn on rendering (if it was on previously)
6717+
if ( renderFlagState )
6718+
mMapCanvas->setRenderFlag( true );
6719+
}
6720+
6721+
void QgisApp::selectAll()
6722+
{
6723+
QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( mMapCanvas->currentLayer() );
6724+
if ( !vlayer )
6725+
{
6726+
messageBar()->pushMessage(
6727+
tr( "No active vector layer" ),
6728+
tr( "To select all, choose a vector layer in the legend" ),
6729+
QgsMessageBar::INFO,
6730+
messageTimeout() );
6731+
return;
6732+
}
6733+
6734+
// Turn off rendering to improve speed.
6735+
bool renderFlagState = mMapCanvas->renderFlag();
6736+
if ( renderFlagState )
6737+
mMapCanvas->setRenderFlag( false );
6738+
6739+
vlayer->selectAll();
6740+
6741+
// Turn on rendering (if it was on previously)
6742+
if ( renderFlagState )
6743+
mMapCanvas->setRenderFlag( true );
6744+
}
6745+
66796746
void QgisApp::selectByExpression()
66806747
{
66816748
QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( mMapCanvas->currentLayer() );
@@ -9804,6 +9871,8 @@ void QgisApp::activateDeactivateLayerRelatedActions( QgsMapLayer* layer )
98049871
mActionSelectByExpression->setEnabled( false );
98059872
mActionLabeling->setEnabled( false );
98069873
mActionOpenTable->setEnabled( false );
9874+
mActionSelectAll->setEnabled( false );
9875+
mActionInvertSelection->setEnabled( false );
98079876
mActionOpenFieldCalc->setEnabled( false );
98089877
mActionToggleEditing->setEnabled( false );
98099878
mActionToggleEditing->setChecked( false );
@@ -9900,6 +9969,8 @@ void QgisApp::activateDeactivateLayerRelatedActions( QgsMapLayer* layer )
99009969
mActionIdentify->setEnabled( true );
99019970
mActionSelectByExpression->setEnabled( true );
99029971
mActionOpenTable->setEnabled( true );
9972+
mActionSelectAll->setEnabled( true );
9973+
mActionInvertSelection->setEnabled( true );
99039974
mActionSaveLayerDefinition->setEnabled( true );
99049975
mActionLayerSaveAs->setEnabled( true );
99059976
mActionCopyFeatures->setEnabled( layerHasSelection );
@@ -10074,6 +10145,9 @@ void QgisApp::activateDeactivateLayerRelatedActions( QgsMapLayer* layer )
1007410145
mActionSelectRadius->setEnabled( false );
1007510146
mActionZoomActualSize->setEnabled( true );
1007610147
mActionOpenTable->setEnabled( false );
10148+
mActionSelectAll->setEnabled( false );
10149+
mActionInvertSelection->setEnabled( false );
10150+
mActionSelectByExpression->setEnabled( false );
1007710151
mActionOpenFieldCalc->setEnabled( false );
1007810152
mActionToggleEditing->setEnabled( false );
1007910153
mActionToggleEditing->setChecked( false );

src/app/qgisapp.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1050,6 +1050,12 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
10501050
//! deselect features from all layers
10511051
void deselectAll();
10521052

1053+
//! select all features
1054+
void selectAll();
1055+
1056+
//! invert the selection
1057+
void invertSelection();
1058+
10531059
//! select features by expression
10541060
void selectByExpression();
10551061

src/ui/qgisapp.ui

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@
7272
<addaction name="mActionSelectRadius"/>
7373
<addaction name="mActionSelectByExpression"/>
7474
<addaction name="mActionDeselectAll"/>
75+
<addaction name="mActionSelectAll"/>
76+
<addaction name="mActionInvertSelection"/>
7577
</widget>
7678
<widget class="QMenu" name="menuMeasure">
7779
<property name="title">
@@ -439,8 +441,6 @@
439441
<bool>true</bool>
440442
</attribute>
441443
<addaction name="mActionIdentify"/>
442-
<addaction name="mActionDeselectAll"/>
443-
<addaction name="mActionSelectByExpression"/>
444444
<addaction name="mActionOpenTable"/>
445445
<addaction name="mActionOpenFieldCalc"/>
446446
<addaction name="mActionStatisticalSummary"/>
@@ -997,6 +997,27 @@
997997
<string>Deselect Features from All Layers</string>
998998
</property>
999999
</action>
1000+
<action name="mActionSelectAll">
1001+
<property name="icon">
1002+
<iconset resource="../../images/images.qrc">
1003+
<normaloff>:/images/themes/default/mActionSelectAll.png</normaloff>:/images/themes/default/mActionSelectAll.png</iconset>
1004+
</property>
1005+
<property name="text">
1006+
<string>Select all Features</string>
1007+
</property>
1008+
<property name="shortcut">
1009+
<string>Ctrl+A</string>
1010+
</property>
1011+
</action>
1012+
<action name="mActionInvertSelection">
1013+
<property name="icon">
1014+
<iconset resource="../../images/images.qrc">
1015+
<normaloff>:/images/themes/default/mActionInvertSelection.png</normaloff>:/images/themes/default/mActionInvertSelection.png</iconset>
1016+
</property>
1017+
<property name="text">
1018+
<string>Invert Feature selection</string>
1019+
</property>
1020+
</action>
10001021
<action name="mActionIdentify">
10011022
<property name="checkable">
10021023
<bool>true</bool>

0 commit comments

Comments
 (0)