diff --git a/src/main.cpp b/src/main.cpp index b85bd62652606b8c35da1b4cc542501ad8ec8356..f4b4ebafa586e68d57b2e616476bbca74b655ec4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -36,9 +36,12 @@ int main(int argc, char *argv[]) app.installTranslator(&appTranslator); PulsatingScience window; + app.installEventFilter(&window); + if(argc == 2 && QString(argv[1]) == "--demo") { window.toggleHiddenDemoMode(); } + window.show(); return app.exec(); diff --git a/src/pulsaranimationwidget.cpp b/src/pulsaranimationwidget.cpp index fdb07f8f247b18e79e5bdad17f1e0d81d3eac6db..faa727259f8ac8987e1cf954ad345f842e60c4b4 100644 --- a/src/pulsaranimationwidget.cpp +++ b/src/pulsaranimationwidget.cpp @@ -772,6 +772,22 @@ void PulsarAnimationWidget::setPulsarBeamAngle(const int degrees) updateGL(); } +void PulsarAnimationWidget::getCameraPosition(double& cameraAngleH, double& cameraAngleV, double& cameraZoom) +{ + cameraAngleH = m_mouseAngleH; + cameraAngleV = m_mouseAngleV; + cameraZoom = m_cameraZoom; +} + +void PulsarAnimationWidget::resetCameraPosition(const double angleH, const double angleV, const double zoom) +{ + m_mouseAngleH = angleH; + m_mouseAngleV = angleV; + m_cameraZoom = zoom; + + updateCameraPosition(m_mouseAngleH, m_mouseAngleV, m_cameraZoom); +} + void PulsarAnimationWidget::updateOrbitPeriod() { m_orbitalPeriod = 3.1553e7 * sqrt( diff --git a/src/pulsaranimationwidget.h b/src/pulsaranimationwidget.h index 45369f9b4113db0571340a4b61d0ec14c917f3bd..0985e09f69730a656144eb31ba250dd4f105ef83 100644 --- a/src/pulsaranimationwidget.h +++ b/src/pulsaranimationwidget.h @@ -53,6 +53,8 @@ public: void setPulsarMagneticAxisInclination(const int degrees); void setPulsarSemiMajorAxis(const double length); void setPulsarBeamAngle(const int degrees); + void getCameraPosition(double& cameraAngleH, double& cameraAngleV, double& cameraZoom); + void resetCameraPosition(const double angleH, const double angleV, const double zoom); public slots: void runAnimation(); diff --git a/src/pulsatingscience.cpp b/src/pulsatingscience.cpp index 441c83aee0b6834782872094f06ef8f5ce689e00..407a3f5eb76112bc34c398df4b288d1305d9b3c2 100644 --- a/src/pulsatingscience.cpp +++ b/src/pulsatingscience.cpp @@ -121,6 +121,11 @@ PulsatingScience::PulsatingScience(QWidget *parent) : QMainWindow(parent) connect(m_hiddenShortcut, SIGNAL(activated()), this, SLOT(toggleHiddenDemoMode())); + // prepare inactivity timer + saveOrRestoreInitialAnimationSettings(); + m_inactivityTimer = new QTimer(this); + connect(m_inactivityTimer, SIGNAL(timeout()), this, SLOT(userInactivityCallback())); + // restore previously saved window and splitter layout QCoreApplication::setOrganizationName("Max-Planck-Insitut für Gravitationsphysik"); QCoreApplication::setOrganizationDomain("aei.mpg.de"); @@ -183,6 +188,10 @@ PulsatingScience::~PulsatingScience() m_hiddenShortcut->disconnect(); delete m_hiddenShortcut; } + + if(m_inactivityTimer) { + delete m_inactivityTimer; + } } void PulsatingScience::closeEvent(QCloseEvent *event) @@ -523,6 +532,7 @@ void PulsatingScience::toggleHiddenDemoMode() ui.dockAnimControl->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetFloatable); + m_inactivityTimer->stop(); m_hiddenDemoModeActivated = false; } else { @@ -541,6 +551,74 @@ void PulsatingScience::toggleHiddenDemoMode() ui.actionMenu_bar->setChecked(false); window()->setWindowState(windowState() | Qt::WindowFullScreen); ui.dockAnimControl->setFeatures(QDockWidget::NoDockWidgetFeatures); + m_inactivityTimer->start(600000); m_hiddenDemoModeActivated = true; } } + +bool PulsatingScience::eventFilter(QObject *obj, QEvent *event) +{ + if(event->type() == QEvent::MouseButtonPress) { + userActivity(); + } + + // return original event (we don't want to change any behavior) + return QObject::eventFilter(obj, event); +} + +void PulsatingScience::userActivity() +{ + if(m_hiddenDemoModeActivated) { + // restart existing timer + m_inactivityTimer->start(); + } +} + +void PulsatingScience::userInactivityCallback() +{ + saveOrRestoreInitialAnimationSettings(); +} + +void PulsatingScience::saveOrRestoreInitialAnimationSettings() +{ + static bool initialized = false; + + static bool radioCompanionWD; + static bool radioCompanionSun; + static bool radioCompanionNS; + static int sliderPulsarMass; + static int sliderPulsarSpinFrequency; + static int sliderPulsarSpinAxisInclination; + static int sliderPulsarMagneticAxisInclination; + static int sliderPulsarSemiMajorAxis; + + static double cameraAngleH; + static double cameraAngleV; + static double cameraZoom; + + if(initialized) { + // restore intial settings + ui.radioCompanionWD->setChecked(radioCompanionWD); + ui.radioCompanionSun->setChecked(radioCompanionSun); + ui.radioCompanionNS->setChecked(radioCompanionNS); + ui.sliderPulsarMass->setValue(sliderPulsarMass); + ui.sliderPulsarSpinFrequency->setValue(sliderPulsarSpinFrequency); + ui.sliderPulsarSpinAxisInclination->setValue(sliderPulsarSpinAxisInclination); + ui.sliderPulsarMagneticAxisInclination->setValue(sliderPulsarMagneticAxisInclination); + ui.sliderPulsarSemiMajorAxis->setValue(sliderPulsarSemiMajorAxis); + ui.pulsarGlWidget->resetCameraPosition(cameraAngleH, cameraAngleV, cameraZoom); + } + else { + // save initial settings + radioCompanionWD = ui.radioCompanionWD->isChecked(); + radioCompanionSun = ui.radioCompanionSun->isChecked(); + radioCompanionNS = ui.radioCompanionNS->isChecked(); + sliderPulsarMass = ui.sliderPulsarMass->value(); + sliderPulsarSpinFrequency = ui.sliderPulsarSpinFrequency->value(); + sliderPulsarSpinAxisInclination = ui.sliderPulsarSpinAxisInclination->value(); + sliderPulsarMagneticAxisInclination = ui.sliderPulsarMagneticAxisInclination->value(); + sliderPulsarSemiMajorAxis = ui.sliderPulsarSemiMajorAxis->value(); + ui.pulsarGlWidget->getCameraPosition(cameraAngleH, cameraAngleV, cameraZoom); + initialized = true; + } +} diff --git a/src/pulsatingscience.h b/src/pulsatingscience.h index 13eb6a3d392b333f223c9f6bff2b53a9f9d79940..c7a8fbf940071498500f4566781269591e4fe099 100644 --- a/src/pulsatingscience.h +++ b/src/pulsatingscience.h @@ -77,7 +77,15 @@ public slots: void updatePulsarSemiMajorAxisValue(double value); void toggleHiddenDemoMode(); + void userInactivityCallback(); + +protected: + bool eventFilter(QObject *obj, QEvent *event); + private: + void userActivity(); + void saveOrRestoreInitialAnimationSettings(); + Ui::PulsatingScienceClass ui; QShortcut *m_runShortcut; @@ -99,6 +107,8 @@ private: bool m_animControlVisible; bool m_animControlFloating; bool m_hiddenDemoModeActivated; + + QTimer *m_inactivityTimer; }; #endif // PULSATINGSCIENCE_H