QGIS API Documentation 3.39.0-Master (47f7b3a4989)
Loading...
Searching...
No Matches
qgslayermetadatasearchwidget.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgslayermetadatasearchwidget.cpp - QgsLayerMetadataSearchWidget
3
4 ---------------------
5 begin : 1.9.2022
6 copyright : (C) 2022 by Alessandro Pasotti
7 email : elpaso at itopen dot it
8 ***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
19#include "qgsapplication.h"
20#include "qgsmapcanvas.h"
22#include "qgsiconutils.h"
23#include "qgshelp.h"
24
25
27 : QgsAbstractDataSourceWidget( parent, fl, widgetMode )
28{
29
30 setupUi( this );
31 setupButtons( mButtonBox );
32
33 QgsMetadataSearchContext searchContext;
35
36 mSourceModel = new QgsLayerMetadataResultsModel( searchContext, this );
37 mProxyModel = new QgsLayerMetadataResultsProxyModel( this );
38 mProxyModel->setSourceModel( mSourceModel );
39 mMetadataTableView->setModel( mProxyModel );
40 mMetadataTableView->setSortingEnabled( true );
41 mMetadataTableView->sortByColumn( 0, Qt::SortOrder::AscendingOrder );
42 mMetadataTableView->horizontalHeader()->setSectionResizeMode( QgsLayerMetadataResultsModel::Sections::Identifier, QHeaderView::ResizeMode::Stretch );
43 mMetadataTableView->horizontalHeader()->setSectionResizeMode( QgsLayerMetadataResultsModel::Sections::Title, QHeaderView::ResizeMode::Stretch );
44 mMetadataTableView->horizontalHeader()->setSectionResizeMode( QgsLayerMetadataResultsModel::Sections::Abstract, QHeaderView::ResizeMode::Stretch );
45 mMetadataTableView->horizontalHeader()->setSectionResizeMode( QgsLayerMetadataResultsModel::Sections::DataProviderName, QHeaderView::ResizeMode::ResizeToContents );
46 mMetadataTableView->horizontalHeader()->setSectionResizeMode( QgsLayerMetadataResultsModel::Sections::GeometryType, QHeaderView::ResizeMode::ResizeToContents );
47 mMetadataTableView->setSelectionBehavior( QAbstractItemView::SelectRows );
48
49 mExtentFilterComboBox->addItem( QString( ) );
50 mExtentFilterComboBox->addItem( QStringLiteral( "Map Canvas Extent" ) );
51 mExtentFilterComboBox->addItem( QStringLiteral( "Current Project Extent" ) );
52 mExtentFilterComboBox->setCurrentIndex( 0 );
53 mExtentFilterComboBox->setSizeAdjustPolicy( QComboBox::SizeAdjustPolicy::AdjustToContents );
54 mExtentFilterComboBox->adjustSize();
55
56 mGeometryTypeComboBox->addItem( QString( ), QVariant() );
60 // Note: unknown geometry is mapped to null and missing from the combo
62 mGeometryTypeComboBox->addItem( QgsApplication::getThemeIcon( QStringLiteral( "mIconRaster.svg" ) ), tr( "Raster" ), QVariant() );
63 mGeometryTypeComboBox->setCurrentIndex( 0 );
64 mGeometryTypeComboBox->setSizeAdjustPolicy( QComboBox::SizeAdjustPolicy::AdjustToContents );
65 mGeometryTypeComboBox->adjustSize();
66
67 auto updateLoadBtn = [ = ]
68 {
69 if ( mIsLoading )
70 {
71 mAbortPushButton->setText( tr( "Abort" ) );
72 mAbortPushButton->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "mTaskCancel.svg" ) ) );
73 }
74 else
75 {
76 mAbortPushButton->setText( tr( "Refresh" ) );
77 mAbortPushButton->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "mActionRefresh.svg" ) ) );
78 }
79 };
80
81 connect( mSourceModel, &QgsLayerMetadataResultsModel::progressChanged, mProgressBar, &QProgressBar::setValue );
82 connect( mSourceModel, &QgsLayerMetadataResultsModel::progressChanged, this, [ = ]( int progress )
83 {
84 if ( progress == 100 )
85 {
86 mIsLoading = false;
87 mProgressBar->hide();
88 updateLoadBtn();
89 }
90 } );
91
92 connect( mAbortPushButton, &QPushButton::clicked, mSourceModel, [ = ]( bool )
93 {
94 if ( ! mIsLoading )
95 {
96 mIsLoading = true;
97 mProgressBar->show();
98 mSourceModel->reloadAsync( );
99 }
100 else
101 {
102 mProgressBar->hide();
103 mSourceModel->cancel();
104 mIsLoading = false;
105 }
106 updateLoadBtn();
107 } );
108
109 connect( mMetadataTableView->selectionModel(), &QItemSelectionModel::selectionChanged, this, [ = ]( const QItemSelection &, const QItemSelection & )
110 {
111 emit enableButtons( mMetadataTableView->selectionModel()->hasSelection() );
112 } );
113
114 connect( mSearchFilterLineEdit, &QLineEdit::textEdited, mProxyModel, &QgsLayerMetadataResultsProxyModel::setFilterString );
115 connect( mSearchFilterLineEdit, &QgsFilterLineEdit::cleared, mProxyModel, [ = ] { mProxyModel->setFilterString( QString() ); } );
116 connect( mExtentFilterComboBox, qOverload<int>( &QComboBox::currentIndexChanged ), this, &QgsLayerMetadataSearchWidget::updateExtentFilter );
117
118 connect( mGeometryTypeComboBox, qOverload<int>( &QComboBox::currentIndexChanged ), this, [ = ]( int index )
119 {
120 if ( index == 0 ) // reset all filters
121 {
122 mProxyModel->setFilterGeometryTypeEnabled( false );
123 mProxyModel->setFilterMapLayerTypeEnabled( false );
124 }
125 else
126 {
127 const QVariant geomTypeFilterValue( mGeometryTypeComboBox->currentData() );
128 if ( geomTypeFilterValue.isValid() ) // Vector layers
129 {
130 mProxyModel->setFilterGeometryTypeEnabled( true );
131 mProxyModel->setFilterGeometryType( geomTypeFilterValue.value<Qgis::GeometryType>( ) );
132 mProxyModel->setFilterMapLayerTypeEnabled( true );
134 }
135 else // Raster layers
136 {
137 mProxyModel->setFilterGeometryTypeEnabled( false );
138 mProxyModel->setFilterMapLayerTypeEnabled( true );
140 }
141 }
142
143 } );
144
145 connect( QgsProject::instance(), &QgsProject::layersAdded, this, [ = ]( const QList<QgsMapLayer *> & )
146 {
147 updateExtentFilter( mExtentFilterComboBox->currentIndex() );
148 } );
149
150 connect( QgsProject::instance(), &QgsProject::layersRemoved, this, [ = ]( const QStringList & )
151 {
152 updateExtentFilter( mExtentFilterComboBox->currentIndex() );
153 } );
154
155 connect( mButtonBox, &QDialogButtonBox::helpRequested, this, &QgsLayerMetadataSearchWidget::showHelp );
156
157 // Start loading metadata in the model
158 mSourceModel->reloadAsync();
159 mIsLoading = true;
160
161}
162
164{
165 if ( newMapCanvas && mapCanvas() != newMapCanvas )
166 {
167 connect( newMapCanvas, &QgsMapCanvas::extentsChanged, this, [ = ]
168 {
169 updateExtentFilter( mExtentFilterComboBox->currentIndex() );
170 } );
171 }
173}
174
176{
177 if ( index == 1 && mapCanvas() )
178 {
179 QgsCoordinateTransform ct( mapCanvas()->mapSettings().destinationCrs(), QgsCoordinateReferenceSystem::fromEpsgId( 4326 ), QgsProject::instance()->transformContext() );
181 mProxyModel->setFilterExtent( ct.transformBoundingBox( mapCanvas()->extent() ) );
182 }
183 else if ( index == 2 )
184 {
188 mProxyModel->setFilterExtent( ct.transformBoundingBox( extent ) );
189 }
190 else
191 {
192 mProxyModel->setFilterExtent( QgsRectangle( ) );
193 }
194}
195
197{
198 mSourceModel->reloadAsync();
199}
200
202{
203 const QModelIndexList &selectedIndexes { mMetadataTableView->selectionModel()->selectedRows() };
204 if ( ! selectedIndexes.isEmpty() )
205 {
206 for ( const auto &selectedIndex : std::as_const( selectedIndexes ) )
207 {
208 const QgsLayerMetadataProviderResult metadataResult { mSourceModel->data( mProxyModel->mapToSource( selectedIndex ), static_cast< int >( QgsLayerMetadataResultsModel::CustomRole::Metadata ) ).value<QgsLayerMetadataProviderResult>() };
209
210 QString layerName = metadataResult.title();
211 if ( layerName.isEmpty() )
212 {
213 QVariantMap components = QgsProviderRegistry::instance()->decodeUri( metadataResult.dataProviderName(), metadataResult.uri() );
214 if ( components.contains( QStringLiteral( "layerName" ) ) )
215 {
216 layerName = components.value( QStringLiteral( "layerName" ) ).toString();
217 }
218 else if ( components.contains( QStringLiteral( "table" ) ) )
219 {
220 layerName = components.value( QStringLiteral( "table" ) ).toString();
221 }
222 else
223 {
224 layerName = metadataResult.identifier();
225 }
226 }
227
228 switch ( metadataResult.layerType() )
229 {
231 {
233 emit addRasterLayer( metadataResult.uri(), layerName, metadataResult.dataProviderName() );
235 emit addLayer( metadataResult.layerType(), metadataResult.uri(), layerName, metadataResult.dataProviderName() );
236 break;
237 }
239 {
241 emit addVectorLayer( metadataResult.uri(), layerName, metadataResult.dataProviderName() );
243 emit addLayer( metadataResult.layerType(), metadataResult.uri(), layerName, metadataResult.dataProviderName() );
244 break;
245 }
247 {
249 emit addMeshLayer( metadataResult.uri(), layerName, metadataResult.dataProviderName() );
251 emit addLayer( metadataResult.layerType(), metadataResult.uri(), layerName, metadataResult.dataProviderName() );
252 break;
253 }
254 default: // unsupported
255 {
256 // Ignore
257 break;
258 }
259 }
260 }
261 }
262}
263
265{
266 mSearchFilterLineEdit->clear();
267 mExtentFilterComboBox->setCurrentIndex( 0 );
268}
269
271{
272 QgsAbstractDataSourceWidget::showEvent( event );
273 mSearchFilterLineEdit->setText( mProxyModel->filterString( ) );
274}
275
276void QgsLayerMetadataSearchWidget::showHelp()
277{
278 QgsHelp::openHelp( QStringLiteral( "managing_data_source/opening_data.html#the-layer-metadata-search-panel" ) );
279}
GeometryType
The geometry types are used to group Qgis::WkbType in a coarse way.
Definition qgis.h:274
@ Polygon
Polygons.
@ Null
No geometry.
@ Vector
Vector layer.
@ Mesh
Mesh layer. Added in QGIS 3.2.
@ Raster
Raster layer.
Abstract base Data Source Widget to create connections and add layers This class provides common func...
Q_DECL_DEPRECATED void progress(int, int)
Emitted when a progress dialog is shown by the provider dialog.
virtual QgsMapCanvas * mapCanvas()
Returns the dialog map canvas.
void setupButtons(QDialogButtonBox *buttonBox)
Connect the ok and apply/add buttons to the slots.
Q_DECL_DEPRECATED void addRasterLayer(const QString &rasterLayerPath, const QString &baseName, const QString &providerKey)
Emitted when a raster layer has been selected for addition.
virtual void setMapCanvas(QgsMapCanvas *mapCanvas)
Sets the dialog map canvas.
Q_DECL_DEPRECATED void addMeshLayer(const QString &url, const QString &baseName, const QString &providerKey)
Emitted when a mesh layer has been selected for addition.
Q_DECL_DEPRECATED void addVectorLayer(const QString &uri, const QString &layerName, const QString &providerKey=QString())
Emitted when a vector layer has been selected for addition.
void addLayer(Qgis::LayerType type, const QString &url, const QString &baseName, const QString &providerKey)
Emitted when a layer has been selected for addition.
QString title() const
Returns the human readable name of the resource, typically displayed in search results.
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
static Q_INVOKABLE QgsCoordinateReferenceSystem fromEpsgId(long epsg)
Creates a CRS from a given EPSG ID.
Class for doing transforms between two map coordinate systems.
void setBallparkTransformsAreAppropriate(bool appropriate)
Sets whether approximate "ballpark" results are appropriate for this coordinate transform.
QgsRectangle transformBoundingBox(const QgsRectangle &rectangle, Qgis::TransformDirection direction=Qgis::TransformDirection::Forward, bool handle180Crossover=false) const
Transforms a rectangle from the source CRS to the destination CRS.
void cleared()
Emitted when the widget is cleared.
static void openHelp(const QString &key)
Opens help topic for the given help key using default system web browser.
Definition qgshelp.cpp:39
static QIcon iconForGeometryType(Qgis::GeometryType typeGroup)
Returns the icon for a vector layer whose geometry typeGroup is provided.
Result record of layer metadata provider search.
The QgsLayerMetadataResultsProxyModel class is a proxy model for QgsLayerMetadataResultsModel,...
void setFilterGeometryType(Qgis::GeometryType geometryType)
Sets the geometry type filter to geometryType.
void setFilterString(const QString &filterString)
Sets the text filter to filterString.
void setFilterExtent(const QgsRectangle &extent)
Sets the extent filter to extent.
void setFilterMapLayerTypeEnabled(bool enabled)
Sets the map layer type filter status to enabled.
void setFilterMapLayerType(const Qgis::LayerType mapLayerType)
Sets the map layer type filter to mapLayerType.
void setFilterGeometryTypeEnabled(bool enabled)
Sets the geometry type filter status to enabled.
const QString filterString() const
Returns the filter string.
QgsLayerMetadataSearchWidget(QWidget *parent=nullptr, Qt::WindowFlags fl=Qt::WindowFlags(), QgsProviderRegistry::WidgetMode widgetMode=QgsProviderRegistry::WidgetMode::None)
Creates a new QgsLayerMetadataSearchWidget.
void setMapCanvas(QgsMapCanvas *mapCanvas) override
Sets the dialog map canvas.
void updateExtentFilter(int index)
Updates the extent filter based on the combo box current item index.
void showEvent(QShowEvent *event) override
Map canvas is a class for displaying all GIS data types on a canvas.
void extentsChanged()
Emitted when the extents of the map change.
QgsReferencedRectangle fullExtent() const
Returns the full extent of the project, which represents the maximal limits of the project.
void layersRemoved(const QStringList &layerIds)
Emitted after one or more layers were removed from the registry.
static QgsProject * instance()
Returns the QgsProject singleton instance.
QgsCoordinateTransformContext transformContext
Definition qgsproject.h:113
const QgsProjectViewSettings * viewSettings() const
Returns the project's view settings, which contains settings and properties relating to how a QgsProj...
void layersAdded(const QList< QgsMapLayer * > &layers)
Emitted when one or more layers were added to the registry.
QVariantMap decodeUri(const QString &providerKey, const QString &uri)
Breaks a provider data source URI into its component paths (e.g.
static QgsProviderRegistry * instance(const QString &pluginPath=QString())
Means of accessing canonical single instance.
WidgetMode
Different ways a source select dialog can be used.
A rectangle specified with double values.
QgsCoordinateReferenceSystem crs() const
Returns the associated coordinate reference system, or an invalid CRS if no reference system is set.
A QgsRectangle with associated coordinate reference system.
static QString geometryDisplayString(Qgis::GeometryType type)
Returns a display string for a geometry type.
#define Q_NOWARN_DEPRECATED_POP
Definition qgis.h:6042
#define Q_NOWARN_DEPRECATED_PUSH
Definition qgis.h:6041
QgsCoordinateTransformContext transformContext
Coordinate transform context.