QGIS API Documentation 3.37.0-Master (fdefdf9c27f)
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 switch ( metadataResult.layerType() )
210 {
212 {
214 emit addRasterLayer( metadataResult.uri(), metadataResult.identifier(), metadataResult.dataProviderName() );
216 emit addLayer( metadataResult.layerType(), metadataResult.uri(), metadataResult.identifier(), metadataResult.dataProviderName() );
217 break;
218 }
220 {
222 emit addVectorLayer( metadataResult.uri(), metadataResult.identifier(), metadataResult.dataProviderName() );
224 emit addLayer( metadataResult.layerType(), metadataResult.uri(), metadataResult.identifier(), metadataResult.dataProviderName() );
225 break;
226 }
228 {
230 emit addMeshLayer( metadataResult.uri(), metadataResult.identifier(), metadataResult.dataProviderName() );
232 emit addLayer( metadataResult.layerType(), metadataResult.uri(), metadataResult.identifier(), metadataResult.dataProviderName() );
233 break;
234 }
235 default: // unsupported
236 {
237 // Ignore
238 break;
239 }
240 }
241 }
242 }
243}
244
246{
247 mSearchFilterLineEdit->clear();
248 mExtentFilterComboBox->setCurrentIndex( 0 );
249}
250
252{
253 QgsAbstractDataSourceWidget::showEvent( event );
254 mSearchFilterLineEdit->setText( mProxyModel->filterString( ) );
255}
256
257void QgsLayerMetadataSearchWidget::showHelp()
258{
259 QgsHelp::openHelp( QStringLiteral( "managing_data_source/opening_data.html#the-layer-metadata-search-panel" ) );
260}
GeometryType
The geometry types are used to group Qgis::WkbType in a coarse way.
Definition: qgis.h:255
@ 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.
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 QgsLayerMetadataResultsModel class handles the metadata fetching from the registered layer metada...
void cancel()
Cancels the results fetching.
void reloadAsync()
Load/Reload model data asynchronously using threads.
QVariant data(const QModelIndex &index, int role) const override
void progressChanged(int progress)
Emitted when the progress changed to progress.
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.
Definition: qgsmapcanvas.h:93
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.
Definition: qgsproject.cpp:481
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.
WidgetMode
Different ways a source select dialog can be used.
A rectangle specified with double values.
Definition: qgsrectangle.h:42
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:5776
#define Q_NOWARN_DEPRECATED_PUSH
Definition: qgis.h:5775
QgsCoordinateTransformContext transformContext
Coordinate transform context.