From 0d772628d08ead5c8ba03e36449488dfa46edc8c Mon Sep 17 00:00:00 2001 From: Alessandro Pasotti Date: Thu, 6 Feb 2025 16:15:46 +0100 Subject: [PATCH 1/3] Fix deadlock when calling datasource manager dialog refresh Fix #60335 --- src/gui/qgsdatasourcemanagerdialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/qgsdatasourcemanagerdialog.cpp b/src/gui/qgsdatasourcemanagerdialog.cpp index f55afc267616..5b69d5e39b3c 100644 --- a/src/gui/qgsdatasourcemanagerdialog.cpp +++ b/src/gui/qgsdatasourcemanagerdialog.cpp @@ -302,7 +302,7 @@ void QgsDataSourceManagerDialog::makeConnections( QgsAbstractDataSourceWidget *d connect( dlg, &QgsAbstractDataSourceWidget::replaceVectorLayer, this, &QgsDataSourceManagerDialog::replaceSelectedVectorLayer ); // Common connect( dlg, &QgsAbstractDataSourceWidget::connectionsChanged, this, &QgsDataSourceManagerDialog::connectionsChanged ); - connect( this, &QgsDataSourceManagerDialog::providerDialogsRefreshRequested, dlg, &QgsAbstractDataSourceWidget::refresh ); + connect( this, &QgsDataSourceManagerDialog::providerDialogsRefreshRequested, dlg, &QgsAbstractDataSourceWidget::refresh, Qt::ConnectionType::QueuedConnection ); // Message connect( dlg, &QgsAbstractDataSourceWidget::pushMessage, this, [=]( const QString &title, const QString &message, const Qgis::MessageLevel level ) { From bddc9f7d28d1d41e044596f1d9c2516c86ff7425 Mon Sep 17 00:00:00 2001 From: Alessandro Pasotti Date: Fri, 7 Feb 2025 09:35:28 +0100 Subject: [PATCH 2/3] Lazier metadata load This do not load the metadata unless the widget is visible. It is an attempt to fix #60335 (which I cannot reproduce after the previous commit) --- src/gui/qgslayermetadatasearchwidget.cpp | 27 +++++++++++++++--------- src/gui/qgslayermetadatasearchwidget.h | 4 +++- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/gui/qgslayermetadatasearchwidget.cpp b/src/gui/qgslayermetadatasearchwidget.cpp index f3f30d5149de..cd07d6b5dc6a 100644 --- a/src/gui/qgslayermetadatasearchwidget.cpp +++ b/src/gui/qgslayermetadatasearchwidget.cpp @@ -82,6 +82,7 @@ QgsLayerMetadataSearchWidget::QgsLayerMetadataSearchWidget( QWidget *parent, Qt: if ( progress == 100 ) { mIsLoading = false; + mReloadRequired = false; mProgressBar->hide(); updateLoadBtn(); } @@ -90,15 +91,16 @@ QgsLayerMetadataSearchWidget::QgsLayerMetadataSearchWidget( QWidget *parent, Qt: connect( mAbortPushButton, &QPushButton::clicked, mSourceModel, [=]( bool ) { if ( !mIsLoading ) { - mIsLoading = true; mProgressBar->show(); - mSourceModel->reloadAsync(); + mReloadRequired = true; + refresh(); } else { mProgressBar->hide(); mSourceModel->cancel(); mIsLoading = false; + mReloadRequired = false; } updateLoadBtn(); } ); @@ -181,8 +183,9 @@ void QgsLayerMetadataSearchWidget::updateExtentFilter( int index ) void QgsLayerMetadataSearchWidget::refresh() { - mIsLoading = true; - mSourceModel->reloadAsync(); + // Lazy reload + mReloadRequired = true; + refreshInternal(); } void QgsLayerMetadataSearchWidget::addButtonClicked() @@ -258,15 +261,19 @@ void QgsLayerMetadataSearchWidget::showEvent( QShowEvent *event ) { QgsAbstractDataSourceWidget::showEvent( event ); mSearchFilterLineEdit->setText( mProxyModel->filterString() ); - // The first show event triggers the metadata loading - if ( !mIsInitialized ) - { - refresh(); - mIsInitialized = true; - } + refreshInternal(); } void QgsLayerMetadataSearchWidget::showHelp() { QgsHelp::openHelp( QStringLiteral( "managing_data_source/opening_data.html#the-layer-metadata-search-panel" ) ); } + +void QgsLayerMetadataSearchWidget::refreshInternal() +{ + if ( mReloadRequired && isVisible() ) + { + mIsLoading = true; + mSourceModel->reloadAsync(); + } +} diff --git a/src/gui/qgslayermetadatasearchwidget.h b/src/gui/qgslayermetadatasearchwidget.h index 2dcb35845ded..60314f0e9158 100644 --- a/src/gui/qgslayermetadatasearchwidget.h +++ b/src/gui/qgslayermetadatasearchwidget.h @@ -59,9 +59,11 @@ class GUI_EXPORT QgsLayerMetadataSearchWidget : public QgsAbstractDataSourceWidg private: QgsLayerMetadataResultsProxyModel *mProxyModel = nullptr; bool mIsLoading = false; - bool mIsInitialized = false; + bool mReloadRequired = true; QgsLayerMetadataResultsModel *mSourceModel = nullptr; + void refreshInternal(); + // QWidget interface protected: void showEvent( QShowEvent *event ) override; From e1cc7c2aaaf93e446fff1a7ff06cdcaeb1e3a00c Mon Sep 17 00:00:00 2001 From: Alessandro Pasotti Date: Fri, 7 Feb 2025 09:58:51 +0100 Subject: [PATCH 3/3] Queued connection for browser refresh (to not deadlock the credentials dlg request) --- src/app/qgisapp.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/qgisapp.cpp b/src/app/qgisapp.cpp index b58739addcf7..25fe76c9a223 100644 --- a/src/app/qgisapp.cpp +++ b/src/app/qgisapp.cpp @@ -2671,7 +2671,7 @@ void QgisApp::dataSourceManager( const QString &pageName, const QString &layerUr if ( !mDataSourceManagerDialog ) { mDataSourceManagerDialog = new QgsDataSourceManagerDialog( mBrowserModel, this, mapCanvas() ); - connect( this, &QgisApp::connectionsChanged, mDataSourceManagerDialog, &QgsDataSourceManagerDialog::refresh ); + connect( this, &QgisApp::connectionsChanged, mDataSourceManagerDialog, &QgsDataSourceManagerDialog::refresh, Qt::ConnectionType::QueuedConnection ); connect( mDataSourceManagerDialog, &QgsDataSourceManagerDialog::connectionsChanged, this, &QgisApp::connectionsChanged );