00001 #include "clock.h"
00002
00003 #include "taskmanagerdata.h"
00004
00005 using namespace domain;
00006
00007 Clock::Clock() : m_time(QDateTime::currentDateTime())
00008 {
00009 m_timer.setInterval(1000);
00010 connect(&m_timer, SIGNAL(timeout()), this, SLOT(tick()));
00011 }
00012
00013 const QDateTime& Clock::time() const
00014 {
00015 return m_time;
00016 }
00017
00018 void Clock::setTime(const QDateTime& time)
00019 {
00020 m_time = time;
00021
00022 QList<StorableData*> notified;
00023
00024 Q_FOREACH (QDateTime eventTime, m_events.keys())
00025 {
00026 if (eventTime > time)
00027 break;
00028
00029 Q_FOREACH (StorableData* data, m_events.values(eventTime))
00030 {
00031 if (!notified.contains(data))
00032 {
00033 data->notify();
00034 notified << data;
00035 }
00036 }
00037
00038 m_events.remove(eventTime);
00039 }
00040
00041 emit timeChanged(time);
00042 }
00043
00044 void Clock::addEvent(const QDateTime& time, StorableData* data)
00045 {
00046 if (time > m_time)
00047 m_events.insert(time, data);
00048 else if (time == m_time)
00049 data->notify();
00050 }
00051
00052 void Clock::removeEvents(StorableData* data)
00053 {
00054 Q_FOREACH (QDateTime time, m_events.keys())
00055 m_events.remove(time, data);
00056 }
00057
00058 void Clock::deleteEvents(StorableData* data)
00059 {
00060 TaskManagerData::instance()->clock()->removeEvents(data);
00061 }
00062
00063 QDateTime Clock::currentTime()
00064 {
00065 return TaskManagerData::instance()->clock()->time();
00066 }
00067
00068 void Clock::newEvent(const QDateTime& time, StorableData* data)
00069 {
00070 TaskManagerData::instance()->clock()->addEvent(time, data);
00071 }
00072
00073 void Clock::setTicking(bool enable)
00074 {
00075 if (enable)
00076 {
00077 if (!m_timer.isActive())
00078 m_timer.start();
00079 }
00080 else
00081 m_timer.stop();
00082 }
00083
00084 bool Clock::isTicking() const
00085 {
00086 return m_timer.isActive();
00087 }
00088
00089 void Clock::tick()
00090 {
00091 setTime(m_time.addSecs(1));
00092 }