From 67d23150f2beb819e00c3d449440baef1ea073f9 Mon Sep 17 00:00:00 2001 From: jkriege2 Date: Sun, 5 May 2019 19:31:20 +0200 Subject: [PATCH] new: user-interaction tool that shows coordinates of data points near the current mouse position (when mouse is dragged, while mouse button is pressed) new: user-interaction tool that measures distances and angles when mouse is dragged, while mouse button is pressed) update: reworked error indicator base classes and styling settings update: improved boxplot styling with a separate full-featured pen for the whiskers --- doc/dox/whatsnew.dox | 3 + doc/images/rulertool.gif | Bin 0 -> 91827 bytes doc/images/rulertool_example.png | Bin 0 -> 5833 bytes doc/images/tooltip_boxplot.png | Bin 0 -> 8354 bytes doc/images/tooltiptool.gif | Bin 0 -> 140676 bytes doc/images/tooltiptool_example.png | Bin 0 -> 2993 bytes .../jkqtplot_test/TestWidgetFunctionPlots.cpp | 4 +- examples/jkqtplot_test/TestWidgetGraphs.cpp | 6 +- examples/jkqtplot_test/TestWidgetGraphs.h | 2 +- .../jkqtplotter_simpletest_boxplot.cpp | 2 +- examples/simpletest_errorbarstyles/README.md | 8 +- .../jkqtplotter_simpletest_errorbarstyles.cpp | 4 +- examples/test_user_interaction/README.md | 14 + .../test_user_interaction.cpp | 172 +- .../test_user_interaction.h | 16 + lib/jkqtfastplotter/jkqtfastplotter.h | 26 +- lib/jkqtmathtext/jkqtmathtext.cpp | 60 +- lib/jkqtmathtext/jkqtmathtext.h | 19 +- lib/jkqtplotter/jkqtpbaseplotter.cpp | 86 +- lib/jkqtplotter/jkqtpbaseplotter.h | 4 +- lib/jkqtplotter/jkqtpdatastorage.h | 10 +- lib/jkqtplotter/jkqtpgraphsbarchart.cpp | 8 +- lib/jkqtplotter/jkqtpgraphsbase.cpp | 248 +- lib/jkqtplotter/jkqtpgraphsbase.h | 242 +- lib/jkqtplotter/jkqtpgraphsbaseerrors.cpp | 694 ++-- lib/jkqtplotter/jkqtpgraphsbaseerrors.h | 537 ++- .../jkqtpgraphsbasestylingmixins.h | 18 +- lib/jkqtplotter/jkqtpgraphsboxplot.cpp | 455 ++- lib/jkqtplotter/jkqtpgraphsboxplot.h | 72 +- .../jkqtpgraphsevaluatedfunction.h | 10 +- lib/jkqtplotter/jkqtpgraphsfilledcurve.cpp | 9 +- lib/jkqtplotter/jkqtpgraphsgeometric.cpp | 40 +- lib/jkqtplotter/jkqtpgraphsimpulses.cpp | 9 +- lib/jkqtplotter/jkqtpgraphspeakstream.cpp | 2 + lib/jkqtplotter/jkqtpgraphsrange.cpp | 2 +- lib/jkqtplotter/jkqtpgraphsrange.h | 2 +- lib/jkqtplotter/jkqtpgraphsscatter.cpp | 36 +- lib/jkqtplotter/jkqtpgraphsscatter.h | 2 +- .../jkqtpgraphssinglecolumnsymbols.cpp | 5 + lib/jkqtplotter/jkqtplotter.cpp | 576 ++- lib/jkqtplotter/jkqtplotter.h | 204 +- lib/jkqtplotter/jkqtplotterstyle.cpp | 78 +- lib/jkqtplotter/jkqtplotterstyle.h | 35 +- lib/jkqtplottergui/jkqtpcomboboxes.cpp | 2 +- lib/jkqtplottergui/jkqtpcomboboxes.h | 2 +- .../images/jkqtp_mouseact_default.png | Bin 0 -> 953 bytes .../images/jkqtp_mouseact_default.svg | 379 ++ .../images/jkqtp_mouseact_drag.png | Bin 0 -> 1109 bytes .../images/jkqtp_mouseact_drag.svg | 388 ++ .../images/jkqtp_mouseact_ruler.png | Bin 0 -> 1076 bytes .../images/jkqtp_mouseact_ruler.svg | 406 +++ .../images/jkqtp_mouseact_tooltip.png | Bin 0 -> 802 bytes .../images/jkqtp_mouseact_tooltip.svg | 395 ++ .../images/jkqtp_mouseact_zoomrect.png | Bin 0 -> 1044 bytes .../images/jkqtp_mouseact_zoomrect.svg | 3227 +++++++++++++++++ lib/jkqtplotterressources/images/kruler.png | Bin 0 -> 771 bytes .../jkqtpbaseplotter.qrc | 7 + lib/jkqtplotterressources/styles/default.ini | 4 +- .../styles/simple_axesoffset.ini | 4 +- .../styles/simple_axesoffset_plotbox.ini | 4 +- .../styles/simple_gridandticks.ini | 4 +- lib/jkqtplottertools/jkqtpdrawingtools.cpp | 20 + lib/jkqtplottertools/jkqtpdrawingtools.h | 10 + lib/jkqtplottertools/jkqtptools.cpp | 24 + lib/jkqtplottertools/jkqtptools.h | 73 + screenshots/test_user_interaction.png | Bin 49202 -> 88543 bytes 66 files changed, 7628 insertions(+), 1041 deletions(-) create mode 100644 doc/images/rulertool.gif create mode 100644 doc/images/rulertool_example.png create mode 100644 doc/images/tooltip_boxplot.png create mode 100644 doc/images/tooltiptool.gif create mode 100644 doc/images/tooltiptool_example.png create mode 100644 lib/jkqtplotterressources/images/jkqtp_mouseact_default.png create mode 100644 lib/jkqtplotterressources/images/jkqtp_mouseact_default.svg create mode 100644 lib/jkqtplotterressources/images/jkqtp_mouseact_drag.png create mode 100644 lib/jkqtplotterressources/images/jkqtp_mouseact_drag.svg create mode 100644 lib/jkqtplotterressources/images/jkqtp_mouseact_ruler.png create mode 100644 lib/jkqtplotterressources/images/jkqtp_mouseact_ruler.svg create mode 100644 lib/jkqtplotterressources/images/jkqtp_mouseact_tooltip.png create mode 100644 lib/jkqtplotterressources/images/jkqtp_mouseact_tooltip.svg create mode 100644 lib/jkqtplotterressources/images/jkqtp_mouseact_zoomrect.png create mode 100644 lib/jkqtplotterressources/images/jkqtp_mouseact_zoomrect.svg create mode 100644 lib/jkqtplotterressources/images/kruler.png diff --git a/doc/dox/whatsnew.dox b/doc/dox/whatsnew.dox index b031fb504c..7f2538c2cc 100644 --- a/doc/dox/whatsnew.dox +++ b/doc/dox/whatsnew.dox @@ -39,11 +39,14 @@ Changes, compared to \ref WHATSNEW_V2018_08 "v2018.08" include:
  • new: additional options for graph filling (color gradients, textures, ...) as provided by QBrush
  • new: added a general feature to JKQTPPlotElement which allows to show a graph in a highlighted state (if supported by the derived graph class!)
  • new: JKQTPXYParametrizedScatterGraph: added functors to transform column values into symbol type+size and line-width to give even more control
  • +
  • new: user-interaction tool that shows coordinates of data points near the current mouse position (when mouse is dragged, while mouse button is pressed) \see jkqtpmdaToolTipForClosestDataPoint
  • +
  • new: user-interaction tool that measures distances and angles when mouse is dragged, while mouse button is pressed) \see jkqtpmdaRuler
  • changed: removed old selection-code and replaced by general highlighting feature
  • changed: JKQTPStepHorizontalGraph has been renamed to JKQTPSpecialLineHorizontalGraph (vertical variants also) and have gained additional features (baseline for filling and drawing of symbols)
  • changed: filled curve graphs (e.g. JKQTPSpecialLineHorizontalGraph) are now merely a specializedly initialized JKQTPSpecialLineHorizontalGraph
  • deprecated: Removed datarange-feature
  • update: \ref JKQTPLOTTER_USERINTERACTION "reworked user interactions API"
  • +
  • update: \ref jkqtplotter_basegraphserrors "reworked error indicator base classes"
  • fixed: colorbars at top were positioned over the plot label
  • fixed: RGB-image plots now work properly with inverted axes (image is inverted, befor image was not shown at all)
  • diff --git a/doc/images/rulertool.gif b/doc/images/rulertool.gif new file mode 100644 index 0000000000000000000000000000000000000000..f4b393c4220f4672a585b1dabd07516291b14c32 GIT binary patch literal 91827 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

    &J32N#eV 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 literal 0 HcmV?d00001 diff --git a/doc/images/tooltiptool_example.png b/doc/images/tooltiptool_example.png new file mode 100644 index 0000000000000000000000000000000000000000..cc7090d681f13a8bd0aaf60a9434821dc3a969e4 GIT binary patch literal 2993 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 nZt%eOsSu=P&S00000NkvXXu0mjf{34QC literal 0 HcmV?d00001 diff --git a/examples/jkqtplot_test/TestWidgetFunctionPlots.cpp b/examples/jkqtplot_test/TestWidgetFunctionPlots.cpp index 0f02ddaab3..ab1049b348 100644 --- a/examples/jkqtplot_test/TestWidgetFunctionPlots.cpp +++ b/examples/jkqtplot_test/TestWidgetFunctionPlots.cpp @@ -84,8 +84,8 @@ void TestWidgetFunctionPlots::setPFuncStyle() { pfunc->setDrawErrorLines(false); pfunc->setDrawErrorPolygons(false); - if (pfuncErrorStyle->getErrorStyle()==JKQTPErrorLines) pfunc->setDrawErrorLines(true); - if (pfuncErrorStyle->getErrorStyle()==JKQTPErrorPolygons) pfunc->setDrawErrorPolygons(true); + if (pfuncErrorStyle->getErrorLineStyle()==JKQTPErrorLines) pfunc->setDrawErrorLines(true); + if (pfuncErrorStyle->getErrorLineStyle()==JKQTPErrorPolygons) pfunc->setDrawErrorPolygons(true); pfunc->setDrawLine(chkPFuncDrawLine->isChecked()); pfunc->setDisplaySamplePoints(chkPFuncDrawSamples->isChecked()); plotFuncPlt->redrawPlot(); diff --git a/examples/jkqtplot_test/TestWidgetGraphs.cpp b/examples/jkqtplot_test/TestWidgetGraphs.cpp index b9c9fe63fb..72e3ae7fe6 100644 --- a/examples/jkqtplot_test/TestWidgetGraphs.cpp +++ b/examples/jkqtplot_test/TestWidgetGraphs.cpp @@ -111,7 +111,7 @@ TestWidgetGraphs::TestWidgetGraphs(QWidget *parent) : size_t yeb=plot->getPlotter()->addGraphWithXYError(cx2, cy21, cy22, cy22, "sine with errors", JKQTPFilledCurveX); plteErrors=plot->getPlotter()->getGraph(yeb); - setErrorStyle(0); + setErrorLineStyle(0); yeb=plot->getPlotter()->addGraph(cx2, cy21, "$5\\cdot\\sin(x)$", JKQTPLinesPoints); plteSymbols=plot->getPlotter()->getGraph(yeb); @@ -237,7 +237,7 @@ TestWidgetGraphs::TestWidgetGraphs(QWidget *parent) : layout->addWidget(cmbJKQTPPlotSymbol); JKQTPErrorPlotstyleComboBox* cmbErrors=new JKQTPErrorPlotstyleComboBox(this); cmbErrors->setCurrentErrorStyle(JKQTPErrorBars); - connect(cmbErrors, SIGNAL(currentIndexChanged(int)), this, SLOT(setErrorStyle(int))); + connect(cmbErrors, SIGNAL(currentIndexChanged(int)), this, SLOT(setErrorLineStyle(int))); layout->addWidget(cmbErrors); QDoubleSpinBox* spinScale=new QDoubleSpinBox(this); spinScale->setRange(0.1,5); @@ -298,7 +298,7 @@ void TestWidgetGraphs::moveovl() { } -void TestWidgetGraphs::setErrorStyle(int /*index*/) +void TestWidgetGraphs::setErrorLineStyle(int /*index*/) { QComboBox* cmb=qobject_cast(sender()); if (cmb) { diff --git a/examples/jkqtplot_test/TestWidgetGraphs.h b/examples/jkqtplot_test/TestWidgetGraphs.h index fdd7c76744..17ea60849e 100644 --- a/examples/jkqtplot_test/TestWidgetGraphs.h +++ b/examples/jkqtplot_test/TestWidgetGraphs.h @@ -37,7 +37,7 @@ class TestWidgetGraphs : public QWidget public slots: void moveovl(); - void setErrorStyle(int index); + void setErrorLineStyle(int index); void setESSymbol(int index); diff --git a/examples/simpletest_boxplot/jkqtplotter_simpletest_boxplot.cpp b/examples/simpletest_boxplot/jkqtplotter_simpletest_boxplot.cpp index 991dbfc4c7..4131d46bcd 100644 --- a/examples/simpletest_boxplot/jkqtplotter_simpletest_boxplot.cpp +++ b/examples/simpletest_boxplot/jkqtplotter_simpletest_boxplot.cpp @@ -3,7 +3,7 @@ * * \ref JKQTPlotterBoxplotsGraphs */ - + #include #include "jkqtplotter/jkqtplotter.h" #include "jkqtplotter/jkqtpgraphsscatter.h" diff --git a/examples/simpletest_errorbarstyles/README.md b/examples/simpletest_errorbarstyles/README.md index 733e5b3b29..e8d28528a1 100644 --- a/examples/simpletest_errorbarstyles/README.md +++ b/examples/simpletest_errorbarstyles/README.md @@ -44,9 +44,9 @@ First some data is added to the internal datastore (mostly, like explained in se c.setAlphaF(0.3); graph->setErrorFillColor(c); // set error indicator line width - graph->setErrorWidth(1); + graph->setErrorLineWidth(1); // set length of small bars at the end of error bars - graph->setErrorbarSize(15); + graph->setErrorBarCapSize(15); // set symbol (cross/X) + pen style (and color)dashed) @@ -84,9 +84,9 @@ There are several variables that can be used to further style the error indicato c.setAlphaF(0.3); graph->setErrorFillColor(c); // set error indicator line width - graph->setErrorWidth(1); + graph->setErrorLineWidth(1); // set length of small bars at the end of error bars - graph->setErrorbarSize(15); + graph->setErrorBarCapSize(15); ``` There are more properties that you can find in the documentation of the mix-in classes `JKQTPXYGraphErrors`, `JKQTPXGraphErrors`, `JKQTPYGraphErrors`, `JKQTPGraphErrors`. diff --git a/examples/simpletest_errorbarstyles/jkqtplotter_simpletest_errorbarstyles.cpp b/examples/simpletest_errorbarstyles/jkqtplotter_simpletest_errorbarstyles.cpp index 8973651f80..63d263c911 100644 --- a/examples/simpletest_errorbarstyles/jkqtplotter_simpletest_errorbarstyles.cpp +++ b/examples/simpletest_errorbarstyles/jkqtplotter_simpletest_errorbarstyles.cpp @@ -73,9 +73,9 @@ int main(int argc, char* argv[]) c.setAlphaF(0.3); graph->setErrorFillColor(c); // set error indicator line width - graph->setErrorWidth(1); + graph->setErrorLineWidth(1); // set length of small bars at the end of error bars - graph->setErrorbarSize(15); + graph->setErrorBarCapSize(15); // set symbol (cross/X) + pen style (and color)dashed) diff --git a/examples/test_user_interaction/README.md b/examples/test_user_interaction/README.md index d7cef75b12..8af70b73d3 100644 --- a/examples/test_user_interaction/README.md +++ b/examples/test_user_interaction/README.md @@ -98,6 +98,20 @@ There are several options to zoom, using the mouse: ![](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/doc/images/zoomin_mouse_contextmenu.gif) Again these actions are limited to a single axis, if the mouse is above that axis (and not inside the actual plot rectangle). + +### Ruler/Measurement Tool + +JKQTPlotter provides a pre-built ruler tool that measures x- and y-distance between the start and end point, as well as the length of the connecting line and the angle of that line.
    + + ![](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/doc/images/rulertool.gif) + + +### Data ToolTip Tool + +JKQTPlotter provides a pre-built tool that, while the mouse button is pressed and the cursor is dragged over the plot, finds data points (of most graphs) near the mouse and displays their coordinates (and errors) inside a small tooltip:
    + + ![](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/doc/images/tooltiptool.gif) + ### Drawing Geometrical Forms diff --git a/examples/test_user_interaction/test_user_interaction.cpp b/examples/test_user_interaction/test_user_interaction.cpp index ff1a79a7f3..907fea9138 100644 --- a/examples/test_user_interaction/test_user_interaction.cpp +++ b/examples/test_user_interaction/test_user_interaction.cpp @@ -19,15 +19,19 @@ TestUserInteraction::TestUserInteraction(QWidget *parent) : // setup layouts for form layout=new QGridLayout; layForm=new QFormLayout; + layForm2=new QFormLayout; + layLab=new QFormLayout; layChk=new QHBoxLayout; layChk2=new QHBoxLayout; layout->addLayout(layChk,0,0); layout->addLayout(layChk2,1,0); layout->addLayout(layForm,2,0); + layout->addLayout(layForm2,2,1); + layout->addLayout(layLab,3,0, 1,2); // generate a JKQTPlotter and initialize some plot data plot=new JKQTPlotter(this); - layout->addWidget(plot,3,0); + layout->addWidget(plot,4,0, 1,2); initPlot(); // add some of the default QActions from the JKQTPlotter to the window menu @@ -102,6 +106,8 @@ TestUserInteraction::TestUserInteraction(QWidget *parent) : cmbLeftNoModMouseAction->addItem("jkqtpmdaDrawEllipseForEvent"); cmbLeftNoModMouseAction->addItem("jkqtpmdaDrawLineForEvent"); cmbLeftNoModMouseAction->addItem("jkqtpmdaScribbleForEvents"); + cmbLeftNoModMouseAction->addItem("jkqtpmdaToolTipForClosestDataPoint"); + cmbLeftNoModMouseAction->addItem("jkqtpmdaRuler"); cmbLeftNoModMouseAction->addItem("NoMouseAction"); cmbLeftNoModMouseAction->setCurrentIndex(2); connect(cmbLeftNoModMouseAction, SIGNAL(currentIndexChanged(int)), this, SLOT(setLeftMouseAction(int))); @@ -118,6 +124,8 @@ TestUserInteraction::TestUserInteraction(QWidget *parent) : cmbLeftCtrlModMouseAction->addItem("jkqtpmdaDrawEllipseForEvent"); cmbLeftCtrlModMouseAction->addItem("jkqtpmdaDrawLineForEvent"); cmbLeftCtrlModMouseAction->addItem("jkqtpmdaScribbleForEvents"); + cmbLeftCtrlModMouseAction->addItem("jkqtpmdaToolTipForClosestDataPoint"); + cmbLeftCtrlModMouseAction->addItem("jkqtpmdaRuler"); cmbLeftCtrlModMouseAction->addItem("NoMouseAction"); cmbLeftCtrlModMouseAction->setCurrentIndex(0); connect(cmbLeftCtrlModMouseAction, SIGNAL(currentIndexChanged(int)), this, SLOT(setLeftCtrlMouseAction(int))); @@ -134,6 +142,8 @@ TestUserInteraction::TestUserInteraction(QWidget *parent) : cmbRightNoModMouseAction->addItem("jkqtpmdaDrawEllipseForEvent"); cmbRightNoModMouseAction->addItem("jkqtpmdaDrawLineForEvent"); cmbRightNoModMouseAction->addItem("jkqtpmdaScribbleForEvents"); + cmbRightNoModMouseAction->addItem("jkqtpmdaToolTipForClosestDataPoint"); + cmbRightNoModMouseAction->addItem("jkqtpmdaRuler"); cmbRightNoModMouseAction->addItem("ContextMenu"); cmbRightNoModMouseAction->setCurrentIndex(5); connect(cmbRightNoModMouseAction, SIGNAL(currentIndexChanged(int)), this, SLOT(setRightMouseAction(int))); @@ -193,16 +203,100 @@ TestUserInteraction::TestUserInteraction(QWidget *parent) : connect(cmbMouseWheelAction, SIGNAL(currentIndexChanged(int)), this, SLOT(setMouseWheelNoModAction(int))); setMouseWheelNoModAction(cmbMouseWheelAction->currentIndex()); + // add a QComboBox that allows to set the type of user-action markers + cmbUserActionMarkerType=new QComboBox(this); + layForm2->addRow("mouse action: marker type", cmbUserActionMarkerType); + cmbUserActionMarkerType->addItem("jkqtpuamtCircle"); + cmbUserActionMarkerType->addItem("jkqtpuamtCrossHair"); + cmbUserActionMarkerType->addItem("jkqtpuamtCircleAndCrossHair"); + cmbUserActionMarkerType->setCurrentIndex(0); + connect(cmbUserActionMarkerType, SIGNAL(currentIndexChanged(int)), this, SLOT(setUserActionMarkerType(int))); + setUserActionMarkerType(cmbUserActionMarkerType->currentIndex()); + + // add a QComboBox that allows to set the fill&outline of user-action markers + cmbUserActionMarkerColor=new QComboBox(this); + layForm2->addRow("mouse action: marker color", cmbUserActionMarkerColor); + cmbUserActionMarkerColor->addItem(jkqtp_QColor2String(plot->getUserActionMarkerPen().color())); + cmbUserActionMarkerColor->addItem("red"); + cmbUserActionMarkerColor->addItem("blue"); + cmbUserActionMarkerColor->addItem("green"); + cmbUserActionMarkerColor->addItem("yellow"); + cmbUserActionMarkerColor->addItem("silver"); + cmbUserActionMarkerColor->addItem("black"); + cmbUserActionMarkerColor->addItem("white"); + cmbUserActionMarkerColor->setCurrentIndex(0); + connect(cmbUserActionMarkerColor, SIGNAL(currentIndexChanged(int)), this, SLOT(setUserActionMarkerColor(int))); + setUserActionMarkerColor(cmbUserActionMarkerColor->currentIndex()); + + // add a QComboBox that allows to set the outline color of user-action Opaques + cmbUserActionOpaqueColor=new QComboBox(this); + layForm2->addRow("mouse action: opaque outline color", cmbUserActionOpaqueColor); + cmbUserActionOpaqueColor->addItem(jkqtp_QColor2String(plot->getUserActionOpaquePen().color())); + cmbUserActionOpaqueColor->addItem("red"); + cmbUserActionOpaqueColor->addItem("blue"); + cmbUserActionOpaqueColor->addItem("green"); + cmbUserActionOpaqueColor->addItem("yellow"); + cmbUserActionOpaqueColor->addItem("silver"); + cmbUserActionOpaqueColor->addItem("black"); + cmbUserActionOpaqueColor->addItem("white"); + cmbUserActionOpaqueColor->setCurrentIndex(0); + connect(cmbUserActionOpaqueColor, SIGNAL(currentIndexChanged(int)), this, SLOT(setUserActionOpaqueColor(int))); + setUserActionOpaqueColor(cmbUserActionOpaqueColor->currentIndex()); + + // add a QComboBox that allows to set the fill color of user-action Opaques + cmbUserActionOpaqueFillColor=new QComboBox(this); + layForm2->addRow("mouse action: opaque fill color", cmbUserActionOpaqueFillColor); + cmbUserActionOpaqueFillColor->addItem(jkqtp_QColor2String(plot->getUserActionOpaqueBrush().color())); + cmbUserActionOpaqueFillColor->addItem("salmon"); + cmbUserActionOpaqueFillColor->addItem("aliceblue"); + cmbUserActionOpaqueFillColor->addItem("honeydew"); + cmbUserActionOpaqueFillColor->addItem("lightyellow"); + cmbUserActionOpaqueFillColor->addItem("lightgray"); + cmbUserActionOpaqueFillColor->addItem("silver"); + cmbUserActionOpaqueFillColor->addItem("white"); + cmbUserActionOpaqueFillColor->setCurrentIndex(0); + connect(cmbUserActionOpaqueFillColor, SIGNAL(currentIndexChanged(int)), this, SLOT(setUserActionOpaqueFillColor(int))); + setUserActionOpaqueFillColor(cmbUserActionOpaqueFillColor->currentIndex()); + + // add a QComboBox that allows to set the outline color of user-action Overlays + cmbUserActionOverlayColor=new QComboBox(this); + layForm2->addRow("mouse action: overlay outline color", cmbUserActionOverlayColor); + cmbUserActionOverlayColor->addItem(jkqtp_QColor2String(plot->getUserActionOverlayPen().color())); + cmbUserActionOverlayColor->addItem("red"); + cmbUserActionOverlayColor->addItem("blue"); + cmbUserActionOverlayColor->addItem("green"); + cmbUserActionOverlayColor->addItem("yellow"); + cmbUserActionOverlayColor->addItem("silver"); + cmbUserActionOverlayColor->addItem("black"); + cmbUserActionOverlayColor->addItem("white"); + cmbUserActionOverlayColor->setCurrentIndex(0); + connect(cmbUserActionOverlayColor, SIGNAL(currentIndexChanged(int)), this, SLOT(setUserActionOverlayColor(int))); + setUserActionOverlayColor(cmbUserActionOverlayColor->currentIndex()); + + // add a QComboBox that allows to set the fill color of user-action Overlays + cmbUserActionOverlayFillColor=new QComboBox(this); + layForm2->addRow("mouse action: overlay fill color", cmbUserActionOverlayFillColor); + cmbUserActionOverlayFillColor->addItem(jkqtp_QColor2String(plot->getUserActionOverlayBrush().color())); + cmbUserActionOverlayFillColor->addItem("red"); + cmbUserActionOverlayFillColor->addItem("blue"); + cmbUserActionOverlayFillColor->addItem("green"); + cmbUserActionOverlayFillColor->addItem("yellow"); + cmbUserActionOverlayFillColor->addItem("silver"); + cmbUserActionOverlayFillColor->addItem("black"); + cmbUserActionOverlayFillColor->addItem("white"); + cmbUserActionOverlayFillColor->setCurrentIndex(0); + connect(cmbUserActionOverlayFillColor, SIGNAL(currentIndexChanged(int)), this, SLOT(setUserActionOverlayFillColor(int))); + setUserActionOverlayFillColor(cmbUserActionOverlayFillColor->currentIndex()); // and add a QLabel to show the different events of the JKQTPlotter: labMouseMoved=new QLabel(this); - layForm->addRow("last mouse moved:", labMouseMoved); + layLab->addRow("last mouse moved:", labMouseMoved); labMouseClicked=new QLabel(this); - layForm->addRow("last mouse clicked:", labMouseClicked); + layLab->addRow("last mouse clicked:", labMouseClicked); labMouseAction=new QLabel(this); - layForm->addRow("last plotter signal:", labMouseAction); + layLab->addRow("last plotter signal:", labMouseAction); connect(plot, SIGNAL(plotMouseMove(double, double)), this, SLOT(plotMouseMove(double, double))); connect(plot, SIGNAL(plotMouseClicked(double, double, Qt::KeyboardModifiers , Qt::MouseButton)), this, SLOT(plotMouseClicked(double, double, Qt::KeyboardModifiers, Qt::MouseButton))); connect(plot, SIGNAL(plotMouseDoubleClicked(double, double, Qt::KeyboardModifiers, Qt::MouseButton)), this, SLOT(plotMouseDoubleClicked(double, double, Qt::KeyboardModifiers, Qt::MouseButton))); @@ -215,6 +309,8 @@ TestUserInteraction::TestUserInteraction(QWidget *parent) : connect(plot, SIGNAL(userLineFinished(double, double, double, double, Qt::KeyboardModifiers)), this, SLOT(userLineFinished(double, double, double, double, Qt::KeyboardModifiers))); connect(plot, SIGNAL(userCircleFinished(double, double, double, Qt::KeyboardModifiers)), this, SLOT(userCircleFinished(double, double, double, Qt::KeyboardModifiers))); connect(plot, SIGNAL(userEllipseFinished(double, double, double, double, Qt::KeyboardModifiers)), this, SLOT(userEllipseFinished(double, double, double, double, Qt::KeyboardModifiers))); + connect(plot, SIGNAL(rulerDisplayed(double, double, double, double, Qt::KeyboardModifiers)), this, SLOT(rulerDisplayed(double, double, double, double, Qt::KeyboardModifiers))); + connect(plot, SIGNAL(tooltipDisplayed(double, double, const QStringList&, const QList& )), this, SLOT(tooltipDisplayed(double, double, const QStringList&, const QList&))); w->setLayout(layout); @@ -267,6 +363,57 @@ void TestUserInteraction::setMouseWheelNoModAction(int index) else plot->registerMouseWheelAction(Qt::NoModifier, static_cast(index)); } +void TestUserInteraction::setUserActionMarkerType(int index) +{ + plot->setUserActionMarkerType(static_cast(index)) ; +} + +void TestUserInteraction::setUserActionMarkerColor(int index) +{ + QColor c=jkqtp_String2QColor(cmbUserActionMarkerColor->itemText(index)); + QPen p=plot->getUserActionMarkerPen(); + p.setColor(c); + plot->setUserActionMarkerPen(p) ; + QBrush b=plot->getUserActionMarkerBrush(); + c.setAlphaF(0.4); + b.setColor(c); + plot->setUserActionMarkerBrush(b) ; +} + +void TestUserInteraction::setUserActionOpaqueColor(int index) +{ + QColor c=jkqtp_String2QColor(cmbUserActionOpaqueColor->itemText(index)); + QPen p=plot->getUserActionOpaquePen(); + p.setColor(c); + plot->setUserActionOpaquePen(p) ; +} + +void TestUserInteraction::setUserActionOpaqueFillColor(int index) +{ + QColor c=jkqtp_String2QColor(cmbUserActionOpaqueFillColor->itemText(index)); + QBrush b=plot->getUserActionOpaqueBrush(); + b.setColor(c.lighter()); + plot->setUserActionOpaqueBrush(b) ; + +} + +void TestUserInteraction::setUserActionOverlayColor(int index) +{ + QColor c=jkqtp_String2QColor(cmbUserActionOverlayColor->itemText(index)); + QPen p=plot->getUserActionOverlayPen(); + p.setColor(c); + plot->setUserActionOverlayPen(p) ; +} + +void TestUserInteraction::setUserActionOverlayFillColor(int index) +{ + QColor c=jkqtp_String2QColor(cmbUserActionOverlayColor->itemText(index)); + QBrush b=plot->getUserActionOverlayBrush(); + c.setAlphaF(0.4); + b.setColor(c); + plot->setUserActionOverlayBrush(b) ; +} + void TestUserInteraction::plotMouseMove(double x, double y) { labMouseMoved->setText(QString("plotMouseMove(%1, %2)").arg(x).arg(y)); @@ -343,6 +490,16 @@ void TestUserInteraction::userEllipseFinished(double x, double y, double radiusX labMouseAction->setText(QString("userEllipseFinished(x=%1, y=%2, radiusX=%3, radiusY=%4, modifiers=%5)").arg(x).arg(y).arg(radiusX).arg(radiusY).arg(KeyboradMod2String(modifiers))); } +void TestUserInteraction::tooltipDisplayed(double x, double y, const QStringList& entries, const QList& graphs) +{ + labMouseAction->setText(QString("tooltipDisplayed(x=%1, y=%2, entries=%3)").arg(x).arg(y).arg(entries.join(";;"))); +} + +void TestUserInteraction::rulerDisplayed(double x1, double y1, double x2, double y2, Qt::KeyboardModifiers modifiers) +{ + labMouseAction->setText(QString("rulerDisplayed(x1=%1/%2, x2=%3/%4, modifiers=%5)").arg(x1).arg(y1).arg(x2).arg(y2).arg(KeyboradMod2String(modifiers))); +} + QString TestUserInteraction::KeyboradMod2String(Qt::KeyboardModifiers modifiers) { QString mod=""; if ((modifiers & Qt::ShiftModifier) != 0) mod+="SHIFT "; @@ -370,13 +527,14 @@ void TestUserInteraction::initPlot() JKQTPDatastore* ds=plot->getDatastore(); // 2. now we create data for a simple plot (a sine curve) - QVector X, Y1, Y2; + QVector X, Y1, Y2, EY2; const int Ndata=100; for (int i=0; iaddCopiedColumn(X, "x"); size_t columnY1=ds->addCopiedColumn(Y1, "y1"); size_t columnY2=ds->addCopiedColumn(Y2, "y2"); + size_t columnEY2=ds->addCopiedColumn(EY2, "ey2"); // 4. create a graph in the plot, which plots the dataset X/Y: - JKQTPXYLineGraph* graph1=new JKQTPXYLineGraph(plot); + JKQTPXYLineErrorGraph* graph1=new JKQTPXYLineErrorGraph(plot); graph1->setXColumn(columnX); graph1->setYColumn(columnY1); + graph1->setYErrorColumn(columnEY2); graph1->setTitle(QObject::tr("sine graph")); plot->addGraph(graph1); diff --git a/examples/test_user_interaction/test_user_interaction.h b/examples/test_user_interaction/test_user_interaction.h index b2fe0e7fa2..0bd104c246 100644 --- a/examples/test_user_interaction/test_user_interaction.h +++ b/examples/test_user_interaction/test_user_interaction.h @@ -29,6 +29,12 @@ class TestUserInteraction : public QMainWindow void setLeftDoubleClickMouseAction(int index); void setRightDoubleClickMouseAction(int index); void setMouseWheelNoModAction(int index); + void setUserActionMarkerType(int index); + void setUserActionMarkerColor(int index); + void setUserActionOverlayColor(int index); + void setUserActionOverlayFillColor(int index); + void setUserActionOpaqueColor(int index); + void setUserActionOpaqueFillColor(int index); void plotMouseMove(double x, double y); void plotMouseClicked(double x, double y, Qt::KeyboardModifiers modifiers, Qt::MouseButton button); @@ -42,6 +48,8 @@ class TestUserInteraction : public QMainWindow void userLineFinished(double x1, double y1, double x2, double y2, Qt::KeyboardModifiers modifiers); void userCircleFinished(double x, double y, double radius, Qt::KeyboardModifiers modifiers); void userEllipseFinished(double x, double y, double radiusX, double radiusY, Qt::KeyboardModifiers modifiers); + void tooltipDisplayed(double x, double y, const QStringList& entries, const QList& graphs); + void rulerDisplayed(double x1, double y1, double x2, double y2, Qt::KeyboardModifiers modifiers); protected: void initPlot(); JKQTPlotter* plot; @@ -49,6 +57,8 @@ class TestUserInteraction : public QMainWindow QHBoxLayout* layChk; QHBoxLayout* layChk2; QFormLayout* layForm; + QFormLayout* layForm2; + QFormLayout* layLab; QCheckBox* chkPositionDisplay; QCheckBox* chkShowToolbar; QCheckBox* chkToolbarAlwaysOn; @@ -60,6 +70,12 @@ class TestUserInteraction : public QMainWindow QComboBox* cmbRightDoubleClickMouseAction; QComboBox* cmbLeftDoubleClickMouseAction; QComboBox* cmbMouseWheelAction; + QComboBox* cmbUserActionMarkerType; + QComboBox* cmbUserActionMarkerColor; + QComboBox* cmbUserActionOverlayColor; + QComboBox* cmbUserActionOverlayFillColor; + QComboBox* cmbUserActionOpaqueColor; + QComboBox* cmbUserActionOpaqueFillColor; QCheckBox* chkLogX; QCheckBox* chkLogY; QLabel* labMouseAction; diff --git a/lib/jkqtfastplotter/jkqtfastplotter.h b/lib/jkqtfastplotter/jkqtfastplotter.h index 2ce809f02d..463259a962 100644 --- a/lib/jkqtfastplotter/jkqtfastplotter.h +++ b/lib/jkqtfastplotter/jkqtfastplotter.h @@ -700,7 +700,7 @@ class JKQTP_LIB_EXPORT JKQTFastPlotter : public QGLWidget { /*! \brief sets the property gridStyle ( \copybrief gridStyle ) to the specified \a __value. \details Description of the parameter gridStyle is:

    \copydoc JKQTFastPlotter::gridStyle
    \see gridStyle for more information */ - inline void setGridStyle(const Qt::PenStyle & __value) + inline void setGridStyle(Qt::PenStyle __value) { if (this->gridStyle != __value) { this->gridStyle = __value; @@ -1381,7 +1381,7 @@ class JKQTP_LIB_EXPORT JKQTFPLinePlot: public JKQTFPPlot { /*! \brief sets the property style ( \copybrief style ) to the specified \a __value. \details Description of the parameter style is:
    \copydoc JKQTFastPlotter::style
    \see style for more information */ - inline void setStyle(const Qt::PenStyle & __value) + inline void setStyle(Qt::PenStyle __value) { if (this->style != __value) { this->style = __value; @@ -1415,7 +1415,7 @@ class JKQTP_LIB_EXPORT JKQTFPLinePlot: public JKQTFPPlot { /*! \brief sets the property errorColor ( \copybrief errorColor ) to the specified \a __value. \details Description of the parameter errorColor is:
    \copydoc JKQTFastPlotter::errorColor
    \see errorColor for more information */ - inline void setErrorColor(const QColor & __value) + inline void setErrorLineColor(const QColor & __value) { if (this->errorColor != __value) { this->errorColor = __value; @@ -1425,14 +1425,14 @@ class JKQTP_LIB_EXPORT JKQTFPLinePlot: public JKQTFPPlot { /*! \brief returns the property errorColor ( \copybrief errorColor ). \details Description of the parameter errorColor is:
    \copydoc JKQTFastPlotter::errorColor
    \see errorColor for more information */ - inline QColor getErrorColor() const + inline QColor getErrorLineColor() const { return this->errorColor; } /*! \brief sets the property errorStyle ( \copybrief errorStyle ) to the specified \a __value. \details Description of the parameter errorStyle is:
    \copydoc JKQTFastPlotter::errorStyle
    \see errorStyle for more information */ - inline void setErrorStyle(const Qt::PenStyle & __value) + inline void setErrorLineStyle(Qt::PenStyle __value) { if (this->errorStyle != __value) { this->errorStyle = __value; @@ -1442,14 +1442,14 @@ class JKQTP_LIB_EXPORT JKQTFPLinePlot: public JKQTFPPlot { /*! \brief returns the property errorStyle ( \copybrief errorStyle ). \details Description of the parameter errorStyle is:
    \copydoc JKQTFastPlotter::errorStyle
    \see errorStyle for more information */ - inline Qt::PenStyle getErrorStyle() const + inline Qt::PenStyle getErrorLineStyle() const { return this->errorStyle; } /*! \brief sets the property errorWidth ( \copybrief errorWidth ) to the specified \a __value. \details Description of the parameter errorWidth is:
    \copydoc JKQTFastPlotter::errorWidth
    \see errorWidth for more information */ - inline void setErrorWidth(double __value) + inline void setErrorLineWidth(double __value) { if (this->errorWidth != __value) { this->errorWidth = __value; @@ -1459,7 +1459,7 @@ class JKQTP_LIB_EXPORT JKQTFPLinePlot: public JKQTFPPlot { /*! \brief returns the property errorWidth ( \copybrief errorWidth ). \details Description of the parameter errorWidth is:
    \copydoc JKQTFastPlotter::errorWidth
    \see errorWidth for more information */ - inline double getErrorWidth() const + inline double getErrorLineWidth() const { return this->errorWidth; } @@ -1639,7 +1639,7 @@ class JKQTP_LIB_EXPORT JKQTFPXRangePlot: public JKQTFPPlot { /*! \brief sets the property fillStyle ( \copybrief fillStyle ) to the specified \a __value. \details Description of the parameter fillStyle is:
    \copydoc JKQTFPXRangePlot::fillStyle
    \see fillStyle for more information */ - inline void setFillStyle(const Qt::BrushStyle & __value) + inline void setFillStyle(Qt::BrushStyle __value) { if (this->fillStyle != __value) { this->fillStyle = __value; @@ -1656,7 +1656,7 @@ class JKQTP_LIB_EXPORT JKQTFPXRangePlot: public JKQTFPPlot { /*! \brief sets the property style ( \copybrief style ) to the specified \a __value. \details Description of the parameter style is:
    \copydoc JKQTFPXRangePlot::style
    \see style for more information */ - inline void setStyle(const Qt::PenStyle & __value) + inline void setStyle(Qt::PenStyle __value) { if (this->style != __value) { this->style = __value; @@ -1833,7 +1833,7 @@ class JKQTP_LIB_EXPORT JKQTFPYRangePlot: public JKQTFPPlot { /*! \brief sets the property fillStyle ( \copybrief fillStyle ) to the specified \a __value. \details Description of the parameter fillStyle is:
    \copydoc JKQTFPYRangePlot::fillStyle
    \see fillStyle for more information */ - inline void setFillStyle(const Qt::BrushStyle & __value) + inline void setFillStyle(Qt::BrushStyle __value) { if (this->fillStyle != __value) { this->fillStyle = __value; @@ -1850,7 +1850,7 @@ class JKQTP_LIB_EXPORT JKQTFPYRangePlot: public JKQTFPPlot { /*! \brief sets the property style ( \copybrief style ) to the specified \a __value. \details Description of the parameter style is:
    \copydoc JKQTFPYRangePlot::style
    \see style for more information */ - inline void setStyle(const Qt::PenStyle & __value) + inline void setStyle(Qt::PenStyle __value) { if (this->style != __value) { this->style = __value; @@ -3889,7 +3889,7 @@ class JKQTP_LIB_EXPORT JKQTFPQOverlayLinearGridPlot: public JKQTFPPlot { /*! \brief sets the property style ( \copybrief style ) to the specified \a __value. \details Description of the parameter style is:
    \copydoc JKQTFPQOverlayLinearGridPlot::style
    \see style for more information */ - inline void setStyle(const Qt::PenStyle & __value) + inline void setStyle(Qt::PenStyle __value) { if (this->style != __value) { this->style = __value; diff --git a/lib/jkqtmathtext/jkqtmathtext.cpp b/lib/jkqtmathtext/jkqtmathtext.cpp index f9e1fa3e5a..8d5033ae64 100644 --- a/lib/jkqtmathtext/jkqtmathtext.cpp +++ b/lib/jkqtmathtext/jkqtmathtext.cpp @@ -518,13 +518,14 @@ bool JKQTMathText::MTinstruction1Node::setupMTenvironment(JKQTMathText::MTenviro else if (name=="em") ev.italic=!ev.italic; else if (name=="it" || name=="textit" || name=="mathit") ev.italic=true; else if (name=="textcolor" || name=="mathcolor" || name=="color") ev.color=QColor(parameters.value(0, ev.color.name())); - else if (name=="equation") { ev.italic=true; ev.insideMath=true; } + else if (name=="ensuremath" || name=="equation") { ev.italic=true; ev.insideMath=true; } else if (name=="sc" || name=="textsc" || name=="mathsc") ev.smallCaps=true; else if (name=="ul" || name=="underline" || name=="underlined") ev.underlined=true; else if (name=="ol" || name=="overline" || name=="overlined") ev.overline=true; else if (name=="strike") ev.strike=true; else if (name=="rm" || name=="textrm") { ev.font=JKQTMathText::MTEroman; } - else if (name=="mathrm" || name=="text" || name=="mbox" || name=="operatorname") { ev.font=JKQTMathText::MTEroman; ev.italic=false; } + else if (name=="mathrm" || name=="operatorname") { ev.font=JKQTMathText::MTEroman; ev.italic=false; } + else if (name=="text" || name=="mbox" || name=="ensuretext") { ev.insideMath=false; ev.font=JKQTMathText::MTEroman; ev.italic=false; } else if (name=="mat") { ev.font=JKQTMathText::MTEroman; ev.italic=false; ev.bold=true; } else if (name=="cal" || name=="textcal" || name=="mathcal") { ev.font=JKQTMathText::MTEcaligraphic; } else if (name=="bb" || name=="textbb" || name=="mathbb") { ev.font=JKQTMathText::MTEblackboard; } @@ -1574,7 +1575,7 @@ JKQTMathText::MTlistNode::MTlistNode(JKQTMathText* parent): subsupOperations<<"sum"<<"prod"<<"coprod" <<"bigcap"<<"bigcup"<<"bigvee"<<"bighat" <<"int"<<"iint"<<"iiint"<<"oint"<<"oiint"<<"oiiint" - <<"max"<<"min"<<"argmax"<<"argmin"<<"sup"<<"inf" + <<"mod"<<"median"<<"max"<<"min"<<"argmax"<<"argmin"<<"sup"<<"inf" <<"liminf"<<"limsup"<<"lim"<<"max"<<"min"; } @@ -2027,7 +2028,11 @@ JKQTMathText::MTsymbolNode::MTsymbolNode(JKQTMathText* parent, const QString& na simpleTranslations.insert("argmin", "argmin"); simpleTranslations.insert("argmax", "argmax"); simpleTranslations.insert("max", "max"); + simpleTranslations.insert("mod", "mod"); simpleTranslations.insert("min", "min"); + simpleTranslations.insert("median", "median"); + simpleTranslations.insert("sign", "sign"); + simpleTranslations.insert("sgn", "sgn"); simpleTranslations.insert("sec", "sec"); simpleTranslations.insert("gcd", "gcd"); simpleTranslations.insert("hom", "hom"); @@ -2045,6 +2050,7 @@ JKQTMathText::MTsymbolNode::MTsymbolNode(JKQTMathText* parent, const QString& na static QHash simpleTranslations_heightIsAscent; if (simpleTranslations_heightIsAscent.isEmpty()) { simpleTranslations_heightIsAscent.insert("erf", "erf"); + simpleTranslations_heightIsAscent.insert("median", "median"); simpleTranslations_heightIsAscent.insert("min", "min"); simpleTranslations_heightIsAscent.insert("max", "max"); simpleTranslations_heightIsAscent.insert("inf", "inf"); @@ -2751,7 +2757,7 @@ JKQTMathText::MTsymbolNode::MTsymbolNode(JKQTMathText* parent, const QString& na static QSet extraSymbolName = { "infty", - "|", " ", "quad", ";", ":", ",", "!", + "|", " ", "quad", "qquad", "space", ";", ":", ",", "!", "longleftarrow", "longrightarrow", "Longleftarrow", "Longrightarrow", "longleftrightarrow", "Longleftrightarrow" @@ -2804,8 +2810,8 @@ void JKQTMathText::MTsymbolNode::getSizeInternal(QPainter& painter, JKQTMathText width=fm.width("a"); if (symbolName=="|") width=fm.width("1")*0.8; else if (symbolName=="infty") width=fm.width("M"); - else if (symbolName=="quad") width=parent->getTightBoundingRect(f, "M", painter.device()).width(); - else if (symbolName==" ") width=parent->getTightBoundingRect(f, "x", painter.device()).width(); + else if (symbolName=="quad" || symbolName=="qquad") width=parent->getTightBoundingRect(f, "M", painter.device()).width(); + else if (symbolName==" " || symbolName=="space") width=parent->getTightBoundingRect(f, "x", painter.device()).width(); else if (symbolName==";") width=parent->getTightBoundingRect(f, "x", painter.device()).width()*0.75; else if (symbolName==":") width=parent->getTightBoundingRect(f, "x", painter.device()).width()*0.5; else if (symbolName==",") width=parent->getTightBoundingRect(f, "x", painter.device()).width()*0.25; @@ -2904,8 +2910,10 @@ double JKQTMathText::MTsymbolNode::draw(QPainter& painter, double x, double y, J // here are some spaces - } else if (symbolName==" ") { // full space - } else if (symbolName=="quad") { // 75% space + } else if (symbolName==" ") { // full space (width of x) + } else if (symbolName=="space") { // full space (width of x) + } else if (symbolName=="qquad") { // full space(width of M) + } else if (symbolName=="quad") { // full space(width of M) } else if (symbolName==";") { // 75% space } else if (symbolName==":") { // 50% space } else if (symbolName==",") { // 25% space @@ -2982,6 +2990,8 @@ bool JKQTMathText::MTsymbolNode::toHtml(QString &html, JKQTMathText::MTenvironme entitylut.insert("ld", "ld"); entitylut.insert("lb", "lb"); entitylut.insert("erf", "erf"); + entitylut.insert("mod", "mod"); + entitylut.insert("median", "median"); entitylut.insert("min", "min"); entitylut.insert("max", "max"); entitylut.insert("argmin", "argmin"); @@ -2991,8 +3001,6 @@ bool JKQTMathText::MTsymbolNode::toHtml(QString &html, JKQTMathText::MTenvironme entitylut.insert("liminf", "liminf"); entitylut.insert("limsup", "limsup"); entitylut.insert("lim", "lim"); - entitylut.insert("max", "max"); - entitylut.insert("min", "min"); entitylut.insert("sec", "sec"); entitylut.insert("gcd", "gcd"); entitylut.insert("hom", "hom"); @@ -3002,6 +3010,8 @@ bool JKQTMathText::MTsymbolNode::toHtml(QString &html, JKQTMathText::MTenvironme entitylut.insert("arg", "arg"); entitylut.insert("det", "det"); entitylut.insert("deg", "deg"); + entitylut.insert("sign", "sign"); + entitylut.insert("sgn", "sgn"); entitylut.insert("Pr", "Pr"); entitylut.insert("coth", "coth"); entitylut.insert("alpha", "α"); @@ -3235,8 +3245,8 @@ JKQTMathText::JKQTMathText(QObject* parent): default_fontSize=fontSize=10; - default_fontRoman=fontRoman=serifFont; - default_fontSans=fontSans=sansFont; + default_fontRoman=fontRoman=fontReplacements.value(serifFont, serifFont); + default_fontSans=fontSans=fontReplacements.value(sansFont, sansFont); default_fontTypewriter=fontTypewriter=typewriterFont; default_fontScript=fontScript=scriptFont; default_fontGreek=fontGreek=symbolFont; @@ -3290,13 +3300,13 @@ JKQTMathText::~JKQTMathText() { void JKQTMathText::loadSettings(const QSettings& settings, const QString& group){ fontSize=settings.value(group+"font_size", fontSize).toDouble(); fontColor=jkqtp_String2QColor(settings.value(group+"font_color", jkqtp_QColor2String(fontColor)).toString()); - fontRoman=settings.value(group+"font_roman", fontRoman).toString(); - fontSans=settings.value(group+"font_sans", fontSans).toString(); + setFontRoman(settings.value(group+"font_roman", fontRoman).toString()); + setFontSans(settings.value(group+"font_sans", fontSans).toString()); fontTypewriter=settings.value(group+"font_typewriter", fontTypewriter).toString(); fontScript=settings.value(group+"font_script", fontScript).toString(); fontGreek=settings.value(group+"font_greek", fontGreek).toString(); fontSymbol=settings.value(group+"font_symbol", fontSymbol).toString(); - fontBraces=settings.value(group+"font_braces", fontRoman).toString(); + fontBraces=settings.value(group+"font_braces", fontBraces).toString(); fontIntegrals=settings.value(group+"font_integrals", fontSans).toString(); fontBlackboard=settings.value(group+"font_blackboard", fontSans).toString(); fontCaligraphic=settings.value(group+"font_caligraphics", fontSans).toString(); @@ -3525,6 +3535,10 @@ QString JKQTMathText::toHtml(bool *ok, double fontPointSize) { return s; } +void JKQTMathText::addReplacementFont(const QString &nonUseFont, const QString &useFont) { + fontReplacements.insert(nonUseFont, useFont); +} + void JKQTMathText::setFontRomanOrSpecial(const QString &__value) { if (__value.toUpper()=="XITS") { @@ -3551,8 +3565,8 @@ void JKQTMathText::setFontRomanOrSpecial(const QString &__value) void JKQTMathText::useAnyUnicode(QString timesFont, const QString& sansFont, bool fullMathUnicodeFont) { - if (!timesFont.isEmpty()) { fontRoman=timesFont; } - if (!sansFont.isEmpty()) { fontSans=sansFont; } + if (!timesFont.isEmpty()) { setFontRoman(timesFont); } + if (!sansFont.isEmpty()) { setFontSans(sansFont); } useSTIXfonts=false; useXITSfonts=false; useASANAfonts=false; @@ -4161,17 +4175,28 @@ void JKQTMathText::draw(QPainter& painter, double x, double y, bool drawBoxes){ MTenvironment ev; ev.color=fontColor; ev.fontSize=fontSize; + QPen pp=painter.pen(); + QPen p=pp; + p.setStyle(Qt::SolidLine); + painter.setPen(p); getTree()->setDrawBoxes(drawBoxes); + painter.setPen(p); getTree()->draw(painter, x, y, ev); + painter.setPen(pp); } } void JKQTMathText::draw(QPainter& painter, unsigned int flags, QRectF rect, bool drawBoxes) { if (getTree()!=nullptr) { + QPen pp=painter.pen(); + QPen p=pp; + p.setStyle(Qt::SolidLine); + painter.setPen(p); MTenvironment ev; ev.color=fontColor; ev.fontSize=fontSize; getTree()->setDrawBoxes(drawBoxes); + painter.setPen(p); double width=0; double baselineHeight=0; @@ -4192,6 +4217,7 @@ void JKQTMathText::draw(QPainter& painter, unsigned int flags, QRectF rect, bool // finally draw getTree()->draw(painter, x, y, ev); + painter.setPen(pp); } } diff --git a/lib/jkqtmathtext/jkqtmathtext.h b/lib/jkqtmathtext/jkqtmathtext.h index 1583110c80..c813c80657 100644 --- a/lib/jkqtmathtext/jkqtmathtext.h +++ b/lib/jkqtmathtext/jkqtmathtext.h @@ -330,12 +330,23 @@ class JKQTP_LIB_EXPORT JKQTMathText : public QObject { { return this->fontSize; } + /** \brief add a font pair to the table with font replacements + * + * e.g. if it is known that a certain font is not good for rendering, you can add an alternative with this function. + * These are automatically applied, when setting a new font name! + * + * \param nonUseFont the font not to use + * \param useFont replacement font for nonUseFont + */ + void addReplacementFont(const QString& nonUseFont, const QString& useFont); + + /*! \brief sets the property fontRoman ( \copybrief fontRoman ) to the specified \a __value. \details Description of the parameter fontRoman is:
    \copydoc fontRoman
    \see fontRoman for more information */ inline void setFontRoman(const QString & __value) { - this->fontRoman = __value; + this->fontRoman = fontReplacements.value(__value, __value); } /*! \brief sets the property fontRoman ( \copybrief fontRoman ) to \a __value, or calls useXITS() if \a __value \c =="XITS". calls useSTIX() if \a __value \c =="STIX", ... @@ -349,7 +360,7 @@ class JKQTP_LIB_EXPORT JKQTMathText : public QObject { /*! \copydoc fontSans \see fontSans */ inline void setFontSans(const QString & __value) { - this->fontSans = __value; + this->fontSans = fontReplacements.value(__value, __value); } /*! \copydoc fontSans \see fontSans */ inline QString getFontSans() const @@ -1200,7 +1211,9 @@ class JKQTP_LIB_EXPORT JKQTMathText : public QObject { }; protected: - + /** \brief table with font replacements to use (e.g. if it is known that a certain font is not good for rendering, you can add + * an alternative using addReplacementFont(). These are automatically applied, when setting a new font name! */ + QMap fontReplacements; /** \brief font color */ QColor fontColor; diff --git a/lib/jkqtplotter/jkqtpbaseplotter.cpp b/lib/jkqtplotter/jkqtpbaseplotter.cpp index 214f54657c..0cb1136132 100644 --- a/lib/jkqtplotter/jkqtpbaseplotter.cpp +++ b/lib/jkqtplotter/jkqtpbaseplotter.cpp @@ -200,6 +200,14 @@ JKQTBasePlotter::JKQTBasePlotter(bool datastore_internal, QObject* parent, JKQTP datastoreInternal=false; } + // some fonts that are know to deliver bad rendering quality + mathText.addReplacementFont("MS Shell Dlg 2", "Arial"); + mathText.addReplacementFont("MS Shell Dlg", "Arial"); + mathText.addReplacementFont("MS Sans Serif", "Arial"); + mathText.addReplacementFont("MS Serif", "Times New Roman"); + mathText.addReplacementFont("MS Sans Serif Standard", "Arial"); + mathText.addReplacementFont("MS Serif Standard", "Times New Roman"); + xAxis=new JKQTPHorizontalAxis(this); yAxis=new JKQTPVerticalAxis(this); m_plotsModel=new JKQTPGraphsModel(this); @@ -216,49 +224,49 @@ JKQTBasePlotter::JKQTBasePlotter(bool datastore_internal, QObject* parent, JKQTP emitSignals=true; - actSavePlot=new QAction(QIcon(":/JKQTPlotter/jkqtp_saveplot.png"), "Save Plot", this); - actSavePlot->setToolTip("Save plot as image file (PDF, PS; PNG, ...)."); - actSaveData=new QAction(QIcon(":/JKQTPlotter/jkqtp_savedata.png"), "Save Data", this); - actSaveData->setToolTip("Save Data of the plot as file (CSV, ...)."); - actCopyData=new QAction(QIcon(":/JKQTPlotter/jkqtp_copydata.png"), "Copy Data", this); - actCopyData->setToolTip("Copy Data of the plot to the clipboard to be pasted into Excel etc."); - actCopyMatlab=new QAction(QIcon(":/JKQTPlotter/jkqtp_copymatlab.png"), "Copy Data to Matlab", this); - actCopyMatlab->setToolTip("Copy Data of the plot to the clipboard in Matlab script format."); - actCopyPixelImage=new QAction(QIcon(":/JKQTPlotter/jkqtp_copyimg.png"), "Copy Image", this); - actCopyPixelImage->setToolTip("Copy the plot as a pixel image to the clipboard"); + actSavePlot=new QAction(QIcon(":/JKQTPlotter/jkqtp_saveplot.png"), tr("Save Plot"), this); + actSavePlot->setToolTip(tr("Save plot as image file (PDF, PS; PNG, ...).")); + actSaveData=new QAction(QIcon(":/JKQTPlotter/jkqtp_savedata.png"), tr("Save Data"), this); + actSaveData->setToolTip(tr("Save Data of the plot as file (CSV, ...).")); + actCopyData=new QAction(QIcon(":/JKQTPlotter/jkqtp_copydata.png"), tr("Copy Data"), this); + actCopyData->setToolTip(tr("Copy Data of the plot to the clipboard to be pasted into Excel etc.")); + actCopyMatlab=new QAction(QIcon(":/JKQTPlotter/jkqtp_copymatlab.png"), tr("Copy Data to Matlab"), this); + actCopyMatlab->setToolTip(tr("Copy Data of the plot to the clipboard in Matlab script format.")); + actCopyPixelImage=new QAction(QIcon(":/JKQTPlotter/jkqtp_copyimg.png"), tr("Copy Image"), this); + actCopyPixelImage->setToolTip(tr("Copy the plot as a pixel image to the clipboard")); - actSavePDF=new QAction(QIcon(":/JKQTPlotter/jkqtp_savepdf.png"), "Save P&DF", this); - actSavePDF->setToolTip("Save as PDF"); + actSavePDF=new QAction(QIcon(":/JKQTPlotter/jkqtp_savepdf.png"), tr("Save P&DF"), this); + actSavePDF->setToolTip(tr("Save as PDF")); //toolbar->addAction(actSavePDF); #if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0)) actSavePS=new QAction(QIcon(":/JKQTPlotter/jkqtp_saveps.png"), "Save P&S", this); actSavePS->setToolTip("Save as PostScript"); //toolbar->addAction(actSavePS); #endif - actSaveSVG=new QAction(QIcon(":/JKQTPlotter/jkqtp_savesvg.png"), "Save S&VG", this); - actSaveSVG->setToolTip("Save as Scalable Vector Graphics (SVG)"); + actSaveSVG=new QAction(QIcon(":/JKQTPlotter/jkqtp_savesvg.png"), tr("Save S&VG"), this); + actSaveSVG->setToolTip(tr("Save as Scalable Vector Graphics (SVG)")); //toolbar->addAction(actSaveSVG); - actSavePix=new QAction(QIcon(":/JKQTPlotter/jkqtp_savepix.png"), "Save &Image", this); - actSavePix->setToolTip("Save as Pixel Image (PNG, JPEG, TIFF ...)"); + actSavePix=new QAction(QIcon(":/JKQTPlotter/jkqtp_savepix.png"), tr("Save &Image"), this); + actSavePix->setToolTip(tr("Save as Pixel Image (PNG, JPEG, TIFF ...)")); //toolbar->addAction(actSavePix); - actPrint=new QAction(QIcon(":/JKQTPlotter/jkqtp_print.png"), "&Print", this); + actPrint=new QAction(QIcon(":/JKQTPlotter/jkqtp_print.png"), tr("&Print"), this); actPrint->setToolTip("Print"); //toolbar->addSeparator(); - actSaveCSV=new QAction(QIcon(":/JKQTPlotter/jkqtp_savecsv.png"), "Save &CSV", this); - actSaveCSV->setToolTip("Save the data which is used for the plot as Comma Separated Values (CSV)"); + actSaveCSV=new QAction(QIcon(":/JKQTPlotter/jkqtp_savecsv.png"), tr("Save &CSV"), this); + actSaveCSV->setToolTip(tr("Save the data which is used for the plot as Comma Separated Values (CSV)")); //toolbar->addAction(actSaveCSV); //toolbar->addSeparator(); - actZoomAll=new QAction(QIcon(":/JKQTPlotter/jkqtp_zoomall.png"), "Zoom &All", this); - actZoomAll->setToolTip("Zoom to view all data"); - actZoomIn=new QAction(QIcon(":/JKQTPlotter/jkqtp_zoomin.png"), "Zoom &In", this); - actZoomIn->setToolTip("Zoom in around the center of the plot"); - actZoomOut=new QAction(QIcon(":/JKQTPlotter/jkqtp_zoomout.png"), "Zoom &Out", this); - actZoomOut->setToolTip("Zoom out"); + actZoomAll=new QAction(QIcon(":/JKQTPlotter/jkqtp_zoomall.png"), tr("Zoom &All"), this); + actZoomAll->setToolTip(tr("Zoom to view all data")); + actZoomIn=new QAction(QIcon(":/JKQTPlotter/jkqtp_zoomin.png"), tr("Zoom &In"), this); + actZoomIn->setToolTip(tr("Zoom in around the center of the plot")); + actZoomOut=new QAction(QIcon(":/JKQTPlotter/jkqtp_zoomout.png"), tr("Zoom &Out"), this); + actZoomOut->setToolTip(tr("Zoom out")); - actShowPlotData=new QAction(QIcon(":/JKQTPlotter/jkqtp_showplotdata.png"), "&Show Plot Data", this); - actShowPlotData->setToolTip("opens a dialog that contains all data used for the plot in a table."); + actShowPlotData=new QAction(QIcon(":/JKQTPlotter/jkqtp_showplotdata.png"), tr("&Show Plot Data"), this); + actShowPlotData->setToolTip(tr("Opens a dialog that contains all data used for the plot in a table.")); @@ -947,10 +955,10 @@ JKQTBasePlotter::JKQTPPen JKQTBasePlotter::getPlotStyle(int i) const{ //std::cout<<"style "<setYColumn(yColumn); gr->setXErrorStyle(errorStyle); gr->setXErrorColumn(xErrorColumn); - gr->setErrorColor(gr->getLineColor().darker()); + gr->setErrorLineColor(gr->getLineColor().darker()); QColor fc=gr->getLineColor(); fc.setAlphaF(0.5); gr->setErrorFillColor(fc); @@ -4292,7 +4300,7 @@ size_t JKQTBasePlotter::addGraphWithXError(size_t xColumn, size_t yColumn, size_ gr->setYColumn(yColumn); gr->setXErrorStyle(errorStyle); gr->setXErrorColumn(xErrorColumn); - gr->setErrorColor(gr->getLineColor()); + gr->setErrorLineColor(gr->getLineColor()); QColor fc=gr->getLineColor(); fc.setAlphaF(0.5); gr->setErrorFillColor(fc); @@ -4305,7 +4313,7 @@ size_t JKQTBasePlotter::addGraphWithXError(size_t xColumn, size_t yColumn, size_ gr->setYErrorColumn(xErrorColumn); gr->setYErrorStyle(errorStyle); gr->setXErrorStyle(JKQTPNoError); - gr->setErrorColor(gr->getSymbolColor()); + gr->setErrorLineColor(gr->getSymbolColor()); QColor fc=gr->getSymbolColor(); fc.setAlphaF(0.5); gr->setErrorFillColor(fc); @@ -4324,8 +4332,8 @@ size_t JKQTBasePlotter::addGraphWithYError(size_t xColumn, size_t yColumn, size_ gr->setYColumn(yColumn); gr->setYErrorStyle(errorStyle); gr->setYErrorColumn(yErrorColumn); - gr->setErrorColor(gr->getLineColor().darker()); - gr->setErrorWidth(gr->getLineWidth()/3.0); + gr->setErrorLineColor(gr->getLineColor().darker()); + gr->setErrorLineWidth(gr->getLineWidth()/3.0); QColor fc=gr->getLineColor(); fc.setAlphaF(0.5); gr->setErrorFillColor(fc); @@ -4337,7 +4345,7 @@ size_t JKQTBasePlotter::addGraphWithYError(size_t xColumn, size_t yColumn, size_ gr->setYColumn(yColumn); gr->setYErrorStyle(errorStyle); gr->setYErrorColumn(yErrorColumn); - gr->setErrorColor(gr->getLineColor()); + gr->setErrorLineColor(gr->getLineColor()); QColor fc=gr->getLineColor(); fc.setAlphaF(0.5); gr->setErrorFillColor(fc); @@ -4350,7 +4358,7 @@ size_t JKQTBasePlotter::addGraphWithYError(size_t xColumn, size_t yColumn, size_ gr->setYErrorColumn(yErrorColumn); gr->setYErrorStyle(errorStyle); gr->setXErrorStyle(JKQTPNoError); - gr->setErrorColor(gr->getSymbolColor()); + gr->setErrorLineColor(gr->getSymbolColor()); QColor fc=gr->getSymbolColor(); fc.setAlphaF(0.5); gr->setErrorFillColor(fc); @@ -4369,7 +4377,7 @@ size_t JKQTBasePlotter::addGraphWithXYError(size_t xColumn, size_t yColumn, size gr->setYErrorStyle(JKQTPErrorBars); gr->setXErrorColumn(xErrorColumn); gr->setXErrorStyle(JKQTPErrorBars); - gr->setErrorColor(gr->getSymbolColor()); + gr->setErrorLineColor(gr->getSymbolColor()); QColor fc=gr->getSymbolColor(); fc.setAlphaF(0.5); gr->setErrorFillColor(fc); @@ -5469,7 +5477,7 @@ void JKQTBasePlotter::JKQTPPen::setWidth(double w) { m_width=w; } -void JKQTBasePlotter::JKQTPPen::setErrorWidth(double w) +void JKQTBasePlotter::JKQTPPen::setErrorLineWidth(double w) { m_errorWidth=w; } @@ -5541,7 +5549,7 @@ void JKQTBasePlotter::JKQTPPen::setErrorFillColor(const QColor &col) m_errorFillColor=col; } -void JKQTBasePlotter::JKQTPPen::setErrorColor(const QColor &col) +void JKQTBasePlotter::JKQTPPen::setErrorLineColor(const QColor &col) { m_errorColor=col; } diff --git a/lib/jkqtplotter/jkqtpbaseplotter.h b/lib/jkqtplotter/jkqtpbaseplotter.h index 248985a8e4..120feb0b64 100644 --- a/lib/jkqtplotter/jkqtpbaseplotter.h +++ b/lib/jkqtplotter/jkqtpbaseplotter.h @@ -587,7 +587,7 @@ class JKQTP_LIB_EXPORT JKQTBasePlotter: public QObject { void setSymbolLineWidthF(double w); void setWidthF(double w); void setWidth(double w); - void setErrorWidth(double w); + void setErrorLineWidth(double w); double width() const; double widthF() const; double errorWidthF() const; @@ -603,7 +603,7 @@ class JKQTP_LIB_EXPORT JKQTBasePlotter: public QObject { QColor fillColor() const; void setFillColor(const QColor& col); void setErrorFillColor(const QColor& col); - void setErrorColor(const QColor& col); + void setErrorLineColor(const QColor& col); void setFillStyle(Qt::BrushStyle s); void setErrorFillStyle(Qt::BrushStyle s); Qt::BrushStyle fillStyle() const; diff --git a/lib/jkqtplotter/jkqtpdatastorage.h b/lib/jkqtplotter/jkqtpdatastorage.h index a9002cd414..ac2fbf6304 100644 --- a/lib/jkqtplotter/jkqtpdatastorage.h +++ b/lib/jkqtplotter/jkqtpdatastorage.h @@ -876,16 +876,16 @@ inline void JKQTPColumn::incValue(size_t n, double increment){ //////////////////////////////////////////////////////////////////////////////////////////////// inline double JKQTPColumn::getValue(size_t n) const { - if (!datastore) return 0; - if (!datastore->getItem(datastoreItem)) return 0; + if (!datastore) return nan(""); + if (!datastore->getItem(datastoreItem)) return nan(""); return datastore->getItem(datastoreItem)->get(datastoreOffset, n); } //////////////////////////////////////////////////////////////////////////////////////////////// inline double JKQTPColumn::getValue(int n) const { - if (!datastore) return 0; - if (!datastore->getItem(datastoreItem)) return 0; - if (n<0) return 0; + if (!datastore) return nan(""); + if (!datastore->getItem(datastoreItem)) return nan(""); + if (n<0) return nan(""); return datastore->getItem(datastoreItem)->get(datastoreOffset, static_cast(n)); } diff --git a/lib/jkqtplotter/jkqtpgraphsbarchart.cpp b/lib/jkqtplotter/jkqtpgraphsbarchart.cpp index 40b7155279..c7080af1f4 100644 --- a/lib/jkqtplotter/jkqtpgraphsbarchart.cpp +++ b/lib/jkqtplotter/jkqtpgraphsbarchart.cpp @@ -576,10 +576,10 @@ void JKQTPBarVerticalGraph::setFillColor_and_darkenedColor(QColor fill, int colo } JKQTPBarHorizontalErrorGraph::JKQTPBarHorizontalErrorGraph(JKQTBasePlotter *parent): - JKQTPBarHorizontalGraph(parent), JKQTPXGraphErrors(getKeyLabelColor(), parent) + JKQTPBarHorizontalGraph(parent) { setErrorColorFromGraphColor(getKeyLabelColor()); - if (parentPlotStyle>=0) setErrorStyleFromPen(parent->getPlotStyle(parentPlotStyle)); + initErrorStyle(parent, parentPlotStyle); } JKQTPBarHorizontalErrorGraph::JKQTPBarHorizontalErrorGraph(JKQTPlotter *parent): @@ -642,10 +642,10 @@ void JKQTPBarHorizontalErrorGraph::drawErrorsAfter(JKQTPEnhancedPainter &painter } JKQTPBarVerticalErrorGraph::JKQTPBarVerticalErrorGraph(JKQTBasePlotter *parent): - JKQTPBarVerticalGraph(parent), JKQTPYGraphErrors(getKeyLabelColor(), parent) + JKQTPBarVerticalGraph(parent) { setErrorColorFromGraphColor(getKeyLabelColor()); - if (parentPlotStyle>=0) setErrorStyleFromPen(parent->getPlotStyle(parentPlotStyle)); + initErrorStyle(parent, parentPlotStyle); } diff --git a/lib/jkqtplotter/jkqtpgraphsbase.cpp b/lib/jkqtplotter/jkqtpgraphsbase.cpp index 6e4a332443..dcddf362ab 100644 --- a/lib/jkqtplotter/jkqtpgraphsbase.cpp +++ b/lib/jkqtplotter/jkqtpgraphsbase.cpp @@ -131,13 +131,13 @@ bool JKQTPGraph::getDataMinMax(int column, double &minx, double &maxx, double &s JKQTPDatastore* datastore=parent->getDatastore(); int imin=0; - int imax=datastore->getColumn(column).getRows(); + int imax=static_cast(datastore->getColumn(column).getRows()); if (imin<0) imin=0; if (imax<0) imax=0; for (int i=imin; iget(column,i); + double xv=datastore->get(column,static_cast(i)); if (start || xv>maxx) maxx=xv; if (start || xv(this); + QString xerrstr; + // retrieve x-error data + if (errgx && datastore) { + if (errgx->getXErrorColumn()>=0) { + if (errgx->getXErrorColumnLower()>=0) { + xerrstr=QString("\\:+%1\\:-%2") + .arg(QString::fromStdString(jkqtp_floattolatexstr(datastore->get(errgx->getXErrorColumn(),static_cast(index)), 3))) + .arg(QString::fromStdString(jkqtp_floattolatexstr(datastore->get(errgx->getXErrorColumnLower(),static_cast(index)), 3))); + } else { + xerrstr=QString("{\\:}{\\pm}%1") + .arg(QString::fromStdString(jkqtp_floattolatexstr(datastore->get(errgx->getXErrorColumn(),static_cast(index)), 3))); + } + } + } + + // retrieve y-error data + const JKQTPYGraphErrorData* errgy=dynamic_cast(this); + QString yerrstr; + if (errgy && datastore) { + if (errgy->getYErrorColumn()>=0) { + if (errgy->getYErrorColumnLower()>=0) { + yerrstr=QString("\\:+%1\\:-%2") + .arg(QString::fromStdString(jkqtp_floattolatexstr(datastore->get(errgy->getYErrorColumn(),static_cast(index)), 3))) + .arg(QString::fromStdString(jkqtp_floattolatexstr(datastore->get(errgy->getYErrorColumnLower(),static_cast(index)), 3))); + } else { + yerrstr=QString("{\\:}{\\pm}%1") + .arg(QString::fromStdString(jkqtp_floattolatexstr(datastore->get(errgy->getYErrorColumn(),static_cast(index)), 3))); + } + } + } + return QString("\\ensuremath{\\left[{\\:}%1%3{\\;},{\\;}%2%4{\\:}\\right]}").arg(QString::fromStdString(jkqtp_floattolatexstr(x, 3))).arg(QString::fromStdString(jkqtp_floattolatexstr(y, 3))).arg(xerrstr).arg(yerrstr); + +} + +double JKQTPPlotElement::hitTest(const QPointF & posSystem, QPointF* closestSpotSystem, QString* label, HitTestMode mode) const +{ + if (parent==nullptr) return nan(""); + + int closest=-1; + double closedist=nan(""); + double closedistsec=nan(""); + QPointF closestPos; + QPointF posF=transform(posSystem); + for (int i=0; i=0) { + if (closestSpotSystem) *closestSpotSystem=closestPos; + if (label) *label=m_hitTestData[closest].label; + return closedist; + } else { + return nan(""); + } +} + double JKQTPPlotElement::transformX(double x) const { return parent->getXAxis()->x2p(x); } @@ -190,7 +263,7 @@ void JKQTPGraph::drawErrorsAfter(JKQTPEnhancedPainter &) } -QVector JKQTPPlotElement::transform(const QVector &x) { +QVector JKQTPPlotElement::transform(const QVector &x) const { QVector res; for (int i=0; i JKQTPPlotElement::transform(const QVector &x) { return res; } -QPainterPath JKQTPPlotElement::transformToLinePath(const QVector &x) { +QPainterPath JKQTPPlotElement::transformToLinePath(const QVector &x) const { QPainterPath res; if (x.size()>0) { res.moveTo(transform(x[0])); @@ -241,14 +314,8 @@ bool JKQTPXYGraph::getXMinMax(double& minx, double& maxx, double& smallestGreate JKQTPDatastore* datastore=parent->getDatastore(); int imin=0; - int imax=qMin(datastore->getColumn(static_cast(xColumn)).getRows(), datastore->getColumn(static_cast(yColumn)).getRows()); - if (imaxget(static_cast(xColumn),static_cast(i)); @@ -273,14 +340,9 @@ bool JKQTPXYGraph::getYMinMax(double& miny, double& maxy, double& smallestGreate JKQTPDatastore* datastore=parent->getDatastore(); int imin=0; - int imax=qMin(datastore->getColumn(static_cast(xColumn)).getRows(), datastore->getColumn(static_cast(yColumn)).getRows()); - if (imaxget(static_cast(yColumn),static_cast(i)); @@ -300,8 +362,92 @@ bool JKQTPXYGraph::usesColumn(int column) const return (column==xColumn)||(column==yColumn); } +void JKQTPXYGraph::setXColumn(int __value) +{ + this->xColumn = __value; +} + +int JKQTPXYGraph::getXColumn() const +{ + return this->xColumn; +} + +void JKQTPXYGraph::setXColumn(size_t __value) { + this->xColumn = static_cast(__value); +} + +void JKQTPXYGraph::setYColumn(int __value) +{ + this->yColumn = __value; +} + +int JKQTPXYGraph::getYColumn() const +{ + return this->yColumn; +} + +void JKQTPXYGraph::setYColumn(size_t __value) { this->yColumn = static_cast(__value); } + +void JKQTPXYGraph::setDataSortOrder(JKQTPXYGraph::DataSortOrder __value) +{ + this->sortData = __value; +} + +JKQTPXYGraph::DataSortOrder JKQTPXYGraph::getDataSortOrder() const +{ + return this->sortData; +} + void JKQTPXYGraph::setDataSortOrder(int __value) { - sortData=(DataSortOrder)__value; + sortData=static_cast(__value); +} + + +double JKQTPXYGraph::hitTest(const QPointF &posSystem, QPointF *closestSpotSystem, QString *label, HitTestMode mode) const +{ + if (parent==nullptr) return nan(""); + + // check base-class implementation and use it, if it returns a vaid value + const double baseclassResult=JKQTPPlotElement::hitTest(posSystem, closestSpotSystem, label, mode); + if (JKQTPIsOKFloat(baseclassResult)) return baseclassResult; + + JKQTPDatastore* datastore=parent->getDatastore(); + int imin=0; + int imax=0; + if (!getIndexRange(imin, imax)) return nan(""); + + + int closest=-1; + double closedist=nan(""); + double closedistsec=nan(""); + QPointF closestPos; + QPointF posF=transform(posSystem); + for (int i=imin; iget(static_cast(xColumn),static_cast(i)), datastore->get(static_cast(yColumn),static_cast(i))); + const QPointF xpix = transform(x); + if (JKQTPIsOKFloat(xpix.x())&&JKQTPIsOKFloat(xpix.y())) { + double d=0, dsecondary=0; + switch (mode) { + case HitTestXY: d=sqrt(jkqtp_sqr(xpix.x()-posF.x())+jkqtp_sqr(xpix.y()-posF.y())); dsecondary=0; break; + case HitTestXOnly: d=fabs(xpix.x()-posF.x()); dsecondary=fabs(xpix.y()-posF.y()); break; + case HitTestYOnly: d=fabs(xpix.y()-posF.y()); dsecondary=fabs(xpix.x()-posF.x()); break; + } + if (closest<0 || d(__value); if (__value>0) sortData=Sorted; } @@ -376,21 +522,15 @@ void JKQTPSingleColumnGraph::intSortData() JKQTPDatastore* datastore=parent->getDatastore(); int imin=0; - int imax=datastore->getColumn(dataColumn).getRows(); - if (imax datas; if (sortData==JKQTPSingleColumnGraph::Sorted) { for (int i=0; iget(dataColumn,i); + double xv=datastore->get(dataColumn,static_cast(i)); sortedIndices<getDatastore(); + imin=0; + imax=static_cast(datastore->getColumn(static_cast(dataColumn)).getRows()); + if (imax=0 && imax>=0; +} + @@ -425,14 +583,8 @@ void JKQTPXYGraph::intSortData() JKQTPDatastore* datastore=parent->getDatastore(); int imin=0; - int imax=qMin(datastore->getColumn(static_cast(xColumn)).getRows(), datastore->getColumn(static_cast(yColumn)).getRows()); - if (imax datas; @@ -459,6 +611,24 @@ void JKQTPXYGraph::intSortData() } } +bool JKQTPXYGraph::getIndexRange(int& imin, int& imax) const +{ + if (parent==nullptr) return false; + + JKQTPDatastore* datastore=parent->getDatastore(); + imin=0; + imax=static_cast(qMin(datastore->getColumn(static_cast(xColumn)).getRows(), datastore->getColumn(static_cast(yColumn)).getRows())); + if (imax=0 && imax>=0; +} + JKQTPPlotObject::JKQTPPlotObject(JKQTBasePlotter *parent): diff --git a/lib/jkqtplotter/jkqtpgraphsbase.h b/lib/jkqtplotter/jkqtpgraphsbase.h index fef9d99780..aed0bdd3ea 100644 --- a/lib/jkqtplotter/jkqtpgraphsbase.h +++ b/lib/jkqtplotter/jkqtpgraphsbase.h @@ -33,6 +33,7 @@ // forward declarations class JKQTPlotter; class JKQTPDatastore; +class JKQTPGraphErrorStyleMixin; /** \brief this virtual base class of every element, which is part of a JKQTPlotter plot and may appear in its key * (basically any type of graph, except overlay elements!) @@ -61,6 +62,7 @@ class JKQTPDatastore; class JKQTP_LIB_EXPORT JKQTPPlotElement: public QObject { Q_OBJECT public: + /** \brief class constructor */ explicit JKQTPPlotElement(JKQTBasePlotter* parent=nullptr); /** \brief class constructor */ @@ -127,6 +129,73 @@ class JKQTP_LIB_EXPORT JKQTPPlotElement: public QObject { */ virtual void drawOutside(JKQTPEnhancedPainter& painter, QRect leftSpace, QRect rightSpace, QRect topSpace, QRect bottomSpace); + /** \brief modes of operation for the function hitTest() */ + enum HitTestMode { + HitTestXY, /*!< \brief find closest point in x- and y-direction simulatneously (i.e. measure direct distance) */ + HitTestXOnly, /*!< \brief find closest point in x-direction only */ + HitTestYOnly, /*!< \brief find closest point in y-direction only */ + }; + + /*! \brief returns the closest distance of the plot element to the (screen pixel) position \a pos, or \c NAN + + This function is used to implement hit tests, i.e. to test whether a graph is close to a given position \a posSystem. + The function will then return the distance of the closes graph-point and a label for this point. An example of what + can be done with this function is the tooltip tool that JKQTPlotter provides via its context-menu/toolbar. This tool + uses just the information of the closest point and its label to display a tooltip for that datapoint: + + \see jkqtpmdaToolTipForClosestDataPoint for details. + + + \param posSystem position to test in system coordinates + \param[out] closestSpotSystem optional output of the closest point found on the plot element in system coordinates + \param[out] label optional output of a label for the closest point (that might e.g. be used in a tooltip) + \param mode search mode, i.e. use sqrt(dx*dx+dy*dy) as distance, or just the absoulte values along one of the + two coordinate axes. Note that the returned distance depends on this parameter! + \return NAN if not implemented, or if \a pos is very far from the plot element, or the closest distance (in screen pixels) + of \a pos from the plot element. Note that the returned distance depends on the choosen \a mode !!! + You can use JKQTPIsOKFloat() to check whether a valid distance was returned! + + + Since tha graph base class does not have any knowledge about how to perform a hit test on you specific graph, there is only a + very general implementation in this class, which does not actually search through the graph itself, but searches through + extra data that hs to be written during draw() and is stored in m_hitTestData. The implentation this base-class only searches this + list of points+metadata to implement a basic hit-test. If the list is empty, of no close-by points are found (default), then + hitTest() will simply return \a NAN. + + When writing a new graph, you can therefore implement hitTest() in one of these ways: + # You simply fill m_hitTestData with appropriate data and rely on the implementation in JKQTPPlotElement to do the work for you: + You then need to call clearHitTestData() at the start of your draw() function and whenever you draw a datapoint, you add + its location and metadata to the internal storage with addHitTestData(). + # You derive from a graph class that already has an implementation. JKQTPXYGraph is an example of this. That class searches + through all x-/y-coordinates in the internally known columns and even takes into account possible graph errors in the label, + when the graph is also derived from JKQTPXGraphErrorData or JKQTPYGraphErrorData. This implementation therefore covers + most graph types pre-packaged with JKQTPlotter. + # You implement the function from scratch. + . + + \see addHitTestData(), clearHitTestData(), m_hitTestData, HitTestLocation + + */ + virtual double hitTest(const QPointF & posSystem, QPointF* closestSpotSystem=nullptr, QString* label=nullptr, HitTestMode mode=HitTestXY) const; + + /** \brief Dataset for a single point on the graph, associated with its data-column index and a label that can be used by a basic implementation of hitTest() + * + * \see hitTest() + */ + struct HitTestLocation { + inline HitTestLocation(): pos(nan(""), nan("")), index(-1), label("") {} + inline HitTestLocation(double x_, double y_, const QString& label_): pos(x_,y_), index(-1), label(label_) {} + inline HitTestLocation(const QPointF& pos_, const QString& label_): pos(pos_), index(-1), label(label_) {} + inline HitTestLocation(double x_, double y_, int index_, const QString& label_): pos(x_,y_), index(index_), label(label_) {} + inline HitTestLocation(const QPointF& pos_, int index_, const QString& label_): pos(pos_), index(index_), label(label_) {} + /** \brief position of the hit-test point */ + QPointF pos; + /** \brief index of the hit-test point in the linked data-columns (or -1) */ + int index; + /** \brief label for that specific hit-test point */ + QString label; + }; + protected: @@ -145,36 +214,124 @@ class JKQTP_LIB_EXPORT JKQTPPlotElement: public QObject { /** \brief tool routine that transforms a QPointF according to the parent's transformation rules (plot coordinate --> pixels) */ - inline QPointF transform(const QPointF& x) { + inline QPointF transform(const QPointF& x) const { return QPointF(transformX(x.x()), transformY(x.y())); } /** \brief tool routine that back-transforms a QPointF according to the parent's transformation rules (pixels --> plot coordinate) */ - inline QPointF backTransform(const QPointF& x) { + inline QPointF backTransform(const QPointF& x) const { return QPointF(backtransformX(x.x()), backtransformY(x.y())); } /** \brief tool routine that transforms a QPointF according to the parent's transformation rules (plot coordinate --> pixels) */ - inline QPointF transform(double x, double y) { + inline QPointF transform(double x, double y) const { return transform(QPointF(x,y)); } /** \brief tool routine that back-transforms a QPointF according to the parent's transformation rules (pixels --> plot coordinate) */ - inline QPointF backTransform(double x, double y) { + inline QPointF backTransform(double x, double y) const { return backTransform(QPointF(x,y)); } /** \brief tool routine that transforms a QVector according to the parent's transformation rules (plot coordinate --> pixels) */ - QVector transform(const QVector& x); + QVector transform(const QVector& x) const; /** \brief tool routine that transforms a QVector according to the parent's transformation rules * and returns a (non-closed) path consisting of lines (plot coordinate --> pixels) */ - QPainterPath transformToLinePath(const QVector& x); + QPainterPath transformToLinePath(const QVector& x) const; /** \brief tool routine that transforms a QVector according to the parent's transformation rules * and returns a polygon (plot coordinate --> pixels) */ - inline QPolygonF transformToPolygon(const QVector& x) { + inline QPolygonF transformToPolygon(const QVector& x) const { return QPolygonF(transform(x)); } + + /** \brief clear the internal datastore for hitTest() + * + * \note This function has to be called at the start of draw() + * \see hitTest(), addHitTestData(), m_hitTestData, HitTestLocation + */ + inline void clearHitTestData() { m_hitTestData.clear(); } + /** \brief reserve list entries for up to \a points graph points in the internal datastore for hitTest() + * + * \note Call this after clearHitTestData() for improved speed of subsequent addHitTestData() calls! + * \see hitTest(), addHitTestData(), m_hitTestData, HitTestLocation + */ + inline void reserveHitTestData(int points) { m_hitTestData.reserve(qMax(10, abs(points))); } + /** \brief clear the internal datastore for hitTest() + * + * \note This function has to be called at the start of draw() + * \see hitTest(), clearHitTestData(), m_hitTestData, HitTestLocation, reserveHitTestData() + */ + inline void addHitTestData(const HitTestLocation& loc) { m_hitTestData< m_hitTestData; + + }; /** \brief this virtual base class of the (data-column based) graphs, @@ -252,7 +417,7 @@ class JKQTP_LIB_EXPORT JKQTPGraph: public JKQTPPlotElement { protected: - friend class JKQTPGraphErrors; + friend class JKQTPGraphErrorStyleMixin; }; @@ -339,51 +504,45 @@ class JKQTP_LIB_EXPORT JKQTPXYGraph: public JKQTPGraph { /*! \copydoc xColumn \see see xColumn for details */ - inline virtual void setXColumn(int __value) - { - this->xColumn = __value; - } + void setXColumn(int __value); /*! \copydoc xColumn \see see xColumn for details */ - inline virtual int getXColumn() const - { - return this->xColumn; - } + int getXColumn() const; /*! \brief sets the property xColumn ( \copybrief xColumn ) to the specified \a __value, where __value is static_cast'ed from size_t to int. \details Description of the parameter xColumn is:
    \copydoc xColumn
    \see xColumn for more information */ - inline virtual void setXColumn (size_t __value) { this->xColumn = static_cast(__value); } + void setXColumn (size_t __value); /*! \copydoc yColumn \see see yColumn for details */ - inline virtual void setYColumn(int __value) - { - this->yColumn = __value; - } + void setYColumn(int __value); /*! \copydoc yColumn \see see yColumn for details */ - inline virtual int getYColumn() const - { - return this->yColumn; - } + int getYColumn() const; /*! \brief sets the property yColumn ( \copybrief yColumn ) to the specified \a __value, where __value is static_cast'ed from size_t to int. \details Description of the parameter yColumn is:
    \copydoc yColumn
    \see yColumn for more information */ - inline virtual void setYColumn (size_t __value) { this->yColumn = static_cast(__value); } + void setYColumn (size_t __value); /*! \copydoc sortData \see see sortData for details */ - inline virtual void setDataSortOrder(DataSortOrder __value) - { - this->sortData = __value; - } + void setDataSortOrder(DataSortOrder __value); /*! \copydoc sortData \see see sortData for details */ - inline virtual DataSortOrder getDataSortOrder() const - { - return this->sortData; - } + DataSortOrder getDataSortOrder() const; /*! \brief sets the property sortData ( \copybrief sortData ) to the specified \a __value. \details Description of the parameter sortData is:
    \copydoc sortData
    \see sortData for more information */ void setDataSortOrder(int __value); + + /** \brief Implmentation of JKQTPPlotElement::hitTest(), which searches through all graph points defined by xColumn and yColumn + * and returns a general x/y-label, also taking into account possibly known errors to the graphs (if it is derived + * from JKQTPXGraphErrorData and/or JKQTPYGraphErrorData + * + * \note This function first checks whether JKQTPPlotElement::hitTest() returns any result, so you can use the basic implementation + * in JKQTPPlotElement to override the behaviour here, by simply calling addHitTestData() during your draw() implementation + * + * \see See JKQTPPlotElement::hitTest() for details on the function definition! + */ + virtual double hitTest(const QPointF &posSystem, QPointF* closestSpotSystem=nullptr, QString* label=nullptr, HitTestMode mode=HitTestXY) const override; + protected: /** \brief the column that contains the x-component of the datapoints */ @@ -407,6 +566,14 @@ class JKQTP_LIB_EXPORT JKQTPXYGraph: public JKQTPGraph { if (sortData==Unsorted) return i; return sortedIndices.value(i,i); } + + /** \brief determines the range of row indexes available in the data columns of this graph + * + * \param[out] imin first usable row-index + * \param[out] imax last usable row-index + * \return \c true on success and \c false if the information is not available + */ + virtual bool getIndexRange(int &imin, int &imax) const; }; @@ -495,6 +662,13 @@ class JKQTP_LIB_EXPORT JKQTPSingleColumnGraph: public JKQTPGraph { return sortedIndices.value(i,i); } + /** \brief determines the range of row indexes available in the data columns of this graph + * + * \param[out] imin first usable row-index + * \param[out] imax last usable row-index + * \return \c true on success and \c false if the information is not available + */ + virtual bool getIndexRange(int &imin, int &imax) const; }; diff --git a/lib/jkqtplotter/jkqtpgraphsbaseerrors.cpp b/lib/jkqtplotter/jkqtpgraphsbaseerrors.cpp index e059c14eb6..4049aecb48 100644 --- a/lib/jkqtplotter/jkqtpgraphsbaseerrors.cpp +++ b/lib/jkqtplotter/jkqtpgraphsbaseerrors.cpp @@ -38,94 +38,233 @@ -JKQTPGraphErrors::JKQTPGraphErrors(QColor graphColor, JKQTBasePlotter *basePlotter) { - errorColor=graphColor.darker(); - errorStyle=Qt::SolidLine; - errorWidth=2; - errorFillColor=graphColor.lighter(); - errorColor.setAlphaF(0.5); - errorFillStyle=Qt::SolidPattern; - errorbarSize=7; +JKQTPGraphErrorStyleMixin::JKQTPGraphErrorStyleMixin() { + m_errorLinePen=QPen(QColor("red"), Qt::SolidLine); + m_errorLinePen.setJoinStyle(Qt::RoundJoin); + m_errorLinePen.setCapStyle(Qt::RoundCap); + m_errorLineWidth=1; + m_errorBarCapSize=7; +} - if (basePlotter) { - errorWidth=basePlotter->getCurrentPlotterStyle().defaultGraphSymbolLineWidth; - errorbarSize=basePlotter->getCurrentPlotterStyle().defaultGraphSymbolSize*0.75; +void JKQTPGraphErrorStyleMixin::initErrorStyle(JKQTBasePlotter *parent, int &parentPlotStyle) +{ + if (parent) { // get style settings from parent object + if (parentPlotStyle<0) parentPlotStyle=parent->getNextStyle(); + m_errorFillColor=parent->getPlotStyle(parentPlotStyle).errorFillColor(); + m_errorFillBrush.setColor(m_errorFillColor); + m_errorFillBrush.setStyle(parent->getPlotStyle(parentPlotStyle).errorFillStyle()); + m_errorLinePen.setColor(parent->getPlotStyle(parentPlotStyle).errorColor()); + m_errorLinePen.setStyle(parent->getPlotStyle(parentPlotStyle).errorStyle()); + m_errorLineWidth=parent->getPlotStyle(parentPlotStyle).errorWidthF(); + } + +} + +void JKQTPGraphErrorStyleMixin::setErrorStyleFromPen(const JKQTBasePlotter::JKQTPPen &pen) +{ + m_errorLineWidth=pen.errorWidthF(); + setErrorLineColor(pen.errorColor()); + setErrorFillColor(pen.errorFillColor()); + setErrorFillStyle(pen.errorFillStyle()); + setErrorLineStyle(pen.errorStyle()); + m_errorBarCapSize=pen.symbolSize()*0.75; +} + + + +void JKQTPGraphErrorStyleMixin::setErrorColorFromGraphColor(QColor graphColor) +{ + setErrorLineColor(graphColor.darker()); + setErrorFillColor(graphColor.lighter()); + //errorColor.setAlphaF(0.5); +} + +QPen JKQTPGraphErrorStyleMixin::getErrorLinePen(JKQTPEnhancedPainter &painter, JKQTBasePlotter *parent) const +{ + QPen p=m_errorLinePen; + p.setWidthF(qMax(JKQTPlotterDrawinTools::ABS_MIN_LINEWIDTH,parent->pt2px(painter, parent->getLineWidthMultiplier()*m_errorLineWidth))); + return p; +} + +QPen JKQTPGraphErrorStyleMixin::getErrorLinePenForRects(JKQTPEnhancedPainter &painter, JKQTBasePlotter *parent) const +{ + QPen p=getErrorLinePen(painter, parent); + p.setJoinStyle(Qt::MiterJoin); + return p; +} + +QBrush JKQTPGraphErrorStyleMixin::getErrorFillBrush(JKQTPEnhancedPainter &/*painter*/, JKQTBasePlotter */*parent*/) const +{ + return m_errorFillBrush; +} + +void JKQTPGraphErrorStyleMixin::setErrorLineColor(const QColor &__value) +{ + m_errorLinePen.setColor(__value); +} + +QColor JKQTPGraphErrorStyleMixin::getErrorLineColor() const +{ + return this->m_errorLinePen.color(); +} + +void JKQTPGraphErrorStyleMixin::setErrorLineStyle(Qt::PenStyle __value) +{ + this->m_errorLinePen.setStyle( __value); +} + +Qt::PenStyle JKQTPGraphErrorStyleMixin::getErrorLineStyle() const +{ + return this->m_errorLinePen.style(); +} + +void JKQTPGraphErrorStyleMixin::setErrorLineWidth(double __value) +{ + this->m_errorLineWidth = __value; +} + +double JKQTPGraphErrorStyleMixin::getErrorLineWidth() const +{ + return this->m_errorLineWidth; +} + + +void JKQTPGraphErrorStyleMixin::setErrorLineDashOffset(qreal offset) +{ + m_errorLinePen.setDashOffset(offset); +} + +qreal JKQTPGraphErrorStyleMixin::getErrorLineDashOffset() const +{ + return m_errorLinePen.dashOffset(); +} + +void JKQTPGraphErrorStyleMixin::setErrorLineDashPattern(const QVector &pattern) +{ + m_errorLinePen.setDashPattern(pattern); + m_errorLinePen.setStyle(Qt::CustomDashLine); +} + +QVector JKQTPGraphErrorStyleMixin::getErrorLineDashPattern() const +{ + return m_errorLinePen.dashPattern(); +} + +void JKQTPGraphErrorStyleMixin::setErrorLineJoinStyle(Qt::PenJoinStyle style) +{ + m_errorLinePen.setJoinStyle(style); +} + +Qt::PenJoinStyle JKQTPGraphErrorStyleMixin::getErrorLineJoinStyle() const +{ + return m_errorLinePen.joinStyle(); +} + +void JKQTPGraphErrorStyleMixin::setErrorLineCapStyle(Qt::PenCapStyle style) +{ + m_errorLinePen.setCapStyle(style); +} + +Qt::PenCapStyle JKQTPGraphErrorStyleMixin::getErrorLineCapStyle() const +{ + return m_errorLinePen.capStyle(); +} + +void JKQTPGraphErrorStyleMixin::setErrorLineBrush(const QBrush &style) +{ + m_errorLinePen.setBrush(style); +} + +QBrush JKQTPGraphErrorStyleMixin::getErrorLineBrush() const +{ + return m_errorLinePen.brush(); +} + +void JKQTPGraphErrorStyleMixin::setErrorFillColor(const QColor &__value) +{ + m_errorFillColor=__value; + m_errorFillBrush.setColor(__value); +} + +QColor JKQTPGraphErrorStyleMixin::getErrorFillColor() const +{ + return this->m_errorFillBrush.color(); +} + +void JKQTPGraphErrorStyleMixin::setErrorFillStyle(Qt::BrushStyle __value) +{ + if (m_errorFillBrush.style()==Qt::LinearGradientPattern || m_errorFillBrush.style()==Qt::RadialGradientPattern || m_errorFillBrush.style()==Qt::ConicalGradientPattern || m_errorFillBrush.style()==Qt::TexturePattern) { + m_errorFillBrush=QBrush(m_errorFillColor, __value); + } else { + m_errorFillBrush.setStyle(__value); } } -void JKQTPGraphErrors::setErrorStyleFromPen(const JKQTBasePlotter::JKQTPPen &pen) +Qt::BrushStyle JKQTPGraphErrorStyleMixin::getErrorFillStyle() const { - errorWidth=pen.errorWidthF(); - errorColor=pen.errorColor(); - errorFillColor=pen.errorFillColor(); - errorFillStyle=pen.errorFillStyle(); - errorStyle=pen.errorStyle(); - errorbarSize=pen.symbolSize()*0.75; + return this->m_errorFillBrush.style(); } -void JKQTPGraphErrors::setErrorColor(const QColor &__value) +void JKQTPGraphErrorStyleMixin::setErrorBarCapSize(double __value) { - this->errorColor = __value; + this->m_errorBarCapSize = __value; } -QColor JKQTPGraphErrors::getErrorColor() const +double JKQTPGraphErrorStyleMixin::getErrorBarCapSize() const { - return this->errorColor; -} - -void JKQTPGraphErrors::setErrorStyle(const Qt::PenStyle &__value) -{ - this->errorStyle = __value; -} - -Qt::PenStyle JKQTPGraphErrors::getErrorStyle() const -{ - return this->errorStyle; -} - -void JKQTPGraphErrors::setErrorWidth(double __value) -{ - this->errorWidth = __value; -} - -double JKQTPGraphErrors::getErrorWidth() const -{ - return this->errorWidth; -} - -void JKQTPGraphErrors::setErrorFillColor(const QColor &__value) -{ - this->errorFillColor = __value; -} - -QColor JKQTPGraphErrors::getErrorFillColor() const -{ - return this->errorFillColor; -} - -void JKQTPGraphErrors::setErrorFillStyle(const Qt::BrushStyle &__value) -{ - this->errorFillStyle = __value; -} - -Qt::BrushStyle JKQTPGraphErrors::getErrorFillStyle() const -{ - return this->errorFillStyle; -} - -void JKQTPGraphErrors::setErrorbarSize(double __value) -{ - this->errorbarSize = __value; -} - -double JKQTPGraphErrors::getErrorbarSize() const -{ - return this->errorbarSize; + return this->m_errorBarCapSize; } +void JKQTPGraphErrorStyleMixin::setErrorFillTexture(const QPixmap &__value) +{ + m_errorFillBrush.setStyle(Qt::TexturePattern); + m_errorFillBrush.setTexture(__value); +} -void JKQTPGraphErrors::intPlotXYErrorIndicators(JKQTPEnhancedPainter& painter, JKQTBasePlotter* parent, JKQTPGraph* parentGraph, int xColumn, int yColumn, int xErrorColumn, int yErrorColumn, JKQTPErrorPlotstyle xErrorStyle, JKQTPErrorPlotstyle yErrorStyle, int xErrorColumnLower, int yErrorColumnLower, bool xErrorSymmetric, bool yErrorSymmetric, double xrelshift, double yrelshift, const QVector* dataorder) { +void JKQTPGraphErrorStyleMixin::setErrorFillTexture(const QImage &__value) +{ + m_errorFillBrush.setStyle(Qt::TexturePattern); + m_errorFillBrush.setTextureImage(__value); +} + +QPixmap JKQTPGraphErrorStyleMixin::getErrorFillTexture() const +{ + return m_errorFillBrush.texture(); +} + +QImage JKQTPGraphErrorStyleMixin::getErrorFillTextureImage() const +{ + return m_errorFillBrush.textureImage(); +} + +void JKQTPGraphErrorStyleMixin::setErrorFillGradient(const QGradient &__value) +{ + m_errorFillBrush=QBrush(__value); +} + +const QGradient *JKQTPGraphErrorStyleMixin::getErrorFillGradient() const +{ + return m_errorFillBrush.gradient(); +} + +void JKQTPGraphErrorStyleMixin::setErrorFillBrush(const QBrush &b) +{ + m_errorFillBrush=b; + m_errorFillColor=b.color(); +} + +void JKQTPGraphErrorStyleMixin::setErrorFillTransform(const QMatrix &b) +{ + m_errorFillBrush.setMatrix(b); +} + +void JKQTPGraphErrorStyleMixin::setErrorFillTransform(const QTransform &b) +{ + m_errorFillBrush.setTransform(b); +} + +void JKQTPGraphErrorStyleMixin::intPlotXYErrorIndicators(JKQTPEnhancedPainter& painter, JKQTBasePlotter* parent, JKQTPGraph* parentGraph, int xColumn, int yColumn, int xErrorColumn, int yErrorColumn, JKQTPErrorPlotstyle xErrorStyle, JKQTPErrorPlotstyle yErrorStyle, int xErrorColumnLower, int yErrorColumnLower, bool xErrorSymmetric, bool yErrorSymmetric, double xrelshift, double yrelshift, const QVector* dataorder) { //std::cout<<"JKQTPGraphErrors::intPlotXYErrorIndicators(p, "<getDatastore(); @@ -137,29 +276,21 @@ void JKQTPGraphErrors::intPlotXYErrorIndicators(JKQTPEnhancedPainter& painter, J if (!visX&&!visY) return; //std::cout<<" JKQTPGraphErrors::intPlotXYErrorIndicators(p, "<pt2px(painter, errorWidth*parent->getLineWidthMultiplier()))); - p.setStyle(errorStyle); - p.setJoinStyle(Qt::RoundJoin); - p.setCapStyle(Qt::RoundCap); + QBrush b=getErrorFillBrush(painter, parent); + QPen p=getErrorLinePen(painter, parent); + QPen pr=getErrorLinePenForRects(painter, parent); painter.setPen(p); - unsigned int imaxx=0, imaxy=0; + size_t imaxx=0, imaxy=0; if (xColumn>=0) imaxx=datastore->getColumn(static_cast(xColumn)).getRows(); if (yColumn>=0) imaxy=datastore->getColumn(static_cast(yColumn)).getRows(); - int imax=qMin(imaxx, imaxy); - int imin=0; + size_t imax=qMin(imaxx, imaxy); + size_t imin=0; if (imaxpt2px(painter, errorbarSize); + double ebs_px=parent->pt2px(painter, m_errorBarCapSize); QPolygonF polyX, polyY; QList polyXTopPoints, polyXBottomPoints, polyYTopPoints, polyYBottomPoints; QList errFC, errC; bool defaultErrorColor=true; - /* - * double delta=1; - double deltap=0; - double deltam=0; - for (int i=imin; iget(static_cast(xColumn),static_cast(i)); - double yv=datastore->get(static_cast(yColumn),static_cast(i)); - if (imin==imax) { // only one x-value - deltam=0.5; - deltap=0.5; - } else if (i==imax-1) { // the right-most x-value - deltap=deltam=fabs(xv-datastore->get(xColumn,i-1))/2.0; - } else if (i==imin) { // the left-most x-value - deltam=deltap=fabs(datastore->get(xColumn,i+1)-xv)/2.0; - } else { - deltam=fabs(xv-datastore->get(xColumn,i-1))/2.0; - deltap=fabs(datastore->get(xColumn,i+1)-xv)/2.0; - } - delta=deltap+deltam; - **/ - for (int iii=imin; iiivalue(iii, iii); - double xv=datastore->get(static_cast(xColumn),static_cast(i)); - double yv=datastore->get(static_cast(yColumn),static_cast(i)); + for (size_t iii=imin; iii(iii); + if (dataorder) i=dataorder->value(static_cast(iii), static_cast(iii)); + const double xv=datastore->get(static_cast(xColumn),static_cast(i)); + const double yv=datastore->get(static_cast(yColumn),static_cast(i)); double deltax=1; double deltapx=0; @@ -208,13 +319,13 @@ void JKQTPGraphErrors::intPlotXYErrorIndicators(JKQTPEnhancedPainter& painter, J if (imin==imax) { // only one x-value deltamx=0.5; deltapx=0.5; - } else if (i==imax-1&& i-1>=0) { // the right-most x-value - deltapx=deltamx=fabs(xv-datastore->get(xColumn,i-1))/2.0; - } else if (i==imin && i+1get(xColumn,i+1)-xv)/2.0; + } else if (static_cast(i)==static_cast(imax)-1&& static_cast(i)-1>=0) { // the right-most x-value + deltapx=deltamx=fabs(xv-datastore->get(xColumn,static_cast(i-1)))/2.0; + } else if (i==static_cast(imin) && i+1(imax)) { // the left-most x-value + deltamx=deltapx=fabs(datastore->get(xColumn,static_cast(i+1))-xv)/2.0; } else { - if (i-1>=0) deltamx=fabs(xv-datastore->get(xColumn,i-1))/2.0; - if (i+1get(xColumn,i+1)-xv)/2.0; + if (static_cast(i)-1>=0) deltamx=fabs(xv-datastore->get(xColumn,static_cast(i-1)))/2.0; + if (i+1(imax)) deltapx=fabs(datastore->get(xColumn,static_cast(i+1))-xv)/2.0; } deltax=deltapx+deltamx; @@ -224,13 +335,13 @@ void JKQTPGraphErrors::intPlotXYErrorIndicators(JKQTPEnhancedPainter& painter, J if (imin==imax) { // only one y-value deltamy=0.5; deltapy=0.5; - } else if (i==imax-1&& i-1>=0) { // the right-most y-value - deltapy=deltamy=fabs(yv-datastore->get(yColumn,i-1))/2.0; - } else if (i==imin && i+1get(yColumn,i+1)-yv)/2.0; + } else if (i==static_cast(imax)-1&& static_cast(i)-1>=0) { // the right-most y-value + deltapy=deltamy=fabs(yv-datastore->get(yColumn,static_cast(i-1)))/2.0; + } else if (i==static_cast(imin) && i+1(imax)) { // the left-most y-value + deltamy=deltapy=fabs(datastore->get(yColumn,static_cast(i+1))-yv)/2.0; } else { - if (i-1>=0) deltamy=fabs(yv-datastore->get(yColumn,i-1))/2.0; - if (i+1get(yColumn,i+1)-yv)/2.0; + if (static_cast(i)-1>=0) deltamy=fabs(yv-datastore->get(yColumn,static_cast(i-1)))/2.0; + if (i+1(imax)) deltapy=fabs(datastore->get(yColumn,static_cast(i+1))-yv)/2.0; } deltay=deltapy+deltamy; @@ -239,34 +350,25 @@ void JKQTPGraphErrors::intPlotXYErrorIndicators(JKQTPEnhancedPainter& painter, J bool plotlowerbary=false; bool plotupperbary=false; - double xe=0; if (xErrorStyle!=JKQTPNoError && xErrorColumn>=0) { xe=datastore->get(xErrorColumn,i); plotupperbarx=true; } - double ye=0; if (yErrorStyle!=JKQTPNoError && yErrorColumn>=0) { ye=datastore->get(yErrorColumn,i); plotupperbary=true; } + double xe=0; if (xErrorStyle!=JKQTPNoError && xErrorColumn>=0) { xe=datastore->get(xErrorColumn,static_cast(i)); plotupperbarx=true; } + double ye=0; if (yErrorStyle!=JKQTPNoError && yErrorColumn>=0) { ye=datastore->get(yErrorColumn,static_cast(i)); plotupperbary=true; } double xl=0; if (xErrorSymmetric) { xl=xe; plotlowerbarx=plotupperbarx||(xl>0); } - else if (xErrorStyle!=JKQTPNoError && xErrorColumnLower>=0) { xl=datastore->get(xErrorColumnLower,i); plotlowerbarx=true; } + else if (xErrorStyle!=JKQTPNoError && xErrorColumnLower>=0) { xl=datastore->get(xErrorColumnLower,static_cast(i)); plotlowerbarx=true; } double yl=0; if (yErrorSymmetric) { yl=ye; plotlowerbary=plotupperbary||(yl>0); } - else if (yErrorStyle!=JKQTPNoError && yErrorColumnLower>=0) { yl=datastore->get(yErrorColumnLower,i); plotlowerbary=true; } + else if (yErrorStyle!=JKQTPNoError && yErrorColumnLower>=0) { yl=datastore->get(yErrorColumnLower,static_cast(i)); plotlowerbary=true; } if (JKQTPIsOKFloat(xv) && JKQTPIsOKFloat(yv) && JKQTPIsOKFloat(xe) && JKQTPIsOKFloat(ye) && JKQTPIsOKFloat(xl) && JKQTPIsOKFloat(yl)) { double x=parentGraph->transformX(xv+xrelshift*deltax); bool xok=JKQTPIsOKFloat(x); double y=parentGraph->transformY(yv+yrelshift*deltay); bool yok=JKQTPIsOKFloat(y); - QColor terrCol=errorColor; - QColor terrFillCol=errorFillColor; + QColor terrCol=getErrorLineColor(); + QColor terrFillCol=getErrorFillColor(); defaultErrorColor = defaultErrorColor && !this->intPlotXYErrorIndicatorsGetColor(painter, parent, parentGraph, xColumn, yColumn, xErrorColumn, yErrorColumn, xErrorStyle, yErrorStyle, i, terrCol, terrFillCol); // x-errorpolygons if (/*pastFirst &&*/ (xErrorStyle==JKQTPErrorPolygons || xErrorStyle==JKQTPErrorBarsPolygons || xErrorStyle==JKQTPErrorSimpleBarsPolygons)) { - //double xl1m=xmold; - //double xl1p=xpold; - //double yl1=yold; double xl2m=parentGraph->transformX(xv+xrelshift*deltax-xl); double xl2p=parentGraph->transformX(xv+xrelshift*deltax+xe); double yl2=y; - /*painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); - painter.setBrush(b); - painter.setPen(QPen(Qt::NoPen)); - QPolygonF poly; - poly << QPointF(xl1p, yl1) << QPointF(xl1m, yl1) << QPointF(xl2m, yl2) << QPointF(xl2p, yl2); - painter.drawConvexPolygon(poly); - */ + polyXTopPoints<transformY(yv+yrelshift*deltay-yl); double yl2p=parentGraph->transformY(yv+yrelshift*deltay+ye); double xl2=x; - /*painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); - painter.setBrush(b); - painter.setPen(QPen(Qt::NoPen)); - QPolygonF poly; - poly << QPointF(xl1, yl1m) << QPointF(xl2, yl2m) << QPointF(xl2, yl2p) << QPointF(xl1, yl1p); - painter.drawConvexPolygon(poly); - */ + polyYTopPoints<=xmin && xv<=xmax && yv>=ymin && yv<=ymax) { - //x-errorbars + //x-errorbars if ((xErrorColumn>=0 || xErrorColumnLower>=0) && (xErrorStyle==JKQTPErrorBars || xErrorStyle==JKQTPErrorBarsLines|| xErrorStyle==JKQTPErrorBarsPolygons || xErrorStyle==JKQTPErrorSimpleBars || xErrorStyle==JKQTPErrorSimpleBarsLines|| xErrorStyle==JKQTPErrorSimpleBarsPolygons)) { double x0=parentGraph->transformX(xv+xrelshift*deltax-xl); bool x0ok=JKQTPIsOKFloat(x0); double x1=parentGraph->transformX(xv+xrelshift*deltax+xe); bool x1ok=JKQTPIsOKFloat(x1); painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); QPen pp=p; - pp.setColor(terrCol); + if (!defaultErrorColor) pp.setColor(terrCol); painter.setPen(pp); if (x0ok&&x1ok&&xok&&yok) { painter.drawLine(QLineF(x0, y, x1, y)); @@ -335,7 +428,7 @@ void JKQTPGraphErrors::intPlotXYErrorIndicators(JKQTPEnhancedPainter& painter, J double y1=parentGraph->transformY(yv+yrelshift*deltay+ye); bool y1ok=JKQTPIsOKFloat(y1); painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); QPen pp=p; - pp.setColor(terrCol); + if (!defaultErrorColor) pp.setColor(terrCol); painter.setPen(pp); if (y0ok&&y1ok&&xok&&yok) { painter.drawLine(QLineF(x, y0, x, y1)); @@ -370,10 +463,10 @@ void JKQTPGraphErrors::intPlotXYErrorIndicators(JKQTPEnhancedPainter& painter, J double x1=parentGraph->transformX(xv+xrelshift*deltax+xe); bool x1ok=JKQTPIsOKFloat(x1); painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); QPen pp=p; - pp.setColor(terrCol); + if (!defaultErrorColor) pp.setColor(terrCol); painter.setPen(pp); QBrush bb=b; - bb.setColor(terrFillCol); + if (!defaultErrorColor) bb.setColor(terrFillCol); painter.setBrush(bb); QRectF errRect=QRectF(QPointF(x0,y0), QPointF(x1,y1)); @@ -395,7 +488,7 @@ void JKQTPGraphErrors::intPlotXYErrorIndicators(JKQTPEnhancedPainter& painter, J double yl2=y; painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); QPen pp=p; - pp.setColor(terrCol); + if (!defaultErrorColor) pp.setColor(terrCol); painter.setPen(pp); if (JKQTPIsOKFloat(xl1m)&&JKQTPIsOKFloat(yl1)&&JKQTPIsOKFloat(xl2m)&&JKQTPIsOKFloat(yl2)) { painter.drawLine(QLineF(xl1m, yl1, xl2m, yl2)); @@ -417,7 +510,7 @@ void JKQTPGraphErrors::intPlotXYErrorIndicators(JKQTPEnhancedPainter& painter, J double xl2=x; painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); QPen pp=p; - pp.setColor(terrCol); + if (!defaultErrorColor) pp.setColor(terrCol); painter.setPen(pp); if (JKQTPIsOKFloat(xl1)&&JKQTPIsOKFloat(yl1m)&&JKQTPIsOKFloat(xl2)&&JKQTPIsOKFloat(yl2m)) { painter.drawLine(QLineF(xl1, yl1m, xl2, yl2m)); @@ -473,39 +566,18 @@ void JKQTPGraphErrors::intPlotXYErrorIndicators(JKQTPEnhancedPainter& painter, J //std::cout<<"end\n"; } -bool JKQTPGraphErrors::intPlotXYErrorIndicatorsGetColor(JKQTPEnhancedPainter &/*painter*/, JKQTBasePlotter * /*parent*/, JKQTPGraph* /*parentGraph*/, int /*xColumn*/, int /*yColumn*/, int /*xErrorColumn*/, int /*yErrorColumn*/, JKQTPErrorPlotstyle /*xErrorStyle*/, JKQTPErrorPlotstyle /*yErrorStyle*/, int /*index*/, QColor &/*errorColor*/, QColor &/*errorFillColor*/) +bool JKQTPGraphErrorStyleMixin::intPlotXYErrorIndicatorsGetColor(JKQTPEnhancedPainter &/*painter*/, JKQTBasePlotter * /*parent*/, JKQTPGraph* /*parentGraph*/, int /*xColumn*/, int /*yColumn*/, int /*xErrorColumn*/, int /*yErrorColumn*/, JKQTPErrorPlotstyle /*xErrorStyle*/, JKQTPErrorPlotstyle /*yErrorStyle*/, int /*index*/, QColor &/*errorColor*/, QColor &/*errorFillColor*/) { return false; } -double JKQTPGraphErrors::getXErrorU(int /*i*/, JKQTPDatastore * /*ds*/) const -{ - return 0.0; -} - -double JKQTPGraphErrors::getXErrorL(int /*i*/, JKQTPDatastore * /*ds*/) const -{ - return 0.0; -} - -double JKQTPGraphErrors::getYErrorU(int /*i*/, JKQTPDatastore * /*ds*/) const -{ - return 0.0; -} - -double JKQTPGraphErrors::getYErrorL(int/* i*/, JKQTPDatastore * /*ds*/) const -{ - return 0.0; -} - -JKQTPXGraphErrors::JKQTPXGraphErrors(QColor graphColor, JKQTBasePlotter *basePlotter): - JKQTPGraphErrors(graphColor, basePlotter) +JKQTPXGraphErrorData::JKQTPXGraphErrorData() { xErrorSymmetric=true; xErrorColumn=-1; @@ -513,37 +585,65 @@ JKQTPXGraphErrors::JKQTPXGraphErrors(QColor graphColor, JKQTBasePlotter *basePlo xErrorColumnLower=-1; } -void JKQTPXGraphErrors::setXErrorColumn(int __value) { +void JKQTPXGraphErrorData::setXErrorSymmetric(bool __value) +{ + this->xErrorSymmetric = __value; +} + +bool JKQTPXGraphErrorData::getXErrorSymmetric() const +{ + return this->xErrorSymmetric; +} + +int JKQTPXGraphErrorData::getXErrorColumnLower() const { + return this->xErrorColumnLower; +} + +int JKQTPXGraphErrorData::getXErrorColumn() const { + return this->xErrorColumn; +} + +void JKQTPXGraphErrorData::setXErrorStyle(JKQTPErrorPlotstyle __value) +{ + this->xErrorStyle = __value; +} + +JKQTPErrorPlotstyle JKQTPXGraphErrorData::getXErrorStyle() const +{ + return this->xErrorStyle; +} + +void JKQTPXGraphErrorData::setXErrorColumn(int __value) { if (this->xErrorColumn != __value) { this->xErrorColumn = __value; if (xErrorColumn>=0 && xErrorStyle==JKQTPNoError) xErrorStyle=JKQTPErrorBars; } } -void JKQTPXGraphErrors::setXErrorColumnLower(int __value) { +void JKQTPXGraphErrorData::setXErrorColumnLower(int __value) { if (this->xErrorColumnLower != __value) { this->xErrorColumnLower = __value; if (xErrorColumnLower>=0 && xErrorStyle==JKQTPNoError) xErrorStyle=JKQTPErrorBars; } } -void JKQTPXGraphErrors::plotErrorIndicators(JKQTPEnhancedPainter& painter, JKQTBasePlotter* parent, JKQTPGraph *parentGraph, int xColumn, int yColumn, double xrelshift, double yrelshift, const QVector* dataorder) { - intPlotXYErrorIndicators(painter, parent, parentGraph, xColumn, yColumn, xErrorColumn, -1, xErrorStyle, JKQTPNoError, xErrorColumnLower, -1, xErrorSymmetric, true, xrelshift, yrelshift, dataorder); -} -double JKQTPXGraphErrors::getXErrorU(int i, JKQTPDatastore *ds) const +double JKQTPXGraphErrorData::getXErrorU(int i, JKQTPDatastore *ds) const { - if (ds && xErrorColumn>=0) { - return ds->get(xErrorColumn, i); + if (ds && xErrorColumn>=0 && i>=0 && i(ds->getColumn(xErrorColumn).getRows())) { + return ds->get(xErrorColumn, static_cast(i)); } return 0.0; } -double JKQTPXGraphErrors::getXErrorL(int i, JKQTPDatastore *ds) const +double JKQTPXGraphErrorData::getXErrorL(int i, JKQTPDatastore *ds) const { if (ds) { - if (xErrorSymmetric) { if (xErrorColumn>=0) return ds->get(xErrorColumn, i); } - else if (xErrorColumnLower>=0) return ds->get(xErrorColumnLower, i); + if (xErrorSymmetric) { + if (xErrorColumn>=0 && i>=0 && i(ds->getColumn(xErrorColumn).getRows())) return ds->get(xErrorColumn, static_cast(i)); + } else { + if (xErrorColumnLower>=0 && i>=0 && i(ds->getColumn(xErrorColumnLower).getRows())) return ds->get(xErrorColumnLower, static_cast(i)); + } } return 0.0; } @@ -553,33 +653,73 @@ double JKQTPXGraphErrors::getXErrorL(int i, JKQTPDatastore *ds) const - -JKQTPYGraphErrors::JKQTPYGraphErrors(QColor graphColor, JKQTBasePlotter *basePlotter): - JKQTPGraphErrors(graphColor, basePlotter) +JKQTPYGraphErrorData::JKQTPYGraphErrorData() { - yErrorColumn=-1; yErrorSymmetric=true; + yErrorColumn=-1; yErrorStyle=JKQTPNoError; yErrorColumnLower=-1; } -void JKQTPYGraphErrors::plotErrorIndicators(JKQTPEnhancedPainter& painter, JKQTBasePlotter* parent, JKQTPGraph* parentGraph, int xColumn, int yColumn, double xrelshift, double yrelshift, const QVector* dataorder) { - intPlotXYErrorIndicators(painter, parent, parentGraph, xColumn, yColumn, -1, yErrorColumn, JKQTPNoError, yErrorStyle, -1, yErrorColumnLower, true, yErrorSymmetric, xrelshift, yrelshift, dataorder); +void JKQTPYGraphErrorData::setYErrorSymmetric(bool __value) +{ + this->yErrorSymmetric = __value; } -double JKQTPYGraphErrors::getYErrorU(int i, JKQTPDatastore *ds) const +bool JKQTPYGraphErrorData::getYErrorSymmetric() const { - if (ds && yErrorColumn>=0) { - return ds->get(yErrorColumn, i); + return this->yErrorSymmetric; +} + +int JKQTPYGraphErrorData::getYErrorColumnLower() const { + return this->yErrorColumnLower; +} + +int JKQTPYGraphErrorData::getYErrorColumn() const { + return this->yErrorColumn; +} + +void JKQTPYGraphErrorData::setYErrorStyle(JKQTPErrorPlotstyle __value) +{ + this->yErrorStyle = __value; +} + +JKQTPErrorPlotstyle JKQTPYGraphErrorData::getYErrorStyle() const +{ + return this->yErrorStyle; +} + +void JKQTPYGraphErrorData::setYErrorColumn(int __value) { + if (this->yErrorColumn != __value) { + this->yErrorColumn = __value; + if (yErrorColumn>=0 && yErrorStyle==JKQTPNoError) yErrorStyle=JKQTPErrorBars; + } +} + +void JKQTPYGraphErrorData::setYErrorColumnLower(int __value) { + if (this->yErrorColumnLower != __value) { + this->yErrorColumnLower = __value; + if (yErrorColumnLower>=0 && yErrorStyle==JKQTPNoError) yErrorStyle=JKQTPErrorBars; + } +} + + +double JKQTPYGraphErrorData::getYErrorU(int i, JKQTPDatastore *ds) const +{ + if (ds && yErrorColumn>=0 && i>=0 && i(ds->getColumn(yErrorColumn).getRows())) { + return ds->get(yErrorColumn, static_cast(i)); } return 0.0; } -double JKQTPYGraphErrors::getYErrorL(int i, JKQTPDatastore *ds) const +double JKQTPYGraphErrorData::getYErrorL(int i, JKQTPDatastore *ds) const { if (ds) { - if (yErrorSymmetric) { if (yErrorColumn>=0) return ds->get(yErrorColumn, i); } - else if (yErrorColumnLower>=0) return ds->get(yErrorColumnLower, i); + if (yErrorSymmetric) { + if (yErrorColumn>=0 && i>=0 && i(ds->getColumn(yErrorColumn).getRows())) return ds->get(yErrorColumn, static_cast(i)); + } else { + if (yErrorColumnLower>=0 && i>=0 && i(ds->getColumn(yErrorColumnLower).getRows())) return ds->get(yErrorColumnLower, static_cast(i)); + } } return 0.0; } @@ -590,80 +730,30 @@ double JKQTPYGraphErrors::getYErrorL(int i, JKQTPDatastore *ds) const -JKQTPXYGraphErrors::JKQTPXYGraphErrors(QColor graphColor, JKQTBasePlotter *basePlotter): - JKQTPGraphErrors(graphColor, basePlotter) +JKQTPXGraphErrors::JKQTPXGraphErrors() { - xErrorSymmetric=true; - yErrorSymmetric=true; - yErrorColumn=-1; - yErrorStyle=JKQTPNoError; - xErrorColumn=-1; - xErrorStyle=JKQTPNoError; - xErrorColumnLower=-1; - yErrorColumnLower=-1; } -void JKQTPXYGraphErrors::plotErrorIndicators(JKQTPEnhancedPainter& painter, JKQTBasePlotter* parent, JKQTPGraph* parentGraph, int xColumn, int yColumn, double xrelshift, double yrelshift, const QVector* dataorder) { - this->intPlotXYErrorIndicators(painter, parent, parentGraph, xColumn, yColumn, xErrorColumn, yErrorColumn, xErrorStyle, yErrorStyle, xErrorColumnLower, yErrorColumnLower, xErrorSymmetric, yErrorSymmetric, xrelshift, yrelshift, dataorder); -} - -double JKQTPXYGraphErrors::getXErrorU(int i, JKQTPDatastore *ds) const -{ - if (ds && xErrorColumn>=0) { - return ds->get(xErrorColumn, i); - } - return 0.0; -} - -double JKQTPXYGraphErrors::getXErrorL(int i, JKQTPDatastore *ds) const -{ - if (ds && xErrorColumn>=0) { - if (xErrorSymmetric) { if (xErrorColumn>=0) return ds->get(xErrorColumn, i); } - else if (xErrorColumnLower>=0) return ds->get(xErrorColumnLower, i); - } - return 0.0; -} - -double JKQTPXYGraphErrors::getYErrorU(int i, JKQTPDatastore *ds) const -{ - if (ds && yErrorColumn>=0) { - return ds->get(yErrorColumn, i); - } - return 0.0; -} - -double JKQTPXYGraphErrors::getYErrorL(int i, JKQTPDatastore *ds) const -{ - if (ds && yErrorColumn>=0) { - if (yErrorSymmetric) { if (yErrorColumn>=0) return ds->get(yErrorColumn, i); } - else if (yErrorColumnLower>=0) return ds->get(yErrorColumnLower, i); - } - return 0.0; -} - - - - - - - - bool JKQTPXGraphErrors::errorUsesColumn(int c) const { return c==(xErrorColumn) || (c==xErrorColumnLower); } -bool JKQTPGraphErrors::errorUsesColumn(int /*c*/) const -{ - return false; +void JKQTPXGraphErrors::plotErrorIndicators(JKQTPEnhancedPainter& painter, JKQTBasePlotter* parent, JKQTPGraph *parentGraph, int xColumn, int yColumn, double xrelshift, double yrelshift, const QVector* dataorder) { + intPlotXYErrorIndicators(painter, parent, parentGraph, xColumn, yColumn, xErrorColumn, -1, xErrorStyle, JKQTPNoError, xErrorColumnLower, -1, xErrorSymmetric, true, xrelshift, yrelshift, dataorder); } -void JKQTPGraphErrors::setErrorColorFromGraphColor(QColor graphColor) + + + + +JKQTPYGraphErrors::JKQTPYGraphErrors() { - errorColor=graphColor.darker(); - errorFillColor=graphColor.lighter(); - //errorColor.setAlphaF(0.5); +} + +void JKQTPYGraphErrors::plotErrorIndicators(JKQTPEnhancedPainter& painter, JKQTBasePlotter* parent, JKQTPGraph* parentGraph, int xColumn, int yColumn, double xrelshift, double yrelshift, const QVector* dataorder) { + intPlotXYErrorIndicators(painter, parent, parentGraph, xColumn, yColumn, -1, yErrorColumn, JKQTPNoError, yErrorStyle, -1, yErrorColumnLower, true, yErrorSymmetric, xrelshift, yrelshift, dataorder); } bool JKQTPYGraphErrors::errorUsesColumn(int c) const @@ -671,18 +761,19 @@ bool JKQTPYGraphErrors::errorUsesColumn(int c) const return (c==yErrorColumn) || (c==yErrorColumnLower); } -void JKQTPYGraphErrors::setYErrorColumn(int __value) { - if (this->yErrorColumn != __value) { - this->yErrorColumn = __value; - if (yErrorColumn>=0 && yErrorStyle==JKQTPNoError) yErrorStyle=JKQTPErrorBars; - } + + + + + + +JKQTPXYGraphErrors::JKQTPXYGraphErrors() +{ + } -void JKQTPYGraphErrors::setYErrorColumnLower(int __value) { - if (this->yErrorColumnLower != __value) { - this->yErrorColumnLower = __value; - if (yErrorColumnLower>=0 && yErrorStyle==JKQTPNoError) yErrorStyle=JKQTPErrorBars; - } +void JKQTPXYGraphErrors::plotErrorIndicators(JKQTPEnhancedPainter& painter, JKQTBasePlotter* parent, JKQTPGraph* parentGraph, int xColumn, int yColumn, double xrelshift, double yrelshift, const QVector* dataorder) { + this->intPlotXYErrorIndicators(painter, parent, parentGraph, xColumn, yColumn, xErrorColumn, yErrorColumn, xErrorStyle, yErrorStyle, xErrorColumnLower, yErrorColumnLower, xErrorSymmetric, yErrorSymmetric, xrelshift, yrelshift, dataorder); } bool JKQTPXYGraphErrors::errorUsesColumn(int c) const @@ -690,51 +781,4 @@ bool JKQTPXYGraphErrors::errorUsesColumn(int c) const return (c==xErrorColumn)||(c==yErrorColumn)||(c==xErrorColumnLower)||(c==yErrorColumnLower); } -void JKQTPXYGraphErrors::setXErrorColumn(int __value) { - if (this->xErrorColumn != __value) { - this->xErrorColumn = __value; - if (xErrorColumn>=0 && xErrorStyle==JKQTPNoError) xErrorStyle=JKQTPErrorBars; - } -} - -void JKQTPXYGraphErrors::setXErrorColumnLower(int __value) { - if (this->xErrorColumnLower != __value) { - this->xErrorColumnLower = __value; - if (xErrorColumnLower>=0 && xErrorStyle==JKQTPNoError) xErrorStyle=JKQTPErrorBars; - } \ -} - -void JKQTPXYGraphErrors::setYErrorColumn(int __value) { - if (this->yErrorColumn != __value) { - this->yErrorColumn = __value; - if (yErrorColumn>=0 && yErrorStyle==JKQTPNoError) yErrorStyle=JKQTPErrorBars; - } -} - -void JKQTPXYGraphErrors::setYErrorColumnLower(int __value) { - if (this->yErrorColumnLower != __value) { - this->yErrorColumnLower = __value; - if (yErrorColumnLower>=0 && yErrorStyle==JKQTPNoError) yErrorStyle=JKQTPErrorBars; - } -} - -void JKQTPXYGraphErrors::setXErrorColumn(size_t __value) -{ - setXErrorColumn(static_cast(__value)); -} - -void JKQTPXYGraphErrors::setXErrorColumnLower(size_t __value) -{ - setXErrorColumnLower(static_cast(__value)); -} - -void JKQTPXYGraphErrors::setYErrorColumn(size_t __value) -{ - setYErrorColumn(static_cast(__value)); -} - -void JKQTPXYGraphErrors::setYErrorColumnLower(size_t __value) -{ - setYErrorColumnLower(static_cast(__value)); -} diff --git a/lib/jkqtplotter/jkqtpgraphsbaseerrors.h b/lib/jkqtplotter/jkqtpgraphsbaseerrors.h index 32a1bef6b7..b59322384a 100644 --- a/lib/jkqtplotter/jkqtpgraphsbaseerrors.h +++ b/lib/jkqtplotter/jkqtpgraphsbaseerrors.h @@ -32,350 +32,325 @@ #define JKQTPGRAPHSBASEERROR_H -/*! \brief Descendents of this class add data fields for error indicators and methods to plot them to a class. +/*! \brief This mix-in class assembles all styling properties applicable to error indicators \ingroup jkqtplotter_basegraphserrors - - This class is meant to be used with multiple inheritance. I.e. if you implemented some kind of plot - you may derive an error plot class in which you will have to overwrite the JKQTPGraph::drawErrorsBefor() - or drawErrorsAfter() so it calls the plotErrorIndicators() method from this class. In addition this class - will add some public datamemebers and methods to your class that allow to specify the properties of the - error indicators (plot properties: color, width, ... and columns for the data). + \ingroup jkqtplotter_basegraphs_stylemixins \image html jkqtplotter_simpletest_errorbarstyles.png "line-graphs with different types of error indicators" - \see \ref jkqtplotter_graphsgroup_classstructure_mixins */ -class JKQTP_LIB_EXPORT JKQTPGraphErrors { +class JKQTP_LIB_EXPORT JKQTPGraphErrorStyleMixin { + Q_GADGET public: /** \brief class contructor */ - JKQTPGraphErrors(QColor graphColor, JKQTBasePlotter* basePlotter=nullptr); - virtual ~JKQTPGraphErrors()=default; + JKQTPGraphErrorStyleMixin(); + virtual ~JKQTPGraphErrorStyleMixin()=default; + + /** \brief initiaize the error indicator style (from the parent plotter) */ + void initErrorStyle(JKQTBasePlotter* parent, int &parentPlotStyle); + + + + /*! \copydoc m_errorBarCapSize */ + void setErrorBarCapSize(double __value); + /*! \copydoc m_errorBarCapSize */ + double getErrorBarCapSize() const; + + /** \brief derive the properties of the error indicators from \a pen */ void setErrorStyleFromPen(const JKQTBasePlotter::JKQTPPen& pen); - /*! \copydoc errorColor - \see see errorColor for details */ - void setErrorColor(const QColor & __value); - /*! \copydoc errorColor - \see see errorColor for details */ - QColor getErrorColor() const; - /*! \copydoc errorStyle - \see see errorStyle for details */ - void setErrorStyle(const Qt::PenStyle & __value); - /*! \copydoc errorStyle - \see see errorStyle for details */ - Qt::PenStyle getErrorStyle() const; - /*! \copydoc errorWidth - \see see errorWidth for details */ - void setErrorWidth(double __value); - /*! \copydoc errorWidth - \see see errorWidth for details */ - double getErrorWidth() const; - /*! \copydoc errorFillColor - \see see errorFillColor for details */ - void setErrorFillColor(const QColor & __value); - /*! \copydoc errorFillColor - \see see errorFillColor for details */ - QColor getErrorFillColor() const; - /*! \copydoc errorFillStyle - \see see errorFillStyle for details */ - void setErrorFillStyle(const Qt::BrushStyle & __value); - /*! \copydoc errorFillStyle - \see see errorFillStyle for details */ - Qt::BrushStyle getErrorFillStyle() const; - /*! \copydoc errorbarSize - \see see errorbarSize for details */ - void setErrorbarSize(double __value); - /*! \copydoc errorbarSize - \see see errorbarSize for details */ - double getErrorbarSize() const; - /** \brief returns true, if the error plots use the given column */ - virtual bool errorUsesColumn(int c) const; - + /** \brief derive the colors of the error indicators from a given \a color */ void setErrorColorFromGraphColor(QColor graphColor); - protected: - /** \brief color of the error lines/bars */ - QColor errorColor; - /** \brief linestyle of the error lines/bars */ - Qt::PenStyle errorStyle; - /** \brief width (pixels) of the error lines/bars */ - double errorWidth; - /** \brief fill color for error polygons */ - QColor errorFillColor; - /** \brief fill style for error polygons */ - Qt::BrushStyle errorFillStyle; - /** \brief size of the error bar end markers [pixels] */ - double errorbarSize; - /** \brief draw error indicators with the parameters defined in this class. The position of the datapoints is - * given by the \a xColumn and \a yColumn. It is also possible to specify a datarange. This method is called by - * the JKQTPGraph descendents */ - virtual void plotErrorIndicators(JKQTPEnhancedPainter& painter, JKQTBasePlotter* parent, JKQTPGraph* parentGraph, int xColumn, int yColumn, double xrelshift=0, double yrelshift=0.0, const QVector* dataorder=nullptr)=0; + + /** \brief set the color of the error indicator (out)lines */ + void setErrorLineColor(const QColor & __value); + /** \brief get the color of the error indicator (out)lines */ + QColor getErrorLineColor() const; + /** \brief set the style of the error indicator (out)lines */ + void setErrorLineStyle(Qt::PenStyle __value); + /** \brief get the style of the error indicator (out)lines */ + Qt::PenStyle getErrorLineStyle() const; + /** \brief set the width [pt] of the error indicator (out)lines */ + void setErrorLineWidth(double __value); + /** \brief get the width [pt] of the error indicator (out)lines */ + double getErrorLineWidth() const; + /** \brief sets the dash offset for a custom dash style of the error indicator (out)lines + * \see https://doc.qt.io/qt-5/qpen.html#setDashOffset + */ + void setErrorLineDashOffset(qreal offset); + /** \brief returns the dash offset for a custom dash style of the error indicator (out)lines + * \see https://doc.qt.io/qt-5/qpen.html#setDashOffset + */ + qreal getErrorLineDashOffset() const; + /** \brief sets the dash pattern for a custom dash style of the error indicator (out)lines + * \see https://doc.qt.io/qt-5/qpen.html#setDashPattern + */ + void setErrorLineDashPattern(const QVector &pattern); + /** \brief gets the dash pattern for a custom dash style of the error indicator (out)lines + * \see https://doc.qt.io/qt-5/qpen.html#setDashPattern + */ + QVector getErrorLineDashPattern() const; + /** \brief sets the join style of the error indicator (out)lines + * \see https://doc.qt.io/qt-5/qpen.html#setJoinStyle + */ + void setErrorLineJoinStyle(Qt::PenJoinStyle style); + /** \brief returns the join style of the error indicator (out)lines + * \see https://doc.qt.io/qt-5/qpen.html#setJoinStyle + */ + Qt::PenJoinStyle getErrorLineJoinStyle() const; + /** \brief sets the cap style of the error indicator (out)lines + * \see https://doc.qt.io/qt-5/qpen.html#setCapStyle + */ + void setErrorLineCapStyle(Qt::PenCapStyle style); + /** \brief gets the cap style of the error indicator (out)lines + * \see https://doc.qt.io/qt-5/qpen.html#setCapStyle + */ + Qt::PenCapStyle getErrorLineCapStyle() const; + /** \brief sets the brush used to fill the line area of the error indicator (out)lines + * \see https://doc.qt.io/qt-5/qpen.html#setBrush + */ + void setErrorLineBrush(const QBrush& style); + /** \brief gets the brush used to fill the line area of the error indicator (out)lines + * \see https://doc.qt.io/qt-5/qpen.html#setBrush + */ + QBrush getErrorLineBrush() const; + + + /** \brief set the fill color of the error indicators */ + void setErrorFillColor(const QColor & __value); + /** \brief get the fill color of the error indicators */ + QColor getErrorFillColor() const; + /** \brief set the fill style of the error indicators */ + void setErrorFillStyle(Qt::BrushStyle __value); + /** \brief get the fill style of the error indicators */ + Qt::BrushStyle getErrorFillStyle() const; + /** \brief set the color of the error indicator filling and sets fill style to Qt::TexturePattern */ + void setErrorFillTexture(const QPixmap & __value); + /** \brief set the color of the error indicator filling and sets fill style to Qt::TexturePattern */ + void setErrorFillTexture(const QImage & __value); + /** \brief set the color of the error indicator filling */ + QPixmap getErrorFillTexture() const; + /** \brief set the color of the error indicator filling */ + QImage getErrorFillTextureImage() const; + + /** \brief set the filling of the error indicators to a gradient and sets fill style to a gradient setting */ + void setErrorFillGradient(const QGradient & __value); + /** \brief get the gradient object of the error indicator filling */ + const QGradient *getErrorFillGradient() const; + + /** \brief sets an error indicator fill brush (overwrites all internal properties!) */ + void setErrorFillBrush(const QBrush& b); + /** \brief sets an error indicator fill transformation matrix*/ + void setErrorFillTransform(const QMatrix& b); + /** \brief sets an error indicator fill transformation */ + void setErrorFillTransform(const QTransform& b); + + + + protected: + /** \brief error indicator line pen */ + QPen m_errorLinePen; + /** \brief width of the error indicators' lines, given in pt */ + double m_errorLineWidth; + + + /** \brief fill style of the graph */ + QBrush m_errorFillBrush; + /** \brief last fill color of the graph */ + QColor m_errorFillColor; + + + /** \brief size of the error bar end markers [pt] */ + double m_errorBarCapSize; + + + /** \brief constructs a QPen from the error indicator line styling properties */ + QPen getErrorLinePen(JKQTPEnhancedPainter &painter, JKQTBasePlotter* parent) const; + /** \brief constructs a QPen from the error indicator line styling properties, suitable for drawing rectangles with sharp edges */ + QPen getErrorLinePenForRects(JKQTPEnhancedPainter &painter, JKQTBasePlotter* parent) const; + + /** \brief constructs a QBrush from the error indicator fill styling properties */ + QBrush getErrorFillBrush(JKQTPEnhancedPainter &painter, JKQTBasePlotter* parent) const; /** \brief draw error indicators with the parameters defined in this class. The position of the datapoints is * given by the \a xColumn and \a yColumn. It is also possible to specify a datarange. */ void intPlotXYErrorIndicators(JKQTPEnhancedPainter& painter, JKQTBasePlotter* parent, JKQTPGraph* parentGraph, int xColumn, int yColumn, int xErrorColumn, int yErrorColumn, JKQTPErrorPlotstyle xErrorStyle, JKQTPErrorPlotstyle yErrorStyle, int xErrorColumnLower=-1, int yErrorColumnLower=-1, bool xErrorSymmetric=true, bool yErrorSymmetric=true, double xrelshift=0, double yrelshift=0.0, const QVector *dataorder=nullptr); - /** \brief this function can be used to set the color of the error indicators automatically * * return \c true and the colors to use, if applicable, the default implementation returns false */ - virtual bool intPlotXYErrorIndicatorsGetColor(JKQTPEnhancedPainter& painter, JKQTBasePlotter* parent, JKQTPGraph* parentGraph, int xColumn, int yColumn, int xErrorColumn, int yErrorColumn, JKQTPErrorPlotstyle xErrorStyle, JKQTPErrorPlotstyle yErrorStyle, int index, QColor& errorColor, QColor& errorFillColor); + virtual bool intPlotXYErrorIndicatorsGetColor(JKQTPEnhancedPainter& painter, JKQTBasePlotter* parent, JKQTPGraph* parentGraph, int xColumn, int yColumn, int xErrorColumn, int yErrorColumn, JKQTPErrorPlotstyle xErrorStyle, JKQTPErrorPlotstyle yErrorStyle, int index, QColor& errorLineColor, QColor& errorFillColor); +}; + +/*! \brief This class adds data fields for error indicators in x direction + \ingroup jkqtplotter_basegraphserrors + \see JKQTPYGraphErrorData, \ref jkqtplotter_graphsgroup_classstructure_mixins + */ +class JKQTP_LIB_EXPORT JKQTPXGraphErrorData { + Q_GADGET + public: + /** \brief class contructor */ + JKQTPXGraphErrorData(); + virtual ~JKQTPXGraphErrorData()=default; + + /*! \copydoc xErrorSymmetric*/ + void setXErrorSymmetric(bool __value); + /*! \copydoc xErrorSymmetric */ + bool getXErrorSymmetric() const; + /*! \copydoc xErrorColumnLower */ + int getXErrorColumnLower() const; + /*! \copydoc xErrorColumn */ + int getXErrorColumn() const; + /*! \copydoc xErrorStyle */ + void setXErrorStyle(JKQTPErrorPlotstyle __value); + /*! \copydoc xErrorStyle */ + JKQTPErrorPlotstyle getXErrorStyle() const; + /** \copydoc xErrorColumn */ + void setXErrorColumn(int __value); + /** \copydoc xErrorColumnLower */ + void setXErrorColumnLower(int __value); + + + protected: + /** \brief the column that contains the error of the x-component of the datapoints */ + int xErrorColumn; + /** \brief the column that contains the error of the x-component of the datapoints. This is used as the lower error length, if xErrorSymmetric \c ==false. */ + int xErrorColumnLower; + /** \brief indicates whether the x-errors are symmetric (from one column only) */ + bool xErrorSymmetric; + /** \brief how to draw the errors (if available) of the x-value */ + JKQTPErrorPlotstyle xErrorStyle; + + /** \brief returns the upper x-error for the i-th datapoint, read from datastore \a ds */ virtual double getXErrorU(int i, JKQTPDatastore* ds) const; + /** \brief returns the lower x-error for the i-th datapoint, read from datastore \a ds */ virtual double getXErrorL(int i, JKQTPDatastore* ds) const; + +}; + + + + + +/*! \brief This class adds data fields for error indicators in y direction + \ingroup jkqtplotter_basegraphserrors + \see JKQTPXGraphErrorData \ref jkqtplotter_graphsgroup_classstructure_mixins + */ +class JKQTP_LIB_EXPORT JKQTPYGraphErrorData { + Q_GADGET + public: + /** \brief class contructor */ + JKQTPYGraphErrorData(); + virtual ~JKQTPYGraphErrorData()=default; + + /*! \copydoc yErrorSymmetric */ + void setYErrorSymmetric(bool __value); + /*! \copydoc yErrorSymmetric */ + bool getYErrorSymmetric() const; + /*! \copydoc yErrorColumnLower */ + int getYErrorColumnLower() const; + /*! \copydoc yErrorColumn */ + int getYErrorColumn() const; + /*! \copydoc yErrorStyle */ + void setYErrorStyle(JKQTPErrorPlotstyle __value); + /*! \copydoc yErrorStyle */ + JKQTPErrorPlotstyle getYErrorStyle() const; + /*! \copydoc yErrorColumn */ + void setYErrorColumn(int __value); + /*! \copydoc yErrorColumnLower */ + void setYErrorColumnLower(int __value); + + + protected: + /** \brief the column that contains the error of the x-component of the datapoints */ + int yErrorColumn; + /** \brief the column that contains the error of the x-component of the datapoints. This is used as the lower error length, if yErrorSymmetric \c ==false. */ + int yErrorColumnLower; + /** \brief indicates whether the x-errors are symmetric (from one column only) */ + bool yErrorSymmetric; + /** \brief how to draw the errors (if available) of the x-value */ + JKQTPErrorPlotstyle yErrorStyle; + + /** \brief returns the upper y-error for the i-th datapoint, read from datastore \a ds */ virtual double getYErrorU(int i, JKQTPDatastore* ds) const; + /** \brief returns the lower y-error for the i-th datapoint, read from datastore \a ds */ virtual double getYErrorL(int i, JKQTPDatastore* ds) const; - //** \brief plot a single error indicator */ - //void intPlotXYErrorIndicator(JKQTPEnhancedPainter& painter, double x, double xperror, double xmerror, double y, double yperror, double ymerror, JKQTPErrorPlotstyle xErrorStyle=JKQTPNoError, JKQTPErrorPlotstyle yErrorStyle=JKQTPNoError, double lastx=0, double lastxperror=0, double lastxmerror=0, double lasty=0, double lastyperror=0, double lastymerror=0); }; -/*! \brief This class adds data fields for error indicators in x direction to a JKQTPGraph descendent. + +/*! \brief This class is the base class for graphs that only display error indicators in x-direction \ingroup jkqtplotter_basegraphserrors - \see JKQTPGraphErrors, \ref jkqtplotter_graphsgroup_classstructure_mixins + \see JKQTPXGraphErrorData, JKQTPGraphErrorStyleMixin, \ref jkqtplotter_graphsgroup_classstructure_mixins */ -class JKQTP_LIB_EXPORT JKQTPXGraphErrors: public JKQTPGraphErrors { +class JKQTP_LIB_EXPORT JKQTPXGraphErrors: public JKQTPXGraphErrorData, public JKQTPGraphErrorStyleMixin { + Q_GADGET public: /** \brief class contructor */ - JKQTPXGraphErrors(QColor graphColor, JKQTBasePlotter* basePlotter=nullptr); - - /*! \copydoc xErrorSymmetric - \see see xErrorSymmetric for details */ - inline virtual void setXErrorSymmetric(bool __value) - { - this->xErrorSymmetric = __value; - } - /*! \copydoc xErrorSymmetric - \see see xErrorSymmetric for details */ - inline virtual bool getXErrorSymmetric() const - { - return this->xErrorSymmetric; - } - /*! \brief returns the property xErrorColumnLower ( \copybrief xErrorColumnLower ). \details Description of the parameter xErrorColumnLower is:
    \copydoc xErrorColumnLower
    . \see xErrorColumnLower for more information */ - inline int getXErrorColumnLower() const { return this->xErrorColumnLower; } - /*! \brief returns the property xErrorColumn ( \copybrief xErrorColumn ). \details Description of the parameter xErrorColumn is:
    \copydoc xErrorColumn
    . \see xErrorColumn for more information */ - inline int getXErrorColumn() const { return this->xErrorColumn; } - /*! \copydoc xErrorStyle - \see see xErrorStyle for details */ - inline virtual void setXErrorStyle(const JKQTPErrorPlotstyle & __value) - { - this->xErrorStyle = __value; - } - /*! \copydoc xErrorStyle - \see see xErrorStyle for details */ - inline virtual JKQTPErrorPlotstyle getXErrorStyle() const - { - return this->xErrorStyle; - } - /** \brief set the column from which to read the error values for x-error indicators */ - void setXErrorColumn(int __value); - /** \brief set the column from which to read the error values for lower x-error indicators (if not set [=-1], the xErrorColumn-values will be used for upper and lower error indicators) */ - void setXErrorColumnLower(int __value); + JKQTPXGraphErrors(); + virtual ~JKQTPXGraphErrors()=default; /** \brief returns true, if the error plots use the given column */ - virtual bool errorUsesColumn(int c) const override; + virtual bool errorUsesColumn(int c) const ; protected: - /** \brief the column that contains the error of the x-component of the datapoints */ - int xErrorColumn; - /** \brief the column that contains the error of the x-component of the datapoints. This is used as the lower error length, if xErrorSymmetric \c ==false. */ - int xErrorColumnLower; - /** \brief indicates whether the x-errors are symmetric (from one column only) */ - bool xErrorSymmetric; - /** \brief how to draw the errors (if available) of the x-value */ - JKQTPErrorPlotstyle xErrorStyle; - - /** \brief draw error indicators with the parameters defined in this class. The position of the datapoints is - * given by the \a xColumn and \a yColumn. It is also possible to specify a datarange. */ - virtual void plotErrorIndicators(JKQTPEnhancedPainter& painter, JKQTBasePlotter* parent, JKQTPGraph* parentGraph, int xColumn, int yColumn, double xrelshift=0, double yrelshift=0.0, const QVector *dataorder=nullptr) override; - - virtual double getXErrorU(int i, JKQTPDatastore* ds) const override; - virtual double getXErrorL(int i, JKQTPDatastore* ds) const override; + /** \brief draws the error indicators */ + virtual void plotErrorIndicators(JKQTPEnhancedPainter& painter, JKQTBasePlotter* parent, JKQTPGraph* parentGraph, int xColumn, int yColumn, double xrelshift=0, double yrelshift=0.0, const QVector *dataorder=nullptr) ; }; -/*! \brief This class adds data fields for error indicators in y direction to a class. - \ingroup jkqtplotter_basegraphserrors - \see JKQTPGraphErrors, \ref jkqtplotter_graphsgroup_classstructure_mixins +/*! \brief This class is the base class for graphs that only display error indicators in y-direction + \ingroup jkqtplotter_basegraphserrors + \see JKQTPYGraphErrorData, JKQTPGraphErrorStyleMixin, \ref jkqtplotter_graphsgroup_classstructure_mixins */ -class JKQTP_LIB_EXPORT JKQTPYGraphErrors: public JKQTPGraphErrors { +class JKQTP_LIB_EXPORT JKQTPYGraphErrors: public JKQTPYGraphErrorData, public JKQTPGraphErrorStyleMixin { + Q_GADGET public: /** \brief class contructor */ - JKQTPYGraphErrors(QColor graphColor, JKQTBasePlotter* basePlotter=nullptr); + JKQTPYGraphErrors(); + virtual ~JKQTPYGraphErrors()=default; - /*! \copydoc yErrorSymmetric - \see see yErrorSymmetric for details */ - inline virtual void setYErrorSymmetric(bool __value) - { - this->yErrorSymmetric = __value; - } - /*! \copydoc yErrorSymmetric - \see see yErrorSymmetric for details */ - inline virtual bool getYErrorSymmetric() const - { - return this->yErrorSymmetric; - } - /*! \brief returns the property yErrorColumnLower ( \copybrief yErrorColumnLower ). \details Description of the parameter yErrorColumnLower is:
    \copydoc yErrorColumnLower
    . \see yErrorColumnLower for more information */ - inline int getYErrorColumnLower() const { return this->yErrorColumnLower; } - /*! \brief returns the property yErrorColumn ( \copybrief yErrorColumn ). \details Description of the parameter yErrorColumn is:
    \copydoc yErrorColumn
    . \see yErrorColumn for more information */ - inline int getYErrorColumn() const { return this->yErrorColumn; } - /*! \copydoc yErrorStyle - \see see yErrorStyle for details */ - inline virtual void setYErrorStyle(const JKQTPErrorPlotstyle & __value) - { - this->yErrorStyle = __value; - } - /*! \copydoc yErrorStyle - \see see yErrorStyle for details */ - inline virtual JKQTPErrorPlotstyle getYErrorStyle() const - { - return this->yErrorStyle; - } - /** \copydoc JKQTPGraphErrors::errorUsesColumn() */ - virtual bool errorUsesColumn(int c) const override; + /** \brief returns true, if the error plots use the given column */ + virtual bool errorUsesColumn(int c) const ; - /** \brief set the column from which to read the error values for y-error indicators */ - void setYErrorColumn(int __value); - /** \brief set the column from which to read the error values for lower y-error indicators (if not set [=-1], the xErrorColumn-values will be used for upper and lower error indicators) */ - void setYErrorColumnLower(int __value); protected: - /** \brief the column that contains the error of the x-component of the datapoints */ - int yErrorColumn; - /** \brief how to draw the errors (if available) of the x-value */ - JKQTPErrorPlotstyle yErrorStyle; - /** \brief indicates whether the y-errors are symmetric (from one column only) */ - bool yErrorSymmetric; - /** \brief the column that contains the error of the y-component of the datapoints. This is used as the lower error length, if yErrorSymmetric \c ==false. */ - int yErrorColumnLower; + /** \brief draws the error indicators */ + virtual void plotErrorIndicators(JKQTPEnhancedPainter& painter, JKQTBasePlotter* parent, JKQTPGraph* parentGraph, int xColumn, int yColumn, double xrelshift=0, double yrelshift=0.0, const QVector *dataorder=nullptr) ; - /** \brief draw error indicators with the parameters defined in this class. The position of the datapoints is - * given by the \a xColumn and \a yColumn. It is also possible to specify a datarange. */ - virtual void plotErrorIndicators(JKQTPEnhancedPainter& painter, JKQTBasePlotter* parent, JKQTPGraph* parentGraph, int xColumn, int yColumn, double xrelshift=0, double yrelshift=0.0, const QVector *dataorder=nullptr) override; - - virtual double getYErrorU(int i, JKQTPDatastore* ds) const override; - virtual double getYErrorL(int i, JKQTPDatastore* ds) const override; }; -/*! \brief This class adds data fields for error indicators in x and y direction to a class. - \ingroup jkqtplotter_basegraphserrors - \see JKQTPGraphErrors, \ref jkqtplotter_graphsgroup_classstructure_mixins + + +/*! \brief This class is the base class for graphs that only display error indicators in x- and y-direction + \ingroup jkqtplotter_basegraphserrors + \see JKQTPXGraphErrorData, JKQTPYGraphErrorData, JKQTPGraphErrorStyleMixin, \ref jkqtplotter_graphsgroup_classstructure_mixins */ -class JKQTP_LIB_EXPORT JKQTPXYGraphErrors: public JKQTPGraphErrors { +class JKQTP_LIB_EXPORT JKQTPXYGraphErrors: public JKQTPXGraphErrorData, public JKQTPYGraphErrorData, public JKQTPGraphErrorStyleMixin { + Q_GADGET public: /** \brief class contructor */ - JKQTPXYGraphErrors(QColor graphColor, JKQTBasePlotter* basePlotter=nullptr); - /*! \copydoc xErrorSymmetric - \see see xErrorSymmetric for details */ - inline virtual void setXErrorSymmetric(bool __value) - { - this->xErrorSymmetric = __value; - } - /*! \copydoc xErrorSymmetric - \see see xErrorSymmetric for details */ - inline virtual bool getXErrorSymmetric() const - { - return this->xErrorSymmetric; - } - /*! \copydoc yErrorSymmetric - \see see yErrorSymmetric for details */ - inline virtual void setYErrorSymmetric(bool __value) - { - this->yErrorSymmetric = __value; - } - /*! \copydoc yErrorSymmetric - \see see yErrorSymmetric for details */ - inline virtual bool getYErrorSymmetric() const - { - return this->yErrorSymmetric; - } - /*! \brief returns the property xErrorColumnLower ( \copybrief xErrorColumnLower ). \details Description of the parameter xErrorColumnLower is:
    \copydoc xErrorColumnLower
    . \see xErrorColumnLower for more information */ - inline int getXErrorColumnLower() const { return this->xErrorColumnLower; } - /*! \brief returns the property xErrorColumn ( \copybrief xErrorColumn ). \details Description of the parameter xErrorColumn is:
    \copydoc xErrorColumn
    . \see xErrorColumn for more information */ - inline int getXErrorColumn() const { return this->xErrorColumn; } - /*! \brief returns the property yErrorColumnLower ( \copybrief yErrorColumnLower ). \details Description of the parameter yErrorColumnLower is:
    \copydoc yErrorColumnLower
    . \see yErrorColumnLower for more information */ - inline int getYErrorColumnLower() const { return this->yErrorColumnLower; } - /*! \brief returns the property yErrorColumn ( \copybrief yErrorColumn ). \details Description of the parameter yErrorColumn is:
    \copydoc yErrorColumn
    . \see yErrorColumn for more information */ - inline int getYErrorColumn() const { return this->yErrorColumn; } - /*! \copydoc yErrorStyle - \see see yErrorStyle for details */ - inline virtual void setYErrorStyle(const JKQTPErrorPlotstyle & __value) - { - this->yErrorStyle = __value; - } - /*! \copydoc yErrorStyle - \see see yErrorStyle for details */ - inline virtual JKQTPErrorPlotstyle getYErrorStyle() const - { - return this->yErrorStyle; - } - /*! \copydoc xErrorStyle - \see see xErrorStyle for details */ - inline virtual void setXErrorStyle(const JKQTPErrorPlotstyle & __value) - { - this->xErrorStyle = __value; - } - /*! \copydoc xErrorStyle - \see see xErrorStyle for details */ - inline virtual JKQTPErrorPlotstyle getXErrorStyle() const - { - return this->xErrorStyle; - } - /** \copydoc JKQTPGraphErrors::errorUsesColumn() */ - virtual bool errorUsesColumn(int c) const override; + JKQTPXYGraphErrors(); + virtual ~JKQTPXYGraphErrors()=default; - /** \brief set the column from which to read the error values for x-error indicators */ - void setXErrorColumn(int __value); - /** \brief set the column from which to read the error values for lower x-error indicators (if not set [=-1], the xErrorColumn-values will be used for upper and lower error indicators) */ - void setXErrorColumnLower(int __value); - /** \brief set the column from which to read the error values for x-error indicators */ - void setYErrorColumn(int __value); - /** \brief set the column from which to read the error values for lower x-error indicators (if not set [=-1], the xErrorColumn-values will be used for upper and lower error indicators) */ - void setYErrorColumnLower(int __value); - /** \brief set the column from which to read the error values for y-error indicators */ - void setXErrorColumn(size_t __value); - /** \brief set the column from which to read the error values for lower y-error indicators (if not set [=-1], the xErrorColumn-values will be used for upper and lower error indicators) */ - void setXErrorColumnLower(size_t __value); - /** \brief set the column from which to read the error values for y-error indicators */ - void setYErrorColumn(size_t __value); - /** \brief set the column from which to read the error values for lower y-error indicators (if not set [=-1], the xErrorColumn-values will be used for upper and lower error indicators) */ - void setYErrorColumnLower(size_t __value); + /** \brief returns true, if the error plots use the given column */ + virtual bool errorUsesColumn(int c) const ; protected: - /** \brief the column that contains the error of the x-component of the datapoints */ - int yErrorColumn; - /** \brief how to draw the errors (if available) of the x-value */ - JKQTPErrorPlotstyle yErrorStyle; - /** \brief the column that contains the error of the x-component of the datapoints */ - int xErrorColumn; - /** \brief how to draw the errors (if available) of the x-value */ - JKQTPErrorPlotstyle xErrorStyle; - /** \brief indicates whether the x-errors are symmetric (from one column only) */ - bool xErrorSymmetric; - /** \brief indicates whether the y-errors are symmetric (from one column only) */ - bool yErrorSymmetric; - /** \brief the column that contains the error of the x-component of the datapoints. This is used as the lower error length, if xErrorSymmetric \c ==false. */ - int xErrorColumnLower; - /** \brief the column that contains the error of the y-component of the datapoints. This is used as the lower error length, if yErrorSymmetric \c ==false. */ - int yErrorColumnLower; + /** \brief draws the error indicators */ + virtual void plotErrorIndicators(JKQTPEnhancedPainter& painter, JKQTBasePlotter* parent, JKQTPGraph* parentGraph, int xColumn, int yColumn, double xrelshift=0, double yrelshift=0.0, const QVector *dataorder=nullptr) ; - /** \brief draw error indicators with the parameters defined in this class. The position of the datapoints is - * given by the \a xColumn and \a yColumn. It is also possible to specify a datarange. */ - virtual void plotErrorIndicators(JKQTPEnhancedPainter& painter, JKQTBasePlotter* parent, JKQTPGraph* parentGraph, int xColumn, int yColumn, double xrelshift=0, double yrelshift=0.0, const QVector *dataorder=nullptr) override; - - virtual double getXErrorU(int i, JKQTPDatastore* ds) const override; - virtual double getXErrorL(int i, JKQTPDatastore* ds) const override; - virtual double getYErrorU(int i, JKQTPDatastore* ds) const override; - virtual double getYErrorL(int i, JKQTPDatastore* ds) const override; }; @@ -384,4 +359,6 @@ class JKQTP_LIB_EXPORT JKQTPXYGraphErrors: public JKQTPGraphErrors { + + #endif // JKQTPGRAPHSBASEERROR_H diff --git a/lib/jkqtplotter/jkqtpgraphsbasestylingmixins.h b/lib/jkqtplotter/jkqtpgraphsbasestylingmixins.h index 3da2d3ef21..4651cdb0e9 100644 --- a/lib/jkqtplotter/jkqtpgraphsbasestylingmixins.h +++ b/lib/jkqtplotter/jkqtpgraphsbasestylingmixins.h @@ -123,20 +123,20 @@ class JKQTP_LIB_EXPORT JKQTPGraphLineStyleMixin { Q_PROPERTY(Qt::PenStyle lineStyle MEMBER m_lineStyle READ getLineStyle WRITE setLineStyle) Q_PROPERTY(double lineWidth MEMBER m_lineWidth READ getLineWidth WRITE setLineWidth) private: - /** \brief line pen */ + /** \brief graph line pen */ QPen m_linePen; - /** \brief width of the graph, given in pt */ + /** \brief width of the graph lines, given in pt */ double m_lineWidth; /** \brief line pen for the highlighted look */ QColor m_highlightingLineColor; protected: - /** \brief constructs a QPen from the line styleing properties */ + /** \brief constructs a QPen from the line styling properties */ QPen getLinePen(JKQTPEnhancedPainter &painter, JKQTBasePlotter* parent) const; - /** \brief constructs a QPen from the line styleing properties, suitable for drawing rectangles with sharp edges */ + /** \brief constructs a QPen from the line styling properties, suitable for drawing rectangles with sharp edges */ QPen getLinePenForRects(JKQTPEnhancedPainter &painter, JKQTBasePlotter* parent) const; - /** \brief constructs a QPen from the line styleing properties */ + /** \brief constructs a QPen from the line styling properties */ QPen getHighlightingLinePen(JKQTPEnhancedPainter &painter, JKQTBasePlotter* parent) const; - /** \brief constructs a QPen from the line styleing properties, suitable for drawing rectangle with sharp corners */ + /** \brief constructs a QPen from the line styling properties, suitable for drawing rectangle with sharp corners */ QPen getHighlightingLinePenForRects(JKQTPEnhancedPainter &painter, JKQTBasePlotter* parent) const; }; @@ -215,9 +215,9 @@ class JKQTP_LIB_EXPORT JKQTPGraphSymbolStyleMixin { /** \brief width (in pt) of the lines used to plot the symbol for the data points, given in pt */ double m_symbolLineWidth; protected: - /** \brief constructs a QPen from the line styleing properties */ + /** \brief constructs a QPen from the line styling properties */ QPen getSymbolPen(JKQTPEnhancedPainter &painter, JKQTBasePlotter* parent) const; - /** \brief constructs a QPen from the line styleing properties */ + /** \brief constructs a QPen from the line styling properties */ QBrush getSymbolBrush(JKQTPEnhancedPainter &painter, JKQTBasePlotter* parent) const; /*! \brief plot a symbol at location x,y (in painter coordinates), using the current style @@ -323,7 +323,7 @@ class JKQTP_LIB_EXPORT JKQTPGraphFillStyleMixin { /** \brief last fill color of the graph */ QColor m_fillColor; protected: - /** \brief constructs a QPen from the line styleing properties */ + /** \brief constructs a QBrush from the graph fill styling properties */ QBrush getFillBrush(JKQTPEnhancedPainter &painter, JKQTBasePlotter* parent) const; }; diff --git a/lib/jkqtplotter/jkqtpgraphsboxplot.cpp b/lib/jkqtplotter/jkqtpgraphsboxplot.cpp index 969144c173..8908300959 100644 --- a/lib/jkqtplotter/jkqtpgraphsboxplot.cpp +++ b/lib/jkqtplotter/jkqtpgraphsboxplot.cpp @@ -37,8 +37,7 @@ JKQTPGraphBoxplotStyleMixin::JKQTPGraphBoxplotStyleMixin() boxWidth=0.4; - whiskerLineColor=getLineColor(); - whiskerLineStyle=getLineStyle(); + m_whiskerLinePen=QPen(getLineColor(), getLineWidth()); whiskerLineWidth=getLineWidth(); } @@ -51,12 +50,12 @@ void JKQTPGraphBoxplotStyleMixin::initBoxplotStyle(JKQTBasePlotter *parent, int initSymbolStyle(parent, parentPlotStyle); if (parent && parentPlotStyle>=0) { // get style settings from parent object parentPlotStyle=parent->getNextStyle(); - whiskerLineStyle=parent->getPlotStyle(parentPlotStyle).style(); + m_whiskerLinePen.setColor(parent->getPlotStyle(parentPlotStyle).color()); + m_whiskerLinePen.setStyle(parent->getPlotStyle(parentPlotStyle).style()); whiskerLineWidth=parent->getPlotStyle(parentPlotStyle).widthF(); } - whiskerLineColor=getLineColor(); - + setWhiskerLineColor(getLineColor()); } void JKQTPGraphBoxplotStyleMixin::setBoxplotColor(QColor c, JKQTBasePlotter *parent) @@ -67,17 +66,17 @@ void JKQTPGraphBoxplotStyleMixin::setBoxplotColor(QColor c, JKQTBasePlotter *par setHighlightingLineColor(c); setSymbolColor(c); setSymbolFillColor(JKQTPGetDerivedColor(parent->getCurrentPlotterStyle().graphFillColorDerivationMode, c)); - whiskerLineColor=getLineColor(); + setWhiskerLineColor(getLineColor()); } -void JKQTPGraphBoxplotStyleMixin::setWhiskerLineStyle(const Qt::PenStyle &__value) +void JKQTPGraphBoxplotStyleMixin::setWhiskerLineStyle(Qt::PenStyle __value) { - this->whiskerLineStyle = __value; + this->m_whiskerLinePen.setStyle(__value); } Qt::PenStyle JKQTPGraphBoxplotStyleMixin::getWhiskerLineStyle() const { - return this->whiskerLineStyle; + return this->m_whiskerLinePen.style(); } void JKQTPGraphBoxplotStyleMixin::setBoxWidth(double __value) @@ -102,20 +101,70 @@ double JKQTPGraphBoxplotStyleMixin::getWhiskerLineWidth() const void JKQTPGraphBoxplotStyleMixin::setWhiskerLineColor(QColor __value) { - whiskerLineColor=__value; + m_whiskerLinePen.setColor(__value); } QColor JKQTPGraphBoxplotStyleMixin::getWhiskerLineColor() const { - return whiskerLineColor; + return m_whiskerLinePen.color(); +} + +void JKQTPGraphBoxplotStyleMixin::setWhiskerLineDashOffset(qreal offset) +{ + m_whiskerLinePen.setDashOffset(offset); +} + +qreal JKQTPGraphBoxplotStyleMixin::getWhiskerLineDashOffset() const +{ + return m_whiskerLinePen.dashOffset(); +} + +void JKQTPGraphBoxplotStyleMixin::setWhiskerLineDashPattern(const QVector &pattern) +{ + m_whiskerLinePen.setDashPattern(pattern); + m_whiskerLinePen.setStyle(Qt::CustomDashLine); +} + +QVector JKQTPGraphBoxplotStyleMixin::getWhiskerLineDashPattern() const +{ + return m_whiskerLinePen.dashPattern(); +} + +void JKQTPGraphBoxplotStyleMixin::setWhiskerLineJoinStyle(Qt::PenJoinStyle style) +{ + m_whiskerLinePen.setJoinStyle(style); +} + +Qt::PenJoinStyle JKQTPGraphBoxplotStyleMixin::getWhiskerLineJoinStyle() const +{ + return m_whiskerLinePen.joinStyle(); +} + +void JKQTPGraphBoxplotStyleMixin::setWhiskerLineCapStyle(Qt::PenCapStyle style) +{ + m_whiskerLinePen.setCapStyle(style); +} + +Qt::PenCapStyle JKQTPGraphBoxplotStyleMixin::getWhiskerLineCapStyle() const +{ + return m_whiskerLinePen.capStyle(); +} + +void JKQTPGraphBoxplotStyleMixin::setWhiskerLineBrush(const QBrush &style) +{ + m_whiskerLinePen.setBrush(style); +} + +QBrush JKQTPGraphBoxplotStyleMixin::getWhiskerLineBrush() const +{ + return m_whiskerLinePen.brush(); } QPen JKQTPGraphBoxplotStyleMixin::getWhiskerPen(JKQTPEnhancedPainter &painter, JKQTBasePlotter *parent) const { - QPen pw=getLinePenForRects(painter, parent); - pw.setStyle(whiskerLineStyle); - pw.setWidthF(whiskerLineWidth); - pw.setColor(whiskerLineColor); + QPen pw=m_whiskerLinePen; + pw.setWidthF(qMax(JKQTPlotterDrawinTools::ABS_MIN_LINEWIDTH,parent->pt2px(painter, parent->getLineWidthMultiplier()*whiskerLineWidth))); + pw.setJoinStyle(Qt::MiterJoin); return pw; } @@ -161,9 +210,10 @@ void JKQTPBoxplotVerticalGraph::draw(JKQTPEnhancedPainter& painter) { #ifdef JKQTBP_AUTOTIMER JKQTPAutoOutputTimer jkaaot("JKQTPBoxplotVerticalGraph::draw"); #endif + clearHitTestData(); if (parent==nullptr) return; JKQTPDatastore* datastore=parent->getDatastore(); - if (datastore==nullptr) return; + if (datastore==nullptr) return; drawErrorsBefore(painter); @@ -183,6 +233,7 @@ void JKQTPBoxplotVerticalGraph::draw(JKQTPEnhancedPainter& painter) { if (imin<0) imin=0; if (imax<0) imax=0; + reserveHitTestData(imax-imin); //bool first=false; @@ -208,35 +259,46 @@ void JKQTPBoxplotVerticalGraph::draw(JKQTPEnhancedPainter& painter) { { painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); for (int i=imin; iget(posColumn,i); - double p25v=datastore->get(percentile25Column,i); - double p75v=datastore->get(percentile75Column,i); - double minv=datastore->get(minColumn,i); - double maxv=datastore->get(maxColumn,i); - double medianv=datastore->get(medianColumn,i); - double mean=transformY(datastore->get(meanColumn,i)); + const double xv=datastore->get(posColumn,static_cast(i)); + const double p25v=datastore->get(percentile25Column,static_cast(i)); + const double p75v=datastore->get(percentile75Column,static_cast(i)); + const double minv=datastore->get(minColumn,static_cast(i)); + const double maxv=datastore->get(maxColumn,static_cast(i)); + const double medianv=datastore->get(medianColumn,static_cast(i)); + const double meanv=datastore->get(meanColumn,static_cast(i)); QVector lines_p, lines_pw; //std::cout<<"(xv, yv) = ( "<=0 && JKQTPIsOKFloat(xv) && JKQTPIsOKFloat(p25v) && - JKQTPIsOKFloat(p75v) && JKQTPIsOKFloat(minv) && - JKQTPIsOKFloat(maxv) && JKQTPIsOKFloat(medianv) ) { + if (posColumn>=0 && JKQTPIsOKFloat(xv) ) { + + // collect single-value labels for hitTest()-data at the bottom of this loop! + QStringList labelValues, labelNames; + int labMedian=-1, labMean=-1, labMin=-1, labMax=-1, labQ25=-1, labQ75=-1; + labelNames<<"pos"; + labelValues<=0 && JKQTPIsOKFloat(minv)) { labelNames<<"\\min"; labelValues<=0 && JKQTPIsOKFloat(p25v)) { labelNames<<"q_{25}"; labelValues<=0 && JKQTPIsOKFloat(medianv)) { labelNames<<"\\median"; labelValues<=0 && JKQTPIsOKFloat(meanv)) { labelNames<<"\\mu"; labelValues<=0 && JKQTPIsOKFloat(p75v)) { labelNames<<"q_{75}"; labelValues<=0 && JKQTPIsOKFloat(maxv)) { labelNames<<"\\max"; labelValues<get(posColumn,i+1)); - else if (i-1>=0) xn=transformX(datastore->get(posColumn,i-1)); + if (i+1get(posColumn,static_cast(i+1))); + else if (i-1>=0) xn=transformX(datastore->get(posColumn,static_cast(i-1))); else xn=x+1; @@ -272,7 +334,7 @@ void JKQTPBoxplotVerticalGraph::draw(JKQTPEnhancedPainter& painter) { if (percentile25Column>=0 && percentile75Column>=0) painter.drawRect(QRectF(xmi, p75, fabs(xma-xmi), fabs(p75-p25))); if (medianColumn>=0) lines_p.append(QLineF(xmi+p.widthF()/2.0, median, xma-p.widthF()/2.0, median)); - if (meanColumn>=0 && JKQTPIsOKFloat(mean)) { + if (meanColumn>=0 && JKQTPIsOKFloat(meanv)) { plotStyledSymbol(parent, painter,x,mean); } @@ -283,6 +345,43 @@ void JKQTPBoxplotVerticalGraph::draw(JKQTPEnhancedPainter& painter) { if (lines_pw.size()>0) painter.drawLines(lines_pw); + // add hit-test graph points + if (meanColumn>=0 && JKQTPIsOKFloat(meanv)) { + QStringList sl=labelValues, sll=labelNames; + sl[labMean]="\\ul{"+sl[labMean]+"}"; + sll[labMean]="\\ul{"+sll[labMean]+"}"; + addHitTestData(xv, meanv, i, "\\ensuremath{\\begin{bmatrix}"+sll.join("\\\\")+"\\end{bmatrix}\\;=\\;\\begin{bmatrix}"+sl.join("\\\\")+"\\end{bmatrix}}"); + } + if (medianColumn>=0 && JKQTPIsOKFloat(medianv)) { + QStringList sl=labelValues, sll=labelNames; + sl[labMedian]="\\ul{"+sl[labMedian]+"}"; + sll[labMedian]="\\ul{"+sll[labMedian]+"}"; + addHitTestData(xv, medianv, i, "\\ensuremath{\\begin{bmatrix}"+sll.join("\\\\")+"\\end{bmatrix}\\;=\\;\\begin{bmatrix}"+sl.join("\\\\")+"\\end{bmatrix}}"); + } + if (minColumn>=0 && JKQTPIsOKFloat(minv)) { + QStringList sl=labelValues, sll=labelNames; + sl[labMin]="\\ul{"+sl[labMin]+"}"; + sll[labMin]="\\ul{"+sll[labMin]+"}"; + addHitTestData(xv, minv, i, "\\ensuremath{\\begin{bmatrix}"+sll.join("\\\\")+"\\end{bmatrix}\\;=\\;\\begin{bmatrix}"+sl.join("\\\\")+"\\end{bmatrix}}"); + } + if (maxColumn>=0 && JKQTPIsOKFloat(maxv)) { + QStringList sl=labelValues, sll=labelNames; + sl[labMax]="\\ul{"+sl[labMax]+"}"; + sll[labMax]="\\ul{"+sll[labMax]+"}"; + addHitTestData(xv, maxv, i, "\\ensuremath{\\begin{bmatrix}"+sll.join("\\\\")+"\\end{bmatrix}\\;=\\;\\begin{bmatrix}"+sl.join("\\\\")+"\\end{bmatrix}}"); + } + if (percentile25Column>=0 && JKQTPIsOKFloat(p25v)) { + QStringList sl=labelValues, sll=labelNames; + sl[labQ25]="\\ul{"+sl[labQ25]+"}"; + sll[labQ25]="\\ul{"+sll[labQ25]+"}"; + addHitTestData(xv, p25v, i, "\\ensuremath{\\begin{bmatrix}"+sll.join("\\\\")+"\\end{bmatrix}\\;=\\;\\begin{bmatrix}"+sl.join("\\\\")+"\\end{bmatrix}}"); + } + if (percentile75Column>=0 && JKQTPIsOKFloat(p75v)) { + QStringList sl=labelValues, sll=labelNames; + sl[labQ75]="\\ul{"+sl[labQ75]+"}"; + sll[labQ75]="\\ul{"+sll[labQ75]+"}"; + addHitTestData(xv, p75v, i, "\\ensuremath{\\begin{bmatrix}"+sll.join("\\\\")+"\\end{bmatrix}\\;=\\;\\begin{bmatrix}"+sl.join("\\\\")+"\\end{bmatrix}}"); + } //first=true; } } @@ -740,37 +839,47 @@ void JKQTPBoxplotHorizontalGraph::draw(JKQTPEnhancedPainter& painter) { //bool first=false; for (int i=imin; iget(posColumn,i); - double p25v=datastore->get(percentile25Column,i); - double p75v=datastore->get(percentile75Column,i); - double minv=datastore->get(minColumn,i); - double maxv=datastore->get(maxColumn,i); - double medianv=datastore->get(medianColumn,i); - double mean=transformX(datastore->get(meanColumn,i)); + const double yv=datastore->get(posColumn,static_cast(i)); + const double p25v=datastore->get(percentile25Column,static_cast(i)); + const double p75v=datastore->get(percentile75Column,static_cast(i)); + const double minv=datastore->get(minColumn,static_cast(i)); + const double maxv=datastore->get(maxColumn,static_cast(i)); + const double medianv=datastore->get(medianColumn,static_cast(i)); + const double meanv=datastore->get(meanColumn,static_cast(i)); QVector lines_p, lines_pw; //std::cout<<"(xv, yv) = ( "<=0 && JKQTPIsOKFloat(yv) && - JKQTPIsOKFloat(p25v) && - JKQTPIsOKFloat(p75v) && - JKQTPIsOKFloat(minv) && - JKQTPIsOKFloat(maxv) && - JKQTPIsOKFloat(medianv)) { + if (posColumn>=0 && JKQTPIsOKFloat(yv) ) { + + + // collect single-value labels for hitTest()-data at the bottom of this loop! + QStringList labelValues, labelNames; + int labMedian=-1, labMean=-1, labMin=-1, labMax=-1, labQ25=-1, labQ75=-1; + labelNames<<"pos"; + labelValues<=0 && JKQTPIsOKFloat(minv)) { labelNames<<"\\min"; labelValues<=0 && JKQTPIsOKFloat(p25v)) { labelNames<<"q_{25}"; labelValues<=0 && JKQTPIsOKFloat(medianv)) { labelNames<<"\\median"; labelValues<=0 && JKQTPIsOKFloat(meanv)) { labelNames<<"\\mu"; labelValues<=0 && JKQTPIsOKFloat(p75v)) { labelNames<<"q_{75}"; labelValues<=0 && JKQTPIsOKFloat(maxv)) { labelNames<<"\\max"; labelValues<=0) minstop=median; @@ -781,8 +890,8 @@ void JKQTPBoxplotHorizontalGraph::draw(JKQTPEnhancedPainter& painter) { else if (percentile75Column<0 && meanColumn>=0) maxstop=mean; double yn=y+1; - if (i+1get(posColumn,i+1)); - else if (i-1>=0) yn=transformY(datastore->get(posColumn,i-1)); + if (i+1get(posColumn,static_cast(i+1))); + else if (i-1>=0) yn=transformY(datastore->get(posColumn,static_cast(i-1))); else yn=y+1; double delta=fabs(yn-y); double w=((boxwidth_real>0)?boxwidth_real:(delta))*getBoxWidth(); @@ -808,7 +917,7 @@ void JKQTPBoxplotHorizontalGraph::draw(JKQTPEnhancedPainter& painter) { if (percentile25Column>=0 && percentile75Column>=0) painter.drawRect(QRectF(p25, qMin(yma,ymi), fabs(p75-p25), fabs(yma-ymi))); if (medianColumn>=0) lines_p.append(QLineF(median, ymi-p.widthF()/2.0, median, yma+p.widthF()/2.0)); - if (meanColumn>=0 && JKQTPIsOKFloat(mean)) { + if (meanColumn>=0 && JKQTPIsOKFloat(meanv)) { plotStyledSymbol(parent, painter, mean, y); } @@ -817,7 +926,45 @@ void JKQTPBoxplotHorizontalGraph::draw(JKQTPEnhancedPainter& painter) { if (lines_p.size()>0) painter.drawLines(lines_p); painter.setPen(pw); if (lines_pw.size()>0) painter.drawLines(lines_pw); - + + + // add hit-test graph points + if (meanColumn>=0 && JKQTPIsOKFloat(meanv)) { + QStringList sl=labelValues, sll=labelNames; + sl[labMean]="\\ul{"+sl[labMean]+"}"; + sll[labMean]="\\ul{"+sll[labMean]+"}"; + addHitTestData(meanv, yv, i, "\\ensuremath{\\begin{bmatrix}"+sll.join("\\\\")+"\\end{bmatrix}\\;=\\;\\begin{bmatrix}"+sl.join("\\\\")+"\\end{bmatrix}}"); + } + if (medianColumn>=0 && JKQTPIsOKFloat(medianv)) { + QStringList sl=labelValues, sll=labelNames; + sl[labMedian]="\\ul{"+sl[labMedian]+"}"; + sll[labMedian]="\\ul{"+sll[labMedian]+"}"; + addHitTestData(medianv, yv, i, "\\ensuremath{\\begin{bmatrix}"+sll.join("\\\\")+"\\end{bmatrix}\\;=\\;\\begin{bmatrix}"+sl.join("\\\\")+"\\end{bmatrix}}"); + } + if (minColumn>=0 && JKQTPIsOKFloat(minv)) { + QStringList sl=labelValues, sll=labelNames; + sl[labMin]="\\ul{"+sl[labMin]+"}"; + sll[labMin]="\\ul{"+sll[labMin]+"}"; + addHitTestData(minv, yv, i, "\\ensuremath{\\begin{bmatrix}"+sll.join("\\\\")+"\\end{bmatrix}\\;=\\;\\begin{bmatrix}"+sl.join("\\\\")+"\\end{bmatrix}}"); + } + if (maxColumn>=0 && JKQTPIsOKFloat(maxv)) { + QStringList sl=labelValues, sll=labelNames; + sl[labMax]="\\ul{"+sl[labMax]+"}"; + sll[labMax]="\\ul{"+sll[labMax]+"}"; + addHitTestData(maxv, yv, i, "\\ensuremath{\\begin{bmatrix}"+sll.join("\\\\")+"\\end{bmatrix}\\;=\\;\\begin{bmatrix}"+sl.join("\\\\")+"\\end{bmatrix}}"); + } + if (percentile25Column>=0 && JKQTPIsOKFloat(p25v)) { + QStringList sl=labelValues, sll=labelNames; + sl[labQ25]="\\ul{"+sl[labQ25]+"}"; + sll[labQ25]="\\ul{"+sll[labQ25]+"}"; + addHitTestData(p25v, yv, i, "\\ensuremath{\\begin{bmatrix}"+sll.join("\\\\")+"\\end{bmatrix}\\;=\\;\\begin{bmatrix}"+sl.join("\\\\")+"\\end{bmatrix}}"); + } + if (percentile75Column>=0 && JKQTPIsOKFloat(p75v)) { + QStringList sl=labelValues, sll=labelNames; + sl[labQ75]="\\ul{"+sl[labQ75]+"}"; + sll[labQ75]="\\ul{"+sll[labQ75]+"}"; + addHitTestData(p75v, yv, i, "\\ensuremath{\\begin{bmatrix}"+sll.join("\\\\")+"\\end{bmatrix}\\;=\\;\\begin{bmatrix}"+sl.join("\\\\")+"\\end{bmatrix}}"); + } } } @@ -886,53 +1033,100 @@ void JKQTPBoxplotVerticalElement::draw(JKQTPEnhancedPainter& painter) { - double xv=pos; - double p25v=percentile25; - double p75v=percentile75; - double minv=min; - double maxv=max; - double medianv=median; + const double xv=pos; + const double p25v=percentile25; + const double p75v=percentile75; + const double minv=min; + const double maxv=max; + const double medianv=median; + const double meanv=mean; //std::cout<<"(xv, yv) = ( "<pt2px(painter, getBoxWidth()); double xma=x+w/2.0; double xmi=x-w/2.0; painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); painter.setPen(p); - { + if (JKQTPIsOKFloat(p25v) && JKQTPIsOKFloat(p75v)) { painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); painter.setBrush(b); painter.drawRect(QRectF(xmi, p75, fabs(xma-xmi), fabs(p75-p25))); + if (JKQTPIsOKFloat(p25v)) { + QStringList sl=labelValues, sll=labelNames; + sl[labQ25]="\\ul{"+sl[labQ25]+"}"; + sll[labQ25]="\\ul{"+sll[labQ25]+"}"; + addHitTestData(xv, p25v, "\\ensuremath{\\begin{bmatrix}"+sll.join("\\\\")+"\\end{bmatrix}\\;=\\;\\begin{bmatrix}"+sl.join("\\\\")+"\\end{bmatrix}}"); + } + if (JKQTPIsOKFloat(p75v)) { + QStringList sl=labelValues, sll=labelNames; + sl[labQ75]="\\ul{"+sl[labQ75]+"}"; + sll[labQ75]="\\ul{"+sll[labQ75]+"}"; + addHitTestData(xv, p75v, "\\ensuremath{\\begin{bmatrix}"+sll.join("\\\\")+"\\end{bmatrix}\\;=\\;\\begin{bmatrix}"+sl.join("\\\\")+"\\end{bmatrix}}"); + } } - if (drawMedian) { + if (drawMedian && JKQTPIsOKFloat(medianv)) { painter.drawLine(QLineF(xmi, median, xma, median)); + if (JKQTPIsOKFloat(medianv)) { + QStringList sl=labelValues, sll=labelNames; + sl[labMedian]="\\ul{"+sl[labMedian]+"}"; + sll[labMedian]="\\ul{"+sll[labMedian]+"}"; + addHitTestData(xv, medianv, "\\ensuremath{\\begin{bmatrix}"+sll.join("\\\\")+"\\end{bmatrix}\\;=\\;\\begin{bmatrix}"+sl.join("\\\\")+"\\end{bmatrix}}"); + } } if (drawMinMax) { - painter.drawLine(QLineF(x-w/4.0, max, x+w/4.0, max)); - painter.drawLine(QLineF(x-w/4.0, min, x+w/4.0, min)); + if (JKQTPIsOKFloat(maxv)) painter.drawLine(QLineF(x-w/4.0, max, x+w/4.0, max)); + if (JKQTPIsOKFloat(minv)) painter.drawLine(QLineF(x-w/4.0, min, x+w/4.0, min)); painter.setPen(pw); - painter.drawLine(QLineF(x, max, x, p75)); - painter.drawLine(QLineF(x, min, x, p25)); + if (JKQTPIsOKFloat(maxv)) painter.drawLine(QLineF(x, max, x, p75)); + if (JKQTPIsOKFloat(minv)) painter.drawLine(QLineF(x, min, x, p25)); + if (JKQTPIsOKFloat(minv)) { + QStringList sl=labelValues, sll=labelNames; + sl[labMin]="\\ul{"+sl[labMin]+"}"; + sll[labMin]="\\ul{"+sll[labMin]+"}"; + addHitTestData(xv, minv, "\\ensuremath{\\begin{bmatrix}"+sll.join("\\\\")+"\\end{bmatrix}\\;=\\;\\begin{bmatrix}"+sl.join("\\\\")+"\\end{bmatrix}}"); + } + if (JKQTPIsOKFloat(maxv)) { + QStringList sl=labelValues, sll=labelNames; + sl[labMax]="\\ul{"+sl[labMax]+"}"; + sll[labMax]="\\ul{"+sll[labMax]+"}"; + addHitTestData(xv, maxv, "\\ensuremath{\\begin{bmatrix}"+sll.join("\\\\")+"\\end{bmatrix}\\;=\\;\\begin{bmatrix}"+sl.join("\\\\")+"\\end{bmatrix}}"); + } } - if (drawMean) { - double mean=transformY(this->mean); + if (drawMean && JKQTPIsOKFloat(meanv)) { + double mean=transformY(meanv); plotStyledSymbol(parent, painter, x, mean); + if (JKQTPIsOKFloat(meanv)) { + QStringList sl=labelValues, sll=labelNames; + sl[labMean]="\\ul{"+sl[labMean]+"}"; + sll[labMean]="\\ul{"+sll[labMean]+"}"; + addHitTestData(xv, meanv, "\\ensuremath{\\begin{bmatrix}"+sll.join("\\\\")+"\\end{bmatrix}\\;=\\;\\begin{bmatrix}"+sl.join("\\\\")+"\\end{bmatrix}}"); + } } @@ -1267,28 +1461,36 @@ void JKQTPBoxplotHorizontalElement::draw(JKQTPEnhancedPainter& painter) { QPen pw=getWhiskerPen(painter, parent); QPen np(Qt::NoPen); QBrush b=getFillBrush(painter, parent); - double yv=pos; - double p25v=percentile25; - double p75v=percentile75; - double minv=min; - double maxv=max; - double medianv=median; + const double yv=pos; + const double p25v=percentile25; + const double p75v=percentile75; + const double minv=min; + const double maxv=max; + const double medianv=median; + const double meanv=mean; //std::cout<<"(xv, yv) = ( "<pt2px(painter, getBoxWidth()); double yma=y+w/2.0; @@ -1296,27 +1498,62 @@ void JKQTPBoxplotHorizontalElement::draw(JKQTPEnhancedPainter& painter) { painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); painter.setPen(p); - { + if (JKQTPIsOKFloat(p25v) && JKQTPIsOKFloat(p75v)) { painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); painter.setBrush(b); painter.drawRect(QRectF(p25, ymi, fabs(p75-p25), fabs(yma-ymi))); + if (JKQTPIsOKFloat(p25v)) { + QStringList sl=labelValues, sll=labelNames; + sl[labQ25]="\\ul{"+sl[labQ25]+"}"; + sll[labQ25]="\\ul{"+sll[labQ25]+"}"; + addHitTestData(p25v, yv, "\\ensuremath{\\begin{bmatrix}"+sll.join("\\\\")+"\\end{bmatrix}\\;=\\;\\begin{bmatrix}"+sl.join("\\\\")+"\\end{bmatrix}}"); + } + if (JKQTPIsOKFloat(p75v)) { + QStringList sl=labelValues, sll=labelNames; + sl[labQ75]="\\ul{"+sl[labQ75]+"}"; + sll[labQ75]="\\ul{"+sll[labQ75]+"}"; + addHitTestData(p75v, yv, "\\ensuremath{\\begin{bmatrix}"+sll.join("\\\\")+"\\end{bmatrix}\\;=\\;\\begin{bmatrix}"+sl.join("\\\\")+"\\end{bmatrix}}"); + } } - if (drawMedian) { + if (drawMedian && JKQTPIsOKFloat(medianv)) { painter.drawLine(QLineF(median, ymi, median, yma)); - } + if (JKQTPIsOKFloat(medianv)) { + QStringList sl=labelValues, sll=labelNames; + sl[labMedian]="\\ul{"+sl[labMedian]+"}"; + sll[labMedian]="\\ul{"+sll[labMedian]+"}"; + addHitTestData(medianv, yv, "\\ensuremath{\\begin{bmatrix}"+sll.join("\\\\")+"\\end{bmatrix}\\;=\\;\\begin{bmatrix}"+sl.join("\\\\")+"\\end{bmatrix}}"); + } } if (drawMinMax) { - painter.drawLine(QLineF(max, y-w/4.0, max, y+w/4.0)); - painter.drawLine(QLineF(min, y-w/4.0, min, y+w/4.0)); + if (JKQTPIsOKFloat(maxv)) painter.drawLine(QLineF(max, y-w/4.0, max, y+w/4.0)); + if (JKQTPIsOKFloat(minv)) painter.drawLine(QLineF(min, y-w/4.0, min, y+w/4.0)); painter.setPen(pw); - painter.drawLine(QLineF(max, y, p75, y)); - painter.drawLine(QLineF(min, y, p25, y)); + if (JKQTPIsOKFloat(maxv)) painter.drawLine(QLineF(max, y, p75, y)); + if (JKQTPIsOKFloat(minv)) painter.drawLine(QLineF(min, y, p25, y)); + if (JKQTPIsOKFloat(minv)) { + QStringList sl=labelValues, sll=labelNames; + sl[labMin]="\\ul{"+sl[labMin]+"}"; + sll[labMin]="\\ul{"+sll[labMin]+"}"; + addHitTestData(minv, yv, "\\ensuremath{\\begin{bmatrix}"+sll.join("\\\\")+"\\end{bmatrix}\\;=\\;\\begin{bmatrix}"+sl.join("\\\\")+"\\end{bmatrix}}"); + } + if (JKQTPIsOKFloat(maxv)) { + QStringList sl=labelValues, sll=labelNames; + sl[labMax]="\\ul{"+sl[labMax]+"}"; + sll[labMax]="\\ul{"+sll[labMax]+"}"; + addHitTestData(maxv, yv, "\\ensuremath{\\begin{bmatrix}"+sll.join("\\\\")+"\\end{bmatrix}\\;=\\;\\begin{bmatrix}"+sl.join("\\\\")+"\\end{bmatrix}}"); + } } - if (drawMean) { - double mean=transformY(this->mean); + if (drawMean && JKQTPIsOKFloat(meanv)) { + double mean=transformY(meanv); plotStyledSymbol(parent, painter, mean, y); + if (JKQTPIsOKFloat(meanv)) { + QStringList sl=labelValues, sll=labelNames; + sl[labMean]="\\ul{"+sl[labMean]+"}"; + sll[labMean]="\\ul{"+sll[labMean]+"}"; + addHitTestData(meanv, yv, "\\ensuremath{\\begin{bmatrix}"+sll.join("\\\\")+"\\end{bmatrix}\\;=\\;\\begin{bmatrix}"+sl.join("\\\\")+"\\end{bmatrix}}"); + } } } diff --git a/lib/jkqtplotter/jkqtpgraphsboxplot.h b/lib/jkqtplotter/jkqtpgraphsboxplot.h index 84944bafaf..121bde2f81 100644 --- a/lib/jkqtplotter/jkqtpgraphsboxplot.h +++ b/lib/jkqtplotter/jkqtpgraphsboxplot.h @@ -49,11 +49,9 @@ class JKQTP_LIB_EXPORT JKQTPGraphBoxplotStyleMixin: public JKQTPGraphLineStyleMi - /*! \copydoc whiskerStyle - \see see whiskerStyle for details */ - void setWhiskerLineStyle(const Qt::PenStyle & __value); - /*! \copydoc whiskerStyle - \see see whiskerStyle for details */ + /*! \brief set the line style of whisker lines */ + void setWhiskerLineStyle(Qt::PenStyle __value); + /*! \brief get the line style of whisker lines */ Qt::PenStyle getWhiskerLineStyle() const; /*! \copydoc boxWidth @@ -63,20 +61,58 @@ class JKQTP_LIB_EXPORT JKQTPGraphBoxplotStyleMixin: public JKQTPGraphLineStyleMi \see see boxWidth for details */ double getBoxWidth() const; - /*! \copydoc whiskerLineWidth - \see see whiskerLineWidth for details */ + /*! \brief set the width [pt] of whisker lines */ void setWhiskerLineWidth(double __value); - /*! \copydoc whiskerLineWidth - \see see whiskerLineWidth for details */ + /*! \brief get the width [pt] of whisker lines */ double getWhiskerLineWidth() const; - /*! \copydoc whiskerLineColor - \see see whiskerLineColor for details */ + /*! \brief set the color of whisker lines */ void setWhiskerLineColor(QColor __value); - /*! \copydoc whiskerLineColor - \see see whiskerLineColor for details */ + /*! \brief get the color of whisker lines */ QColor getWhiskerLineColor() const; + + /** \brief sets the dash offset for a custom dash style of whisker lines + * \see https://doc.qt.io/qt-5/qpen.html#setDashOffset + */ + void setWhiskerLineDashOffset(qreal offset); + /** \brief returns the dash offset for a custom dash style of whisker lines + * \see https://doc.qt.io/qt-5/qpen.html#setDashOffset + */ + qreal getWhiskerLineDashOffset() const; + /** \brief sets the dash pattern for a custom dash style of whisker lines + * \see https://doc.qt.io/qt-5/qpen.html#setDashPattern + */ + void setWhiskerLineDashPattern(const QVector &pattern); + /** \brief gets the dash pattern for a custom dash style of whisker lines + * \see https://doc.qt.io/qt-5/qpen.html#setDashPattern + */ + QVector getWhiskerLineDashPattern() const; + /** \brief sets the join style of whisker lines + * \see https://doc.qt.io/qt-5/qpen.html#setJoinStyle + */ + void setWhiskerLineJoinStyle(Qt::PenJoinStyle style); + /** \brief returns the join style of whisker lines + * \see https://doc.qt.io/qt-5/qpen.html#setJoinStyle + */ + Qt::PenJoinStyle getWhiskerLineJoinStyle() const; + /** \brief sets the cap style of whisker lines + * \see https://doc.qt.io/qt-5/qpen.html#setCapStyle + */ + void setWhiskerLineCapStyle(Qt::PenCapStyle style); + /** \brief gets the cap style of whisker lines + * \see https://doc.qt.io/qt-5/qpen.html#setCapStyle + */ + Qt::PenCapStyle getWhiskerLineCapStyle() const; + /** \brief sets the brush used to fill the line area of whisker lines + * \see https://doc.qt.io/qt-5/qpen.html#setBrush + */ + void setWhiskerLineBrush(const QBrush& style); + /** \brief gets the brush used to fill the line area of whisker lines + * \see https://doc.qt.io/qt-5/qpen.html#setBrush + */ + QBrush getWhiskerLineBrush() const; + /** \brief build a pen to be used for drawing whiskers */ QPen getWhiskerPen(JKQTPEnhancedPainter &painter, JKQTBasePlotter *parent) const; @@ -85,13 +121,11 @@ class JKQTP_LIB_EXPORT JKQTPGraphBoxplotStyleMixin: public JKQTPGraphLineStyleMi void setBoxplotColor(QColor c, JKQTBasePlotter *parent); private: /** \brief line style of the whisker lines */ - Qt::PenStyle whiskerLineStyle; + QPen m_whiskerLinePen; /** \brief line width (in pt) of the whisker lines */ double whiskerLineWidth; - /** \brief color of the whisker lines */ - QColor whiskerLineColor; /** \brief width of box in percent of distance between the current two posColumn values - * if we only plot one box&whiskers then this is the width in plot coordinates */ + * if we only plot one box&whiskers then this is the width in pt */ double boxWidth; }; @@ -113,6 +147,10 @@ class JKQTP_LIB_EXPORT JKQTPGraphBoxplotStyleMixin: public JKQTPGraphLineStyleMi \image html boxplots.png + This class also implements hitTest() in a way that displays all data of the boxplot in the tooltips: + + \image html tooltip_boxplot.png + \note There are additional classes to draw a single boxplot element: JKQTPBoxplotHorizontalElement and JKQTPBoxplotVerticalElement. In these you can set the data values, as they are NOT drawn from a data column. This can be useful, if you e.g. want to draw the statistical properties of a distribution. diff --git a/lib/jkqtplotter/jkqtpgraphsevaluatedfunction.h b/lib/jkqtplotter/jkqtpgraphsevaluatedfunction.h index 89821bf3ff..3b90e202d3 100644 --- a/lib/jkqtplotter/jkqtpgraphsevaluatedfunction.h +++ b/lib/jkqtplotter/jkqtpgraphsevaluatedfunction.h @@ -272,13 +272,13 @@ class JKQTP_LIB_EXPORT JKQTPXFunctionLineGraph: public JKQTPGraph, public JKQTPG /*! \copydoc errorColor \see see errorColor for details */ - inline virtual void setErrorColor(const QColor & __value) + inline virtual void setErrorLineColor(const QColor & __value) { this->errorColor = __value; } /*! \copydoc errorColor \see see errorColor for details */ - inline virtual QColor getErrorColor() const + inline virtual QColor getErrorLineColor() const { return this->errorColor; } @@ -296,7 +296,7 @@ class JKQTP_LIB_EXPORT JKQTPXFunctionLineGraph: public JKQTPGraph, public JKQTPG } /*! \copydoc errorFillStyle \see see errorFillStyle for details */ - inline virtual void setErrorFillStyle(const Qt::BrushStyle & __value) + inline virtual void setErrorFillStyle(Qt::BrushStyle __value) { this->errorFillStyle = __value; } @@ -308,13 +308,13 @@ class JKQTP_LIB_EXPORT JKQTPXFunctionLineGraph: public JKQTPGraph, public JKQTPG } /*! \copydoc errorStyle \see see errorStyle for details */ - inline virtual void setErrorStyle(const Qt::PenStyle & __value) + inline virtual void setErrorLineStyle(Qt::PenStyle __value) { this->errorStyle = __value; } /*! \copydoc errorStyle \see see errorStyle for details */ - inline virtual Qt::PenStyle getErrorStyle() const + inline virtual Qt::PenStyle getErrorLineStyle() const { return this->errorStyle; } diff --git a/lib/jkqtplotter/jkqtpgraphsfilledcurve.cpp b/lib/jkqtplotter/jkqtpgraphsfilledcurve.cpp index 35e2049816..35ded99016 100644 --- a/lib/jkqtplotter/jkqtpgraphsfilledcurve.cpp +++ b/lib/jkqtplotter/jkqtpgraphsfilledcurve.cpp @@ -71,11 +71,10 @@ JKQTPFilledCurveYGraph::JKQTPFilledCurveYGraph(JKQTPlotter *parent): JKQTPFilledCurveXErrorGraph::JKQTPFilledCurveXErrorGraph(JKQTBasePlotter *parent): - JKQTPFilledCurveXGraph(parent), JKQTPYGraphErrors(getLineColor(), parent) + JKQTPFilledCurveXGraph(parent) { setErrorColorFromGraphColor(getLineColor()); - if (parentPlotStyle>=0) setErrorStyleFromPen(parent->getPlotStyle(parentPlotStyle)); - + initErrorStyle(parent, parentPlotStyle); } JKQTPFilledCurveXErrorGraph::JKQTPFilledCurveXErrorGraph(JKQTPlotter *parent): @@ -97,10 +96,10 @@ void JKQTPFilledCurveXErrorGraph::drawErrorsAfter(JKQTPEnhancedPainter &painter) } JKQTPFilledCurveYErrorGraph::JKQTPFilledCurveYErrorGraph(JKQTBasePlotter *parent): - JKQTPFilledCurveYGraph(parent), JKQTPXGraphErrors(getLineColor(), parent) + JKQTPFilledCurveYGraph(parent) { setErrorColorFromGraphColor(getLineColor()); - if (parentPlotStyle>=0) setErrorStyleFromPen(parent->getPlotStyle(parentPlotStyle)); + initErrorStyle(parent, parentPlotStyle); } diff --git a/lib/jkqtplotter/jkqtpgraphsgeometric.cpp b/lib/jkqtplotter/jkqtpgraphsgeometric.cpp index ce37c05a95..f98dd51f15 100644 --- a/lib/jkqtplotter/jkqtpgraphsgeometric.cpp +++ b/lib/jkqtplotter/jkqtpgraphsgeometric.cpp @@ -225,6 +225,7 @@ bool JKQTPGeoText::getYMinMax(double& miny, double& maxy, double& smallestGreate } void JKQTPGeoText::draw(JKQTPEnhancedPainter& painter) { + clearHitTestData(); painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); parent->getMathText()->setFontRomanOrSpecial(getTextFontName()); parent->getMathText()->setFontSize(getTextFontSize()*parent->getFontSizeMultiplier()); @@ -300,10 +301,16 @@ bool JKQTPGeoLine::getYMinMax(double& miny, double& maxy, double& smallestGreate } void JKQTPGeoLine::draw(JKQTPEnhancedPainter& painter) { + clearHitTestData(); + reserveHitTestData(2); painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); painter.setPen(getLinePen(painter, parent)); QLineF l(QPointF(transformX(x1), transformY(y1)), QPointF(transformX(x2), transformY(y2))); - if (l.length()>0) painter.drawLine(l); + if (l.length()>0) { + painter.drawLine(l); + addHitTestData(x1, y1); + addHitTestData(x2, y2); + } } @@ -384,6 +391,8 @@ bool JKQTPGeoInfiniteLine::getYMinMax(double& miny, double& maxy, double& smalle } void JKQTPGeoInfiniteLine::draw(JKQTPEnhancedPainter& painter) { + clearHitTestData(); + reserveHitTestData(2); double xmin=parent->getXAxis()->getMin(); double xmax=parent->getXAxis()->getMax(); @@ -503,7 +512,14 @@ void JKQTPGeoInfiniteLine::draw(JKQTPEnhancedPainter& painter) { painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); painter.setPen(getLinePen(painter, parent)); QLineF l(QPointF(transformX(x1), transformY(y1)), QPointF(transformX(x2), transformY(y2))); - if (l.length()>0) painter.drawLine(l); + if (l.length()>0) { + painter.drawLine(l); + addHitTestData(x, y, formatHitTestDefaultLabel(x,y)+ + QString(", \\ensuremath{\\mathrm{\\mathbf{d}}y/\\mathrm{\\mathbf{d}}x\\;=\\;%1/%2\\;=\\;%3\\;=\\;%4\\degree}").arg(QString::fromStdString(jkqtp_floattolatexstr(dy, 3))).arg(QString::fromStdString(jkqtp_floattolatexstr(dx, 3))).arg(QString::fromStdString(jkqtp_floattolatexstr(dy/dx, 3))).arg(QString::fromStdString(jkqtp_floattolatexstr(atan2(dy,dx), 1)))); + addHitTestData(x1, y1); + addHitTestData(x2, y2); + } + } @@ -625,10 +641,16 @@ bool JKQTPGeoPolyLines::getYMinMax(double& miny, double& maxy, double& smallestG } void JKQTPGeoPolyLines::draw(JKQTPEnhancedPainter& painter) { + clearHitTestData(); + reserveHitTestData(points.size()); + QPainterPath path=transformToLinePath(points); painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); painter.setPen(getLinePen(painter, parent)); painter.drawPath(path); + for (const auto& p:points) { + addHitTestData(p.x(), p.y()); + } } @@ -754,11 +776,16 @@ QPolygonF JKQTPGeoRectangle::getPolygon() { } void JKQTPGeoRectangle::draw(JKQTPEnhancedPainter& painter) { + clearHitTestData(); QPolygonF poly=getPolygon(); + reserveHitTestData(poly.size()); QPolygonF rect; for (int i=0; i=0) setErrorStyleFromPen(parent->getPlotStyle(parentPlotStyle)); - + initErrorStyle(parent, parentPlotStyle); } JKQTPImpulsesHorizontalErrorGraph::JKQTPImpulsesHorizontalErrorGraph(JKQTPlotter *parent): @@ -288,10 +287,10 @@ void JKQTPImpulsesHorizontalErrorGraph::drawErrorsAfter(JKQTPEnhancedPainter &pa } JKQTPImpulsesVerticalErrorGraph::JKQTPImpulsesVerticalErrorGraph(JKQTBasePlotter *parent): - JKQTPImpulsesVerticalGraph(parent), JKQTPYGraphErrors(getLineColor(), parent) + JKQTPImpulsesVerticalGraph(parent) { setErrorColorFromGraphColor(getLineColor()); - if (parentPlotStyle>=0) setErrorStyleFromPen(parent->getPlotStyle(parentPlotStyle)); + initErrorStyle(parent, parentPlotStyle); } JKQTPImpulsesVerticalErrorGraph::JKQTPImpulsesVerticalErrorGraph(JKQTPlotter *parent): diff --git a/lib/jkqtplotter/jkqtpgraphspeakstream.cpp b/lib/jkqtplotter/jkqtpgraphspeakstream.cpp index 63511926ec..096c07d4d6 100644 --- a/lib/jkqtplotter/jkqtpgraphspeakstream.cpp +++ b/lib/jkqtplotter/jkqtpgraphspeakstream.cpp @@ -114,6 +114,7 @@ void JKQTPPeakStreamGraph::draw(JKQTPEnhancedPainter &painter) const double xv=datastore->get(dataColumn,static_cast(i)); if (JKQTPIsOKFloat(xv)) { lines<get(dataColumn,static_cast(i)); if (JKQTPIsOKFloat(yv)) { lines<centerColor; } -void JKQTPHorizontalRange::setCenterStyle(const Qt::PenStyle &__value) +void JKQTPHorizontalRange::setCenterStyle(Qt::PenStyle __value) { this->centerStyle = __value; } diff --git a/lib/jkqtplotter/jkqtpgraphsrange.h b/lib/jkqtplotter/jkqtpgraphsrange.h index 894a796ee7..2a89484c82 100644 --- a/lib/jkqtplotter/jkqtpgraphsrange.h +++ b/lib/jkqtplotter/jkqtpgraphsrange.h @@ -90,7 +90,7 @@ class JKQTP_LIB_EXPORT JKQTPHorizontalRange: public JKQTPGraph, public JKQTPGrap QColor getCenterColor() const; /*! \copydoc centerStyle \see see centerStyle for details */ - void setCenterStyle(const Qt::PenStyle & __value); + void setCenterStyle(Qt::PenStyle __value); /*! \copydoc centerStyle \see see centerStyle for details */ Qt::PenStyle getCenterStyle() const; diff --git a/lib/jkqtplotter/jkqtpgraphsscatter.cpp b/lib/jkqtplotter/jkqtpgraphsscatter.cpp index 8b911789e7..ff8a27d3ee 100644 --- a/lib/jkqtplotter/jkqtpgraphsscatter.cpp +++ b/lib/jkqtplotter/jkqtpgraphsscatter.cpp @@ -108,21 +108,13 @@ void JKQTPXYLineGraph::draw(JKQTPEnhancedPainter& painter) { if (isHighlighted() && getSymbolType()!=JKQTPNoSymbol) { //JKQTPPlotSymbol(painter, x, y, JKQTPFilledCircle, parent->pt2px(painter, symbolSize*1.5), parent->pt2px(painter, symbolWidth*parent->getLineWidthMultiplier()), penSelection.color(), penSelection.color()); } - plotStyledSymbol(parent, painter, x, y); - /*if (drawLine && first) { - double xl1=xold; - double yl1=yold; - double xl2=x; - double yl2=y; - lines.append(QLineF(xl1, yl1, xl2, yl2)); - }*/ + if ((!parent->getXAxis()->isLogAxis() || xv>0.0) && (!parent->getYAxis()->isLogAxis() || yv>0.0) ) { + plotStyledSymbol(parent, painter, x, y); + } if (drawLine) { linesP<getDatastore(); if (datastore==nullptr) return; @@ -109,6 +111,7 @@ void JKQTPSingleColumnSymbolsGraph::draw(JKQTPEnhancedPainter &painter) } if (imin<0) imin=0; if (imax<0) imax=0; + reserveHitTestData(imax-imin); std::random_device rd; // random number generators: std::minstd_rand gen{rd()}; @@ -152,6 +155,7 @@ void JKQTPSingleColumnSymbolsGraph::draw(JKQTPEnhancedPainter &painter) plotSymbols.append(QPointF(x,y)); if (JKQTPIsOKFloat(xv) && JKQTPIsOKFloat(yv)) { plotStyledSymbol(parent, painter, x, y); + addHitTestData(xv, yv,iii, datastore); } } } else { @@ -178,6 +182,7 @@ void JKQTPSingleColumnSymbolsGraph::draw(JKQTPEnhancedPainter &painter) if (JKQTPIsOKFloat(xv) && JKQTPIsOKFloat(yv)) { plotSymbols.append(QPointF(x,y)); plotStyledSymbol(parent, painter, x, y); + addHitTestData(xv, yv,iii, datastore); } } } diff --git a/lib/jkqtplotter/jkqtplotter.cpp b/lib/jkqtplotter/jkqtplotter.cpp index ec3a96b5a1..8520b6eae7 100644 --- a/lib/jkqtplotter/jkqtplotter.cpp +++ b/lib/jkqtplotter/jkqtplotter.cpp @@ -80,6 +80,32 @@ JKQTPlotter::JKQTPlotter(bool datastore_internal, QWidget* parent, JKQTPDatastor setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + actgrpMouseLeft=new QActionGroup(this); + actMouseLeftAsDefault=actgrpMouseLeft->addAction(QIcon(":/JKQTPlotter/jkqtp_mouseact_default.png"), tr("Default Tool")); + actMouseLeftAsDefault->setToolTip(tr("switch back to the default mouse action/tool (left button, no modifiers)")); + actMouseLeftAsDefault->setCheckable(true); + actMouseLeftAsPanView=actgrpMouseLeft->addAction(QIcon(":/JKQTPlotter/jkqtp_mouseact_drag.png"), tr("Pan View Tool")); + actMouseLeftAsPanView->setToolTip(tr("switch on the pan view tool (left button, no modifiers)")); + actMouseLeftAsPanView->setCheckable(true); + actMouseLeftAsZoomRect=actgrpMouseLeft->addAction(QIcon(":/JKQTPlotter/jkqtp_mouseact_zoomrect.png"), tr("Zoom Rectangle Tool")); + actMouseLeftAsZoomRect->setToolTip(tr("switch on the zoom rectangle tool (left button, no modifiers)")); + actMouseLeftAsZoomRect->setCheckable(true); + actMouseLeftAsRuler=actgrpMouseLeft->addAction(QIcon(":/JKQTPlotter/jkqtp_mouseact_ruler.png"), tr("Ruler Tool")); + actMouseLeftAsRuler->setToolTip(tr("switch on the ruler tool (left button, no modifiers)")); + actMouseLeftAsRuler->setCheckable(true); + actMouseLeftAsToolTip=actgrpMouseLeft->addAction(QIcon(":/JKQTPlotter/jkqtp_mouseact_tooltip.png"), tr("Data Tooltip Tool")); + actMouseLeftAsToolTip->setToolTip(tr("switch on the data tooltip tool (left button, no modifiers)")); + actMouseLeftAsToolTip->setCheckable(true); + actgrpMouseLeft->setExclusive(true); + actMouseLeftAsDefault->setChecked(true); + + connect(actMouseLeftAsDefault, SIGNAL(triggered()), this, SLOT(resetMouseLeftAction())); + connect(actMouseLeftAsRuler, SIGNAL(triggered()), this, SLOT(setMouseLeftActionAsRuler())); + connect(actMouseLeftAsToolTip, SIGNAL(triggered()), this, SLOT(setMouseLeftActionAsToolTip())); + connect(actMouseLeftAsPanView, SIGNAL(triggered()), this, SLOT(setMouseLeftActionAsPanView())); + connect(actMouseLeftAsZoomRect, SIGNAL(triggered()), this, SLOT(setMouseLeftActionAsZoomRect())); + + toolbar=new JKVanishQToolBar(this); toolbar->clear(); toolbar->move(1,1); @@ -88,12 +114,11 @@ JKQTPlotter::JKQTPlotter(bool datastore_internal, QWidget* parent, JKQTPDatastor toolbar->addSeparator(); toolbar->addSeparator(); populateToolbar(toolbar); - - contextMenu=nullptr;//new QMenu(this); - QSize s=QSize(plotterStyle.toolbarIconSize, plotterStyle.toolbarIconSize); toolbar->setIconSize(s); + contextMenu=nullptr;//new QMenu(this); + //move(32,32); resize(400,300); doDrawing=true; @@ -186,27 +211,125 @@ bool JKQTPlotter::isMousePositionShown() const } -void JKQTPlotter::setUserActionColor(const QColor &__value) +void JKQTPlotter::setUserActionOverlayPen(const QPen &__value) { - if (plotterStyle.userActionColor != __value) { - plotterStyle.userActionColor = __value; + if (plotterStyle.userActionOverlayPen != __value) { + plotterStyle.userActionOverlayPen = __value; update(); } } -QColor JKQTPlotter::getUserActionColor() const +QPen JKQTPlotter::getUserActionOverlayPen() const { - return plotterStyle.userActionColor; + return plotterStyle.userActionOverlayPen; } -void JKQTPlotter::setUserActionCompositionMode(const QPainter::CompositionMode &__value) +void JKQTPlotter::setUserActionOverlayBrush(const QBrush &__value) { - if (plotterStyle.userActionCompositionMode != __value) { - plotterStyle.userActionCompositionMode = __value; + if (plotterStyle.userActionOverlayBrush != __value) { + plotterStyle.userActionOverlayBrush = __value; update(); } } +QBrush JKQTPlotter::getUserActionOverlayBrush() const +{ + return plotterStyle.userActionOverlayBrush; +} + +void JKQTPlotter::setUserActionOpaquePen(const QPen &__value) +{ + if (plotterStyle.userActionOpaquePen != __value) { + plotterStyle.userActionOpaquePen = __value; + update(); + } +} + +QPen JKQTPlotter::getUserActionOpaquePen() const +{ + return plotterStyle.userActionOpaquePen; +} + +void JKQTPlotter::setUserActionOpaqueBrush(const QBrush &__value) +{ + if (plotterStyle.userActionOpaqueBrush != __value) { + plotterStyle.userActionOpaqueBrush = __value; + update(); + } +} + +QBrush JKQTPlotter::getUserActionOpaqueBrush() const +{ + return plotterStyle.userActionOpaqueBrush; +} + +void JKQTPlotter::setUserActionMarkerPen(const QPen &__value) +{ + if (plotterStyle.userActionMarkerPen != __value) { + plotterStyle.userActionMarkerPen = __value; + update(); + } +} + +QPen JKQTPlotter::getUserActionMarkerPen() const +{ + return plotterStyle.userActionMarkerPen; +} + +void JKQTPlotter::setUserActionMarkerBrush(const QBrush &__value) +{ + if (plotterStyle.userActionMarkerBrush != __value) { + plotterStyle.userActionMarkerBrush = __value; + update(); + } +} + +QBrush JKQTPlotter::getUserActionMarkerBrush() const +{ + return plotterStyle.userActionMarkerBrush; +} + + +void JKQTPlotter::setMaxTooltipDistance(int v) +{ + plotterStyle.maxTooltipDistance=v; +} + +int JKQTPlotter::getMaxTooltipDistance() const +{ + return plotterStyle.maxTooltipDistance; +} + +void JKQTPlotter::setUserActionCatchSensitivity(int v) +{ + plotterStyle.userActionCatchSensitivity=v; +} + +int JKQTPlotter::getUserActionCatchSensitivity() const +{ + return plotterStyle.userActionCatchSensitivity; +} + +void JKQTPlotter::setUserActionMarkerDiameter(int v) +{ + plotterStyle.userActionMarkerDiameter=v; +} + +void JKQTPlotter::setUserActionMarkerType(JKQTPUserActionMarkerType v) +{ + plotterStyle.userActionMarkerType=v; +} + +int JKQTPlotter::getUserActionMarkerDiameter() const +{ + return plotterStyle.userActionMarkerDiameter; +} + +JKQTPUserActionMarkerType JKQTPlotter::getUserActionMarkerType() const +{ + return plotterStyle.userActionMarkerType; +} + void JKQTPlotter::registerMouseWheelAction(Qt::KeyboardModifiers modifier, JKQTPMouseWheelActions action) @@ -225,10 +348,6 @@ void JKQTPlotter::clearAllMouseWheelActions() } -QPainter::CompositionMode JKQTPlotter::getUserActionCompositionMode() const -{ - return plotterStyle.userActionCompositionMode; -} void JKQTPlotter::loadSettings(const QSettings& settings, const QString& group) { @@ -246,18 +365,113 @@ void JKQTPlotter::saveSettings(QSettings& settings, const QString& group) const } +void JKQTPlotter::fillInternalStructForToolTipOfClosestDataPoint(double x0, double y0, bool emitEvent) { + bool foundAll=false; + QList labels, titles; + QList colors; + QList posSyss; + QList keymarkers; + QList graphs; + QList ds; + double dbest=0; + for (size_t i=0; igetGraphCount(); i++) { + JKQTPPlotElement* g=getPlotter()->getGraph(i); + bool found=false; + QString label; + QPointF posSys; + double d=0; + if (g && g->isVisible()) { + QPointF pp; + QString ll; + double dist=g->hitTest(QPointF(x0, y0), &pp, &ll, JKQTPPlotElement::HitTestXY); + if (JKQTPIsOKFloat(dist)) { + if (!found || distgetTitle(); + colors.clear(); + colors<getKeyLabelColor(); + posSyss.clear(); + posSyss<generateKeyMarker(); + graphs.clear(); + graphs<getTitle(); + colors<getKeyLabelColor(); + posSyss<generateKeyMarker(); + graphs<getTitle(); + colors.clear(); + colors<getKeyLabelColor(); + posSyss.clear(); + posSyss<generateKeyMarker(); + graphs.clear(); + graphs<x2p(posSyss[i].x())*magnification, getYAxis()->x2p(posSyss[i].y())*magnification).toPoint(); + entries<<(titles[i]+": "+labels[i]); + mouseDragMarkers<getTitle()<<" clicked("<pos()<<") ==> posSys="<0) { + emit tooltipDisplayed(posSyss[0].x(), posSyss[0].y(), entries, graphs); + } + } + } +} + void JKQTPlotter::paintUserAction() { if (currentMouseDragAction.isValid() && mouseDragingRectangle) { image=oldImage; if (image.width()>0 && image.height()>0 && !image.isNull()) { JKQTPEnhancedPainter painter(&image); - QPen p=painter.pen(); - p.setWidthF(1); - p.setColor(plotterStyle.userActionColor.darker()); - p.setStyle(Qt::DashLine); - painter.setPen(p); - QPainter::CompositionMode oldCMode=painter.compositionMode(); - painter.setCompositionMode(plotterStyle.userActionCompositionMode); + painter.setRenderHint(JKQTPEnhancedPainter::NonCosmeticDefaultPen, true); + painter.setRenderHint(JKQTPEnhancedPainter::Antialiasing, true); + painter.setRenderHint(JKQTPEnhancedPainter::TextAntialiasing, true); + painter.setPen(plotterStyle.userActionOverlayPen); if ((mouseDragRectXEnd!=mouseDragRectXStart) && (mouseDragRectYEnd!=mouseDragRectYStart)) { double x1=plotter->x2p(mouseDragRectXStart)*magnification; double y1=plotter->y2p(mouseDragRectYStart)*magnification; @@ -266,28 +480,170 @@ void JKQTPlotter::paintUserAction() { double dx=x2-x1; double dy=y2-y1; if ((currentMouseDragAction.mode==jkqtpmdaZoomByRectangle) || (currentMouseDragAction.mode==jkqtpmdaDrawRectangleForEvent)) { - painter.setOpacity(0.2); - painter.fillRect(QRectF(x1, y1, x2-x1, y2-y1), QBrush(plotterStyle.userActionColor)); - painter.setOpacity(1.0); + painter.fillRect(QRectF(x1, y1, x2-x1, y2-y1), plotterStyle.userActionOverlayBrush); + painter.setPen(plotterStyle.userActionOverlayPen); painter.drawRect(QRectF(x1, y1, x2-x1, y2-y1)); } else if (currentMouseDragAction.mode==jkqtpmdaDrawCircleForEvent) { - QColor zc=plotterStyle.userActionColor; - zc.setAlphaF(0.2); - painter.setBrush(QBrush(zc)); + painter.setPen(plotterStyle.userActionOverlayPen); + painter.setBrush(plotterStyle.userActionOverlayBrush); painter.drawEllipse(QPointF(x1, y1), qMin(fabs(dx), fabs(dy)), qMin(fabs(dx), fabs(dy))); } else if (currentMouseDragAction.mode==jkqtpmdaDrawEllipseForEvent) { - QColor zc=plotterStyle.userActionColor; - zc.setAlphaF(0.2); - painter.setBrush(QBrush(zc)); + painter.setPen(plotterStyle.userActionOverlayPen); + painter.setBrush(plotterStyle.userActionOverlayBrush); painter.drawEllipse(QPointF(x1, y1), fabs(dx), fabs(dy)); } else if (currentMouseDragAction.mode==jkqtpmdaDrawLineForEvent) { - QPen pp=p; - pp.setColor(plotterStyle.userActionColor); - painter.setPen(pp); + painter.setPen(plotterStyle.userActionOverlayPen); + painter.setBrush(plotterStyle.userActionOverlayBrush); painter.drawLine(QPointF(x1,y1), QPointF(x2,y2)); + } else if (currentMouseDragAction.mode==jkqtpmdaRuler) { + painter.setPen(plotterStyle.userActionOpaquePen); + painter.setBrush(plotterStyle.userActionOpaqueBrush); + painter.drawLine(QPointF(x1,y1), QPointF(x2,y1)); + painter.drawLine(QPointF(x2,y1), QPointF(x2,y2)); + painter.drawLine(QPointF(x1,y1), QPointF(x2,y2)); + const double dxy=sqrt(jkqtp_sqr(mouseDragRectXEnd-mouseDragRectXStart)+jkqtp_sqr(mouseDragRectYEnd-mouseDragRectYStart)); + const double alpha=atan2((mouseDragRectYEnd-mouseDragRectYStart), (mouseDragRectXEnd-mouseDragRectXStart))/M_PI*180.0; + const double dx=fabs(mouseDragRectXEnd-mouseDragRectXStart); + const double dy=fabs(mouseDragRectYEnd-mouseDragRectYStart); + + painter.setBrush(plotterStyle.userActionOpaqueBrush); + QString txt; + double a=0,d=0,so=0,w=0; + getPlotter()->getMathText()->setFontSize(plotterStyle.userActionFontSize); + getPlotter()->getMathText()->setFontRomanOrSpecial(plotterStyle.userActionFontName); + + txt=QString::fromStdString("\\delta_{x}="+jkqtp_floattolatexstr(dx, 3)); + getPlotter()->getMathText()->parse(txt); + getPlotter()->getMathText()->getSizeDetail(painter, w, a, d, so); + if (y1>y2) { + QRectF rec((x1+x2)/2.0-w/2.0, y1+2, w, a+d); + painter.fillRect(rec, plotterStyle.userActionOpaqueBrush); + getPlotter()->getMathText()->draw(painter, Qt::AlignTop, rec); + } else { + QRectF rec((x1+x2)/2.0-w/2.0, y1-2-a-d, w, a+d); + painter.fillRect(rec, plotterStyle.userActionOpaqueBrush); + getPlotter()->getMathText()->draw(painter, Qt::AlignBottom, rec); + } + + txt=QString::fromStdString(jkqtp_floattolatexstr(dy, 3)); + getPlotter()->getMathText()->parse("\\delta_{y}="+txt); + getPlotter()->getMathText()->getSizeDetail(painter, w, a, d, so); + //double dyh=a+d; + if (x2>x1) { + QRectF rec(x2+2, (y1+y2)/2.0-(a+d)/2.0, w, a+d); + painter.fillRect(rec, plotterStyle.userActionOpaqueBrush); + getPlotter()->getMathText()->draw(painter, Qt::AlignVCenter|Qt::AlignLeft, rec); + } else { + QRectF rec(x2-2-w, (y1+y2)/2.0-(a+d)/2.0, w, a+d); + painter.fillRect(rec, plotterStyle.userActionOpaqueBrush); + getPlotter()->getMathText()->draw(painter, Qt::AlignVCenter|Qt::AlignRight, rec); + } + + + txt=QString::fromStdString("\\delta_{x,y}="+jkqtp_floattolatexstr(dxy)+", \\alpha="+jkqtp_floattolatexstr(alpha, 1)+"\\degree"); + getPlotter()->getMathText()->parse(txt); + getPlotter()->getMathText()->getSizeDetail(painter, w, a, d, so); + if (x2getMathText()->draw(painter,Qt::AlignTop|Qt::AlignLeft, rec); + } else { + QRectF rec((x1+x2)/2.0-w, (y1+y2)/2.0-(a+d)/2.0, w, a+d); + painter.fillRect(rec, plotterStyle.userActionOpaqueBrush); + getPlotter()->getMathText()->draw(painter,Qt::AlignTop|Qt::AlignRight, rec); + } + + + } else if (currentMouseDragAction.mode==jkqtpmdaToolTipForClosestDataPoint) { + if (mouseDragMarkers.size()>0) { + const int markerD=getCurrentPlotterStyle().userActionMarkerDiameter; + if (getCurrentPlotterStyle().userActionMarkerType==jkqtpuamtCircle) { + painter.setBrush(plotterStyle.userActionMarkerBrush); + painter.setPen(plotterStyle.userActionMarkerPen); + painter.drawEllipse(QRectF(mouseDragMarkers[0].pos.x()-markerD/2, mouseDragMarkers[0].pos.y()-markerD/2, markerD, markerD)); + } else if (getCurrentPlotterStyle().userActionMarkerType==jkqtpuamtCrossHair) { + painter.setBrush(plotterStyle.userActionMarkerBrush); + painter.setPen(plotterStyle.userActionMarkerPen); + painter.drawLine(QLineF(plotter->getInternalPlotBorderLeft(), mouseDragMarkers[0].pos.y(), image.width()-plotter->getInternalPlotBorderRight(), mouseDragMarkers[0].pos.y())); + painter.drawLine(QLineF(mouseDragMarkers[0].pos.x(), plotter->getInternalPlotBorderTop(), mouseDragMarkers[0].pos.x(), image.height()-plotter->getInternalPlotBorderBottom())); + } else if (getCurrentPlotterStyle().userActionMarkerType==jkqtpuamtCircleAndCrossHair) { + painter.setBrush(plotterStyle.userActionMarkerBrush); + painter.setPen(plotterStyle.userActionMarkerPen); + painter.drawEllipse(QRectF(mouseDragMarkers[0].pos.x()-markerD/2, mouseDragMarkers[0].pos.y()-markerD/2, markerD, markerD)); + painter.drawLine(QLineF(plotter->getInternalPlotBorderLeft(), mouseDragMarkers[0].pos.y(), mouseDragMarkers[0].pos.x()-markerD/2, mouseDragMarkers[0].pos.y())); + painter.drawLine(QLineF(image.width()-plotter->getInternalPlotBorderRight(), mouseDragMarkers[0].pos.y(), mouseDragMarkers[0].pos.x()+markerD/2, mouseDragMarkers[0].pos.y())); + painter.drawLine(QLineF(mouseDragMarkers[0].pos.x(), plotter->getInternalPlotBorderTop(), mouseDragMarkers[0].pos.x(), mouseDragMarkers[0].pos.y()-markerD/2)); + painter.drawLine(QLineF(mouseDragMarkers[0].pos.x(), image.height()-plotter->getInternalPlotBorderBottom(), mouseDragMarkers[0].pos.x(), mouseDragMarkers[0].pos.y()+markerD/2)); + } + const int xoffset=qMax(markerD*3/2,16); + const int x0=mouseDragMarkers[0].pos.x()+xoffset; + QRectF rall(0,0,0,0); + double y=mouseDragMarkers[0].pos.y(); + QVector rects; + QVector txts; + QVector colors; + const int txtoffset=4; + QString txt; + double ascent=0,descent=0,strikeout=0,width=0; + getPlotter()->getMathText()->setFontSize(plotterStyle.userActionFontSize); + getPlotter()->getMathText()->setFontRomanOrSpecial(plotterStyle.userActionFontName); + + + for (auto& m: mouseDragMarkers) { + QString txt="\\textcolor{"+jkqtp_QColor2String(m.color)+"}{"+m.title+": "+m.label+"}"; + + getPlotter()->getMathText()->parse(txt); + getPlotter()->getMathText()->getSizeDetail(painter, width, ascent, descent, strikeout); + + double txtheight=ascent+descent; + QRectF rec(x0+txtoffset, y, width+1, txtheight+1); + if (rall.width()*rall.height()<=0) { + rall=rec.toRect(); + } else { + rall.setBottom(rall.bottom()+txtheight+ascent/4); + rall.setRight(qMax(rall.right(), rec.right())); + } + rects << rec; + txts<image.width()) { + rall.moveLeft(mouseDragMarkers[0].pos.x()-rall.width()-xoffset); + for (auto& r: rects) { + r.moveLeft(rall.left()+txtoffset); + } + } + if (rall.bottom()>image.height()) { + double oldY=rall.y(); + rall.moveTop(image.height()-rall.height()); + for (auto& r: rects) { + r.moveTop(r.y()-(oldY-rall.y())); + } + } + //qDebug()<<"rall="<getMathText()->parse(txts[i]); + getPlotter()->getMathText()->draw(painter, Qt::AlignTop|Qt::AlignLeft, rects[i]); + QStringList el=getPlotter()->getMathText()->getErrorList(); + if (el.size()>0) { + qDebug()<<"error parsing LaTeX string fo tooltip ("<p2y((event->y()-getPlotYOffset())/magnification); mouseDragRectXEndPixel=event->x(); mouseDragRectYEndPixel=event->y(); + + + if (currentMouseDragAction.mode==jkqtpmdaToolTipForClosestDataPoint) { + fillInternalStructForToolTipOfClosestDataPoint(mouseDragRectXEnd, mouseDragRectYEnd); + + } + if (currentMouseDragAction.mode==jkqtpmdaRuler) { + emit rulerDisplayed(mouseDragRectXStart, mouseDragRectYStart, mouseDragRectXEnd, mouseDragRectYEnd, event->modifiers()); + + } + paintUserAction(); event->accept(); //std::cout<p2x(zoomRect.left()), plotter->p2x(zoomRect.right()), plotter->p2y(zoomRect.bottom()), plotter->p2y(zoomRect.top())); } + } else { event->accept(); /*if (emitSignals)*/ //emit plotMouseMove(x, y); } } - // emit clicked signal, if event occured inside plot only + // emit move signal, if event occured inside plot only if ( (event->x()/magnification>=plotter->getInternalPlotBorderLeft()) && (event->x()/magnification<=plotter->getPlotWidth()+plotter->getInternalPlotBorderLeft()) && ((event->y()-getPlotYOffset())/magnification>=plotter->getInternalPlotBorderTop()) && ((event->y()-getPlotYOffset())/magnification<=plotter->getPlotHeight()+plotter->getInternalPlotBorderTop()) ) { emit plotMouseMove(plotter->p2x(event->x()/magnification), plotter->p2y((event->y()-getPlotYOffset())/magnification)); @@ -369,20 +739,21 @@ void JKQTPlotter::mouseMoveEvent ( QMouseEvent * event ) { - void JKQTPlotter::mousePressEvent ( QMouseEvent * event ){ currentMouseDragAction.clear(); + mouseDragMarkers.clear(); - auto actionIT=findMatchingMouseDragAction(event->button(), event->modifiers()); - if (actionIT!=plotterStyle.registeredMouseDragActionModes.end()) { + bool foundIT=false; + auto actionIT=findMatchingMouseDragAction(event->button(), event->modifiers(), &foundIT); + if (foundIT) { // we found a matching action - currentMouseDragAction=MouseDragAction(actionIT.key().first, actionIT.key().second, actionIT.value()); mouseLastClickX=event->x(); mouseLastClickY=event->y(); mouseDragRectXStart=plotter->p2x(event->x()/magnification); mouseDragRectYStart=plotter->p2y((event->y()-getPlotYOffset())/magnification); mouseDragRectXEndPixel=mouseDragRectXStartPixel=event->x(); mouseDragRectYEndPixel=mouseDragRectYStartPixel=event->y(); + currentMouseDragAction=MouseDragAction(actionIT.key().first, actionIT.key().second, actionIT.value()); mouseDragingRectangle=true; oldImage=image; if (currentMouseDragAction.mode==jkqtpmdaScribbleForEvents) emit userScribbleClick(mouseDragRectXStart, mouseDragRectYStart, event->modifiers(), true, false); @@ -401,6 +772,10 @@ void JKQTPlotter::mousePressEvent ( QMouseEvent * event ){ event->accept(); } updateCursor(); + if ((actionIT!=plotterStyle.registeredMouseDragActionModes.end() || actionIT!=registeredOverrideMouseDragActionModes.end()) && actionIT.value()==jkqtpmdaToolTipForClosestDataPoint) { + fillInternalStructForToolTipOfClosestDataPoint(mouseDragRectXStart, mouseDragRectYStart); + paintUserAction(); + } } void JKQTPlotter::mouseReleaseEvent ( QMouseEvent * event ){ @@ -452,11 +827,19 @@ void JKQTPlotter::mouseReleaseEvent ( QMouseEvent * event ){ emit userLineFinished(x1, y1, x2, y2, event->modifiers()); } } - if (currentMouseDragAction.mode!=jkqtpmdaZoomByRectangle) update(); - if (currentMouseDragAction.mode==jkqtpmdaScribbleForEvents) emit userScribbleClick(x1, y1, event->modifiers(), false, true); + if (currentMouseDragAction.mode!=jkqtpmdaZoomByRectangle && currentMouseDragAction.mode!=jkqtpmdaRuler && currentMouseDragAction.mode!=jkqtpmdaToolTipForClosestDataPoint) { + update(); + } + if (currentMouseDragAction.mode==jkqtpmdaScribbleForEvents) { + emit userScribbleClick(x1, y1, event->modifiers(), false, true); + } event->accept(); } + resetCurrentMouseDragAction(); +} +void JKQTPlotter::resetCurrentMouseDragAction () { + mouseDragingRectangle=false; currentMouseDragAction.clear(); updateCursor(); } @@ -603,10 +986,16 @@ void JKQTPlotter::initContextMenu() contextMenu->addAction(plotter->getActionCopyMatlab()); contextMenu->addSeparator(); contextMenu->addAction(plotter->getActionShowPlotData()); - contextMenu->addSeparator(); + contextMenu->addSection(tr("Zooming")); contextMenu->addAction(plotter->getActionZoomAll()); contextMenu->addAction(plotter->getActionZoomIn()); contextMenu->addAction(plotter->getActionZoomOut()); + contextMenu->addSection(tr("left mouse button tool")); + contextMenu->addAction(actMouseLeftAsDefault); + contextMenu->addAction(actMouseLeftAsPanView); + contextMenu->addAction(actMouseLeftAsZoomRect); + contextMenu->addAction(actMouseLeftAsRuler); + contextMenu->addAction(actMouseLeftAsToolTip); contextMenu->addSeparator(); QMenu* menVisibleGroup=new QMenu(tr("Graph Visibility"), contextMenu); for (size_t i=0; igetGraphCount(); i++) { @@ -688,6 +1077,12 @@ void JKQTPlotter::updateCursor() { static QBitmap cursor(":/JKQTPlotter/jkqtp_cursor_scribble.png"); static QBitmap mask(":/JKQTPlotter/jkqtp_cursor_scribble_mask.png"); setCursor(QCursor(cursor, mask, 9, 14)); + } else if (currentMouseDragAction.mode==jkqtpmdaToolTipForClosestDataPoint) { + setCursor(QCursor(Qt::CrossCursor)); + } else if (currentMouseDragAction.mode==jkqtpmdaRuler) { + static QBitmap cursor(":/JKQTPlotter/jkqtp_cursor_line.png"); + static QBitmap mask(":/JKQTPlotter/jkqtp_cursor_line_mask.png"); + setCursor(QCursor(cursor, mask, 9, 14)); } else { setCursor(QCursor(Qt::ArrowCursor)); } @@ -726,6 +1121,7 @@ void JKQTPlotter::redrawOverlays() { repaint(); } + void JKQTPlotter::redrawPlot() { #ifdef JKQTBP_AUTOTIMER JKQTPAutoOutputTimer jkaaot(QString("JKQTPlotter::redrawPlot()")); @@ -952,6 +1348,68 @@ void JKQTPlotter::reactGraphVisible(bool visible) } } +void JKQTPlotter::setMouseLeftActionAsPanView() +{ + setOverrideMouseDragAction(Qt::LeftButton, Qt::NoModifier, JKQTPMouseDragActions::jkqtpmdaPanPlotOnMove); +} + +void JKQTPlotter::setMouseLeftActionAsZoomRect() +{ + setOverrideMouseDragAction(Qt::LeftButton, Qt::NoModifier, JKQTPMouseDragActions::jkqtpmdaZoomByRectangle); +} + +void JKQTPlotter::setMouseLeftActionAsRuler() +{ + setOverrideMouseDragAction(Qt::LeftButton, Qt::NoModifier, JKQTPMouseDragActions::jkqtpmdaRuler); +} + +void JKQTPlotter::setMouseLeftActionAsToolTip() +{ + setOverrideMouseDragAction(Qt::LeftButton, Qt::NoModifier, JKQTPMouseDragActions::jkqtpmdaToolTipForClosestDataPoint); +} + +void JKQTPlotter::resetMouseLeftAction() +{ + resetOverrideMouseDragAction(Qt::LeftButton, Qt::NoModifier); +} + +void JKQTPlotter::setMouseActionToolbarActionsActive(bool __value) +{ + actgrpMouseLeft->setVisible(__value); +} + +QAction* JKQTPlotter::getActMouseLeftAsDefault() const { + return actMouseLeftAsDefault; +} + +QAction *JKQTPlotter::getActMouseLeftAsZoomRect() const +{ + return actMouseLeftAsZoomRect; +} + +QAction *JKQTPlotter::getActMouseLeftAsPanView() const +{ + return actMouseLeftAsPanView; +} + +QAction* JKQTPlotter::getActMouseLeftAsRuler() const { + return actMouseLeftAsRuler; +} + +QAction* JKQTPlotter::getActMouseLeftAsToolTip() const { + return actMouseLeftAsToolTip; +} + +void JKQTPlotter::setOverrideMouseDragAction(Qt::MouseButton button, Qt::KeyboardModifiers modifier, JKQTPMouseDragActions action) +{ + registeredOverrideMouseDragActionModes.insert(qMakePair(button, modifier), action); +} + +void JKQTPlotter::resetOverrideMouseDragAction(Qt::MouseButton button, Qt::KeyboardModifiers modifier) +{ + registeredOverrideMouseDragActionModes.remove(qMakePair(button, modifier)); +} + void JKQTPlotter::setContextMenuMode(JKQTPContextMenuModes mode) { contextMenuMode=mode; } @@ -1049,7 +1507,12 @@ void JKQTPlotter::populateToolbar(QToolBar *toolbar) const toolbar->addAction(plotter->getActionZoomAll()); toolbar->addAction(plotter->getActionZoomIn()); toolbar->addAction(plotter->getActionZoomOut()); - + toolbar->addSeparator(); + toolbar->addAction(actMouseLeftAsDefault); + toolbar->addAction(actMouseLeftAsPanView); + toolbar->addAction(actMouseLeftAsZoomRect); + toolbar->addAction(actMouseLeftAsRuler); + toolbar->addAction(actMouseLeftAsToolTip); if (actions().size()>0) { toolbar->addSeparator(); toolbar->addActions(actions()); @@ -1089,11 +1552,11 @@ void JKQTPlotter::resetContextMenu(bool createnew) qDeleteAll(contextSubMenus); contextSubMenus.clear(); delete contextMenu; - if (createnew) { - contextMenu=new QMenu(this); - } else { - contextMenu=nullptr; - } + } + if (createnew) { + contextMenu=new QMenu(this); + } else { + contextMenu=nullptr; } } @@ -1183,9 +1646,16 @@ void JKQTPlotter::openStandardAndSpecialContextMenu(int x, int y) } -JKQTPMouseDragActionsHashMapIterator JKQTPlotter::findMatchingMouseDragAction(Qt::MouseButton button, Qt::KeyboardModifiers modifiers) const +JKQTPMouseDragActionsHashMapIterator JKQTPlotter::findMatchingMouseDragAction(Qt::MouseButton button, Qt::KeyboardModifiers modifiers, bool* found) const { - return plotterStyle.registeredMouseDragActionModes.find(qMakePair(button, modifiers)); + auto it=registeredOverrideMouseDragActionModes.find(qMakePair(button, modifiers)); + if (it!=registeredOverrideMouseDragActionModes.end()) { + if (found) *found=true; + return it; + } + auto itt=plotterStyle.registeredMouseDragActionModes.find(qMakePair(button, modifiers)); + if (found) *found=(itt!=plotterStyle.registeredMouseDragActionModes.end()); + return itt; } JKQTPMouseDoubleClickActionsHashMapIterator JKQTPlotter::findMatchingMouseDoubleClickAction(Qt::MouseButton button, Qt::KeyboardModifiers modifiers) const @@ -1208,6 +1678,10 @@ void JKQTPlotter::setPlotUpdateEnabled(bool enable) void JKQTPlotter::registerMouseDragAction(Qt::MouseButton button, Qt::KeyboardModifiers modifier, JKQTPMouseDragActions action) { plotterStyle.registeredMouseDragActionModes[qMakePair(button, modifier)]=action; + if (button==Qt::LeftButton && modifier==Qt::NoModifier) { + actMouseLeftAsDefault->setChecked(true); + resetMouseLeftAction(); + } } void JKQTPlotter::deregisterMouseDragAction(Qt::MouseButton button, Qt::KeyboardModifiers modifier) diff --git a/lib/jkqtplotter/jkqtplotter.h b/lib/jkqtplotter/jkqtplotter.h index 92d9af404c..8f7ddb65ee 100644 --- a/lib/jkqtplotter/jkqtplotter.h +++ b/lib/jkqtplotter/jkqtplotter.h @@ -319,8 +319,14 @@ JKQTP_LIB_EXPORT void initJKQTPlotterResources(); * * If e.g. the mode JKQTPlotter::MouseActionMode::jkqtpmdaZoomByRectangle is selected, while you drag the mouse, the * zoom rectangle is drawn over the plot. You can modify the style of drawing using these functions: - * - setUserActionColor() sets the color of the drawn shape - * - setUserActionCompositionMode() specifies how to combine the shape with the existing plot + * - setUserActionOverlayPen() sets the pen for (semi-transparent) overlay shapes, e.g. zoom rectangles + * - setUserActionOverlayBrush() sets the brush for (semi-transparent) overlay shapes, e.g. zoom rectangles + * - setUserActionOpaquePen() sets the pen for opaque overlay shapes, e.g. tool-tips + * - setUserActionOpaqueBrush() sets the brush for opaque overlay shapes, e.g. tool-tips + * - setUserActionMarkerPen() sets the pen for marker overlay shapes, e.g. with tool-tips + * - setUserActionMarkerBrush() sets the brush for marker overlay shapes, e.g. with tool-tips + * - setUserActionMarkerDiameter() sets the size of user-action markers + * - setUserActionMarkerType() sets the type of user-action markers * . * * \image html zoomin_mouse_contextmenu.gif "Zooming with the mouse" @@ -329,6 +335,10 @@ JKQTP_LIB_EXPORT void initJKQTPlotterResources(); * * \image html drag_viewport.gif "Drag the Plot Viewport" * + * \image html rulertool.gif "Measurement Ruler Tool" + * + * \image html tooltiptool.gif "Data Point Tooltip Tool" + * * * \subsubsection JKQTPLOTTER_USERMOUSEINTERACTION_MOUSECLICK Actions After (Double-)Clicks on the Mouse Buttons * The right mouse button has a special role: If it is single-clicked and no JKQTPlotter::MouseActionMode is specified @@ -475,11 +485,48 @@ class JKQTP_LIB_EXPORT JKQTPlotter: public QWidget { * * \see setMousePositionShown(), JKQTPlotterStyle::displayMousePosition, \ref JKQTPLOTTER_USERMOUSEINTERACTION_MOUSEMOVE */ bool isMousePositionShown() const; - /** \brief returns the fill color of the zoom rectangle \see \ref JKQTPLOTTER_USERMOUSEINTERACTION_MOUSEDRAG */ - QColor getUserActionColor() const; - /** \brief returns the QPainter::CompositionMode used to draw the zoom rectangle etc. \see \ref JKQTPLOTTER_USERMOUSEINTERACTION_MOUSEDRAG */ - QPainter::CompositionMode getUserActionCompositionMode() const; + /** \copydoc JKQTPlotterStyle::userActionOverlayPen + * + * \see setUserActionOverlayPen(), getUserActionOverlayPen(), JKQTPlotterStyle::userActionOverlayPen \ref JKQTPLOTTER_USERMOUSEINTERACTION_MOUSEDRAG */ + QPen getUserActionOverlayPen() const; + + /** \copydoc JKQTPlotterStyle::userActionOverlayBrush + * + * \see setUserActionOverlayBrush(), getUserActionOverlayBrush(), JKQTPlotterStyle::userActionOverlayBrush \ref JKQTPLOTTER_USERMOUSEINTERACTION_MOUSEDRAG */ + QBrush getUserActionOverlayBrush() const; + + /** \copydoc JKQTPlotterStyle::userActionOpaquePen + * + * \see setUserActionOpaquePen(), getUserActionOpaquePen(), JKQTPlotterStyle::userActionOpaquePen \ref JKQTPLOTTER_USERMOUSEINTERACTION_MOUSEDRAG */ + QPen getUserActionOpaquePen() const; + + /** \copydoc JKQTPlotterStyle::userActionOpaqueBrush + * + * \see setUserActionOpaqueBrush(), getUserActionOpaqueBrush(), JKQTPlotterStyle::userActionOpaqueBrush \ref JKQTPLOTTER_USERMOUSEINTERACTION_MOUSEDRAG */ + QBrush getUserActionOpaqueBrush() const; + + /** \copydoc JKQTPlotterStyle::userActionMarkerPen + * + * \see setUserActionMarkerPen(), getUserActionMarkerPen(), JKQTPlotterStyle::userActionMarkerPen \ref JKQTPLOTTER_USERMOUSEINTERACTION_MOUSEDRAG */ + QPen getUserActionMarkerPen() const; + + /** \copydoc JKQTPlotterStyle::userActionMarkerBrush + * + * \see setUserActionMarkerBrush(), getUserActionMarkerBrush(), JKQTPlotterStyle::userActionMarkerBrush \ref JKQTPLOTTER_USERMOUSEINTERACTION_MOUSEDRAG */ + QBrush getUserActionMarkerBrush() const; + + /** \copydoc JKQTPlotterStyle::maxTooltipDistance */ + int getMaxTooltipDistance() const; + + /** \copydoc JKQTPlotterStyle::userActionCatchSensitivity */ + int getUserActionCatchSensitivity() const; + + /** \copydoc JKQTPlotterStyle::userActionMarkerDiameter */ + int getUserActionMarkerDiameter() const; + + /** \copydoc JKQTPlotterStyle::userActionMarkerType */ + JKQTPUserActionMarkerType getUserActionMarkerType() const; /** \brief loads the plot properties from a
    QSettings object */ @@ -850,6 +897,18 @@ class JKQTP_LIB_EXPORT JKQTPlotter: public QWidget { */ void saveCurrentPlotterStyle(QSettings& settings, const QString& group="plot/", bool alsoSaveBaseStyle=true) const; + /** \brief \copydoc actMouseLeftAsToolTip */ + QAction *getActMouseLeftAsToolTip() const; + /** \brief \copydoc actMouseLeftAsRuler */ + QAction *getActMouseLeftAsRuler() const; + /** \brief \copydoc actMouseLeftAsDefault */ + QAction *getActMouseLeftAsDefault() const; + /** \brief \copydoc actMouseLeftAsZoomRect */ + QAction *getActMouseLeftAsZoomRect() const; + /** \brief \copydoc actMouseLeftAsPanView */ + QAction *getActMouseLeftAsPanView() const; + + public slots: /** \brief set the current plot magnification */ void setMagnification(double m); @@ -931,6 +990,12 @@ class JKQTP_LIB_EXPORT JKQTPlotter: public QWidget { */ void redrawOverlays(); + /** \brief allows to activate/deactivate toolbar buttons that can activate certain mouse drag actions + * + * \see getActMouseLeftAsDefault(), getActMouseLeftAsRuler(), getActMouseLeftAsToolTip() + */ + void setMouseActionToolbarActionsActive(bool __value); + /** \brief returns whether the toolbar is enabled * * \copydetails JKQTPlotterStyle::toolbarEnabled @@ -952,14 +1017,42 @@ class JKQTP_LIB_EXPORT JKQTPlotter: public QWidget { * * \see isMousePositionShown(), JKQTPlotterStyle::displayMousePosition, \ref JKQTPLOTTER_USERMOUSEINTERACTION_MOUSEMOVE */ void setMousePositionShown(bool __value); - /** \brief set the fill color of the zoom rectangle + /** \copydoc JKQTPlotterStyle::userActionOverlayPen * - * \see getUserActionColor(), JKQTPlotterStyle::userActionColor \ref JKQTPLOTTER_USERMOUSEINTERACTION_MOUSEDRAG */ - void setUserActionColor(const QColor & __value); - /** \brief set the QPainter::CompositionMode used to draw the zoom rectangle etc. + * \see setUserActionOverlayPen(), getUserActionOverlayPen(), JKQTPlotterStyle::userActionOverlayPen \ref JKQTPLOTTER_USERMOUSEINTERACTION_MOUSEDRAG */ + void setUserActionOverlayPen(const QPen & __value); + /** \copydoc JKQTPlotterStyle::userActionOverlayPen * - * \see getUserActionCompositionMode(), JKQTPlotterStyle::userActionColor \ref JKQTPLOTTER_USERMOUSEINTERACTION_MOUSEDRAG */ - void setUserActionCompositionMode(const QPainter::CompositionMode & __value); + * \see setUserActionOverlayBrush(), getUserActionOverlayBrush(), JKQTPlotterStyle::userActionOverlayBrush \ref JKQTPLOTTER_USERMOUSEINTERACTION_MOUSEDRAG */ + void setUserActionOverlayBrush(const QBrush & __value); + /** \copydoc JKQTPlotterStyle::userActionOpaquePen + * + * \see setUserActionOpaquePen(), getUserActionOpaquePen(), JKQTPlotterStyle::userActionOpaquePen \ref JKQTPLOTTER_USERMOUSEINTERACTION_MOUSEDRAG */ + void setUserActionOpaquePen(const QPen & __value); + /** \copydoc JKQTPlotterStyle::userActionOpaquePen + * + * \see setUserActionOpaqueBrush(), getUserActionOpaqueBrush(), JKQTPlotterStyle::userActionOpaqueBrush \ref JKQTPLOTTER_USERMOUSEINTERACTION_MOUSEDRAG */ + void setUserActionOpaqueBrush(const QBrush & __value); + /** \copydoc JKQTPlotterStyle::userActionMarkerPen + * + * \see setUserActionMarkerPen(), getUserActionMarkerPen(), JKQTPlotterStyle::userActionMarkerPen \ref JKQTPLOTTER_USERMOUSEINTERACTION_MOUSEDRAG */ + void setUserActionMarkerPen(const QPen & __value); + /** \copydoc JKQTPlotterStyle::userActionMarkerPen + * + * \see setUserActionMarkerBrush(), getUserActionMarkerBrush(), JKQTPlotterStyle::userActionMarkerBrush \ref JKQTPLOTTER_USERMOUSEINTERACTION_MOUSEDRAG */ + void setUserActionMarkerBrush(const QBrush & __value); + + /** \copydoc JKQTPlotterStyle::maxTooltipDistance */ + void setMaxTooltipDistance(int v); + + /** \copydoc JKQTPlotterStyle::userActionCatchSensitivity */ + void setUserActionCatchSensitivity(int v); + + /** \copydoc JKQTPlotterStyle::userActionMarkerDiameter */ + void setUserActionMarkerDiameter(int v); + + /** \copydoc JKQTPlotterStyle::userActionMarkerType */ + void setUserActionMarkerType(JKQTPUserActionMarkerType v); /** \brief sets the mode if the standard context menu \see JKQTPContextMenuModes, \ref JKQTPLOTTER_CONTEXTMENU , \ref JKQTPLOTTER_SPECIALCONTEXTMENU , \ref JKQTPLOTTER_USERMOUSEINTERACTION */ void setContextMenuMode(JKQTPContextMenuModes mode); @@ -1224,6 +1317,23 @@ class JKQTP_LIB_EXPORT JKQTPlotter: public QWidget { * \param modifiers key-modifiers when the rectangle was finished */ void userEllipseFinished(double x, double y, double radiusX, double radiusY, Qt::KeyboardModifiers modifiers); + /** \brief emitted when a tooltip for a datapoint is displayed + * + * \param x x-coordinate of the center of the marked datapoint (in plot coordinates) + * \param y y-coordinate of the center of the marked datapoint (in plot coordinates) + * \param entries contents of the tooltip + * \param graphs graph objects that created the entries + */ + void tooltipDisplayed(double x, double y, const QStringList& entries, const QList& graphs); + /** \brief emitted when a new ruler between two points is displayed + * + * \param x1 x-coordinate of the start of the line (in plot coordinates) + * \param y1 y-coordinate of the start of the line (in plot coordinates) + * \param x2 x-coordinate of the end of the line (in plot coordinates) + * \param y2 y-coordinate of the end of the line (in plot coordinates) + * \param modifiers key-modifiers when the rectangle was finished + */ + void rulerDisplayed(double x1, double y1, double x2, double y2, Qt::KeyboardModifiers modifiers); protected: @@ -1248,8 +1358,8 @@ class JKQTP_LIB_EXPORT JKQTPlotter: public QWidget { /** \brief the currently executed MouseDragAction */ MouseDragAction currentMouseDragAction; - /** \brief searches JKQTPlotterStyle::registeredMouseActionModes for a matching action */ - JKQTPMouseDragActionsHashMapIterator findMatchingMouseDragAction(Qt::MouseButton button, Qt::KeyboardModifiers modifiers) const; + /** \brief searches JKQTPlotterStyle::registeredMouseActionModes for a matching action, returns in \a found whether an action was found */ + JKQTPMouseDragActionsHashMapIterator findMatchingMouseDragAction(Qt::MouseButton button, Qt::KeyboardModifiers modifiers, bool *found=nullptr) const; /** \brief searches JKQTPlotterStyle::registeredMouseWheelActions for a matching action */ JKQTPMouseWheelActionsHashMapIterator findMatchingMouseWheelAction(Qt::KeyboardModifiers modifiers) const; @@ -1311,6 +1421,28 @@ class JKQTP_LIB_EXPORT JKQTPlotter: public QWidget { */ double mouseDragRectYEnd; + /** \brief describes a marker to be drawn by paintUserAction() */ + struct MouseDragMarker{ + inline MouseDragMarker(const QPoint& pos_, const QString& label_, const QString& title_, const QColor& color_, const QImage& keymarker_=QImage(), JKQTPPlotElement* _graph=nullptr): + pos(pos_), label(label_), title(title_), color(color_), keyMarker(keymarker_), graph(_graph) + {} + /** \brief position of the marker in screen pixels */ + QPoint pos; + /** \brief marker label */ + QString label; + /** \brief graph label */ + QString title; + /** \brief color for the marker */ + QColor color; + /** \brief key marker image */ + QImage keyMarker; + /** \brief graph that created that marker */ + JKQTPPlotElement* graph; + }; + /** \brief internal list of markers to be drawn by paintUserAction() */ + QList mouseDragMarkers; + + /** \brief this stores the currently displayed plot */ QImage image; @@ -1435,6 +1567,9 @@ class JKQTP_LIB_EXPORT JKQTPlotter: public QWidget { int mouseLastClickX; /** \brief y-position of the last mouse-click (in screen pixels) */ int mouseLastClickY; + /** \brief internal storage for sub-menu entries of the internal contextMenu object, based on the actions returned by JKQTBasePlotter::getLstAdditionalPlotterActions() + * \internal + */ QList contextSubMenus; /** \brief fills the member contextMenu with all default and additionally registered actions, also calls modifyContextMenu() * @@ -1469,6 +1604,36 @@ class JKQTP_LIB_EXPORT JKQTPlotter: public QWidget { * \see initContextMenu(), contextMenuMode */ void resetContextMenu(bool createnew=true); + + /** \brief fills the inertnal mouseDragMarkers structure with data to display tooltips close to (x0, y0) + * + * if \a emitEvent is \c true, the signal is emitted before the function returns + */ + void fillInternalStructForToolTipOfClosestDataPoint(double x0, double y0, bool emitEvent=true); + /** \brief resets the currently activated mouse drag action, e.g. called by mouseReleaseEvent() */ + void resetCurrentMouseDragAction(); + + /** \brief list of override mouse drag action modes, that override the settings ing plotterStyle.registeredMouseDragActionModes \see setOverrideMouseDragAction(), resetOverrideMouseDragAction(), JKQTPlotterStyle::registeredMouseDragActionModes */ + JKQTPMouseDragActionsHashMap registeredOverrideMouseDragActionModes; + + /** \brief sets an override mouse drag action for the given button/modifiers combination \see setOverrideMouseDragAction(), resetOverrideMouseDragAction(), registeredOverrideMouseDragActionModes */ + void setOverrideMouseDragAction(Qt::MouseButton button,Qt::KeyboardModifiers modifiers, JKQTPMouseDragActions action); + /** \brief removes a previously set override mouse drag action for the given button/modifiers combination \see setOverrideMouseDragAction(), resetOverrideMouseDragAction(), registeredOverrideMouseDragActionModes */ + void resetOverrideMouseDragAction(Qt::MouseButton button,Qt::KeyboardModifiers modifiers); + + /** \brief action group, that groups the actMouseLeft... actions */ + QActionGroup* actgrpMouseLeft; + /** \brief action that activates the default action, set in plotterStyle! */ + QAction* actMouseLeftAsDefault; + /** \brief action that activates the ruler tool (override!) */ + QAction* actMouseLeftAsRuler; + /** \brief action that activates the tooltip tool (override!) */ + QAction* actMouseLeftAsToolTip; + /** \brief action that activates the zoom rectangle tool (override!) */ + QAction* actMouseLeftAsZoomRect; + /** \brief action that activates the pan view tool (override!) */ + QAction* actMouseLeftAsPanView; + protected slots: /** \brief while the window is resized, the plot is only redrawn after a restartable delay, implemented by this function and resizeTimer * \internal @@ -1489,6 +1654,17 @@ class JKQTP_LIB_EXPORT JKQTPlotter: public QWidget { /** \brief called from a menu entry that encodes the graph ID */ void reactGraphVisible(bool visible); + /** \brief action that activates the pan viewport tool \see resetMouseLeftAction(), setMouseLeftActionAsToolTip() */ + void setMouseLeftActionAsPanView(); + /** \brief action that activates the zoom rectangle tool \see resetMouseLeftAction(), setMouseLeftActionAsToolTip() */ + void setMouseLeftActionAsZoomRect(); + /** \brief action that activates the ruler tool \see resetMouseLeftAction(), setMouseLeftActionAsToolTip() */ + void setMouseLeftActionAsRuler(); + /** \brief action that activates the tooltip tool \see setMouseLeftActionAsRuler(), resetMouseLeftAction() */ + void setMouseLeftActionAsToolTip(); + /** \brief resets any previously set override action for the left mouse-button, un-modified \see setMouseLeftActionAsRuler(), setMouseLeftActionAsToolTip() */ + void resetMouseLeftAction(); + }; /** \brief qHash-variant used by JKQTPlotter diff --git a/lib/jkqtplotter/jkqtplotterstyle.cpp b/lib/jkqtplotter/jkqtplotterstyle.cpp index c787bf4e30..68fc9395a6 100644 --- a/lib/jkqtplotter/jkqtplotterstyle.cpp +++ b/lib/jkqtplotter/jkqtplotterstyle.cpp @@ -1,11 +1,22 @@ #include "jkqtplotterstyle.h" +#include #include "jkqtplottertools/jkqttools.h" #include "jkqtplottertools/jkqtptools.h" JKQTPlotterStyle::JKQTPlotterStyle(): + maxTooltipDistance(16), + userActionCatchSensitivity(1), toolbarIconSize(16), - userActionColor("steelblue"), - userActionCompositionMode(QPainter::CompositionMode_SourceOver), + userActionOverlayPen(QColor("darkblue").darker(), 1.5, Qt::DashLine), + userActionOverlayBrush(QColorWithAlphaF(QColor("steelblue"), 0.2)), + userActionOpaquePen(QColor("darkblue").darker(), 1.5, Qt::DashLine), + userActionOpaqueBrush(QColor("aliceblue")), + userActionMarkerPen(QColor("red").darker(), 1, Qt::DotLine), + userActionMarkerBrush(QColorWithAlphaF(QColor("red"), 0.2)), + userActionMarkerType(jkqtpuamtCircleAndCrossHair), + userActionFontName(QApplication::font().family()+"+XITS"), + userActionFontSize(QApplication::font().pointSizeF()*1.1), + userActionMarkerDiameter(12), mousePositionTemplate("(%1; %2)"), displayMousePosition(true), toolbarEnabled(true), @@ -23,7 +34,40 @@ void JKQTPlotterStyle::loadSettings(const QSettings &settings, const QString &gr { toolbarIconSize=settings.value(group+"toolbar_icon_size", defaultStyle.toolbarIconSize).toInt(); mousePositionTemplate=settings.value(group+"mouse_position_template", defaultStyle.mousePositionTemplate).toString(); - userActionColor=jkqtp_String2QColor(settings.value(group+"useraction_color", jkqtp_QColor2String(defaultStyle.userActionColor)).toString()); + + + userActionOverlayPen=defaultStyle.userActionOverlayPen; + userActionOverlayPen.setColor(jkqtp_String2QColor(settings.value(group+"useraction_overlay_color", jkqtp_QColor2String(defaultStyle.userActionOverlayPen.color())).toString())); + userActionOverlayPen.setStyle(jkqtp_String2QPenStyle(settings.value(group+"useraction_overlay_penstyle", jkqtp_QPenStyle2String(defaultStyle.userActionOverlayPen.style())).toString())); + userActionOverlayPen.setWidthF(settings.value(group+"useraction_overlay_linewidth", defaultStyle.userActionOverlayPen.widthF()).toDouble()); + userActionOverlayBrush=defaultStyle.userActionOverlayBrush; + userActionOverlayBrush.setColor(jkqtp_String2QColor(settings.value(group+"useraction_overlay_brushcolor", jkqtp_QColor2String(defaultStyle.userActionOverlayBrush.color())).toString())); + userActionOverlayBrush.setStyle(jkqtp_String2QBrushStyle(settings.value(group+"useraction_overlay_brushstyle", jkqtp_QBrushStyle2String(defaultStyle.userActionOverlayBrush.style())).toString())); + + userActionOpaquePen=defaultStyle.userActionOpaquePen; + userActionOpaquePen.setColor(jkqtp_String2QColor(settings.value(group+"useraction_opaque_color", jkqtp_QColor2String(defaultStyle.userActionOpaquePen.color())).toString())); + userActionOpaquePen.setStyle(jkqtp_String2QPenStyle(settings.value(group+"useraction_opaque_penstyle", jkqtp_QPenStyle2String(defaultStyle.userActionOpaquePen.style())).toString())); + userActionOpaquePen.setWidthF(settings.value(group+"useraction_opaque_linewidth", defaultStyle.userActionOpaquePen.widthF()).toDouble()); + userActionOpaqueBrush=defaultStyle.userActionOpaqueBrush; + userActionOpaqueBrush.setColor(jkqtp_String2QColor(settings.value(group+"useraction_opaque_brushcolor", jkqtp_QColor2String(defaultStyle.userActionOpaqueBrush.color())).toString())); + userActionOpaqueBrush.setStyle(jkqtp_String2QBrushStyle(settings.value(group+"useraction_opaque_brushstyle", jkqtp_QBrushStyle2String(defaultStyle.userActionOpaqueBrush.style())).toString())); + + userActionMarkerPen=defaultStyle.userActionMarkerPen; + userActionMarkerPen.setColor(jkqtp_String2QColor(settings.value(group+"useraction_marker_color", jkqtp_QColor2String(defaultStyle.userActionMarkerPen.color())).toString())); + userActionMarkerPen.setStyle(jkqtp_String2QPenStyle(settings.value(group+"useraction_marker_penstyle", jkqtp_QPenStyle2String(defaultStyle.userActionMarkerPen.style())).toString())); + userActionMarkerPen.setWidthF(settings.value(group+"useraction_marker_linewidth", defaultStyle.userActionMarkerPen.widthF()).toDouble()); + userActionMarkerBrush=defaultStyle.userActionMarkerBrush; + userActionMarkerBrush.setColor(jkqtp_String2QColor(settings.value(group+"useraction_marker_brushcolor", jkqtp_QColor2String(defaultStyle.userActionMarkerBrush.color())).toString())); + userActionMarkerBrush.setStyle(jkqtp_String2QBrushStyle(settings.value(group+"useraction_marker_brushstyle", jkqtp_QBrushStyle2String(defaultStyle.userActionMarkerBrush.style())).toString())); + + userActionMarkerDiameter=settings.value(group+"useraction_marker_diameter", defaultStyle.userActionMarkerDiameter).toInt(); + userActionMarkerType=String2JKQTPUserActionMarkerType(settings.value(group+"useraction_marker_type",JKQTPUserActionMarkerType2String(defaultStyle.userActionMarkerType)).toString()); + + maxTooltipDistance=settings.value(group+"max_tooltip_distance", defaultStyle.maxTooltipDistance).toInt(); + userActionCatchSensitivity=settings.value(group+"useraction_catch_sensitivity", defaultStyle.userActionCatchSensitivity).toInt(); + userActionFontName=settings.value(group+"useraction_font_name", defaultStyle.userActionFontName).toString(); + userActionFontSize=settings.value(group+"useraction_font_size", defaultStyle.userActionFontSize).toDouble(); + toolbarEnabled=settings.value(group+"toolbar_enabled", defaultStyle.toolbarEnabled).toBool(); toolbarAlwaysOn=settings.value(group+"toolbar_always_visible", defaultStyle.toolbarAlwaysOn).toBool(); displayMousePosition=settings.value(group+"display_mouse_position", defaultStyle.displayMousePosition).toBool(); @@ -84,7 +128,33 @@ void JKQTPlotterStyle::saveSettings(QSettings &settings, const QString &group) c { int cnt=0; - settings.setValue(group+"useraction_color", jkqtp_QColor2String(userActionColor)); + settings.setValue(group+"max_tooltip_distance", maxTooltipDistance); + settings.setValue(group+"useraction_catch_sensitivity", userActionCatchSensitivity); + + settings.setValue(group+"useraction_overlay_color", jkqtp_QColor2String(userActionOverlayPen.color())); + settings.setValue(group+"useraction_overlay_penstyle", jkqtp_QPenStyle2String(userActionOverlayPen.style())); + settings.setValue(group+"useraction_overlay_linewidth", userActionOverlayPen.widthF()); + settings.setValue(group+"useraction_overlay_brushcolor", jkqtp_QColor2String(userActionOverlayBrush.color())); + settings.setValue(group+"useraction_overlay_brushstyle", jkqtp_QBrushStyle2String(userActionOverlayBrush.style())); + + settings.setValue(group+"useraction_opaque_color", jkqtp_QColor2String(userActionOpaquePen.color())); + settings.setValue(group+"useraction_opaque_penstyle", jkqtp_QPenStyle2String(userActionOpaquePen.style())); + settings.setValue(group+"useraction_opaque_linewidth", userActionOpaquePen.widthF()); + settings.setValue(group+"useraction_opaque_brushcolor", jkqtp_QColor2String(userActionOpaqueBrush.color())); + settings.setValue(group+"useraction_opaque_brushstyle", jkqtp_QBrushStyle2String(userActionOpaqueBrush.style())); + + settings.setValue(group+"useraction_marker_color", jkqtp_QColor2String(userActionMarkerPen.color())); + settings.setValue(group+"useraction_marker_penstyle", jkqtp_QPenStyle2String(userActionMarkerPen.style())); + settings.setValue(group+"useraction_marker_linewidth", userActionMarkerPen.widthF()); + settings.setValue(group+"useraction_marker_brushcolor", jkqtp_QColor2String(userActionMarkerBrush.color())); + settings.setValue(group+"useraction_marker_brushstyle", jkqtp_QBrushStyle2String(userActionMarkerBrush.style())); + settings.setValue(group+"useraction_marker_diameter", userActionMarkerDiameter); + settings.setValue(group+"useraction_marker_type", JKQTPUserActionMarkerType2String(userActionMarkerType)); + + settings.setValue(group+"useraction_font_name", userActionFontName); + settings.setValue(group+"useraction_font_size", userActionFontSize); + + settings.setValue(group+"toolbar_enabled", toolbarEnabled); settings.setValue(group+"toolbar_always_visible", toolbarAlwaysOn); settings.setValue(group+"toolbar_icon_size", toolbarIconSize); diff --git a/lib/jkqtplotter/jkqtplotterstyle.h b/lib/jkqtplotter/jkqtplotterstyle.h index 0a8ab55658..636e6d31d1 100644 --- a/lib/jkqtplotter/jkqtplotterstyle.h +++ b/lib/jkqtplotter/jkqtplotterstyle.h @@ -64,12 +64,38 @@ public: + /** \brief maximum distance at which a tooltip for a point is still displayed, when the user action jkqtpmdaToolTipForClosestDataPoint is executed */ + int maxTooltipDistance; + /** \brief sensitivity (i.e. max. distance to see as one point) for user actions */ + int userActionCatchSensitivity; + /** \brief width/height of the icons in the plotter toolbar in pixel */ int toolbarIconSize; - /** \brief fill color of the zoom rectangle \see \ref JKQTPLOTTER_USERMOUSEINTERACTION_MOUSEDRAG */ - QColor userActionColor; - /** \brief the QPainter::CompositionMode used to draw the zoom rectangle etc. \see \ref JKQTPLOTTER_USERMOUSEINTERACTION_MOUSEDRAG */ - QPainter::CompositionMode userActionCompositionMode; + /** \brief pen for user actions that overlay the plot (typically semi-transparent, like e.g. zoom-rectangles) \see \ref JKQTPLOTTER_USERMOUSEINTERACTION_MOUSEDRAG */ + QPen userActionOverlayPen; + /** \brief brush for user actions (typically semi-transparent, like e.g. zoom-rectangles) \see \ref JKQTPLOTTER_USERMOUSEINTERACTION_MOUSEDRAG */ + QBrush userActionOverlayBrush; + + /** \brief pen for user actions that cover parts of the plot (typically opaque, like e.g. tooltips) \see \ref JKQTPLOTTER_USERMOUSEINTERACTION_MOUSEDRAG */ + QPen userActionOpaquePen; + /** \brief brush for user actions that cover parts of the plot (typically opaque, like e.g. tooltips) \see \ref JKQTPLOTTER_USERMOUSEINTERACTION_MOUSEDRAG */ + QBrush userActionOpaqueBrush; + + /** \brief pen for location markers of user actions on the plot \see \ref JKQTPLOTTER_USERMOUSEINTERACTION_MOUSEDRAG */ + QPen userActionMarkerPen; + /** \brief brush for location markers of user actions on the plot \see \ref JKQTPLOTTER_USERMOUSEINTERACTION_MOUSEDRAG */ + QBrush userActionMarkerBrush; + /** \brief type of the location markers of user actions on the plot \see \ref JKQTPLOTTER_USERMOUSEINTERACTION_MOUSEDRAG */ + JKQTPUserActionMarkerType userActionMarkerType; + + /** \brief font name to use for text of user actions \see \ref JKQTPLOTTER_USERMOUSEINTERACTION_MOUSEDRAG */ + QString userActionFontName; + /** \brief font size [pt] to use for text of user actions \see \ref JKQTPLOTTER_USERMOUSEINTERACTION_MOUSEDRAG */ + double userActionFontSize; + + /** \brief size (diameter) of markers drawn by user actions */ + int userActionMarkerDiameter; + /** \brief this string is used to generate the position output above the graph (\c %1 is replaced by the x-position, \c %2 by the y-position) * * By default simply "(%1, %2) is used to format this display (e.g. (1.35, -4.56)). @@ -124,6 +150,7 @@ public: /** \brief action to perform on a double-click of the mouse buttons (depending on the button and the modifiers) */ JKQTPMouseDoubleClickActionsHashMap registeredMouseDoubleClickActions; + }; diff --git a/lib/jkqtplottergui/jkqtpcomboboxes.cpp b/lib/jkqtplottergui/jkqtpcomboboxes.cpp index f907f455ee..c5af20cc97 100644 --- a/lib/jkqtplottergui/jkqtpcomboboxes.cpp +++ b/lib/jkqtplottergui/jkqtpcomboboxes.cpp @@ -209,7 +209,7 @@ JKQTPErrorPlotstyleComboBox::JKQTPErrorPlotstyleComboBox(QWidget *parent): setCurrentIndex(2); } -JKQTPErrorPlotstyle JKQTPErrorPlotstyleComboBox::getErrorStyle() const +JKQTPErrorPlotstyle JKQTPErrorPlotstyleComboBox::getErrorLineStyle() const { return String2JKQTPErrorPlotstyle(itemData(currentIndex()).toString()); } diff --git a/lib/jkqtplottergui/jkqtpcomboboxes.h b/lib/jkqtplottergui/jkqtpcomboboxes.h index 3b4447a91e..74c6e6912e 100644 --- a/lib/jkqtplottergui/jkqtpcomboboxes.h +++ b/lib/jkqtplottergui/jkqtpcomboboxes.h @@ -154,7 +154,7 @@ class JKQTP_LIB_EXPORT JKQTPErrorPlotstyleComboBox: public QComboBox { public: JKQTPErrorPlotstyleComboBox(QWidget* parent=nullptr); - JKQTPErrorPlotstyle getErrorStyle() const; + JKQTPErrorPlotstyle getErrorLineStyle() const; void setSymbolType(JKQTPErrorPlotstyle symbol); void setCurrentErrorStyle(JKQTPErrorPlotstyle symbol); protected: diff --git a/lib/jkqtplotterressources/images/jkqtp_mouseact_default.png b/lib/jkqtplotterressources/images/jkqtp_mouseact_default.png new file mode 100644 index 0000000000000000000000000000000000000000..d2ca4028575ab4c5efb4212cd8e5d611a6cb7cba GIT binary patch literal 953 zcmV;q14jIbP)#t&8X^T80XrUmO#7c!W z1XNszU=wlUVm4VAbX8EfFRq-`wEsXNh$x!3C@#85rIb=zaBS7OXkC<9NLyu4oS42& zeBUl=g6(85{+I)o%l-1b=fgR`ztRA_g;%Ig0FbWhKLhv_z`OVAo=7CVV2n|Fdpp(C z)D$maj{!^qFz({b0idCw;a9^j5C{Ztcz7sm+s5$l@cUk`_aT5MQpz6zOaOS}RurXF zFdB`L*XyN|lM`|rhaAVD)6-M3ZJXlpxa;wFE*N93rfJ_@!kTWvV98|icg7g4uCA5= zSI_bBF=a9t>g(&f&@}CWb6x~6bDc52ys5UfcF8ad%4V|_7kxe-VzC%(+va0qV;q2J zZf<^BEdT)4+S=OK`uaKwg~CfeOixcElgVIkaPaR$BJtIAfU9E3WbzNj7_F_XRjetU zP7?r%Mx)P_QoT1Z2LLFg9vOz=#$vIGfP;erYH4X9uh;t0pdE(gEg|E84kYXGm`Gz6QNnD~=1M%iqZ9LJ%_$w?AIP&%D1C)wZMr>3T+ zqLgw6K;4Z9N~zBb!*JvAI89AW5o3%@({zOpl*weukiESbm|DfZD17sZ^>b z5{Zxyf*4~oFfj03DRtJ}-R%k?XklTY4B6e?rTY5%qLlJ6fY&Pd@&6B8*ZnpS2t4JS zqrbnu*xA_`<(z*UiA3_jV9*^OAIHkd3IM<~P2_Sp;rILBlTzjY_^Yky^O>2Mzbwo8 z=*lc;S=O^~IP3}`XmN3|oMd}@o9gQ7ic-oS0Qjy2%+JsJlv1q~>I+$x^{i4|J3Bk2 zy1uUp@-n4TsgP1C9}0zBAp|WgEtMggo14TrCjjYN0{}oN^?_ws=OxJU@-pS~c^VoT zA}J+xbaXtp6W}sQk7ZfsU0q$SrfC!ohe_9U8XX-yo12?^r?e+-3)tA$c+%V3`%Pd}IQMuwJxZzlyL!GLrBpyE_4d6R bSEGLbB*3y8%q^c_00000NkvXXu0mjf97neM literal 0 HcmV?d00001 diff --git a/lib/jkqtplotterressources/images/jkqtp_mouseact_default.svg b/lib/jkqtplotterressources/images/jkqtp_mouseact_default.svg new file mode 100644 index 0000000000..512989f8e6 --- /dev/null +++ b/lib/jkqtplotterressources/images/jkqtp_mouseact_default.svg @@ -0,0 +1,379 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Oxygen team + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/jkqtplotterressources/images/jkqtp_mouseact_drag.png b/lib/jkqtplotterressources/images/jkqtp_mouseact_drag.png new file mode 100644 index 0000000000000000000000000000000000000000..ad8e90bed658d7039a1febba598875494da8f42a GIT binary patch literal 1109 zcmV-b1giUqP)8uZyYT zPczywvPN&n5W!V@U z9Hc-XU~taE0F-n(^1b;Nob!myX8SIYNc<6vMrmYZ#10@3jYi>exzO9&n_*d&&F}YP zYHG^n^?E;*Wx4A~T{FhMZ)|KNpU)SUB-EMZNwW6#_Go2gg#gg%>M98#sJ*@23WY)> zgdiaV)z{Y>ob$1#g!nuwD=V(+IxQ?LkSxnqcXxM62tlo_t=6@{{o38#B~?`u06u!m zK;@jDOiWCW5P~{7I+AX;I}wY;{#N*QH8nK}&iUw5mg(#A@^W1WK^GSn)Y8&Ikx1lG zgXQIAVvOkkcsgy#>2$tgj9mes>FMc5MekQ$Ufvaemvs;jHJA&Ce8kW3~qJUk2{LNFM_+S(d~ z5C8zb-wz>#FP#BWsnjoHV`C-&WM^k1BO~L68yp6gt}fDbopfEN&dyG{ zyu75PrKRgXNxBxie@VUJoWE36^}}E=DBUKqv$L_awFSl)3JMAkkH>LvaDbAM5)>B~ z!|8M)91bHK4sQt|en^)900K6f&D_}7c#z`s^z^3lSS&^>D=T;S?d@$+6eS6uFkJ!w zc&#XkG&(x^nPC`8Zf>sRcDn%pHk%EWWr2v`@pzDz_x65^L?Rd(8ltwgHep#-B$-V9 z4B*YXQUE}$!{K + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Oxygen team + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/jkqtplotterressources/images/jkqtp_mouseact_ruler.png b/lib/jkqtplotterressources/images/jkqtp_mouseact_ruler.png new file mode 100644 index 0000000000000000000000000000000000000000..b530d18a63efd192d3270efa8e145ac495eabe8b GIT binary patch literal 1076 zcmV-41k3x0P)9t#J?FuC*sAOQ6sSfPO zN{FBv#>Be0011vH@lpcaqh;~2=M`g_yB6#zirZ7Om)E$ zn&dx#d+fHAJ$>g6o1e5AwV}_uf#9M^$L%{4Wz&LuW>Eqh$32c!D|;@Te+WC2<98CrZbJ1s1I zV!;g*W%imRX2L(78`wILm?A$t{uA_c9t6A1q%C0>2HSj36SqQ>RAXv!%F^3OR7<|Lw!iFI^d zc)p+jU-4`AhhQioVI&lRkx&HeHq(7cV>NMO_-<)9!aGDsIh(WKz9cgQ81N>B^1Qld zD;XS(g16-pVCX`q-&~-k0i=R+c)pU;zMtk<#xkFSDhk$Z3T506O*60c2$vl)igvp5&F?bxA90 z{OnPT|D7m1vNAKE&Zv{;FAQzU&&wmp@lT!CP%7fHIKabg+P77;JCas2jK%tmJvYI4#J( z=Xj)tF`KA&>O5f~LvV uWrNR!EvDLw3U#8vK)$f-@T` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Oxygen team + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/jkqtplotterressources/images/jkqtp_mouseact_tooltip.png b/lib/jkqtplotterressources/images/jkqtp_mouseact_tooltip.png new file mode 100644 index 0000000000000000000000000000000000000000..f331f11f0c4d8923fdf179fe0a38efdb21ec1705 GIT binary patch literal 802 zcmV+-1Ks?IP)NTL1u76E;9W6-LD?AM#;uxQ zT)A}N!mUf=()b75iN-{U@yd=wi5NvRm>>!o2vACI*wR8vn{(id3$C$%iDAjJn(v!$ z-Z%5kzz+XH!ZiuIme;z38xq8J=_^1S=#*dp?SNZ=+%5wEB(zD0Nw~eO!hn#V0uTGB zE0*AIW~5cX>~zX19U5dS?Clpl^+Dhrr1cffm26*;ll1%23 zp{x6*!zuCdNi- zJavXbSJA5Xt7lUQSo%flXzL41WReqO^Q)cYOoA_;KHzXV_|Wr)p6)KDf&t?3X@Y@q zs;c*~U|D3d*$qQe{%)k_7Vkc4A4>!H$|@)*DB$qX1^_DjmFT(yq~usbBQ>@4L_$Gq zX_L)nHhz`-R)^a#oPl@!t%j!M`IDSUP-1vC6kE^fV_k_<@`6{(-)c(>_2o=@ZqXR{ z+J&pgO<9GXSTusJX-FvvOeh>b(ZsLe?^u?}$j>3po;%OS_uVu#w=n$U+vX9iN7Xd; zR#r2g$xu~YgJoG5o;}1OA#B@baG;+^D9G*-gOOiDjE(*z910@DS}1l$6HGMfg=cwe7Bs@^8f$<07*qoM6N<$f)RCb$^ZZW literal 0 HcmV?d00001 diff --git a/lib/jkqtplotterressources/images/jkqtp_mouseact_tooltip.svg b/lib/jkqtplotterressources/images/jkqtp_mouseact_tooltip.svg new file mode 100644 index 0000000000..5cf2aeaa3c --- /dev/null +++ b/lib/jkqtplotterressources/images/jkqtp_mouseact_tooltip.svg @@ -0,0 +1,395 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Oxygen team + + + + + + + + + + + + + + + + + + + + + + + Graph1:[123,456] + + diff --git a/lib/jkqtplotterressources/images/jkqtp_mouseact_zoomrect.png b/lib/jkqtplotterressources/images/jkqtp_mouseact_zoomrect.png new file mode 100644 index 0000000000000000000000000000000000000000..2edef8d759a2ddd29ac36f6bac10047038e7b9cd GIT binary patch literal 1044 zcmV+v1nc{WP)l2=iY(;TLK3K1_jy#90L6U0|H)wx1)0n0uKpX7dRWu z>kueS1n`PLr$AP8e7`_}fD*_MC=^H)(4)_}(YOl&Rfzy{1uFkVoYCOIV9r+ZvHhE&<1=F4=^@1Rt*%owr;ytc;xl39J;>J z>%qfEP66aU@+ej)m~x}9=Sk%--eI{TE7E}7z!UKR!1DmUvdZ4o<^b7ktyP}>zAS+J zXAfOe4oBFwm!2_AbIsY%fHL64bpUw)=?@f)#!eWa*>ocq*aBd`!w{ zw*T;IiF?Be0BUP%vw%+EUfp#^(BsR!;!eABDm)i*2Sx_(`)hj2t0|=1IgC%AS@BaM zo%7+O{Rv$ae!oA%w(Vmqe{E~3PSq{zap#C5LxtjX<6J_3RUmI95~o2SWAR<0aaIX?P^hRmqSR|8O-p%v@?E2E&GLWzqyGjIzguK6F|x$~ O0000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Oxygen team + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/jkqtplotterressources/images/kruler.png b/lib/jkqtplotterressources/images/kruler.png new file mode 100644 index 0000000000000000000000000000000000000000..bcf908fc17d348c2ee42e18f5ded5ddfa3bf88d9 GIT binary patch literal 771 zcmV+e1N{7nP)ZqILh{neLW+`7FT zZr=RN@7}u;KK^veAKbsM8#g}j2S5F&>(@W>Zl|NG*FN-ax1-I?Yu@ekw6Ss3f9`d) zzP`@R&JG(JSGcqN1K)l7O%?!V(~wH1&Na&tS))~y*HQ@Ip)T5Fb3_#1?uQvhAHAMB*#gRL~9{qR@Jx}m_PqN3M4~%{Q{eIF8RwVZ;;_F*RaI288UD`@5iUrA5z;y8*tD$xQo_Pw8=84h zl_h5733xIoeD7hWcK2r8#$y~DL7L5zhB-7Bz$GOqN!s#|waC(p`NbuOhD%CgMKOBT ztlQwIy!-vFUt9m@F8o^uN9A_Y>lsKdevmT<{|#15VeHHgC941c002ovPDHLkV1mDr BTmk?9 literal 0 HcmV?d00001 diff --git a/lib/jkqtplotterressources/jkqtpbaseplotter.qrc b/lib/jkqtplotterressources/jkqtpbaseplotter.qrc index e2d0e7b88a..e0f62d1f4e 100644 --- a/lib/jkqtplotterressources/jkqtpbaseplotter.qrc +++ b/lib/jkqtplotterressources/jkqtpbaseplotter.qrc @@ -73,5 +73,12 @@ images/plot_mimage.png images/plot_image.png images/plot_rgbimage.png + + + images/jkqtp_mouseact_ruler.png + images/jkqtp_mouseact_tooltip.png + images/jkqtp_mouseact_default.png + images/jkqtp_mouseact_drag.png + images/jkqtp_mouseact_zoomrect.png diff --git a/lib/jkqtplotterressources/styles/default.ini b/lib/jkqtplotterressources/styles/default.ini index b5b9c50672..9ee745d5a1 100644 --- a/lib/jkqtplotterressources/styles/default.ini +++ b/lib/jkqtplotterressources/styles/default.ini @@ -40,8 +40,8 @@ graph_default_error_color_mode=darker graph_default_error_fill_color_mode=even_lighter text_default_color=black text_default_size=8 -text_default_font_name=MS Shell Dlg 2+XITS -plot_label_font_name=MS Shell Dlg 2+XITS +text_default_font_name=Arial+XITS +plot_label_font_name=Arial+XITS plot_label_font_size=12 plot_frame_visible=false plot_frame_color=black diff --git a/lib/jkqtplotterressources/styles/simple_axesoffset.ini b/lib/jkqtplotterressources/styles/simple_axesoffset.ini index 89b62cac84..5335c8e573 100644 --- a/lib/jkqtplotterressources/styles/simple_axesoffset.ini +++ b/lib/jkqtplotterressources/styles/simple_axesoffset.ini @@ -37,8 +37,8 @@ graph_default_symbol_linewidtht=1 graph_default_palette=Matlab text_default_color=black text_default_size=8 -text_default_font_name=MS Shell Dlg 2+XITS -plot_label_font_name=MS Shell Dlg 2+XITS +text_default_font_name=Arial+XITS +plot_label_font_name=Arial+XITS plot_label_font_size=12 plot_frame_visible=false plot_frame_color=black diff --git a/lib/jkqtplotterressources/styles/simple_axesoffset_plotbox.ini b/lib/jkqtplotterressources/styles/simple_axesoffset_plotbox.ini index 92a7470c94..55705804a8 100644 --- a/lib/jkqtplotterressources/styles/simple_axesoffset_plotbox.ini +++ b/lib/jkqtplotterressources/styles/simple_axesoffset_plotbox.ini @@ -38,8 +38,8 @@ graph_default_symbol_linewidtht=1 graph_default_palette=Matlab text_default_color=black text_default_size=8 -text_default_font_name=MS Shell Dlg 2+XITS -plot_label_font_name=MS Shell Dlg 2+XITS +text_default_font_name=Arial+XITS +plot_label_font_name=Arial+XITS plot_label_font_size=12 plot_frame_visible=true plot_frame_color=black diff --git a/lib/jkqtplotterressources/styles/simple_gridandticks.ini b/lib/jkqtplotterressources/styles/simple_gridandticks.ini index 1ef669697f..268b458b51 100644 --- a/lib/jkqtplotterressources/styles/simple_gridandticks.ini +++ b/lib/jkqtplotterressources/styles/simple_gridandticks.ini @@ -37,8 +37,8 @@ graph_default_symbol_linewidtht=1 graph_default_palette=Matlab text_default_color=black text_default_size=8 -text_default_font_name=MS Shell Dlg 2+XITS -plot_label_font_name=MS Shell Dlg 2+XITS +text_default_font_name=Arial+XITS +plot_label_font_name=Arial+XITS plot_label_font_size=12 plot_frame_visible=false plot_frame_color=black diff --git a/lib/jkqtplottertools/jkqtpdrawingtools.cpp b/lib/jkqtplottertools/jkqtpdrawingtools.cpp index d1e751464a..e34061e31f 100644 --- a/lib/jkqtplottertools/jkqtpdrawingtools.cpp +++ b/lib/jkqtplottertools/jkqtpdrawingtools.cpp @@ -254,3 +254,23 @@ QVector JKQTPDrawEllipse(double x, double y, double a, double b, double } + +void JKQTPDrawTooltip(JKQTPEnhancedPainter &painter, double x, double y, const QRectF &rect) +{ + QPolygonF poly; + if (yrect.bottom()) { + poly<rect.left()) { + poly< JKQTPDrawEllipse(double x, double y, double a, double b, double angle_start=0, double angle_end=360, double alpha=0, int controlPoints=180, QPointF* x_start=nullptr, QPointF* x_end=nullptr); +/*! \brief draw a tooltip, using the current brush and pen of the provided painter + \ingroup jkqtptools_drawing + + \param painter JKQTPEnhancedPainter to use for painting + \param x x-coordinate of position the tooltip points to + \param y y-coordinate of position the tooltip points to + \param rect rectangle of the main tooltip area +*/ +JKQTP_LIB_EXPORT void JKQTPDrawTooltip(JKQTPEnhancedPainter& painter, double x, double y, const QRectF& rect); + #endif // JKQTPDRAWINGTOOLS_H_INCLUDED diff --git a/lib/jkqtplottertools/jkqtptools.cpp b/lib/jkqtplottertools/jkqtptools.cpp index 626e784567..33a7764364 100644 --- a/lib/jkqtplottertools/jkqtptools.cpp +++ b/lib/jkqtplottertools/jkqtptools.cpp @@ -979,6 +979,9 @@ JKQTPMouseDragActions String2JKQTPMouseDragActions(const QString &act) if (s=="jkqtpmdadrawrectforevent"||s=="drawellipse"||s=="ellipse") return jkqtpmdaDrawEllipseForEvent; if (s=="jkqtpmdadrawrectforevent"||s=="drawline"||s=="line") return jkqtpmdaDrawLineForEvent; if (s=="jkqtpmdascribbleforevents"||s=="scribble") return jkqtpmdaScribbleForEvents; + if (s=="jkqtpmdatooltipforclosestdatapoint"||s=="closestdatapointtooltip"||s=="tooltipforclosestdatapoint"||s=="tooltip") return jkqtpmdaToolTipForClosestDataPoint; + if (s=="jkqtpmdaruler"||s=="ruler") return jkqtpmdaRuler; + return jkqtpmdaZoomByRectangle; @@ -994,6 +997,8 @@ QString JKQTPMouseDragActions2String(JKQTPMouseDragActions act) if (act==jkqtpmdaDrawEllipseForEvent) return "DrawEllipse"; if (act==jkqtpmdaDrawLineForEvent) return "DrawLine"; if (act==jkqtpmdaScribbleForEvents) return "Scribble"; + if (act==jkqtpmdaToolTipForClosestDataPoint) return "ToolTipForClosestDataPoint"; + if (act==jkqtpmdaRuler) return "Ruler"; return "unknown"; } @@ -1067,3 +1072,22 @@ QColor JKQTPGetDerivedColor(JKQTPColorDerivationMode mode, const QColor &col) } return col; } + +QString JKQTPUserActionMarkerType2String(JKQTPUserActionMarkerType act) +{ + switch(act) { + case jkqtpuamtCircle: return "circle"; + case jkqtpuamtCrossHair: return "crosshair"; + case jkqtpuamtCircleAndCrossHair: return "circle+crosshair"; + } + return "circle"; +} + +JKQTPUserActionMarkerType String2JKQTPUserActionMarkerType(const QString &act) +{ + QString m=act.trimmed().toLower(); + if (m=="circle") return jkqtpuamtCircle; + if (m=="crosshair" || m=="cross") return jkqtpuamtCrossHair; + if (m=="circle+crosshair" || m=="circle+cross") return jkqtpuamtCircleAndCrossHair; + return jkqtpuamtCircle; +} diff --git a/lib/jkqtplottertools/jkqtptools.h b/lib/jkqtplottertools/jkqtptools.h index 9bf11bcde0..6e2d061f4e 100644 --- a/lib/jkqtplottertools/jkqtptools.h +++ b/lib/jkqtplottertools/jkqtptools.h @@ -41,6 +41,7 @@ #include #include #include +#include #include #include #include @@ -136,6 +137,33 @@ inline bool JKQTPIsOKFloat(T v) { return std::isfinite(v)&&(!std::isinf(v))&&(!std::isnan(v)); } + +/** \brief Styles in which to mark single positions during user actions in JKQTPlotter + * \ingroup jkqtptools + + */ +enum JKQTPUserActionMarkerType { + jkqtpuamtCircle=0, /*!< \brief a small circle around the position to mark */ + jkqtpuamtCrossHair=1, /*!< \brief a cross-hair to the position to mark */ + jkqtpuamtCircleAndCrossHair=2, /*!< \brief a cross-hair to the position to mark, with a circle-marker around the actual target (i.e. combines jkqtpuamtCircle and jkqtpuamtCrossHair) */ +}; + + +/** \brief convert a JKQTPUserActionMarkerType to a QString + * \ingroup jkqtptools + * + * \see String2JKQTPUserActionMarkerType(), JKQTPUserActionMarkerType + */ +JKQTP_LIB_EXPORT QString JKQTPUserActionMarkerType2String(JKQTPUserActionMarkerType act); +/** \brief convert a QString (created by JKQTPUserActionMarkerType2String() ) to JKQTPUserActionMarkerType + * \ingroup jkqtptools + * + * \see JKQTPUserActionMarkerType2String(), JKQTPUserActionMarkerType + */ +JKQTP_LIB_EXPORT JKQTPUserActionMarkerType String2JKQTPUserActionMarkerType(const QString &act); + + + /** \brief Availble action this JKQtPlotter can perform when mouse events occur. * This allows you to e.g. draw rectangles or lines over the plot and receive a signal, when the drawing finishes * \ingroup jkqtptools @@ -150,8 +178,11 @@ enum JKQTPMouseDragActions { jkqtpmdaDrawEllipseForEvent, /*!< \brief draw an ellipse and when finished execute the signal JKQTPlotter::userEllipseFinished() \image html draw_ellipse.gif "Draw Ellipse User-Action" */ jkqtpmdaDrawLineForEvent, /*!< \brief draw a line and when finished execute the signal JKQTPlotter::userLineFinished() \image html draw_line.gif "Draw Lines User-Action" */ jkqtpmdaScribbleForEvents, /*!< \brief let the user scribble on the plot (left mouse button is kept pressed) and call JKQTPlotter::userScribbleClick() for each new position */ + jkqtpmdaToolTipForClosestDataPoint, /*!< \brief shows a tooltip with data of the closest data-point in the plot \image html tooltiptool.gif */ + jkqtpmdaRuler, /*!< \brief shows a ruler over the plot, which measures delta X, delta Y and sqrt(dx^2+dy^2) \image html rulertool.gif */ }; + /** \brief convert a JKQTPMouseDragActions to a QString * \ingroup jkqtptools * @@ -287,6 +318,26 @@ enum JKQTPColorDerivationMode { */ JKQTP_LIB_EXPORT QColor JKQTPGetDerivedColor(JKQTPColorDerivationMode mode, const QColor& col); +/** \brief construct a QColor, based on the given \a color, but with alpha set to the specified value \a alphaF + * \ingroup jkqtptools + * \see QColorWithAlpha() + */ +inline QColor QColorWithAlphaF(const QColor& color, qreal alphaF) { + QColor c=color; + c.setAlphaF(alphaF); + return c; +} + +/** \brief construct a QColor, based on the given \a color, but with alpha set to the specified value \a alpha + * \ingroup jkqtptools + * \see QColorWithAlphaF() + */ +inline QColor QColorWithAlpha(const QColor& color, int alpha) { + QColor c=color; + c.setAlpha(alpha); + return c; +} + /** \brief convert a JKQTPColorDerivationMode to a QString * \ingroup jkqtptools * @@ -867,4 +918,26 @@ inline T jkqtp_roundTo(const double& v) { return static_cast(round(v)); } + + +/** \brief compare two floats \a a and \a b for euqality, where any difference smaller than \a epsilon is seen as equality */ +inline bool jkqtp_approximatelyEqual(float a, float b, float epsilon=2.0*std::numeric_limits::epsilon()) +{ + return fabsf(a - b) <= epsilon; +} + +/** \brief compare two doubles \a a and \a b for euqality, where any difference smaller than \a epsilon is seen as equality */ +inline bool jkqtp_approximatelyEqual(double a, double b, double epsilon=2.0*std::numeric_limits::epsilon()) +{ + return fabs(a - b) <= epsilon; +} + +/** \brief returns the quare of the value \a v, i.e. \c v*v */ +template +inline T jkqtp_sqr(const T& v) { + return v*v; +} + + + #endif // JKQTPTOOLS_H_INCLUDED diff --git a/screenshots/test_user_interaction.png b/screenshots/test_user_interaction.png index 50737dfcb844e4bdf87571c0ce7d20451fedd7ad..5b45a6f299bd8c5ea999a03f174a0384b9fb09e8 100644 GIT binary patch literal 88543 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 OLsd}=`BvTv{eJ)#&Mk-l literal 49202 zcmeFZXH*pH)-8+*2nb5fA_7eglCugD8)#w!O_ZELkPIR=L84@kjAWYJcn29YPgqsGI)z#vdmkkP=v zxONW%>?y-<78t^3oV(L$sT~0j8CdiWCM$Wz>zICRo5R?h^&rQw)ro zo#=m8dYuZ*fs@3pvbwICPL{47CN35j@-7w@j!&(fT#cYOz%6Y>iZW7Ko<_Ur*V9O4 zzxGnx%XrS~)5Fizm{DLQA=#OXwMVKw?7FTAQI(SUjAIGMyjBq|>K_ghB_mRok_92m z6^WTPK%G~WUY{42O;1ivN>)i$@k>hbw|(BI)N1pF8X8W1I8NQn*vo$1Lk5_Gfk98I z>j$f#XLO2VR`E_uh)TZq>}+}R9wk0@K>Ong{Mi9xilg&Yl2{{fBCeF&jk@HoOe1Egy|Fh0?q=^9I<>^_4QJq!v`lQh=-;hz@{>7trRW-8zr|nWzNeYf zKkEFpbKF0F3uoyIes$7q__Ino_d)BVBra#sVuYTzK5_ak96h0&no|us0hv}@Cw?7i zN7R#wg4bbKirEhPZwwfXl0C>izDjkNFX!7&PsjqB3dQf4Dn2x-m2hVpKZ1G=g8KYY zT4$!G910nvzJ8xK7TW!~Wt_R?CJP(pF!t2LLk^m!B3PZ*!c~=|zJ8dY+FOa0k+JV zD{&P;mCxKZJxJDlh0k=(#52x@P8N{dl0VcW=N%#h*1}jmqaJJfwD~zrK6FD|*w-_l zyKJ}3B{fxudis3ZXyIs&8os&HSmqutYbV0mLYmJ zG#NBjUiEV#gYMAz4Rw!-3e5SusbU?wx{n3CW4F*dRd+%~A$it$QltNC704nD`m@pX zdzV*hJ|-2&RTBaX_Jr>qbl|onOG}Or%Gg$!Gkjw)v6zA{9?qnRDi+%j^ z)AQ74KPR&nS7@L-1GC%WSI5(u1U24%t%{H(@4^n|bYqXT#_>=D)MTaUgU#yc6f=9n z`SV0gR{q{i8~lsSDf&1a^+P4O%C~D6*h~7bpm_OKxdyprK17`DO(Y(|Dj5qzEKYC; z>(2FJ^vh5c`nlo7AZe4K5G|j(;ZY@!T#}e2;8lWwN0Jv`B>U{5FV0noCn==nI<4Q2 z1k2r8&LSbgEr&A>zvxJlI7`D5^667W<_!%#MX|ip-&`s$<_QdxJZ(67|K%rU=Hu}r zPH_j)Z&P;)rQ1^6tRg4 zztWM5?_Az+TBPG0L_eR14 z@cs!8E;7?z$Z4+HeK$q0SSN;_=KiLR$371oJ(RZt996*-!l5%m!Si0pcKyXIwo|+s8dV|KA4b2dHFn4?Y!{%Zri3sc|>s(->DT7 zVHdlVDpUdiD}|Fgq?_wS7T;S=P_LR~&!wl4bQ>)!3jb8jXXm^WxAyF~hH{g|=Xf&w z6Ejw_LC~}T+`gln!`H!Va$R`gXNW+uV+X?XT~aFTdPW@_XI-{iRL# zbJFKY(Z56tU$^3c9~_sAST);w`QKwTtg$`JN2oxd+tcOxRqlgxHFi_w`bu#7)zt>MePOyP?hVPWdAhW+ z{hh5}5pGZ~59!)I?2=WS)Dm~% zS@+8O{NsVL;bYR57htT7BL_F@fkPksLULZ<*WGf{fe4FQuIaIko<@oIT5_wfBi)#a zv#@(6)vS!imo7V_u7A2`P*2Qz>nHu!mFl3}gNS9e+353`kN03x$142vFeRU$ON2C- z+MT^+#jVHhI2CpQ4lkR-Dszi1%PJy>$Fw8TYkbp=29QY0B2MwQHGRzCpNhYvC`GGe zv{7FM51fMAlRv6rR;-3$jracw$nht3zhe=Nsyq3d+|PHb9Ebg08|8=<3i>Do4 z{BE6x5^{hTMRS#wTp%dWI1e@DR3fxW4kLiuj~+xi?<5U#klrEq0TqRcu~pgrIH2e} zM}0F%=dZaTMm7R^_kEGy~tCz;b(U{;F6G7&SA5fVJ?yw}<`o zI{NV{F5EMsD)`m}I8^KyZx{Ih-|zV+--fWT7n->*wdS6b(zQT1F7^iyv*PNvy2M?M z?6{vHNiU~l7e3XJ$b+A@2Prmjih*n!DMXnu17j}l*sdNS_1bUAMIDkmFLT{bT}BKl z{t){;klCgv9S~2SUvd@mE0vS#<<4@JUS|m1FRAY6nA+#7R%DrHg==E_{aRD-@*mH> zA4lap_$2Jzyyv0wi95UCS^Dn|s#lV+;UKA=PWMz6Wor8#9mjhD9rHbnTT45*W>chI zW>9Vedq7ZBSonQ$9?P+~9-olD=>1A{+6qHtpl$!{I|8_^a`*l2c()p?^Ot1gyb_ z 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