/** * Replaces tilesets in \a map by similar tilesets in this map when possible, * and adds tilesets to \a missingTilesets whenever there is a tileset without * replacement in this map. * * \warning This method assumes that the tilesets in \a map are managed by * the TilesetManager! */ void MapDocument::unifyTilesets(Map *map, QVector<SharedTileset> &missingTilesets) { QVector<SharedTileset> availableTilesets = mMap->tilesets(); for (const SharedTileset &tileset : qAsConst(missingTilesets)) if (!availableTilesets.contains(tileset)) availableTilesets.append(tileset); TilesetManager *tilesetManager = TilesetManager::instance(); // Iterate over a copy because map->replaceTileset may invalidate iterator const QVector<SharedTileset> tilesets = map->tilesets(); for (const SharedTileset &tileset : tilesets) { // tileset already added if (availableTilesets.contains(tileset)) continue; SharedTileset replacement = tileset->findSimilarTileset(availableTilesets); // tileset not present and no replacement tileset found if (!replacement) { missingTilesets.append(tileset); availableTilesets.append(tileset); continue; } // replacement tileset found, change given map if (map->replaceTileset(tileset, replacement)) tilesetManager->addReference(replacement); tilesetManager->removeReference(tileset); } }
TilesetDocument::TilesetDocument(const SharedTileset &tileset, const QString &fileName) : Document(TilesetDocumentType, fileName) , mTileset(tileset) , mTerrainModel(new TilesetTerrainModel(this, this)) , mWangSetModel(new TilesetWangSetModel(this, this)) , mWangColorModel(nullptr) { mCurrentObject = tileset.data(); // warning: will need to be kept up-to-date mFileName = tileset->fileName(); connect(this, &TilesetDocument::propertyAdded, this, &TilesetDocument::onPropertyAdded); connect(this, &TilesetDocument::propertyRemoved, this, &TilesetDocument::onPropertyRemoved); connect(this, &TilesetDocument::propertyChanged, this, &TilesetDocument::onPropertyChanged); connect(this, &TilesetDocument::propertiesChanged, this, &TilesetDocument::onPropertiesChanged); connect(mTerrainModel, &TilesetTerrainModel::terrainRemoved, this, &TilesetDocument::onTerrainRemoved); connect(mWangSetModel, &TilesetWangSetModel::wangSetRemoved, this, &TilesetDocument::onWangSetRemoved); TilesetManager *tilesetManager = TilesetManager::instance(); tilesetManager->addReference(tileset); }
/** * Adds a tileset to this map at the given \a index. Emits the appropriate * signal. */ void MapDocument::insertTileset(int index, const SharedTileset &tileset) { emit tilesetAboutToBeAdded(index); mMap->insertTileset(index, tileset); TilesetManager *tilesetManager = TilesetManager::instance(); tilesetManager->addReference(tileset); emit tilesetAdded(index, tileset.data()); }
/** * Replaces the tileset at the given \a index with the new \a tileset. Replaces * all tiles from the replaced tileset with tiles from the new tileset. * * @return The replaced tileset. */ SharedTileset MapDocument::replaceTileset(int index, const SharedTileset &tileset) { SharedTileset oldTileset = mMap->tilesetAt(index); bool added = mMap->replaceTileset(oldTileset, tileset); TilesetManager *tilesetManager = TilesetManager::instance(); if (added) tilesetManager->addReference(tileset); tilesetManager->removeReference(oldTileset); if (added) emit tilesetReplaced(index, tileset.data(), oldTileset.data()); else emit tilesetRemoved(oldTileset.data()); return oldTileset; }
/** * Makes sure the all tilesets which are used at the given \a map will be * present in the map document. * * To reach the aim, all similar tilesets will be replaced by the version * in the current map document and all missing tilesets will be added to * the current map document. * * \warning This method assumes that the tilesets in \a map are managed by * the TilesetManager! */ void MapDocument::unifyTilesets(Map *map) { QList<QUndoCommand*> undoCommands; QVector<SharedTileset> availableTilesets = mMap->tilesets(); TilesetManager *tilesetManager = TilesetManager::instance(); // Iterate over a copy because map->replaceTileset may invalidate iterator const QVector<SharedTileset> tilesets = map->tilesets(); for (const SharedTileset &tileset : tilesets) { if (availableTilesets.contains(tileset)) continue; SharedTileset replacement = tileset->findSimilarTileset(availableTilesets); if (!replacement) { undoCommands.append(new AddTileset(this, tileset)); availableTilesets.append(tileset); continue; } // Merge the tile properties for (Tile *replacementTile : replacement->tiles()) { if (Tile *originalTile = tileset->findTile(replacementTile->id())) { Properties properties = replacementTile->properties(); properties.merge(originalTile->properties()); undoCommands.append(new ChangeProperties(this, tr("Tile"), replacementTile, properties)); } } if (map->replaceTileset(tileset, replacement)) tilesetManager->addReference(replacement); tilesetManager->removeReference(tileset); } if (!undoCommands.isEmpty()) { mUndoStack->beginMacro(tr("Tileset Changes")); const auto &commands = undoCommands; for (QUndoCommand *command : commands) mUndoStack->push(command); mUndoStack->endMacro(); } }