File indexing completed on 2024-05-12 04:20:36
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 <KChartPosition.h> 0010 0011 #include <KChartEnums.h> 0012 #include "KChartMath_p.h" 0013 0014 #include <QString> 0015 #include <QList> 0016 #include <QByteArray> 0017 0018 #include <cassert> 0019 0020 using namespace KChart; 0021 0022 namespace { 0023 /** 0024 * \internal 0025 * Static strings, to be translated in printable() 0026 */ 0027 static const char * staticPositionNames[] = { 0028 QT_TRANSLATE_NOOP("Position","Unknown Position"), 0029 QT_TRANSLATE_NOOP("Position","Center"), 0030 QT_TRANSLATE_NOOP("Position","NorthWest"), 0031 QT_TRANSLATE_NOOP("Position","North"), 0032 QT_TRANSLATE_NOOP("Position","NorthEast"), 0033 QT_TRANSLATE_NOOP("Position","East"), 0034 QT_TRANSLATE_NOOP("Position","SouthEast"), 0035 QT_TRANSLATE_NOOP("Position","South"), 0036 QT_TRANSLATE_NOOP("Position","SouthWest"), 0037 QT_TRANSLATE_NOOP("Position","West"), 0038 QT_TRANSLATE_NOOP("Position","Floating") 0039 }; 0040 0041 0042 /** 0043 * \internal 0044 * One value for unknown positions, and nine values for predefined positions. 0045 */ 0046 static Position staticPositionUnknown = Position( KChartEnums::PositionUnknown ); 0047 static Position staticPositionCenter = Position( KChartEnums::PositionCenter ); 0048 static Position staticPositionNorthWest = Position( KChartEnums::PositionNorthWest ); 0049 static Position staticPositionNorth = Position( KChartEnums::PositionNorth ); 0050 static Position staticPositionNorthEast = Position( KChartEnums::PositionNorthEast ); 0051 static Position staticPositionEast = Position( KChartEnums::PositionEast ); 0052 static Position staticPositionSouthEast = Position( KChartEnums::PositionSouthEast ); 0053 static Position staticPositionSouth = Position( KChartEnums::PositionSouth ); 0054 static Position staticPositionSouthWest = Position( KChartEnums::PositionSouthWest ); 0055 static Position staticPositionWest = Position( KChartEnums::PositionWest ); 0056 static Position staticPositionFloating = Position( KChartEnums::PositionFloating ); 0057 0058 static const int maxPositionValue = 10; 0059 0060 } // anon namespace 0061 0062 const Position& Position::Unknown = staticPositionUnknown; 0063 const Position& Position::Center = staticPositionCenter; 0064 const Position& Position::NorthWest = staticPositionNorthWest; 0065 const Position& Position::North = staticPositionNorth; 0066 const Position& Position::NorthEast = staticPositionNorthEast; 0067 const Position& Position::East = staticPositionEast; 0068 const Position& Position::SouthEast = staticPositionSouthEast; 0069 const Position& Position::South = staticPositionSouth; 0070 const Position& Position::SouthWest = staticPositionSouthWest; 0071 const Position& Position::West = staticPositionWest; 0072 const Position& Position::Floating = staticPositionFloating; 0073 0074 0075 /** 0076 * Default constructor. Creates a new Position, defaulting it to Position::Unknown. 0077 */ 0078 Position::Position() 0079 : m_value( KChartEnums::PositionUnknown ) 0080 { 0081 0082 } 0083 0084 Position::Position( int value ) 0085 : m_value( value ) 0086 { 0087 assert( 0 <= value ); assert( value <= maxPositionValue ); 0088 } 0089 0090 /** 0091 * Constructor. Creates a new Position, defaulting it to the respective value. 0092 * 0093 * Valid values ranging from zero (unknown value) to 10. 0094 * If invalid value is passed, a Position::Unknown is created. 0095 * 0096 * \note Normally there is no need to call this constructor, but you would 0097 * rather use one of the nine pre-defined, static values, e.g. like this: 0098 * \verbatim 0099 * const KChart::Position myPosition = KChart::Position::NorthEast; 0100 * \endverbatim 0101 */ 0102 Position::Position( KChartEnums::PositionValue value ) 0103 : m_value( value ) 0104 { 0105 0106 } 0107 0108 /** 0109 * Returns an integer value corresponding to this Position. 0110 */ 0111 KChartEnums::PositionValue Position::value() const 0112 { 0113 return static_cast<KChartEnums::PositionValue>( m_value ); 0114 } 0115 0116 bool Position::isUnknown() const 0117 { 0118 return m_value == Position::Unknown.value(); 0119 } 0120 0121 bool Position::isWestSide() const 0122 { 0123 return m_value == Position::SouthWest.value() || 0124 m_value == Position::West.value() || 0125 m_value == Position::NorthWest.value(); 0126 } 0127 bool Position::isNorthSide() const 0128 { 0129 return m_value == Position::NorthWest.value() || 0130 m_value == Position::North.value() || 0131 m_value == Position::NorthEast.value(); 0132 } 0133 bool Position::isEastSide() const 0134 { 0135 return m_value == Position::NorthEast.value() || 0136 m_value == Position::East.value() || 0137 m_value == Position::SouthEast.value(); 0138 } 0139 bool Position::isSouthSide() const 0140 { 0141 return m_value == Position::SouthWest.value() || 0142 m_value == Position::South.value() || 0143 m_value == Position::SouthEast.value(); 0144 } 0145 0146 bool Position::isCorner() const 0147 { 0148 return m_value == Position::NorthWest.value() || 0149 m_value == Position::NorthEast.value() || 0150 m_value == Position::SouthEast.value() || 0151 m_value == Position::SouthWest.value(); 0152 } 0153 bool Position::isPole() const 0154 { 0155 return m_value == Position::North.value() || 0156 m_value == Position::South.value(); 0157 } 0158 0159 bool Position::isFloating() const 0160 { 0161 return m_value == Position::Floating.value(); 0162 } 0163 0164 /** 0165 * Returns a non-translated string in English language, corresponding to this Position. 0166 */ 0167 const char * Position::name() const 0168 { 0169 return staticPositionNames[m_value]; 0170 } 0171 0172 /** 0173 * Returns a translated string, corresponding to this Position. 0174 */ 0175 QString Position::printableName() const 0176 { 0177 return tr(staticPositionNames[m_value]); 0178 } 0179 0180 0181 /** 0182 * \brief Returns a list of all string, corresponding to 0183 * the pre-defined positions. 0184 * 0185 * \param options if set to \c ExcludeCenter, the returned list 0186 * does not contain the Center position. 0187 */ 0188 QList<QByteArray> Position::names( Options options ) 0189 { 0190 QList<QByteArray> list; 0191 const int start = ( options & IncludeCenter ) ? 1 : 2; 0192 const int end = ( options & IncludeFloating ) ? maxPositionValue : maxPositionValue-1; 0193 for ( int i=start; i<=end; ++i) 0194 list.append( staticPositionNames[i] ); 0195 return list; 0196 } 0197 0198 /** 0199 * \brief Returns a list of all translated string, corresponding to 0200 * the pre-defined positions. 0201 * 0202 * \param options if set to \c ExcludeCenter, the returned list 0203 * does not contain the Center position. 0204 */ 0205 QStringList Position::printableNames( Options options ) 0206 { 0207 QStringList list; 0208 const int start = ( options & IncludeCenter ) ? 1 : 2; 0209 const int end = ( options & IncludeFloating ) ? maxPositionValue : maxPositionValue-1; 0210 for ( int i=start; i<=end; ++i) 0211 list.append( Position(i).printableName() ); 0212 return list; 0213 } 0214 0215 Position Position::fromName(const char * name) 0216 { 0217 for ( int i=1; i<=maxPositionValue; ++i) 0218 if ( !qstricmp( name, staticPositionNames[i] ) ) 0219 return Position(i); 0220 return Position(0); 0221 } 0222 0223 Position Position::fromName( const QByteArray & name ) { 0224 return fromName( name.data() ); 0225 } 0226 0227 bool Position::operator==( const Position& r ) const 0228 { 0229 return ( value() == r.value() ); 0230 } 0231 0232 0233 bool Position::operator==( int value_ ) const 0234 { 0235 return ( value() == value_ ); 0236 } 0237 0238 0239 #if !defined(QT_NO_DEBUG_STREAM) 0240 QDebug operator<<(QDebug dbg, const KChart::Position& p ) 0241 { 0242 dbg << "KChart::Position(" 0243 << p.name() << ")"; 0244 return dbg; 0245 } 0246 #endif /* QT_NO_DEBUG_STREAM */