diff --git a/filters/karbon/image/ImageExport.cpp b/filters/karbon/image/ImageExport.cpp --- a/filters/karbon/image/ImageExport.cpp +++ b/filters/karbon/image/ImageExport.cpp @@ -10,6 +10,7 @@ Copyright (C) 2006 Laurent Montel Copyright (C) 2006 Christian Mueller Copyright (C) 2007-2008,2012 Jan Hambrecht + Copyright (C) 2019 Dag Andersen This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public @@ -55,76 +56,78 @@ { } -KoFilter::ConversionStatus -ImageExport::convert(const QByteArray& from, const QByteArray& to) +KoFilter::ConversionStatus ImageExport::convert(const QByteArray& from, const QByteArray& to) { + if (from != KoOdf::mimeType(KoOdf::Graphics)) { + return KoFilter::BadMimeType; + } + QString format; + if (to == "image/png") { format = "PNG"; - } else if(to == "image/jpeg") { - format = "JPG"; - } - if (format.isEmpty()) { - return KoFilter::NotImplemented; - } - if (from != "application/vnd.oasis.opendocument.graphics") { - return KoFilter::NotImplemented; + } else if (to == "image/jpeg") { + format = "JPEG"; + } else { + return KoFilter::BadMimeType; } - KoDocument* document = m_chain->inputDocument(); - if (! document) - return KoFilter::ParsingError; + KarbonDocument *doc = dynamic_cast(m_chain->inputDocument()); + if (!doc) { + KoFilter::InternalError; + } - KarbonDocument* doc = dynamic_cast(document); - if (doc) { - KoShapePainter painter; - QList pages = doc->pages(); - if (pages.isEmpty()) { - return KoFilter::WrongFormat; + KoPAPageBase *page = doc->pages().first(); + + KoShapePainter painter; + painter.setShapes(page->shapes()); + + // get the bounding rect of the content + QRectF shapesRect = painter.contentRect(); + // get the size in point + QSizeF pointSize = shapesRect.size(); + // get the size in pixel (100% zoom) + KoZoomHandler zoomHandler; + QSize pixelSize = zoomHandler.documentToView(pointSize).toSize(); + //transparent white by default + QColor backgroundColor(QColor(255, 255, 255, 0)); + + if (! m_chain->manager()->getBatchMode()) { + QApplication::restoreOverrideCursor(); + ImageExportOptionsWidget * widget = new ImageExportOptionsWidget(doc); + widget->setUnit(doc->unit()); + widget->setBackgroundColor(backgroundColor); + widget->enableBackgroundOpacity(format == "PNG"); + + KoDialog dlg; + dlg.setCaption(i18n("%1 Export Options", format)); + dlg.setButtons(KoDialog::Ok | KoDialog::Cancel); + dlg.setMainWidget(widget); + int result = dlg.exec(); + QApplication::setOverrideCursor(Qt::BusyCursor); + if (result != QDialog::Accepted) { + return KoFilter::UserCancelled; } - // TODO: Handle multiple pages - painter.setShapes(pages.at(0)->shapes()); - - // get the bounding rect of the content - QRectF shapesRect = painter.contentRect(); - // get the size in point - QSizeF pointSize = shapesRect.size(); - // get the size in pixel (100% zoom) - KoZoomHandler zoomHandler; - QSize pixelSize = zoomHandler.documentToView(pointSize).toSize(); - //transparent white by default - QColor backgroundColor(QColor(255, 255, 255, 0)); - - if (! m_chain->manager()->getBatchMode()) { - ImageExportOptionsWidget * widget = new ImageExportOptionsWidget(pointSize); - widget->setUnit(document->unit()); - widget->setBackgroundColor(backgroundColor); - widget->enableBackgroundOpacity(format == "PNG"); - - KoDialog dlg; - dlg.setCaption(i18n("PNG Export Options")); - dlg.setButtons(KoDialog::Ok | KoDialog::Cancel); - dlg.setMainWidget(widget); - if (dlg.exec() != QDialog::Accepted) - return KoFilter::UserCancelled; - - pixelSize = widget->pixelSize(); - backgroundColor = widget->backgroundColor(); + pixelSize = widget->pixelSize(); + backgroundColor = widget->backgroundColor(); + + page = widget->page(); + if (!page) { + return KoFilter::InternalError; } - QImage image(pixelSize, QImage::Format_ARGB32); + painter.setShapes(page->shapes()); + } - // draw the background of the image - image.fill(backgroundColor.rgba()); + QImage image(pixelSize, QImage::Format_ARGB32); - // paint the shapes - painter.paint(image); + // draw the background of the image + image.fill(backgroundColor.rgba()); - if(!image.save(m_chain->outputFile(), format.toLatin1())) { - return KoFilter::CreationError; - } + // paint the shapes + painter.paint(image); - } else { - return KoFilter::WrongFormat; + if(!image.save(m_chain->outputFile(), format.toLatin1())) { + return KoFilter::CreationError; } return KoFilter::OK; diff --git a/filters/karbon/image/ImageExportOptionsWidget.h b/filters/karbon/image/ImageExportOptionsWidget.h --- a/filters/karbon/image/ImageExportOptionsWidget.h +++ b/filters/karbon/image/ImageExportOptionsWidget.h @@ -24,12 +24,15 @@ #include +class KarbonDocument; +class KoPAPageBase; + class ImageExportOptionsWidget : public QWidget { Q_OBJECT public: - explicit ImageExportOptionsWidget(const QSizeF &pointSize, QWidget *parent = 0); + explicit ImageExportOptionsWidget(KarbonDocument *doc, QWidget *parent = 0); /// Sets the initial unit to use void setUnit(const KoUnit &unit); @@ -49,22 +52,27 @@ /// Enables/disables setting the background opacity void enableBackgroundOpacity(bool enable); + KoPAPageBase *page() const; + private Q_SLOTS: void unitWidthChanged(qreal); void unitHeightChanged(qreal); void pxWidthChanged(int); void pxHeightChanged(int); void dpiChanged(int); void unitChanged(int); void aspectChanged(bool); + void setPage(int idx); private: void updateFromPointSize(const QSizeF &pointSize); void updateFromPixelSize(const QSize &pixelSize); void blockChildSignals(bool block); Ui_ImageExportOptionsWidget widget; QSizeF m_pointSize; + + KarbonDocument *m_doc; }; #endif // IMAGEEXPORTOPTIONSWIDGET_H diff --git a/filters/karbon/image/ImageExportOptionsWidget.cpp b/filters/karbon/image/ImageExportOptionsWidget.cpp --- a/filters/karbon/image/ImageExportOptionsWidget.cpp +++ b/filters/karbon/image/ImageExportOptionsWidget.cpp @@ -1,5 +1,6 @@ /* This file is part of the KDE project * Copyright (C) 2008 Jan Hambrecht + * Copyright (C) 2019 Dag Andersen * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -19,11 +20,16 @@ #include "ImageExportOptionsWidget.h" +#include +#include + #include // for POINT_TO_INCH #include +#include +#include -ImageExportOptionsWidget::ImageExportOptionsWidget(const QSizeF &pointSize, QWidget * parent) - : QWidget(parent), m_pointSize(pointSize) +ImageExportOptionsWidget::ImageExportOptionsWidget(KarbonDocument *doc, QWidget * parent) + : QWidget(parent), m_doc(doc) { KoUnit unit; @@ -49,9 +55,14 @@ widget.opacity->setMinimum(0.0); widget.opacity->setMaximum(100.0); widget.opacity->setValue(0.0); - widget.unitWidth->changeValue(pointSize.width()); - widget.unitHeight->changeValue(pointSize.height()); - updateFromPointSize(pointSize); + + for (int i = 0; i < doc->pageCount(); ++i) { + widget.pageCombo->addItem(i18n("Page %1", i+1)); + } + setPage(0); + + widget.unitWidth->changeValue(m_pointSize.width()); + widget.unitHeight->changeValue(m_pointSize.height()); connect(widget.unitWidth, SIGNAL(valueChangedPt(qreal)), this, SLOT(unitWidthChanged(qreal))); connect(widget.unitHeight, SIGNAL(valueChangedPt(qreal)), this, SLOT(unitHeightChanged(qreal))); @@ -61,6 +72,27 @@ connect(widget.unit, SIGNAL(activated(int)), this, SLOT(unitChanged(int))); connect(widget.pxAspect, SIGNAL(keepAspectRatioChanged(bool)), this, SLOT(aspectChanged(bool))); connect(widget.unitAspect, SIGNAL(keepAspectRatioChanged(bool)), this, SLOT(aspectChanged(bool))); + connect(widget.pageCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(setPage(int))); +} + +void ImageExportOptionsWidget::setPage(int idx) +{ + KoPAPageBase *page = m_doc->pages().value(idx); + if (!page) { + page = m_doc->pages().first(); + } + KoShapePainter painter; + painter.setShapes(page->shapes()); + // get the bounding rect of the content + QRectF shapesRect = painter.contentRect(); + // get the size in point + m_pointSize = shapesRect.size(); + updateFromPointSize(m_pointSize); +} + +KoPAPageBase *ImageExportOptionsWidget::page() const +{ + return m_doc->pages().value(widget.pageCombo->currentIndex()); } void ImageExportOptionsWidget::setUnit(const KoUnit &unit) diff --git a/filters/karbon/image/ImageExportOptionsWidget.ui b/filters/karbon/image/ImageExportOptionsWidget.ui --- a/filters/karbon/image/ImageExportOptionsWidget.ui +++ b/filters/karbon/image/ImageExportOptionsWidget.ui @@ -10,8 +10,25 @@ 454 - - + + + + + + + Page: + + + false + + + + + + + + + Size in Pixels @@ -46,7 +63,7 @@ - + Size in Units @@ -101,7 +118,7 @@ - + Background Color @@ -133,7 +150,7 @@ - + Qt::Vertical