From 8dc6b57f9c59eb689064c9aef8909e8bca8677d9 Mon Sep 17 00:00:00 2001 From: kriegerj Date: Wed, 5 Aug 2015 14:27:09 +0200 Subject: [PATCH] added context-menu entries to copy/save the colorbars of an image plot. --- jkqtpimageelements.cpp | 157 +++++++++++++++++---------- jkqtpimageelements.h | 11 +- test/jkqtplot_test/jkqtplot_test.pro | 47 ++------ test/jkqtplot_test/testmain.cpp | 6 +- 4 files changed, 124 insertions(+), 97 deletions(-) diff --git a/jkqtpimageelements.cpp b/jkqtpimageelements.cpp index 16caaf2d92..522651dbd7 100644 --- a/jkqtpimageelements.cpp +++ b/jkqtpimageelements.cpp @@ -269,7 +269,7 @@ void JKQTPImage::copyImagePlotAsImage() { QClipboard* clip=QApplication::clipboard(); if (clip && image) { - clip->setImage(*image); + clip->setPixmap(QPixmap::fromImage(*image)); } } @@ -600,8 +600,12 @@ void JKQTPMathImageBase::modifyImage(QImage &img, void *dataModifier, JKQTPMathI void JKQTPMathImage::initJKQTPMathImage() { actSaveImage=new QAction(tr("Save JKQTPMathImage ..."), this); connect(actSaveImage, SIGNAL(triggered()), this, SLOT(saveImagePlotAsImage())); - actCopyImage=new QAction(tr("Copy JKQTPOverlayImage ..."), this); + actCopyImage=new QAction(tr("Copy JKQTPMathImage ..."), this); connect(actCopyImage, SIGNAL(triggered()), this, SLOT(copyImagePlotAsImage())); + actSavePalette=new QAction(tr("Save JKQTPMathImage Palette/Colorbar ..."), this); + connect(actSavePalette, SIGNAL(triggered()), this, SLOT(saveColorbarPlotAsImage())); + actCopyPalette=new QAction(tr("Copy JKQTPMathImage Palette/Colorbar ..."), this); + connect(actCopyPalette, SIGNAL(triggered()), this, SLOT(copyColorbarPlotAsImage())); colorBarRightAxis=new JKQTPverticalIndependentAxis(0, 100, 0, 100, parent); if (parent) colorBarRightAxis->loadSettings(parent->getYAxis()); @@ -702,6 +706,8 @@ void JKQTPMathImage::setParent(JKQtBasePlotter* parent) { if (this->parent) { this->parent->deregisterAdditionalAction(actSaveImage); this->parent->deregisterAdditionalAction(actCopyImage); + this->parent->deregisterAdditionalAction(actSavePalette); + this->parent->deregisterAdditionalAction(actCopyPalette); } JKQTPMathImageBase::setParent(parent); colorBarRightAxis->set_parent(parent); @@ -711,9 +717,13 @@ void JKQTPMathImage::setParent(JKQtBasePlotter* parent) { if (parent) { parent->registerAdditionalAction(tr("Save Image Plot Images ..."), actSaveImage); parent->registerAdditionalAction(tr("Copy Image Plot Images ..."), actCopyImage); + parent->registerAdditionalAction(tr("Save Image Plot Images ..."), actSavePalette); + parent->registerAdditionalAction(tr("Copy Image Plot Images ..."), actCopyPalette); } actSaveImage->setEnabled(parent); actCopyImage->setEnabled(parent); + actSavePalette->setEnabled(parent); + actCopyPalette->setEnabled(parent); } void JKQTPMathImage::set_title(const JKQTPgraph::typedef_set_title &title) @@ -771,7 +781,57 @@ void JKQTPMathImage::copyImagePlotAsImage() { QClipboard* clip=QApplication::clipboard(); if (clip) { - clip->setImage(drawImage()); + clip->setPixmap(QPixmap::fromImage(drawImage())); + } +} + +void JKQTPMathImage::saveColorbarPlotAsImage(const QString &filename, const QByteArray &outputFormat) +{ + if (parent) { + parent->loadUserSettings(); + QString currentSaveDirectory=parent->get_currentSaveDirectory(); + QString currentFileFormat=parent->get_currentFileFormat(); + QString fn=filename; + QStringList filt; + QList writerformats=QImageWriter::supportedImageFormats(); + for (int i=0; iset_currentFileFormat(currentFileFormat); + parent->set_currentSaveDirectory(currentSaveDirectory); + parent->saveUserSettings(); + if (!fn.isEmpty()) { + int filtID=filt.indexOf(selFormat); + QString form="NONE"; + if (filtID>=0 && filtID0) { + form =outputFormat; + } + + QImage image=drawOutsidePalette(256); + + if (form=="NONE") image.save(fn); + else image.save(fn, form.toLatin1().data()); + } + } +} + +void JKQTPMathImage::copyColorbarPlotAsImage() +{ + QClipboard* clip=QApplication::clipboard(); + if (clip) { + clip->setPixmap(QPixmap::fromImage(drawOutsidePalette(256))); } } @@ -839,27 +899,11 @@ void JKQTPMathImage::drawOutside(JKQTPEnhancedPainter& painter, QRect /*leftSpac if (colorBarRightVisible) { painter.save(); - uint8_t h=1; - if (modifierMode!=ModifyNone) { - h=50; - } - uint8_t d[200*h], dd[200*h]; - for (int i=0; i<200; i++) { - for (int j=0; j(d, h, 200, b, palette, 0, 199); - if (modifierMode!=ModifyNone) { - modifyImage(b, dd, UInt8Array, h, 200, 0, h-1); - } - /*parent->get_mathText()->set_fontSize(imageNameFontSize*parent->get_fontSizeMultiplier()); - parent->get_mathText()->set_fontRoman(imageNameFontName); - parent->get_mathText()->parse(imageName); - QSizeF names=parent->get_mathText()->getSize(painter);*/ + + QImage b=drawOutsidePalette(200); + + QSizeF names=parent->getTextSizeSize(imageNameFontName, imageNameFontSize*parent->get_fontSizeMultiplier(), imageName, painter); double icolorBarRelativeHeight=colorBarRelativeHeight; @@ -906,36 +950,13 @@ void JKQTPMathImage::drawOutside(JKQTPEnhancedPainter& painter, QRect /*leftSpac if (colorBarTopVisible) { painter.save(); - /*uint8_t d[200]; - for (int i=0; i<200; i++) d[i]=i; - QImage b(200,1, QImage::Format_ARGB32); - JKQTPimagePlot_array2image(d, 200, 1, b, palette, 0, 199);*/ - - - uint8_t h=1; - if (modifierMode!=ModifyNone) { - h=50; - } - uint8_t d[200*h], dd[200*h]; - for (int i=0; i<200; i++) { - for (int j=0; j(d,h,200, b, palette, 0, 199); - if (modifierMode!=ModifyNone) { - modifyImage(b, dd, UInt8Array, h,200, 0, h-1); - } - /*parent->get_mathText()->set_fontSize(imageNameFontSize*parent->get_fontSizeMultiplier()); - parent->get_mathText()->set_fontRoman(imageNameFontName); - parent->get_mathText()->parse(imageName); - QSizeF names=parent->get_mathText()->getSize(painter);*/ + QImage b=drawOutsidePalette(200); + + QSizeF names=parent->getTextSizeSize(imageNameFontName, imageNameFontSize*parent->get_fontSizeMultiplier(), imageName, painter); double icolorBarRelativeHeight=colorBarRelativeHeight; @@ -985,6 +1006,32 @@ void JKQTPMathImage::drawOutside(JKQTPEnhancedPainter& painter, QRect /*leftSpac } } +QImage JKQTPMathImage::drawOutsidePalette(int steps) +{ + + uint8_t h=1; + if (modifierMode!=ModifyNone) { + h=50; + } + uint8_t* d=new uint8_t[steps*h]; + uint8_t* dd=new uint8_t[steps*h]; + for (int i=0; i(d,h,steps, b, palette, 0, steps-1); + if (modifierMode!=ModifyNone) { + modifyImage(b, dd, UInt8Array, h,steps, 0, h-1); + } + delete[] d; + delete[] dd; + return b; +} + void JKQTPMathImage::getDataMinMax(double& imin, double& imax) { ensureImageData(); if (autoImageRange) { @@ -1058,21 +1105,21 @@ QIcon JKQTPMathImage::getPaletteIcon(JKQTPMathImageColorPalette palette) { return getPaletteIcon((int)palette); } -QImage JKQTPMathImage::getPaletteImage(int i, int width) +QImage JKQTPMathImage::getPaletteImage(int i, int width, int height) { QImage img; double* pic=(double*)malloc(width*sizeof(double)); for (int j=0; j(pic, width, 1, img, (JKQTPMathImageColorPalette)i, 0, width-1); + JKQTPimagePlot_array2image(pic, width, qMax(1,height), img, (JKQTPMathImageColorPalette)i, 0, width-1); free(pic); return img; } -QImage JKQTPMathImage::getPaletteImage(JKQTPMathImageColorPalette palette, int width) +QImage JKQTPMathImage::getPaletteImage(JKQTPMathImageColorPalette palette, int width, int height) { - return getPaletteImage((int)palette, width); + return getPaletteImage((int)palette, width,height); } QIcon JKQTPMathImage::getPaletteKeyIcon(int i) @@ -2073,7 +2120,7 @@ void JKQTPRGBMathImage::copyImagePlotAsImage() { QClipboard* clip=QApplication::clipboard(); if (clip) { - clip->setImage(drawImage()); + clip->setPixmap(QPixmap::fromImage(drawImage())); } } @@ -2603,7 +2650,7 @@ void JKQTPOverlayImage::copyImagePlotAsImage() { QClipboard* clip=QApplication::clipboard(); if (clip) { - clip->setImage(drawImage()); + clip->setPixmap(QPixmap::fromImage(drawImage())); } } diff --git a/jkqtpimageelements.h b/jkqtpimageelements.h index b188047d63..75f5b87743 100644 --- a/jkqtpimageelements.h +++ b/jkqtpimageelements.h @@ -303,9 +303,9 @@ class LIB_EXPORT JKQTPMathImage: public JKQTPMathImageBase { /*! \brief get QIcon representing the given palette */ static QIcon getPaletteIcon(JKQTPMathImageColorPalette palette) ; /*! \brief get QIcon representing the given palette */ - static QImage getPaletteImage(int i, int width) ; + static QImage getPaletteImage(int i, int width, int height=1) ; /*! \brief get QIcon representing the given palette */ - static QImage getPaletteImage(JKQTPMathImageColorPalette palette, int width) ; + static QImage getPaletteImage(JKQTPMathImageColorPalette palette, int width, int height=1) ; /*! \brief get QIcon representing the given palette */ static QIcon getPaletteKeyIcon(int i) ; @@ -361,6 +361,9 @@ class LIB_EXPORT JKQTPMathImage: public JKQTPMathImageBase { */ virtual void drawOutside(JKQTPEnhancedPainter& painter, QRect leftSpace, QRect rightSpace, QRect topSpace, QRect bottomSpace); + /*! \brief returns a QImage, which contains the plaette drawn outside the plot. \a steps is the number of data-setps (and the size of the output image) used for the palette image. */ + virtual QImage drawOutsidePalette(int steps=200); + /*! \brief return the plotted image only as a QImage */ virtual QImage drawImage(); @@ -438,11 +441,15 @@ class LIB_EXPORT JKQTPMathImage: public JKQTPMathImageBase { protected: QAction* actSaveImage; QAction* actCopyImage; + QAction* actSavePalette; + QAction* actCopyPalette; public: virtual void set_title(const typedef_set_title& title); public slots: void saveImagePlotAsImage(const QString &filename=QString(""), const QByteArray &outputFormat=QByteArray()); void copyImagePlotAsImage(); + void saveColorbarPlotAsImage(const QString &filename=QString(""), const QByteArray &outputFormat=QByteArray()); + void copyColorbarPlotAsImage(); }; diff --git a/test/jkqtplot_test/jkqtplot_test.pro b/test/jkqtplot_test/jkqtplot_test.pro index 166374ee95..857b46e76a 100644 --- a/test/jkqtplot_test/jkqtplot_test.pro +++ b/test/jkqtplot_test/jkqtplot_test.pro @@ -1,24 +1,14 @@ +# NOTE: This shouldn't be built as a SHADOW build +!equals(PWD, $${OUT_PWD}) { + warning(This project should not be built as a shadow build!!!) +} -LIBS += +include(../../jkqtplotter.pri) - -SOURCES = jkqtplot_test.cpp \ - ../../jkqtpbaseplotter.cpp \ - ../../jkqtpdatastorage.cpp \ - ../../jkqtplotter.cpp \ - ../../jkqtptools.cpp \ - ../../jkqtpelements.cpp \ - ../../jkqtpbaseelements.cpp \ - ../../jkqtmathtext.cpp \ - ../../jkqtpgeoelements.cpp \ - ../../jkqtpimageelements.cpp \ - ../../jkqtpoverlayelements.cpp \ +SOURCES += jkqtplot_test.cpp \ testmain.cpp \ - ../../jkqtpparsedfunctionelements.cpp \ - ../../jkqtpmathparser.cpp \ - ../../jkqtpimagetools.cpp \ -QTeXEngine/src/QTeXPaintEngine.cpp \ - QTeXEngine/src/QTeXPaintDevice.cpp \ + QTeXEngine/src/QTeXPaintEngine.cpp \ + QTeXEngine/src/QTeXPaintDevice.cpp greaterThan(QT_MAJOR_VERSION, 4) { } else { @@ -54,21 +44,7 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport #if not added by qmake: DEFINES += QT_XML_LIB -HEADERS = ../../jkqtpbaseplotter.h \ - ../../jkqtpdatastorage.h \ - ../../jkqtplotter.h \ - ../../jkqtptools.h \ - ../../jkqtpelements.h \ - ../../jkqtpgeoelements.h \ - ../../jkqtpbaseelements.h \ - ../../jkqtmathtext.h \ - ../../jkqtpimageelements.h \ - ../../jkqtpimagetools.h \ - ../../jkqtpoverlayelements.h \ - testmain.h \ - ../../jkqtpparsedfunctionelements.h \ - ../../jkqtpmathparser.h \ - ../../jkqtp_imexport.h +HEADERS += testmain.h INCLUDEPATH += @@ -79,8 +55,5 @@ MOC_DIR = .mocs RCC_DIR = .rccs DESTDIR = ./ -FORMS = - -RESOURCES = ../../jkqtpbaseplotter.qrc \ - jkqtplot_test.qrc +RESOURCES += jkqtplot_test.qrc diff --git a/test/jkqtplot_test/testmain.cpp b/test/jkqtplot_test/testmain.cpp index d59061d5f8..2082dcdafe 100644 --- a/test/jkqtplot_test/testmain.cpp +++ b/test/jkqtplot_test/testmain.cpp @@ -8,15 +8,15 @@ #endif -double f1(double x, void* param) { +double f1(double x, void* /*param*/) { return x/30; } -double f1e(double x, void* param) { +double f1e(double x, void* /*param*/) { return 2; } -double f2(double x, void* param) { +double f2(double x, void* /*param*/) { return 10*sin(exp(x/100)); }