From ce599e4f9f94b4eb00c1b5edb85bce5431ab3df2 Mon Sep 17 00:00:00 2001 From: toma Date: Wed, 25 Nov 2009 17:56:58 +0000 Subject: Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features. BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdeedu@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- kstars/kstars/simclock.cpp | 191 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 191 insertions(+) create mode 100644 kstars/kstars/simclock.cpp (limited to 'kstars/kstars/simclock.cpp') diff --git a/kstars/kstars/simclock.cpp b/kstars/kstars/simclock.cpp new file mode 100644 index 00000000..ee486a86 --- /dev/null +++ b/kstars/kstars/simclock.cpp @@ -0,0 +1,191 @@ +/*************************************************************************** + simclock.cpp - description + ------------------- + begin : Mon Feb 18 2002 + copyright : (C) 2002 by Mark Hollomon + email : mhh@mindspring.com + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include + +#include "simclock.h" +#include "kstars.h" + +int SimClock::idgen = 1; + +int SimClock::TimerInterval = 100; //msec + +SimClock::SimClock(QObject *parent, const KStarsDateTime &when) : + DCOPObject("clock#" + QCString().setNum(idgen++)), + QObject(parent), + tmr(this) +{ + if (! when.isValid() ) tmr.stop(); + setUTC(when); + julianmark = UTC.djd(); + + Scale = 1.0; + ManualMode = false; + ManualActive = false; + + QObject::connect(&tmr, SIGNAL(timeout()), this, SLOT(tick())); +} + +SimClock::SimClock (const SimClock &old) : + DCOPObject("clock#" + QCString().setNum(idgen++)), + QObject(old.parent()), + SimClockInterface(), + tmr(this) +{ + UTC = old.UTC; + julianmark = old.julianmark; + + Scale = old.Scale; + ManualMode = old.ManualMode; + ManualActive = old.ManualActive; + + QObject::connect(&tmr, SIGNAL(timeout()), this, SLOT(tick())); +} + +void SimClock::tick() { + if ( ! ManualMode ) { //only tick if ManualMode is false + long mselapsed = sysmark.elapsed(); + if (mselapsed < lastelapsed) { + // The sysmark timer has wrapped after 24 hours back to 0 ms. + // Reset sysmark and julianmark + julianmark = UTC.djd(); + sysmark.start(); + lastelapsed = 0; + } else { + lastelapsed = mselapsed; + } + + long double scaledsec = (long double)mselapsed * (long double)Scale / 1000.0; + UTC.setDJD( julianmark + scaledsec / (24. * 3600.) ); + +// kdDebug() << "tick() : JD = " << KGlobal::locale()->formatNumber( UTC.djd(), 7 ) << +// " mselapsed = " << mselapsed << " scale = " << Scale << +// " scaledsec = " << double(scaledsec) << endl; + + emit timeAdvanced(); + } +} + +void SimClock::setManualMode( bool on ) { + if ( on ) { + //Turn on manual ticking. + //If the timer was active, stop the timer and set ManualActive=true. + //Otherwise, set ManualActive=false. + //Finally, set ManualMode=true. + if ( tmr.isActive() ) { + tmr.stop(); + ManualActive = true; + } else { + ManualActive = false; + } + ManualMode = true; + } else { + //Turn off manual ticking. If the Manual clock was active, start the timer. + //Then set ManualMode=false. + if ( isActive() ) { + sysmark.start(); + julianmark = UTC.djd(); + lastelapsed = 0; + tmr.start(TimerInterval); + } + ManualMode = false; + } +} + +void SimClock::manualTick( bool force ) { + if ( force || (ManualMode && ManualActive) ) { + setUTC( UTC.addSecs( (long double)Scale ) ); + } else if ( ! ManualMode ) tick(); +} + +bool SimClock::isActive() { + if ( ManualMode ) return ManualActive; + else return tmr.isActive(); +} + +// The SimClockInterface +void SimClock::stop() { + if ( ManualMode && ManualActive ) { + ManualActive = false; + emit clockStopped(); + } + + if (!ManualMode && tmr.isActive()) { + kdDebug() << i18n( "Stopping the timer" ) << endl; + tmr.stop(); + emit clockStopped(); + } +} + +void SimClock::start() { + if ( ManualMode && !ManualActive ) { + ManualActive = true; + sysmark.start(); + julianmark = UTC.djd(); + lastelapsed = 0; + emit clockStarted(); + //emit timeChanged() in order to restart calls to updateTime() + emit timeChanged(); + } + + if (! ManualMode && ! tmr.isActive()) { + kdDebug() << i18n( "Starting the timer" ) << endl; + sysmark.start(); + julianmark = UTC.djd(); + lastelapsed = 0; + tmr.start(TimerInterval); + emit clockStarted(); + } +} + +void SimClock::setUTC(const KStarsDateTime &newtime) { + if ( newtime.isValid() ) { + UTC = newtime; + if (tmr.isActive()) { + julianmark = UTC.djd(); + sysmark.start(); + lastelapsed = 0; + } + + kdDebug() << i18n( "Setting clock: UTC: %1 JD: %2" ) + .arg( UTC.toString() ).arg( KGlobal::locale()->formatNumber( UTC.djd() ) ) << endl; + emit timeChanged(); + } else { + kdDebug() << i18n( "Cannot set SimClock: Invalid Date/Time." ) << endl; + } +} + +void SimClock::setScale(float s) { + if (Scale != s ) { + kdDebug() << i18n( "New clock scale: %1 sec" ).arg( s ) << endl; + Scale = s; + if (tmr.isActive()) { + julianmark = UTC.djd(); + sysmark.start(); + lastelapsed = 0; + } + emit scaleChanged(s); + } +} + +//DCOP function to set clock scale +void SimClock::setClockScale(float s) { + setScale(s); +} + +#include "simclock.moc" -- cgit v1.2.3