diff --git a/python/plugins/processing/tests/testdata/custom/circular_strings.gpkg b/python/plugins/processing/tests/testdata/custom/circular_strings.gpkg index 71ff2f8dccd..cda8f28144c 100644 Binary files a/python/plugins/processing/tests/testdata/custom/circular_strings.gpkg and b/python/plugins/processing/tests/testdata/custom/circular_strings.gpkg differ diff --git a/src/app/qgisapp.cpp b/src/app/qgisapp.cpp index b811265d781..0bb89334b62 100644 --- a/src/app/qgisapp.cpp +++ b/src/app/qgisapp.cpp @@ -1559,6 +1559,13 @@ QgisApp::~QgisApp() delete canvas; } + // these may have references to map layers which need to be cleaned up + delete mBrowserWidget; + mBrowserWidget = nullptr; + delete mBrowserWidget2; + mBrowserWidget2 = nullptr; + delete mBrowserModel; + QgsGui::instance()->nativePlatformInterface()->cleanup(); // This function *MUST* be the last one called, as it destroys in diff --git a/src/gui/qgsbrowserdockwidget_p.cpp b/src/gui/qgsbrowserdockwidget_p.cpp index a689bff2895..baeb14600fe 100644 --- a/src/gui/qgsbrowserdockwidget_p.cpp +++ b/src/gui/qgsbrowserdockwidget_p.cpp @@ -40,6 +40,7 @@ #include "qgsmeshlayer.h" #include "qgsgui.h" #include "qgsnative.h" +#include "qgsmaptoolpan.h" #include #include @@ -119,6 +120,19 @@ QgsBrowserLayerProperties::QgsBrowserLayerProperties( QWidget *parent ) // we don't want links to open in the little widget, open them externally instead mMetadataTextBrowser->setOpenLinks( false ); connect( mMetadataTextBrowser, &QTextBrowser::anchorClicked, this, &QgsBrowserLayerProperties::urlClicked ); + + mMapCanvas->setLayers( QList< QgsMapLayer * >() ); + mMapCanvas->setMapTool( new QgsMapToolPan( mMapCanvas ) ); + mMapCanvas->freeze( true ); + + connect( mTabWidget, &QTabWidget::currentChanged, this, [ = ] + { + if ( mTabWidget->currentWidget() == mPreviewTab && mMapCanvas->isFrozen() ) + { + mMapCanvas->freeze( false ); + mMapCanvas->refresh(); + } + } ); } class ProjectionSettingRestorer @@ -159,6 +173,8 @@ void QgsBrowserLayerProperties::setItem( QgsDataItem *item ) ProjectionSettingRestorer restorer; ( void )restorer; // no warnings + mLayer.reset(); + // find root item // we need to create a temporary layer to get metadata // we could use a provider but the metadata is not as complete and "pretty" and this is easier @@ -167,47 +183,17 @@ void QgsBrowserLayerProperties::setItem( QgsDataItem *item ) { QgsDebugMsg( QStringLiteral( "creating raster layer" ) ); // should copy code from addLayer() to split uri ? - std::unique_ptr layer( new QgsRasterLayer( layerItem->uri(), layerItem->uri(), layerItem->providerKey() ) ); - if ( layer ) - { - if ( layer->isValid() ) - { - bool ok = false; - layer->loadDefaultMetadata( ok ); - layerCrs = layer->crs(); - layerMetadata = layer->htmlMetadata(); - } - } + mLayer = qgis::make_unique< QgsRasterLayer >( layerItem->uri(), layerItem->uri(), layerItem->providerKey() ); } else if ( type == QgsMapLayer::MeshLayer ) { QgsDebugMsg( QStringLiteral( "creating mesh layer" ) ); - std::unique_ptr layer( new QgsMeshLayer( layerItem->uri(), layerItem->uri(), layerItem->providerKey() ) ); - if ( layer ) - { - if ( layer->isValid() ) - { - bool ok = false; - layer->loadDefaultMetadata( ok ); - layerCrs = layer->crs(); - layerMetadata = layer->htmlMetadata(); - } - } + mLayer = qgis::make_unique < QgsMeshLayer >( layerItem->uri(), layerItem->uri(), layerItem->providerKey() ); } else if ( type == QgsMapLayer::VectorLayer ) { QgsDebugMsg( QStringLiteral( "creating vector layer" ) ); - std::unique_ptr layer( new QgsVectorLayer( layerItem->uri(), layerItem->name(), layerItem->providerKey() ) ); - if ( layer ) - { - if ( layer->isValid() ) - { - bool ok = false; - layer->loadDefaultMetadata( ok ); - layerCrs = layer->crs(); - layerMetadata = layer->htmlMetadata(); - } - } + mLayer = qgis::make_unique < QgsVectorLayer>( layerItem->uri(), layerItem->name(), layerItem->providerKey() ); } else if ( type == QgsMapLayer::PluginLayer ) { @@ -215,11 +201,23 @@ void QgsBrowserLayerProperties::setItem( QgsDataItem *item ) return; } + if ( mLayer && mLayer->isValid() ) + { + bool ok = false; + mLayer->loadDefaultMetadata( ok ); + layerCrs = mLayer->crs(); + layerMetadata = mLayer->htmlMetadata(); + + mMapCanvas->setDestinationCrs( mLayer->crs() ); + mMapCanvas->setLayers( QList< QgsMapLayer * >() << mLayer.get() ); + mMapCanvas->zoomToFullExtent(); + } + QString myStyle = QgsApplication::reportStyleSheet(); mMetadataTextBrowser->document()->setDefaultStyleSheet( myStyle ); mMetadataTextBrowser->setHtml( layerMetadata ); - // report if layer was set to to project crs without prompt (may give a false positive) +// report if layer was set to to project crs without prompt (may give a false positive) if ( defaultProjectionOption == QLatin1String( "prompt" ) ) { QgsCoordinateReferenceSystem defaultCrs = diff --git a/src/gui/qgsbrowserdockwidget_p.h b/src/gui/qgsbrowserdockwidget_p.h index 7a8101d48bc..fdcbc7f016a 100644 --- a/src/gui/qgsbrowserdockwidget_p.h +++ b/src/gui/qgsbrowserdockwidget_p.h @@ -126,6 +126,10 @@ class QgsBrowserLayerProperties : public QgsBrowserPropertiesWidget, private Ui: private slots: void urlClicked( const QUrl &url ); + + private: + std::unique_ptr mLayer; + }; /** diff --git a/src/gui/qgsmapcanvas.cpp b/src/gui/qgsmapcanvas.cpp index caf69850656..b228299f2b7 100644 --- a/src/gui/qgsmapcanvas.cpp +++ b/src/gui/qgsmapcanvas.cpp @@ -174,7 +174,7 @@ QgsMapCanvas::QgsMapCanvas( QWidget *parent ) // keep device pixel ratio up to date on screen or resolution change connect( window()->windowHandle(), &QWindow::screenChanged, this, [ = ]( QScreen * ) {mSettings.setDevicePixelRatio( devicePixelRatio() );} ); if ( window()->windowHandle() ) - connect( window()->windowHandle()->screen(), &QScreen::physicalDotsPerInchChanged, [ = ]( qreal ) {mSettings.setDevicePixelRatio( devicePixelRatio() );} ); + connect( window()->windowHandle()->screen(), &QScreen::physicalDotsPerInchChanged, this, [ = ]( qreal ) {mSettings.setDevicePixelRatio( devicePixelRatio() );} ); connect( &mMapUpdateTimer, &QTimer::timeout, this, &QgsMapCanvas::mapUpdateTimeout ); mMapUpdateTimer.setInterval( 250 ); diff --git a/src/ui/qgsbrowserlayerpropertiesbase.ui b/src/ui/qgsbrowserlayerpropertiesbase.ui index b276f23473e..bd5c1e77fe2 100644 --- a/src/ui/qgsbrowserlayerpropertiesbase.ui +++ b/src/ui/qgsbrowserlayerpropertiesbase.ui @@ -24,7 +24,58 @@ 0 - + + + QTabWidget::Rounded + + + 0 + + + + Metadata + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + + Preview + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + @@ -38,9 +89,14 @@ - - mMetadataTextBrowser - + + + QgsMapCanvas + QWidget +
qgsmapcanvas.h
+ 1 +
+