KD Chart 2 [rev.2.4]
|
00001 /**************************************************************************** 00002 ** Copyright (C) 2001-2012 Klaralvdalens Datakonsult AB. All rights reserved. 00003 ** 00004 ** This file is part of the KD Chart library. 00005 ** 00006 ** Licensees holding valid commercial KD Chart licenses may use this file in 00007 ** accordance with the KD Chart Commercial License Agreement provided with 00008 ** the Software. 00009 ** 00010 ** 00011 ** This file may be distributed and/or modified under the terms of the 00012 ** GNU General Public License version 2 and version 3 as published by the 00013 ** Free Software Foundation and appearing in the file LICENSE.GPL.txt included. 00014 ** 00015 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 00016 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 00017 ** 00018 ** Contact info@kdab.com if any conditions of this licensing are not 00019 ** clear to you. 00020 ** 00021 **********************************************************************/ 00022 00023 #include "KDChartAbstractAreaBase.h" 00024 #include "KDChartAbstractAreaBase_p.h" 00025 #include <KDChartBackgroundAttributes.h> 00026 #include <KDChartFrameAttributes.h> 00027 #include <KDChartTextAttributes.h> 00028 #include "KDChartPainterSaver_p.h" 00029 #include "KDChartPrintingParameters.h" 00030 #include <QPainter> 00031 00032 #include <KDABLibFakes> 00033 00034 00035 using namespace KDChart; 00036 00037 AbstractAreaBase::Private::Private() : 00038 visible( true ) 00039 // PENDING(khz) dockingPointToPadding?, alignToDockingPoint? 00040 { 00041 init(); 00042 } 00043 00044 00045 AbstractAreaBase::Private::~Private() {} 00046 00047 00048 void AbstractAreaBase::Private::init() 00049 { 00050 } 00051 00052 00053 00054 00055 AbstractAreaBase::AbstractAreaBase() : 00056 _d( new Private() ) 00057 { 00058 } 00059 00060 AbstractAreaBase::~AbstractAreaBase() 00061 { 00062 delete _d; _d = 0; 00063 } 00064 00065 00066 void AbstractAreaBase::init() 00067 { 00068 } 00069 00070 00071 #define d d_func() 00072 00073 bool AbstractAreaBase::compare( const AbstractAreaBase* other )const 00074 { 00075 if( other == this ) return true; 00076 if( ! other ){ 00077 //qDebug() << "CartesianAxis::compare() cannot compare to Null pointer"; 00078 return false; 00079 } 00080 /* 00081 qDebug() << "AbstractAreaBase:" << (frameAttributes() == other->frameAttributes()) 00082 << (backgroundAttributes() == other->backgroundAttributes()) << "\n"; 00083 */ 00084 return (frameAttributes() == other->frameAttributes()) && 00085 (backgroundAttributes() == other->backgroundAttributes()); 00086 } 00087 00088 void AbstractAreaBase::alignToReferencePoint( const RelativePosition& position ) 00089 { 00090 Q_UNUSED( position ); 00091 // PENDING(kalle) FIXME 00092 qWarning( "Sorry, not implemented: void AbstractAreaBase::alignToReferencePoint( const RelativePosition& position )" ); 00093 } 00094 00095 void AbstractAreaBase::setFrameAttributes( const FrameAttributes &a ) 00096 { 00097 if( d->frameAttributes == a ) 00098 return; 00099 00100 d->frameAttributes = a; 00101 positionHasChanged(); 00102 } 00103 00104 FrameAttributes AbstractAreaBase::frameAttributes() const 00105 { 00106 return d->frameAttributes; 00107 } 00108 00109 void AbstractAreaBase::setBackgroundAttributes( const BackgroundAttributes &a ) 00110 { 00111 if( d->backgroundAttributes == a ) 00112 return; 00113 00114 d->backgroundAttributes = a; 00115 positionHasChanged(); 00116 } 00117 00118 BackgroundAttributes AbstractAreaBase::backgroundAttributes() const 00119 { 00120 return d->backgroundAttributes; 00121 } 00122 00123 00124 /* static */ 00125 void AbstractAreaBase::paintBackgroundAttributes( QPainter& painter, const QRect& rect, 00126 const KDChart::BackgroundAttributes& attributes ) 00127 { 00128 if( !attributes.isVisible() ) return; 00129 00130 /* first draw the brush (may contain a pixmap)*/ 00131 if( Qt::NoBrush != attributes.brush().style() ) { 00132 KDChart::PainterSaver painterSaver( &painter ); 00133 painter.setPen( Qt::NoPen ); 00134 const QPointF newTopLeft( painter.deviceMatrix().map( rect.topLeft() ) ); 00135 painter.setBrushOrigin( newTopLeft ); 00136 painter.setBrush( attributes.brush() ); 00137 painter.drawRect( rect.adjusted( 0, 0, -1, -1 ) ); 00138 } 00139 /* next draw the backPixmap over the brush */ 00140 if( !attributes.pixmap().isNull() && 00141 attributes.pixmapMode() != BackgroundAttributes::BackgroundPixmapModeNone ) { 00142 QPointF ol = rect.topLeft(); 00143 if( BackgroundAttributes::BackgroundPixmapModeCentered == attributes.pixmapMode() ) 00144 { 00145 ol.setX( rect.center().x() - attributes.pixmap().width() / 2 ); 00146 ol.setY( rect.center().y() - attributes.pixmap().height()/ 2 ); 00147 painter.drawPixmap( ol, attributes.pixmap() ); 00148 } else { 00149 QMatrix m; 00150 double zW = (double)rect.width() / (double)attributes.pixmap().width(); 00151 double zH = (double)rect.height() / (double)attributes.pixmap().height(); 00152 switch( attributes.pixmapMode() ) { 00153 case BackgroundAttributes::BackgroundPixmapModeScaled: 00154 { 00155 double z; 00156 z = qMin( zW, zH ); 00157 m.scale( z, z ); 00158 } 00159 break; 00160 case BackgroundAttributes::BackgroundPixmapModeStretched: 00161 m.scale( zW, zH ); 00162 break; 00163 default: 00164 ; // Cannot happen, previously checked 00165 } 00166 QPixmap pm = attributes.pixmap().transformed( m ); 00167 ol.setX( rect.center().x() - pm.width() / 2 ); 00168 ol.setY( rect.center().y() - pm.height()/ 2 ); 00169 painter.drawPixmap( ol, pm ); 00170 } 00171 } 00172 } 00173 00174 /* static */ 00175 void AbstractAreaBase::paintFrameAttributes( QPainter& painter, const QRect& rect, 00176 const KDChart::FrameAttributes& attributes ) 00177 { 00178 00179 if( !attributes.isVisible() ) return; 00180 00181 // Note: We set the brush to NoBrush explicitly here. 00182 // Otherwise we might get a filled rectangle, so any 00183 // previously drawn background would be overwritten by that area. 00184 00185 const QPen oldPen( painter.pen() ); 00186 const QBrush oldBrush( painter.brush() ); 00187 painter.setPen( PrintingParameters::scalePen( attributes.pen() ) ); 00188 painter.setBrush( Qt::NoBrush ); 00189 painter.drawRect( rect.adjusted( 0, 0, -1, -1 ) ); 00190 painter.setBrush( oldBrush ); 00191 painter.setPen( oldPen ); 00192 } 00193 00194 void AbstractAreaBase::paintBackground( QPainter& painter, const QRect& rect ) 00195 { 00196 Q_ASSERT_X ( d != 0, "AbstractAreaBase::paintBackground()", 00197 "Private class was not initialized!" ); 00198 paintBackgroundAttributes( painter, rect, d->backgroundAttributes ); 00199 } 00200 00201 00202 void AbstractAreaBase::paintFrame( QPainter& painter, const QRect& rect ) 00203 { 00204 Q_ASSERT_X ( d != 0, "AbstractAreaBase::paintFrame()", 00205 "Private class was not initialized!" ); 00206 paintFrameAttributes( painter, rect, d->frameAttributes ); 00207 } 00208 00209 00210 void AbstractAreaBase::getFrameLeadings(int& left, int& top, int& right, int& bottom ) const 00211 { 00212 if( d && d->frameAttributes.isVisible() ){ 00213 const int padding = qMax( d->frameAttributes.padding(), 0 ); 00214 left = padding; 00215 top = padding; 00216 right = padding; 00217 bottom = padding; 00218 }else{ 00219 left = 0; 00220 top = 0; 00221 right = 0; 00222 bottom = 0; 00223 } 00224 } 00225 00226 QRect AbstractAreaBase::innerRect() const 00227 { 00228 int left; 00229 int top; 00230 int right; 00231 int bottom; 00232 getFrameLeadings( left, top, right, bottom ); 00233 return 00234 QRect( QPoint(0,0), areaGeometry().size() ) 00235 .adjusted( left, top, -right, -bottom ); 00236 } 00237 00238 void AbstractAreaBase::positionHasChanged() 00239 { 00240 // this bloc left empty intentionally 00241 } 00242