diff --git a/python/core/composer/qgscomposerhtml.sip b/python/core/composer/qgscomposerhtml.sip index 0b5cd741385..ee55603d16d 100644 --- a/python/core/composer/qgscomposerhtml.sip +++ b/python/core/composer/qgscomposerhtml.sip @@ -35,6 +35,31 @@ class QgsComposerHtml: QgsComposerMultiFrame */ void setUseSmartBreaks( bool useSmartBreaks ); + /**Sets the maximum distance allowed when calculating where to place page breaks + * in the html. This distance is the maximum amount of empty space allowed + * at the bottom of a frame after calculating the optimum break location. Setting + * a larger value will result in better choice of page break location, but more + * wasted space at the bottom of frames. This setting is only effective if + * useSmartBreaks is true. + * @param maxBreakDistance maximum amount of empty space to leave when calculating + * page break locations + * @note added in 2.3 + * @see maxBreakDistance + * @see setUseSmartBreaks + */ + void setMaxBreakDistance( double maxBreakDistance ); + + /**Returns the maximum distance allowed when calculating where to place page breaks + * in the html. This distance is the maximum amount of empty space allowed + * at the bottom of a frame after calculating the optimum break location. This setting + * is only effective if useSmartBreaks is true. + * @returns maximum amount of empty space to leave when calculating page break locations + * @note added in 2.3 + * @see setMaxBreakDistance + * @see useSmartBreaks + */ + double maxBreakDistance() const; + public slots: /**Reloads the html source from the url and redraws the item. diff --git a/src/app/composer/qgscomposerhtmlwidget.cpp b/src/app/composer/qgscomposerhtmlwidget.cpp index 7caef5ee73e..41ebe5bf2d4 100644 --- a/src/app/composer/qgscomposerhtmlwidget.cpp +++ b/src/app/composer/qgscomposerhtmlwidget.cpp @@ -61,6 +61,7 @@ void QgsComposerHtmlWidget::blockSignals( bool block ) mFileToolButton->blockSignals( block ); mResizeModeComboBox->blockSignals( block ); mUseSmartBreaksCheckBox->blockSignals( block ); + mMaxDistanceSpinBox->blockSignals( block ); } void QgsComposerHtmlWidget::on_mUrlLineEdit_editingFinished() @@ -117,7 +118,7 @@ void QgsComposerHtmlWidget::on_mResizeModeComboBox_currentIndexChanged( int inde mAddFramePushButton->setEnabled( mHtml->resizeMode() == QgsComposerMultiFrame::UseExistingFrames ); } -void QgsComposerHtmlWidget::on_mUseSmartBreaksCheckBox_stateChanged( int state ) +void QgsComposerHtmlWidget::on_mUseSmartBreaksCheckBox_toggled( bool checked ) { if ( !mHtml ) { @@ -129,12 +130,22 @@ void QgsComposerHtmlWidget::on_mUseSmartBreaksCheckBox_stateChanged( int state ) { blockSignals( true ); composition->beginMultiFrameCommand( mHtml, tr( "Use smart breaks changed" ) ); - mHtml->setUseSmartBreaks( state ); + mHtml->setUseSmartBreaks( checked ); composition->endMultiFrameCommand(); blockSignals( false ); } } +void QgsComposerHtmlWidget::on_mMaxDistanceSpinBox_valueChanged( double val ) +{ + if ( !mHtml ) + { + return; + } + + mHtml->setMaxBreakDistance( val ); +} + void QgsComposerHtmlWidget::on_mReloadPushButton_clicked() { if ( !mHtml ) @@ -179,6 +190,7 @@ void QgsComposerHtmlWidget::setGuiElementValues() mUrlLineEdit->setText( mHtml->url().toString() ); mResizeModeComboBox->setCurrentIndex( mResizeModeComboBox->findData( mHtml->resizeMode() ) ); mUseSmartBreaksCheckBox->setChecked( mHtml->useSmartBreaks() ); + mMaxDistanceSpinBox->setValue( mHtml->maxBreakDistance() ); mAddFramePushButton->setEnabled( mHtml->resizeMode() == QgsComposerMultiFrame::UseExistingFrames ); blockSignals( false ); diff --git a/src/app/composer/qgscomposerhtmlwidget.h b/src/app/composer/qgscomposerhtmlwidget.h index f2b1e36fe44..3d8d2f97878 100644 --- a/src/app/composer/qgscomposerhtmlwidget.h +++ b/src/app/composer/qgscomposerhtmlwidget.h @@ -31,7 +31,9 @@ class QgsComposerHtmlWidget: public QWidget, private Ui::QgsComposerHtmlWidgetBa void on_mUrlLineEdit_editingFinished(); void on_mFileToolButton_clicked(); void on_mResizeModeComboBox_currentIndexChanged( int index ); - void on_mUseSmartBreaksCheckBox_stateChanged( int state ); + void on_mUseSmartBreaksCheckBox_toggled( bool checked ); + void on_mMaxDistanceSpinBox_valueChanged( double val ); + void on_mReloadPushButton_clicked(); void on_mAddFramePushButton_clicked(); diff --git a/src/core/composer/qgscomposerhtml.cpp b/src/core/composer/qgscomposerhtml.cpp index 0087668ea60..13b24e14e8d 100644 --- a/src/core/composer/qgscomposerhtml.cpp +++ b/src/core/composer/qgscomposerhtml.cpp @@ -30,7 +30,8 @@ QgsComposerHtml::QgsComposerHtml( QgsComposition* c, bool createUndoCommands ): mLoaded( false ), mHtmlUnitsToMM( 1.0 ), mRenderedPage( 0 ), - mUseSmartBreaks( true ) + mUseSmartBreaks( true ), + mMaxBreakDistance( 10 ) { mHtmlUnitsToMM = htmlUnitsToMM(); mWebPage = new QWebPage(); @@ -48,7 +49,8 @@ QgsComposerHtml::QgsComposerHtml(): QgsComposerMultiFrame( 0, false ), mLoaded( false ), mHtmlUnitsToMM( 1.0 ), mRenderedPage( 0 ), - mUseSmartBreaks( true ) + mUseSmartBreaks( true ), + mMaxBreakDistance( 10 ) { } @@ -191,7 +193,7 @@ double QgsComposerHtml::findNearbyPageBreak( double yPos ) return yPos; } - int maxSearchDistance = 100; + int maxSearchDistance = mMaxBreakDistance * htmlUnitsToMM(); //loop through all lines just before ideal break location, up to max distance //of maxSearchDistance @@ -256,6 +258,14 @@ void QgsComposerHtml::setUseSmartBreaks( bool useSmartBreaks ) { mUseSmartBreaks = useSmartBreaks; recalculateFrameSizes(); + emit changed(); +} + +void QgsComposerHtml::setMaxBreakDistance( double maxBreakDistance ) +{ + mMaxBreakDistance = maxBreakDistance; + recalculateFrameSizes(); + emit changed(); } bool QgsComposerHtml::writeXML( QDomElement& elem, QDomDocument & doc, bool ignoreFrames ) const @@ -263,6 +273,7 @@ bool QgsComposerHtml::writeXML( QDomElement& elem, QDomDocument & doc, bool igno QDomElement htmlElem = doc.createElement( "ComposerHtml" ); htmlElem.setAttribute( "url", mUrl.toString() ); htmlElem.setAttribute( "useSmartBreaks", mUseSmartBreaks ? "true" : "false" ); + htmlElem.setAttribute( "maxBreakDistance", QString::number( mMaxBreakDistance ) ); bool state = _writeXML( htmlElem, doc, ignoreFrames ); elem.appendChild( htmlElem ); @@ -280,6 +291,7 @@ bool QgsComposerHtml::readXML( const QDomElement& itemElem, const QDomDocument& } mUseSmartBreaks = itemElem.attribute( "useSmartBreaks", "true" ) == "true" ? true : false; + mMaxBreakDistance = itemElem.attribute( "maxBreakDistance", "10" ).toDouble(); //finally load the set url QString urlString = itemElem.attribute( "url" ); diff --git a/src/core/composer/qgscomposerhtml.h b/src/core/composer/qgscomposerhtml.h index 2c29cfeca82..ae60dcabdd9 100644 --- a/src/core/composer/qgscomposerhtml.h +++ b/src/core/composer/qgscomposerhtml.h @@ -59,6 +59,31 @@ class CORE_EXPORT QgsComposerHtml: public QgsComposerMultiFrame */ void setUseSmartBreaks( bool useSmartBreaks ); + /**Sets the maximum distance allowed when calculating where to place page breaks + * in the html. This distance is the maximum amount of empty space allowed + * at the bottom of a frame after calculating the optimum break location. Setting + * a larger value will result in better choice of page break location, but more + * wasted space at the bottom of frames. This setting is only effective if + * useSmartBreaks is true. + * @param maxBreakDistance maximum amount of empty space to leave when calculating + * page break locations + * @note added in 2.3 + * @see maxBreakDistance + * @see setUseSmartBreaks + */ + void setMaxBreakDistance( double maxBreakDistance ); + + /**Returns the maximum distance allowed when calculating where to place page breaks + * in the html. This distance is the maximum amount of empty space allowed + * at the bottom of a frame after calculating the optimum break location. This setting + * is only effective if useSmartBreaks is true. + * @returns maximum amount of empty space to leave when calculating page break locations + * @note added in 2.3 + * @see setMaxBreakDistance + * @see useSmartBreaks + */ + double maxBreakDistance() const { return mMaxBreakDistance; } + public slots: /**Reloads the html source from the url and redraws the item. @@ -78,6 +103,7 @@ class CORE_EXPORT QgsComposerHtml: public QgsComposerMultiFrame double mHtmlUnitsToMM; QImage* mRenderedPage; bool mUseSmartBreaks; + double mMaxBreakDistance; double htmlUnitsToMM(); //calculate scale factor diff --git a/src/ui/qgscomposerhtmlwidgetbase.ui b/src/ui/qgscomposerhtmlwidgetbase.ui index ea0e69bdda3..61c7afe5a1f 100644 --- a/src/ui/qgscomposerhtmlwidgetbase.ui +++ b/src/ui/qgscomposerhtmlwidgetbase.ui @@ -7,7 +7,7 @@ 0 0 409 - 370 + 383 @@ -47,7 +47,7 @@ 0 0 407 - 347 + 360 @@ -107,17 +107,51 @@ - + Add Frame - - + + + + + + + Use smart page breaks + + + true + + + false + + + true + + + + - Use smart page breaks + Maximum distance + + + + + + + mm + + + 1 + + + 1000.000000000000000 + + + 1.000000000000000