void QgsComposerAttributeTableV2::addFrame( QgsComposerFrame *frame, bool recalcFrameSizes ) { mFrameItems.push_back( frame ); connect( frame, SIGNAL( sizeChanged() ), this, SLOT( recalculateFrameSizes() ) ); if ( mComposition ) { mComposition->addComposerTableFrame( this, frame ); } if ( recalcFrameSizes ) { recalculateFrameSizes(); } }
void QgsComposerHtml::addFrame( QgsComposerFrame* frame, bool recalcFrameSizes ) { mFrameItems.push_back( frame ); QObject::connect( frame, SIGNAL( sizeChanged() ), this, SLOT( recalculateFrameSizes() ) ); if ( mComposition ) { mComposition->addComposerHtmlFrame( this, frame ); } if ( recalcFrameSizes ) { recalculateFrameSizes(); } }
void QgsComposerHtml::loadHtml() { if ( !mWebPage || mUrl.isEmpty() ) { return; } mLoaded = false; mWebPage->mainFrame()->load( mUrl ); while ( !mLoaded ) { qApp->processEvents(); } if ( frameCount() < 1 ) return; QSize contentsSize = mWebPage->mainFrame()->contentsSize(); contentsSize.setWidth( mFrameItems.at( 0 )->boundingRect().width() * 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(); }
void QgsComposerTableV2::recalculateTableSize() { recalculateFrameSizes(); //force recalculation of frame rects, so that they are set to the correct //fixed and minimum frame sizes recalculateFrameRects(); }
void QgsComposerTextTableV2::addFrame( QgsComposerFrame* frame, bool recalcFrameSizes ) { mFrameItems.push_back( frame ); connect( frame, SIGNAL( sizeChanged() ), this, SLOT( recalculateFrameSizes() ) ); if ( mComposition ) { //TODO - if QgsComposerTextTableV2 gains a UI, this will need a dedicated add method //added to QgsComposition mComposition->addItem( frame ); } if ( recalcFrameSizes ) { recalculateFrameSizes(); } }
void QgsComposerMultiFrame::setResizeMode( ResizeMode mode ) { if ( mode != mResizeMode ) { mResizeMode = mode; recalculateFrameSizes(); emit changed(); } }
void QgsComposerHtml::addFrame( QgsComposerFrame *frame, bool recalcFrameSizes ) { mFrameItems.push_back( frame ); connect( frame, &QgsComposerItem::sizeChanged, this, &QgsComposerHtml::recalculateFrameSizes ); if ( mComposition ) { mComposition->addComposerHtmlFrame( this, frame ); } if ( recalcFrameSizes ) { recalculateFrameSizes(); } }
void QgsComposerMultiFrame::handleFrameRemoval( QgsComposerItem* item ) { QgsComposerFrame* frame = dynamic_cast<QgsComposerFrame*>( item ); if ( !frame ) { return; } int index = mFrameItems.indexOf( frame ); if ( index == -1 ) { return; } mFrameItems.removeAt( index ); if ( mFrameItems.size() > 0 ) { recalculateFrameSizes(); } }
void QgsComposerMultiFrame::handlePageChange() { if ( mComposition->numPages() < 1 ) { return; } if ( mResizeMode != RepeatOnEveryPage ) { return; } //remove items beginning on non-existing pages for ( int i = mFrameItems.size() - 1; i >= 0; --i ) { QgsComposerFrame* frame = mFrameItems[i]; int page = frame->pos().y() / ( mComposition->paperHeight() + mComposition->spaceBetweenPages() ); if ( page > ( mComposition->numPages() - 1 ) ) { removeFrame( i ); } } //page number of the last item QgsComposerFrame* lastFrame = mFrameItems.last(); int lastItemPage = lastFrame->pos().y() / ( mComposition->paperHeight() + mComposition->spaceBetweenPages() ); for ( int i = lastItemPage + 1; i < mComposition->numPages(); ++i ) { //copy last frame to current page QgsComposerFrame* newFrame = new QgsComposerFrame( mComposition, this, lastFrame->pos().x(), lastFrame->pos().y() + mComposition->paperHeight() + mComposition->spaceBetweenPages(), lastFrame->rect().width(), lastFrame->rect().height() ); addFrame( newFrame, false ); lastFrame = newFrame; } recalculateFrameSizes(); update(); }
void QgsComposerHtml::setUrl( const QUrl& url ) { if ( !mWebPage ) { return; } mLoaded = false; mUrl = url; mWebPage->mainFrame()->load( mUrl ); while ( !mLoaded ) { qApp->processEvents(); } QSize contentsSize = mWebPage->mainFrame()->contentsSize(); mWebPage->setViewportSize( contentsSize ); mSize.setWidth( contentsSize.width() / mHtmlUnitsToMM ); mSize.setHeight( contentsSize.height() / mHtmlUnitsToMM ); recalculateFrameSizes(); emit changed(); }
void QgsComposerHtml::setMaxBreakDistance( double maxBreakDistance ) { mMaxBreakDistance = maxBreakDistance; recalculateFrameSizes(); emit changed(); }
void QgsComposerHtml::setUseSmartBreaks( bool useSmartBreaks ) { mUseSmartBreaks = useSmartBreaks; recalculateFrameSizes(); emit changed(); }
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(); }
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 QgsLayoutItemHtml::setMaxBreakDistance( double maxBreakDistance ) { mMaxBreakDistance = maxBreakDistance; recalculateFrameSizes(); emit changed(); }
void QgsLayoutItemHtml::setUseSmartBreaks( bool useSmartBreaks ) { mUseSmartBreaks = useSmartBreaks; recalculateFrameSizes(); emit changed(); }