From f3d473cb27b16b686aee6368d5fac9b32dd968a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Germ=C3=A1n=20Carrillo?= Date: Wed, 10 Jun 2020 22:26:50 -0500 Subject: [PATCH] Getter/setter for linking a map canvas with its QgsProject; link app canvases to QgsProject::instance(); rationale: using the QgsProject singleton is discouraged --- python/gui/auto_generated/qgsmapcanvas.sip.in | 15 +++++++++++++++ src/app/qgisapp.cpp | 4 ++++ src/gui/qgsmapcanvas.cpp | 10 ++++++++++ src/gui/qgsmapcanvas.h | 19 +++++++++++++++++++ 4 files changed, 48 insertions(+) diff --git a/python/gui/auto_generated/qgsmapcanvas.sip.in b/python/gui/auto_generated/qgsmapcanvas.sip.in index 9422f5e35bd..afcd7b723c1 100644 --- a/python/gui/auto_generated/qgsmapcanvas.sip.in +++ b/python/gui/auto_generated/qgsmapcanvas.sip.in @@ -337,6 +337,21 @@ You don't have to call it manually, QgsMapTool takes care of it. QgsMapTool *mapTool(); %Docstring Returns the currently active tool +%End + + void setProject( QgsProject *project ); +%Docstring +Sets the ``project`` linked to this canvas. + +.. versionadded:: 3.14 +%End + + QgsProject *project(); +%Docstring +Returns the project linked to this canvas. +The returned value may be ``None``. + +.. versionadded:: 3.14 %End void setCanvasColor( const QColor &_newVal ); diff --git a/src/app/qgisapp.cpp b/src/app/qgisapp.cpp index e0f81a91a32..01807f62b2f 100644 --- a/src/app/qgisapp.cpp +++ b/src/app/qgisapp.cpp @@ -940,6 +940,9 @@ QgisApp::QgisApp( QSplashScreen *splash, bool restorePlugins, bool skipVersionCh int myGreen = settings.value( QStringLiteral( "qgis/default_canvas_color_green" ), 255 ).toInt(); int myBlue = settings.value( QStringLiteral( "qgis/default_canvas_color_blue" ), 255 ).toInt(); mMapCanvas->setCanvasColor( QColor( myRed, myGreen, myBlue ) ); + + // set project linked to main canvas + mMapCanvas->setProject( QgsProject::instance() ); endProfile(); // what type of project to auto-open @@ -4481,6 +4484,7 @@ QgsMapCanvasDockWidget *QgisApp::createNewMapCanvasDock( const QString &name ) QgsMapCanvas *mapCanvas = mapCanvasWidget->mapCanvas(); mapCanvas->freeze( true ); mapCanvas->setObjectName( name ); + mapCanvas->setProject( QgsProject::instance() ); connect( mapCanvas, &QgsMapCanvas::messageEmitted, this, &QgisApp::displayMessage ); connect( mLayerTreeCanvasBridge, &QgsLayerTreeMapCanvasBridge::canvasLayersChanged, mapCanvas, &QgsMapCanvas::setLayers ); diff --git a/src/gui/qgsmapcanvas.cpp b/src/gui/qgsmapcanvas.cpp index 3db39f2812f..f036886584a 100644 --- a/src/gui/qgsmapcanvas.cpp +++ b/src/gui/qgsmapcanvas.cpp @@ -2030,6 +2030,11 @@ void QgsMapCanvas::unsetMapTool( QgsMapTool *tool ) } } +void QgsMapCanvas::setProject( QgsProject *project ) +{ + mProject = project; +} + void QgsMapCanvas::setCanvasColor( const QColor &color ) { if ( canvasColor() == color ) @@ -2247,6 +2252,11 @@ QgsMapTool *QgsMapCanvas::mapTool() return mMapTool; } +QgsProject *QgsMapCanvas::project() +{ + return mProject; +} + void QgsMapCanvas::panActionEnd( QPoint releasePoint ) { // move map image and other items to standard position diff --git a/src/gui/qgsmapcanvas.h b/src/gui/qgsmapcanvas.h index 7997073e601..a870bf0e19c 100644 --- a/src/gui/qgsmapcanvas.h +++ b/src/gui/qgsmapcanvas.h @@ -28,6 +28,7 @@ #include "qgscustomdrophandler.h" #include "qgstemporalrangeobject.h" #include "qgsmapcanvasinteractionblocker.h" +#include "qgsproject.h" #include #include @@ -355,6 +356,21 @@ class GUI_EXPORT QgsMapCanvas : public QGraphicsView //! Returns the currently active tool QgsMapTool *mapTool(); + /** + * Sets the \a project linked to this canvas. + * + * \since QGIS 3.14 + */ + void setProject( QgsProject *project ); + + /** + * Returns the project linked to this canvas. + * The returned value may be NULLPTR. + * + * \since QGIS 3.14 + */ + QgsProject *project(); + //! Write property of QColor bgColor. void setCanvasColor( const QColor &_newVal ); //! Read property of QColor bgColor. @@ -1112,6 +1128,9 @@ class GUI_EXPORT QgsMapCanvas : public QGraphicsView //! previous tool if current is for zooming/panning QgsMapTool *mLastNonZoomMapTool = nullptr; + //! Pointer to project linked to this canvas + QgsProject *mProject = nullptr; + //! Context menu QMenu *mMenu = nullptr;