diff options
author | Alexander V. Wolf <aw@altspu.ru> | 2023-10-31 13:42:16 +0700 |
---|---|---|
committer | Alexander V. Wolf <alex.v.wolf@gmail.com> | 2024-02-25 14:20:24 +0700 |
commit | 280634dcc5861effe2c5c1e5d5dbf45d7a2a254c (patch) | |
tree | e1987452dbbde194743cf891a186660806e03e21 | |
parent | ff75e873ee4e98198db97a9857b5df6a9dc5ecd6 (diff) |
Re-implement AstroCalc/Almanac/Specific Time toolastrocalc/almanac
-rw-r--r-- | data/gui/normalStyle.css | 9 | ||||
-rw-r--r-- | po/stellarium/POTFILES.in | 2 | ||||
-rw-r--r-- | src/CMakeLists.txt | 7 | ||||
-rw-r--r-- | src/core/modules/SpecificTimeMgr.cpp | 64 | ||||
-rw-r--r-- | src/core/modules/SpecificTimeMgr.hpp | 1 | ||||
-rw-r--r-- | src/gui/AstroCalcAlmanacWidget.cpp | 398 | ||||
-rw-r--r-- | src/gui/AstroCalcAlmanacWidget.hpp | 54 | ||||
-rw-r--r-- | src/gui/AstroCalcDialog.cpp | 22 | ||||
-rw-r--r-- | src/gui/AstroCalcDialog.hpp | 2 | ||||
-rw-r--r-- | src/gui/astroCalcAlmanacWidget.ui | 1085 | ||||
-rw-r--r-- | src/gui/astroCalcDialog.ui | 31 |
11 files changed, 1649 insertions, 26 deletions
diff --git a/data/gui/normalStyle.css b/data/gui/normalStyle.css index 4aca1d5e7c..ba5b1a27d5 100644 --- a/data/gui/normalStyle.css +++ b/data/gui/normalStyle.css @@ -1181,3 +1181,12 @@ QMessageBox { QColorDialog { background-color: rgb(143, 143, 143); } + +/************************************************************************* + * AstroCalcAlmanacWidget + *************************************************************************/ + +AstroCalcAlmanacWidget QFrame[frameShape="4"], /* QFrame::HLine == 0x0004 */ +AstroCalcAlmanacWidget QFrame[frameShape="5"] { /* QFrame::VLine == 0x0005 */ + border: 1px solid rgb(238, 238, 238); +} diff --git a/po/stellarium/POTFILES.in b/po/stellarium/POTFILES.in index bce6e937a6..2d80f1487e 100644 --- a/po/stellarium/POTFILES.in +++ b/po/stellarium/POTFILES.in @@ -57,6 +57,7 @@ src/gui/AstroCalcDialog.cpp src/gui/AstroCalcChart.cpp src/gui/AstroCalcExtraEphemerisDialog.cpp src/gui/AstroCalcCustomStepsDialog.cpp +src/gui/AstroCalcAlmanacWidget.cpp src/gui/ObsListDialog.cpp src/gui/ConfigureDSOColorsDialog.cpp src/gui/ConfigureOrbitColorsDialog.cpp @@ -86,6 +87,7 @@ src/ui_scriptConsole.h src/ui_astroCalcDialog.h src/ui_astroCalcExtraEphemerisDialog.h src/ui_astroCalcCustomStepsDialog.h +src/ui_astroCalcAlmanacWidget.h src/ui_obsListDialog.h src/ui_dsoColorsDialog.h src/ui_orbitColorsDialog.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c86b71c3c6..6db2047a73 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -350,12 +350,14 @@ IF(STELLARIUM_GUI_MODE STREQUAL "Standard") gui/ConfigureScreenshotsDialog.cpp gui/AstroCalcDialog.hpp gui/AstroCalcDialog.cpp + gui/AstroCalcChart.hpp + gui/AstroCalcChart.cpp gui/AstroCalcExtraEphemerisDialog.hpp gui/AstroCalcExtraEphemerisDialog.cpp gui/AstroCalcCustomStepsDialog.hpp gui/AstroCalcCustomStepsDialog.cpp - gui/AstroCalcChart.hpp - gui/AstroCalcChart.cpp + gui/AstroCalcAlmanacWidget.hpp + gui/AstroCalcAlmanacWidget.cpp gui/ObsListDialog.hpp gui/ObsListDialog.cpp gui/StelDialog.hpp @@ -392,6 +394,7 @@ IF(STELLARIUM_GUI_MODE STREQUAL "Standard") gui/astroCalcDialog.ui gui/astroCalcExtraEphemerisDialog.ui gui/astroCalcCustomStepsDialog.ui + gui/astroCalcAlmanacWidget.ui gui/obsListDialog.ui gui/addRemoveLandscapesDialog.ui gui/dsoColorsDialog.ui diff --git a/src/core/modules/SpecificTimeMgr.cpp b/src/core/modules/SpecificTimeMgr.cpp index f597bb5378..1a9300e19a 100644 --- a/src/core/modules/SpecificTimeMgr.cpp +++ b/src/core/modules/SpecificTimeMgr.cpp @@ -518,120 +518,136 @@ double SpecificTimeMgr::getSolstice(int year, SpecificTimeMgr::Solstice solstice void SpecificTimeMgr::currentMarchEquinox() { - double JD = core->getJDE(); + double JD = core->getJD(); int year, month, day; StelUtils::getDateFromJulianDay(JD, &year, &month, &day); double estime = getEquinox(year, Equinox::March); if (estime>0.) - core->setJDE(estime); + core->setJD(estime); } void SpecificTimeMgr::nextMarchEquinox() { - double JD = core->getJDE(); + double JD = core->getJD(); int year, month, day; StelUtils::getDateFromJulianDay(JD, &year, &month, &day); double estime = getEquinox(year + 1, Equinox::March); if (estime>0.) - core->setJDE(estime); + core->setJD(estime); + + emit eventYearChanged(); } void SpecificTimeMgr::previousMarchEquinox() { - double JD = core->getJDE(); + double JD = core->getJD(); int year, month, day; StelUtils::getDateFromJulianDay(JD, &year, &month, &day); double estime = getEquinox(year - 1, Equinox::March); if (estime>0.) - core->setJDE(estime); + core->setJD(estime); + + emit eventYearChanged(); } void SpecificTimeMgr::currentSeptemberEquinox() { - double JD = core->getJDE(); + double JD = core->getJD(); int year, month, day; StelUtils::getDateFromJulianDay(JD, &year, &month, &day); double estime = getEquinox(year, Equinox::September); if (estime>0.) - core->setJDE(estime); + core->setJD(estime); } void SpecificTimeMgr::nextSeptemberEquinox() { - double JD = core->getJDE(); + double JD = core->getJD(); int year, month, day; StelUtils::getDateFromJulianDay(JD, &year, &month, &day); double estime = getEquinox(year + 1, Equinox::September); if (estime>0.) - core->setJDE(estime); + core->setJD(estime); + + emit eventYearChanged(); } void SpecificTimeMgr::previousSeptemberEquinox() { - double JD = core->getJDE(); + double JD = core->getJD(); int year, month, day; StelUtils::getDateFromJulianDay(JD, &year, &month, &day); double estime = getEquinox(year - 1, Equinox::September); if (estime>0.) - core->setJDE(estime); + core->setJD(estime); + + emit eventYearChanged(); } void SpecificTimeMgr::currentJuneSolstice() { - double JD = core->getJDE(); + double JD = core->getJD(); int year, month, day; StelUtils::getDateFromJulianDay(JD, &year, &month, &day); double estime = getSolstice(year, Solstice::June); if (estime>0.) - core->setJDE(estime); + core->setJD(estime); } void SpecificTimeMgr::nextJuneSolstice() { - double JD = core->getJDE(); + double JD = core->getJD(); int year, month, day; StelUtils::getDateFromJulianDay(JD, &year, &month, &day); double estime = getSolstice(year + 1, Solstice::June); if (estime>0.) - core->setJDE(estime); + core->setJD(estime); + + emit eventYearChanged(); } void SpecificTimeMgr::previousJuneSolstice() { - double JD = core->getJDE(); + double JD = core->getJD(); int year, month, day; StelUtils::getDateFromJulianDay(JD, &year, &month, &day); double estime = getSolstice(year - 1, Solstice::June); if (estime>0.) - core->setJDE(estime); + core->setJD(estime); + + emit eventYearChanged(); } void SpecificTimeMgr::currentDecemberSolstice() { - double JD = core->getJDE(); + double JD = core->getJD(); int year, month, day; StelUtils::getDateFromJulianDay(JD, &year, &month, &day); double estime = getSolstice(year, Solstice::December); if (estime>0.) - core->setJDE(estime); + core->setJD(estime); } void SpecificTimeMgr::nextDecemberSolstice() { - double JD = core->getJDE(); + double JD = core->getJD(); int year, month, day; StelUtils::getDateFromJulianDay(JD, &year, &month, &day); double estime = getSolstice(year + 1, Solstice::December); if (estime>0.) - core->setJDE(estime); + core->setJD(estime); + + emit eventYearChanged(); } void SpecificTimeMgr::previousDecemberSolstice() { - double JD = core->getJDE(); + double JD = core->getJD(); int year, month, day; StelUtils::getDateFromJulianDay(JD, &year, &month, &day); double estime = getSolstice(year - 1, Solstice::December); if (estime>0.) - core->setJDE(estime); + core->setJD(estime); + + emit eventYearChanged(); } diff --git a/src/core/modules/SpecificTimeMgr.hpp b/src/core/modules/SpecificTimeMgr.hpp index 0d8b462048..70322a7443 100644 --- a/src/core/modules/SpecificTimeMgr.hpp +++ b/src/core/modules/SpecificTimeMgr.hpp @@ -171,6 +171,7 @@ public slots: signals: //! Signal that the configurable twilight altitude for the sun has changed. void twilightAltitudeChanged(double alt); + void eventYearChanged(); private: QSettings* conf; diff --git a/src/gui/AstroCalcAlmanacWidget.cpp b/src/gui/AstroCalcAlmanacWidget.cpp new file mode 100644 index 0000000000..8272f52a82 --- /dev/null +++ b/src/gui/AstroCalcAlmanacWidget.cpp @@ -0,0 +1,398 @@ +/* + * Stellarium + * Copyright (C) 2023 Alexander Wolf + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA. + */ + +#include "AstroCalcAlmanacWidget.hpp" +#include "StelApp.hpp" +#include "StelCore.hpp" +#include "StelModuleMgr.hpp" +#include "StelUtils.hpp" +#include "SpecificTimeMgr.hpp" +#include "StelLocaleMgr.hpp" +#include "SolarSystem.hpp" + +#include <QPushButton> +#include <QToolTip> +#include <QSettings> + +AstroCalcAlmanacWidget::AstroCalcAlmanacWidget(QWidget* parent) + : QWidget(parent) + , sunriseJD(0.) + , sunsetJD(0.) + , moonriseJD(0.) + , moonsetJD(0.) + , civilDawnJD(0.) + , civilDuskJD(0.) + , nauticalDawnJD(0.) + , nauticalDuskJD(0.) + , astronomicalDawnJD(0.) + , astronomicalDuskJD(0.) + , ui(new Ui_astroCalcAlmanacWidget) +{ +} + +void AstroCalcAlmanacWidget::setup() +{ + ui->setupUi(this); + connect(&StelApp::getInstance(), &StelApp::languageChanged, this, &AstroCalcAlmanacWidget::retranslate); + + core = StelApp::getInstance().getCore(); + specMgr = GETSTELMODULE(SpecificTimeMgr); + localeMgr = &StelApp::getInstance().getLocaleMgr(); + + populateData(); + + connect(core, &StelCore::locationChanged, this, [=](const StelLocation&){ populateData(); }); + connect(core, &StelCore::currentTimeZoneChanged, this, [=](const QString&){ setSeasonTimes(); setTodayTimes(); }); + // update the data when "Now" button is pressed or date is changed + connect(core, &StelCore::dateChanged, this, [=](){ setSeasonTimes(); setTodayTimes(); }); + connect(specMgr, SIGNAL(eventYearChanged()), this, SLOT(setSeasonTimes())); + connect(specMgr, SIGNAL(eventYearChanged()), this, SLOT(setTodayTimes())); + + connect(ui->buttonMarchEquinoxCurrent, &QPushButton::clicked, this, [=](){specMgr->currentMarchEquinox();}); + connect(ui->buttonMarchEquinoxNext, &QPushButton::clicked, this, [=](){specMgr->nextMarchEquinox();}); + connect(ui->buttonMarchEquinoxPrevious, &QPushButton::clicked, this, [=](){specMgr->previousMarchEquinox();}); + + connect(ui->buttonSeptemberEquinoxCurrent, &QPushButton::clicked, this, [=](){specMgr->currentSeptemberEquinox();}); + connect(ui->buttonSeptemberEquinoxNext, &QPushButton::clicked, this, [=](){specMgr->nextSeptemberEquinox();}); + connect(ui->buttonSeptemberEquinoxPrevious, &QPushButton::clicked, this, [=](){specMgr->previousSeptemberEquinox();}); + + connect(ui->buttonJuneSolsticeCurrent, &QPushButton::clicked, this, [=](){specMgr->currentJuneSolstice();}); + connect(ui->buttonJuneSolsticeNext, &QPushButton::clicked, this, [=](){specMgr->nextJuneSolstice();}); + connect(ui->buttonJuneSolsticePrevious, &QPushButton::clicked, this, [=](){specMgr->previousJuneSolstice();}); + + connect(ui->buttonDecemberSolsticeCurrent, &QPushButton::clicked, this, [=](){specMgr->currentDecemberSolstice();}); + connect(ui->buttonDecemberSolsticeNext, &QPushButton::clicked, this, [=](){specMgr->nextDecemberSolstice();}); + connect(ui->buttonDecemberSolsticePrevious, &QPushButton::clicked, this, [=](){specMgr->previousDecemberSolstice();}); + + // handling special days + connect(ui->buttonMarchEquinoxCurrent, &QPushButton::clicked, this, [=](){setTodayTimes();}); + connect(ui->buttonSeptemberEquinoxCurrent, &QPushButton::clicked, this, [=](){setTodayTimes();}); + connect(ui->buttonJuneSolsticeCurrent, &QPushButton::clicked, this, [=](){setTodayTimes();}); + connect(ui->buttonDecemberSolsticeCurrent, &QPushButton::clicked, this, [=](){setTodayTimes();}); + + // handling special times + connect(ui->buttonSunrise, &QPushButton::clicked, this, [=](){core->setJD(sunriseJD);}); + connect(ui->buttonSunset, &QPushButton::clicked, this, [=](){core->setJD(sunsetJD);}); + connect(ui->buttonMoonrise, &QPushButton::clicked, this, [=](){core->setJD(moonriseJD);}); + connect(ui->buttonMoonset, &QPushButton::clicked, this, [=](){core->setJD(moonsetJD);}); + connect(ui->buttonCivilDawn, &QPushButton::clicked, this, [=](){core->setJD(civilDawnJD);}); + connect(ui->buttonCivilDusk, &QPushButton::clicked, this, [=](){core->setJD(civilDuskJD);}); + connect(ui->buttonNauticalDawn, &QPushButton::clicked, this, [=](){core->setJD(nauticalDawnJD);}); + connect(ui->buttonNauticalDusk, &QPushButton::clicked, this, [=](){core->setJD(nauticalDuskJD);}); + connect(ui->buttonAstronomicalDawn, &QPushButton::clicked, this, [=](){core->setJD(astronomicalDawnJD);}); + connect(ui->buttonAstronomicalDusk, &QPushButton::clicked, this, [=](){core->setJD(astronomicalDuskJD);}); + + QSize button = QSize(24, 24); + ui->buttonMarchEquinoxCurrent->setFixedSize(button); + ui->buttonMarchEquinoxNext->setFixedSize(button); + ui->buttonMarchEquinoxPrevious->setFixedSize(button); + ui->buttonJuneSolsticeCurrent->setFixedSize(button); + ui->buttonJuneSolsticeNext->setFixedSize(button); + ui->buttonJuneSolsticePrevious->setFixedSize(button); + ui->buttonSeptemberEquinoxCurrent->setFixedSize(button); + ui->buttonSeptemberEquinoxNext->setFixedSize(button); + ui->buttonSeptemberEquinoxPrevious->setFixedSize(button); + ui->buttonDecemberSolsticeCurrent->setFixedSize(button); + ui->buttonDecemberSolsticeNext->setFixedSize(button); + ui->buttonDecemberSolsticePrevious->setFixedSize(button); + ui->buttonCivilDawn->setFixedSize(button); + ui->buttonCivilDusk->setFixedSize(button); + ui->buttonNauticalDawn->setFixedSize(button); + ui->buttonNauticalDusk->setFixedSize(button); + ui->buttonAstronomicalDawn->setFixedSize(button); + ui->buttonAstronomicalDusk->setFixedSize(button); + ui->buttonSunrise->setFixedSize(button); + ui->buttonSunset->setFixedSize(button); + ui->buttonMoonrise->setFixedSize(button); + ui->buttonMoonset->setFixedSize(button); +} + +void AstroCalcAlmanacWidget::retranslate() +{ + ui->retranslateUi(this); + populateData(); +} + +void AstroCalcAlmanacWidget::populateData() +{ + // Set season labels + setSeasonLabels(); + // Compute equinoxes/solstices and fill the time + setSeasonTimes(); + // Compute today events + setTodayTimes(); +} + +void AstroCalcAlmanacWidget::setSeasonLabels() +{ + const float latitide = StelApp::getInstance().getCore()->getCurrentLocation().getLatitude(); + if (latitide >= 0.f) + { + // Northern Hemisphere + // TRANSLATORS: The name of season + ui->labelMarchEquinox->setText(qc_("Spring","season")); + // TRANSLATORS: The name of season + ui->labelJuneSolstice->setText(qc_("Summer","season")); + // TRANSLATORS: The name of season + ui->labelSeptemberEquinox->setText(qc_("Fall","season")); + // TRANSLATORS: The name of season + ui->labelDecemberSolstice->setText(qc_("Winter","season")); + } + else + { + // Southern Hemisphere + // TRANSLATORS: The name of season + ui->labelMarchEquinox->setText(qc_("Fall","season")); + // TRANSLATORS: The name of season + ui->labelJuneSolstice->setText(qc_("Winter","season")); + // TRANSLATORS: The name of season + ui->labelSeptemberEquinox->setText(qc_("Spring","season")); + // TRANSLATORS: The name of season + ui->labelDecemberSolstice->setText(qc_("Summer","season")); + } +} + +QString AstroCalcAlmanacWidget::getFormattedDateTime(const double JD, const double utcShift) +{ + int year, month, day; + StelUtils::getDateFromJulianDay(JD, &year, &month, &day); + return QString("%1 %2 %3").arg(QString::number(day), localeMgr->longGenitiveMonthName(month), StelUtils::hoursToHmsStr(StelUtils::getHoursFromJulianDay(JD+utcShift), true)); +} + +void AstroCalcAlmanacWidget::setSeasonTimes() +{ + const double utcShift = core->getUTCOffset(core->getJD()) / 24.; // Fix DST shift... + const double JD = core->getJD() + utcShift; + int year, month, day; + double jdFirstDay, jdLastDay; + StelUtils::getDateFromJulianDay(JD, &year, &month, &day); + StelUtils::getJDFromDate(&jdFirstDay, year, 1, 1, 0, 0, 0); + StelUtils::getJDFromDate(&jdLastDay, year, 12, 31, 24, 0, 0); + const double marchEquinox = specMgr->getEquinox(year, SpecificTimeMgr::Equinox::March); + const double septemberEquinox = specMgr->getEquinox(year, SpecificTimeMgr::Equinox::September); + const double juneSolstice = specMgr->getSolstice(year, SpecificTimeMgr::Solstice::June); + const double decemberSolstice = specMgr->getSolstice(year, SpecificTimeMgr::Solstice::December); + QString days = qc_("days", "duration"); + int jdDepth = 5; + int daysDepth = 2; + + // Current year + ui->labelCurrentYear->setText(QString::number(year)); + ui->labelYearDuration->setText(QString("(%1 %2)").arg(QString::number(jdLastDay-jdFirstDay), days)); + // Spring/Fall + ui->labelMarchEquinoxJD->setText(QString::number(marchEquinox, 'f', jdDepth)); + ui->labelMarchEquinoxLT->setText(getFormattedDateTime(marchEquinox, utcShift)); + ui->labelMarchEquinoxDuration->setText(QString("%1 %2").arg(QString::number(juneSolstice-marchEquinox, 'f', daysDepth), days)); + // Summer/Winter + ui->labelJuneSolsticeJD->setText(QString::number(juneSolstice, 'f', jdDepth)); + ui->labelJuneSolsticeLT->setText(getFormattedDateTime(juneSolstice, utcShift)); + ui->labelJuneSolsticeDuration->setText(QString("%1 %2").arg(QString::number(septemberEquinox-juneSolstice, 'f', daysDepth), days)); + // Fall/Spring + ui->labelSeptemberEquinoxJD->setText(QString::number(septemberEquinox, 'f', jdDepth)); + ui->labelSeptemberEquinoxLT->setText(getFormattedDateTime(septemberEquinox, utcShift)); + ui->labelSeptemberEquinoxDuration->setText(QString("%1 %2").arg(QString::number(decemberSolstice-septemberEquinox, 'f', daysDepth), days)); + // Winter/Summer + ui->labelDecemberSolsticeJD->setText(QString::number(decemberSolstice, 'f', jdDepth)); + ui->labelDecemberSolsticeLT->setText(getFormattedDateTime(decemberSolstice, utcShift)); + const double duration = (marchEquinox-jdFirstDay) + (jdLastDay-decemberSolstice); + ui->labelDecemberSolsticeDuration->setText(QString("%1 %2").arg(QString::number(duration, 'f', daysDepth), days)); +} + +void AstroCalcAlmanacWidget::setTodayTimes() +{ + if (core->getCurrentPlanet()!=GETSTELMODULE(SolarSystem)->getEarth()) + return; + + const double JD = core->getJD(); + const double utcShift = core->getUTCOffset(JD) / 24.; // Fix DST shift... + PlanetP sun = GETSTELMODULE(SolarSystem)->getSun(); + double duration, duration1, duration2; + bool astronomicalTwilightBtn, nauticalTwilightBtn, civilTwilightBtn, sunBtn; + QString moonrise, moonset, sunrise, sunset, civilTwilightBegin, civilTwilightEnd, nauticalTwilightBegin, + nauticalTwilightEnd, astronomicalTwilightBegin, astronomicalTwilightEnd, dayDuration, nightDuration, + civilTwilightDuration, nauticalTwilightDuration, astronomicalTwilightDuration, dash = QChar(0x2014); + + // Moon + Vec4d moon = GETSTELMODULE(SolarSystem)->getMoon()->getRTSTime(core, 0.); + if (moon[3]==30 || moon[3]<0 || moon[3]>50) // no moonrise on current date + { + moonrise = dash; + ui->buttonMoonrise->setEnabled(false); + } + else + { + moonriseJD = moon[0]; + moonrise = StelUtils::hoursToHmsStr(StelUtils::getHoursFromJulianDay(moonriseJD+utcShift), true); + ui->buttonMoonrise->setEnabled(true); + } + + if (moon[3]==40 || moon[3]<0 || moon[3]>50) // no moonset on current date + { + moonset = dash; + ui->buttonMoonset->setEnabled(false); + } + else + { + moonsetJD = moon[2]; + moonset = StelUtils::hoursToHmsStr(StelUtils::getHoursFromJulianDay(moonsetJD+utcShift), true); + ui->buttonMoonset->setEnabled(true); + } + + // Sun + Vec4d day = sun->getRTSTime(core, 0.); + if (day[3]==0.) + { + sunriseJD = day[0]; + sunsetJD = day[2]; + sunrise = StelUtils::hoursToHmsStr(StelUtils::getHoursFromJulianDay(sunriseJD+utcShift), true); + sunset = StelUtils::hoursToHmsStr(StelUtils::getHoursFromJulianDay(sunsetJD+utcShift), true); + duration = qAbs(day[2]-day[0])*24.; + sunBtn = true; + } + else + { + sunrise = sunset = dash; + // polar day/night + duration = (day[3]>99.) ? 24. : 0.; + sunBtn = false; + } + dayDuration = StelUtils::hoursToHmsStr(duration, true); + + // twilights + Vec4d civilTwilight = sun->getRTSTime(core, -6.); + Vec4d nauticalTwilight = sun->getRTSTime(core, -12.); + Vec4d astronomicalTwilight = sun->getRTSTime(core, -18.); + // tooltips + // TRANSLATORS: full phrase is "The Sun is XX° below the horizon" + QString belowHorizon = q_("The Sun is %1 below the horizon"); + ui->labelCivilTwilight->setToolTip(belowHorizon.arg("6°")); + ui->labelNauticalTwilight->setToolTip(belowHorizon.arg("12°")); + ui->labelAstronomicalTwilight->setToolTip(belowHorizon.arg("18°")); + ui->labelDayDuration->setToolTip(q_("The duration of daytime")); + ui->labelNightDuration->setToolTip(q_("The duration of the astronomical night")); + QString twilights = q_("The duration of morning and evening twilights"); + ui->labelCivilTwilightDuration->setToolTip(twilights); + ui->labelNauticalTwilightDuration->setToolTip(twilights); + ui->labelAstronomicalTwilightDuration->setToolTip(twilights); + + if (astronomicalTwilight[3]==0.) + { + astronomicalDawnJD = astronomicalTwilight[0]; + astronomicalDuskJD = astronomicalTwilight[2]; + astronomicalTwilightBegin = StelUtils::hoursToHmsStr(StelUtils::getHoursFromJulianDay(astronomicalDawnJD+utcShift), true); + astronomicalTwilightEnd = StelUtils::hoursToHmsStr(StelUtils::getHoursFromJulianDay(astronomicalDuskJD+utcShift), true); + duration1 = (nauticalTwilight[2]-astronomicalTwilight[2])*24.; + if (duration1 > 0.) + duration1 -= 24.; + duration2 = (astronomicalTwilight[0]-nauticalTwilight[0])*24.; + if (duration2 > 0.) + duration2 -= 24.; + duration = qAbs(duration1) + qAbs(duration2); + nightDuration = StelUtils::hoursToHmsStr(24.0 - qAbs(astronomicalTwilight[2]-astronomicalTwilight[0])*24., true); + astronomicalTwilightBtn = true; + } + else + { + astronomicalTwilightBegin = astronomicalTwilightEnd = dash; + duration = 0.; + // polar night/day + if (day[3]<-99.) + nightDuration = StelUtils::hoursToHmsStr(24., true); + else + nightDuration = StelUtils::hoursToHmsStr(duration, true); + astronomicalTwilightBtn = false; + } + astronomicalTwilightDuration = StelUtils::hoursToHmsStr(duration, true); + + if (nauticalTwilight[3]==0.) + { + nauticalDawnJD = nauticalTwilight[0]; + nauticalDuskJD = nauticalTwilight[2]; + nauticalTwilightBegin = StelUtils::hoursToHmsStr(StelUtils::getHoursFromJulianDay(nauticalDawnJD+utcShift), true); + nauticalTwilightEnd = StelUtils::hoursToHmsStr(StelUtils::getHoursFromJulianDay(nauticalDuskJD+utcShift), true); + duration1 = (civilTwilight[2]-nauticalTwilight[2])*24.; + if (duration1 > 0.) + duration1 -= 24.; + duration2 = (nauticalTwilight[0]-civilTwilight[0])*24.; + if (duration2 > 0.) + duration2 -= 24.; + duration = qAbs(duration1) + qAbs(duration2); + nauticalTwilightBtn = true; + } + else + { + nauticalTwilightBegin = nauticalTwilightEnd = dash; + duration = 0.; + nauticalTwilightBtn = false; + } + nauticalTwilightDuration = StelUtils::hoursToHmsStr(duration, true); + + if (civilTwilight[3]==0.) + { + civilDawnJD = civilTwilight[0]; + civilDuskJD = civilTwilight[2]; + civilTwilightBegin = StelUtils::hoursToHmsStr(StelUtils::getHoursFromJulianDay(civilDawnJD+utcShift), true); + civilTwilightEnd = StelUtils::hoursToHmsStr(StelUtils::getHoursFromJulianDay(civilDuskJD+utcShift), true); + duration1 = (day[2]-civilTwilight[2])*24.; + if (duration1 > 0.) + duration1 -= 24.; + duration2 = (civilTwilight[0]-day[0])*24.; + if (duration2 > 0.) + duration2 -= 24.; + duration = qAbs(duration1) + qAbs(duration2); + civilTwilightBtn = true; + } + else + { + civilTwilightBegin = civilTwilightEnd = dash; + duration = 0.; + civilTwilightBtn = false; + } + civilTwilightDuration = StelUtils::hoursToHmsStr(duration, true); + + // fill the data + ui->labelToday->setText(QString("%1 (%2)").arg(q_("Today"), localeMgr->getPrintableDateLocal(JD))); + + ui->labelDayDuration->setText(dayDuration); + ui->labelCivilTwilightBegin->setText(civilTwilightBegin); + ui->labelCivilTwilightEnd->setText(civilTwilightEnd); + ui->labelCivilTwilightDuration->setText(civilTwilightDuration); + ui->labelNauticalTwilightBegin->setText(nauticalTwilightBegin); + ui->labelNauticalTwilightEnd->setText(nauticalTwilightEnd); + ui->labelNauticalTwilightDuration->setText(nauticalTwilightDuration); + ui->labelAstronomicalTwilightBegin->setText(astronomicalTwilightBegin); + ui->labelAstronomicalTwilightEnd->setText(astronomicalTwilightEnd); + ui->labelAstronomicalTwilightDuration->setText(astronomicalTwilightDuration); + ui->labelNightDuration->setText(nightDuration); + + ui->labelSunrise->setText(sunrise); + ui->labelSunset->setText(sunset); + ui->labelMoonRise->setText(moonrise); + ui->labelMoonSet->setText(moonset); + + // buttons + ui->buttonSunrise->setEnabled(sunBtn); + ui->buttonSunset->setEnabled(sunBtn); + ui->buttonAstronomicalDawn->setEnabled(astronomicalTwilightBtn); + ui->buttonAstronomicalDusk->setEnabled(astronomicalTwilightBtn); + ui->buttonNauticalDawn->setEnabled(nauticalTwilightBtn); + ui->buttonNauticalDusk->setEnabled(nauticalTwilightBtn); + ui->buttonCivilDawn->setEnabled(civilTwilightBtn); + ui->buttonCivilDusk->setEnabled(civilTwilightBtn); +} diff --git a/src/gui/AstroCalcAlmanacWidget.hpp b/src/gui/AstroCalcAlmanacWidget.hpp new file mode 100644 index 0000000000..bf232f4fc8 --- /dev/null +++ b/src/gui/AstroCalcAlmanacWidget.hpp @@ -0,0 +1,54 @@ +/* + * Stellarium + * Copyright (C) 2023 Alexander Wolf + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA. + */ + +#ifndef ASTROCALC_ALMANAC_WIDGET +#define ASTROCALC_ALMANAC_WIDGET + +#include <memory> +#include <QWidget> +#include "ui_astroCalcAlmanacWidget.h" + +class AstroCalcAlmanacWidget : public QWidget +{ + Q_OBJECT +public: + AstroCalcAlmanacWidget(QWidget* parent = nullptr); + void setup(); + void retranslate(); + +private slots: + void setSeasonLabels(); + void setSeasonTimes(); + void setTodayTimes(); + +private: + class StelCore* core; + class SpecificTimeMgr* specMgr; + class StelLocaleMgr* localeMgr; + + double sunriseJD, sunsetJD, moonriseJD, moonsetJD, civilDawnJD, civilDuskJD, nauticalDawnJD, nauticalDuskJD, astronomicalDawnJD, astronomicalDuskJD; + + void populateData(); + // method to get a formatted string for date and time of equinox/solstice + QString getFormattedDateTime(const double JD, const double utcShift); + + std::unique_ptr<Ui_astroCalcAlmanacWidget> ui; +}; + +#endif diff --git a/src/gui/AstroCalcDialog.cpp b/src/gui/AstroCalcDialog.cpp index da873fc771..4e84c5a6bc 100644 --- a/src/gui/AstroCalcDialog.cpp +++ b/src/gui/AstroCalcDialog.cpp @@ -202,6 +202,9 @@ void AstroCalcDialog::retranslate() // by causing the list items to be laid out again. updateTabBarListWidgetWidth(); populateToolTips(); + // Almanac + ui->astroCalcAlmanac->retranslate(); + } } @@ -583,6 +586,11 @@ void AstroCalcDialog::createDialogContent() connect(ui->pushButtonExtraEphemerisDialog, SIGNAL(clicked()), this, SLOT(showExtraEphemerisDialog())); connect(ui->pushButtonCustomStepsDialog, SIGNAL(clicked()), this, SLOT(showCustomStepsDialog())); + // Tab: Almanac + ui->astroCalcAlmanac->setup(); + connect(core, SIGNAL(locationChanged(StelLocation)), this, SLOT(updateAlmanacWidgetVisibility())); + updateAlmanacWidgetVisibility(); + updateTabBarListWidgetWidth(); ui->celestialPositionsUpdateButton->setShortcut(QKeySequence("Shift+F10")); @@ -605,6 +613,20 @@ void AstroCalcDialog::createDialogContent() connect(ui->exportPCPushButton, &QPushButton::clicked, this, [=]{ saveGraph(ui->pcChartView); }); } +void AstroCalcDialog::updateAlmanacWidgetVisibility() +{ + const int almanacTabIndex = 8; + const bool onEarth = core->getCurrentPlanet()==solarSystem->getEarth(); + + // hide Almanac tab or not + ui->stackListWidget->item(almanacTabIndex)->setHidden(!onEarth); + ui->astroCalcAlmanac->setVisible(onEarth); + + // move to first tab if Alamac was visible when user are moved to non-terrestial location + if (!onEarth && ui->stackListWidget->currentRow()==almanacTabIndex) + ui->stackListWidget->setCurrentRow(0); +} + void AstroCalcDialog::populateToolTips() { QString validDates = QString("%1 1582/10/15 - 9999/12/31").arg(q_("Gregorian dates. Valid range:")); diff --git a/src/gui/AstroCalcDialog.hpp b/src/gui/AstroCalcDialog.hpp index b56d720b5f..d229932a62 100644 --- a/src/gui/AstroCalcDialog.hpp +++ b/src/gui/AstroCalcDialog.hpp @@ -438,6 +438,8 @@ private slots: void showExtraEphemerisDialog(); void showCustomStepsDialog(); + void updateAlmanacWidgetVisibility(); + void saveGraph(QChartView *graph); private: diff --git a/src/gui/astroCalcAlmanacWidget.ui b/src/gui/astroCalcAlmanacWidget.ui new file mode 100644 index 0000000000..a5fdb49615 --- /dev/null +++ b/src/gui/astroCalcAlmanacWidget.ui @@ -0,0 +1,1085 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>astroCalcAlmanacWidget</class> + <widget class="QWidget" name="astroCalcAlmanacWidget"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>623</width> + <height>305</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="windowTitle"> + <string notr="true">Form</string> + </property> + <layout class="QGridLayout" name="gridLayout"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item row="0" column="0"> + <widget class="QTabWidget" name="tabWidget"> + <property name="tabPosition"> + <enum>QTabWidget::South</enum> + </property> + <property name="currentIndex"> + <number>0</number> + </property> + <widget class="QWidget" name="tabSpecificTime"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <attribute name="title"> + <string>Specific Time</string> + </attribute> + <layout class="QGridLayout" name="gridLayoutSpecificTime"> + <item row="2" column="8"> + <widget class="QLabel" name="labelCivilTwilightBegin"> + <property name="text"> + <string/> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item row="5" column="7" colspan="6"> + <widget class="Line" name="line_5"> + <property name="minimumSize"> + <size> + <width>0</width> + <height>1</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>16777215</width> + <height>1</height> + </size> + </property> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + <item row="9" column="7" colspan="5"> + <widget class="QLabel" name="labelNight"> + <property name="font"> + <font> + <italic>true</italic> + </font> + </property> + <property name="text"> + <string>Astronomical Night</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="8" column="1"> + <widget class="QLabel" name="labelJD2"> + <property name="text"> + <string>Julian Day</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="3" column="8"> + <widget class="QLabel" name="labelNauticalTwilightBegin"> + <property name="text"> + <string/> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item row="4" column="9"> + <widget class="QPushButton" name="buttonAstronomicalDawn"> + <property name="toolTip"> + <string>Morning astronomical twilight</string> + </property> + <property name="text"> + <string/> + </property> + <property name="icon"> + <iconset resource="../../data/gui/guiRes.qrc"> + <normaloff>:/graphicGui/bbtTime-off.png</normaloff> + <disabledoff>:/graphicGui/bbtTime-off.png</disabledoff>:/graphicGui/bbtTime-off.png</iconset> + </property> + </widget> + </item> + <item row="9" column="1"> + <widget class="QLabel" name="labelDuration2"> + <property name="text"> + <string>Duration</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="0" column="7" colspan="6"> + <widget class="QLabel" name="labelToday"> + <property name="font"> + <font> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Today</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item row="4" column="3"> + <widget class="QLabel" name="labelMarchEquinoxDuration"/> + </item> + <item row="8" column="11"> + <widget class="QPushButton" name="buttonMoonset"> + <property name="toolTip"> + <string>Today's moonset</string> + </property> + <property name="text"> + <string/> + </property> + <property name="icon"> + <iconset resource="../../data/gui/guiRes.qrc"> + <normaloff>:/graphicGui/bbtTime-off.png</normaloff> + <disabledoff>:/graphicGui/bbtTime-off.png</disabledoff>:/graphicGui/bbtTime-off.png</iconset> + </property> + </widget> + </item> + <item row="6" column="12"> + <widget class="QLabel" name="labelDurationColumn2"> + <property name="text"> + <string>Duration</string> + </property> + </widget> + </item> + <item row="6" column="4" rowspan="4"> + <widget class="Line" name="line_3"> + <property name="minimumSize"> + <size> + <width>1</width> + <height>0</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>1</width> + <height>16777215</height> + </size> + </property> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + </widget> + </item> + <item row="6" column="3"> + <layout class="QHBoxLayout" name="SeptemberEquinoxLayout"> + <item> + <widget class="QLabel" name="labelSeptemberEquinox"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string comment="season">Fall</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="buttonSeptemberEquinoxPrevious"> + <property name="toolTip"> + <string>Previous September Equinox</string> + </property> + <property name="icon"> + <iconset resource="../../data/gui/guiRes.qrc"> + <normaloff>:/graphicGui/btTimeRewind-off.png</normaloff> + <disabledoff>:/graphicGui/btTimeRewind-off.png</disabledoff>:/graphicGui/btTimeRewind-off.png</iconset> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="buttonSeptemberEquinoxCurrent"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="toolTip"> + <string>Current September Equinox</string> + </property> + <property name="icon"> + <iconset resource="../../data/gui/guiRes.qrc"> + <normaloff>:/graphicGui/bbtTime-off.png</normaloff> + <disabledoff>:/graphicGui/bbtTime-off.png</disabledoff>:/graphicGui/bbtTime-off.png</iconset> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="buttonSeptemberEquinoxNext"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="toolTip"> + <string>Next September Equinox</string> + </property> + <property name="icon"> + <iconset resource="../../data/gui/guiRes.qrc"> + <normaloff>:/graphicGui/btTimeForward-off.png</normaloff> + <disabledoff>:/graphicGui/btTimeForward-off.png</disabledoff>:/graphicGui/btTimeForward-off.png</iconset> + </property> + </widget> + </item> + </layout> + </item> + <item row="4" column="8"> + <widget class="QLabel" name="labelAstronomicalTwilightBegin"> + <property name="text"> + <string/> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item row="2" column="3"> + <widget class="QLabel" name="labelMarchEquinoxLT"/> + </item> + <item row="2" column="1"> + <widget class="QLabel" name="labelLT1"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Local Time</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="3" column="12"> + <widget class="QLabel" name="labelNauticalTwilightDuration"> + <property name="text"> + <string/> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item row="2" column="5"> + <widget class="QLabel" name="labelJuneSolsticeLT"/> + </item> + <item row="2" column="7"> + <widget class="QLabel" name="labelCivilTwilight"> + <property name="text"> + <string comment="twilight">Civil</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="0" column="6" rowspan="10"> + <widget class="Line" name="lineDelimiterSections"> + <property name="minimumSize"> + <size> + <width>1</width> + <height>0</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>1</width> + <height>16777215</height> + </size> + </property> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + </widget> + </item> + <item row="1" column="10" colspan="2"> + <widget class="QLabel" name="labelDusk"> + <property name="text"> + <string>Dusk</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item row="4" column="5"> + <widget class="QLabel" name="labelJuneSolsticeDuration"/> + </item> + <item row="1" column="8" colspan="2"> + <widget class="QLabel" name="labelDawn"> + <property name="text"> + <string>Dawn</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item row="1" column="7"> + <widget class="QLabel" name="labelTwilight"> + <property name="text"> + <string>Twilight</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item row="3" column="9"> + <widget class="QPushButton" name="buttonNauticalDawn"> + <property name="toolTip"> + <string>Morning nautical twilight</string> + </property> + <property name="text"> + <string/> + </property> + <property name="icon"> + <iconset resource="../../data/gui/guiRes.qrc"> + <normaloff>:/graphicGui/bbtTime-off.png</normaloff> + <disabledoff>:/graphicGui/bbtTime-off.png</disabledoff>:/graphicGui/bbtTime-off.png</iconset> + </property> + </widget> + </item> + <item row="7" column="1"> + <widget class="QLabel" name="labelLT2"> + <property name="text"> + <string>Local Time</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="7" column="3"> + <widget class="QLabel" name="labelSeptemberEquinoxLT"/> + </item> + <item row="2" column="9"> + <widget class="QPushButton" name="buttonCivilDawn"> + <property name="toolTip"> + <string>Morning civil twilight</string> + </property> + <property name="text"> + <string/> + </property> + <property name="icon"> + <iconset resource="../../data/gui/guiRes.qrc"> + <normaloff>:/graphicGui/bbtTime-off.png</normaloff> + <disabledoff>:/graphicGui/bbtTime-off.png</disabledoff>:/graphicGui/bbtTime-off.png</iconset> + </property> + </widget> + </item> + <item row="1" column="3"> + <layout class="QHBoxLayout" name="MarchEquinoxLayout"> + <item> + <widget class="QLabel" name="labelMarchEquinox"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string comment="season">Spring</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="buttonMarchEquinoxPrevious"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="toolTip"> + <string>Previous March Equinox</string> + </property> + <property name="icon"> + <iconset resource="../../data/gui/guiRes.qrc"> + <normaloff>:/graphicGui/btTimeRewind-off.png</normaloff> + <disabledoff>:/graphicGui/btTimeRewind-off.png</disabledoff>:/graphicGui/btTimeRewind-off.png</iconset> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="buttonMarchEquinoxCurrent"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="toolTip"> + <string>Current March Equinox</string> + </property> + <property name="icon"> + <iconset resource="../../data/gui/guiRes.qrc"> + <normaloff>:/graphicGui/bbtTime-off.png</normaloff> + <disabledoff>:/graphicGui/bbtTime-off.png</disabledoff>:/graphicGui/bbtTime-off.png</iconset> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="buttonMarchEquinoxNext"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="toolTip"> + <string>Next March Equinox</string> + </property> + <property name="icon"> + <iconset resource="../../data/gui/guiRes.qrc"> + <normaloff>:/graphicGui/btTimeForward-off.png</normaloff> + <disabledoff>:/graphicGui/btTimeForward-off.png</disabledoff>:/graphicGui/btTimeForward-off.png</iconset> + </property> + </widget> + </item> + </layout> + </item> + <item row="1" column="5"> + <layout class="QHBoxLayout" name="JuneSolsticeLayout"> + <item> + <widget class="QLabel" name="labelJuneSolstice"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string comment="season">Summer</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="buttonJuneSolsticePrevious"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="toolTip"> + <string>Previous June Solstice</string> + </property> + <property name="icon"> + <iconset resource="../../data/gui/guiRes.qrc"> + <normaloff>:/graphicGui/btTimeRewind-off.png</normaloff> + <disabledoff>:/graphicGui/btTimeRewind-off.png</disabledoff>:/graphicGui/btTimeRewind-off.png</iconset> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="buttonJuneSolsticeCurrent"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="toolTip"> + <string>Current June Solstice</string> + </property> + <property name="icon"> + <iconset resource="../../data/gui/guiRes.qrc"> + <normaloff>:/graphicGui/bbtTime-off.png</normaloff> + <disabledoff>:/graphicGui/bbtTime-off.png</disabledoff>:/graphicGui/bbtTime-off.png</iconset> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="buttonJuneSolsticeNext"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="toolTip"> + <string>Next June Solstice</string> + </property> + <property name="icon"> + <iconset resource="../../data/gui/guiRes.qrc"> + <normaloff>:/graphicGui/btTimeForward-off.png</normaloff> + <disabledoff>:/graphicGui/btTimeForward-off.png</disabledoff>:/graphicGui/btTimeForward-off.png</iconset> + </property> + </widget> + </item> + </layout> + </item> + <item row="2" column="10"> + <widget class="QLabel" name="labelCivilTwilightEnd"> + <property name="text"> + <string/> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item row="3" column="11"> + <widget class="QPushButton" name="buttonNauticalDusk"> + <property name="toolTip"> + <string>Evening nautical twilight</string> + </property> + <property name="text"> + <string/> + </property> + <property name="icon"> + <iconset resource="../../data/gui/guiRes.qrc"> + <normaloff>:/graphicGui/bbtTime-off.png</normaloff> + <disabledoff>:/graphicGui/bbtTime-off.png</disabledoff>:/graphicGui/bbtTime-off.png</iconset> + </property> + </widget> + </item> + <item row="7" column="12"> + <widget class="QLabel" name="labelDayDuration"> + <property name="text"> + <string/> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item row="9" column="5"> + <widget class="QLabel" name="labelDecemberSolsticeDuration"/> + </item> + <item row="3" column="7"> + <widget class="QLabel" name="labelNauticalTwilight"> + <property name="text"> + <string comment="twilight">Nautical</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="8" column="5"> + <widget class="QLabel" name="labelDecemberSolsticeJD"/> + </item> + <item row="4" column="1"> + <widget class="QLabel" name="labelDuration1"> + <property name="text"> + <string>Duration</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="5" column="3" colspan="3"> + <widget class="Line" name="line"> + <property name="minimumSize"> + <size> + <width>0</width> + <height>1</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>16777215</width> + <height>1</height> + </size> + </property> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + <item row="1" column="12"> + <widget class="QLabel" name="labelDurationColumn1"> + <property name="text"> + <string>Duration</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item row="8" column="7"> + <widget class="QLabel" name="labelMoon"> + <property name="text"> + <string>Moon</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="6" column="8" colspan="2"> + <widget class="QLabel" name="labelRise"> + <property name="text"> + <string>Rise</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item row="9" column="12"> + <widget class="QLabel" name="labelNightDuration"> + <property name="font"> + <font> + <italic>true</italic> + </font> + </property> + <property name="toolTip"> + <string/> + </property> + <property name="text"> + <string/> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item row="1" column="1"> + <layout class="QHBoxLayout" name="YearLayout"> + <item> + <widget class="QLabel" name="labelYear"> + <property name="text"> + <string>Year</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="labelCurrentYear"> + <property name="font"> + <font> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string/> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="labelYearDuration"> + <property name="text"> + <string/> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + </layout> + </item> + <item row="7" column="7"> + <widget class="QLabel" name="labelSun"> + <property name="text"> + <string>Sun</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="6" column="5"> + <layout class="QHBoxLayout" name="DecemberSolsticeLayout"> + <item> + <widget class="QLabel" name="labelDecemberSolstice"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string comment="season">Winter</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="buttonDecemberSolsticePrevious"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="toolTip"> + <string>Previous December Solstice</string> + </property> + <property name="icon"> + <iconset resource="../../data/gui/guiRes.qrc"> + <normaloff>:/graphicGui/btTimeRewind-off.png</normaloff> + <disabledoff>:/graphicGui/btTimeRewind-off.png</disabledoff>:/graphicGui/btTimeRewind-off.png</iconset> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="buttonDecemberSolsticeCurrent"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="toolTip"> + <string>Current December Solstice</string> + </property> + <property name="icon"> + <iconset resource="../../data/gui/guiRes.qrc"> + <normaloff>:/graphicGui/bbtTime-off.png</normaloff> + <disabledoff>:/graphicGui/bbtTime-off.png</disabledoff>:/graphicGui/bbtTime-off.png</iconset> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="buttonDecemberSolsticeNext"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="toolTip"> + <string>Next December Solstice</string> + </property> + <property name="icon"> + <iconset resource="../../data/gui/guiRes.qrc"> + <normaloff>:/graphicGui/btTimeForward-off.png</normaloff> + <disabledoff>:/graphicGui/btTimeForward-off.png</disabledoff>:/graphicGui/btTimeForward-off.png</iconset> + </property> + </widget> + </item> + </layout> + </item> + <item row="3" column="3"> + <widget class="QLabel" name="labelMarchEquinoxJD"/> + </item> + <item row="9" column="3"> + <widget class="QLabel" name="labelSeptemberEquinoxDuration"/> + </item> + <item row="4" column="7"> + <widget class="QLabel" name="labelAstronomicalTwilight"> + <property name="text"> + <string comment="twilight">Astronomical</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="8" column="9"> + <widget class="QPushButton" name="buttonMoonrise"> + <property name="toolTip"> + <string>Today's moonrise</string> + </property> + <property name="text"> + <string/> + </property> + <property name="icon"> + <iconset resource="../../data/gui/guiRes.qrc"> + <normaloff>:/graphicGui/bbtTime-off.png</normaloff> + <disabledoff>:/graphicGui/bbtTime-off.png</disabledoff>:/graphicGui/bbtTime-off.png</iconset> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QLabel" name="labelJD1"> + <property name="text"> + <string>Julian Day</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="3" column="10"> + <widget class="QLabel" name="labelNauticalTwilightEnd"> + <property name="text"> + <string/> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item row="4" column="12"> + <widget class="QLabel" name="labelAstronomicalTwilightDuration"> + <property name="text"> + <string/> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item row="7" column="5"> + <widget class="QLabel" name="labelDecemberSolsticeLT"/> + </item> + <item row="0" column="1" colspan="5"> + <widget class="QLabel" name="labelSeasons"> + <property name="font"> + <font> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Seasons</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item row="4" column="11"> + <widget class="QPushButton" name="buttonAstronomicalDusk"> + <property name="toolTip"> + <string>Evening astronomical twilight</string> + </property> + <property name="text"> + <string/> + </property> + <property name="icon"> + <iconset resource="../../data/gui/guiRes.qrc"> + <normaloff>:/graphicGui/bbtTime-off.png</normaloff> + <disabledoff>:/graphicGui/bbtTime-off.png</disabledoff>:/graphicGui/bbtTime-off.png</iconset> + </property> + </widget> + </item> + <item row="1" column="4" rowspan="4"> + <widget class="Line" name="line_2"> + <property name="minimumSize"> + <size> + <width>1</width> + <height>0</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>1</width> + <height>16777215</height> + </size> + </property> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + </widget> + </item> + <item row="8" column="3"> + <widget class="QLabel" name="labelSeptemberEquinoxJD"/> + </item> + <item row="7" column="11"> + <widget class="QPushButton" name="buttonSunset"> + <property name="toolTip"> + <string>Today's sunset</string> + </property> + <property name="text"> + <string/> + </property> + <property name="icon"> + <iconset resource="../../data/gui/guiRes.qrc"> + <normaloff>:/graphicGui/bbtTime-off.png</normaloff> + <disabledoff>:/graphicGui/bbtTime-off.png</disabledoff>:/graphicGui/bbtTime-off.png</iconset> + </property> + </widget> + </item> + <item row="8" column="8"> + <widget class="QLabel" name="labelMoonRise"> + <property name="text"> + <string/> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item row="7" column="9"> + <widget class="QPushButton" name="buttonSunrise"> + <property name="toolTip"> + <string>Today's sunrise</string> + </property> + <property name="text"> + <string/> + </property> + <property name="icon"> + <iconset resource="../../data/gui/guiRes.qrc"> + <normaloff>:/graphicGui/bbtTime-off.png</normaloff> + <disabledoff>:/graphicGui/bbtTime-off.png</disabledoff>:/graphicGui/bbtTime-off.png</iconset> + </property> + </widget> + </item> + <item row="8" column="10"> + <widget class="QLabel" name="labelMoonSet"> + <property name="text"> + <string/> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item row="7" column="10"> + <widget class="QLabel" name="labelSunset"> + <property name="text"> + <string/> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item row="3" column="5"> + <widget class="QLabel" name="labelJuneSolsticeJD"/> + </item> + <item row="1" column="2" rowspan="9"> + <widget class="Line" name="line_4"> + <property name="minimumSize"> + <size> + <width>1</width> + <height>0</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>1</width> + <height>16777215</height> + </size> + </property> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + </widget> + </item> + <item row="2" column="12"> + <widget class="QLabel" name="labelCivilTwilightDuration"> + <property name="text"> + <string/> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item row="6" column="10" colspan="2"> + <widget class="QLabel" name="labelSet"> + <property name="text"> + <string>Set</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item row="2" column="11"> + <widget class="QPushButton" name="buttonCivilDusk"> + <property name="toolTip"> + <string>Evening civil twilight</string> + </property> + <property name="text"> + <string/> + </property> + <property name="icon"> + <iconset resource="../../data/gui/guiRes.qrc"> + <normaloff>:/graphicGui/bbtTime-off.png</normaloff> + <disabledoff>:/graphicGui/bbtTime-off.png</disabledoff>:/graphicGui/bbtTime-off.png</iconset> + </property> + </widget> + </item> + <item row="4" column="10"> + <widget class="QLabel" name="labelAstronomicalTwilightEnd"> + <property name="text"> + <string/> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item row="7" column="8"> + <widget class="QLabel" name="labelSunrise"> + <property name="text"> + <string/> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item row="10" column="1"> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <widget class="QWidget" name="tab_2"> + <attribute name="title"> + <string>Tab 2</string> + </attribute> + </widget> + </widget> + </item> + </layout> + </widget> + <resources> + <include location="../../data/gui/guiRes.qrc"/> + </resources> + <connections/> +</ui> diff --git a/src/gui/astroCalcDialog.ui b/src/gui/astroCalcDialog.ui index 7a5fc45e80..fa07e186ea 100644 --- a/src/gui/astroCalcDialog.ui +++ b/src/gui/astroCalcDialog.ui @@ -192,6 +192,17 @@ </iconset> </property> </item> + <item> + <property name="text"> + <string>Almanac</string> + </property> + <property name="icon"> + <iconset> + <normalon>:/graphicGui/tabSSO.png</normalon> + <selectedon>:/graphicGui/tabSSO-selected.png</selectedon> + </iconset> + </property> + </item> </widget> </item> <item row="1" column="0"> @@ -2867,6 +2878,20 @@ </item> </layout> </widget> + <widget class="QWidget" name="stackedWidgetPage9"> + <layout class="QGridLayout" name="gridLayout_27"> + <item row="0" column="0"> + <widget class="AstroCalcAlmanacWidget" name="astroCalcAlmanac" native="true"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + </layout> + </widget> </widget> </item> </layout> @@ -2896,6 +2921,12 @@ <extends>QGraphicsView</extends> <header>QtCharts/qchartview.h</header> </customwidget> + <customwidget> + <class>AstroCalcAlmanacWidget</class> + <extends>QWidget</extends> + <header>AstroCalcAlmanacWidget.hpp</header> + <container>1</container> + </customwidget> </customwidgets> <resources> <include location="../../data/gui/guiRes.qrc"/> |