• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

kstars

  • sources
  • kde-4.12
  • kdeedu
  • kstars
  • kstars
  • widgets
timespinbox.cpp
Go to the documentation of this file.
1 
2 /***************************************************************************
3  timespinbox.cpp - description
4  -------------------
5  begin : Sun Mar 31 2002
6  copyright : (C) 2002 by Jason Harris
7  email : kstars@30doradus.org
8  ***************************************************************************/
9 
10 /***************************************************************************
11  * *
12  * This program is free software; you can redistribute it and/or modify *
13  * it under the terms of the GNU General Public License as published by *
14  * the Free Software Foundation; either version 2 of the License, or *
15  * (at your option) any later version. *
16  * *
17  ***************************************************************************/
18 
19 #include "timespinbox.h"
20 
21 #include <cstdlib>
22 #include <cmath>
23 
24 #include <QFontMetrics>
25 #include <QLineEdit>
26 
27 #include <kdebug.h>
28 #include <klocale.h>
29 
30 #define SECS_PER_DAY 86400.
31 #define SIDEREAL_YEAR 31558149.77
32 #define TROPICAL_YEAR 31556925.19
33 
34 //Time steps:
35 //0-9: 0 sec, 0.1, 0.25, 0.5, 1, 2, 5, 10, 20, 30 sec
36 //10-14: 1 minute, 2, 5, 10, 15, 30 min
37 //15-19: 1 hour, 2, 4, 6, 12 hours
38 //20-23: 1 day, 2, 3, 5 days
39 //24-26: 1 week, 2, 3 weeks
40 //27-32: 1 month, 2, 3, 4, 6, 9 months
41 //33-41: 1 year, 2, 3, 4, 5, 10, 25, 50, 100 years
42 
43 TimeSpinBox::TimeSpinBox( QWidget *parent, bool _daysonly )
44  : KIntSpinBox ( parent )
45 {
46  setDaysOnly( _daysonly );
47 
48  setMinimum( -41 );
49  setMaximum( 41 );
50  setSingleStep( 1 );
51 
52  setButtonSymbols( QSpinBox::PlusMinus );
53  lineEdit()->setReadOnly( true );
54  setValue( 4 ); //1 second (real time)
55 
56  //Set width:
57  QFontMetrics fm( font() );
58  int extra = width() - lineEdit()->width();
59  uint wmax = 0;
60  for ( int i=0; i < maximum(); ++i ) {
61  uint w = fm.width( '-' + TimeString[i] );
62  if ( w > wmax ) wmax = w;
63  }
64  setFixedWidth( wmax + extra );
65 
66  connect( this, SIGNAL( valueChanged( int ) ), this, SLOT( reportChange() ) );
67  // updateDisplay();
68 }
69 
70 void TimeSpinBox::setDaysOnly( bool daysonly ) {
71  DaysOnly = daysonly;
72 
73  int i=0; //index for TimeScale values
74  TimeScale[0] = 0.0; // 0.0 sec
75  if ( ! daysOnly() ) {
76  TimeScale[1] = 0.1; // 0.1 sec
77  TimeScale[2] = 0.25; // 0.25 sec
78  TimeScale[3] = 0.5; // 0.5 sec
79  TimeScale[4] = 1.0; // 1 sec (real-time)
80  TimeScale[5] = 2.0; // 2 sec
81  TimeScale[6] = 5.0; // 5 sec
82  TimeScale[7] = 10.0; // 10 sec
83  TimeScale[8] = 20.0; // 20 sec
84  TimeScale[9] = 30.0; // 30 sec
85  TimeScale[10] = 60.0; // 1 min
86  TimeScale[11] = 120.0; // 2 min
87  TimeScale[12] = 300.0; // 5 min
88  TimeScale[13] = 600.0; // 10 min
89  TimeScale[14] = 900.0; // 15 min
90  TimeScale[15] = 1800.0; // 30 min
91  TimeScale[16] = 3600.0; // 1 hr
92  TimeScale[17] = 7200.0; // 2 hr
93  TimeScale[18] = 10800.0; // 3 hr
94  TimeScale[19] = 21600.0; // 6 hr
95  TimeScale[20] = 43200.0; // 12 hr
96  i = 20;
97  }
98  TimeScale[i+1] = 86164.1; // 23 hr 56 min
99  TimeScale[i+2] = SECS_PER_DAY; // 1 day
100  TimeScale[i+3] = 2.*SECS_PER_DAY; // 2 days
101  TimeScale[i+4] = 3.*SECS_PER_DAY; // 3 days
102  TimeScale[i+5] = 5.*SECS_PER_DAY; // 5 days
103  TimeScale[i+6] = 7.*SECS_PER_DAY; // 1 week
104  TimeScale[i+7] = 14.*SECS_PER_DAY; //2 weeks
105  TimeScale[i+8] = 21.*SECS_PER_DAY; //3 weeks
106  //Months aren't a simple measurement of time; I'll just use fractions of a year
107  TimeScale[i+9] = SIDEREAL_YEAR/12.0; // 1 month
108  TimeScale[i+10] = SIDEREAL_YEAR/6.0; // 2 months
109  TimeScale[i+11] = 0.25*SIDEREAL_YEAR; // 3 months
110  TimeScale[i+12] = SIDEREAL_YEAR/3.0; // 4 months
111  TimeScale[i+13] = 0.5*SIDEREAL_YEAR; // 6 months
112  TimeScale[i+14] = 0.75*SIDEREAL_YEAR; // 9 months
113  TimeScale[i+15] = SIDEREAL_YEAR; // 1 year
114  TimeScale[i+16] = 2.0*SIDEREAL_YEAR; // 2 years
115  TimeScale[i+17] = 3.0*SIDEREAL_YEAR; // 3 years
116  TimeScale[i+18] = 5.0*SIDEREAL_YEAR; // 5 years
117  TimeScale[i+19] = 10.0*SIDEREAL_YEAR; // 10 years
118  TimeScale[i+20] = 25.0*SIDEREAL_YEAR; // 25 years
119  TimeScale[i+21] = 50.0*SIDEREAL_YEAR; // 50 years
120  TimeScale[i+22] = 100.0*SIDEREAL_YEAR; // 100 years
121 
122  TimeString.clear();
123  if ( ! daysOnly() ) {
124  TimeString.append( "0 " + i18nc( "seconds", "secs" ));
125  TimeString.append( "0.1 " + i18nc( "seconds", "secs" ));
126  TimeString.append( "0.25 " + i18nc( "seconds", "secs" ));
127  TimeString.append( "0.5 " + i18nc( "seconds", "secs" ));
128  TimeString.append( "1 " + i18nc( "second", "sec" ));
129  TimeString.append( "2 " + i18nc( "seconds", "secs" ));
130  TimeString.append( "5 " + i18nc( "seconds", "secs" ));
131  TimeString.append( "10 " + i18nc( "seconds", "secs" ));
132  TimeString.append( "20 " + i18nc( "seconds", "secs" ));
133  TimeString.append( "30 " + i18nc( "seconds", "secs" ));
134  TimeString.append( "1 " + i18nc( "minute", "min" ));
135  TimeString.append( "2 " + i18nc( "minutes", "mins" ));
136  TimeString.append( "5 " + i18nc( "minutes", "mins" ));
137  TimeString.append( "10 " + i18nc( "minutes", "mins" ));
138  TimeString.append( "15 " + i18nc( "minutes", "mins" ));
139  TimeString.append( "30 " + i18nc( "minutes", "mins" ));
140  TimeString.append( "1 " + i18n( "hour" ));
141  TimeString.append( "2 " + i18nc( "hours", "hrs" ));
142  TimeString.append( "3 " + i18nc( "hours", "hrs" ));
143  TimeString.append( "6 " + i18nc( "hours", "hrs" ));
144  TimeString.append( "12 " + i18nc( "hours", "hrs" ));
145  } else {
146  TimeString.append( "0 " + i18n( "days" ));
147  }
148  TimeString.append( "1 " + i18nc( "sidereal day", "sid day" ));
149  TimeString.append( "1 " + i18n( "day" ));
150  TimeString.append( "2 " + i18n( "days" ));
151  TimeString.append( "3 " + i18n( "days" ));
152  TimeString.append( "5 " + i18n( "days" ));
153  TimeString.append( "1 " + i18n( "week" ));
154  TimeString.append( "2 " + i18nc( "weeks", "wks" ));
155  TimeString.append( "3 " + i18nc( "weeks", "wks" ));
156  TimeString.append( "1 " + i18n( "month" ));
157  TimeString.append( "2 " + i18nc( "months", "mths" ));
158  TimeString.append( "3 " + i18nc( "months", "mths" ));
159  TimeString.append( "4 " + i18nc( "months", "mths" ));
160  TimeString.append( "6 " + i18nc( "months", "mths" ));
161  TimeString.append( "9 " + i18nc( "months", "mths" ));
162  TimeString.append( "1 " + i18n( "year" ));
163  TimeString.append( "2 " + i18nc( "years", "yrs" ));
164  TimeString.append( "3 " + i18nc( "years", "yrs" ));
165  TimeString.append( "5 " + i18nc( "years", "yrs" ));
166  TimeString.append( "10 " + i18nc( "years", "yrs" ));
167  TimeString.append( "25 " + i18nc( "years", "yrs" ));
168  TimeString.append( "50 " + i18nc( "years", "yrs" ));
169  TimeString.append( "100 " + i18nc( "years", "yrs" ));
170 
171  if ( ! daysOnly() ) {
172  setMinimum( -41 );
173  setMaximum( 41 );
174  } else {
175  setMinimum( -21 );
176  setMaximum( 21 );
177  }
178 }
179 
180 int TimeSpinBox::valueFromText( const QString &text ) const {
181  for ( int i=0; i<TimeString.size(); i++ ) {
182  if ( text == TimeString[i] ) { return i; }
183  if ( text.mid(1,text.length()) == TimeString[i] ) { return -1*i; }
184  }
185 
186  return 0;
187 }
188 
189 QString TimeSpinBox::textFromValue( int value ) const {
190  QString neg("-"), result;
191  int posval( abs( value ) );
192  if ( posval > TimeString.size() - 1 ) posval = 4;
193 
194  result = TimeString[ posval ];
195 
196 if ( value<0 ) { result = '-' + result; }
197  return result;
198 }
199 
200 void TimeSpinBox::changeScale( float x ) {
201  //Pick the closest value
202  int imin = 0;
203  float dx, dxlast(10000000000.0), dxmin(10000000000.0);
204  for ( unsigned int i=0; i<42; ++i ) {
205  dx = fabs( TimeScale[i] - fabs(x) );
206  if ( dx < dxmin ) { imin = i; dxmin = dx; }
207  if ( dx > dxlast ) break; //we have passed the minimum dx
208  dxlast = dx;
209  }
210 
211  if ( x < 0.0 ) imin *= -1;
212  setValue( imin );
213 }
214 
215 float TimeSpinBox::timeScale( void ) const {
216  return value() > 0 ? TimeScale[ value() ] : -1.*TimeScale[ abs(value()) ];
217 }
218 
219 void TimeSpinBox::reportChange() {
220  kDebug() << i18n( "Reporting new timestep value: " ) << timeScale();
221  emit scaleChanged( timeScale() );
222 }
223 
224 #include "timespinbox.moc"
TimeSpinBox::timeScale
float timeScale() const
Definition: timespinbox.cpp:215
QWidget
TimeSpinBox::valueFromText
virtual int valueFromText(const QString &text) const
Convert the displayed string to an internal value.
Definition: timespinbox.cpp:180
TimeSpinBox::setDaysOnly
void setDaysOnly(bool daysonly)
Definition: timespinbox.cpp:70
SIDEREAL_YEAR
#define SIDEREAL_YEAR
Definition: timespinbox.cpp:31
TimeSpinBox::textFromValue
virtual QString textFromValue(int value) const
Convert the internal value to a display string.
Definition: timespinbox.cpp:189
i18nc
i18nc("string from libindi, used in the config dialog","100x")
TimeSpinBox::daysOnly
bool daysOnly() const
Definition: timespinbox.h:58
SECS_PER_DAY
#define SECS_PER_DAY
Definition: timespinbox.cpp:30
KIntSpinBox
TimeSpinBox::TimeSpinBox
TimeSpinBox(QWidget *parent, bool daysOnly=false)
Constructor.
Definition: timespinbox.cpp:43
TimeSpinBox::scaleChanged
void scaleChanged(float s)
TimeSpinBox::changeScale
void changeScale(float s)
Definition: timespinbox.cpp:200
TimeSpinBox::reportChange
void reportChange()
Definition: timespinbox.cpp:219
timespinbox.h
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:36:21 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kstars

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

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • kstars
  • libkdeedu
  •   keduvocdocument
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal