Skip to content

Commit 0d38387

Browse files
committed
[composer] Allow user to set maximum distance for page breaking in html items.
1 parent 7bcba1f commit 0d38387

File tree

6 files changed

+123
-12
lines changed

6 files changed

+123
-12
lines changed

python/core/composer/qgscomposerhtml.sip

+25
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,31 @@ class QgsComposerHtml: QgsComposerMultiFrame
3535
*/
3636
void setUseSmartBreaks( bool useSmartBreaks );
3737

38+
/**Sets the maximum distance allowed when calculating where to place page breaks
39+
* in the html. This distance is the maximum amount of empty space allowed
40+
* at the bottom of a frame after calculating the optimum break location. Setting
41+
* a larger value will result in better choice of page break location, but more
42+
* wasted space at the bottom of frames. This setting is only effective if
43+
* useSmartBreaks is true.
44+
* @param maxBreakDistance maximum amount of empty space to leave when calculating
45+
* page break locations
46+
* @note added in 2.3
47+
* @see maxBreakDistance
48+
* @see setUseSmartBreaks
49+
*/
50+
void setMaxBreakDistance( double maxBreakDistance );
51+
52+
/**Returns the maximum distance allowed when calculating where to place page breaks
53+
* in the html. This distance is the maximum amount of empty space allowed
54+
* at the bottom of a frame after calculating the optimum break location. This setting
55+
* is only effective if useSmartBreaks is true.
56+
* @returns maximum amount of empty space to leave when calculating page break locations
57+
* @note added in 2.3
58+
* @see setMaxBreakDistance
59+
* @see useSmartBreaks
60+
*/
61+
double maxBreakDistance() const;
62+
3863
public slots:
3964

4065
/**Reloads the html source from the url and redraws the item.

src/app/composer/qgscomposerhtmlwidget.cpp

+14-2
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ void QgsComposerHtmlWidget::blockSignals( bool block )
6161
mFileToolButton->blockSignals( block );
6262
mResizeModeComboBox->blockSignals( block );
6363
mUseSmartBreaksCheckBox->blockSignals( block );
64+
mMaxDistanceSpinBox->blockSignals( block );
6465
}
6566

6667
void QgsComposerHtmlWidget::on_mUrlLineEdit_editingFinished()
@@ -117,7 +118,7 @@ void QgsComposerHtmlWidget::on_mResizeModeComboBox_currentIndexChanged( int inde
117118
mAddFramePushButton->setEnabled( mHtml->resizeMode() == QgsComposerMultiFrame::UseExistingFrames );
118119
}
119120

120-
void QgsComposerHtmlWidget::on_mUseSmartBreaksCheckBox_stateChanged( int state )
121+
void QgsComposerHtmlWidget::on_mUseSmartBreaksCheckBox_toggled( bool checked )
121122
{
122123
if ( !mHtml )
123124
{
@@ -129,12 +130,22 @@ void QgsComposerHtmlWidget::on_mUseSmartBreaksCheckBox_stateChanged( int state )
129130
{
130131
blockSignals( true );
131132
composition->beginMultiFrameCommand( mHtml, tr( "Use smart breaks changed" ) );
132-
mHtml->setUseSmartBreaks( state );
133+
mHtml->setUseSmartBreaks( checked );
133134
composition->endMultiFrameCommand();
134135
blockSignals( false );
135136
}
136137
}
137138

139+
void QgsComposerHtmlWidget::on_mMaxDistanceSpinBox_valueChanged( double val )
140+
{
141+
if ( !mHtml )
142+
{
143+
return;
144+
}
145+
146+
mHtml->setMaxBreakDistance( val );
147+
}
148+
138149
void QgsComposerHtmlWidget::on_mReloadPushButton_clicked()
139150
{
140151
if ( !mHtml )
@@ -179,6 +190,7 @@ void QgsComposerHtmlWidget::setGuiElementValues()
179190
mUrlLineEdit->setText( mHtml->url().toString() );
180191
mResizeModeComboBox->setCurrentIndex( mResizeModeComboBox->findData( mHtml->resizeMode() ) );
181192
mUseSmartBreaksCheckBox->setChecked( mHtml->useSmartBreaks() );
193+
mMaxDistanceSpinBox->setValue( mHtml->maxBreakDistance() );
182194

183195
mAddFramePushButton->setEnabled( mHtml->resizeMode() == QgsComposerMultiFrame::UseExistingFrames );
184196
blockSignals( false );

src/app/composer/qgscomposerhtmlwidget.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@ class QgsComposerHtmlWidget: public QWidget, private Ui::QgsComposerHtmlWidgetBa
3131
void on_mUrlLineEdit_editingFinished();
3232
void on_mFileToolButton_clicked();
3333
void on_mResizeModeComboBox_currentIndexChanged( int index );
34-
void on_mUseSmartBreaksCheckBox_stateChanged( int state );
34+
void on_mUseSmartBreaksCheckBox_toggled( bool checked );
35+
void on_mMaxDistanceSpinBox_valueChanged( double val );
36+
3537
void on_mReloadPushButton_clicked();
3638
void on_mAddFramePushButton_clicked();
3739

src/core/composer/qgscomposerhtml.cpp

+15-3
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ QgsComposerHtml::QgsComposerHtml( QgsComposition* c, bool createUndoCommands ):
3030
mLoaded( false ),
3131
mHtmlUnitsToMM( 1.0 ),
3232
mRenderedPage( 0 ),
33-
mUseSmartBreaks( true )
33+
mUseSmartBreaks( true ),
34+
mMaxBreakDistance( 10 )
3435
{
3536
mHtmlUnitsToMM = htmlUnitsToMM();
3637
mWebPage = new QWebPage();
@@ -48,7 +49,8 @@ QgsComposerHtml::QgsComposerHtml(): QgsComposerMultiFrame( 0, false ),
4849
mLoaded( false ),
4950
mHtmlUnitsToMM( 1.0 ),
5051
mRenderedPage( 0 ),
51-
mUseSmartBreaks( true )
52+
mUseSmartBreaks( true ),
53+
mMaxBreakDistance( 10 )
5254
{
5355
}
5456

@@ -191,7 +193,7 @@ double QgsComposerHtml::findNearbyPageBreak( double yPos )
191193
return yPos;
192194
}
193195

194-
int maxSearchDistance = 100;
196+
int maxSearchDistance = mMaxBreakDistance * htmlUnitsToMM();
195197

196198
//loop through all lines just before ideal break location, up to max distance
197199
//of maxSearchDistance
@@ -256,13 +258,22 @@ void QgsComposerHtml::setUseSmartBreaks( bool useSmartBreaks )
256258
{
257259
mUseSmartBreaks = useSmartBreaks;
258260
recalculateFrameSizes();
261+
emit changed();
262+
}
263+
264+
void QgsComposerHtml::setMaxBreakDistance( double maxBreakDistance )
265+
{
266+
mMaxBreakDistance = maxBreakDistance;
267+
recalculateFrameSizes();
268+
emit changed();
259269
}
260270

261271
bool QgsComposerHtml::writeXML( QDomElement& elem, QDomDocument & doc, bool ignoreFrames ) const
262272
{
263273
QDomElement htmlElem = doc.createElement( "ComposerHtml" );
264274
htmlElem.setAttribute( "url", mUrl.toString() );
265275
htmlElem.setAttribute( "useSmartBreaks", mUseSmartBreaks ? "true" : "false" );
276+
htmlElem.setAttribute( "maxBreakDistance", QString::number( mMaxBreakDistance ) );
266277

267278
bool state = _writeXML( htmlElem, doc, ignoreFrames );
268279
elem.appendChild( htmlElem );
@@ -280,6 +291,7 @@ bool QgsComposerHtml::readXML( const QDomElement& itemElem, const QDomDocument&
280291
}
281292

282293
mUseSmartBreaks = itemElem.attribute( "useSmartBreaks", "true" ) == "true" ? true : false;
294+
mMaxBreakDistance = itemElem.attribute( "maxBreakDistance", "10" ).toDouble();
283295

284296
//finally load the set url
285297
QString urlString = itemElem.attribute( "url" );

src/core/composer/qgscomposerhtml.h

+26
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,31 @@ class CORE_EXPORT QgsComposerHtml: public QgsComposerMultiFrame
5959
*/
6060
void setUseSmartBreaks( bool useSmartBreaks );
6161

62+
/**Sets the maximum distance allowed when calculating where to place page breaks
63+
* in the html. This distance is the maximum amount of empty space allowed
64+
* at the bottom of a frame after calculating the optimum break location. Setting
65+
* a larger value will result in better choice of page break location, but more
66+
* wasted space at the bottom of frames. This setting is only effective if
67+
* useSmartBreaks is true.
68+
* @param maxBreakDistance maximum amount of empty space to leave when calculating
69+
* page break locations
70+
* @note added in 2.3
71+
* @see maxBreakDistance
72+
* @see setUseSmartBreaks
73+
*/
74+
void setMaxBreakDistance( double maxBreakDistance );
75+
76+
/**Returns the maximum distance allowed when calculating where to place page breaks
77+
* in the html. This distance is the maximum amount of empty space allowed
78+
* at the bottom of a frame after calculating the optimum break location. This setting
79+
* is only effective if useSmartBreaks is true.
80+
* @returns maximum amount of empty space to leave when calculating page break locations
81+
* @note added in 2.3
82+
* @see setMaxBreakDistance
83+
* @see useSmartBreaks
84+
*/
85+
double maxBreakDistance() const { return mMaxBreakDistance; }
86+
6287
public slots:
6388

6489
/**Reloads the html source from the url and redraws the item.
@@ -78,6 +103,7 @@ class CORE_EXPORT QgsComposerHtml: public QgsComposerMultiFrame
78103
double mHtmlUnitsToMM;
79104
QImage* mRenderedPage;
80105
bool mUseSmartBreaks;
106+
double mMaxBreakDistance;
81107

82108
double htmlUnitsToMM(); //calculate scale factor
83109

src/ui/qgscomposerhtmlwidgetbase.ui

+40-6
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<x>0</x>
88
<y>0</y>
99
<width>409</width>
10-
<height>370</height>
10+
<height>383</height>
1111
</rect>
1212
</property>
1313
<property name="windowTitle">
@@ -47,7 +47,7 @@
4747
<x>0</x>
4848
<y>0</y>
4949
<width>407</width>
50-
<height>347</height>
50+
<height>360</height>
5151
</rect>
5252
</property>
5353
<layout class="QVBoxLayout" name="mainLayout">
@@ -107,17 +107,51 @@
107107
<item row="2" column="1">
108108
<widget class="QComboBox" name="mResizeModeComboBox"/>
109109
</item>
110-
<item row="4" column="0" colspan="2">
110+
<item row="3" column="0" colspan="2">
111111
<widget class="QPushButton" name="mAddFramePushButton">
112112
<property name="text">
113113
<string>Add Frame</string>
114114
</property>
115115
</widget>
116116
</item>
117-
<item row="5" column="0" colspan="2">
118-
<widget class="QCheckBox" name="mUseSmartBreaksCheckBox">
117+
</layout>
118+
</widget>
119+
</item>
120+
<item>
121+
<widget class="QgsCollapsibleGroupBoxBasic" name="mUseSmartBreaksCheckBox">
122+
<property name="title">
123+
<string>Use smart page breaks</string>
124+
</property>
125+
<property name="checkable">
126+
<bool>true</bool>
127+
</property>
128+
<property name="checked">
129+
<bool>false</bool>
130+
</property>
131+
<property name="collapsed" stdset="0">
132+
<bool>true</bool>
133+
</property>
134+
<layout class="QFormLayout" name="formLayout_2">
135+
<item row="0" column="0">
136+
<widget class="QLabel" name="mLabelMaxDistance">
119137
<property name="text">
120-
<string>Use smart page breaks</string>
138+
<string>Maximum distance</string>
139+
</property>
140+
</widget>
141+
</item>
142+
<item row="0" column="1">
143+
<widget class="QDoubleSpinBox" name="mMaxDistanceSpinBox">
144+
<property name="suffix">
145+
<string> mm</string>
146+
</property>
147+
<property name="decimals">
148+
<number>1</number>
149+
</property>
150+
<property name="maximum">
151+
<double>1000.000000000000000</double>
152+
</property>
153+
<property name="singleStep">
154+
<double>1.000000000000000</double>
121155
</property>
122156
</widget>
123157
</item>

0 commit comments

Comments
 (0)