diff options
Diffstat (limited to 'src/pmchart/exportdialog.cpp')
-rw-r--r-- | src/pmchart/exportdialog.cpp | 248 |
1 files changed, 248 insertions, 0 deletions
diff --git a/src/pmchart/exportdialog.cpp b/src/pmchart/exportdialog.cpp new file mode 100644 index 0000000..bc99672 --- /dev/null +++ b/src/pmchart/exportdialog.cpp @@ -0,0 +1,248 @@ +/* + * Copyright (c) 2007, Aconex. All Rights Reserved. + * Copyright (c) 2013, Red Hat, Inc. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ +#include <QtCore/QDir> +#include <QtGui/QPainter> +#include <QtGui/QMessageBox> +#include <QtGui/QImageWriter> +#include "main.h" +#include "exportdialog.h" + +// ExportFileDialog is the one which is displayed when you click on +// the image file selection push button +ExportFileDialog::ExportFileDialog(QWidget *parent) : QFileDialog(parent) +{ + setAcceptMode(QFileDialog::AcceptSave); + setFileMode(QFileDialog::AnyFile); + setIconProvider(fileIconProvider); + setConfirmOverwrite(true); +} + +ExportDialog::ExportDialog(QWidget* parent) : QDialog(parent) +{ + setupUi(this); + init(); +} + +ExportDialog::~ExportDialog() +{ + free(my.format); +} + +void ExportDialog::languageChange() +{ + retranslateUi(this); +} + +void ExportDialog::init() +{ + QChar sep(__pmPathSeparator()); + QString imgfile = QDir::toNativeSeparators(QDir::homePath()); + + my.quality = 0; + my.format = strdup("png"); + imgfile.append(sep); + imgfile.append("export.png"); + fileLineEdit->setText(imgfile); + + int png = 0; + QStringList formats; + QList<QByteArray> array = QImageWriter::supportedImageFormats(); + for (int i = 0; i < array.size(); i++) { + if (array.at(i) == "png") + png = i; + formats << QString(array.at(i)); + } + formatComboBox->blockSignals(true); + formatComboBox->addItems(formats); + formatComboBox->setCurrentIndex(png); + formatComboBox->blockSignals(false); + + qualitySlider->setValue(100); + qualitySlider->setRange(0, 100); + qualitySpinBox->setValue(100); + qualitySpinBox->setRange(0, 100); +} + +void ExportDialog::reset() +{ + QSize size = imageSize(); + widthSpinBox->setValue(size.width()); + heightSpinBox->setValue(size.height()); +} + +void ExportDialog::selectedRadioButton_clicked() +{ + selectedRadioButton->setChecked(true); + allChartsRadioButton->setChecked(false); + reset(); +} + +void ExportDialog::allChartsRadioButton_clicked() +{ + selectedRadioButton->setChecked(false); + allChartsRadioButton->setChecked(true); + reset(); +} + +void ExportDialog::quality_valueChanged(int value) +{ + if (value != my.quality) { + my.quality = value; + displayQualitySpinBox(); + displayQualitySlider(); + } +} + +void ExportDialog::displayQualitySpinBox() +{ + qualitySpinBox->blockSignals(true); + qualitySpinBox->setValue(my.quality); + qualitySpinBox->blockSignals(false); +} + +void ExportDialog::displayQualitySlider() +{ + qualitySlider->blockSignals(true); + qualitySlider->setValue(my.quality); + qualitySlider->blockSignals(false); +} + +void ExportDialog::filePushButton_clicked() +{ + ExportFileDialog file(this); + + file.setDirectory(QDir::toNativeSeparators(QDir::homePath())); + if (file.exec() == QDialog::Accepted) + fileLineEdit->setText(file.selectedFiles().at(0)); +} + +void ExportDialog::formatComboBox_currentIndexChanged(QString suffix) +{ + char *format = strdup((const char *)suffix.toAscii()); + QString file = fileLineEdit->text().trimmed(); + QString regex = my.format; + + regex.append("$"); + file.replace(QRegExp(regex), suffix); + fileLineEdit->setText(file); + free(my.format); + my.format = format; +} + +QSize ExportDialog::imageSize() +{ + Tab *tab = pmchart->activeTab(); + int height = 0, width = 0; + + for (int i = 0; i < tab->gadgetCount(); i++) { + Gadget *gadget = tab->gadget(i); + if (gadget != tab->currentGadget() && selectedRadioButton->isChecked()) + continue; + width = qMax(width, gadget->width()); + height += gadget->height(); + } + height += pmchart->timeAxis()->height() + pmchart->dateLabel()->height(); + height -= TIMEAXISFUDGE; + + return QSize(width, height); +} + +void ExportDialog::flush() +{ + QString file = fileLineEdit->text().trimmed(); + int width = widthSpinBox->value(); + int height = heightSpinBox->value(); + bool everything = allChartsRadioButton->isChecked(); + bool transparent = transparentCheckBox->isChecked(); + + if (ExportDialog::exportFile(file, my.format, my.quality, width, height, + transparent, everything) == false) { + QString message = tr("Failed to save image file\n"); + message.append(file); + QMessageBox::warning(this, pmProgname, message, + QMessageBox::Ok|QMessageBox::Default|QMessageBox::Escape, + QMessageBox::NoButton, QMessageBox::NoButton); + } +} + +bool ExportDialog::exportFile(QString &file, const char *format, int quality, + int width, int height, bool transparent, bool everything) +{ + enum QImage::Format rgbFormat = transparent ? + QImage::Format_ARGB32 : QImage::Format_RGB32; + QImage image(width, height, rgbFormat); + QPainter qp(&image); + + console->post("ExportDialog::exportFile file=%s fmt=%s qual=%d w=%d h=%d trans=%d every=%d\n", + (const char *)file.toAscii(), format, quality, width, height, transparent, everything); + + if (transparent) { + image.fill(qRgba(255, 255, 255, 0)); + } + else { + image.fill(qRgba(255, 255, 255, 255)); + } + + pmchart->painter(&qp, width, height, transparent, everything == false); + QImageWriter writer(file, format); + writer.setQuality(quality); + bool sts = writer.write(image); + if (!sts) + fprintf(stderr, "%s: error writing %s (%s): %s\n", + pmProgname, (const char *) file.toAscii(), format, + (const char *) writer.errorString().toAscii()); + return sts; +} + +int ExportDialog::exportFile(char *outfile, char *geometry, bool transparent) +{ + QRegExp regex; + QString file(outfile), format; + bool noFormat = false; + char suffix[32]; + int i; + + // Ensure the requested image format is supported, else use GIF + regex.setPattern("\\.([a-z]+)$"); + regex.setCaseSensitivity(Qt::CaseInsensitive); + if (regex.indexIn(file) == 0) { + noFormat = true; + } + else { + format = regex.cap(1); + QList<QByteArray> array = QImageWriter::supportedImageFormats(); + for (i = 0; i < array.size(); i++) { + if (strcmp(array.at(i), (const char *)format.toAscii()) == 0) + break; + } + if (i == array.size()) + noFormat = true; + } + if (noFormat) { + file.append(".png"); + format = QString("png"); + } + strncpy(suffix, (const char *)format.toAscii(), sizeof(suffix)); + suffix[sizeof(suffix)-1] = '\0'; + + regex.setPattern("(\\d+)x(\\d+)"); + if (regex.indexIn(QString(geometry)) != -1) { + QSize fixed = QSize(regex.cap(1).toInt(), regex.cap(2).toInt()); + pmchart->setFixedSize(fixed); + } + + return ExportDialog::exportFile(file, suffix, 100, pmchart->width(), + pmchart->exportHeight(), transparent, true) == false; +} |