From 08d39f9d962fd99f976170d632ab957504886dc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorbj=C3=B8rn=20Lindeijer?= Date: Tue, 16 Jan 2024 21:26:03 +0100 Subject: [PATCH] Derive World from Object This way we don't need the ScriptWorld class. Now a worlds can in theory get custom properties assigned to it. In practice, you can only do this through the scripting API for now, and these properties currently do not get saved (though that should be easy to add). --- src/libtiled/world.h | 6 ++++-- src/tiled/editableworld.cpp | 15 +++++++-------- src/tiled/editableworld.h | 20 +------------------- src/tiled/scriptmodule.cpp | 4 ++-- src/tiled/scriptmodule.h | 4 ++-- 5 files changed, 16 insertions(+), 33 deletions(-) diff --git a/src/libtiled/world.h b/src/libtiled/world.h index 2edf50efd1..fc6ef2cb4c 100644 --- a/src/libtiled/world.h +++ b/src/libtiled/world.h @@ -28,7 +28,7 @@ #pragma once -#include "tiled_global.h" +#include "object.h" #include #include @@ -41,11 +41,13 @@ namespace Tiled { -class TILEDSHARED_EXPORT World +class TILEDSHARED_EXPORT World : public Object { Q_DECLARE_TR_FUNCTIONS(Tiled::WorldManager); public: + World() : Object(WorldType) {} + struct Pattern { QRegularExpression regexp; diff --git a/src/tiled/editableworld.cpp b/src/tiled/editableworld.cpp index ee2dbb25b1..f076716369 100644 --- a/src/tiled/editableworld.cpp +++ b/src/tiled/editableworld.cpp @@ -31,9 +31,8 @@ namespace Tiled { EditableWorld::EditableWorld(WorldDocument *worldDocument, QObject *parent) : EditableAsset(worldDocument, nullptr, parent) - , mWorldObject(WorldManager::instance().worlds().value(worldDocument->fileName())) { - setObject(&mWorldObject); + setObject(WorldManager::instance().worlds().value(worldDocument->fileName())); } QString EditableWorld::displayName() const @@ -69,17 +68,17 @@ bool EditableWorld::isReadOnly() const int EditableWorld::mapIndex(const QString &fileName) const { - return mWorldObject.world->mapIndex(fileName); + return world()->mapIndex(fileName); } void EditableWorld::setMapRect(int mapIndex, const QRect &rect) { - if (mapIndex < 0 || mapIndex >= mWorldObject.world->maps.size()) { + if (mapIndex < 0 || mapIndex >= world()->maps.size()) { ScriptManager::instance().throwError(QCoreApplication::translate("Script Errors", "Index out of range")); return; } - const QString &fileName = mWorldObject.world->maps.at(mapIndex).fileName; + const QString &fileName = world()->maps.at(mapIndex).fileName; document()->undoStack()->push(new SetMapRectCommand(fileName, rect)); } @@ -100,18 +99,18 @@ void EditableWorld::addMap(const QString &mapFileName, const QRect &rect) void EditableWorld::removeMap(int mapIndex) { - if (mapIndex < 0 || mapIndex >= mWorldObject.world->maps.size()) { + if (mapIndex < 0 || mapIndex >= world()->maps.size()) { ScriptManager::instance().throwError(QCoreApplication::translate("Script Errors", "Index out of range")); return; } - const QString &fileName = mWorldObject.world->maps.at(mapIndex).fileName; + const QString &fileName = world()->maps.at(mapIndex).fileName; document()->undoStack()->push(new RemoveMapCommand(fileName)); } bool EditableWorld::save() { - return WorldManager::instance().saveWorld(mWorldObject.world->fileName); + return WorldManager::instance().saveWorld(world()->fileName); } QSharedPointer EditableWorld::createDocument() diff --git a/src/tiled/editableworld.h b/src/tiled/editableworld.h index fcb95e4aee..60a50ce121 100644 --- a/src/tiled/editableworld.h +++ b/src/tiled/editableworld.h @@ -50,21 +50,6 @@ class ScriptWorldMapEntry : public QObject World::MapEntry mMapEntry; }; -/** - * Wrapper which allows world structs to be used with the EditableAsset - * class. - */ -class ScriptWorld : public Object -{ -public: - ScriptWorld(World *world) - : Object(WorldType) - , world(world) - {} - - World *world; -}; - /** * @brief The EditableWorld class provides access to Worlds via scripting. */ @@ -93,14 +78,11 @@ class EditableWorld final : public EditableAsset Q_INVOKABLE bool save(); QSharedPointer createDocument() override; - -private: - ScriptWorld mWorldObject; }; inline World *EditableWorld::world() const { - return static_cast(object())->world; + return static_cast(object()); } } // namespace Tiled diff --git a/src/tiled/scriptmodule.cpp b/src/tiled/scriptmodule.cpp index 421f348ed8..82003c4eeb 100644 --- a/src/tiled/scriptmodule.cpp +++ b/src/tiled/scriptmodule.cpp @@ -701,9 +701,9 @@ void ScriptModule::currentDocumentChanged(Document *document) emit activeAssetChanged(document ? document->editable() : nullptr); } -QList ScriptModule::worlds() const +QList ScriptModule::worlds() const { - QList worlds; + QList worlds; auto documentManager = DocumentManager::maybeInstance(); if (!documentManager) diff --git a/src/tiled/scriptmodule.h b/src/tiled/scriptmodule.h index 9283ca9ea6..ccd5086990 100644 --- a/src/tiled/scriptmodule.h +++ b/src/tiled/scriptmodule.h @@ -73,7 +73,7 @@ class ScriptModule : public QObject Q_PROPERTY(Tiled::MapEditor *mapEditor READ mapEditor) Q_PROPERTY(Tiled::TilesetEditor *tilesetEditor READ tilesetEditor) - Q_PROPERTY(QList worlds READ worlds) + Q_PROPERTY(QList worlds READ worlds) public: ScriptModule(QObject *parent = nullptr); @@ -142,7 +142,7 @@ class ScriptModule : public QObject Q_INVOKABLE QString promptOpenFile(const QString &defaultDir = QString(), const QString &filters = QString(), const QString &title = QString()) const; Q_INVOKABLE QString promptSaveFile(const QString &defaultDir = QString(), const QString &filters = QString(), const QString &title = QString()) const; - QList worlds() const; + QList worlds() const; Q_INVOKABLE void loadWorld(const QString &fileName) const; Q_INVOKABLE void unloadWorld(const QString &fileName) const; Q_INVOKABLE void unloadAllWorlds() const;