21 #include <KPlotObject>
29 #define BIGTICKSIZE 10
30 #define SMALLTICKSIZE 4
37 setAntialiasing(
true );
41 setRightPadding( 100 );
53 p.setRenderHint( QPainter::Antialiasing, antialiasing() );
54 p.fillRect( rect(), backgroundColor() );
55 p.translate( leftPadding(), topPadding() );
58 p.setClipRect( pixRect() );
59 p.setClipping(
true );
63 foreach ( KPlotObject *po, plotObjects() ) {
67 p.setClipping(
false );
74 SkyCalendar *skycal = (SkyCalendar*)topLevelWidget();
75 KStarsDateTime kdt( QDate( skycal->year(), 1, 1 ), QTime( 12, 0, 0 ) );
88 while ( skycal->year() == kdt.date().year() ) {
89 QTime tmp_rTime = thesun.
riseSetTime( kdt.djd() + 1.0, skycal->get_geo(),
true, true );
90 QTime tmp_sTime = thesun.
riseSetTime( kdt.djd(), skycal->get_geo(),
false, true );
96 if ( tmp_rTime == tmp_sTime ) {
102 if ( tmp_rTime.isValid() && tmp_sTime.isValid() ) {
104 QTime midday( 12, 0, 0 );
105 rTime = tmp_rTime.secsTo( midday ) * 24.0 / 86400.0;
106 sTime = tmp_sTime.secsTo( midday ) * 24.0 / 86400.0;
108 if ( tmp_rTime <= midday )
109 rTime = 12.0 - rTime;
111 rTime = -12.0 - rTime;
113 if ( tmp_sTime <= midday )
114 sTime = 12.0 - sTime;
116 sTime = -12.0 - sTime;
122 if ( thesun.
transitAltitude( kdt.djd(), skycal->get_geo() ).degree() > 0 ) {
132 if ( rTime > maxRTime )
134 if ( sTime < minSTime )
138 dateList.append( kdt.date() );
139 riseTimeList.append( rTime );
140 setTimeList.append( sTime );
143 kdt = kdt.addDays( skycal->scUI->spinBox_Interval->value() );
147 maxRTime = ceil( maxRTime ) + 1.0;
148 if ( (
int) maxRTime % 2 != 0 )
150 if ( maxRTime > 12.0 )
152 minSTime = floor( minSTime ) - 1.0;
153 if ( (
int) minSTime % 2 != 0 )
155 if ( minSTime < -12.0 )
157 setLimits( minSTime, maxRTime, 0.0, 366.0 );
161 void CalendarWidget::drawHorizon( QPainter *p ) {
165 for (
int date=0; date<dateList.size(); date++ ) {
166 int day = dateList.at( date ).daysInYear() - dateList.at( date ).dayOfYear();
167 polySunRise << mapToWidget( QPointF( riseTimeList.at( date ), day ) );
168 polySunSet << mapToWidget( QPointF( setTimeList.at( date ), day ) );
172 polySunRise << mapToWidget( QPointF( riseTimeList.last(), dataRect().top() ) )
173 << mapToWidget( QPointF( dataRect().right(), dataRect().top() ) )
174 << mapToWidget( QPointF( dataRect().right(), dataRect().bottom() ) )
175 << mapToWidget( QPointF( riseTimeList.first(), dataRect().bottom() ) );
176 polySunSet << mapToWidget( QPointF( setTimeList.last(), dataRect().top() ) )
177 << mapToWidget( QPointF( dataRect().left(), pixRect().top() ) )
178 << mapToWidget( QPointF( dataRect().left(), pixRect().bottom() ) )
179 << mapToWidget( QPointF( setTimeList.first(), dataRect().bottom() ) );
181 p->setPen( Qt::darkGreen );
182 p->setBrush( Qt::darkGreen );
183 p->drawPolygon( polySunRise );
184 p->drawPolygon( polySunSet );
187 void CalendarWidget::drawAxes( QPainter *p ) {
188 SkyCalendar *skycal = (SkyCalendar*)topLevelWidget();
190 p->setPen( foregroundColor() );
191 p->setBrush( Qt::NoBrush );
194 p->drawRect( pixRect() );
198 int s = f.pointSize();
199 f.setPointSize( s - 2 );
205 pixRect().width(), pixRect().height(),
206 Qt::AlignHCenter | Qt::AlignTop | Qt::TextDontClip,
207 i18n(
"Local time" ) );
211 pixRect().width(), pixRect().height() + 35,
212 Qt::AlignHCenter | Qt::AlignBottom | Qt::TextDontClip,
213 i18n(
"Universal time" ) );
219 pixRect().height(), leftPadding() -5,
220 Qt::AlignHCenter | Qt::AlignBottom | Qt::TextDontClip,
223 p->translate( 0.0, -1 * frameRect().width() + 30 );
226 pixRect().height(), leftPadding() -5,
227 Qt::AlignHCenter | Qt::AlignBottom | Qt::TextDontClip,
228 i18n(
"Julian date" ) );
232 for (
float xx = minSTime; xx <= maxRTime; xx += 1.0 ) {
234 if ( h < 0 ) h += 24;
235 QTime time( h, 0, 0 );
236 QString sTime = KGlobal::locale()->formatLocaleTime( time, KLocale::TimeWithoutSeconds );
237 QString sUtTime = KGlobal::locale()->formatLocaleTime( time.addSecs( skycal->get_geo()->TZ() * -3600 ), KLocale::TimeWithoutSeconds );
240 QPointF pBottomTick = mapToWidget( QPointF( xx, dataRect().y() ) );
241 QPointF pTopTick = QPointF( pBottomTick.x(), 0.0 );
244 p->drawLine( pBottomTick, QPointF( pBottomTick.x(), pBottomTick.y() -
SMALLTICKSIZE ) );
246 p->drawLine( pTopTick, QPointF( pTopTick.x(), pTopTick.y() +
SMALLTICKSIZE ) );
249 p->drawLine( pBottomTick, QPointF( pBottomTick.x(), pBottomTick.y() -
BIGTICKSIZE ) );
251 p->drawText( r, Qt::AlignCenter | Qt::TextDontClip, sUtTime );
253 p->drawLine( pTopTick, QPointF( pTopTick.x(), pTopTick.y() +
BIGTICKSIZE ) );
254 r.moveTop( -2.0*BIGTICKSIZE );
255 p->drawText( r, Qt::AlignCenter | Qt::TextDontClip, sTime );
259 if ( skycal->scUI->checkBox_GridVertical->isChecked() ) {
260 QColor c = p->pen().color();
263 p->drawLine( pTopTick, pBottomTick );
270 int y = skycal->year();
271 for (
int imonth=2; imonth <= 12; ++imonth ) {
272 QDate dt( y, imonth, 1 );
273 float doy = float( dt.daysInYear() - dt.dayOfYear() );
276 QPointF pMonthTick = mapToWidget( QPointF( dataRect().x(), doy ) );
277 p->drawLine( pMonthTick, QPointF( pMonthTick.x() +
BIGTICKSIZE, pMonthTick.y() ) );
281 mapToWidget( QPointF( 0.0,
float( dt.daysInYear() - dt.addMonths( -1 ).dayOfYear() ) ) ),
282 mapToWidget( QPointF( dataRect().left() - 0.1, doy ) ) );
283 p->drawText( rMonth, Qt::AlignRight|Qt::AlignVCenter|Qt::TextDontClip, QDate::shortMonthName( imonth - 1 ) );
284 if ( imonth == 12 ) {
286 mapToWidget( QPointF( 0.0, doy ) ),
287 mapToWidget( QPointF( dataRect().left() - 0.1, 0.0 ) ) );
288 p->drawText( rMonth, Qt::AlignRight|Qt::AlignVCenter|Qt::TextDontClip, QDate::shortMonthName( imonth ) );
292 if ( skycal->scUI->checkBox_GridMonths->isChecked() ) {
293 QColor c = p->pen().color();
296 p->drawLine( pMonthTick, QPointF( pixRect().right(), pMonthTick.y() ) );
303 QFont origFont = p->font();
304 p->setFont( QFont(
"Monospace", origFont.pointSize() - 1 ) );
306 kdt.date().year() == y;
307 kdt = kdt.
addDays( skycal->scUI->spinBox_Interval->value() > 7 ? skycal->scUI->spinBox_Interval->value() : 7 ) )
310 float doy = float( kdt.date().daysInYear() - kdt.date().dayOfYear() );
311 QPointF pWeekTick = mapToWidget( QPointF( dataRect().right(), doy ) );
312 p->drawLine( pWeekTick, QPointF( pWeekTick.x() -
BIGTICKSIZE, pWeekTick.y() ) );
316 mapToWidget( QPointF( dataRect().right() + 0.1, doy + 2 ) ),
317 mapToWidget( QPointF( dataRect().right(), doy ) ) );
320 Qt::AlignLeft|Qt::AlignVCenter|Qt::TextDontClip,
321 QString().setNum(
double( kdt.djd() ),
'f', 1 ) );
324 if ( skycal->scUI->checkBox_GridWeeks->isChecked() ) {
325 QColor c = p->pen().color();
328 p->drawLine( pWeekTick, QPointF( pixRect().left(), pWeekTick.y() ) );
335 if ( skycal->scUI->checkBox_GridToday->isChecked() ) {
336 p->setPen( QColor( Qt::yellow) );
337 QDate today = QDate::currentDate();
338 float doy = float( today.daysInYear() - today.dayOfYear() );
340 mapToWidget( QPointF( dataRect().left(), doy ) ),
341 mapToWidget( QPointF( dataRect().right(), doy ) )
344 mapToWidget( QPointF( dataRect().left() + 0.1, doy + 2.0 ) ),
418 p->setFont( origFont );
421 #include "calendarwidget.moc"
dms transitAltitude(const KStarsDateTime &dt, const GeoLocation *geo)
Child class of KSPlanetBase; encapsulates information about the Sun.
KStarsDateTime addDays(int nd) const
Modify the Date/Time by adding a number of days.
QTime riseSetTime(const KStarsDateTime &dt, const GeoLocation *geo, bool rst, bool exact=true)
Determine the time at which the point will rise or set.
Extension of KDateTime for KStars KStarsDateTime can represent the date/time as a Julian Day...