void TilesetDock::addTiles() { Tileset *tileset = currentTileset(); if (!tileset) return; Preferences *prefs = Preferences::instance(); const QString startLocation = QFileInfo(prefs->lastPath(Preferences::ImageFile)).absolutePath(); const QString filter = Utils::readableImageFormatsFilter(); const QStringList files = QFileDialog::getOpenFileNames(window(), tr("Add Tiles"), startLocation, filter); struct LoadedFile { QString imageSource; QPixmap image; }; QVector<LoadedFile> loadedFiles; for (const QString &file : files) { const QPixmap image(file); if (!image.isNull()) { loadedFiles.append(LoadedFile { file, image }); } else { QMessageBox warning(QMessageBox::Warning, tr("Add Tiles"), tr("Could not load \"%1\"!").arg(file), QMessageBox::Ignore | QMessageBox::Cancel, window()); warning.setDefaultButton(QMessageBox::Ignore); if (warning.exec() != QMessageBox::Ignore) return; } } if (loadedFiles.isEmpty()) return; prefs->setLastPath(Preferences::ImageFile, files.last()); QList<Tile*> tiles; tiles.reserve(loadedFiles.size()); for (LoadedFile &loadedFile : loadedFiles) { Tile *newTile = new Tile(tileset->takeNextTileId(), tileset); newTile->setImage(loadedFile.image); newTile->setImageSource(loadedFile.imageSource); tiles.append(newTile); } mMapDocument->undoStack()->push(new AddTiles(mMapDocument, tileset, tiles)); }
void TilesetEditor::addTiles(const QList<QUrl> &urls) { Tileset *tileset = currentTileset(); if (!tileset) return; Preferences *prefs = Preferences::instance(); struct LoadedFile { QUrl imageSource; QPixmap image; }; QVector<LoadedFile> loadedFiles; // If the tile is already in the tileset, warn user and confirm addition bool dontAskAgain = false; bool rememberOption = true; for (const QUrl &url : urls) { if (!(dontAskAgain && rememberOption) && hasTileInTileset(url, *tileset)) { if (dontAskAgain) continue; QCheckBox *checkBox = new QCheckBox(tr("Apply this action to all tiles")); QMessageBox warning(QMessageBox::Warning, tr("Add Tiles"), tr("Tile \"%1\" already exists in the tileset!").arg(url.toString()), QMessageBox::Yes | QMessageBox::No, mMainWindow->window()); warning.setDefaultButton(QMessageBox::Yes); warning.setInformativeText(tr("Add anyway?")); warning.setCheckBox(checkBox); int warningBoxChoice = warning.exec(); dontAskAgain = checkBox->checkState() == Qt::Checked; rememberOption = warningBoxChoice == QMessageBox::Yes; if (!rememberOption) continue; } const QPixmap image(url.toLocalFile()); if (!image.isNull()) { loadedFiles.append(LoadedFile { url, image }); } else { // todo: support lazy loading of selected remote files QMessageBox warning(QMessageBox::Warning, tr("Add Tiles"), tr("Could not load \"%1\"!").arg(url.toString()), QMessageBox::Ignore | QMessageBox::Cancel, mMainWindow->window()); warning.setDefaultButton(QMessageBox::Ignore); if (warning.exec() != QMessageBox::Ignore) return; } } if (loadedFiles.isEmpty()) return; const QString lastLocalFile = urls.last().toLocalFile(); if (!lastLocalFile.isEmpty()) prefs->setLastPath(Preferences::ImageFile, lastLocalFile); QList<Tile*> tiles; tiles.reserve(loadedFiles.size()); for (LoadedFile &loadedFile : loadedFiles) { Tile *newTile = new Tile(tileset->takeNextTileId(), tileset); newTile->setImage(loadedFile.image); newTile->setImageSource(loadedFile.imageSource); tiles.append(newTile); } mCurrentTilesetDocument->undoStack()->push(new AddTiles(mCurrentTilesetDocument, tiles)); }