diff --git a/kstars/ekos/manager.ui b/kstars/ekos/manager.ui --- a/kstars/ekos/manager.ui +++ b/kstars/ekos/manager.ui @@ -6,10 +6,22 @@ 0 0 - 612 - 643 + 796 + 761 + + + 0 + 0 + + + + + 796 + 568 + + 16777215 @@ -43,12 +55,24 @@ + + + 0 + 0 + + + + + 0 + 0 + + Qt::Vertical - + 0 0 @@ -438,7 +462,8 @@ - + + .. diff --git a/kstars/ekos/opsekos.ui b/kstars/ekos/opsekos.ui --- a/kstars/ekos/opsekos.ui +++ b/kstars/ekos/opsekos.ui @@ -6,15 +6,15 @@ 0 0 - 426 - 379 + 478 + 450 TabWidget - 0 + 1 @@ -56,7 +56,7 @@ - Always &load defaults + Alwa&ys load defaults @@ -99,7 +99,7 @@ Ekos module icons are placed to the left of pages - Left + &Left ekosIconsPositionGroup @@ -211,6 +211,52 @@ + + + + -24.000000000000000 + + + 24.000000000000000 + + + 0.500000000000000 + + + + + + + -24.000000000000000 + + + 24.000000000000000 + + + 0.500000000000000 + + + + + + + <html><body><p>Offset astronomical dusk by this many hours. This positive or negative value adjusts the twilight restriction.</p></body></html> + + + Dusk Offset + + + + + + + <html><body><p>Offset astronomical dawn by this many hours. This positive or negative value adjusts the twilight restriction.</p></body></html> + + + Dawn Offset + + + diff --git a/kstars/ekos/scheduler/scheduler.h b/kstars/ekos/scheduler/scheduler.h --- a/kstars/ekos/scheduler/scheduler.h +++ b/kstars/ekos/scheduler/scheduler.h @@ -30,6 +30,7 @@ class GeoLocation; class SchedulerJob; class SkyObject; +class KConfigDialog; namespace Ekos { @@ -127,6 +128,7 @@ return m_LogText.join("\n"); } void clearLog(); + void applyConfig(); void addObject(SkyObject *object); diff --git a/kstars/ekos/scheduler/scheduler.cpp b/kstars/ekos/scheduler/scheduler.cpp --- a/kstars/ekos/scheduler/scheduler.cpp +++ b/kstars/ekos/scheduler/scheduler.cpp @@ -28,6 +28,7 @@ #include "skyobjects/starobject.h" #include +#include #include #include @@ -218,6 +219,9 @@ Options::setErrorHandlingStrategyDelay(value); }); + connect(KConfigDialog::exists("settings"), &KConfigDialog::settingsChanged, this, &Scheduler::applyConfig); + + calculateDawnDusk(); loadProfiles(); @@ -382,6 +386,17 @@ emit newLog(QString()); } +void Scheduler::applyConfig() +{ + calculateDawnDusk(); + + if (SCHEDULER_RUNNING != state) + { + jobEvaluationOnly = true; + evaluateJobs(); + } +} + void Scheduler::selectObject() { if (FindDialog::Instance()->exec() == QDialog::Accepted) @@ -2379,19 +2394,16 @@ void Scheduler::calculateDawnDusk() { KSAlmanac ksal; - Dawn = ksal.getDawnAstronomicalTwilight(); - Dusk = ksal.getDuskAstronomicalTwilight(); + Dawn = ksal.getDawnAstronomicalTwilight() + Options::dawnOffset() / 24.0; + Dusk = ksal.getDuskAstronomicalTwilight() + Options::duskOffset() / 24.0; - //QTime now = KStarsData::Instance()->lt().time(); - //QTime dawn = QTime(0, 0, 0).addSecs(Dawn * 24 * 3600); - QTime dusk = QTime(0, 0, 0).addSecs(Dusk * 24 * 3600); + QTime const dawn = QTime(0, 0, 0).addSecs(Dawn * 24 * 3600); + QTime const dusk = QTime(0, 0, 0).addSecs(Dusk * 24 * 3600); duskDateTime.setDate(KStars::Instance()->data()->lt().date()); duskDateTime.setTime(dusk); - // FIXME: reduce spam by moving twilight time to a text label - //appendLogText(i18n("Astronomical twilight: dusk at %1, dawn at %2, and current time is %3", - // dusk.toString(), dawn.toString(), now.toString())); + nightTime->setText(i18n("%1 - %2", dusk.toString("hh:mm"), dawn.toString("hh:mm"))); } void Scheduler::executeJob(SchedulerJob *job) @@ -6062,7 +6074,6 @@ void Scheduler::setErrorHandlingStrategy(Scheduler::ErrorHandlingStrategy strategy) { - errorHandlingWaitLabel->setEnabled(strategy != ERROR_DONT_RESTART); errorHandlingDelaySB->setEnabled(strategy != ERROR_DONT_RESTART); switch (strategy) diff --git a/kstars/ekos/scheduler/scheduler.ui b/kstars/ekos/scheduler/scheduler.ui --- a/kstars/ekos/scheduler/scheduler.ui +++ b/kstars/ekos/scheduler/scheduler.ui @@ -6,13 +6,13 @@ 0 0 - 721 - 541 + 957 + 755 - + - 3 + 1 3 @@ -29,18 +29,21 @@ - + 0 0 Object && Sequence Selection - + 3 + + QLayout::SetDefaultConstraint + 3 @@ -54,319 +57,552 @@ 3 - - - - - - Default - - - - - - - - 5 - - - - - true - - - true - - - - - - - - 22 - 22 - - - - Load the image sequence queue. - - - - - - - - - - - - Select which steps to execute before starting the capture process. - - - Steps: - - - - - - - color:red - - - * + + + + + Qt::Vertical - - - - - - Target coordinates in J2000 Epoch + + QSizePolicy::Expanding - - J2000: + + + 20 + 40 + - + - - - - Assigned priority to each job with 1 being the highest priority and 20 being the lowest priority - - - - - + + + 1 - - 20 - - - 10 + + 3 - - - - - - color:red - - - * - - - - - - - + + - Slew to the target and track it before proceeding to the next step. + Select optional FITS file to be used for alignment. When using FITS, specify the object or the estimated coordinates which are used to slew the mount. - Track - - - true + FITS File: - - stepsButtonGroup - - - - - Perform autofocusing before proceeding to the next step. + + + + color:red - Focus - - - true + * - - stepsButtonGroup - - - + + + + 1 + + + QLayout::SetDefaultConstraint + + + 0 + + + 0 + + + + + + 0 + 0 + + + + false + + + true + + + + + + + - Perform alignment using astrometry solver before proceeding to the next step. + Ekos Sequence File - Align - - - true + Sequence: - - stepsButtonGroup - - - + + + + + 0 + 0 + + - Perform calibration and autoguiding before proceeding to the next step. + Load the image sequence queue. - Guide - - - true + - - stepsButtonGroup - - - - - - - 5 - - - + + - RA + Priority: - - + + + + 1 + + + QLayout::SetDefaultConstraint + + + 0 + + + + + true + + + + 0 + 0 + + + + true + + + + + + + + + 6 + + + 6 + + + + + + 0 + 0 + + + + Slew to the target and track it before proceeding to the next step. + + + Qt::LeftToRight + + + Track + + + true + + + stepsButtonGroup + + + + + + + + 0 + 0 + + + + Perform alignment using astrometry solver before proceeding to the next step. + + + Align + + + true + + + stepsButtonGroup + + + + + + + + 0 + 0 + + + + Perform calibration and autoguiding before proceeding to the next step. + + + Guide + + + true + + + stepsButtonGroup + + + + + + + + 0 + 0 + + + + Perform autofocusing before proceeding to the next step. + + + Qt::LeftToRight + + + Focus + + + true + + + stepsButtonGroup + + + + + + + + + + 0 + 0 + + + Assigned priority to each job with 1 being the highest priority and 20 being the lowest priority + + + + 1 + + + 20 + + + 10 + - - + + - DEC + Target: - - - - + + + + + 0 + 0 + + + + Default + + - - - - - - Ekos Device Profile - - - Profile: - - - - - - - 5 - - - + + + + + 0 + 0 + + + + Select which steps to execute before starting the capture process. + + + Steps: + + - + - - - 22 - 22 - + + + 0 + 0 + - - - 22 - 22 - + + + + + + + + + 1 + + + QLayout::SetDefaultConstraint + + + 0 + + + + + + 0 + 0 + + + + + + + + + + + 0 + 0 + - - - - - - Select optional FITS file to be used for alignment. When using FITS, specify the object or the estimated coordinates which are used to slew the mount. - - - FITS File: - - - - - - - Ekos Sequence File - - - Sequence: - - - - - - - Target: - - - - - - - Priority: - - - - - - - 5 - - - - - false + + + + color:red - - true + + * - - - - - 22 - 22 - + + + + Ekos Device Profile - + Profile: + + + + + + + Target coordinates in J2000 Epoch + + + J2000: + + + + + + + 5 + + + 0 + + + + + RA + + + + + + + + 0 + 0 + + + + + + + + + + + DEC + + + + + + + + 0 + 0 + + + + + + + Qt::LeftToRight + + + + + + + + + + + + + + 255 + 0 + 0 + + + + + + + 255 + 0 + 0 + + + + + + + 255 + 0 + 0 + + + + + + + + + 255 + 0 + 0 + + + + + + + 255 + 0 + 0 + + + + + + + 255 + 0 + 0 + + + + + + + + + 160 + 162 + 162 + + + + + + + 168 + 169 + 169 + + + + + + + 160 + 162 + 162 + + + + + + + + * - + Qt::Vertical + + QSizePolicy::Expanding + 20 @@ -382,6 +618,9 @@ 1 + + QLayout::SetDefaultConstraint + @@ -864,18 +1103,36 @@ - - + + + QLayout::SetDefaultConstraint + + + 0 + + + 0 + + 1 - - + + + + + 0 + 0 + + - Job Startup Conditions + Job Completion Conditions - + - 1 + 3 + + + QLayout::SetDefaultConstraint 3 @@ -890,51 +1147,235 @@ 3 - + - 1 + 3 - - - - Start the observation job as soon as all the constraints, if any, are met. The best candidate target shall be imaged first. + + + + + 0 + 0 + - ASAP + &Repeat for - - true + + completionButtonGroup + + + + + + + + 0 + 0 + + + + dd/MM/yy hh:mm + + + true + + + Qt::LocalTime + + + + + + + + 0 + 0 + + + + The observation job is completed when the sequence is complete. + + + Se&quence completion + + + true - startupButtonGroup + completionButtonGroup + + + + + + + + 0 + 0 + + + + Terminate the job on the given date and time. + + + Repeat &until + + + completionButtonGroup + + + + + + + + 0 + 0 + + + + Restart job until it is executed this many times. + + + runs + + + 1 + + + 1000 + + + 1 + + + + + + + + 0 + 0 + + + + Restart the sequence job indefinitely. + + + Repeat &until terminated + + + completionButtonGroup + + + + + + + + 0 + 0 + + + + Job Startup Conditions + + + + 3 + + + 3 + + + 3 + + + 3 + + + 3 + - + - 1 + 3 - + + + + + 0 + 0 + + + + dd/MM hh:mm + + + true + + + + + + + 0 + 0 + + Start the observation job when the object reaches culmination adjusted for the offset value in minutes. By default, the observation job runs 60 minutes prior to culmination. - Cu&lmination Offset + Cul&mination Offset startupButtonGroup - + + + + + 0 + 0 + + + + start the job on the specified date and time + + + O&n + + + startupButtonGroup + + + + + + + 0 + 0 + + <html><head/><body><p>Offset in minutes to start imaging before or after culmination time.</p></body></html> + + min + -240 @@ -949,75 +1390,54 @@ - - - - Qt::Horizontal - - - - 40 - 20 - + + + + + 0 + 0 + - - - - - - - - 1 - - - - start the job on the specified date and time + Start the observation job as soon as all the constraints, if any, are met. The best candidate target shall be imaged first. - O&n + ASAP + + + true startupButtonGroup - - - - dd/MM/yy hh:mm - - - true + + + + - - - - Qt::Horizontal - - - - 40 - 20 - - - - - + + + + 0 + 0 + + Job Constraints - 1 + 3 3 @@ -1032,26 +1452,18 @@ 3 - + - 1 + 3 - - - - ° - - - - - - - ° - - - + + + 0 + 0 + + The moon separation must remain equal to or higher than the given value. @@ -1063,123 +1475,149 @@ - - - - 180.000000000000000 + + + + + 0 + 0 + - - 10.000000000000000 + + The object's altitude must remain equal or higher than the given value. + + + Alt > + + true + + + constraintButtonGroup + + + + 0 + 0 + + + + ° + -15.000000000000000 89.900000000000006 - - - - The object's altitude must remain equal or higher than the given value. + + + + + 0 + 0 + - - Alt > + + <html><head/><body><p>Weather conditions must remain safe. When weather conditions become dangerous, shutdown procedure is initiated.</p></body></html> - - true + + Weather constraintButtonGroup - - - - - - 1 - - - - - Jobs are only executed during astronomical twilight darkness period. + + + + + 0 + 0 + - - Twilight + + ° - - true + + 180.000000000000000 + + + 10.000000000000000 - - constraintButtonGroup - - - + + + + + 0 + 0 + + - <html><head/><body><p>Weather conditions must remain safe. When weather conditions become dangerous, shutdown procedure is initiated.</p></body></html> + <html><body><p>The twilight restriction constrains jobs to execute in astronomical darkness. Use the dusk and dawn offsets in the Ekos Scheduler options to adjust the interval.</p></body></html> - Weather + Twilight + + + true constraintButtonGroup - + - - - 32 - 32 - - - - - 32 - 32 - - + + Qt::AlignCenter + - - - - Qt::Horizontal + + + + - - - 40 - 20 - + + Qt::AlignCenter - + - - + + + + + 0 + 0 + + + + <html><head/><body><p>One-time shutdown procedure to be executed after all scheduler jobs are completed. The script is executed <span style=" font-weight:600; text-decoration: underline;">after</span> the shutdown procedures (e.g. parking), if selected, are completed.</p></body></html> + - Job Completion Conditions + Observatory Shutdown Procedure - + - 3 + 1 3 @@ -1194,117 +1632,97 @@ 3 - - - The observation job is completed when the sequence is complete. - - - Se&quence completion - - - true + + + 1 - - completionButtonGroup - - - - - - + + + true + + + + 0 + 0 + + + + Turn off CCD cooler. + - &Repeat for + Warm CCD - completionButtonGroup + shutdownProcedureGroup - - - Restart job until it is executed this many times. - - - 1 - - - 1000 + + + + 0 + 0 + - - 1 + + Close dust cover - - - - - runs + Cap + + shutdownProcedureGroup + - - - Qt::Horizontal + + + true - - - 40 - 20 - + + + 0 + 0 + - - - - - - - - Restart the sequence job indefinitely. - - - Repeat until ter&minated - - - completionButtonGroup - - - - - - - 1 - - - - Terminate the job on the given date and time. + Park telescope to home position. - Repeat until + Park Mount - completionButtonGroup + shutdownProcedureGroup - - - dd/MM/yy hh:mm - - + + true - - Qt::LocalTime + + + 0 + 0 + + + + Park dome to home position + + + Park Dome + + shutdownProcedureGroup + - + Qt::Horizontal @@ -1316,127 +1734,76 @@ + + + + + 0 + 0 + + + + + + + - - - - - - - <html><head/><body><p>Define what should happen when a job steps into an error or aborts:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Don't re-schedule</span>: Don't restart the job in case of an error or an abort.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Re-schedule after all terminated</span>: If a job gets aborted, the scheduler will only re-schedule it if when all jobs are finished or aborted. If this is the case, the scheduler re-schedules all aborted jobs and sleeps for the given delay.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Re-schedule immediately</span>: As soon as a job gets aborted, the scheduler will re-schedule it and waits the given delay.</li></ul><p>If the option for re-scheduling errors is selected, errors are handled like aborts. Otherwise, jobs that step into an error are never re-scheduled.</p></body></html> - - - Handling of aborted jobs - - - - 18 - - - 0 - - - - - Do not re-schedule aborted jobs. - - - Don'&t re-schedule - - - errorHandlingButtonGroup - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Re-schedule aborted jobs as soon as all executable jobs are either completed or aborted. - - - Re-s&chedule after all finished - - - errorHandlingButtonGroup - - - - - - - Treat errors like aborts. - - - Re-schedule errors - - - - - - - Delay how long should be waited until an aborted job will be restarted. - - - wait (secs) - - - - - - - Re-schedule an aborted job immediately. - - - Re-s&chedule immediately - - - errorHandlingButtonGroup - - - - - - - Delay in seconds. - - - 10000 - - - 10 + + + + 1 - + + + + Script: + + + + + + + + 0 + 0 + + + + false + + + true + + + + + + + + 0 + 0 + + + + + + + + - - - - - - + + - <html><head/><body><p>One-time startup procedure to be executed before starting Ekos. The script is executed <span style=" font-weight:600; text-decoration: underline;">before</span> the startup procedures (e.g. unpark scope), if selected, are executed.</p></body></html> + <html><head/><body><p>Define what should happen when a job steps into an error or aborts:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Don't re-schedule</span>: Don't restart the job in case of an error or an abort.</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Re-schedule after all terminated</span>: If a job gets aborted, the scheduler will only re-schedule it if when all jobs are finished or aborted. If this is the case, the scheduler re-schedules all aborted jobs and sleeps for the given delay.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Re-schedule immediately</span>: As soon as a job gets aborted, the scheduler will re-schedule it and waits the given delay.</li></ul><p>If the option for re-scheduling errors is selected, errors are handled like aborts. Otherwise, jobs that step into an error are never re-scheduled.</p></body></html> - Observatory Startup Procedure + Aborted Job Management - + 1 @@ -1453,144 +1820,126 @@ 3 - + 1 - - - true + + + + 0 + 0 + - Park dome to home position + Do not re-schedule aborted jobs. - UnPark Dome + &None - startupProcedureButtonGroup + errorHandlingButtonGroup - - - true + + + + 0 + 0 + - Park telescope to home position. + Re-schedule aborted jobs as soon as all executable jobs are either completed or aborted. - UnPark Mount + &Queue - startupProcedureButtonGroup + errorHandlingButtonGroup - + + + + 0 + 0 + + - Open dust cover + Re-schedule an aborted job immediately. - UnCap + I&mmediate - startupProcedureButtonGroup + errorHandlingButtonGroup - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 32 - 32 - - - - - - - - + 1 - + + + + 0 + 0 + + + + Treat errors like aborts. + - Script: + Re-schedule errors - + - + 0 0 - - false + + Delay in seconds. - - true + + s wait - - - - - - - 32 - 32 - + + 10000 - - + + 10 - - - - - 0 - 0 - - + + - <html><head/><body><p>One-time shutdown procedure to be executed after all scheduler jobs are completed. The script is executed <span style=" font-weight:600; text-decoration: underline;">after</span> the shutdown procedures (e.g. parking), if selected, are completed.</p></body></html> + <html><head/><body><p>One-time startup procedure to be executed before starting Ekos. The script is executed <span style=" font-weight:600; text-decoration: underline;">before</span> the startup procedures (e.g. unpark scope), if selected, are executed.</p></body></html> - Observatory Shutdown Procedure + Observatory Startup Procedure - + 1 @@ -1607,73 +1956,75 @@ 3 - + 1 - + true - - Turn off CCD cooler. - - - Warm CCD + + + 0 + 0 + - - shutdownProcedureGroup - - - - - - Close dust cover + Park dome to home position - Cap + UnPark Dome - shutdownProcedureGroup + startupProcedureButtonGroup - + true + + + 0 + 0 + + Park telescope to home position. - Park Mount + UnPark Mount - shutdownProcedureGroup + startupProcedureButtonGroup - - - true + + + + 0 + 0 + - Park dome to home position + Open dust cover - Park Dome + UnCap - shutdownProcedureGroup + startupProcedureButtonGroup - + Qt::Horizontal @@ -1686,18 +2037,12 @@ - - - - 0 - 0 - - - - - 32 - 32 - + + + + 0 + 0 + @@ -1707,21 +2052,21 @@ - + 1 - + Script: - + - + 0 0 @@ -1735,12 +2080,12 @@ - - - - 32 - 32 - + + + + 0 + 0 + @@ -1754,29 +2099,6 @@ - - - - 3 - - - - - - - Qt::Vertical - - - QSizePolicy::Preferred - - - - 20 - 1 - - - - @@ -1789,17 +2111,9 @@ nameEdit - selectObjectB raBox decBox - fitsEdit - selectFITSB - sequenceEdit - loadSequenceB trackStepCheck - focusStepCheck - alignStepCheck - guideStepCheck unparkDomeCheck unparkMountCheck uncapCheck @@ -1822,21 +2136,6 @@ queueTable startB pauseB - asapConditionR - culminationConditionR - culminationOffset - startupTimeConditionR - startupTimeEdit - altConstraintCheck - minAltitude - moonSeparationCheck - minMoonSeparation - twilightCheck - weatherCheck - sequenceCompletionR - loopCompletionR - timeCompletionR - completionTimeEdit @@ -1846,23 +2145,23 @@ false - - - + false - + false - - + + false + + diff --git a/kstars/kstars.h b/kstars/kstars.h --- a/kstars/kstars.h +++ b/kstars/kstars.h @@ -37,6 +37,7 @@ class QDockWidget; class QPalette; class KActionMenu; +class KConfigDialog; class KStarsData; class SkyPoint; @@ -782,6 +783,9 @@ /** Initialize Menu bar, toolbars and all Actions. */ void initActions(); + /** Prepare options dialog. */ + KConfigDialog* prepareOps(); + /** Initialize Status bar. */ void initStatusBar(); diff --git a/kstars/kstars.kcfg b/kstars/kstars.kcfg --- a/kstars/kstars.kcfg +++ b/kstars/kstars.kcfg @@ -2301,6 +2301,14 @@ 3 + + + 0 + + + + 0 + 0 diff --git a/kstars/kstarsactions.cpp b/kstars/kstarsactions.cpp --- a/kstars/kstarsactions.cpp +++ b/kstars/kstarsactions.cpp @@ -1001,14 +1001,21 @@ void KStars::slotViewOps() { - //An instance of your dialog could be already created and could be cached, - //in which case you want to display the cached dialog instead of creating - //another one - if (KConfigDialog::showDialog("settings")) - return; + // An instance of your dialog could be already created and could be cached, + // in which case you want to display the cached dialog instead of creating + // another one + prepareOps()->show(); +} + +KConfigDialog* KStars::prepareOps() +{ + KConfigDialog *dialog = KConfigDialog::exists("settings"); + if (nullptr != dialog) + return dialog; + + // KConfigDialog didn't find an instance of this dialog, so lets create it : + dialog = new KConfigDialog(this, "settings", Options::self()); - //KConfigDialog didn't find an instance of this dialog, so lets create it : - KConfigDialog *dialog = new KConfigDialog(this, "settings", Options::self()); // For some reason the dialog does not resize to contents // so we set initial 'resonable' size here. Any better way to do this? dialog->resize(800, 600); @@ -1073,7 +1080,7 @@ page = dialog->addPage(opadvanced, i18n("Advanced"), "kstars_advanced"); page->setIcon(QIcon::fromTheme("kstars_advanced")); - dialog->show(); + return dialog; } void KStars::slotApplyConfigChanges() diff --git a/kstars/kstarsinit.cpp b/kstars/kstarsinit.cpp --- a/kstars/kstarsinit.cpp +++ b/kstars/kstarsinit.cpp @@ -374,6 +374,9 @@ KStandardAction::configureNotifications(this, SLOT(slotConfigureNotifications()), actionCollection()); #endif + // Prepare the options dialog early for modules to connect signals + prepareOps(); + ka = actionCollection()->addAction(KStandardAction::Preferences, "configure", this, SLOT(slotViewOps())); //I am not sure what icon preferences is supposed to be. //ka->setIcon( QIcon::fromTheme(""));