void QgsComposerHtml::loadHtml( const bool useCache, const QgsExpressionContext *context ) { if ( !mWebPage ) { return; } QgsExpressionContext scopedContext = createExpressionContext(); const QgsExpressionContext* evalContext = context ? context : &scopedContext; QString loadedHtml; switch ( mContentMode ) { case QgsComposerHtml::Url: { QString currentUrl = mUrl.toString(); //data defined url set? QVariant exprVal; if ( dataDefinedEvaluate( QgsComposerObject::SourceUrl, exprVal, *evalContext ) ) { currentUrl = exprVal.toString().trimmed(); QgsDebugMsg( QString( "exprVal Source Url:%1" ).arg( currentUrl ) ); } if ( currentUrl.isEmpty() ) { return; } if ( !( useCache && currentUrl == mLastFetchedUrl ) ) { loadedHtml = fetchHtml( QUrl( currentUrl ) ); mLastFetchedUrl = currentUrl; } else { loadedHtml = mFetchedHtml; } break; } case QgsComposerHtml::ManualHtml: loadedHtml = mHtml; break; } //evaluate expressions if ( mEvaluateExpressions ) { loadedHtml = QgsExpression::replaceExpressionText( loadedHtml, evalContext, mDistanceArea ); } mLoaded = false; //reset page size. otherwise viewport size increases but never decreases again mWebPage->setViewportSize( QSize( maxFrameWidth() * mHtmlUnitsToMM, 0 ) ); //set html, using the specified url as base if in Url mode or the project file if in manual mode const QUrl baseUrl = mContentMode == QgsComposerHtml::Url ? QUrl( mActualFetchedUrl ) : QUrl::fromLocalFile( QgsProject::instance()->fileInfo().absoluteFilePath() ); mWebPage->mainFrame()->setHtml( loadedHtml, baseUrl ); //set user stylesheet QWebSettings* settings = mWebPage->settings(); if ( mEnableUserStylesheet && ! mUserStylesheet.isEmpty() ) { QByteArray ba; ba.append( mUserStylesheet.toUtf8() ); QUrl cssFileURL = QUrl( "data:text/css;charset=utf-8;base64," + ba.toBase64() ); settings->setUserStyleSheetUrl( cssFileURL ); } else { settings->setUserStyleSheetUrl( QUrl() ); } while ( !mLoaded ) { qApp->processEvents(); } //inject JSON feature if ( !mAtlasFeatureJSON.isEmpty() ) { mWebPage->mainFrame()->evaluateJavaScript( QString( "if ( typeof setFeature === \"function\" ) { setFeature(%1); }" ).arg( mAtlasFeatureJSON ) ); //needs an extra process events here to give javascript a chance to execute qApp->processEvents(); } recalculateFrameSizes(); //trigger a repaint emit contentsChanged(); }
void QgsComposerHtml::loadHtml( const bool useCache, const QgsExpressionContext *context ) { if ( !mWebPage ) { return; } const QgsExpressionContext* evalContext = context; QScopedPointer< QgsExpressionContext > scopedContext; if ( !evalContext ) { scopedContext.reset( createExpressionContext() ); evalContext = scopedContext.data(); } QString loadedHtml; switch ( mContentMode ) { case QgsComposerHtml::Url: { QString currentUrl = mUrl.toString(); //data defined url set? QVariant exprVal; if ( dataDefinedEvaluate( QgsComposerObject::SourceUrl, exprVal, *evalContext ) ) { currentUrl = exprVal.toString().trimmed(); QgsDebugMsg( QString( "exprVal Source Url:%1" ).arg( currentUrl ) ); } if ( currentUrl.isEmpty() ) { return; } if ( !( useCache && currentUrl == mLastFetchedUrl ) ) { loadedHtml = fetchHtml( QUrl( currentUrl ) ); mLastFetchedUrl = currentUrl; } else { loadedHtml = mFetchedHtml; } break; } case QgsComposerHtml::ManualHtml: loadedHtml = mHtml; break; } //evaluate expressions if ( mEvaluateExpressions ) { loadedHtml = QgsExpression::replaceExpressionText( loadedHtml, evalContext, nullptr, mDistanceArea ); } mLoaded = false; //reset page size. otherwise viewport size increases but never decreases again mWebPage->setViewportSize( QSize( maxFrameWidth() * mHtmlUnitsToMM, 0 ) ); //set html, using the specified url as base if in Url mode mWebPage->mainFrame()->setHtml( loadedHtml, mContentMode == QgsComposerHtml::Url ? QUrl( mActualFetchedUrl ) : QUrl() ); //set user stylesheet QWebSettings* settings = mWebPage->settings(); if ( mEnableUserStylesheet && ! mUserStylesheet.isEmpty() ) { QByteArray ba; ba.append( mUserStylesheet.toUtf8() ); QUrl cssFileURL = QUrl( "data:text/css;charset=utf-8;base64," + ba.toBase64() ); settings->setUserStyleSheetUrl( cssFileURL ); } else { settings->setUserStyleSheetUrl( QUrl() ); } while ( !mLoaded ) { qApp->processEvents(); } recalculateFrameSizes(); //trigger a repaint emit contentsChanged(); }
void QgsLayoutItemHtml::loadHtml( const bool useCache, const QgsExpressionContext *context ) { if ( !mWebPage ) { return; } QgsExpressionContext scopedContext = createExpressionContext(); const QgsExpressionContext *evalContext = context ? context : &scopedContext; QString loadedHtml; switch ( mContentMode ) { case QgsLayoutItemHtml::Url: { QString currentUrl = mUrl.toString(); //data defined url set? bool ok = false; currentUrl = mDataDefinedProperties.valueAsString( QgsLayoutObject::SourceUrl, *evalContext, currentUrl, &ok ); if ( ok ) { currentUrl = currentUrl.trimmed(); QgsDebugMsg( QString( "exprVal Source Url:%1" ).arg( currentUrl ) ); } if ( currentUrl.isEmpty() ) { return; } if ( !( useCache && currentUrl == mLastFetchedUrl ) ) { loadedHtml = fetchHtml( QUrl( currentUrl ) ); mLastFetchedUrl = currentUrl; } else { loadedHtml = mFetchedHtml; } break; } case QgsLayoutItemHtml::ManualHtml: loadedHtml = mHtml; break; } //evaluate expressions if ( mEvaluateExpressions ) { loadedHtml = QgsExpression::replaceExpressionText( loadedHtml, evalContext, &mDistanceArea ); } bool loaded = false; QEventLoop loop; connect( mWebPage.get(), &QWebPage::loadFinished, &loop, [&loaded, &loop ] { loaded = true; loop.quit(); } ); connect( mFetcher, &QgsNetworkContentFetcher::finished, &loop, [&loaded, &loop ] { loaded = true; loop.quit(); } ); //reset page size. otherwise viewport size increases but never decreases again mWebPage->setViewportSize( QSize( maxFrameWidth() * mHtmlUnitsToLayoutUnits, 0 ) ); //set html, using the specified url as base if in Url mode or the project file if in manual mode const QUrl baseUrl = mContentMode == QgsLayoutItemHtml::Url ? QUrl( mActualFetchedUrl ) : QUrl::fromLocalFile( mLayout->project()->fileInfo().absoluteFilePath() ); mWebPage->mainFrame()->setHtml( loadedHtml, baseUrl ); //set user stylesheet QWebSettings *settings = mWebPage->settings(); if ( mEnableUserStylesheet && ! mUserStylesheet.isEmpty() ) { QByteArray ba; ba.append( mUserStylesheet.toUtf8() ); QUrl cssFileURL = QUrl( "data:text/css;charset=utf-8;base64," + ba.toBase64() ); settings->setUserStyleSheetUrl( cssFileURL ); } else { settings->setUserStyleSheetUrl( QUrl() ); } if ( !loaded ) loop.exec( QEventLoop::ExcludeUserInputEvents ); //inject JSON feature if ( !mAtlasFeatureJSON.isEmpty() ) { mWebPage->mainFrame()->evaluateJavaScript( QStringLiteral( "if ( typeof setFeature === \"function\" ) { setFeature(%1); }" ).arg( mAtlasFeatureJSON ) ); //needs an extra process events here to give JavaScript a chance to execute qApp->processEvents(); } recalculateFrameSizes(); //trigger a repaint emit contentsChanged(); }
void QgsComposerHtml::loadHtml() { if ( !mWebPage ) { return; } QString loadedHtml; switch ( mContentMode ) { case QgsComposerHtml::Url: { QString currentUrl = mUrl.toString(); //data defined url set? QVariant exprVal; if ( dataDefinedEvaluate( QgsComposerObject::SourceUrl, exprVal ) ) { currentUrl = exprVal.toString().trimmed();; QgsDebugMsg( QString( "exprVal Source Url:%1" ).arg( currentUrl ) ); } if ( currentUrl.isEmpty() ) { return; } if ( currentUrl != mLastFetchedUrl ) { loadedHtml = fetchHtml( QUrl( currentUrl ) ); mLastFetchedUrl = currentUrl; } else { loadedHtml = mFetchedHtml; } break; } case QgsComposerHtml::ManualHtml: loadedHtml = mHtml; break; } //evaluate expressions if ( mEvaluateExpressions ) { loadedHtml = QgsExpression::replaceExpressionText( loadedHtml, mExpressionFeature, mExpressionLayer ); } mLoaded = false; //set html, using the specified url as base if in Url mode mWebPage->mainFrame()->setHtml( loadedHtml, mContentMode == QgsComposerHtml::Url ? QUrl( mActualFetchedUrl ) : QUrl() ); //set user stylesheet QWebSettings* settings = mWebPage->settings(); if ( mEnableUserStylesheet && ! mUserStylesheet.isEmpty() ) { QByteArray ba; ba.append( mUserStylesheet.toUtf8() ); QUrl cssFileURL = QUrl( "data:text/css;charset=utf-8;base64," + ba.toBase64() ); settings->setUserStyleSheetUrl( cssFileURL ); } else { settings->setUserStyleSheetUrl( QUrl() ); } while ( !mLoaded ) { qApp->processEvents(); } if ( frameCount() < 1 ) return; QSize contentsSize = mWebPage->mainFrame()->contentsSize(); //find maximum frame width double maxFrameWidth = 0; QList<QgsComposerFrame*>::const_iterator frameIt = mFrameItems.constBegin(); for ( ; frameIt != mFrameItems.constEnd(); ++frameIt ) { maxFrameWidth = qMax( maxFrameWidth, ( *frameIt )->boundingRect().width() ); } //set content width to match maximum frame width contentsSize.setWidth( maxFrameWidth * mHtmlUnitsToMM ); mWebPage->setViewportSize( contentsSize ); mWebPage->mainFrame()->setScrollBarPolicy( Qt::Horizontal, Qt::ScrollBarAlwaysOff ); mWebPage->mainFrame()->setScrollBarPolicy( Qt::Vertical, Qt::ScrollBarAlwaysOff ); mSize.setWidth( contentsSize.width() / mHtmlUnitsToMM ); mSize.setHeight( contentsSize.height() / mHtmlUnitsToMM ); renderCachedImage(); recalculateFrameSizes(); emit changed(); //trigger a repaint emit contentsChanged(); }