Fix drawing of rulers with multipage layouts

This commit is contained in:
Nyall Dawson 2017-07-21 16:47:40 +10:00
parent 4cf9827ca2
commit 416e1e4bbf
8 changed files with 50 additions and 32 deletions

View File

@ -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
};
/************************************************************************

View File

@ -186,6 +186,8 @@ class QgsLayoutView: QGraphicsView
virtual void resizeEvent( QResizeEvent *event );
virtual void scrollContentsBy( int dx, int dy );
};

View File

@ -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()

View File

@ -52,6 +52,7 @@ void QgsLayoutPageCollection::reflow()
p.setY( currentY );
}
mLayout->updateBounds();
emit changed();
}
double QgsLayoutPageCollection::maximumPageWidth() const

View File

@ -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;

View File

@ -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();
}

View File

@ -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 )

View File

@ -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: