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 */