Git commit 836fe6313c161366647d8a6056f417148dbb7f28 by Devin Lin, on behalf of Boris Petrov. Committed on 19/07/2021 at 14:59. Pushed by devinlin into branch 'master'.
Add ability to loop timer With this addition one can set timers to loop indefinitely to do repetitive tasks for instance. FEATURE: Ability to loop timer GUI: M +10 -1 src/kclock/qml/TimerListPage.qml M +6 -0 src/kclock/qml/TimerPage.qml M +12 -0 src/kclock/timer.cpp M +8 -0 src/kclock/timer.h M +14 -2 src/kclockd/timer.cpp M +8 -0 src/kclockd/timer.h https://invent.kde.org/plasma-mobile/kclock/commit/836fe6313c161366647d8a6056f417148dbb7f28 diff --git a/src/kclock/qml/TimerListPage.qml b/src/kclock/qml/TimerListPage.qml index 905c447..8605df0 100644 --- a/src/kclock/qml/TimerListPage.qml +++ b/src/kclock/qml/TimerListPage.qml @@ -148,7 +148,16 @@ Kirigami.ScrollablePage { Row { Layout.alignment: Qt.AlignRight - + ToolButton { + icon.name: timerDelegate && timerDelegate.looping ? "media-repeat-all" : "media-repeat-none" + display: AbstractButton.IconOnly + text: timerDelegate && timerDelegate.looping ? i18n("Timer is looping") : i18n("Timer in not looping") + onClicked: timerDelegate.toggleLooping() + + ToolTip.visible: hovered && text.length > 0 + ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval + ToolTip.text: text + } ToolButton { icon.name: timerDelegate && timerDelegate.running ? "chronometer-pause" : "chronometer-start" display: AbstractButton.IconOnly diff --git a/src/kclock/qml/TimerPage.qml b/src/kclock/qml/TimerPage.qml index 28ace9b..f5713b9 100644 --- a/src/kclock/qml/TimerPage.qml +++ b/src/kclock/qml/TimerPage.qml @@ -24,6 +24,7 @@ Kirigami.Page { property int elapsed: timer == null ? 0 : timer.elapsed property int duration: timer == null ? 0 : timer.length property bool running: timer == null ? 0 : timer.running + property bool looping: timer == null ? 0 : timer.looping // keyboard controls Keys.onSpacePressed: timer.toggleRunning(); @@ -38,6 +39,11 @@ Kirigami.Page { } contextualActions: [ + Kirigami.Action { + text: looping ? i18n("Timer is looping") : i18n("Timer is not looping") + iconName: looping ? "media-repeat-all" : "media-repeat-none" + onTriggered: timer.toggleLooping() + }, Kirigami.Action { icon.name: "chronometer-reset" text: i18n("Reset") diff --git a/src/kclock/timer.cpp b/src/kclock/timer.cpp index 479f28f..58e9fa4 100644 --- a/src/kclock/timer.cpp +++ b/src/kclock/timer.cpp @@ -27,6 +27,7 @@ Timer::Timer(QString uuid, bool justCreated) connect(m_interface, &OrgKdeKclockTimerInterface::lengthChanged, this, &Timer::updateLength); connect(m_interface, &OrgKdeKclockTimerInterface::labelChanged, this, &Timer::updateLabel); connect(m_interface, &OrgKdeKclockTimerInterface::runningChanged, this, &Timer::updateRunning); + connect(m_interface, &OrgKdeKclockTimerInterface::loopingChanged, this, &Timer::updateLooping); updateRunning(); // start animation } @@ -37,6 +38,11 @@ void Timer::toggleRunning() m_interface->toggleRunning(); } +void Timer::toggleLooping() +{ + m_interface->toggleLooping(); +} + void Timer::reset() { m_interface->reset(); @@ -75,6 +81,12 @@ void Timer::updateRunning() Q_EMIT elapsedChanged(); } +void Timer::updateLooping() +{ + m_looping = m_interface->looping(); + Q_EMIT propertyChanged(); +} + void Timer::animation(bool start) { if (!m_timer) { diff --git a/src/kclock/timer.h b/src/kclock/timer.h index a14e5f7..fe83246 100644 --- a/src/kclock/timer.h +++ b/src/kclock/timer.h @@ -23,6 +23,7 @@ class Timer : public QObject Q_PROPERTY(QString elapsedPretty READ elapsedPretty NOTIFY elapsedChanged) Q_PROPERTY(QString label READ label WRITE setLabel NOTIFY propertyChanged) Q_PROPERTY(bool running READ running NOTIFY propertyChanged) + Q_PROPERTY(bool looping READ looping NOTIFY propertyChanged) Q_PROPERTY(bool justCreated MEMBER m_justCreated NOTIFY propertyChanged) public: @@ -33,6 +34,7 @@ public: return m_uuid; }; Q_INVOKABLE void toggleRunning(); + Q_INVOKABLE void toggleLooping(); Q_INVOKABLE void reset(); Q_INVOKABLE void addMinute(); @@ -70,6 +72,10 @@ public: { return m_running; } + const bool &looping() const + { + return m_looping; + } signals: void propertyChanged(); @@ -78,6 +84,7 @@ private slots: void updateLength(); void updateLabel(); void updateRunning(); + void updateLooping(); private: void animation(bool start); @@ -85,6 +92,7 @@ private: int m_length, m_elapsed; // seconds QString m_label; bool m_running; + bool m_looping; bool m_justCreated; QUuid m_uuid; diff --git a/src/kclockd/timer.cpp b/src/kclockd/timer.cpp index 5b31f7b..7320507 100644 --- a/src/kclockd/timer.cpp +++ b/src/kclockd/timer.cpp @@ -69,6 +69,13 @@ void Timer::toggleRunning() setRunning(!m_running); } +void Timer::toggleLooping() +{ + m_looping = !m_looping; + + Q_EMIT loopingChanged(); +} + void Timer::reset() { setRunning(false); @@ -82,8 +89,13 @@ void Timer::timeUp(int cookie) if (cookie == m_cookie) { this->sendNotification(); this->m_cookie = -1; - this->setRunning(false); - this->m_hasElapsed = m_length; + if (m_looping) { + this->reset(); + this->setRunning(true); + } else { + this->setRunning(false); + this->m_hasElapsed = m_length; + } } } diff --git a/src/kclockd/timer.h b/src/kclockd/timer.h index 71fc4cf..23eed5e 100644 --- a/src/kclockd/timer.h +++ b/src/kclockd/timer.h @@ -20,6 +20,7 @@ class Timer : public QObject Q_PROPERTY(int length READ length WRITE setLength NOTIFY lengthChanged) Q_PROPERTY(QString label READ label WRITE setLabel NOTIFY labelChanged) Q_PROPERTY(bool running READ running NOTIFY runningChanged) + Q_PROPERTY(bool looping READ looping NOTIFY loopingChanged) public: explicit Timer(int length = 0, QString label = QStringLiteral(), bool running = false); @@ -29,6 +30,7 @@ public: QJsonObject serialize(); Q_SCRIPTABLE void toggleRunning(); + Q_SCRIPTABLE void toggleLooping(); Q_SCRIPTABLE void reset(); Q_SCRIPTABLE int elapsed() const { @@ -69,11 +71,16 @@ public: { return m_running; } + const bool &looping() const + { + return m_looping; + } Q_SIGNALS: Q_SCRIPTABLE void lengthChanged(); Q_SCRIPTABLE void labelChanged(); Q_SCRIPTABLE void runningChanged(); + Q_SCRIPTABLE void loopingChanged(); private Q_SLOTS: void timeUp(int cookie); void reschedule(); @@ -88,6 +95,7 @@ private: int m_cookie = -1; QString m_label; bool m_running = false; + bool m_looping = false; }; #endif // KCLOCKD_TIMER_H
