1919QgsComposerMultiFrame::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
2425QgsComposerMultiFrame::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+
127206void 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
136216void QgsComposerMultiFrame::update ()
0 commit comments