Skip to content

Commit c6063d2

Browse files
committed
refactor: follow orginal wallpapers/image implementation
* switch now happens after the sunrise/sunset transition
1 parent 4db94ba commit c6063d2

5 files changed

Lines changed: 113 additions & 23 deletions

File tree

package/contents/config/main.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,5 +172,9 @@
172172
<entry name="AlternativePlaybackRate" type="Double">
173173
<default>0.5</default>
174174
</entry>
175+
<entry name="DarkLightScheduleState" type="String">
176+
<label>Saved dark light schedule state</label>
177+
<default></default>
178+
</entry>
175179
</group>
176180
</kcfg>

package/contents/ui/DayNightCycleController.qml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ Item {
1010
required property int sunsetTime
1111

1212
property var dayNightPlugin: null
13-
property Item dayNightPluginDay: null
1413
property int currentTime
1514

1615
property bool isDay: {
@@ -40,8 +39,6 @@ Item {
4039
return day;
4140
}
4241

43-
onIsDayChanged: console.log("isDayChanged", isDay)
44-
4542
Timer {
4643
id: timer
4744
interval: 1000
@@ -60,6 +57,13 @@ Item {
6057
component = Qt.createComponent("NighttimeHelper.qml");
6158
if (component.status === Component.Ready) {
6259
dayNightPlugin = component.createObject(root);
60+
dayNightPlugin.initialState = configuration.DarkLightScheduleState;
61+
dayNightPlugin.stateChanged.connect(() => {
62+
if (configuration.DarkLightScheduleState != dayNightPlugin.state) {
63+
configuration.DarkLightScheduleState = dayNightPlugin.state;
64+
configuration.writeConfig();
65+
}
66+
});
6367
} else {
6468
console.warn(component.errorString());
6569
}

package/contents/ui/NighttimeHelper.qml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import com.github.luisbocanegra.svwr.nighttime 1.0
33

44
Item {
55
property alias isDay: dayNight.isDay
6+
property alias initialState: dayNight.initialState
7+
property alias state: dayNight.state
68
DayNight {
79
id: dayNight
810
}

plugin/nighttime.cpp

Lines changed: 74 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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

93101
void 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
}

plugin/nighttime.h

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@
1212
#include <KDarkLightScheduleProvider>
1313
#include <KSystemClockSkewNotifier>
1414
#include <QObject>
15+
#include <QQmlParserStatus>
1516
#include <QTimer>
17+
#include <qqmlintegration.h>
1618

1719
class DayNightPhase
1820
{
@@ -44,28 +46,49 @@ inline DayNightPhase::operator DayNightPhase::Kind() const
4446
return m_kind;
4547
}
4648

47-
class DayNight : public QObject
49+
class DayNight : public QObject, public QQmlParserStatus
4850
{
4951
Q_OBJECT
52+
Q_INTERFACES(QQmlParserStatus)
53+
QML_ELEMENT
54+
5055
Q_PROPERTY(bool isDay READ isDay NOTIFY isDayChanged)
56+
Q_PROPERTY(QString initialState READ initialState WRITE setInitialState NOTIFY initialStateChanged)
57+
Q_PROPERTY(QString state READ state NOTIFY stateChanged)
5158

5259
public:
5360
explicit DayNight(QObject *parent = nullptr);
5461

62+
void classBegin() override;
63+
void componentComplete() override;
64+
5565
bool isDay() const;
5666

57-
~DayNight() override;
67+
QString initialState() const;
68+
void setInitialState(const QString &state);
69+
70+
QString state() const;
71+
void setState(const QString &state);
5872

5973
signals:
6074

6175
void isDayChanged(bool isDay);
76+
void initialStateChanged();
77+
void stateChanged();
6278

6379
private:
6480
void schedule();
81+
void update();
6582

66-
KDarkLightScheduleProvider *provider = nullptr;
83+
KDarkLightScheduleProvider *m_darkLightScheduleProvider = nullptr;
6784
KSystemClockSkewNotifier *m_systemClockMonitor;
85+
KDarkLightTransition m_previousTransition;
86+
KDarkLightTransition m_nextTransition;
6887
QTimer *m_rescheduleTimer;
88+
QTimer *m_transitionUpdateTimer;
89+
QString m_initialState;
90+
QString m_state;
91+
6992
bool m_isDay = false;
7093
};
7194

0 commit comments

Comments
 (0)