Skip to content

Commit fb3ff6d

Browse files
committed
[layouts] Fix a crash when using multiframe items when no pages exist
1 parent afde31b commit fb3ff6d

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

src/core/layout/qgslayoutmultiframe.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ void QgsLayoutMultiFrame::recalculateFrameSizes()
148148
}
149149

150150
//at end of frames but there is still content left. Add other pages if ResizeMode ==
151-
if ( currentItem && mResizeMode != UseExistingFrames )
151+
if ( mLayout->pageCollection()->pageCount() > 0 && currentItem && mResizeMode != UseExistingFrames )
152152
{
153153
while ( ( mResizeMode == RepeatOnEveryPage ) || currentY < totalHeight )
154154
{

tests/src/core/testqgslayoutmultiframe.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ class TestQgsLayoutMultiFrame : public QObject
5050
void registry();
5151
void deleteFrame();
5252
void writeReadXml();
53+
void noPageNoCrash();
5354

5455
private:
5556
QgsLayout *mLayout = nullptr;
@@ -620,5 +621,35 @@ void TestQgsLayoutMultiFrame::writeReadXml()
620621
QCOMPARE( html2->frames(), QList< QgsLayoutFrame * >() << frame2 );
621622
}
622623

624+
void TestQgsLayoutMultiFrame::noPageNoCrash()
625+
{
626+
QgsProject p;
627+
628+
// create layout, no pages
629+
QgsLayout c( &p );
630+
// add an multiframe
631+
QgsLayoutItemHtml *html = new QgsLayoutItemHtml( &c );
632+
c.addMultiFrame( html );
633+
html->setContentMode( QgsLayoutItemHtml::ManualHtml );
634+
html->setHtml( QStringLiteral( "<div style=\"height: 2000px\">hi</div>" ) );
635+
QgsLayoutFrame *frame = new QgsLayoutFrame( &c, html );
636+
frame->attemptSetSceneRect( QRectF( 1, 1, 10, 1 ) );
637+
c.addLayoutItem( frame );
638+
html->addFrame( frame );
639+
640+
html->setResizeMode( QgsLayoutMultiFrame::UseExistingFrames );
641+
html->recalculateFrameSizes();
642+
QCOMPARE( html->frameCount(), 1 );
643+
html->setResizeMode( QgsLayoutMultiFrame::ExtendToNextPage );
644+
html->recalculateFrameSizes();
645+
QCOMPARE( html->frameCount(), 1 );
646+
html->setResizeMode( QgsLayoutMultiFrame::RepeatOnEveryPage );
647+
html->recalculateFrameSizes();
648+
QCOMPARE( html->frameCount(), 1 );
649+
html->setResizeMode( QgsLayoutMultiFrame::RepeatUntilFinished );
650+
html->recalculateFrameSizes();
651+
QCOMPARE( html->frameCount(), 1 );
652+
}
653+
623654
QGSTEST_MAIN( TestQgsLayoutMultiFrame )
624655
#include "testqgslayoutmultiframe.moc"

0 commit comments

Comments
 (0)