QGIS API Documentation  3.8.0-Zanzibar (11aff65)
qgshtmlwidgetwrapper.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgshtmlwidgetwrapper.h
3 
4  ---------------------
5  begin : 23.03.2019
6  copyright : (C) 2019 by Alessandro Pasotti
7  email : elpaso at itopen dot it
8  ***************************************************************************
9  * *
10  * This program is free software; you can redistribute it and/or modify *
11  * it under the terms of the GNU General Public License as published by *
12  * the Free Software Foundation; either version 2 of the License, or *
13  * (at your option) any later version. *
14  * *
15  ***************************************************************************/
16 
17 #include "qgshtmlwidgetwrapper.h"
18 #include "qgsmessagelog.h"
20 #include "qgsapplication.h"
21 #include "qgswebframe.h"
22 
23 
24 QgsHtmlWidgetWrapper::QgsHtmlWidgetWrapper( QgsVectorLayer *layer, QWidget *editor, QWidget *parent )
25  : QgsWidgetWrapper( layer, editor, parent )
26 {
27  connect( this, &QgsWidgetWrapper::contextChanged, this, &QgsHtmlWidgetWrapper::setHtmlContext );
28 }
29 
31 {
32  return true;
33 }
34 
35 QWidget *QgsHtmlWidgetWrapper::createWidget( QWidget *parent )
36 {
37  return new QgsWebView( parent );
38 }
39 
40 void QgsHtmlWidgetWrapper::initWidget( QWidget *editor )
41 {
42  mWidget = qobject_cast<QgsWebView *>( editor );
43 
44  if ( !mWidget )
45  return;
46 
47  mWidget->setHtml( mHtmlCode );
48 #ifdef WITH_QTWEBKIT
49  const int horizontalDpi = qApp->desktop()->screen()->logicalDpiX();
50  mWidget->setZoomFactor( horizontalDpi / 96.0 );
51 
52  auto page = mWidget->page();
53  connect( page, &QWebPage::contentsChanged, this, [ = ]
54  {
55  auto docHeight { page->mainFrame()->contentsSize().height() };
56  mWidget->setFixedHeight( docHeight );
57  }, Qt::ConnectionType::UniqueConnection );
58 #endif
59 
60 }
61 
62 
64 {
65  if ( !mWidget )
66  return;
67 
68  initWidget( mWidget );
69 }
70 
71 void QgsHtmlWidgetWrapper::setHtmlCode( const QString &htmlCode )
72 {
73  mHtmlCode = htmlCode;
74 }
75 
76 void QgsHtmlWidgetWrapper::setHtmlContext( )
77 {
78  if ( !mWidget )
79  return;
80 
81  QgsAttributeEditorContext attributecontext = context();
82  QgsExpressionContext expressionContext = layer()->createExpressionContext();
83  expressionContext << QgsExpressionContextUtils::formScope( mFeature, attributecontext.attributeFormModeString() );
84  expressionContext.setFeature( mFeature );
85 
86  HtmlExpression *htmlExpression = new HtmlExpression();
87  htmlExpression->setExpressionContext( expressionContext );
88  mWidget->page()->settings()->setAttribute( QWebSettings::DeveloperExtrasEnabled, true );
89  auto frame = mWidget->page()->mainFrame();
90  connect( frame, &QWebFrame::javaScriptWindowObjectCleared, frame, [ = ]
91  {
92  frame->addToJavaScriptWindowObject( QStringLiteral( "expression" ), htmlExpression );
93  } );
94 
95  mWidget->setHtml( mHtmlCode );
96 }
97 
99 {
100  if ( !mWidget )
101  return;
102 
103  mFeature = feature;
104  setHtmlContext();
105 }
106 
108 void HtmlExpression::setExpressionContext( const QgsExpressionContext &context )
109 {
110  mExpressionContext = context;
111 }
112 
113 QString HtmlExpression::evaluate( const QString &expression ) const
114 {
115  QgsExpression exp = QgsExpression( expression );
116  exp.prepare( &mExpressionContext );
117  return exp.evaluate( &mExpressionContext ).toString();
118 }
Class for parsing and evaluation of expressions (formerly called "search strings").
void contextChanged()
Signal when QgsAttributeEditorContext mContext changed.
void setHtmlCode(const QString &htmlCode)
Sets the HTML code to htmlCode.
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context.
This class contains context information for attribute editor widgets.
QVariant evaluate()
Evaluate the feature and return the result.
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
Definition: qgsfeature.h:55
static QgsExpressionContextScope * formScope(const QgsFeature &formFeature=QgsFeature(), const QString &formMode=QString())
Creates a new scope which contains functions and variables from the current attribute form/table feat...
bool valid() const override
Returns true if the widget has been properly initialized.
void setFeature(const QgsFeature &feature) override
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
void initWidget(QWidget *editor) override
This method should initialize the editor widget with runtime data.
The QgsWebView class is a collection of stubs to mimic the API of QWebView on systems where the real ...
Definition: qgswebview.h:65
QgsExpressionContext createExpressionContext() const FINAL
This method needs to be reimplemented in all classes which implement this interface and return an exp...
QgsHtmlWidgetWrapper(QgsVectorLayer *layer, QWidget *editor, QWidget *parent)
Create a html widget wrapper.
const QgsAttributeEditorContext & context() const
Returns information about the context in which this widget is shown.
QWidget * createWidget(QWidget *parent) override
This method should create a new widget with the provided parent.
bool prepare(const QgsExpressionContext *context)
Gets the expression ready for evaluation - find out column indexes.
QString attributeFormModeString() const
Returns given attributeFormMode as string.
void reinitWidget()
Clears the content and makes new initialization.
QgsVectorLayer * layer() const
Returns the vector layer associated with the widget.
Represents a vector layer which manages a vector based data sets.
Manages an editor widget Widget and wrapper share the same parent.