diff --git a/python/core/layout/qgslayoutpagecollection.sip b/python/core/layout/qgslayoutpagecollection.sip index 3a115f9f4e8..0f54665065b 100644 --- a/python/core/layout/qgslayoutpagecollection.sip +++ b/python/core/layout/qgslayoutpagecollection.sip @@ -137,6 +137,13 @@ Size of page shadow, in layout coordinates :rtype: float %End + signals: + + void changed(); +%Docstring + Emitted when pages are added or removed from the collection. +%End + }; /************************************************************************ diff --git a/python/gui/layout/qgslayoutview.sip b/python/gui/layout/qgslayoutview.sip index c0c8c0a0a52..e57a229fd88 100644 --- a/python/gui/layout/qgslayoutview.sip +++ b/python/gui/layout/qgslayoutview.sip @@ -186,6 +186,8 @@ class QgsLayoutView: QGraphicsView virtual void resizeEvent( QResizeEvent *event ); + virtual void scrollContentsBy( int dx, int dy ); + }; diff --git a/src/app/layout/qgslayoutdesignerdialog.cpp b/src/app/layout/qgslayoutdesignerdialog.cpp index 62f2dd0c7af..824d74f1903 100644 --- a/src/app/layout/qgslayoutdesignerdialog.cpp +++ b/src/app/layout/qgslayoutdesignerdialog.cpp @@ -257,15 +257,10 @@ void QgsLayoutDesignerDialog::open() { show(); activate(); - mView->zoomFull(); // zoomFull() does not work properly until we have called show() - -#if 0 // TODO - if ( mView ) { - mView->updateRulers(); + mView->zoomFull(); // zoomFull() does not work properly until we have called show() } -#endif } void QgsLayoutDesignerDialog::activate() diff --git a/src/core/layout/qgslayoutpagecollection.cpp b/src/core/layout/qgslayoutpagecollection.cpp index 29ed34bba73..c534377ccc4 100644 --- a/src/core/layout/qgslayoutpagecollection.cpp +++ b/src/core/layout/qgslayoutpagecollection.cpp @@ -52,6 +52,7 @@ void QgsLayoutPageCollection::reflow() p.setY( currentY ); } mLayout->updateBounds(); + emit changed(); } double QgsLayoutPageCollection::maximumPageWidth() const diff --git a/src/core/layout/qgslayoutpagecollection.h b/src/core/layout/qgslayoutpagecollection.h index b3f741ad202..049f0a7106a 100644 --- a/src/core/layout/qgslayoutpagecollection.h +++ b/src/core/layout/qgslayoutpagecollection.h @@ -145,6 +145,13 @@ class CORE_EXPORT QgsLayoutPageCollection : public QObject */ double maximumPageWidth() const; + signals: + + /** + * Emitted when pages are added or removed from the collection. + */ + void changed(); + private: QgsLayout *mLayout = nullptr; diff --git a/src/gui/layout/qgslayoutruler.cpp b/src/gui/layout/qgslayoutruler.cpp index 2fa4b7596cd..de0d737a28f 100644 --- a/src/gui/layout/qgslayoutruler.cpp +++ b/src/gui/layout/qgslayoutruler.cpp @@ -66,9 +66,8 @@ void QgsLayoutRuler::paintEvent( QPaintEvent *event ) { return; } -#if 0 + QgsLayout *layout = mView->currentLayout(); -#endif QPainter p( this ); QTransform t = mTransform.inverted(); @@ -137,14 +136,23 @@ void QgsLayoutRuler::paintEvent( QPaintEvent *event ) double startY = t.map( QPointF( 0, 0 ) ).y(); //start position in mm (total including space between pages) double endY = t.map( QPointF( 0, height() ) ).y(); //stop position in mm (total including space between pages) -#if 0 // TODO - int startPage = ( int )( startY / ( layout->paperHeight() + layout->spaceBetweenPages() ) ); -#endif - + // work out start page int startPage = 0; - if ( startPage < 0 ) + int endPage = 0; + double currentY = 0; + double currentPageY = 0; + for ( int page = 0; page < layout->pageCollection()->pageCount(); ++page ) { - startPage = 0; + if ( currentY < startY ) + { + startPage = page; + currentPageY = currentY; + } + endPage = page; + + currentY += layout->pageCollection()->page( startPage )->rect().height() + layout->pageCollection()->SPACE_BETWEEN_PAGES; + if ( currentY > endY ) + break; } if ( startY < 0 ) @@ -177,15 +185,6 @@ void QgsLayoutRuler::paintEvent( QPaintEvent *event ) drawSmallDivisions( &p, beforePageCoord + mmDisplay, numSmallDivisions, -mmDisplay, startY ); } -#if 0 //TODO - int endPage = ( int )( endY / ( layout->paperHeight() + layout->spaceBetweenPages() ) ); - if ( endPage > ( mLayout->numPages() - 1 ) ) - { - endPage = mLayout->numPages() - 1; - } -#endif - int endPage = 0; - double nextPageStartPos = 0; int nextPageStartPixel = 0; @@ -193,14 +192,14 @@ void QgsLayoutRuler::paintEvent( QPaintEvent *event ) { double pageCoord = 0; //page coordinate in mm //total (composition) coordinate in mm, including space between pages -#if 0 //TODO - double totalCoord = i * ( layout->paperHeight() + layout->spaceBetweenPages() ); + + double totalCoord = currentPageY; //position of next page if ( i < endPage ) { //not the last page - nextPageStartPos = ( i + 1 ) * ( layout->paperHeight() + layout->spaceBetweenPages() ); + nextPageStartPos = currentPageY + layout->pageCollection()->page( i )->rect().height() + layout->pageCollection()->SPACE_BETWEEN_PAGES; nextPageStartPixel = mTransform.map( QPointF( 0, nextPageStartPos ) ).y(); } else @@ -209,8 +208,7 @@ void QgsLayoutRuler::paintEvent( QPaintEvent *event ) nextPageStartPos = 0; nextPageStartPixel = 0; } -#endif - double totalCoord = 0; + while ( ( totalCoord < nextPageStartPos ) || ( ( nextPageStartPos == 0 ) && ( totalCoord <= endY ) ) ) { double pixelCoord = mTransform.map( QPointF( 0, totalCoord ) ).y(); @@ -232,6 +230,7 @@ void QgsLayoutRuler::paintEvent( QPaintEvent *event ) pageCoord += mmDisplay; totalCoord += mmDisplay; } + currentPageY += layout->pageCollection()->page( i )->rect().height() + layout->pageCollection()->SPACE_BETWEEN_PAGES; } break; } @@ -407,10 +406,6 @@ int QgsLayoutRuler::optimumNumberDivisions( double rulerScale, int scaleMultiple void QgsLayoutRuler::setSceneTransform( const QTransform &transform ) { -#if 0 - QString debug = QString::number( transform.dx() ) + ',' + QString::number( transform.dy() ) + ',' - + QString::number( transform.m11() ) + ',' + QString::number( transform.m22() ); -#endif mTransform = transform; update(); } diff --git a/src/gui/layout/qgslayoutview.cpp b/src/gui/layout/qgslayoutview.cpp index 8136ce86565..dc44fe9ef30 100644 --- a/src/gui/layout/qgslayoutview.cpp +++ b/src/gui/layout/qgslayoutview.cpp @@ -53,6 +53,9 @@ void QgsLayoutView::setCurrentLayout( QgsLayout *layout ) { setScene( layout ); + connect( layout->pageCollection(), &QgsLayoutPageCollection::changed, this, &QgsLayoutView::updateRulers ); + updateRulers(); + //emit layoutSet, so that designer dialogs can update for the new layout emit layoutSet( layout ); } @@ -131,6 +134,7 @@ void QgsLayoutView::setVerticalRuler( QgsLayoutRuler *ruler ) void QgsLayoutView::zoomFull() { fitInView( scene()->sceneRect(), Qt::KeepAspectRatio ); + updateRulers(); emit zoomLevelChanged(); } @@ -305,6 +309,12 @@ void QgsLayoutView::resizeEvent( QResizeEvent *event ) emit zoomLevelChanged(); } +void QgsLayoutView::scrollContentsBy( int dx, int dy ) +{ + QGraphicsView::scrollContentsBy( dx, dy ); + updateRulers(); +} + void QgsLayoutView::updateRulers() { if ( mHorizontalRuler ) diff --git a/src/gui/layout/qgslayoutview.h b/src/gui/layout/qgslayoutview.h index a34094d557e..fd483682912 100644 --- a/src/gui/layout/qgslayoutview.h +++ b/src/gui/layout/qgslayoutview.h @@ -209,6 +209,7 @@ class GUI_EXPORT QgsLayoutView: public QGraphicsView void keyPressEvent( QKeyEvent *event ) override; void keyReleaseEvent( QKeyEvent *event ) override; void resizeEvent( QResizeEvent *event ) override; + void scrollContentsBy( int dx, int dy ) override; private slots: