diff --git a/src/KChart/KChartChart.h b/src/KChart/KChartChart.h --- a/src/KChart/KChartChart.h +++ b/src/KChart/KChartChart.h @@ -434,11 +434,11 @@ * size of the target rectangle. * * \param painter The painter to be drawn into. - * \param target The rectangle to be filled by the Chart's drawing. + * \param rect The rectangle to be filled by the Chart's drawing. * * \sa setGlobalLeading */ - void paint( QPainter* painter, const QRect& target ); + void paint( QPainter* painter, const QRect& rect ); void reLayoutFloatingLegends(); diff --git a/src/KChart/KChartChart.cpp b/src/KChart/KChartChart.cpp --- a/src/KChart/KChartChart.cpp +++ b/src/KChart/KChartChart.cpp @@ -1344,65 +1344,35 @@ return d->globalLeadingBottom; } -void Chart::paint( QPainter* painter, const QRect& target ) +void Chart::paint( QPainter* painter, const QRect& rect ) { - if ( target.isEmpty() || !painter ) { + if ( rect.isEmpty() || !painter ) { return; } QPaintDevice* prevDevice = GlobalMeasureScaling::paintDevice(); GlobalMeasureScaling::setPaintDevice( painter->device() ); + int prevScaleFactor = PrintingParameters::scaleFactor(); - // Output on a widget - if ( dynamic_cast< QWidget* >( painter->device() ) != nullptr ) { - GlobalMeasureScaling::setFactors( qreal( target.width() ) / qreal( geometry().size().width() ), - qreal( target.height() ) / qreal( geometry().size().height() ) ); - } else { // Output onto a QPixmap PrintingParameters::setScaleFactor( qreal( painter->device()->logicalDpiX() ) / qreal( logicalDpiX() ) ); - - const qreal resX = qreal( logicalDpiX() ) / qreal( painter->device()->logicalDpiX() ); - const qreal resY = qreal( logicalDpiY() ) / qreal( painter->device()->logicalDpiY() ); - - GlobalMeasureScaling::setFactors( qreal( target.width() ) / qreal( geometry().size().width() ) * resX, - qreal( target.height() ) / qreal( geometry().size().height() ) * resY ); } - const QPoint translation = target.topLeft(); - painter->translate( translation ); - - // the following layout logic has the disadvantage that repeatedly calling this method can - // cause a relayout every time, but since this method's main use seems to be printing, the - // gratuitous relayouts shouldn't be much of a performance problem. - const bool differentSize = target.size() != size(); - QRect oldGeometry; - if ( differentSize ) { - oldGeometry = geometry(); - d->isPlanesLayoutDirty = true; - d->isFloatingLegendsLayoutDirty = true; - invalidateLayoutTree( d->dataAndLegendLayout ); - d->dataAndLegendLayout->setGeometry( QRect( QPoint(), target.size() ) ); - } - - d->overrideSize = target.size(); + const QRect oldGeometry( geometry() ); + if ( oldGeometry != rect ) + setGeometry( rect ); + painter->translate( rect.left(), rect.top() ); d->paintAll( painter ); - d->overrideSize = QSize(); - - if ( differentSize ) { - invalidateLayoutTree( d->dataAndLegendLayout ); - d->dataAndLegendLayout->setGeometry( oldGeometry ); - d->isPlanesLayoutDirty = true; - d->isFloatingLegendsLayoutDirty = true; - } // for debugging // painter->setPen( QPen( Qt::blue, 8 ) ); - // painter->drawRect( target ); + // painter->drawRect( rect ); - painter->translate( -translation.x(), -translation.y() ); + painter->translate( -rect.left(), -rect.top() ); + if ( oldGeometry != rect ) + setGeometry( oldGeometry ); - GlobalMeasureScaling::instance()->resetFactors(); - PrintingParameters::resetScaleFactor(); + PrintingParameters::setScaleFactor( prevScaleFactor ); GlobalMeasureScaling::setPaintDevice( prevDevice ); } diff --git a/src/KChart/KChartPrintingParameters.h b/src/KChart/KChartPrintingParameters.h --- a/src/KChart/KChartPrintingParameters.h +++ b/src/KChart/KChartPrintingParameters.h @@ -42,15 +42,16 @@ */ class PrintingParameters { public: + static qreal scaleFactor(); static void setScaleFactor( const qreal scaleFactor ); static void resetScaleFactor(); static QPen scalePen( const QPen& pen ); private: PrintingParameters(); static PrintingParameters* instance(); - qreal scaleFactor; + qreal m_scaleFactor; }; } diff --git a/src/KChart/KChartPrintingParameters.cpp b/src/KChart/KChartPrintingParameters.cpp --- a/src/KChart/KChartPrintingParameters.cpp +++ b/src/KChart/KChartPrintingParameters.cpp @@ -22,7 +22,7 @@ using namespace KChart; PrintingParameters::PrintingParameters() - : scaleFactor( 1.0 ) + : m_scaleFactor( 1.0 ) { } @@ -32,25 +32,30 @@ return &instance; } +qreal PrintingParameters::scaleFactor() +{ + return instance()->m_scaleFactor; +} + void PrintingParameters::setScaleFactor( const qreal scaleFactor ) { - instance()->scaleFactor = scaleFactor; + instance()->m_scaleFactor = scaleFactor; } void PrintingParameters::resetScaleFactor() { - instance()->scaleFactor = 1.0; + instance()->m_scaleFactor = 1.0; } QPen PrintingParameters::scalePen( const QPen& pen ) { - if ( instance()->scaleFactor == 1.0 ) + if ( instance()->m_scaleFactor == 1.0 ) return pen; QPen resultPen = pen; - resultPen.setWidthF( resultPen.widthF() * instance()->scaleFactor ); + resultPen.setWidthF( resultPen.widthF() * instance()->m_scaleFactor ); if ( resultPen.widthF() == 0.0 ) - resultPen.setWidthF( instance()->scaleFactor ); + resultPen.setWidthF( instance()->m_scaleFactor ); return resultPen; }