void TileCollisionDock::tileObjectGroupChanged(Tile *tile) { if (mTile != tile) return; if (mApplyingChanges) return; mSynchronizing = true; mDummyMapDocument->undoStack()->clear(); auto selectedTool = mToolManager->selectedTool(); LayerModel *layerModel = mDummyMapDocument->layerModel(); delete layerModel->takeLayerAt(nullptr, 1); ObjectGroup *objectGroup; if (tile->objectGroup()) objectGroup = tile->objectGroup()->clone(); else objectGroup = new ObjectGroup; objectGroup->setDrawOrder(ObjectGroup::IndexOrder); layerModel->insertLayer(nullptr, 1, objectGroup); mDummyMapDocument->setCurrentLayer(objectGroup); mToolManager->selectTool(selectedTool); mSynchronizing = false; }
void TileCollisionDock::setTile(Tile *tile) { if (mTile == tile) return; mTile = tile; mMapScene->disableSelectedTool(); MapDocument *previousDocument = mDummyMapDocument; mMapView->setEnabled(tile); if (tile) { Map::Orientation orientation = Map::Orthogonal; QSize tileSize = tile->size(); if (tile->tileset()->orientation() == Tileset::Isometric) { orientation = Map::Isometric; tileSize = tile->tileset()->gridSize(); } Map *map = new Map(orientation, 1, 1, tileSize.width(), tileSize.height()); map->addTileset(tile->sharedTileset()); TileLayer *tileLayer = new TileLayer(QString(), 0, 0, 1, 1); tileLayer->setCell(0, 0, Cell(tile)); map->addLayer(tileLayer); ObjectGroup *objectGroup; if (tile->objectGroup()) objectGroup = tile->objectGroup()->clone(); else objectGroup = new ObjectGroup; objectGroup->setDrawOrder(ObjectGroup::IndexOrder); map->setNextObjectId(objectGroup->highestObjectId() + 1); map->addLayer(objectGroup); mDummyMapDocument = new MapDocument(map); mDummyMapDocument->setCurrentLayer(objectGroup); mMapScene->setMapDocument(mDummyMapDocument); mToolManager->setMapDocument(mDummyMapDocument); mMapScene->enableSelectedTool(); connect(mDummyMapDocument->undoStack(), &QUndoStack::indexChanged, this, &TileCollisionDock::applyChanges); connect(mDummyMapDocument, &MapDocument::selectedObjectsChanged, this, &TileCollisionDock::selectedObjectsChanged); } else { mDummyMapDocument = nullptr; mMapScene->setMapDocument(nullptr); mToolManager->setMapDocument(nullptr); } emit dummyMapDocumentChanged(mDummyMapDocument); setHasSelectedObjects(false); if (previousDocument) { // Explicitly disconnect early from this signal, since it can get fired // from the QUndoStack destructor. disconnect(previousDocument->undoStack(), &QUndoStack::indexChanged, this, &TileCollisionDock::applyChanges); delete previousDocument; } }