7#include "skycalendar.h"
9#include "geolocation.h"
10#include "ksplanetbase.h"
11#include "kstarsdata.h"
12#include "dialogs/locationdialog.h"
13#include "skycomponents/skymapcomposite.h"
19#include <QPrintDialog>
23#include <QtConcurrent>
36 scUI =
new SkyCalendarUI(
this);
41 setLayout(mainLayout);
43 geo = KStarsData::Instance()->
geo();
45 setWindowTitle(
i18nc(
"@title:window",
"Sky Calendar"));
49 connect(buttonBox, SIGNAL(rejected()),
this, SLOT(reject()));
54 connect(printB, SIGNAL(clicked()),
this, SLOT(slotPrint()));
61 scUI->CalendarView->setMinimumSize(400, 600);
64 scUI->CalendarView->setShowGrid(
false);
65 scUI->Year->setValue(KStarsData::Instance()->lt().date().year());
67 scUI->LocationButton->setText(
geo->fullName());
69 scUI->CalendarView->setHorizon();
71 plotButtonText = scUI->CreateButton->text();
74 scUI->CreateButton->setText(i18n(
"Please Wait") +
"...");
78 connect(scUI->LocationButton, SIGNAL(clicked()),
this, SLOT(slotLocation()));
81int SkyCalendar::year()
83 return scUI->Year->value();
86void SkyCalendar::slotFillCalendar()
90 scUI->CalendarView->resetPlot();
91 scUI->CalendarView->setHorizon();
93 if (scUI->checkBox_Mercury->isChecked())
95 if (scUI->checkBox_Venus->isChecked())
97 if (scUI->checkBox_Mars->isChecked())
99 if (scUI->checkBox_Jupiter->isChecked())
101 if (scUI->checkBox_Saturn->isChecked())
103 if (scUI->checkBox_Uranus->isChecked())
105 if (scUI->checkBox_Neptune->isChecked())
108 scUI->CreateButton->setText(
i18n(
"Plot Planetary Almanac"));
113void SkyCalendar::slotCalculating()
122 scUI->CreateButton->setText(
i18n(
"Please Wait") +
". ");
125 scUI->CreateButton->setText(
i18n(
"Please Wait") +
".. ");
132 scUI->CreateButton->setText(plotButtonText);
160void SkyCalendar::addPlanetEvents(
int nPlanet)
165 std::vector<QPointF> vRise, vSet, vTransit;
168 kdt = kdt.addDays(scUI->spinBox_Interval->value()))
170 float rTime, sTime, tTime;
177 QTime midday(12, 0, 0);
180 if (tmp_rTime == tmp_sTime)
188 rTime = tmp_rTime.
secsTo(midday) * 24.0 / 86400.0;
189 sTime = tmp_sTime.
secsTo(midday) * 24.0 / 86400.0;
191 if (tmp_rTime <= midday)
192 rTime = 12.0 - rTime;
194 rTime = -12.0 - rTime;
196 if (tmp_sTime <= midday)
197 sTime = 12.0 - sTime;
199 sTime = -12.0 - sTime;
215 tTime = tmp_tTime.
secsTo(midday) * 24.0 / 86400.0;
216 if (tmp_tTime <= midday)
217 tTime = 12.0 - tTime;
219 tTime = -12.0 - tTime;
221 float dy = kdt.date().daysInYear() - kdt.date().dayOfYear();
222 vRise.push_back(
QPointF(rTime, dy));
223 vSet.push_back(
QPointF(sTime, dy));
224 vTransit.push_back(
QPointF(tTime, dy));
234 float defaultSetTime = -10.0;
235 float defaultRiseTime = 8.0;
237 bool initialRise =
true;
238 bool initialSet =
true;
239 bool initialTransit =
true;
240 bool extraCheckRise =
true;
241 bool extraCheckSet =
true;
242 bool extraCheckTransit =
true;
243 bool needRiseLabel =
false;
244 bool needSetLabel =
false;
245 bool needTransertLabel =
false;
247 float maxRiseTime = 0.0;
248 for (
auto &item : vRise)
250 if (item.x() >= maxRiseTime)
251 maxRiseTime = item.x();
253 maxRiseTime = qFloor(maxRiseTime) - 1.0;
255 for (uint32_t i = 0; i < vRise.size(); ++i)
257 if (initialRise && (vRise.at(i).x() > defaultSetTime && vRise.at(i).x() < defaultRiseTime))
259 needRiseLabel =
true;
262 else if (vRise.at(i).x() < defaultSetTime || vRise.at(i).x() > defaultRiseTime)
265 needRiseLabel =
false;
268 needRiseLabel =
false;
270 if (extraCheckRise && vRise.at(i).x() > defaultRiseTime && vRise.at(i).x() < maxRiseTime)
272 needRiseLabel =
true;
273 extraCheckRise =
false;
276 if (initialSet && (vSet.at(i).x() > defaultSetTime && vSet.at(i).x() < defaultRiseTime))
281 else if (vSet.at(i).x() < defaultSetTime || vSet.at(i).x() > defaultRiseTime)
284 needSetLabel =
false;
287 needSetLabel =
false;
289 if (extraCheckSet && vSet.at(i).x() > defaultRiseTime && vSet.at(i).x() < maxRiseTime)
292 extraCheckSet =
false;
295 if (initialTransit && (vTransit.at(i).x() > defaultSetTime && vTransit.at(i).x() < defaultRiseTime))
297 needTransertLabel =
true;
298 initialTransit =
false;
300 else if (vTransit.at(i).x() < defaultSetTime || vTransit.at(i).x() > defaultRiseTime)
302 initialTransit =
true;
303 needTransertLabel =
false;
307 needTransertLabel =
false;
309 if (extraCheckTransit && vTransit.at(i).x() > defaultRiseTime && vTransit.at(i).x() < maxRiseTime)
311 needTransertLabel =
true;
312 extraCheckTransit =
false;
315 if (vRise.at(i).x() > -23.0 && vRise.at(i).x() < 23.0)
317 if (i > 0 && fabs(vRise.at(i).x() - vRise.at(i - 1).x()) > 6.0)
319 scUI->CalendarView->addPlotObject(oRise);
321 extraCheckRise =
true;
325 label =
i18nc(
"A planet rises from the horizon",
"%1 rises", ksp->
name());
329 oRise->
addPoint(vRise.at(i), label);
333 scUI->CalendarView->addPlotObject(oRise);
337 if (vSet.at(i).x() > -23.0 && vSet.at(i).x() < 23.0)
339 if (i > 0 && fabs(vSet.at(i).x() - vSet.at(i - 1).x()) > 6.0)
341 scUI->CalendarView->addPlotObject(oSet);
343 extraCheckSet =
true;
347 label =
i18nc(
"A planet sets from the horizon",
"%1 sets", ksp->
name());
355 scUI->CalendarView->addPlotObject(oSet);
359 if (vTransit.at(i).x() > -23.0 && vTransit.at(i).x() < 23.0)
361 if (i > 0 && fabs(vTransit.at(i).x() - vTransit.at(i - 1).x()) > 6.0)
363 scUI->CalendarView->addPlotObject(oTransit);
365 extraCheckTransit =
true;
368 if (needTransertLabel)
369 label =
i18nc(
"A planet transits across the meridian",
"%1 transits", ksp->
name());
373 oTransit->
addPoint(vTransit.at(i), label);
377 scUI->CalendarView->addPlotObject(oTransit);
383 scUI->CalendarView->addPlotObject(oRise);
384 scUI->CalendarView->addPlotObject(oSet);
385 scUI->CalendarView->addPlotObject(oTransit);
388void SkyCalendar::slotPrint()
394 int text_height = 200;
397 int calendar_font_size;
406 dialog.setWindowTitle(
i18nc(
"@title:window",
"Print sky calendar"));
413 calendar_font = scUI->CalendarView->
font();
415 calendar_font_size = calendar_font.
pointSize();
417 calendar_size = scUI->CalendarView->
size();
421 str_legend =
i18n(
"Sky Calendar");
425 str_legend += str_year;
428 QRect text_rect(0, 0, printer.
width(), text_height);
432 scUI->CalendarView->
setFont(calendar_font);
438 scUI->CalendarView->
render(&pixmap);
451 scUI->CalendarView->
setFont(calendar_font);
453 scUI->CalendarView->
resize(calendar_size);
461void SkyCalendar::slotLocation()
470 scUI->LocationButton->setText(geo->
fullName());
475 scUI->CalendarView->setHorizon();
Contains all relevant information for specifying a location on Earth: City Name, State/Province name,...
void addPoint(const QPointF &p, const QString &label=QString(), double barWidth=0.0)
A subclass of TrailObject that provides additional information needed for most solar system objects.
SkyMapComposite * skyComposite()
Extension of QDateTime for KStars KStarsDateTime can represent the date/time as a Julian Day,...
Dialog for changing the geographic location of the observer.
virtual QString name(void) const
dms transitAltitude(const KStarsDateTime &dt, const GeoLocation *geo) const
QTime transitTime(const KStarsDateTime &dt, const GeoLocation *geo) const
The same iteration technique described in riseSetTime() is used here.
QTime riseSetTime(const KStarsDateTime &dt, const GeoLocation *geo, bool rst, bool exact=true) const
Determine the time at which the point will rise or set.
QString i18nc(const char *context, const char *text, const TYPE &arg...)
QString i18n(const char *text, const TYPE &arg...)
GeoCoordinates geo(const QVariant &location)
QString label(StandardShortcut id)
int pointSize() const const
void setPointSize(int pointSize)
void restoreOverrideCursor()
void setOverrideCursor(const QCursor &cursor)
QIcon fromTheme(const QString &name)
bool begin(QPaintDevice *device)
void drawPixmap(const QPoint &point, const QPixmap &pixmap)
void drawText(const QPoint &position, const QString &text)
void setResolution(int dpi)
QString & setNum(double n, char format, int precision)
QFuture< T > run(Function function,...)
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
void msleep(unsigned long msecs)
bool isValid(int h, int m, int s, int ms)
int secsTo(QTime t) const const