change script timer setup to match HTML dom standard

This commit is contained in:
Stephen Birarda 2014-02-03 09:59:16 -08:00
parent d9cfaec4f0
commit 9dd8c11e1e
3 changed files with 50 additions and 12 deletions

View file

@ -1,5 +1,8 @@
var timer = new Timer(); var one_timer = Script.setTimeout(function() { print("One time timer fired!"); }, 1000);
timer.interval = 1000; var multiple_timer = Script.setInterval(function() { print("Repeating timer fired!"); }, 1000);
timer.singleShot = true; // set this is you only want the timer to fire once
timer.timeout.connect(function() { print("TIMER FIRED!"); }); // this would stop a scheduled single shot timer
timer.start(); Script.clearTimeout(one_timer);
// this stops the repeating timer
Script.clearInterval(multiple_timer);

View file

@ -105,9 +105,6 @@ bool ScriptEngine::setScriptContents(const QString& scriptContents) {
return true; return true;
} }
Q_SCRIPT_DECLARE_QMETAOBJECT(AudioInjectorOptions, QObject*)
Q_SCRIPT_DECLARE_QMETAOBJECT(QTimer, QObject*)
void ScriptEngine::init() { void ScriptEngine::init() {
if (_isInitialized) { if (_isInitialized) {
return; // only initialize once return; // only initialize once
@ -134,9 +131,6 @@ void ScriptEngine::init() {
QScriptValue injectionOptionValue = _engine.scriptValueFromQMetaObject<AudioInjectorOptions>(); QScriptValue injectionOptionValue = _engine.scriptValueFromQMetaObject<AudioInjectorOptions>();
_engine.globalObject().setProperty("AudioInjectionOptions", injectionOptionValue); _engine.globalObject().setProperty("AudioInjectionOptions", injectionOptionValue);
QScriptValue timerValue = _engine.scriptValueFromQMetaObject<QTimer>();
_engine.globalObject().setProperty("Timer", timerValue);
registerGlobalObject("Script", this); registerGlobalObject("Script", this);
registerGlobalObject("Audio", &_audioScriptingInterface); registerGlobalObject("Audio", &_audioScriptingInterface);
@ -302,4 +296,38 @@ void ScriptEngine::stop() {
_isFinished = true; _isFinished = true;
} }
void ScriptEngine::timerFired() {
QTimer* callingTimer = reinterpret_cast<QTimer*>(sender());
// call the associated JS function, if it exists
QScriptValue timerFunction = _timerFunctionMap.value(callingTimer);
if (timerFunction.isValid()) {
timerFunction.call();
}
if (!callingTimer->isActive()) {
// this timer is done, we can kill it
qDebug() << "Deleting a single shot timer";
delete callingTimer;
}
}
void ScriptEngine::setupTimerWithInterval(const QScriptValue& function, int intervalMS, bool isSingleShot) {
// create the timer, add it to the map, and start it
QTimer* newTimer = new QTimer(this);
connect(newTimer, &QTimer::timeout, this, &ScriptEngine::timerFired);
_timerFunctionMap.insert(newTimer, function);
newTimer->setSingleShot(isSingleShot);
newTimer->start(intervalMS);
}
void ScriptEngine::setInterval(const QScriptValue& function, int intervalMS) {
setupTimerWithInterval(function, intervalMS, false);
}
void ScriptEngine::setTimeout(const QScriptValue& function, int timeoutMS) {
setupTimerWithInterval(function, timeoutMS, true);
}

View file

@ -59,12 +59,17 @@ public:
bool isAvatar() const { return _isAvatar; } bool isAvatar() const { return _isAvatar; }
void setAvatarData(AvatarData* avatarData, const QString& objectName); void setAvatarData(AvatarData* avatarData, const QString& objectName);
void timerFired();
public slots: public slots:
void init(); void init();
void run(); /// runs continuously until Agent.stop() is called void run(); /// runs continuously until Agent.stop() is called
void stop(); void stop();
void evaluate(); /// initializes the engine, and evaluates the script, but then returns control to caller void evaluate(); /// initializes the engine, and evaluates the script, but then returns control to caller
void setInterval(const QScriptValue& function, int intervalMS);
void setTimeout(const QScriptValue& function, int timeoutMS);
signals: signals:
void willSendAudioDataCallback(); void willSendAudioDataCallback();
@ -73,15 +78,17 @@ signals:
void finished(const QString& fileNameString); void finished(const QString& fileNameString);
protected: protected:
QString _scriptContents; QString _scriptContents;
bool _isFinished; bool _isFinished;
bool _isRunning; bool _isRunning;
bool _isInitialized; bool _isInitialized;
QScriptEngine _engine; QScriptEngine _engine;
bool _isAvatar; bool _isAvatar;
QHash<QTimer*, QScriptValue> _timerFunctionMap;
private: private:
void setupTimerWithInterval(const QScriptValue& function, int intervalMS, bool isSingleShot);
static VoxelsScriptingInterface _voxelsScriptingInterface; static VoxelsScriptingInterface _voxelsScriptingInterface;
static ParticlesScriptingInterface _particlesScriptingInterface; static ParticlesScriptingInterface _particlesScriptingInterface;
AbstractControllerScriptingInterface* _controllerScriptingInterface; AbstractControllerScriptingInterface* _controllerScriptingInterface;