diff options
author | Friedemann Kleint <[email protected]> | 2018-01-12 15:32:10 +0100 |
---|---|---|
committer | Friedemann Kleint <[email protected]> | 2018-02-14 09:37:16 +0000 |
commit | cd85d3aba56a142374226f5fdec8df3b6632357b (patch) | |
tree | e02f51fb9a6d8f78a459d7795b0ff52064f8ed2c /src/plugins/imageviewer/imageview.cpp | |
parent | 43936b1e8619ec8cc25d7699e53b638d8f0627b1 (diff) |
Add SVG multi export
Add a second SVG export option that allows for exporting
a series of icons of various size in one go. A dialog is shown
that allows for entering a file name pattern with place holders
and a list of sizes.
Change-Id: Ic644a9d402aa44af5899c29cf83051fdd7bba3d1
Reviewed-by: Leena Miettinen <[email protected]>
Reviewed-by: Diana de Sousa <[email protected]>
Reviewed-by: Alessandro Portale <[email protected]>
Diffstat (limited to 'src/plugins/imageviewer/imageview.cpp')
-rw-r--r-- | src/plugins/imageviewer/imageview.cpp | 105 |
1 files changed, 79 insertions, 26 deletions
diff --git a/src/plugins/imageviewer/imageview.cpp b/src/plugins/imageviewer/imageview.cpp index db7869cd2e3..dfa4a547fe5 100644 --- a/src/plugins/imageviewer/imageview.cpp +++ b/src/plugins/imageviewer/imageview.cpp @@ -51,6 +51,7 @@ #include "imageview.h" #include "exportdialog.h" +#include "multiexportdialog.h" #include "imageviewerfile.h" #include <coreplugin/messagemanager.h> @@ -156,6 +157,53 @@ void ImageView::drawBackground(QPainter *p, const QRectF &) p->restore(); } +QImage ImageView::renderSvg(const QSize &imageSize) const +{ + QImage image(imageSize, QImage::Format_ARGB32); + image.fill(Qt::transparent); + QPainter painter; + painter.begin(&image); +#ifndef QT_NO_SVG + QGraphicsSvgItem *svgItem = qgraphicsitem_cast<QGraphicsSvgItem *>(m_imageItem); + QTC_ASSERT(svgItem, return image); + svgItem->renderer()->render(&painter, QRectF(QPointF(), QSizeF(imageSize))); +#endif + painter.end(); + return image; +} + +bool ImageView::exportSvg(const ExportData &ed) +{ + const bool result = renderSvg(ed.size).save(ed.fileName); + if (result) { + const QString message = tr("Exported \"%1\", %2x%3, %4 bytes") + .arg(QDir::toNativeSeparators(ed.fileName)) + .arg(ed.size.width()).arg(ed.size.height()) + .arg(QFileInfo(ed.fileName).size()); + Core::MessageManager::write(message); + } else { + const QString message = tr("Could not write file \"%1\".").arg(QDir::toNativeSeparators(ed.fileName)); + QMessageBox::critical(this, tr("Export Image"), message); + } + return result; +} + +static QString suggestedExportFileName(const QFileInfo &fi) +{ + return fi.absolutePath() + QLatin1Char('/') + fi.baseName() + + QStringLiteral(".png"); +} + +QSize ImageView::svgSize() const +{ + QSize result; +#ifndef QT_NO_SVG + if (const QGraphicsSvgItem *svgItem = qgraphicsitem_cast<QGraphicsSvgItem *>(m_imageItem)) + result = svgItem->boundingRect().size().toSize(); +#endif // !QT_NO_SVG + return result; +} + void ImageView::exportImage() { #ifndef QT_NO_SVG @@ -163,37 +211,42 @@ void ImageView::exportImage() QTC_ASSERT(svgItem, return); const QFileInfo origFi = m_file->filePath().toFileInfo(); - const QString suggestedFileName = origFi.absolutePath() + QLatin1Char('/') - + origFi.baseName() + QStringLiteral(".png"); - ExportDialog exportDialog(this); exportDialog.setWindowTitle(tr("Export %1").arg(origFi.fileName())); - exportDialog.setExportSize(svgItem->boundingRect().size().toSize()); - exportDialog.setExportFileName(suggestedFileName); + exportDialog.setExportSize(svgSize()); + exportDialog.setExportFileName(suggestedExportFileName(origFi)); - while (true) { - if (exportDialog.exec() != QDialog::Accepted) - break; + while (exportDialog.exec() == QDialog::Accepted && !exportSvg(exportDialog.exportData())) {} +#endif // !QT_NO_SVG +} - const QSize imageSize = exportDialog.exportSize(); - QImage image(imageSize, QImage::Format_ARGB32); - image.fill(Qt::transparent); - QPainter painter; - painter.begin(&image); - svgItem->renderer()->render(&painter, QRectF(QPointF(), QSizeF(imageSize))); - painter.end(); - - const QString fileName = exportDialog.exportFileName(); - if (image.save(fileName)) { - const QString message = tr("Exported \"%1\", %2x%3, %4 bytes") - .arg(QDir::toNativeSeparators(fileName)).arg(imageSize.width()).arg(imageSize.height()) - .arg(QFileInfo(fileName).size()); - Core::MessageManager::write(message); - break; - } else { - QMessageBox::critical(this, tr("Export Image"), - tr("Could not write file \"%1\".").arg(QDir::toNativeSeparators(fileName))); +void ImageView::exportMultiImages() +{ +#ifndef QT_NO_SVG + QTC_ASSERT(qgraphicsitem_cast<QGraphicsSvgItem *>(m_imageItem), return); + + const QFileInfo origFi = m_file->filePath().toFileInfo(); + const QSize size = svgSize(); + const QString title = + tr("Export a Series of Images from %1 (%2x%3") + .arg(origFi.fileName()).arg(size.width()).arg(size.height()); + MultiExportDialog multiExportDialog; + multiExportDialog.setWindowTitle(title); + multiExportDialog.setExportFileName(suggestedExportFileName(origFi)); + multiExportDialog.setSvgSize(size); + multiExportDialog.suggestSizes(); + + while (multiExportDialog.exec() == QDialog::Accepted) { + const auto exportData = multiExportDialog.exportData(); + bool ok = true; + for (const auto &data : exportData) { + if (!exportSvg(data)) { + ok = false; + break; + } } + if (ok) + break; } #endif // !QT_NO_SVG } |