00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include <qlineedit.h>
00028 #include <qfontmetrics.h>
00029 #include <kdebug.h>
00030 #include <klocale.h>
00031 #include <stdlib.h>
00032 #include <math.h>
00033
00034 #include "timespinbox.h"
00035
00036 #define SECS_PER_DAY 86400.
00037 #define SIDEREAL_YEAR 31558149.77
00038 #define TROPICAL_YEAR 31556925.19
00039
00040 TimeSpinBox::TimeSpinBox( QWidget *parent, const char *name, bool _daysonly )
00041 : QSpinBox ( -41, 41, 1 , parent, name )
00042 {
00043 setValidator( 0 );
00044 setButtonSymbols( QSpinBox::PlusMinus );
00045 editor()->setReadOnly( true );
00046 setValue( 4 );
00047 setDaysOnly( _daysonly );
00048
00049
00050 QFontMetrics fm( font() );
00051 int extra = width() - editor()->width();
00052 uint wmax = 0;
00053 for ( int i=0; i < maxValue(); ++i ) {
00054 uint w = fm.width( "-" + TimeString[i] );
00055 if ( w > wmax ) wmax = w;
00056 }
00057 setFixedWidth( wmax + extra );
00058
00059 connect( this, SIGNAL( valueChanged( int ) ), this, SLOT( reportChange() ) );
00060 updateDisplay();
00061 }
00062
00063 void TimeSpinBox::setDaysOnly( bool daysonly ) {
00064 DaysOnly = daysonly;
00065
00066 int i=0;
00067 TimeScale[0] = 0.0;
00068 if ( ! daysOnly() ) {
00069 TimeScale[1] = 0.1;
00070 TimeScale[2] = 0.25;
00071 TimeScale[3] = 0.5;
00072 TimeScale[4] = 1.0;
00073 TimeScale[5] = 2.0;
00074 TimeScale[6] = 5.0;
00075 TimeScale[7] = 10.0;
00076 TimeScale[8] = 20.0;
00077 TimeScale[9] = 30.0;
00078 TimeScale[10] = 60.0;
00079 TimeScale[11] = 120.0;
00080 TimeScale[12] = 300.0;
00081 TimeScale[13] = 600.0;
00082 TimeScale[14] = 900.0;
00083 TimeScale[15] = 1800.0;
00084 TimeScale[16] = 3600.0;
00085 TimeScale[17] = 7200.0;
00086 TimeScale[18] = 10800.0;
00087 TimeScale[19] = 21600.0;
00088 TimeScale[20] = 43200.0;
00089 setMinValue( -41 );
00090 setMaxValue( 41 );
00091 i = 20;
00092 } else {
00093 setMinValue( -21 );
00094 setMaxValue( 21 );
00095 }
00096 TimeScale[i+1] = SECS_PER_DAY;
00097 TimeScale[i+2] = 2.*SECS_PER_DAY;
00098 TimeScale[i+3] = 3.*SECS_PER_DAY;
00099 TimeScale[i+4] = 5.*SECS_PER_DAY;
00100 TimeScale[i+5] = 7.*SECS_PER_DAY;
00101 TimeScale[i+6] = 14.*SECS_PER_DAY;
00102 TimeScale[i+7] = 21.*SECS_PER_DAY;
00103
00104 TimeScale[i+8] = SIDEREAL_YEAR/12.0;
00105 TimeScale[i+9] = SIDEREAL_YEAR/6.0;
00106 TimeScale[i+10] = 0.25*SIDEREAL_YEAR;
00107 TimeScale[i+11] = SIDEREAL_YEAR/3.0;
00108 TimeScale[i+12] = 0.5*SIDEREAL_YEAR;
00109 TimeScale[i+13] = 0.75*SIDEREAL_YEAR;
00110 TimeScale[i+14] = SIDEREAL_YEAR;
00111 TimeScale[i+15] = 2.0*SIDEREAL_YEAR;
00112 TimeScale[i+16] = 3.0*SIDEREAL_YEAR;
00113 TimeScale[i+17] = 5.0*SIDEREAL_YEAR;
00114 TimeScale[i+18] = 10.0*SIDEREAL_YEAR;
00115 TimeScale[i+19] = 25.0*SIDEREAL_YEAR;
00116 TimeScale[i+20] = 50.0*SIDEREAL_YEAR;
00117 TimeScale[i+21] = 100.0*SIDEREAL_YEAR;
00118
00119 TimeString.clear();
00120 if ( ! daysOnly() ) {
00121 TimeString.append( "0 " + i18n( "seconds", "secs" ));
00122 TimeString.append( "0.1 " + i18n( "seconds", "secs" ));
00123 TimeString.append( "0.25 " + i18n( "seconds", "secs" ));
00124 TimeString.append( "0.5 " + i18n( "seconds", "secs" ));
00125 TimeString.append( "1 " + i18n( "second", "sec" ));
00126 TimeString.append( "2 " + i18n( "seconds", "secs" ));
00127 TimeString.append( "5 " + i18n( "seconds", "secs" ));
00128 TimeString.append( "10 " + i18n( "seconds", "secs" ));
00129 TimeString.append( "20 " + i18n( "seconds", "secs" ));
00130 TimeString.append( "30 " + i18n( "seconds", "secs" ));
00131 TimeString.append( "1 " + i18n( "minute", "min" ));
00132 TimeString.append( "2 " + i18n( "minutes", "mins" ));
00133 TimeString.append( "5 " + i18n( "minutes", "mins" ));
00134 TimeString.append( "10 " + i18n( "minutes", "mins" ));
00135 TimeString.append( "15 " + i18n( "minutes", "mins" ));
00136 TimeString.append( "30 " + i18n( "minutes", "mins" ));
00137 TimeString.append( "1 " + i18n( "hour" ));
00138 TimeString.append( "2 " + i18n( "hours", "hrs" ));
00139 TimeString.append( "3 " + i18n( "hours", "hrs" ));
00140 TimeString.append( "6 " + i18n( "hours", "hrs" ));
00141 TimeString.append( "12 " + i18n( "hours", "hrs" ));
00142 } else {
00143 TimeString.append( "0 " + i18n( "days" ));
00144 }
00145 TimeString.append( "1 " + i18n( "day" ));
00146 TimeString.append( "2 " + i18n( "days" ));
00147 TimeString.append( "3 " + i18n( "days" ));
00148 TimeString.append( "5 " + i18n( "days" ));
00149 TimeString.append( "1 " + i18n( "week" ));
00150 TimeString.append( "2 " + i18n( "weeks", "wks" ));
00151 TimeString.append( "3 " + i18n( "weeks", "wks" ));
00152 TimeString.append( "1 " + i18n( "month" ));
00153 TimeString.append( "2 " + i18n( "months", "mths" ));
00154 TimeString.append( "3 " + i18n( "months", "mths" ));
00155 TimeString.append( "4 " + i18n( "months", "mths" ));
00156 TimeString.append( "6 " + i18n( "months", "mths" ));
00157 TimeString.append( "9 " + i18n( "months", "mths" ));
00158 TimeString.append( "1 " + i18n( "year" ));
00159 TimeString.append( "2 " + i18n( "years", "yrs" ));
00160 TimeString.append( "3 " + i18n( "years", "yrs" ));
00161 TimeString.append( "5 " + i18n( "years", "yrs" ));
00162 TimeString.append( "10 " + i18n( "years", "yrs" ));
00163 TimeString.append( "25 " + i18n( "years", "yrs" ));
00164 TimeString.append( "50 " + i18n( "years", "yrs" ));
00165 TimeString.append( "100 " + i18n( "years", "yrs" ));
00166 }
00167
00168 int TimeSpinBox::mapTextToValue( bool *ok ) {
00169 *ok = true;
00170 for ( unsigned int i=0; i<42; ++i ) {
00171 if ( text() == TimeString[i] ) { return i; }
00172 if ( text().mid(1,text().length()) == TimeString[i] ) { return -1*i; }
00173 }
00174
00175 *ok = false;
00176 return 0;
00177 }
00178
00179 QString TimeSpinBox::mapValueToText( int value ) {
00180 QString neg("-"), result;
00181 int posval( abs( value ) );
00182
00183 result = TimeString[ posval ];
00184
00185 if ( value<0 ) { result = "-" + result; }
00186 return result;
00187 }
00188
00189 void TimeSpinBox::changeScale( float x ) {
00190
00191 int imin = 0;
00192 float dx, dxlast(10000000000.0), dxmin(10000000000.0);
00193 for ( unsigned int i=0; i<42; ++i ) {
00194 dx = fabs( TimeScale[i] - fabs(x) );
00195 if ( dx < dxmin ) { imin = i; dxmin = dx; }
00196 if ( dx > dxlast ) break;
00197 dxlast = dx;
00198 }
00199
00200 if ( x < 0.0 ) imin *= -1;
00201 setValue( imin );
00202 }
00203
00204 float TimeSpinBox::timeScale( void ) const {
00205 return value() > 0 ? TimeScale[ value() ] : -1.*TimeScale[ abs(value()) ];
00206 }
00207
00208 void TimeSpinBox::reportChange() {
00209 kdDebug() << i18n( "Reporting new timestep value: " ) << timeScale() << endl;
00210 emit scaleChanged( timeScale() );
00211 }
00212
00213 #include "timespinbox.moc"