diff --git a/src/plugins/lua/bindings/utils.cpp b/src/plugins/lua/bindings/utils.cpp index 8b5895f34c7..fe8defbdb26 100644 --- a/src/plugins/lua/bindings/utils.cpp +++ b/src/plugins/lua/bindings/utils.cpp @@ -164,6 +164,26 @@ void addUtilsModule() utils["FilePath"]["searchInPath_cb"] = utils["__searchInPath_cb__"]; utils["FilePath"]["searchInPath"] = wrap(utils["__searchInPath_cb__"]); + utils.new_usertype( + "Timer", + "create", + [guard = pluginSpec](int timeout, bool singleShort, sol::function callback) + -> std::unique_ptr { + auto timer = std::make_unique(); + timer->setInterval(timeout); + timer->setSingleShot(singleShort); + QObject::connect( + timer.get(), &QTimer::timeout, guard->connectionGuard.get(), [callback]() { + ::Lua::LuaEngine::void_safe_call(callback); + }); + + return timer; + }, + "start", + [](QTimer *timer) { timer->start(); }, + "stop", + [](QTimer *timer) { timer->stop(); }); + return utils; }); } diff --git a/src/plugins/lua/meta/utils.lua b/src/plugins/lua/meta/utils.lua index cc8ebc08e2c..9a346eb3ba4 100644 --- a/src/plugins/lua/meta/utils.lua +++ b/src/plugins/lua/meta/utils.lua @@ -107,4 +107,19 @@ function utils.HostOsInfo.isMacHost() end function utils.HostOsInfo.isLinuxHost() end +---@class Timer +utils.Timer = {} + +---@param timeoutMs integer The timeout in milliseconds. +---@param singleShot boolean Whether the timer should only fire once. +---@param callback function The callback to call when the timeout is reached. +---@return Timer timer The created timer. +function utils.Timer.create(timeoutMs, singleShot, callback) end + +--- Starts the timer. Calling start on a running timer restarts the timer. +function utils.Timer:start() end + +--- Stops the timer. +function utils.Timer:stop() end + return utils