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