File indexing completed on 2024-05-12 04:20:28

0001 /*
0002  * SPDX-FileCopyrightText: 2001-2015 Klaralvdalens Datakonsult AB. All rights reserved.
0003  *
0004  * This file is part of the KD Chart library.
0005  *
0006  * SPDX-License-Identifier: GPL-2.0-or-later
0007  */
0008 
0009 #include "KChartAbstractArea.h"
0010 #include "KChartAbstractArea_p.h"
0011 
0012 #include "KChartMath_p.h"
0013 
0014 #include <qglobal.h>
0015 
0016 #include <QPainter>
0017 #include <QRect>
0018 
0019 
0020 using namespace KChart;
0021 
0022 #define d (d_func())
0023 
0024 AbstractArea::Private::Private() :
0025     AbstractAreaBase::Private()
0026 {
0027     // this block left empty intentionally
0028 }
0029 
0030 
0031 AbstractArea::Private::~Private()
0032 {
0033     // this block left empty intentionally
0034 }
0035 
0036 
0037 AbstractArea::AbstractArea()
0038     : QObject()
0039     , KChart::AbstractAreaBase()
0040     , KChart::AbstractLayoutItem()
0041 {
0042     init();
0043 }
0044 
0045 AbstractArea::~AbstractArea()
0046 {
0047     // this block left empty intentionally
0048 }
0049 
0050 
0051 void AbstractArea::init()
0052 {
0053     d->amountOfLeftOverlap = 0;
0054     d->amountOfRightOverlap = 0;
0055     d->amountOfTopOverlap = 0;
0056     d->amountOfBottomOverlap = 0;
0057 }
0058 
0059 
0060 int AbstractArea::leftOverlap( bool doNotRecalculate ) const
0061 {
0062     // Re-calculate the sizes,
0063     // so we also get the amountOf..Overlap members set newly:
0064     if ( ! doNotRecalculate )
0065         sizeHint();
0066     return d->amountOfLeftOverlap;
0067 }
0068 int AbstractArea::rightOverlap( bool doNotRecalculate ) const
0069 {
0070     // Re-calculate the sizes,
0071     // so we also get the amountOf..Overlap members set newly:
0072     if ( ! doNotRecalculate )
0073         sizeHint();
0074     return d->amountOfRightOverlap;
0075 }
0076 int AbstractArea::topOverlap( bool doNotRecalculate ) const
0077 {
0078     // Re-calculate the sizes,
0079     // so we also get the amountOf..Overlap members set newly:
0080     if ( ! doNotRecalculate )
0081         sizeHint();
0082     return d->amountOfTopOverlap;
0083 }
0084 int AbstractArea::bottomOverlap( bool doNotRecalculate ) const
0085 {
0086     // Re-calculate the sizes,
0087     // so we also get the amountOf..Overlap members set newly:
0088     if ( ! doNotRecalculate )
0089         sizeHint();
0090     return d->amountOfBottomOverlap;
0091 }
0092 
0093 
0094 void AbstractArea::paintIntoRect( QPainter& painter, const QRect& rect )
0095 {
0096     const QRect oldGeometry( geometry() );
0097     if ( oldGeometry != rect )
0098         setGeometry( rect );
0099     painter.translate( rect.left(), rect.top() );
0100     paintAll( painter );
0101     painter.translate( -rect.left(), -rect.top() );
0102     if ( oldGeometry != rect )
0103         setGeometry( oldGeometry );
0104 }
0105 
0106 void AbstractArea::paintAll( QPainter& painter )
0107 {
0108     // Paint the background and frame
0109     const QRect overlappingArea( geometry().adjusted( -d->amountOfLeftOverlap, -d->amountOfTopOverlap,
0110                                                       d->amountOfRightOverlap, d->amountOfBottomOverlap ) );
0111     paintBackground( painter, overlappingArea );
0112     paintFrame( painter, overlappingArea );
0113 
0114     // temporarily adjust the widget size, to be sure all content gets calculated
0115     // to fit into the inner rectangle
0116     const QRect oldGeometry( areaGeometry() );
0117     QRect inner( innerRect() );
0118     inner.moveTo( oldGeometry.left() + inner.left(), oldGeometry.top() + inner.top() );
0119     const bool needAdjustGeometry = oldGeometry != inner;
0120     if ( needAdjustGeometry ) {
0121         // don't notify others of this change for internal purposes
0122         bool prevSignalBlocked = signalsBlocked();
0123         blockSignals( true );
0124         setGeometry( inner );
0125         blockSignals( prevSignalBlocked );
0126     }
0127     paint( &painter );
0128     if ( needAdjustGeometry ) {
0129         bool prevSignalBlocked = signalsBlocked();
0130         blockSignals( true );
0131         setGeometry( oldGeometry );
0132         blockSignals( prevSignalBlocked );
0133     }
0134     //qDebug() << "AbstractAreaWidget::paintAll() done.";
0135 }
0136 
0137 QRect AbstractArea::areaGeometry() const
0138 {
0139     return geometry();
0140 }
0141 
0142 void AbstractArea::positionHasChanged()
0143 {
0144     Q_EMIT positionChanged( this );
0145 }
0146