22 #include "qgssettings.h" 
   36 #include <QDesktopServices> 
   38 #include <QWebElement> 
   40 #include <QHBoxLayout> 
   48   mMapTipVisible = 
false;
 
   56                             QPoint &pixelPosition,
 
   66   if ( !pMapCanvas->
layers().contains( pLayer ) )
 
   72   QString tipText, lastTipText, tipHtml, bodyStyle, containerStyle,
 
   73           backgroundColor, strokeColor, textColor;
 
   76   mWidget = 
new QWidget( pMapCanvas );
 
   77   mWidget->setContentsMargins( MARGIN_VALUE, MARGIN_VALUE, MARGIN_VALUE, MARGIN_VALUE );
 
   82   mWebView->page()->setLinkDelegationPolicy( QWebPage::DelegateAllLinks );
 
   83   mWebView->setContextMenuPolicy( Qt::NoContextMenu ); 
 
   84   connect( mWebView, &QWebView::linkClicked, 
this, &QgsMapTip::onLinkClicked );
 
   85   connect( mWebView, &QWebView::loadFinished, 
this, [ = ]( 
bool ) { resizeContent(); } );
 
   88   mWebView->page()->settings()->setAttribute( QWebSettings::DeveloperExtrasEnabled, 
true );
 
   89   mWebView->page()->settings()->setAttribute( QWebSettings::JavascriptEnabled, 
true );
 
   90   mWebView->page()->settings()->setAttribute( QWebSettings::LocalStorageEnabled, 
true );
 
   93   mWebView->page()->mainFrame()->setScrollBarPolicy( Qt::Horizontal, Qt::ScrollBarAlwaysOff );
 
   94   mWebView->page()->mainFrame()->setScrollBarPolicy( Qt::Vertical, Qt::ScrollBarAlwaysOff );
 
   96   QHBoxLayout *layout = 
new QHBoxLayout;
 
   97   layout->setContentsMargins( 0, 0, 0, 0 );
 
   98   layout->addWidget( mWebView );
 
  100   mWidget->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
 
  101   mWidget->setLayout( layout );
 
  104   const int MAX_WIDTH = pMapCanvas->geometry().width() / 2;
 
  105   const int MAX_HEIGHT = pMapCanvas->geometry().height() / 2;
 
  106   mWidget->setMaximumSize( MAX_WIDTH, MAX_HEIGHT );
 
  110   mWidget->resize( 0, 0 );
 
  112   backgroundColor = mWidget->palette().base().color().name();
 
  113   strokeColor = mWidget->palette().shadow().color().name();
 
  114   textColor = mWidget->palette().text().color().name();
 
  115   mWidget->setStyleSheet( QString(
 
  117                             "border: 1px solid %1;" 
  118                             "background-color: %2;}" ).arg(
 
  119                             strokeColor, backgroundColor ) );
 
  121   tipText = fetchFeature( pLayer, mapPosition, pMapCanvas );
 
  123   mMapTipVisible = !tipText.isEmpty();
 
  124   if ( !mMapTipVisible )
 
  130   if ( tipText == lastTipText )
 
  136                 "background-color: %1;" 
  139                 "color: %4;" ).arg( backgroundColor ).arg( mFontSize ).arg( mFontFamily, textColor );
 
  141   containerStyle = QString(
 
  142                      "display: inline-block;" 
  148               "<div id='QgsWebViewContainer' style='%2'>%3</div>" 
  150               "</html>" ).arg( bodyStyle, containerStyle, tipText );
 
  154   mWidget->move( pixelPosition.x(),
 
  157   mWebView->setHtml( tipHtml );
 
  158   lastTipText = tipText;
 
  163 void QgsMapTip::resizeContent()
 
  167   QWebElement container = mWebView->page()->mainFrame()->findFirstElement(
 
  168                             QStringLiteral( 
"#QgsWebViewContainer" ) );
 
  169   int width = container.geometry().width() + MARGIN_VALUE * 2;
 
  170   int height = container.geometry().height() + MARGIN_VALUE * 2;
 
  171   mWidget->resize( width, height );
 
  173   mWebView->adjustSize();
 
  179   if ( !mMapTipVisible )
 
  182   mWebView->setHtml( QString() );
 
  186   mMapTipVisible = 
false;
 
  213   QString temporalFilter;
 
  221     temporalFilter = qobject_cast< const QgsVectorLayerTemporalProperties * >( layer->
temporalProperties() )->createFilterString( temporalContext, mapCanvas->
temporalRange() );
 
  232   if ( !temporalFilter.isEmpty() )
 
  235   if ( mapTip.isEmpty() )
 
  237     exp.prepare( &context );
 
  246   std::unique_ptr< QgsFeatureRenderer > renderer;
 
  250     renderer->startRender( renderCtx, vlayer->
fields() );
 
  253     const QString filterExpression = renderer->filter( vlayer->
fields() );
 
  254     if ( ! filterExpression.isEmpty() )
 
  266     context.setFeature( feature );
 
  269     if ( filter && renderer && !renderer->willRenderFeature( feature, renderCtx ) )
 
  274     if ( !mapTip.isEmpty() )
 
  280       tipString = exp.evaluate( &context ).toString();
 
  283     if ( !tipString.isEmpty() || timer.elapsed() >= 1000 )
 
  290     renderer->stopRender( renderCtx );
 
  297   QgsSettings settings;
 
  298   QFont defaultFont = qApp->font();
 
  299   mFontSize = settings.value( QStringLiteral( 
"/qgis/stylesheet/fontPointSize" ), defaultFont.pointSize() ).toInt();
 
  300   mFontFamily = settings.value( QStringLiteral( 
"/qgis/stylesheet/fontFamily" ), defaultFont.family() ).toString();
 
  304 void QgsMapTip::onLinkClicked( 
const QUrl &url )
 
  306   QDesktopServices::openUrl( url );
 
static QgsExpressionContextScope * mapSettingsScope(const QgsMapSettings &mapSettings)
Creates a new scope which contains variables and functions relating to a QgsMapSettings object.
static QList< QgsExpressionContextScope * > globalProjectLayerScopes(const QgsMapLayer *layer)
Creates a list of three scopes: global, layer's project and layer.
static QgsExpressionContextScope * layerScope(const QgsMapLayer *layer)
Creates a new scope which contains variables and functions relating to a QgsMapLayer.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context.
Class for parsing and evaluation of expressions (formerly called "search strings").
static QString replaceExpressionText(const QString &action, const QgsExpressionContext *context, const QgsDistanceArea *distanceArea=nullptr)
This function replaces each expression between [% and %] in the string with the result of its evaluat...
Wrapper for iterator of features from vector data provider or vector layer.
bool nextFeature(QgsFeature &f)
virtual QgsFeatureRenderer * clone() const =0
Create a deep copy of this renderer.
@ Filter
Features may be filtered, i.e. some features may not be rendered (categorized, rule based ....
This class wraps a request for features to a vector layer (or directly its vector data provider).
QgsFeatureRequest & combineFilterExpression(const QString &expression)
Modifies the existing filter expression to add an additional expression filter.
QgsFeatureRequest & setFlags(QgsFeatureRequest::Flags flags)
Sets flags that affect how features will be fetched.
QgsFeatureRequest & setSubsetOfAttributes(const QgsAttributeList &attrs)
Set a subset of attributes that will be fetched.
QgsFeatureRequest & setFilterExpression(const QString &expression)
Set the filter expression.
@ ExactIntersect
Use exact geometry intersection (slower) instead of bounding boxes.
QgsFeatureRequest & setExpressionContext(const QgsExpressionContext &context)
Sets the expression context used to evaluate filter expressions.
QgsFeatureRequest & setFilterRect(const QgsRectangle &rectangle)
Sets the rectangle from which features will be taken.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Map canvas is a class for displaying all GIS data types on a canvas.
QgsExpressionContext createExpressionContext() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
const QgsDateTimeRange & temporalRange() const
Returns map canvas datetime range.
QList< QgsMapLayer * > layers() const
Returns the list of layers shown within the map canvas.
const QgsMapSettings & mapSettings() const
Gets access to properties used for map rendering.
virtual bool isVisibleInTemporalRange(const QgsDateTimeRange &range) const
Returns true if the layer should be visible and rendered for the specified time range.
Base class for all map layer types.
bool isInScaleRange(double scale) const
Tests whether the layer should be visible at the specified scale.
virtual QgsMapLayerTemporalProperties * temporalProperties()
Returns the layer's temporal properties.
double scale() const
Returns the calculated map scale.
QgsPointXY mapToLayerCoordinates(const QgsMapLayer *layer, QgsPointXY point) const
transform point coordinates from output CRS to layer's CRS
void showMapTip(QgsMapLayer *thepLayer, QgsPointXY &mapPosition, QPoint &pixelPosition, QgsMapCanvas *mpMapCanvas)
Show a maptip at a given point on the map canvas.
void clear(QgsMapCanvas *mpMapCanvas=nullptr)
Clear the current maptip if it exists.
QgsMapTip()
Default constructor.
void applyFontSettings()
Apply font family and size to match user settings.
A class to represent a 2D point.
A rectangle specified with double values.
void setYMinimum(double y) SIP_HOLDGIL
Set the minimum y value.
void setXMaximum(double x) SIP_HOLDGIL
Set the maximum x value.
void setXMinimum(double x) SIP_HOLDGIL
Set the minimum x value.
void setYMaximum(double y) SIP_HOLDGIL
Set the maximum y value.
Contains information about the context of a rendering operation.
QgsExpressionContext & expressionContext()
Gets the expression context.
static QgsRenderContext fromMapSettings(const QgsMapSettings &mapSettings)
create initialized QgsRenderContext instance from given QgsMapSettings
void setExpressionContext(const QgsExpressionContext &context)
Sets the expression context.
bool isTemporal() const
Returns true if the object's temporal range is enabled, and the object will be filtered when renderin...
Encapsulates the context in which a QgsVectorLayer's temporal capabilities will be applied.
void setLayer(QgsVectorLayer *layer)
Sets the associated layer.
Represents a vector layer which manages a vector based data sets.
bool isSpatial() const FINAL
Returns true if this is a geometry layer and false in case of NoGeometry (table only) or UnknownGeome...
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const FINAL
Queries the layer for features specified in request.
QgsFields fields() const FINAL
Returns the list of fields of this layer.
QString displayExpression
QgsFeatureRenderer * renderer()
Returns the feature renderer used for rendering the features in the layer in 2D map views.
The QgsWebView class is a collection of stubs to mimic the API of QWebView on systems where the real ...