From 41f89d5963c9428094c94272315a479dcd91c934 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorbj=C3=B8rn=20Lindeijer?= Date: Fri, 12 Jan 2024 20:51:40 +0100 Subject: [PATCH] tiled.worlds no longer crashes --- src/libtiled/logginginterface.cpp | 1 + src/libtiled/object.h | 1 + src/tiled/editableobject.cpp | 1 + src/tiled/editableworld.cpp | 7 ++++--- src/tiled/exporthelper.cpp | 1 + src/tiled/propertybrowser.cpp | 14 +++++++------- src/tiled/scriptmodule.cpp | 16 +++++++++------- 7 files changed, 24 insertions(+), 17 deletions(-) diff --git a/src/libtiled/logginginterface.cpp b/src/libtiled/logginginterface.cpp index b63674112d..1d176220b1 100644 --- a/src/libtiled/logginginterface.cpp +++ b/src/libtiled/logginginterface.cpp @@ -188,6 +188,7 @@ SelectCustomProperty::SelectCustomProperty(QString fileName, id = static_cast(object)->colorIndex(); break; case Object::ProjectType: + case Object::WorldType: break; } } diff --git a/src/libtiled/object.h b/src/libtiled/object.h index 3c05ec1196..2f9e8e9486 100644 --- a/src/libtiled/object.h +++ b/src/libtiled/object.h @@ -51,6 +51,7 @@ class TILEDSHARED_EXPORT Object WangSetType = 0x040, WangColorType = 0x080, ProjectType = 0x100, + WorldType = 0x200, }; explicit Object(TypeId typeId, const QString &className = QString()) diff --git a/src/tiled/editableobject.cpp b/src/tiled/editableobject.cpp index d291b95e67..a02b07c9c9 100644 --- a/src/tiled/editableobject.cpp +++ b/src/tiled/editableobject.cpp @@ -144,6 +144,7 @@ static Map *mapForObject(Object *object) case Object::WangSetType: case Object::WangColorType: case Object::ProjectType: + case Object::WorldType: break; } return nullptr; diff --git a/src/tiled/editableworld.cpp b/src/tiled/editableworld.cpp index d5ad9df7f8..7d33c8f0ef 100644 --- a/src/tiled/editableworld.cpp +++ b/src/tiled/editableworld.cpp @@ -26,15 +26,16 @@ namespace Tiled { ScriptWorld::ScriptWorld(World *world) - : Object(*this) + : Object(WorldType) , world(world) { } EditableWorld::EditableWorld(WorldDocument *worldDocument, QObject *parent) - : EditableAsset(worldDocument, &mWorldObject, parent), - mWorldObject(ScriptWorld(WorldManager::instance().worlds().value(worldDocument->fileName()))) + : EditableAsset(worldDocument, nullptr, parent) + , mWorldObject(WorldManager::instance().worlds().value(worldDocument->fileName())) { + setObject(&mWorldObject); } diff --git a/src/tiled/exporthelper.cpp b/src/tiled/exporthelper.cpp index 69597c60ba..27427fbe83 100644 --- a/src/tiled/exporthelper.cpp +++ b/src/tiled/exporthelper.cpp @@ -207,6 +207,7 @@ void ExportHelper::resolveProperties(Object *object) const break; case Object::WangColorType: case Object::ProjectType: + case Object::WorldType: break; } diff --git a/src/tiled/propertybrowser.cpp b/src/tiled/propertybrowser.cpp index 1b1850b873..1cf4d314de 100644 --- a/src/tiled/propertybrowser.cpp +++ b/src/tiled/propertybrowser.cpp @@ -484,11 +484,7 @@ static void addAutomappingProperties(Properties &properties, const Object *objec addRuleOptions(); break; } - case Object::TilesetType: - case Object::TileType: - case Object::WangSetType: - case Object::WangColorType: - case Object::ProjectType: + default: break; } } @@ -696,7 +692,8 @@ void PropertyBrowser::valueChanged(QtProperty *property, const QVariant &val) case Object::TileType: applyTileValue(id, val); break; case Object::WangSetType: applyWangSetValue(id, val); break; case Object::WangColorType: applyWangColorValue(id, val); break; - case Object::ProjectType: break; + case Object::ProjectType: break; + case Object::WorldType: break; } } @@ -1804,7 +1801,8 @@ void PropertyBrowser::addProperties() case Object::TileType: addTileProperties(); break; case Object::WangSetType: addWangSetProperties(); break; case Object::WangColorType: addWangColorProperties(); break; - case Object::ProjectType: break; + case Object::ProjectType: break; + case Object::WorldType: break; } // Make sure certain properties are collapsed, to save space @@ -2023,6 +2021,8 @@ void PropertyBrowser::updateProperties() } case Object::ProjectType: break; + case Object::WorldType: + break; } } diff --git a/src/tiled/scriptmodule.cpp b/src/tiled/scriptmodule.cpp index e2a255953a..c51421ce2a 100644 --- a/src/tiled/scriptmodule.cpp +++ b/src/tiled/scriptmodule.cpp @@ -702,14 +702,16 @@ void ScriptModule::currentDocumentChanged(Document *document) QList ScriptModule::worlds() const { QList worlds; - for (const World *world : WorldManager::instance().worlds()) - { - const QString worldFile = world->fileName; - WorldDocument *worldDocument = new WorldDocument(worldFile); - // TODO crashing, store references to the world document somewhere to prevent it from freeing? - EditableAsset *editableWorld = worldDocument->createEditable().get(); - worlds.append(editableWorld); + + auto documentManager = DocumentManager::maybeInstance(); + if (!documentManager) + return worlds; + + for (const World *world : WorldManager::instance().worlds()) { + WorldDocument *worldDocument = documentManager->ensureWorldDocument(world->fileName); + worlds.append(worldDocument->editable()); } + return worlds; }