better support for includes in entity scripts

This commit is contained in:
ZappoMan 2014-11-23 14:58:29 -08:00
parent 137642f8a5
commit cd0ee0ff1d
4 changed files with 25 additions and 6 deletions

View file

@ -99,13 +99,15 @@ QScriptValue EntityTreeRenderer::loadEntityScript(const EntityItemID& entityItem
} }
QString EntityTreeRenderer::loadScriptContents(const QString& scriptMaybeURLorText) { QString EntityTreeRenderer::loadScriptContents(const QString& scriptMaybeURLorText, bool& isURL) {
QUrl url(scriptMaybeURLorText); QUrl url(scriptMaybeURLorText);
// If the url is not valid, this must be script text... // If the url is not valid, this must be script text...
if (!url.isValid()) { if (!url.isValid()) {
isURL = false;
return scriptMaybeURLorText; return scriptMaybeURLorText;
} }
isURL = true;
QString scriptContents; // assume empty QString scriptContents; // assume empty
@ -168,7 +170,8 @@ QScriptValue EntityTreeRenderer::loadEntityScript(EntityItem* entity) {
return QScriptValue(); // no script return QScriptValue(); // no script
} }
QString scriptContents = loadScriptContents(entity->getScript()); bool isURL = false; // loadScriptContents() will tell us if this is a URL or just text.
QString scriptContents = loadScriptContents(entity->getScript(), isURL);
QScriptSyntaxCheckResult syntaxCheck = QScriptEngine::checkSyntax(scriptContents); QScriptSyntaxCheckResult syntaxCheck = QScriptEngine::checkSyntax(scriptContents);
if (syntaxCheck.state() != QScriptSyntaxCheckResult::Valid) { if (syntaxCheck.state() != QScriptSyntaxCheckResult::Valid) {
@ -179,6 +182,9 @@ QScriptValue EntityTreeRenderer::loadEntityScript(EntityItem* entity) {
return QScriptValue(); // invalid script return QScriptValue(); // invalid script
} }
if (isURL) {
_entitiesScriptEngine->setParentURL(entity->getScript());
}
QScriptValue entityScriptConstructor = _entitiesScriptEngine->evaluate(scriptContents); QScriptValue entityScriptConstructor = _entitiesScriptEngine->evaluate(scriptContents);
if (!entityScriptConstructor.isFunction()) { if (!entityScriptConstructor.isFunction()) {
@ -189,9 +195,14 @@ QScriptValue EntityTreeRenderer::loadEntityScript(EntityItem* entity) {
} }
QScriptValue entityScriptObject = entityScriptConstructor.construct(); QScriptValue entityScriptObject = entityScriptConstructor.construct();
EntityScriptDetails newDetails = { entity->getScript(), entityScriptObject }; EntityScriptDetails newDetails = { entity->getScript(), entityScriptObject };
_entityScripts[entityID] = newDetails; _entityScripts[entityID] = newDetails;
if (isURL) {
_entitiesScriptEngine->setParentURL("");
}
return entityScriptObject; // newly constructed return entityScriptObject; // newly constructed
} }

View file

@ -132,7 +132,7 @@ private:
QScriptValue loadEntityScript(const EntityItemID& entityItemID); QScriptValue loadEntityScript(const EntityItemID& entityItemID);
QScriptValue getPreviouslyLoadedEntityScript(const EntityItemID& entityItemID); QScriptValue getPreviouslyLoadedEntityScript(const EntityItemID& entityItemID);
QScriptValue getPreviouslyLoadedEntityScript(EntityItem* entity); QScriptValue getPreviouslyLoadedEntityScript(EntityItem* entity);
QString loadScriptContents(const QString& scriptMaybeURLorText); QString loadScriptContents(const QString& scriptMaybeURLorText, bool& isURL);
QScriptValueList createMouseEventArgs(const EntityItemID& entityID, QMouseEvent* event, unsigned int deviceID); QScriptValueList createMouseEventArgs(const EntityItemID& entityID, QMouseEvent* event, unsigned int deviceID);
QScriptValueList createMouseEventArgs(const EntityItemID& entityID, const MouseEvent& mouseEvent); QScriptValueList createMouseEventArgs(const EntityItemID& entityID, const MouseEvent& mouseEvent);

View file

@ -618,16 +618,20 @@ void ScriptEngine::stopTimer(QTimer *timer) {
} }
QUrl ScriptEngine::resolvePath(const QString& include) const { QUrl ScriptEngine::resolvePath(const QString& include) const {
// first lets check to see if it's already a full URL
QUrl url(include); QUrl url(include);
// first lets check to see if it's already a full URL
if (!url.scheme().isEmpty()) { if (!url.scheme().isEmpty()) {
return url; return url;
} }
// we apparently weren't a fully qualified url, so, let's assume we're relative // we apparently weren't a fully qualified url, so, let's assume we're relative
// to the original URL of our script // to the original URL of our script
QUrl parentURL(_fileNameString); QUrl parentURL;
if (_parentURL.isEmpty()) {
parentURL = QUrl(_fileNameString);
} else {
parentURL = QUrl(_parentURL);
}
// if the parent URL's scheme is empty, then this is probably a local file... // if the parent URL's scheme is empty, then this is probably a local file...
if (parentURL.scheme().isEmpty()) { if (parentURL.scheme().isEmpty()) {
parentURL = QUrl::fromLocalFile(_fileNameString); parentURL = QUrl::fromLocalFile(_fileNameString);
@ -660,6 +664,7 @@ void ScriptEngine::include(const QString& includeFile) {
#else #else
QString fileName = url.toLocalFile(); QString fileName = url.toLocalFile();
#endif #endif
QFile scriptFile(fileName); QFile scriptFile(fileName);
if (scriptFile.open(QFile::ReadOnly | QFile::Text)) { if (scriptFile.open(QFile::ReadOnly | QFile::Text)) {
qDebug() << "Including file:" << fileName; qDebug() << "Including file:" << fileName;

View file

@ -93,6 +93,8 @@ public:
void setUserLoaded(bool isUserLoaded) { _isUserLoaded = isUserLoaded; } void setUserLoaded(bool isUserLoaded) { _isUserLoaded = isUserLoaded; }
bool isUserLoaded() const { return _isUserLoaded; } bool isUserLoaded() const { return _isUserLoaded; }
void setParentURL(const QString& parentURL) { _parentURL = parentURL; }
public slots: public slots:
void stop(); void stop();
@ -121,6 +123,7 @@ signals:
protected: protected:
QString _scriptContents; QString _scriptContents;
QString _parentURL;
bool _isFinished; bool _isFinished;
bool _isRunning; bool _isRunning;
bool _isInitialized; bool _isInitialized;