moved kdeaccessibility kdeaddons kdeadmin kdeartwork kdebindings kdeedu kdegames...
[kdeedu.git] / kstars / kstars / timespinbox.cpp
blobdf433f08f195a700e203c1c219260c348678f0dd
1 /***************************************************************************
2 timespinbox.cpp - description
3 -------------------
4 begin : Sun Mar 31 2002
5 copyright : (C) 2002 by Jason Harris
6 email : kstars@30doradus.org
7 ***************************************************************************/
9 /***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
18 //Time steps:
19 //0-9: 0 sec, 0.1, 0.25, 0.5, 1, 2, 5, 10, 20, 30 sec
20 //10-14: 1 minute, 2, 5, 10, 15, 30 min
21 //15-19: 1 hour, 2, 4, 6, 12 hours
22 //20-23: 1 day, 2, 3, 5 days
23 //24-26: 1 week, 2, 3 weeks
24 //27-32: 1 month, 2, 3, 4, 6, 9 months
25 //33-41: 1 year, 2, 3, 4, 5, 10, 25, 50, 100 years
27 #include <qlineedit.h>
28 #include <kdebug.h>
29 #include <klocale.h>
30 #include <stdlib.h>
31 #include <math.h>
33 #include "timespinbox.h"
35 #define SECS_PER_DAY 86400.
36 #define SIDEREAL_YEAR 31558149.77
37 #define TROPICAL_YEAR 31556925.19
39 TimeSpinBox::TimeSpinBox( QWidget *parent, const char *name )
40 : QSpinBox ( -41, 41, 1 /* step */, parent, name )
42 setValidator( 0 );
43 setButtonSymbols( QSpinBox::PlusMinus );
44 editor()->setReadOnly( true );
45 setValue( 4 ); //1 second (real time)
47 TimeScale[0] = 0.0; // 0.0 sec
48 TimeScale[1] = 0.1; // 0.1 sec
49 TimeScale[2] = 0.25; // 0.25 sec
50 TimeScale[3] = 0.5; // 0.5 sec
51 TimeScale[4] = 1.0; // 1 sec (real-time)
52 TimeScale[5] = 2.0; // 2 sec
53 TimeScale[6] = 5.0; // 5 sec
54 TimeScale[7] = 10.0; // 10 sec
55 TimeScale[8] = 20.0; // 20 sec
56 TimeScale[9] = 30.0; // 30 sec
57 TimeScale[10] = 60.0; // 1 min
58 TimeScale[11] = 120.0; // 2 min
59 TimeScale[12] = 300.0; // 5 min
60 TimeScale[13] = 600.0; // 10 min
61 TimeScale[14] = 900.0; // 15 min
62 TimeScale[15] = 1800.0; // 30 min
63 TimeScale[16] = 3600.0; // 1 hr
64 TimeScale[17] = 7200.0; // 2 hr
65 TimeScale[18] = 10800.0; // 3 hr
66 TimeScale[19] = 21600.0; // 6 hr
67 TimeScale[20] = 43200.0; // 12 hr
68 TimeScale[21] = SECS_PER_DAY; // 1 day
69 TimeScale[22] = 2.*SECS_PER_DAY; // 2 days
70 TimeScale[23] = 3.*SECS_PER_DAY; // 3 days
71 TimeScale[24] = 5.*SECS_PER_DAY; // 5 days
72 TimeScale[25] = 7.*SECS_PER_DAY; // 1 week
73 TimeScale[26] = 14.*SECS_PER_DAY; //2 weeks
74 TimeScale[27] = 21.*SECS_PER_DAY; //3 weeks
75 //Months aren't a simple measurement of time; I'll just use fractions of a year
76 TimeScale[28] = SIDEREAL_YEAR/12.0; // 1 month
77 TimeScale[29] = SIDEREAL_YEAR/6.0; // 2 months
78 TimeScale[30] = 0.25*SIDEREAL_YEAR; // 3 months
79 TimeScale[31] = SIDEREAL_YEAR/3.0; // 4 months
80 TimeScale[32] = 0.5*SIDEREAL_YEAR; // 6 months
81 TimeScale[33] = 0.75*SIDEREAL_YEAR; // 9 months
82 TimeScale[34] = SIDEREAL_YEAR; // 1 year
83 TimeScale[35] = 2.0*SIDEREAL_YEAR; // 2 years
84 TimeScale[36] = 3.0*SIDEREAL_YEAR; // 3 years
85 TimeScale[37] = 5.0*SIDEREAL_YEAR; // 5 years
86 TimeScale[38] = 10.0*SIDEREAL_YEAR; // 10 years
87 TimeScale[39] = 25.0*SIDEREAL_YEAR; // 25 years
88 TimeScale[40] = 50.0*SIDEREAL_YEAR; // 50 years
89 TimeScale[41] = 100.0*SIDEREAL_YEAR; // 100 years
91 TimeString.append( "0 " + i18n( "seconds", "secs" ));
92 TimeString.append( "0.1 " + i18n( "seconds", "secs" ));
93 TimeString.append( "0.25 " + i18n( "seconds", "secs" ));
94 TimeString.append( "0.5 " + i18n( "seconds", "secs" ));
95 TimeString.append( "1 " + i18n( "second", "sec" ));
96 TimeString.append( "2 " + i18n( "seconds", "secs" ));
97 TimeString.append( "5 " + i18n( "seconds", "secs" ));
98 TimeString.append( "10 " + i18n( "seconds", "secs" ));
99 TimeString.append( "20 " + i18n( "seconds", "secs" ));
100 TimeString.append( "30 " + i18n( "seconds", "secs" ));
101 TimeString.append( "1 " + i18n( "minute", "min" ));
102 TimeString.append( "2 " + i18n( "minutes", "mins" ));
103 TimeString.append( "5 " + i18n( "minutes", "mins" ));
104 TimeString.append( "10 " + i18n( "minutes", "mins" ));
105 TimeString.append( "15 " + i18n( "minutes", "mins" ));
106 TimeString.append( "30 " + i18n( "minutes", "mins" ));
107 TimeString.append( "1 " + i18n( "hour" ));
108 TimeString.append( "2 " + i18n( "hours", "hrs" ));
109 TimeString.append( "3 " + i18n( "hours", "hrs" ));
110 TimeString.append( "6 " + i18n( "hours", "hrs" ));
111 TimeString.append( "12 " + i18n( "hours", "hrs" ));
112 TimeString.append( "1 " + i18n( "day" ));
113 TimeString.append( "2 " + i18n( "days" ));
114 TimeString.append( "3 " + i18n( "days" ));
115 TimeString.append( "5 " + i18n( "days" ));
116 TimeString.append( "1 " + i18n( "week" ));
117 TimeString.append( "2 " + i18n( "weeks", "wks" ));
118 TimeString.append( "3 " + i18n( "weeks", "wks" ));
119 TimeString.append( "1 " + i18n( "month" ));
120 TimeString.append( "2 " + i18n( "months", "mths" ));
121 TimeString.append( "3 " + i18n( "months", "mths" ));
122 TimeString.append( "4 " + i18n( "months", "mths" ));
123 TimeString.append( "6 " + i18n( "months", "mths" ));
124 TimeString.append( "9 " + i18n( "months", "mths" ));
125 TimeString.append( "1 " + i18n( "year" ));
126 TimeString.append( "2 " + i18n( "years", "yrs" ));
127 TimeString.append( "3 " + i18n( "years", "yrs" ));
128 TimeString.append( "5 " + i18n( "years", "yrs" ));
129 TimeString.append( "10 " + i18n( "years", "yrs" ));
130 TimeString.append( "25 " + i18n( "years", "yrs" ));
131 TimeString.append( "50 " + i18n( "years", "yrs" ));
132 TimeString.append( "100 " + i18n( "years", "yrs" ));
134 connect( this, SIGNAL( valueChanged( int ) ), this, SLOT( reportChange() ) );
135 updateDisplay();
138 int TimeSpinBox::mapTextToValue( bool *ok ) {
139 *ok = true;
140 for ( unsigned int i=0; i<42; ++i ) {
141 if ( text() == TimeString[i] ) { return i; }
142 if ( text().mid(1,text().length()) == TimeString[i] ) { return -1*i; }
145 *ok = false;
146 return 0;
149 QString TimeSpinBox::mapValueToText( int value ) {
150 QString neg("-"), result;
151 int posval( abs( value ) );
153 result = TimeString[ posval ];
155 if ( value<0 ) { result = "-" + result; }
156 return result;
159 void TimeSpinBox::changeScale( float x ) {
160 //Pick the closest value
161 int imin = 0;
162 float dx, dxlast(10000000000.0), dxmin(10000000000.0);
163 for ( unsigned int i=0; i<42; ++i ) {
164 dx = fabs( TimeScale[i] - fabs(x) );
165 if ( dx < dxmin ) { imin = i; dxmin = dx; }
166 if ( dx > dxlast ) break; //we have passed the minimum dx
167 dxlast = dx;
170 if ( x < 0.0 ) imin *= -1;
171 setValue( imin );
174 float TimeSpinBox::timeScale( void ) const {
175 return value() > 0 ? TimeScale[ value() ] : -1.*TimeScale[ abs(value()) ];
178 void TimeSpinBox::reportChange() {
179 kdDebug() << i18n( "Reporting new timestep value: " ) << timeScale() << endl;
180 emit scaleChanged( timeScale() );
183 #include "timespinbox.moc"