QGIS API Documentation  3.8.0-Zanzibar (11aff65)
qgslayoutitemhtml.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgslayoutitemhtml.h
3  ------------------------------------------------------------
4  begin : October 2017
5  copyright : (C) 2017 by Nyall Dawson
6  email : nyall dot dawson at gmail dot com
7  ***************************************************************************
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
15 
16 #ifndef QGSLAYOUTITEMHTML_H
17 #define QGSLAYOUTITEMHTML_H
18 
19 #include "qgis_core.h"
20 #include "qgis_sip.h"
21 #include "qgslayoutmultiframe.h"
22 #include "qgsfeature.h"
23 #include "qgsdistancearea.h"
24 #include <QUrl>
25 
26 class QgsWebPage;
27 class QImage;
28 class QgsVectorLayer;
30 
36 class CORE_EXPORT QgsLayoutItemHtml: public QgsLayoutMultiFrame
37 {
38  Q_OBJECT
39 
40  public:
41 
44  {
45  Url,
46  ManualHtml
47  };
48 
55 
56  ~QgsLayoutItemHtml() override;
57 
58  int type() const override;
59  QIcon icon() const override;
60 
64  static QgsLayoutItemHtml *create( QgsLayout *layout ) SIP_FACTORY;
65 
72  void setContentMode( ContentMode mode ) { mContentMode = mode; }
73 
80  ContentMode contentMode() const { return mContentMode; }
81 
89  void setUrl( const QUrl &url );
90 
97  QUrl url() const { return mUrl; }
98 
108  void setHtml( const QString &html );
109 
116  QString html() const { return mHtml; }
117 
125  bool evaluateExpressions() const { return mEvaluateExpressions; }
126 
134  void setEvaluateExpressions( bool evaluateExpressions );
135 
141  bool useSmartBreaks() const { return mUseSmartBreaks; }
142 
148  void setUseSmartBreaks( bool useSmartBreaks );
149 
160  void setMaxBreakDistance( double distance );
161 
170  double maxBreakDistance() const { return mMaxBreakDistance; }
171 
181  void setUserStylesheet( const QString &stylesheet );
182 
189  QString userStylesheet() const { return mUserStylesheet; }
190 
196  void setUserStylesheetEnabled( bool enabled );
197 
203  bool userStylesheetEnabled() const { return mEnableUserStylesheet; }
204 
205  QString displayName() const override;
206  QSizeF totalSize() const override;
207  void render( QgsLayoutItemRenderContext &context, const QRectF &renderExtent, int frameIndex ) override;
208 
209  //overridden to break frames without dividing lines of text
210  double findNearbyPageBreak( double yPos ) override;
211 
212  public slots:
213 
222  void loadHtml( bool useCache = false, const QgsExpressionContext *context = nullptr );
223 
225  void recalculateFrameSizes() override;
226 
228 
229  protected:
230 
231  bool writePropertiesToElement( QDomElement &elem, QDomDocument &doc, const QgsReadWriteContext &context ) const override;
232  bool readPropertiesFromElement( const QDomElement &itemElem, const QDomDocument &doc, const QgsReadWriteContext &context ) override;
233 
234  private:
235  ContentMode mContentMode = QgsLayoutItemHtml::Url;
236  QUrl mUrl;
237  std::unique_ptr< QgsWebPage > mWebPage;
238  QString mHtml;
239  QString mFetchedHtml;
240  QString mLastFetchedUrl;
241  QString mActualFetchedUrl; //may be different if page was redirected
242  QSizeF mSize; //total size in mm
243  double mHtmlUnitsToLayoutUnits = 1.0;
244  QImage mRenderedPage;
245  bool mEvaluateExpressions = true;
246  bool mUseSmartBreaks = true;
247  double mMaxBreakDistance = 10.0;
248 
249  QgsFeature mExpressionFeature;
250  QgsVectorLayer *mExpressionLayer = nullptr;
251  QgsDistanceArea mDistanceArea;
252 
253  QString mUserStylesheet;
254  bool mEnableUserStylesheet = false;
255 
257  QString mAtlasFeatureJSON;
258 
259  QgsNetworkContentFetcher *mFetcher = nullptr;
260 
261  double htmlUnitsToLayoutUnits(); //calculate scale factor
262 
263  //renders a snapshot of the page to a cached image
264  void renderCachedImage();
265 
266  //fetches html content from a url and returns it as a string
267  QString fetchHtml( const QUrl &url );
268 
270  void setExpressionContext( const QgsFeature &feature, QgsVectorLayer *layer );
271 
273  double maxFrameWidth() const;
274 
275  void refreshExpressionContext();
276 };
277 
279 #ifndef SIP_RUN
280 class JavascriptExecutorLoop : public QEventLoop
281 {
282  Q_OBJECT
283  public slots:
284 
285  void done();
286  void execIfNotDone();
287 
288  private:
289 
290  bool mDone = false;
291 
292 };
293 #endif
294 
296 #endif // QGSLAYOUTITEMHTML_H
The class is used as a container of context for various read/write operations on other objects...
ContentMode
Source modes for the HTML content to render in the item.
virtual QSizeF totalSize() const =0
Returns the total size of the multiframe&#39;s content, in layout units.
virtual QIcon icon() const
Returns the item&#39;s icon.
#define SIP_TRANSFERTHIS
Definition: qgis_sip.h:46
ContentMode contentMode() const
Returns the source mode for item&#39;s HTML content.
virtual bool writePropertiesToElement(QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context) const
Stores multiframe state within an XML DOM element.
QString userStylesheet() const
Returns the user stylesheet CSS rules used while rendering the HTML content.
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
Definition: qgsfeature.h:55
QString html() const
Returns the HTML source displayed in the item if the item is using the QgsLayoutItemHtml::ManualHtml ...
Abstract base class for layout items with the ability to distribute the content to several frames (Qg...
HTTP network content fetcher.
Using this mode item fetches its content via a url.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
#define SIP_FACTORY
Definition: qgis_sip.h:69
Base class for layouts, which can contain items such as maps, labels, scalebars, etc.
Definition: qgslayout.h:49
void setContentMode(ContentMode mode)
Sets the source mode for item&#39;s HTML content.
virtual void recalculateFrameSizes()
Recalculates the portion of the multiframe item which is shown in each of its component frames...
Contains settings and helpers relating to a render of a QgsLayoutItem.
Definition: qgslayoutitem.h:44
virtual bool readPropertiesFromElement(const QDomElement &element, const QDomDocument &document, const QgsReadWriteContext &context)
Sets multiframe state from a DOM element.
bool useSmartBreaks() const
Returns whether html item is using smart breaks.
A general purpose distance and area calculator, capable of performing ellipsoid based calculations...
virtual QString displayName() const
Returns the multiframe display name.
virtual void render(QgsLayoutItemRenderContext &context, const QRectF &renderExtent, int frameIndex)=0
Renders a portion of the multiframe&#39;s content into a render context.
virtual double findNearbyPageBreak(double yPos)
Finds the optimal position to break a frame at.
virtual int type() const =0
Returns unique multiframe type id.
double maxBreakDistance() const
Returns the maximum distance allowed when calculating where to place page breaks in the html...
bool evaluateExpressions() const
Returns whether html item will evaluate QGIS expressions prior to rendering the HTML content...
Represents a vector layer which manages a vector based data sets.
DataDefinedProperty
Data defined properties for different item types.
A layout multiframe subclass for HTML content.
QWebPage subclass which redirects JavaScript errors and console output to the QGIS message log...
Definition: qgswebpage.h:216
bool userStylesheetEnabled() const
Returns whether user stylesheets are enabled for the HTML content.
QUrl url() const
Returns the URL of the content displayed in the item if the item is using the QgsLayoutItemHtml::Url ...
All properties for item.
virtual void refreshDataDefinedProperty(QgsLayoutObject::DataDefinedProperty property=QgsLayoutObject::AllProperties)
Refreshes a data defined property for the multi frame by reevaluating the property&#39;s value and redraw...