void TilesetDock::editTileset() { Tileset *tileset = currentTileset(); if (!tileset) return; DocumentManager *documentManager = DocumentManager::instance(); documentManager->openTileset(tileset->sharedPointer()); }
/** * Synchronizes the selection with the given stamp. Ignored when the stamp is * changing because of a selection change in the TilesetDock. */ void TilesetDock::selectTilesInStamp(const TileStamp &stamp) { if (mEmittingStampCaptured) return; QSet<Tile*> processed; QMap<QItemSelectionModel*, QItemSelection> selections; for (const TileStampVariation &variation : stamp.variations()) { const TileLayer &tileLayer = *variation.tileLayer(); for (const Cell &cell : tileLayer) { if (Tile *tile = cell.tile()) { if (processed.contains(tile)) continue; processed.insert(tile); // avoid spending time on duplicates Tileset *tileset = tile->tileset(); int tilesetIndex = mTilesets.indexOf(tileset->sharedPointer()); if (tilesetIndex != -1) { TilesetView *view = tilesetViewAt(tilesetIndex); if (!view->model()) // Lazily set up the model setupTilesetModel(view, tileset); const TilesetModel *model = view->tilesetModel(); const QModelIndex modelIndex = model->tileIndex(tile); QItemSelectionModel *selectionModel = view->selectionModel(); selections[selectionModel].select(modelIndex, modelIndex); } } } } if (!selections.isEmpty()) { mSynchronizingSelection = true; // Mark captured tiles as selected for (auto i = selections.constBegin(); i != selections.constEnd(); ++i) { QItemSelectionModel *selectionModel = i.key(); const QItemSelection &selection = i.value(); selectionModel->select(selection, QItemSelectionModel::SelectCurrent); } // Update the current tile (useful for animation and collision editors) auto first = selections.begin(); QItemSelectionModel *selectionModel = first.key(); const QItemSelection &selection = first.value(); const QModelIndex currentIndex = selection.first().topLeft(); if (selectionModel->currentIndex() != currentIndex) selectionModel->setCurrentIndex(currentIndex, QItemSelectionModel::NoUpdate); else currentChanged(currentIndex); mSynchronizingSelection = false; } }
/** * Sets the cell at the given coordinates. */ void Tiled::TileLayer::setCell(int x, int y, const Cell &cell) { Q_ASSERT(contains(x, y)); Cell &existingCell = mGrid[x + y * mWidth]; if (!mUsedTilesetsDirty) { Tileset *oldTileset = existingCell.isEmpty() ? nullptr : existingCell.tileset(); Tileset *newTileset = cell.tileset(); if (oldTileset != newTileset) { if (oldTileset) mUsedTilesetsDirty = true; else if (newTileset) mUsedTilesets.insert(newTileset->sharedPointer()); } } existingCell = cell; }
void TilesetDock::exportTileset() { Tileset *tileset = currentTileset(); if (!tileset) return; if (tileset->isExternal()) return; int mapTilesetIndex = mMapDocument->map()->tilesets().indexOf(tileset->sharedPointer()); if (mapTilesetIndex == -1) return; // To export a tileset we clone it, since the tileset could now be used by // other maps. This ensures undo can take the map back to using an embedded // tileset, without affecting those other maps. SharedTileset externalTileset = tileset->clone(); FormatHelper<TilesetFormat> helper(FileFormat::ReadWrite); Preferences *prefs = Preferences::instance(); QString suggestedFileName = prefs->lastPath(Preferences::ExternalTileset); suggestedFileName += QLatin1Char('/'); suggestedFileName += externalTileset->name(); const QLatin1String extension(".tsx"); if (!suggestedFileName.endsWith(extension)) suggestedFileName.append(extension); // todo: remember last used filter QString selectedFilter = TsxTilesetFormat().nameFilter(); const QString fileName = QFileDialog::getSaveFileName(this, tr("Export Tileset"), suggestedFileName, helper.filter(), &selectedFilter); if (fileName.isEmpty()) return; prefs->setLastPath(Preferences::ExternalTileset, QFileInfo(fileName).path()); TilesetFormat *format = helper.formatByNameFilter(selectedFilter); if (!format) return; // can't happen if (!format->write(*externalTileset, fileName)) { QString error = format->errorString(); QMessageBox::critical(window(), tr("Export Tileset"), tr("Error saving tileset: %1").arg(error)); return; } externalTileset->setFileName(fileName); externalTileset->setFormat(format); QUndoCommand *command = new ReplaceTileset(mMapDocument, mapTilesetIndex, externalTileset); mMapDocument->undoStack()->push(command); // Make sure the external tileset is selected int externalTilesetIndex = mTilesets.indexOf(externalTileset); if (externalTilesetIndex != -1) mTabBar->setCurrentIndex(externalTilesetIndex); }