@@ -73,39 +73,96 @@ DayNight::DayNight(QObject *parent)
7373 : QObject(parent)
7474 , m_systemClockMonitor(new KSystemClockSkewNotifier(this ))
7575 , m_rescheduleTimer(new QTimer(this ))
76+ , m_transitionUpdateTimer(new QTimer(this ))
7677{
77- provider = new KDarkLightScheduleProvider ();
78- QObject::connect (provider, &KDarkLightScheduleProvider::scheduleChanged, this , &DayNight::schedule);
78+ m_transitionUpdateTimer->setSingleShot (true );
79+ connect (m_transitionUpdateTimer, &QTimer::timeout, this , &DayNight::update);
80+
7981 m_systemClockMonitor->setActive (true );
8082 connect (m_systemClockMonitor, &KSystemClockSkewNotifier::skewed, this , &DayNight::schedule);
83+
8184 m_rescheduleTimer->setSingleShot (true );
8285 connect (m_rescheduleTimer, &QTimer::timeout, this , &DayNight::schedule);
83- schedule ();
8486}
8587
86- DayNight::~DayNight () = default ;
88+ void DayNight::classBegin ()
89+ {
90+ }
8791
88- bool DayNight::isDay () const
92+ void DayNight::componentComplete ()
8993{
90- return m_isDay;
94+ m_darkLightScheduleProvider = new KDarkLightScheduleProvider (m_initialState, this );
95+ connect (m_darkLightScheduleProvider, &KDarkLightScheduleProvider::scheduleChanged, this , [this ]() {
96+ setState (m_darkLightScheduleProvider->state ());
97+ schedule ();
98+ });
9199}
92100
93101void DayNight::schedule ()
94102{
95- qDebug () << " Updating day/night status..." ;
96103 const QDateTime now = QDateTime::currentDateTime ();
97- const KDarkLightSchedule schedule = provider->schedule ();
98- const KDarkLightTransition previousTransition = *schedule.previousTransition (now);
99- const KDarkLightTransition nextTransition = *schedule.nextTransition (now);
100- qDebug () << " Previous transition:" << previousTransition.type () << previousTransition.endDateTime ();
101- qDebug () << " Next transition:" << nextTransition.type () << nextTransition.startDateTime ();
102- const DayNightPhase phase = DayNightPhase::from (now, previousTransition, nextTransition);
103- qDebug () << " Current phase:" << int (phase);
104- const bool isDay = phase == DayNightPhase::Day || phase == DayNightPhase::Sunrise;
105- qDebug () << " Is it day?" << isDay;
104+ const KDarkLightSchedule schedule = m_darkLightScheduleProvider->schedule ();
105+
106+ m_previousTransition = *schedule.previousTransition (now);
107+ m_nextTransition = *schedule.nextTransition (now);
108+
109+ m_rescheduleTimer->start (now.msecsTo (m_nextTransition.startDateTime ()));
110+ update ();
111+ }
112+
113+ void DayNight::update ()
114+ {
115+ const QDateTime now = QDateTime::currentDateTime ();
116+
117+ DayNightPhase phase = DayNightPhase::from (now, m_previousTransition, m_nextTransition);
118+
119+ const bool isDay = phase == DayNightPhase::Day || phase == DayNightPhase::Sunset;
120+
106121 if (m_isDay != isDay) {
107122 m_isDay = isDay;
108123 emit isDayChanged (isDay);
109124 }
110- m_rescheduleTimer->start (now.msecsTo (nextTransition.startDateTime ()));
125+
126+ const int blendInterval = 60000 ;
127+ switch (phase) {
128+ case DayNightPhase::Night:
129+ case DayNightPhase::Day:
130+ m_transitionUpdateTimer->stop ();
131+ break ;
132+ case DayNightPhase::Sunrise:
133+ case DayNightPhase::Sunset:
134+ m_transitionUpdateTimer->start (blendInterval);
135+ break ;
136+ }
137+ }
138+
139+ void DayNight::setInitialState (const QString &state)
140+ {
141+ if (m_initialState != state) {
142+ m_initialState = state;
143+ Q_EMIT initialStateChanged ();
144+ }
145+ }
146+
147+ void DayNight::setState (const QString &state)
148+ {
149+ if (m_state != state) {
150+ m_state = state;
151+ Q_EMIT stateChanged ();
152+ }
153+ }
154+
155+ bool DayNight::isDay () const
156+ {
157+ return m_isDay;
158+ }
159+
160+ QString DayNight::initialState () const
161+ {
162+ return m_initialState;
163+ }
164+
165+ QString DayNight::state () const
166+ {
167+ return m_state;
111168}
0 commit comments