2020#include " qgsnetworkaccessmanager.h"
2121#include " qgsmessagelog.h"
2222#include " qgsexpression.h"
23+ #include " qgslogger.h"
2324
2425#include < QCoreApplication>
2526#include < QPainter>
@@ -47,9 +48,11 @@ QgsComposerHtml::QgsComposerHtml( QgsComposition* c, bool createUndoCommands ):
4748 if ( mComposition )
4849 {
4950 QObject::connect ( mComposition , SIGNAL ( itemRemoved ( QgsComposerItem* ) ), this , SLOT ( handleFrameRemoval ( QgsComposerItem* ) ) );
50- connect ( mComposition , SIGNAL ( refreshItemsTriggered () ), this , SLOT ( loadHtml () ) );
5151 }
5252
53+ // data defined strings
54+ mDataDefinedNames .insert ( QgsComposerObject::SourceUrl, QString ( " dataDefinedSourceUrl" ) );
55+
5356 if ( mComposition && mComposition ->atlasMode () == QgsComposition::PreviewAtlas )
5457 {
5558 // a html item added while atlas preview is enabled needs to have the expression context set,
@@ -152,12 +155,13 @@ QString QgsComposerHtml::fetchHtml( QUrl url )
152155
153156 QByteArray array = reply->readAll ();
154157 reply->deleteLater ();
155- return QString ( array );
158+ mFetchedHtml = QString ( array );
159+ return mFetchedHtml ;
156160}
157161
158162void QgsComposerHtml::loadHtml ()
159163{
160- if ( !mWebPage || ( mContentMode == QgsComposerHtml::Url && mUrl . isEmpty () ) )
164+ if ( !mWebPage )
161165 {
162166 return ;
163167 }
@@ -167,7 +171,29 @@ void QgsComposerHtml::loadHtml()
167171 {
168172 case QgsComposerHtml::Url:
169173 {
170- loadedHtml = fetchHtml ( mUrl );
174+
175+ QString currentUrl = mUrl .toString ();
176+
177+ // data defined url set?
178+ QVariant exprVal;
179+ if ( dataDefinedEvaluate ( QgsComposerObject::SourceUrl, exprVal ) )
180+ {
181+ currentUrl = exprVal.toString ().trimmed ();;
182+ QgsDebugMsg ( QString ( " exprVal Source Url:%1" ).arg ( currentUrl ) );
183+ }
184+ if ( currentUrl.isEmpty () )
185+ {
186+ return ;
187+ }
188+ if ( currentUrl != mLastFetchedUrl )
189+ {
190+ loadedHtml = fetchHtml ( QUrl ( currentUrl ) );
191+ mLastFetchedUrl = currentUrl;
192+ }
193+ else
194+ {
195+ loadedHtml = mFetchedHtml ;
196+ }
171197 break ;
172198 }
173199 case QgsComposerHtml::ManualHtml:
@@ -183,7 +209,7 @@ void QgsComposerHtml::loadHtml()
183209
184210 mLoaded = false ;
185211 // set html, using the specified url as base if in Url mode
186- mWebPage ->mainFrame ()->setHtml ( loadedHtml, mContentMode == QgsComposerHtml::Url ? QUrl ( mUrl ) : QUrl () );
212+ mWebPage ->mainFrame ()->setHtml ( loadedHtml, mContentMode == QgsComposerHtml::Url ? QUrl ( mLastFetchedUrl ) : QUrl () );
187213
188214 while ( !mLoaded )
189215 {
@@ -214,6 +240,8 @@ void QgsComposerHtml::loadHtml()
214240
215241 recalculateFrameSizes ();
216242 emit changed ();
243+ // trigger a repaint
244+ emit contentsChanged ();
217245}
218246
219247void QgsComposerHtml::frameLoaded ( bool ok )
@@ -455,3 +483,13 @@ void QgsComposerHtml::refreshExpressionContext()
455483 setExpressionContext ( feature, vl );
456484 loadHtml ();
457485}
486+
487+ void QgsComposerHtml::refreshDataDefinedProperty ( QgsComposerObject::DataDefinedProperty property )
488+ {
489+ // updates data defined properties and redraws item to match
490+ if ( property == QgsComposerObject::SourceUrl || property == QgsComposerObject::AllProperties )
491+ {
492+ loadHtml ();
493+ }
494+ QgsComposerObject::refreshDataDefinedProperty ( property );
495+ }
0 commit comments