Skip to content

Commit

Permalink
Make QgsMapCanvas a QgsExpressionContextGenerator
Browse files Browse the repository at this point in the history
(cherry picked from commit 79338d1)
  • Loading branch information
nyalldawson committed May 31, 2021
1 parent 0889d1b commit 2f62585
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 20 deletions.
8 changes: 6 additions & 2 deletions python/gui/auto_generated/qgsmapcanvas.sip.in
Expand Up @@ -21,7 +21,8 @@



class QgsMapCanvas : QGraphicsView

class QgsMapCanvas : QGraphicsView, QgsExpressionContextGenerator
{
%Docstring
Map canvas is a class for displaying all GIS data types on a canvas.
Expand Down Expand Up @@ -694,7 +695,7 @@ overrides for expression evaluation for the map canvas render.
%End


QgsExpressionContextScope *defaultExpressionContextScope() /Factory/;
QgsExpressionContextScope *defaultExpressionContextScope() const /Factory/;
%Docstring
Creates a new scope which contains default variables and functions relating to the map canvas.

Expand All @@ -705,6 +706,9 @@ Creates a new scope which contains default variables and functions relating to t
.. versionadded:: 3.4
%End

virtual QgsExpressionContext createExpressionContext() const;


void setSegmentationTolerance( double tolerance );
%Docstring
Sets the segmentation tolerance applied when rendering curved geometries
Expand Down
35 changes: 19 additions & 16 deletions src/gui/qgsmapcanvas.cpp
Expand Up @@ -514,14 +514,30 @@ QgsMapLayer *QgsMapCanvas::currentLayer()
return mCurrentLayer;
}

QgsExpressionContextScope *QgsMapCanvas::defaultExpressionContextScope()
QgsExpressionContextScope *QgsMapCanvas::defaultExpressionContextScope() const
{
QgsExpressionContextScope *s = new QgsExpressionContextScope( QObject::tr( "Map Canvas" ) );
s->setVariable( QStringLiteral( "canvas_cursor_point" ), QgsGeometry::fromPointXY( cursorPoint() ), true );

return s;
}

QgsExpressionContext QgsMapCanvas::createExpressionContext() const
{
//build the expression context
QgsExpressionContext expressionContext;
expressionContext << QgsExpressionContextUtils::globalScope()
<< QgsExpressionContextUtils::projectScope( QgsProject::instance() )
<< QgsExpressionContextUtils::atlasScope( nullptr )
<< QgsExpressionContextUtils::mapSettingsScope( mSettings );
if ( QgsExpressionContextScopeGenerator *generator = dynamic_cast< QgsExpressionContextScopeGenerator * >( mController ) )
{
expressionContext << generator->createExpressionContextScope();
}
expressionContext << defaultExpressionContextScope()
<< new QgsExpressionContextScope( mExpressionContextScope );
return expressionContext;
}

void QgsMapCanvas::refresh()
{
if ( !mSettings.hasValidSettings() )
Expand Down Expand Up @@ -559,20 +575,7 @@ void QgsMapCanvas::refreshMap()
stopRendering(); // if any...
stopPreviewJobs();

//build the expression context
QgsExpressionContext expressionContext;
expressionContext << QgsExpressionContextUtils::globalScope()
<< QgsExpressionContextUtils::projectScope( QgsProject::instance() )
<< QgsExpressionContextUtils::atlasScope( nullptr )
<< QgsExpressionContextUtils::mapSettingsScope( mSettings );
if ( QgsExpressionContextScopeGenerator *generator = dynamic_cast< QgsExpressionContextScopeGenerator * >( mController ) )
{
expressionContext << generator->createExpressionContextScope();
}
expressionContext << defaultExpressionContextScope()
<< new QgsExpressionContextScope( mExpressionContextScope );

mSettings.setExpressionContext( expressionContext );
mSettings.setExpressionContext( createExpressionContext() );
mSettings.setPathResolver( QgsProject::instance()->pathResolver() );

if ( !mTheme.isEmpty() )
Expand Down
6 changes: 4 additions & 2 deletions src/gui/qgsmapcanvas.h
Expand Up @@ -81,7 +81,7 @@ class QgsMapMouseEvent;
* \brief Map canvas is a class for displaying all GIS data types on a canvas.
*/

class GUI_EXPORT QgsMapCanvas : public QGraphicsView
class GUI_EXPORT QgsMapCanvas : public QGraphicsView, public QgsExpressionContextGenerator
{

#ifdef SIP_RUN
Expand Down Expand Up @@ -658,7 +658,9 @@ class GUI_EXPORT QgsMapCanvas : public QGraphicsView
* \see setExpressionContextScope()
* \since QGIS 3.4
*/
QgsExpressionContextScope *defaultExpressionContextScope() SIP_FACTORY;
QgsExpressionContextScope *defaultExpressionContextScope() const SIP_FACTORY;

QgsExpressionContext createExpressionContext() const override;

/**
* Sets the segmentation tolerance applied when rendering curved geometries
Expand Down

0 comments on commit 2f62585

Please sign in to comment.