• Skip to content
  • Skip to link menu
KDE 3.5 API Reference
  • KDE API Reference
  • API Reference
  • Sitemap
  • Contact Us
 

kstars

timespinbox.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002                           timespinbox.cpp  -  description
00003                              -------------------
00004     begin                : Sun Mar 31 2002
00005     copyright            : (C) 2002 by Jason Harris
00006     email                : kstars@30doradus.org
00007  ***************************************************************************/
00008 
00009 /***************************************************************************
00010  *                                                                         *
00011  *   This program is free software; you can redistribute it and/or modify  *
00012  *   it under the terms of the GNU General Public License as published by  *
00013  *   the Free Software Foundation; either version 2 of the License, or     *
00014  *   (at your option) any later version.                                   *
00015  *                                                                         *
00016  ***************************************************************************/
00017 
00018 //Time steps:
00019 //0-9:   0 sec, 0.1, 0.25, 0.5, 1, 2, 5, 10, 20, 30 sec
00020 //10-14: 1 minute, 2, 5, 10, 15, 30 min
00021 //15-19: 1 hour, 2, 4, 6, 12 hours
00022 //20-23: 1 day, 2, 3, 5 days
00023 //24-26: 1 week, 2, 3 weeks
00024 //27-32: 1 month, 2, 3, 4, 6, 9 months
00025 //33-41: 1 year, 2, 3, 4, 5, 10, 25, 50, 100 years
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 /* step */, parent, name )
00042 {
00043     setValidator( 0 );
00044     setButtonSymbols( QSpinBox::PlusMinus );
00045     editor()->setReadOnly( true );
00046     setValue( 4 ); //1 second (real time)
00047     setDaysOnly( _daysonly );
00048 
00049     //Set width:
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; //index for TimeScale values
00067     TimeScale[0] = 0.0;          // 0.0 sec
00068     if ( ! daysOnly() ) {
00069         TimeScale[1] = 0.1;          // 0.1 sec
00070         TimeScale[2] = 0.25;         // 0.25 sec
00071         TimeScale[3] = 0.5;          // 0.5 sec 
00072         TimeScale[4] = 1.0;          // 1 sec (real-time)
00073         TimeScale[5] = 2.0;          // 2 sec
00074         TimeScale[6] = 5.0;          // 5 sec
00075         TimeScale[7] = 10.0;         // 10 sec
00076         TimeScale[8] = 20.0;         // 20 sec
00077         TimeScale[9] = 30.0;         // 30 sec
00078         TimeScale[10] = 60.0;        // 1 min
00079         TimeScale[11] = 120.0;       // 2 min
00080         TimeScale[12] = 300.0;       // 5 min
00081         TimeScale[13] = 600.0;       // 10 min
00082         TimeScale[14] = 900.0;       // 15 min
00083         TimeScale[15] = 1800.0;      // 30 min
00084         TimeScale[16] = 3600.0;      // 1 hr
00085         TimeScale[17] = 7200.0;      // 2 hr
00086         TimeScale[18] = 10800.0;     // 3 hr
00087         TimeScale[19] = 21600.0;     // 6 hr
00088         TimeScale[20] = 43200.0;     // 12 hr
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;     // 1 day
00097     TimeScale[i+2] = 2.*SECS_PER_DAY;  // 2 days
00098     TimeScale[i+3] = 3.*SECS_PER_DAY;  // 3 days
00099     TimeScale[i+4] = 5.*SECS_PER_DAY;  // 5 days
00100     TimeScale[i+5] = 7.*SECS_PER_DAY;  // 1 week
00101     TimeScale[i+6] = 14.*SECS_PER_DAY; //2 weeks
00102     TimeScale[i+7] = 21.*SECS_PER_DAY; //3 weeks    
00103 //Months aren't a simple measurement of time; I'll just use fractions of a year
00104     TimeScale[i+8] = SIDEREAL_YEAR/12.0; // 1 month
00105     TimeScale[i+9] = SIDEREAL_YEAR/6.0;  // 2 months
00106     TimeScale[i+10] = 0.25*SIDEREAL_YEAR; // 3 months
00107     TimeScale[i+11] = SIDEREAL_YEAR/3.0;  // 4 months
00108     TimeScale[i+12] = 0.5*SIDEREAL_YEAR;  // 6 months
00109     TimeScale[i+13] = 0.75*SIDEREAL_YEAR; // 9 months
00110     TimeScale[i+14] = SIDEREAL_YEAR;       // 1 year
00111     TimeScale[i+15] = 2.0*SIDEREAL_YEAR;   // 2 years
00112     TimeScale[i+16] = 3.0*SIDEREAL_YEAR;   // 3 years
00113     TimeScale[i+17] = 5.0*SIDEREAL_YEAR;   // 5 years
00114     TimeScale[i+18] = 10.0*SIDEREAL_YEAR;  // 10 years
00115     TimeScale[i+19] = 25.0*SIDEREAL_YEAR;  // 25 years
00116     TimeScale[i+20] = 50.0*SIDEREAL_YEAR;  // 50 years
00117     TimeScale[i+21] = 100.0*SIDEREAL_YEAR; // 100 years
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     //Pick the closest value
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; //we have passed the minimum dx
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"

kstars

Skip menu "kstars"
  • Main Page
  • Modules
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Class Members
  • Related Pages

API Reference

Skip menu "API Reference"
  • keduca
  • kstars
Generated for API Reference by doxygen 1.5.9
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal