Skip to content

Commit e6f2526

Browse files
committed
Scripting: Added tiled.load to load assets without opening an editor
Still WIP, has known issues are likely also undiscovered ones.
1 parent b172c31 commit e6f2526

24 files changed

+199
-116
lines changed

src/libtiled/object.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,8 @@ class TILEDSHARED_EXPORT Object
150150
static void setPropertyTypes(const SharedPropertyTypes &propertyTypes);
151151
static const PropertyTypes &propertyTypes();
152152

153+
QObject *editable() const { return mEditable; }
154+
153155
private:
154156
const TypeId mTypeId;
155157
QString mClassName;

src/tiled/document.cpp

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -64,19 +64,6 @@ Document::~Document()
6464
}
6565
}
6666

67-
EditableAsset *Document::editable()
68-
{
69-
if (!mEditable)
70-
mEditable = createEditable();
71-
return mEditable.get();
72-
}
73-
74-
void Document::setEditable(std::unique_ptr<EditableAsset> editable)
75-
{
76-
mEditable = std::move(editable);
77-
mEditable->setDocument(this);
78-
}
79-
8067
void Document::setFileName(const QString &fileName)
8168
{
8269
if (mFileName == fileName)

src/tiled/document.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@
2828
#include <QString>
2929
#include <QVariant>
3030

31-
#include <memory>
32-
3331
class QUndoStack;
3432

3533
namespace Tiled {
@@ -95,8 +93,7 @@ class Document : public QObject,
9593
QUndoStack *undoStack() const;
9694
bool isModified() const;
9795

98-
EditableAsset *editable();
99-
void setEditable(std::unique_ptr<EditableAsset> editable);
96+
virtual EditableAsset *editable() = 0;
10097

10198
Object *currentObject() const { return mCurrentObject; }
10299
void setCurrentObject(Object *object);
@@ -149,7 +146,6 @@ class Document : public QObject,
149146
void ignoreBrokenLinksChanged(bool ignoreBrokenLinks);
150147

151148
protected:
152-
virtual std::unique_ptr<EditableAsset> createEditable() = 0;
153149
virtual bool isModifiedImpl() const;
154150

155151
void updateIsModified();
@@ -163,8 +159,6 @@ class Document : public QObject,
163159
Object *mCurrentObject = nullptr; /**< Current properties object. */
164160
Document *mCurrentObjectDocument = nullptr;
165161

166-
std::unique_ptr<EditableAsset> mEditable;
167-
168162
private:
169163
void currentObjectDocumentChanged(const ChangeEvent &change);
170164
void currentObjectDocumentDestroyed();

src/tiled/editableasset.cpp

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,16 @@
2828

2929
namespace Tiled {
3030

31-
EditableAsset::EditableAsset(Document *document, Object *object, QObject *parent)
31+
EditableAsset::EditableAsset(Object *object, QObject *parent)
3232
: EditableObject(this, object, parent)
33-
, mDocument(document)
3433
{
35-
if (document) {
36-
connect(document, &Document::modifiedChanged,
37-
this, &EditableAsset::modifiedChanged);
38-
}
34+
}
35+
36+
EditableAsset::~EditableAsset()
37+
{
38+
// Prevent owned object from trying to delete us again
39+
if (mDocument)
40+
setObject(nullptr);
3941
}
4042

4143
QString EditableAsset::fileName() const
@@ -126,6 +128,15 @@ void EditableAsset::redo()
126128
ScriptManager::instance().throwError(QCoreApplication::translate("Script Errors", "Undo system not available for this asset"));
127129
}
128130

131+
void EditableAsset::setDocument(Document *document)
132+
{
133+
Q_ASSERT(!mDocument && document);
134+
135+
mDocument = document->sharedFromThis();
136+
connect(document, &Document::modifiedChanged,
137+
this, &EditableAsset::modifiedChanged);
138+
}
139+
129140
} // namespace Tiled
130141

131142
#include "moc_editableasset.cpp"

src/tiled/editableasset.h

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#pragma once
2222

2323
#include "editableobject.h"
24+
#include "document.h"
2425

2526
#include <QJSValue>
2627
#include <QSharedPointer>
@@ -57,7 +58,8 @@ class EditableAsset : public EditableObject
5758
Q_PROPERTY(AssetType::Value assetType READ assetType CONSTANT)
5859

5960
public:
60-
EditableAsset(Document *document, Object *object, QObject *parent = nullptr);
61+
EditableAsset(Object *object, QObject *parent = nullptr);
62+
~EditableAsset() override;
6163

6264
QString fileName() const;
6365
bool isReadOnly() const override = 0;
@@ -88,22 +90,17 @@ public slots:
8890
void modifiedChanged();
8991
void fileNameChanged(const QString &fileName, const QString &oldFileName);
9092

91-
private:
92-
friend class Document;
93+
protected:
9394
void setDocument(Document *document);
9495

95-
Document *mDocument;
96+
private:
97+
DocumentPtr mDocument;
9698
};
9799

98100

99101
inline Document *EditableAsset::document() const
100102
{
101-
return mDocument;
102-
}
103-
104-
inline void EditableAsset::setDocument(Document *document)
105-
{
106-
mDocument = document;
103+
return mDocument.get();
107104
}
108105

109106
} // namespace Tiled

src/tiled/editablemap.cpp

Lines changed: 38 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -49,25 +49,14 @@
4949
namespace Tiled {
5050

5151
EditableMap::EditableMap(QObject *parent)
52-
: EditableAsset(nullptr, new Map(), parent)
52+
: EditableMap(std::make_unique<Map>(), parent)
5353
{
54-
mDetachedMap.reset(map());
5554
}
5655

5756
EditableMap::EditableMap(MapDocument *mapDocument, QObject *parent)
58-
: EditableAsset(mapDocument, mapDocument->map(), parent)
59-
, mSelectedArea(new EditableSelectedArea(mapDocument, this))
57+
: EditableAsset(mapDocument->map(), parent)
6058
{
61-
connect(mapDocument, &Document::fileNameChanged, this, &EditableAsset::fileNameChanged);
62-
connect(mapDocument, &Document::changed, this, &EditableMap::documentChanged);
63-
connect(mapDocument, &MapDocument::layerAdded, this, &EditableMap::attachLayer);
64-
connect(mapDocument, &MapDocument::layerRemoved, this, &EditableMap::detachLayer);
65-
66-
connect(mapDocument, &MapDocument::currentLayerChanged, this, &EditableMap::currentLayerChanged);
67-
connect(mapDocument, &MapDocument::selectedLayersChanged, this, &EditableMap::selectedLayersChanged);
68-
connect(mapDocument, &MapDocument::selectedObjectsChanged, this, &EditableMap::selectedObjectsChanged);
69-
70-
connect(mapDocument, &MapDocument::regionEdited, this, &EditableMap::onRegionEdited);
59+
setDocument(mapDocument);
7160
}
7261

7362
/**
@@ -76,14 +65,13 @@ EditableMap::EditableMap(MapDocument *mapDocument, QObject *parent)
7665
* The map's lifetime must exceed that of the EditableMap instance.
7766
*/
7867
EditableMap::EditableMap(const Map *map, QObject *parent)
79-
: EditableAsset(nullptr, const_cast<Map*>(map), parent)
68+
: EditableAsset(const_cast<Map*>(map), parent)
8069
, mReadOnly(true)
81-
, mSelectedArea(nullptr)
8270
{
8371
}
8472

8573
EditableMap::EditableMap(std::unique_ptr<Map> map, QObject *parent)
86-
: EditableAsset(nullptr, map.get(), parent)
74+
: EditableAsset(map.get(), parent)
8775
, mDetachedMap(std::move(map))
8876
{
8977
}
@@ -671,15 +659,26 @@ void EditableMap::setSelectedObjects(const QList<QObject *> &objects)
671659
QSharedPointer<Document> EditableMap::createDocument()
672660
{
673661
Q_ASSERT(mDetachedMap);
662+
Q_ASSERT(!document());
674663

675664
auto document = MapDocumentPtr::create(std::move(mDetachedMap));
676-
document->setEditable(std::unique_ptr<EditableAsset>(this));
665+
setDocument(document.data());
666+
667+
return document;
668+
}
677669

678-
mSelectedArea = new EditableSelectedArea(document.data(), this);
670+
EditableMap *EditableMap::get(MapDocument *mapDocument)
671+
{
672+
if (!mapDocument)
673+
return nullptr;
679674

680-
QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership);
675+
auto editable = EditableMap::find(mapDocument->map());
676+
if (editable)
677+
return editable;
681678

682-
return document;
679+
editable = new EditableMap(mapDocument);
680+
// editable->moveOwnershipToCpp();
681+
return editable;
683682
}
684683

685684
void EditableMap::documentChanged(const ChangeEvent &change)
@@ -759,6 +758,24 @@ MapRenderer *EditableMap::renderer() const
759758
return mRenderer.get();
760759
}
761760

761+
void EditableMap::setDocument(MapDocument *mapDocument)
762+
{
763+
EditableAsset::setDocument(mapDocument);
764+
765+
mSelectedArea = new EditableSelectedArea(mapDocument, this);
766+
767+
connect(mapDocument, &Document::fileNameChanged, this, &EditableAsset::fileNameChanged);
768+
connect(mapDocument, &Document::changed, this, &EditableMap::documentChanged);
769+
connect(mapDocument, &MapDocument::layerAdded, this, &EditableMap::attachLayer);
770+
connect(mapDocument, &MapDocument::layerRemoved, this, &EditableMap::detachLayer);
771+
772+
connect(mapDocument, &MapDocument::currentLayerChanged, this, &EditableMap::currentLayerChanged);
773+
connect(mapDocument, &MapDocument::selectedLayersChanged, this, &EditableMap::selectedLayersChanged);
774+
connect(mapDocument, &MapDocument::selectedObjectsChanged, this, &EditableMap::selectedObjectsChanged);
775+
776+
connect(mapDocument, &MapDocument::regionEdited, this, &EditableMap::onRegionEdited);
777+
}
778+
762779
} // namespace Tiled
763780

764781
#include "moc_editablemap.cpp"

src/tiled/editablemap.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,9 @@ class EditableMap final : public EditableAsset
202202

203203
QSharedPointer<Document> createDocument() override;
204204

205+
static EditableMap *find(Map *map);
206+
static EditableMap *get(MapDocument *mapDocument);
207+
205208
signals:
206209
void currentLayerChanged();
207210
void selectedLayersChanged();
@@ -221,6 +224,8 @@ class EditableMap final : public EditableAsset
221224

222225
MapRenderer *renderer() const;
223226

227+
void setDocument(MapDocument *mapDocument);
228+
224229
std::unique_ptr<Map> mDetachedMap;
225230
mutable std::unique_ptr<MapRenderer> mRenderer;
226231
bool mReadOnly = false;
@@ -380,6 +385,11 @@ inline MapDocument *EditableMap::mapDocument() const
380385
return static_cast<MapDocument*>(document());
381386
}
382387

388+
inline EditableMap *EditableMap::find(Map *map)
389+
{
390+
return static_cast<EditableMap*>(EditableObject::find(map));
391+
}
392+
383393
} // namespace Tiled
384394

385395
Q_DECLARE_METATYPE(Tiled::EditableMap*)

src/tiled/editableobject.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ inline void EditableObject::setAsset(EditableAsset *asset)
154154

155155
inline EditableObject *EditableObject::find(Object *object)
156156
{
157-
return object ? static_cast<EditableObject*>(object->mEditable.data())
157+
return object ? static_cast<EditableObject*>(object->editable())
158158
: nullptr;
159159
}
160160

src/tiled/editableproject.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,9 @@
2626
namespace Tiled {
2727

2828
EditableProject::EditableProject(ProjectDocument *projectDocument, QObject *parent)
29-
: EditableAsset(projectDocument, &projectDocument->project(), parent)
29+
: EditableAsset(&projectDocument->project(), parent)
3030
{
31+
setDocument(projectDocument);
3132
}
3233

3334
QString EditableProject::extensionsPath() const
@@ -62,6 +63,18 @@ QSharedPointer<Document> EditableProject::createDocument()
6263
return nullptr;
6364
}
6465

66+
EditableProject *EditableProject::get(ProjectDocument *projectDocument)
67+
{
68+
if (!projectDocument)
69+
return nullptr;
70+
71+
auto editable = find(&projectDocument->project());
72+
if (editable)
73+
return editable;
74+
75+
return new EditableProject(projectDocument);
76+
}
77+
6578
} // namespace Tiled
6679

6780
#include "moc_editableproject.cpp"

src/tiled/editableproject.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,21 @@ class EditableProject final : public EditableAsset
5353
Project *project() const;
5454

5555
QSharedPointer<Document> createDocument() override;
56+
57+
static EditableProject *find(Project *project);
58+
static EditableProject *get(ProjectDocument *projectDocument);
5659
};
5760

5861
inline Project *EditableProject::project() const
5962
{
6063
return static_cast<Project*>(object());
6164
}
6265

66+
inline EditableProject *EditableProject::find(Project *project)
67+
{
68+
return static_cast<EditableProject*>(EditableObject::find(project));
69+
}
70+
6371
} // namespace Tiled
6472

6573
Q_DECLARE_METATYPE(Tiled::EditableProject*)

0 commit comments

Comments
 (0)