Skip to content

Commit

Permalink
Don't destroy the script wrapper on reload
Browse files Browse the repository at this point in the history
Instead, the script wrapper now handles the AboutToReload and Reloaded
signals, in order to detach relevant script objects and to update its
object reference.
  • Loading branch information
bjorn committed May 17, 2024
1 parent b26f084 commit ad40e42
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 2 deletions.
10 changes: 10 additions & 0 deletions src/tiled/editablemap.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -698,6 +698,16 @@ void EditableMap::setDocument(Document *document)
void EditableMap::documentChanged(const ChangeEvent &change)
{
switch (change.type) {
case ChangeEvent::DocumentAboutToReload:
for (Layer *layer : map()->layers())
detachLayer(layer);

mRenderer.reset();
setObject(nullptr);
break;
case ChangeEvent::DocumentReloaded:
setObject(mapDocument()->map());
break;
case ChangeEvent::MapChanged:
if (static_cast<const MapChangeEvent&>(change).property == Map::OrientationProperty)
mRenderer.reset();
Expand Down
19 changes: 19 additions & 0 deletions src/tiled/editabletileset.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

#include "addremovetiles.h"
#include "addremovewangset.h"
#include "changeevents.h"
#include "editabletile.h"
#include "editablewangset.h"
#include "scriptimage.h"
Expand Down Expand Up @@ -402,6 +403,7 @@ void EditableTileset::setDocument(Document *document)

if (auto doc = tilesetDocument()) {
connect(doc, &Document::fileNameChanged, this, &EditableAsset::fileNameChanged);
connect(doc, &Document::changed, this, &EditableTileset::documentChanged);
connect(doc, &TilesetDocument::tilesAdded, this, &EditableTileset::attachTiles);
connect(doc, &TilesetDocument::tilesRemoved, this, &EditableTileset::detachTiles);
connect(doc, &TilesetDocument::tileObjectGroupChanged, this, &EditableTileset::tileObjectGroupChanged);
Expand Down Expand Up @@ -429,6 +431,23 @@ bool EditableTileset::tilesFromEditables(const QList<QObject *> &editableTiles,
return true;
}

void EditableTileset::documentChanged(const ChangeEvent &event)
{
switch (event.type) {
case ChangeEvent::DocumentAboutToReload:
detachTiles(tileset()->tiles());
detachWangSets(tileset()->wangSets());

setObject(nullptr);
break;
case ChangeEvent::DocumentReloaded:
setObject(tilesetDocument()->tileset().data());
break;
default:
break;
}
}

void EditableTileset::attachTiles(const QList<Tile *> &tiles)
{
for (Tile *tile : tiles) {
Expand Down
2 changes: 2 additions & 0 deletions src/tiled/editabletileset.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@

namespace Tiled {

class ChangeEvent;
class EditableTile;
class EditableWangSet;
class ScriptImage;
Expand Down Expand Up @@ -179,6 +180,7 @@ public slots:
private:
bool tilesFromEditables(const QList<QObject*> &editableTiles, QList<Tile *> &tiles);

void documentChanged(const ChangeEvent &event);
void attachTiles(const QList<Tile*> &tiles);
void detachTiles(const QList<Tile*> &tiles);
void detachWangSets(const QList<WangSet*> &wangSets);
Expand Down
1 change: 0 additions & 1 deletion src/tiled/mapdocument.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1607,7 +1607,6 @@ void MapDocument::swapMap(std::unique_ptr<Map> &other)
setHoveredMapObject(nullptr);
setCurrentLayer(nullptr);
setCurrentObject(nullptr);
mEditable.reset();

emit changed(AboutToReloadEvent());

Expand Down
1 change: 0 additions & 1 deletion src/tiled/tilesetdocument.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,6 @@ void TilesetDocument::swapTileset(SharedTileset &tileset)
// Bring pointers to safety
setSelectedTiles(QList<Tile*>());
setCurrentObject(mTileset.data());
mEditable.reset();
mWangColorModels.clear();

emit changed(AboutToReloadEvent());
Expand Down

0 comments on commit ad40e42

Please sign in to comment.