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 #ifndef KDCHARTPOSITION_H 00024 #define KDCHARTPOSITION_H 00025 00026 #include <QDebug> 00027 #include <Qt> 00028 #include <QMetaType> 00029 #include <QCoreApplication> 00030 #include "KDChartGlobal.h" 00031 #include "KDChartEnums.h" 00032 00033 class QStringList; 00034 class QByteArray; 00035 template <typename T> class QList; 00036 00037 namespace KDChart { 00038 00067 class KDCHART_EXPORT Position 00068 { 00069 Q_DECLARE_TR_FUNCTIONS( Position ) 00070 Position( int value ); 00071 public: 00072 Position(); 00073 Position( KDChartEnums::PositionValue value ); // intentionally non-explicit 00074 00075 KDChartEnums::PositionValue value() const; 00076 00077 const char * name() const; 00078 QString printableName() const; 00079 00080 bool isUnknown() const; 00081 00082 bool isWestSide() const; 00083 bool isNorthSide() const; 00084 bool isEastSide() const; 00085 bool isSouthSide() const; 00086 00087 bool isCorner() const; 00088 bool isPole() const; 00089 00090 bool isFloating() const; 00091 00092 static const Position& Unknown; 00093 static const Position& Center; 00094 static const Position& NorthWest; 00095 static const Position& North; 00096 static const Position& NorthEast; 00097 static const Position& East; 00098 static const Position& SouthEast; 00099 static const Position& South; 00100 static const Position& SouthWest; 00101 static const Position& West; 00102 00103 static const Position& Floating; 00104 00105 // boolean flags: 1, 2, 4, 8, ... 00106 enum Option { 00107 IncludeCenter = 0x1, 00108 IncludeFloating = 0x2 }; 00109 Q_DECLARE_FLAGS( Options, Option ) 00110 00111 // Unfortunately the following typecast from int to Options is needed 00112 // as the | operator is not defined yet, this will be done by 00113 // the makro Q_DECLARE_OPERATORS_FOR_FLAGS( KDChart::Position::Options ) 00114 // at the bottom of this file. 00115 static QList<QByteArray> names( Options options = Options(IncludeCenter | IncludeFloating) ); 00116 static QStringList printableNames( Options options = Options(IncludeCenter | IncludeFloating) ); 00117 00118 static Position fromName(const char * name); 00119 static Position fromName(const QByteArray & name); 00120 00121 bool operator==( const Position& ) const; 00122 bool operator==( int ) const; 00123 bool operator!=( const Position& ) const; 00124 bool operator!=( int ) const; 00125 00126 private: 00127 int m_value; 00128 }; // End of class Position 00129 00130 inline bool Position::operator!=( const Position & other ) const { return !operator==( other ); } 00131 inline bool Position::operator!=( int other ) const { return !operator==( other ); } 00132 00137 class KDCHART_EXPORT PositionPoints 00138 { 00139 public: 00140 PositionPoints(){} // all points get initialized with the default automatically 00141 00142 PositionPoints( 00143 QPointF center, 00144 QPointF northWest, 00145 QPointF north, 00146 QPointF northEast, 00147 QPointF east, 00148 QPointF southEast, 00149 QPointF south, 00150 QPointF southWest, 00151 QPointF west ) 00152 : mPositionCenter( center ) 00153 , mPositionNorthWest( northWest ) 00154 , mPositionNorth( north ) 00155 , mPositionNorthEast( northEast ) 00156 , mPositionEast( east ) 00157 , mPositionSouthEast( southEast ) 00158 , mPositionSouth( south ) 00159 , mPositionSouthWest( southWest ) 00160 , mPositionWest( west ) 00161 {} 00162 PositionPoints( 00163 const QPointF& onePointForAllPositions ) 00164 : mPositionCenter( onePointForAllPositions ) 00165 , mPositionNorthWest( onePointForAllPositions ) 00166 , mPositionNorth( onePointForAllPositions ) 00167 , mPositionNorthEast( onePointForAllPositions ) 00168 , mPositionEast( onePointForAllPositions ) 00169 , mPositionSouthEast( onePointForAllPositions ) 00170 , mPositionSouth( onePointForAllPositions ) 00171 , mPositionSouthWest( onePointForAllPositions ) 00172 , mPositionWest( onePointForAllPositions ) 00173 {} 00174 PositionPoints( 00175 const QRectF& rect ) 00176 { 00177 const QRectF r( rect.normalized() ); 00178 mPositionCenter = r.center(); 00179 mPositionNorthWest = r.topLeft(); 00180 mPositionNorth = QPointF(r.center().x(), r.top()); 00181 mPositionNorthEast = r.topRight(); 00182 mPositionEast = QPointF(r.right(), r.center().y()); 00183 mPositionSouthEast = r.bottomRight(); 00184 mPositionSouth = QPointF(r.center().x(), r.bottom()); 00185 mPositionSouthWest = r.bottomLeft(); 00186 mPositionWest = QPointF(r.left(), r.center().y()); 00187 } 00188 PositionPoints( 00189 QPointF northWest, 00190 QPointF northEast, 00191 QPointF southEast, 00192 QPointF southWest ) 00193 : mPositionCenter( (northWest + southEast) / 2.0 ) 00194 , mPositionNorthWest( northWest ) 00195 , mPositionNorth( (northWest + northEast) / 2.0 ) 00196 , mPositionNorthEast( northEast ) 00197 , mPositionEast( (northEast + southEast) / 2.0 ) 00198 , mPositionSouthEast( southEast ) 00199 , mPositionSouth( (southWest + southEast) / 2.0 ) 00200 , mPositionSouthWest( southWest ) 00201 , mPositionWest( (northWest + southWest) / 2.0 ) 00202 {} 00203 00204 void setDegrees( KDChartEnums::PositionValue pos, qreal degrees ) 00205 { 00206 mapOfDegrees[pos] = degrees; 00207 } 00208 00209 #if QT_VERSION < 0x040400 || defined(Q_COMPILER_MANGLES_RETURN_TYPE) 00210 const qreal degrees( KDChartEnums::PositionValue pos ) const 00211 #else 00212 qreal degrees( KDChartEnums::PositionValue pos ) const 00213 #endif 00214 { 00215 if( mapOfDegrees.contains(pos) ) 00216 return mapOfDegrees[pos]; 00217 return 0.0; 00218 } 00219 00220 #if QT_VERSION < 0x040400 || defined(Q_COMPILER_MANGLES_RETURN_TYPE) 00221 const QPointF point( Position position ) const 00222 #else 00223 QPointF point( Position position ) const 00224 #endif 00225 { 00226 //qDebug() << "point( " << position.name() << " )"; 00227 if( position == Position::Center) 00228 return mPositionCenter; 00229 if( position == Position::NorthWest) 00230 return mPositionNorthWest; 00231 if( position == Position::North) 00232 return mPositionNorth; 00233 if( position == Position::NorthEast) 00234 return mPositionNorthEast; 00235 if( position == Position::East) 00236 return mPositionEast; 00237 if( position == Position::SouthEast) 00238 return mPositionSouthEast; 00239 if( position == Position::South) 00240 return mPositionSouth; 00241 if( position == Position::SouthWest) 00242 return mPositionSouthWest; 00243 if( position == Position::West) 00244 return mPositionWest; 00245 return mPositionUnknown; 00246 } 00247 00248 bool isNull() const 00249 { 00250 return 00251 mPositionUnknown.isNull() && 00252 mPositionCenter.isNull() && 00253 mPositionNorthWest.isNull() && 00254 mPositionNorth.isNull() && 00255 mPositionNorthEast.isNull() && 00256 mPositionEast.isNull() && 00257 mPositionSouthEast.isNull() && 00258 mPositionSouth.isNull() && 00259 mPositionSouthWest.isNull() && 00260 mPositionWest.isNull(); 00261 } 00262 00263 QPointF mPositionUnknown; 00264 QPointF mPositionCenter; 00265 QPointF mPositionNorthWest; 00266 QPointF mPositionNorth; 00267 QPointF mPositionNorthEast; 00268 QPointF mPositionEast; 00269 QPointF mPositionSouthEast; 00270 QPointF mPositionSouth; 00271 QPointF mPositionSouthWest; 00272 QPointF mPositionWest; 00273 QMap<KDChartEnums::PositionValue, qreal> mapOfDegrees; 00274 00275 }; // End of class PositionPoints 00276 00277 00278 } 00279 00280 Q_DECLARE_TYPEINFO( KDChart::Position, Q_MOVABLE_TYPE ); 00281 Q_DECLARE_METATYPE( KDChart::Position ) 00282 Q_DECLARE_OPERATORS_FOR_FLAGS( KDChart::Position::Options ) 00283 00284 #if !defined(QT_NO_DEBUG_STREAM) 00285 KDCHART_EXPORT QDebug operator<<(QDebug, const KDChart::Position& ); 00286 #endif /* QT_NO_DEBUG_STREAM */ 00287 00288 #endif // KDCHARTPOSITION_H