Skip to content

Commit 0980056

Browse files
committed
Merge branch 'multiframe_options'
2 parents bcbdd7c + cb3a08e commit 0980056

File tree

6 files changed

+106
-16
lines changed

6 files changed

+106
-16
lines changed

python/core/qgscomposermultiframe.sip

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ public:
99
enum ResizeMode
1010
{
1111
UseExistingFrames = 0,
12-
ExtendToNextPage //duplicates last frame to next page to fit the total size
12+
ExtendToNextPage, //uses the next page(s) until the content has been printed
13+
RepeatOnEveryPage, //repeats the same frame on every page
14+
RepeatUntilFinished //duplicates last frame to next page to fit the total size
1315
};
1416

1517
QgsComposerMultiFrame( QgsComposition* c, bool createUndoCommands );
@@ -41,4 +43,4 @@ public:
4143
void deleteFrames();
4244

4345
int nFrames() const;
44-
};
46+
};

src/app/composer/qgscomposerhtmlwidget.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ QgsComposerHtmlWidget::QgsComposerHtmlWidget( QgsComposerHtml* html, QgsComposer
1313
blockSignals( true );
1414
mResizeModeComboBox->addItem( tr( "Use existing frames" ), QgsComposerMultiFrame::UseExistingFrames );
1515
mResizeModeComboBox->addItem( tr( "Extend to next page" ), QgsComposerMultiFrame::ExtendToNextPage );
16+
mResizeModeComboBox->addItem( tr( "Repeat on every page" ), QgsComposerMultiFrame::RepeatOnEveryPage );
17+
mResizeModeComboBox->addItem( tr( "Repeat until finished" ), QgsComposerMultiFrame::RepeatUntilFinished );
1618
blockSignals( false );
1719
setGuiElementValues();
1820

src/core/composer/qgscomposermultiframe.cpp

Lines changed: 93 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
QgsComposerMultiFrame::QgsComposerMultiFrame( QgsComposition* c, bool createUndoCommands ): mComposition( c ), mResizeMode( UseExistingFrames ), mCreateUndoCommands( createUndoCommands )
2020
{
2121
mComposition->addMultiFrame( this );
22+
connect( mComposition, SIGNAL( nPagesChanged() ), this, SLOT( handlePageChange() ) );
2223
}
2324

2425
QgsComposerMultiFrame::QgsComposerMultiFrame(): mComposition( 0 ), mResizeMode( UseExistingFrames )
@@ -61,9 +62,9 @@ void QgsComposerMultiFrame::recalculateFrameSizes()
6162

6263
for ( int i = 0; i < mFrameItems.size(); ++i )
6364
{
64-
if ( currentY >= totalHeight )
65+
if ( mResizeMode != RepeatOnEveryPage && currentY >= totalHeight )
6566
{
66-
if ( mResizeMode == ExtendToNextPage ) //remove unneeded frames in extent mode
67+
if ( mResizeMode == RepeatUntilFinished || mResizeMode == ExtendToNextPage ) //remove unneeded frames in extent mode
6768
{
6869
for ( int j = mFrameItems.size(); j > i; --j )
6970
{
@@ -75,30 +76,67 @@ void QgsComposerMultiFrame::recalculateFrameSizes()
7576

7677
currentItem = mFrameItems.value( i );
7778
currentHeight = currentItem->rect().height();
78-
currentItem->setContentSection( QRectF( 0, currentY, currentItem->rect().width(), currentHeight ) );
79+
if ( mResizeMode == RepeatOnEveryPage )
80+
{
81+
currentItem->setContentSection( QRectF( 0, 0, currentItem->rect().width(), currentHeight ) );
82+
}
83+
else
84+
{
85+
currentItem->setContentSection( QRectF( 0, currentY, currentItem->rect().width(), currentHeight ) );
86+
}
7987
currentItem->update();
8088
currentY += currentHeight;
8189
}
8290

8391
//at end of frames but there is still content left. Add other pages if ResizeMode ==
84-
if ( mResizeMode == ExtendToNextPage )
92+
if ( mResizeMode != UseExistingFrames )
8593
{
86-
while ( currentY < totalHeight )
94+
while (( mResizeMode == RepeatOnEveryPage ) || currentY < totalHeight )
8795
{
8896
//find out on which page the lower left point of the last frame is
8997
int page = currentItem->transform().dy() / ( mComposition->paperHeight() + mComposition->spaceBetweenPages() );
98+
if ( mResizeMode == RepeatOnEveryPage )
99+
{
100+
if ( page > mComposition->numPages() - 2 )
101+
{
102+
break;
103+
}
104+
}
105+
else
106+
{
107+
if ( mComposition->numPages() < ( page + 2 ) )
108+
{
109+
mComposition->setNumPages( page + 2 );
110+
}
111+
}
90112

91-
//add new pages if necessary
92-
if ( mComposition->numPages() < ( page + 2 ) )
113+
double frameHeight = 0;
114+
if ( mResizeMode == RepeatUntilFinished || mResizeMode == RepeatOnEveryPage )
93115
{
94-
mComposition->setNumPages( page + 2 );
116+
frameHeight = currentItem->rect().height();
117+
}
118+
else //mResizeMode == ExtendToNextPage
119+
{
120+
frameHeight = ( currentY + mComposition->paperHeight() ) > totalHeight ? totalHeight - currentY : mComposition->paperHeight();
95121
}
96122

97-
//copy last frame
98-
QgsComposerFrame* newFrame = new QgsComposerFrame( mComposition, this, currentItem->transform().dx(), currentItem->transform().dy() + mComposition->paperHeight() + mComposition->spaceBetweenPages(),
99-
currentItem->rect().width(), currentItem->rect().height() );
100-
newFrame->setContentSection( QRectF( 0, currentY, newFrame->rect().width(), newFrame->rect().height() ) );
101-
currentY += newFrame->rect().height();
123+
double newFrameY = ( page + 1 ) * ( mComposition->paperHeight() + mComposition->spaceBetweenPages() );
124+
if ( mResizeMode == RepeatUntilFinished || mResizeMode == RepeatOnEveryPage )
125+
{
126+
newFrameY += currentItem->transform().dy() - page * ( mComposition->paperHeight() + mComposition->spaceBetweenPages() );
127+
}
128+
QgsComposerFrame* newFrame = new QgsComposerFrame( mComposition, this, currentItem->transform().dx(),
129+
newFrameY,
130+
currentItem->rect().width(), frameHeight );
131+
if ( mResizeMode == RepeatOnEveryPage )
132+
{
133+
newFrame->setContentSection( QRectF( 0, 0, newFrame->rect().width(), newFrame->rect().height() ) );
134+
}
135+
else
136+
{
137+
newFrame->setContentSection( QRectF( 0, currentY, newFrame->rect().width(), newFrame->rect().height() ) );
138+
}
139+
currentY += frameHeight;
102140
currentItem = newFrame;
103141
addFrame( newFrame, false );
104142
}
@@ -124,13 +162,55 @@ void QgsComposerMultiFrame::handleFrameRemoval( QgsComposerItem* item )
124162
}
125163
}
126164

165+
void QgsComposerMultiFrame::handlePageChange()
166+
{
167+
if ( mComposition->numPages() < 1 )
168+
{
169+
return;
170+
}
171+
172+
if ( mResizeMode != RepeatOnEveryPage )
173+
{
174+
return;
175+
}
176+
177+
//remove items beginning on non-existing pages
178+
for ( int i = mFrameItems.size() - 1; i >= 0; --i )
179+
{
180+
QgsComposerFrame* frame = mFrameItems[i];
181+
int page = frame->transform().dy() / ( mComposition->paperHeight() + mComposition->spaceBetweenPages() );
182+
if ( page > ( mComposition->numPages() - 1 ) )
183+
{
184+
removeFrame( i );
185+
}
186+
}
187+
188+
//page number of the last item
189+
QgsComposerFrame* lastFrame = mFrameItems.last();
190+
int lastItemPage = lastFrame->transform().dy() / ( mComposition->paperHeight() + mComposition->spaceBetweenPages() );
191+
192+
for ( int i = lastItemPage + 1; i < mComposition->numPages(); ++i )
193+
{
194+
//copy last frame to current page
195+
QgsComposerFrame* newFrame = new QgsComposerFrame( mComposition, this, lastFrame->transform().dx(),
196+
lastFrame->transform().dy() + mComposition->paperHeight() + mComposition->spaceBetweenPages(),
197+
lastFrame->rect().width(), lastFrame->rect().height() );
198+
addFrame( newFrame, false );
199+
lastFrame = newFrame;
200+
}
201+
202+
recalculateFrameSizes();
203+
update();
204+
}
205+
127206
void QgsComposerMultiFrame::removeFrame( int i )
128207
{
129208
QgsComposerFrame* frameItem = mFrameItems[i];
130209
if ( mComposition )
131210
{
132211
mComposition->removeComposerItem( frameItem );
133212
}
213+
mFrameItems.removeAt( i );
134214
}
135215

136216
void QgsComposerMultiFrame::update()

src/core/composer/qgscomposermultiframe.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ class CORE_EXPORT QgsComposerMultiFrame: public QObject
3636
enum ResizeMode
3737
{
3838
UseExistingFrames = 0,
39-
ExtendToNextPage //duplicates last frame to next page to fit the total size
39+
ExtendToNextPage, //uses the next page(s) until the content has been printed
40+
RepeatOnEveryPage, //repeats the same frame on every page
41+
RepeatUntilFinished //duplicates last frame to next page to fit the total size
4042
};
4143

4244
QgsComposerMultiFrame( QgsComposition* c, bool createUndoCommands );
@@ -80,6 +82,8 @@ class CORE_EXPORT QgsComposerMultiFrame: public QObject
8082
void recalculateFrameSizes();
8183
/**Called before a frame is going to be removed (update frame list)*/
8284
void handleFrameRemoval( QgsComposerItem* item );
85+
/**Adapts to changed number of pages if resize type is RepeatOnEveryPage*/
86+
void handlePageChange();
8387

8488
private:
8589
QgsComposerMultiFrame(); //forbidden

src/core/composer/qgscomposition.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ void QgsComposition::setNumPages( int pages )
118118
mPages.removeLast();
119119
}
120120
}
121+
emit nPagesChanged();
121122
}
122123

123124
int QgsComposition::numPages() const

src/core/composer/qgscomposition.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,7 @@ class CORE_EXPORT QgsComposition: public QGraphicsScene
311311

312312
signals:
313313
void paperSizeChanged();
314+
void nPagesChanged();
314315

315316
/**Is emitted when selected item changed. If 0, no item is selected*/
316317
void selectedItemChanged( QgsComposerItem* selected );

0 commit comments

Comments
 (0)