KHolidays Library
zodiac.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "zodiac.h"
00023
00024 #include <KLocale>
00025
00026 #include <QtCore/QDateTime>
00027 #include <QtCore/QSharedData>
00028
00029 using namespace KHolidays;
00030
00031 class KHolidays::ZodiacPrivate : public QSharedData
00032 {
00033 public:
00034 ZodiacPrivate( Zodiac::ZodiacType type )
00035 : mType( type )
00036 {
00037 }
00038
00039 ZodiacPrivate( const ZodiacPrivate &other )
00040 : QSharedData( other )
00041 {
00042 mType = other.mType;
00043 }
00044
00045 Zodiac::ZodiacType mType;
00046 };
00047
00048 Zodiac::Zodiac( ZodiacType type )
00049 : d( new ZodiacPrivate( type ) )
00050 {
00051 }
00052
00053 Zodiac::Zodiac( const Zodiac &other )
00054 : d( other.d )
00055 {
00056 }
00057
00058 Zodiac::~Zodiac()
00059 {
00060 }
00061
00062 Zodiac &Zodiac::operator=( const Zodiac &other )
00063 {
00064 if ( &other != this ) {
00065 d = other.d;
00066 }
00067
00068 return *this;
00069 }
00070
00071 QString Zodiac::signNameAtDate( const QDate &date ) const
00072 {
00073 return signName( signAtDate( date ) );
00074 }
00075
00076 QString Zodiac::signName( Zodiac::ZodiacSigns sign )
00077 {
00078 switch ( sign ) {
00079 case Aries:
00080 return i18n( "Aries" );
00081 case Taurus:
00082 return i18n( "Taurus" );
00083 case Gemini:
00084 return i18n( "Gemini" );
00085 case Cancer:
00086 return i18n( "Cancer" );
00087 case Leo:
00088 return i18n( "Leo" );
00089 case Virgo:
00090 return i18n( "Virgo" );
00091 case Libra:
00092 return i18n( "Libra" );
00093 case Scorpio:
00094 return i18n( "Scorpio" );
00095 case Sagittarius:
00096 return i18n( "Sagittarius" );
00097 case Capricorn:
00098 return i18n( "Capricorn" );
00099 case Aquarius:
00100 return i18n( "Aquarius" );
00101 case Pisces:
00102 return i18n( "Pisces" );
00103 default:
00104 case None:
00105 return QString();
00106 }
00107 }
00108
00109 Zodiac::ZodiacSigns Zodiac::signAtDate( const QDate &date ) const
00110 {
00111 QDate startdate, enddate;
00112
00113 switch( d->mType ) {
00114 case Tropical:
00115 startdate = QDate( date.year(), 1, 1 );
00116 enddate = QDate( date.year(), 1, 19 );
00117 if ( date >= startdate && date <= enddate ) {
00118 return Capricorn;
00119 }
00120
00121 startdate = enddate.addDays( 1 );
00122 enddate = startdate.addDays( 29 );
00123 if ( date >= startdate && date <= enddate ) {
00124 return Aquarius;
00125 }
00126
00127 startdate = enddate.addDays( 1 );
00128 enddate = QDate( date.year(), 3, 20 );
00129 if ( date >= startdate && date <= enddate ) {
00130 return Pisces;
00131 }
00132
00133 startdate = enddate.addDays( 1 );
00134 enddate = startdate.addDays( 29 );
00135 if ( date >= startdate && date <= enddate ) {
00136 return Aries;
00137 }
00138
00139 startdate = enddate.addDays( 1 );
00140 enddate = startdate.addDays( 30 );
00141 if ( date >= startdate && date <= enddate ) {
00142 return Taurus;
00143 }
00144
00145 startdate = enddate.addDays( 1 );
00146 enddate = startdate.addDays( 30 );
00147 if ( date >= startdate && date <= enddate ) {
00148 return Gemini;
00149 }
00150
00151 startdate = enddate.addDays( 1 );
00152 enddate = startdate.addDays( 31 );
00153 if ( date >= startdate && date <= enddate ) {
00154 return Cancer;
00155 }
00156
00157 startdate = enddate.addDays( 1 );
00158 enddate = startdate.addDays( 30 );
00159 if ( date >= startdate && date <= enddate ) {
00160 return Leo;
00161 }
00162
00163 startdate = enddate.addDays( 1 );
00164 enddate = startdate.addDays( 30 );
00165 if ( date >= startdate && date <= enddate ) {
00166 return Virgo;
00167 }
00168
00169 startdate = enddate.addDays( 1 );
00170 enddate = startdate.addDays( 29 );
00171 if ( date >= startdate && date <= enddate ) {
00172 return Libra;
00173 }
00174
00175 startdate = enddate.addDays( 1 );
00176 enddate = startdate.addDays( 29 );
00177 if ( date >= startdate && date <= enddate ) {
00178 return Scorpio;
00179 }
00180
00181 startdate = enddate.addDays( 1 );
00182 enddate = startdate.addDays( 29 );
00183 if ( date >= startdate && date <= enddate ) {
00184 return Sagittarius;
00185 }
00186
00187 return Capricorn;
00188 break;
00189
00190 case Sidereal:
00191 startdate = QDate( date.year(), 1, 1 );
00192 enddate = QDate( date.year(), 1, 14 );
00193 if ( date >= startdate && date <= enddate ) {
00194 return Sagittarius;
00195 }
00196
00197 startdate = enddate.addDays( 1 );
00198 enddate = startdate.addDays( 28 );
00199 if ( date >= startdate && date <= enddate ) {
00200 return Capricorn;
00201 }
00202
00203 startdate = enddate.addDays( 1 );
00204 enddate = QDate( date.year(), 3, 14 );
00205 if ( date >= startdate && date <= enddate ) {
00206 return Aquarius;
00207 }
00208
00209 startdate = enddate.addDays( 1 );
00210 enddate = QDate( date.year(), 4, 13 );
00211 if ( date >= startdate && date <= enddate ) {
00212 return Pisces;
00213 }
00214
00215 startdate = QDate( date.year(), 4, 14 );
00216 enddate = startdate.addDays( 30 );
00217 if ( date >= startdate && date <= enddate ) {
00218 return Aries;
00219 }
00220
00221 startdate = enddate.addDays( 1 );
00222 enddate = startdate.addDays( 30 );
00223 if ( date >= startdate && date <= enddate ) {
00224 return Taurus;
00225 }
00226
00227 startdate = enddate.addDays( 1 );
00228 enddate = startdate.addDays( 31 );
00229 if ( date >= startdate && date <= enddate ) {
00230 return Gemini;
00231 }
00232
00233 startdate = enddate.addDays( 1 );
00234 enddate = startdate.addDays( 30 );
00235 if ( date >= startdate && date <= enddate ) {
00236 return Cancer;
00237 }
00238
00239 startdate = enddate.addDays( 1 );
00240 enddate = startdate.addDays( 30 );
00241 if ( date >= startdate && date <= enddate ) {
00242 return Leo;
00243 }
00244
00245 startdate = enddate.addDays( 1 );
00246 enddate = startdate.addDays( 30 );
00247 if ( date >= startdate && date <= enddate ) {
00248 return Virgo;
00249 }
00250
00251 startdate = enddate.addDays( 1 );
00252 enddate = startdate.addDays( 29 );
00253 if ( date >= startdate && date <= enddate ) {
00254 return Libra;
00255 }
00256
00257 startdate = enddate.addDays( 1 );
00258 enddate = startdate.addDays( 28 );
00259 if ( date >= startdate && date <= enddate ) {
00260 return Scorpio;
00261 }
00262
00263 return Sagittarius;
00264 break;
00265 }
00266 return None;
00267 }
00268
00269 QString Zodiac::signSymbol( Zodiac::ZodiacSigns sign )
00270 {
00271 switch( sign ) {
00272 case Aries:
00273 return i18nc( "zodiac symbol for Aries", "ram" );
00274 case Taurus:
00275 return i18nc( "zodiac symbol for Taurus", "bull" );
00276 case Gemini:
00277 return i18nc( "zodiac symbol for Gemini", "twins" );
00278 case Cancer:
00279 return i18nc( "zodiac symbol for Cancer", "crab" );
00280 case Leo:
00281 return i18nc( "zodiac symbol for Leo", "lion" );
00282 case Virgo:
00283 return i18nc( "zodiac symbol for Virgo", "virgin" );
00284 case Libra:
00285 return i18nc( "zodiac symbol for Libra", "scales" );
00286 case Scorpio:
00287 return i18nc( "zodiac symbol for Scorpion", "scorpion" );
00288 case Sagittarius:
00289 return i18nc( "zodiac symbol for Sagittarius", "archer" );
00290 case Capricorn:
00291 return i18nc( "zodiac symbol for Capricorn", "goat" );
00292 case Aquarius:
00293 return i18nc( "zodiac symbol for Aquarius", "water" );
00294 case Pisces:
00295 return i18nc( "zodiac symbol for Pices", "fish" );
00296 default:
00297 case None:
00298 return QString();
00299 }
00300 }