Commit 89af15c1 authored by Boris Petrov's avatar Boris Petrov 💾
Browse files

Add ability to run a command at timer's timeout

This commits adds the possibility to run a command when
a timer ends.

FEATURE: Add ability to run a command at timer's timeout
GUI:
parent bbfc1317
......@@ -191,6 +191,31 @@ Kirigami.ScrollablePage {
}
}
}
RowLayout {
anchors.left: parent.left
anchors.right: parent.right
ToolButton {
icon.name: "dialog-scripts"
display: AbstractButton.IconOnly
text: i18n("Command")
checked: timerDelegate && timerDelegate.isCommandTimeout
onClicked: timerDelegate.toggleIsCommandTimeout()
ToolTip.visible: hovered && text.length > 0
ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval
ToolTip.text: text
}
TextField {
Layout.fillWidth: true
enabled: timerDelegate && timerDelegate.isCommandTimeout
focus: true
font.family: "Monospace"
onEditingFinished: timerDelegate.saveCommandTimeout(text)
text: timerDelegate.commandTimeout
placeholderText: "Command to execute at timeout…"
}
}
}
}
}
......
......@@ -25,10 +25,14 @@ Timer::Timer(QString uuid, bool justCreated)
m_running = m_interface->running();
m_elapsed = m_interface->elapsed();
m_looping = m_interface->looping();
m_isCommandTimeout = m_interface->isCommandTimeout();
m_commandTimeout = m_interface->commandTimeout();
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);
connect(m_interface, &OrgKdeKclockTimerInterface::isCommandTimeoutChanged, this, &Timer::updateIsCommandTimeout);
connect(m_interface, &OrgKdeKclockTimerInterface::commandTimeoutChanged, this, &Timer::updateCommandTimeout);
updateRunning(); // start animation
}
......@@ -44,6 +48,16 @@ void Timer::toggleLooping()
m_interface->toggleLooping();
}
void Timer::toggleIsCommandTimeout()
{
m_interface->toggleIsCommandTimeout();
}
void Timer::saveCommandTimeout(QString command)
{
m_interface->saveCommandTimeout(command);
}
void Timer::reset()
{
m_interface->reset();
......@@ -88,6 +102,18 @@ void Timer::updateLooping()
Q_EMIT propertyChanged();
}
void Timer::updateIsCommandTimeout()
{
m_isCommandTimeout = m_interface->isCommandTimeout();
Q_EMIT propertyChanged();
}
void Timer::updateCommandTimeout()
{
m_commandTimeout = m_interface->commandTimeout();
Q_EMIT propertyChanged();
}
void Timer::animation(bool start)
{
if (!m_timer) {
......
......@@ -25,6 +25,8 @@ class Timer : public QObject
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)
Q_PROPERTY(bool isCommandTimeout READ isCommandTimeout NOTIFY propertyChanged)
Q_PROPERTY(QString commandTimeout READ commandTimeout NOTIFY propertyChanged)
public:
Timer();
......@@ -35,6 +37,8 @@ public:
};
Q_INVOKABLE void toggleRunning();
Q_INVOKABLE void toggleLooping();
Q_INVOKABLE void toggleIsCommandTimeout();
Q_INVOKABLE void saveCommandTimeout(QString);
Q_INVOKABLE void reset();
Q_INVOKABLE void addMinute();
......@@ -76,6 +80,14 @@ public:
{
return m_looping;
}
const bool &isCommandTimeout() const
{
return m_isCommandTimeout;
}
const QString &commandTimeout() const
{
return m_commandTimeout;
}
signals:
void propertyChanged();
......@@ -85,6 +97,8 @@ private slots:
void updateLabel();
void updateRunning();
void updateLooping();
void updateIsCommandTimeout();
void updateCommandTimeout();
private:
void animation(bool start);
......@@ -93,6 +107,8 @@ private:
QString m_label;
bool m_running;
bool m_looping;
bool m_isCommandTimeout;
QString m_commandTimeout;
bool m_justCreated;
QUuid m_uuid;
......
......@@ -6,6 +6,8 @@
#include "timer.h"
#include <QProcess>
#include "utilities.h"
#include <KLocalizedString>
......@@ -39,6 +41,8 @@ Timer::Timer(const QJsonObject &obj)
m_label = obj[QStringLiteral("label")].toString();
m_uuid = QUuid(obj[QStringLiteral("uuid")].toString());
m_looping = obj[QStringLiteral("looping")].toBool();
m_isCommandTimeout = obj[QStringLiteral("isCommandTimeout")].toBool();
m_commandTimeout = obj[QStringLiteral("commandTimeout")].toString();
connect(&Utilities::instance(), &Utilities::wakeup, this, &Timer::timeUp);
QDBusConnection::sessionBus().registerObject(QStringLiteral("/Timers/") + this->m_uuid.toString(QUuid::Id128),
......@@ -63,6 +67,8 @@ QJsonObject Timer::serialize()
obj[QStringLiteral("label")] = m_label;
obj[QStringLiteral("uuid")] = m_uuid.toString();
obj[QStringLiteral("looping")] = m_looping;
obj[QStringLiteral("isCommandTimeout")] = m_isCommandTimeout;
obj[QStringLiteral("commandTimeout")] = m_commandTimeout;
return obj;
}
......@@ -80,6 +86,24 @@ void Timer::toggleLooping()
TimerModel::instance()->save();
}
void Timer::toggleIsCommandTimeout()
{
m_isCommandTimeout = !m_isCommandTimeout;
Q_EMIT isCommandTimeoutChanged();
TimerModel::instance()->save();
}
void Timer::saveCommandTimeout(QString command)
{
m_commandTimeout = command;
Q_EMIT commandTimeoutChanged();
TimerModel::instance()->save();
}
void Timer::reset()
{
setRunning(false);
......@@ -93,6 +117,10 @@ void Timer::timeUp(int cookie)
if (cookie == m_cookie) {
this->sendNotification();
this->m_cookie = -1;
if (m_isCommandTimeout) {
QProcess *process = new QProcess;
process->start(m_commandTimeout);
}
if (m_looping) {
this->reset();
this->setRunning(true);
......
......@@ -21,6 +21,8 @@ class Timer : public QObject
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)
Q_PROPERTY(bool isCommandTimeout READ isCommandTimeout NOTIFY isCommandTimeoutChanged)
Q_PROPERTY(QString commandTimeout READ commandTimeout NOTIFY commandTimeoutChanged)
public:
explicit Timer(int length = 0, QString label = QStringLiteral(), bool running = false);
......@@ -31,6 +33,8 @@ public:
Q_SCRIPTABLE void toggleRunning();
Q_SCRIPTABLE void toggleLooping();
Q_SCRIPTABLE void toggleIsCommandTimeout();
Q_SCRIPTABLE void saveCommandTimeout(QString);
Q_SCRIPTABLE void reset();
Q_SCRIPTABLE int elapsed() const
{
......@@ -75,12 +79,22 @@ public:
{
return m_looping;
}
const bool &isCommandTimeout() const
{
return m_isCommandTimeout;
}
const QString &commandTimeout() const
{
return m_commandTimeout;
}
Q_SIGNALS:
Q_SCRIPTABLE void lengthChanged();
Q_SCRIPTABLE void labelChanged();
Q_SCRIPTABLE void runningChanged();
Q_SCRIPTABLE void loopingChanged();
Q_SCRIPTABLE void isCommandTimeoutChanged();
Q_SCRIPTABLE void commandTimeoutChanged();
private Q_SLOTS:
void timeUp(int cookie);
void reschedule();
......@@ -96,6 +110,8 @@ private:
QString m_label;
bool m_running = false;
bool m_looping = false;
bool m_isCommandTimeout = false;
QString m_commandTimeout = "";
};
#endif // KCLOCKD_TIMER_H
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment