QGIS API Documentation  3.13.0-Master (5a3b1ced84)
qgsfeatureselectiondlg.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsfeatureselectiondlg.cpp
3  --------------------------------------
4  Date : 11.6.2013
5  Copyright : (C) 2013 Matthias Kuhn
6  Email : matthias at opengis dot ch
7  ***************************************************************************
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
15 
16 #include "qgsfeatureselectiondlg.h"
17 
19 #include "qgsdistancearea.h"
20 #include "qgsfeaturerequest.h"
22 #include "qgsapplication.h"
24 #include "qgsmapcanvas.h"
25 
26 #include <QWindow>
27 
29  : QDialog( parent, Qt::Window )
30  , mVectorLayer( vl )
31  , mContext( context )
32 {
33  setupUi( this );
34 
35  mFeatureSelection = new QgsVectorLayerSelectionManager( vl, mDualView );
36 
37  mDualView->setFeatureSelectionManager( mFeatureSelection );
38 
39  mDualView->init( mVectorLayer, context.mapCanvas(), QgsFeatureRequest(), context );
40  mDualView->setView( QgsDualView::AttributeEditor );
41 
42  mFeatureFilterWidget->init( vl, context, mDualView, mMessageBar, 5 );
43  mFeatureFilterWidget->filterVisible();
44 
45  connect( mActionExpressionSelect, &QAction::triggered, this, &QgsFeatureSelectionDlg::mActionExpressionSelect_triggered );
46  connect( mActionSelectAll, &QAction::triggered, this, &QgsFeatureSelectionDlg::mActionSelectAll_triggered );
47  connect( mActionInvertSelection, &QAction::triggered, this, &QgsFeatureSelectionDlg::mActionInvertSelection_triggered );
48  connect( mActionRemoveSelection, &QAction::triggered, this, &QgsFeatureSelectionDlg::mActionRemoveSelection_triggered );
49  connect( mActionSearchForm, &QAction::toggled, mDualView, &QgsDualView::toggleSearchMode );
50  connect( mActionSelectedToTop, &QAction::toggled, this, [this]( bool checked ) { mDualView->setSelectedOnTop( checked ); } );
51  connect( mActionZoomMapToSelectedRows, &QAction::triggered, this, &QgsFeatureSelectionDlg::mActionZoomMapToSelectedRows_triggered );
52  connect( mActionPanMapToSelectedRows, &QAction::triggered, this, &QgsFeatureSelectionDlg::mActionPanMapToSelectedRows_triggered );
53 
54  connect( mDualView, &QgsDualView::filterExpressionSet, this, &QgsFeatureSelectionDlg::setFilterExpression );
55  connect( mDualView, &QgsDualView::formModeChanged, this, &QgsFeatureSelectionDlg::viewModeChanged );
56 }
57 
59 {
60  // don't accept Enter key to accept the dialog, user could be editing a text field
61  if ( evt->key() == Qt::Key_Enter || evt->key() == Qt::Key_Return )
62  return;
63  QDialog::keyPressEvent( evt );
64 }
65 
67 {
68  return mFeatureSelection->selectedFeatureIds();
69 }
70 
72 {
73  mFeatureSelection->setSelectedFeatures( ids );
74 }
75 
76 void QgsFeatureSelectionDlg::showEvent( QShowEvent *event )
77 {
78 
79  QWindow *mainWindow = nullptr;
80  for ( const auto &w : QgsApplication::instance()->topLevelWindows() )
81  {
82  if ( w->objectName() == QStringLiteral( "QgisAppWindow" ) )
83  {
84  mainWindow = w;
85  break;
86  }
87  }
88 
89  if ( mainWindow )
90  {
91  QSize margins( size() - scrollAreaWidgetContents->size() );
92  QSize innerWinSize( mainWindow->width(), mainWindow->height() );
93  setMaximumSize( innerWinSize );
94  QSize minSize( scrollAreaWidgetContents->sizeHint() );
95  setMinimumSize( std::min( minSize.width() + margins.width( ), innerWinSize.width() ),
96  std::min( minSize.height() + margins.width( ), innerWinSize.height() ) );
97  }
98 
99  QDialog::showEvent( event );
100 }
101 
102 void QgsFeatureSelectionDlg::mActionExpressionSelect_triggered()
103 {
105  dlg->setMessageBar( mMessageBar );
106  dlg->setAttribute( Qt::WA_DeleteOnClose );
107  dlg->show();
108 }
109 
110 void QgsFeatureSelectionDlg::mActionInvertSelection_triggered()
111 {
112  mVectorLayer->invertSelection();
113 }
114 
115 void QgsFeatureSelectionDlg::mActionRemoveSelection_triggered()
116 {
117  mVectorLayer->removeSelection();
118 }
119 
120 void QgsFeatureSelectionDlg::mActionSelectAll_triggered()
121 {
122  mVectorLayer->selectAll();
123 }
124 
125 void QgsFeatureSelectionDlg::mActionZoomMapToSelectedRows_triggered()
126 {
127  mContext.mapCanvas()->zoomToSelected( mVectorLayer );
128 }
129 
130 void QgsFeatureSelectionDlg::mActionPanMapToSelectedRows_triggered()
131 {
132  mContext.mapCanvas()->panToSelected( mVectorLayer );
133 }
134 
135 void QgsFeatureSelectionDlg::setFilterExpression( const QString &filter, QgsAttributeForm::FilterType type )
136 {
137  mFeatureFilterWidget->setFilterExpression( filter, type, true );
138 }
139 
140 void QgsFeatureSelectionDlg::viewModeChanged( QgsAttributeEditorContext::Mode mode )
141 {
142  mActionSearchForm->setChecked( mode == QgsAttributeEditorContext::SearchMode );
143 }
Q_INVOKABLE void selectAll()
Select all the features.
QSet< QgsFeatureId > QgsFeatureIds
Definition: qgsfeatureid.h:34
static QgsApplication * instance()
Returns the singleton instance of the QgsApplication.
void filterExpressionSet(const QString &expression, QgsAttributeForm::FilterType type)
Emitted when a filter expression is set using the view.
void toggleSearchMode(bool enabled)
Toggles whether search mode should be enabled in the form.
This class contains context information for attribute editor widgets.
void showEvent(QShowEvent *event) override
Make sure the dialog does not grow too much.
const QgsFeatureIds & selectedFeatureIds() const override
Returns reference to identifiers of selected features.
void keyPressEvent(QKeyEvent *evt) override
Q_INVOKABLE void invertSelection()
Selects not selected features and deselects selected ones.
const QgsFeatureIds & selectedFeatures()
Gets the selected features.
Q_INVOKABLE void removeSelection()
Clear selection.
Show a list of the features, where one can be chosen and the according attribute dialog will be prese...
Definition: qgsdualview.h:65
void setSelectedFeatures(const QgsFeatureIds &ids) override
Change selection to the new set of features.
FilterType
Filter types.
This class wraps a request for features to a vector layer (or directly its vector data provider)...
void panToSelected(QgsVectorLayer *layer=nullptr)
Pan to the selected features of current (vector) layer keeping same extent.
This class offers a dialog to change feature selections.
void setMessageBar(QgsMessageBar *messageBar)
Sets the message bar to display feedback from the dialog.
void setSelectedFeatures(const QgsFeatureIds &ids)
Set the selected features.
void zoomToSelected(QgsVectorLayer *layer=nullptr)
Zoom to the extent of the selected features of provided (vector) layer.
QgsFeatureSelectionDlg(QgsVectorLayer *vl, const QgsAttributeEditorContext &context, QWidget *parent=nullptr)
Constructor for QgsFeatureSelectionDlg.
Form values are used for searching/filtering the layer.
Represents a vector layer which manages a vector based data sets.
QgsMapCanvas * mapCanvas() const
Returns the associated map canvas (e.g.
void formModeChanged(QgsAttributeEditorContext::Mode mode)
Emitted when the form changes mode.