void SaveAsImageDialog::accept() { const QString fileName = mUi->fileNameEdit->text(); if (fileName.isEmpty()) return; if (QFile::exists(fileName)) { const QMessageBox::StandardButton button = QMessageBox::warning(this, tr("Save as Image"), tr("%1 already exists.\n" "Do you want to replace it?") .arg(QFileInfo(fileName).fileName()), QMessageBox::Yes | QMessageBox::No, QMessageBox::No); if (button != QMessageBox::Yes) return; } const bool visibleLayersOnly = mUi->visibleLayersOnly->isChecked(); const bool useCurrentScale = mUi->currentZoomLevel->isChecked(); const bool drawTileGrid = mUi->drawTileGrid->isChecked(); MapRenderer *renderer = mMapDocument->renderer(); QSize mapSize = renderer->mapSize(); if (useCurrentScale) mapSize *= mCurrentScale; QImage image(mapSize, QImage::Format_ARGB32); image.fill(Qt::transparent); QPainter painter(&image); if (useCurrentScale && mCurrentScale != qreal(1)) { painter.setRenderHints(QPainter::SmoothPixmapTransform | QPainter::HighQualityAntialiasing); painter.setTransform(QTransform::fromScale(mCurrentScale, mCurrentScale)); } foreach (const Layer *layer, mMapDocument->map()->layers()) { if (visibleLayersOnly && !layer->isVisible()) continue; painter.setOpacity(layer->opacity()); const TileLayer *tileLayer = dynamic_cast<const TileLayer*>(layer); const ObjectGroup *objGroup = dynamic_cast<const ObjectGroup*>(layer); if (tileLayer) { renderer->drawTileLayer(&painter, tileLayer); } else if (objGroup) { QColor color = objGroup->color(); if (!color.isValid()) color = Qt::gray; // TODO: Support colors for different object types foreach (const MapObject *object, objGroup->objects()) renderer->drawMapObject(&painter, object, color); } } if (drawTileGrid) { QVector<GridStyle> gridStyles = QVector<GridStyle>() << GridStyle(1, QColor(Qt::black), Qt::CustomDashLine); renderer->drawGrid(&painter, QRectF(QPointF(), renderer->mapSize()), gridStyles); } image.save(fileName); mPath = QFileInfo(fileName).path(); // Store settings for next time QSettings *s = Preferences::instance()->settings(); s->setValue(QLatin1String(VISIBLE_ONLY_KEY), visibleLayersOnly); s->setValue(QLatin1String(CURRENT_SCALE_KEY), useCurrentScale); s->setValue(QLatin1String(DRAW_GRID_KEY), drawTileGrid); QDialog::accept(); }
void SaveAsImageDialog::accept() { const QString fileName = ui->name->text(); if (fileName.isEmpty()) return; if (QFile::exists(fileName)) { const QMessageBox::StandardButton button = QMessageBox::warning(this, tr("Save as Image"), tr("%1 already exists.\n" "Do you want to replace it?") .arg(QFileInfo(fileName).fileName()), QMessageBox::Yes | QMessageBox::No, QMessageBox::No); if (button != QMessageBox::Yes) return; } const bool visibleLayersOnly = ui->visibleLayers->isChecked(); const bool useCurrentScale = ui->currentZoomLevel->isChecked(); const bool drawTileGrid = ui->showGrid->isChecked(); MapRenderer *renderer = mMapEditor->renderer(); //remember the current render flags const Aurora::RenderFlags renderFlags = renderer->flags(); renderer->setFlag(ShowTileObjectOutlines, false); QSize mapSize = renderer->mapSize(); if (useCurrentScale) mapSize *= mCurrentScale; QImage image(mapSize, QImage::Format_ARGB32); image.fill(Qt::transparent); QPainter painter(&image); if (useCurrentScale && mCurrentScale != qreal(1)) { painter.setRenderHints(QPainter::SmoothPixmapTransform | QPainter::HighQualityAntialiasing); painter.setTransform(QTransform::fromScale(mCurrentScale, mCurrentScale)); } foreach (const Layer *layer, mMapEditor->map()->layers()) { if (visibleLayersOnly && !layer->isVisible()) continue; painter.setOpacity(layer->opacity()); const Tilelayer *tilelayer = dynamic_cast<const Tilelayer*>(layer); if (tilelayer) { renderer->drawTilelayer(&painter, tilelayer); } } if (drawTileGrid) { renderer->drawGrid(&painter, QRectF(QPointF(), renderer->mapSize())); } //restore the previous render flags renderer->setFlags(renderFlags); image.save(fileName); mPath = QFileInfo(fileName).path(); //store settings for next time QSettings *s = Preferences::instance()->settings(); s->setValue(QLatin1String(VISIBLE_ONLY_KEY), visibleLayersOnly); s->setValue(QLatin1String(CURRENT_SCALE_KEY), useCurrentScale); s->setValue(QLatin1String(DRAW_GRID_KEY), drawTileGrid); QDialog::accept(); }