Skip to content

Commit 26ca4f6

Browse files
authored
Merge pull request #40 from InputActions/scripting-delay
scripting/core: add delay function
2 parents 866aea8 + 5fe350b commit 26ca4f6

6 files changed

Lines changed: 38 additions & 13 deletions

File tree

src/libinputactions/scripting/Promise.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,16 @@ void Promise::reject(const QString &errorMessage) const
4646
QThreadHelpers::runOnThread(
4747
QThreadHelpers::mainThread(),
4848
[this, errorMessage]() {
49-
if (m_reject.isCallable()) {
50-
m_engine->call(m_reject, {m_engine->ensureEngine().newErrorObject(QJSValue::GenericError, errorMessage)});
51-
}
49+
reject(m_engine->ensureEngine().newErrorObject(QJSValue::GenericError, errorMessage));
5250
},
5351
true);
5452
}
5553

54+
void Promise::reject(const QJSValue &error) const
55+
{
56+
if (m_reject.isCallable()) {
57+
m_engine->call(m_reject, {error});
58+
}
59+
}
60+
5661
}

src/libinputactions/scripting/Promise.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,11 @@ class Promise
6161
true);
6262
}
6363

64+
/**
65+
* Thread-safe.
66+
*/
6467
void reject(const QString &errorMessage) const;
68+
void reject(const QJSValue &error) const;
6569

6670
private:
6771
ScriptingEngine *m_engine;

src/libinputactions/scripting/ScriptingEngine.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ void ScriptingEngine::initialize()
6767
}
6868
)");
6969

70-
m_coreModule = std::make_unique<CoreModule>(m_engine->globalObject());
70+
m_coreModule = std::make_unique<CoreModule>(this);
7171
QJSEngine::setObjectOwnership(m_coreModule.get(), QJSEngine::CppOwnership);
7272
auto coreModule = m_engine->newQObject(m_coreModule.get());
7373
coreModule.setProperty("Point", m_engine->newQMetaObject(&PointF::staticMetaObject));

src/libinputactions/scripting/ScriptingEngine.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,6 @@ class ScriptingEngine : public QObject
6464
QString errorToString(const QJSValue &error) const;
6565
void logError(const QJSValue &error) const;
6666

67-
/**
68-
* Thread-safe.
69-
*/
70-
void throwError(const QString &message) const;
71-
7267
template<typename TReturn, typename... TArgs, typename TFunction>
7368
QJSValue newFunction(TFunction &&function)
7469
{

src/libinputactions/scripting/modules/core/CoreModule.cpp

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,37 @@
2020
#include "Config.h"
2121
#include <QJSEngine>
2222
#include <libinputactions/input/backends/InputBackend.h>
23+
#include <libinputactions/scripting/Promise.h>
24+
#include <libinputactions/scripting/ScriptingEngine.h>
2325
#include <libinputactions/variables/VariableRegistry.h>
2426

2527
namespace InputActions
2628
{
2729

28-
CoreModule::CoreModule(QJSValue globalObject)
29-
: m_config(std::make_unique<Config>())
30-
, m_globalObject(std::move(globalObject))
30+
CoreModule::CoreModule(ScriptingEngine *engine)
31+
: m_engine(engine)
32+
, m_config(std::make_unique<Config>())
33+
, m_globalObject(engine->ensureEngine().globalObject())
3134
{
3235
QJSEngine::setObjectOwnership(m_config.get(), QJSEngine::CppOwnership);
3336
}
3437

3538
CoreModule::~CoreModule() = default;
3639

40+
QJSValue CoreModule::delay(double duration)
41+
{
42+
auto promise = g_scriptingEngine->newPromise();
43+
if (duration < 1 || duration > INT32_MAX) {
44+
promise.reject(m_engine->ensureEngine().newErrorObject(QJSValue::RangeError, QString("Value %1 is out of range.").arg(QString::number(duration))));
45+
return promise.promise();
46+
}
47+
48+
QTimer::singleShot(std::floor(duration), Qt::PreciseTimer, this, [promise]() {
49+
promise.fulfill();
50+
});
51+
return promise.promise();
52+
}
53+
3754
Config *CoreModule::config() const
3855
{
3956
return m_config.get();

src/libinputactions/scripting/modules/core/CoreModule.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ namespace InputActions
2626

2727
class Config;
2828
class InputBackend;
29+
class ScriptingEngine;
2930
class VariableRegistry;
3031

3132
class CoreModule : public QObject
@@ -38,15 +39,18 @@ class CoreModule : public QObject
3839
Q_PROPERTY(VariableRegistry *variableRegistry READ variableRegistry)
3940

4041
public:
41-
CoreModule(QJSValue globalObject);
42+
CoreModule(ScriptingEngine *engine);
4243
~CoreModule() override;
4344

4445
Config *config() const;
4546
QJSValue globalThis() const { return m_globalObject; }
4647
InputBackend *input() const;
4748
VariableRegistry *variableRegistry() const;
4849

50+
Q_INVOKABLE QJSValue delay(double duration);
51+
4952
private:
53+
ScriptingEngine *m_engine;
5054
std::unique_ptr<Config> m_config;
5155
QJSValue m_globalObject;
5256
};

0 commit comments

Comments
 (0)