From d9f23837911cfc62e2de582b0ba0646b3a64fd42 Mon Sep 17 00:00:00 2001 From: jkriege2 Date: Thu, 22 Feb 2024 21:18:45 +0100 Subject: [PATCH] NEW: added JKQTPGLabelHalfwaysToXAxis+JKQTPGLabelHalfwaysToYAxis to JKQTPXYGraphLabels --- .gitignore | 2 ++ doc/CMakeLists.txt | 2 +- doc/images/JKQTPGLabelHalfwaysToXAxis.png | Bin 0 -> 16276 bytes doc/images/JKQTPGLabelHalfwaysToYAxis.png | Bin 0 -> 17031 bytes examples/graphlabels/graphlabels.cpp | 12 +++++++++ lib/jkqtplotter/graphs/jkqtpgraphlabels.cpp | 4 ++- .../graphs/jkqtpgraphlabelstylemixin.cpp | 24 ++++++++++++++---- .../graphs/jkqtpgraphlabelstylemixin.h | 10 ++++++-- 8 files changed, 45 insertions(+), 9 deletions(-) create mode 100644 doc/images/JKQTPGLabelHalfwaysToXAxis.png create mode 100644 doc/images/JKQTPGLabelHalfwaysToYAxis.png diff --git a/.gitignore b/.gitignore index b721d47578..4d08d5e4e5 100644 --- a/.gitignore +++ b/.gitignore @@ -187,3 +187,5 @@ Sicherungskopie_* /doc/images/JKQTPBarHorizontalAutoscaleShrinkOnly_small.png /doc/images/JKQTPBarVerticalAutoscaleMaxWidthOnly_small.png /doc/images/JKQTPBarVerticalAutoscaleShrinkOnly_small.png +/doc/images/JKQTPGLabelHalfwaysToXAxis_small.png +/doc/images/JKQTPGLabelHalfwaysToYAxis_small.png diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt index 79c66b1377..e32ae0e1e8 100644 --- a/doc/CMakeLists.txt +++ b/doc/CMakeLists.txt @@ -276,7 +276,7 @@ if(JKQtPlotter_BUILD_EXAMPLES) symbols_and_errors/JKQTPXYLineErrorGraph_JKQTPErrorBars,JKQTPXYLineErrorGraph_JKQTPErrorLines,JKQTPXYLineErrorGraph_JKQTPErrorPolygons/--iteratefunctorsteps--iteratefunctorsteps_suppressinitial--smallscreenshotplot boxplot/JKQTPBoxplotVerticalGraph,JKQTPBoxplotHorizontalGraph/--iteratefunctorsteps--iteratefunctorsteps_suppressinitial--smallscreenshotplot second_axis/JKQTBasePlotter_addSecondaryYAxis,JKQTBasePlotter_addSecondaryXAxis - graphlabels/JKQTPGLabelAwayFromXAxis,JKQTPGLabelAwayFromYAxis,JKQTPGLabelTowardsXAxis,JKQTPGLabelTowardsYAxis,JKQTPGLabelAboveData,JKQTPGLabelRightHandSide,JKQTPGLabelBelowData,JKQTPGLabelLeftHandSide,JKQTPGLabelCenteredOnData,JKQTPGLabelCenteredOnDataVertical,JKQTPGLSimpleBox,JKQTPGLSimpleBoxVertical,JKQTPGLSimpleBoxAndLine,JKQTPGLSimpleBoxAndLineVertical,JKQTPGLSimpleBoxAndLineONLYLABELS,JKQTPGLSimpleBoxAndLineONLYLABELSVertical/--iteratefunctorsteps--smallscreenshotplot + graphlabels/JKQTPGLabelAwayFromXAxis,JKQTPGLabelAwayFromYAxis,JKQTPGLabelTowardsXAxis,JKQTPGLabelTowardsYAxis,JKQTPGLabelAboveData,JKQTPGLabelRightHandSide,JKQTPGLabelBelowData,JKQTPGLabelLeftHandSide,JKQTPGLabelCenteredOnData,JKQTPGLabelCenteredOnDataVertical,JKQTPGLSimpleBox,JKQTPGLSimpleBoxVertical,JKQTPGLSimpleBoxAndLine,JKQTPGLSimpleBoxAndLineVertical,JKQTPGLSimpleBoxAndLineONLYLABELS,JKQTPGLSimpleBoxAndLineONLYLABELSVertical,JKQTPGLabelHalfwaysToXAxis,JKQTPGLabelHalfwaysToYAxis/--iteratefunctorsteps--smallscreenshotplot vectorfield/JKQTPVectorFieldGraph,JKQTPVectorFieldGraphAnchorBottom,JKQTPVectorFieldGraphAnchorMid,JKQTPVectorFieldGraphAnchorTip,JKQTPVectorFieldGraphAutoscaleLength,JKQTPVectorFieldGraphLengthFromData,JKQTPVectorFieldGraphIgnoreLength,JKQTPVectorFieldGraphIgnoreLengthAutoscaleLineWidthFromLength,JKQTPVectorFieldGraphAutoscaleLengthAutoscaleLineWidthFromLength/--iteratefunctorsteps paramvectorfield/JKQTPParametrizedVectorFieldGraph,JKQTPParametrizedVectorFieldGraphColorFromMagnitude,JKQTPParametrizedVectorFieldGraphColorFromAngle,JKQTPParametrizedVectorFieldGraphDefaultColor/--iteratefunctorsteps financialgraphs/JKQTPFinancialGraph,JKQTPFinancialGraphCandleStick,JKQTPFinancialGraphSetCandlestickTwoColor,JKQTPFinancialGraphSetCandlestickTwoColor2,JKQTPFinancialGraphSetCandlestickOneColor,JKQTPFinancialGraphOHLC,JKQTPFinancialGraphSetOHLCTwoColor,JKQTPFinancialGraphSidyBySide/--iteratefunctorsteps diff --git a/doc/images/JKQTPGLabelHalfwaysToXAxis.png b/doc/images/JKQTPGLabelHalfwaysToXAxis.png new file mode 100644 index 0000000000000000000000000000000000000000..9f33d20bb8a877d97e7da9bfdd4c6f49a0badd98 GIT binary patch literal 16276 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 Yh6SL7Un4~WZT28(iI3u?Vmf~R2i2U56951J literal 0 HcmV?d00001 diff --git a/doc/images/JKQTPGLabelHalfwaysToYAxis.png b/doc/images/JKQTPGLabelHalfwaysToYAxis.png new file mode 100644 index 0000000000000000000000000000000000000000..57b4cd22998eaac1ffc34c55dffac0410bd7ef97 GIT binary patch literal 17031 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 zsetVisible(true); + gH.first->setVisible(true); + gV.second->setLabelPosition(JKQTPGLabelHalfwaysToXAxis); + gV.second->setLabelBoxType(JKQTPGLSimpleBox); + gV.second->setDrawLabelBoxFrame(false); + gH.second->setLabelPosition(JKQTPGLabelHalfwaysToYAxis); + gH.second->setLabelBoxType(JKQTPGLSimpleBox); + gH.second->setDrawLabelBoxFrame(false); + plotV.redrawPlot(); + plotH.redrawPlot(); + }); return app.exec(); } diff --git a/lib/jkqtplotter/graphs/jkqtpgraphlabels.cpp b/lib/jkqtplotter/graphs/jkqtpgraphlabels.cpp index e6a4361964..85de279ed9 100644 --- a/lib/jkqtplotter/graphs/jkqtpgraphlabels.cpp +++ b/lib/jkqtplotter/graphs/jkqtpgraphlabels.cpp @@ -89,9 +89,11 @@ void JKQTPXYGraphLabels::draw(JKQTPEnhancedPainter& painter) { const double yv=datastore->get(static_cast(yColumn),static_cast(i)); const double x=transformX(xv); const double y=transformY(yv); + const double blXv=(0.0>=parent->getXMin() && 0.0<=parent->getXMax()) ? 0.0 : parent->getXMin(); + const double blYv=(0.0>=parent->getYMin() && 0.0<=parent->getYMax()) ? 0.0 : parent->getYMin(); if (JKQTPIsOKFloat(xv) && JKQTPIsOKFloat(yv) && JKQTPIsOKFloat(x) && JKQTPIsOKFloat(y)) { const QString label=generateLabel(xv,yv,iii); - drawLabel(painter, QPointF(x,y), QPointF(xv,yv), label, parent); + drawLabel(painter, QPointF(x,y), QPointF(xv,yv), label, parent, blXv, blYv); } } diff --git a/lib/jkqtplotter/graphs/jkqtpgraphlabelstylemixin.cpp b/lib/jkqtplotter/graphs/jkqtpgraphlabelstylemixin.cpp index c6a97b2c8c..1547bc4883 100644 --- a/lib/jkqtplotter/graphs/jkqtpgraphlabelstylemixin.cpp +++ b/lib/jkqtplotter/graphs/jkqtpgraphlabelstylemixin.cpp @@ -36,6 +36,8 @@ QString JKQTPGraphLabelPosition2String(JKQTPGraphLabelPosition pos) case JKQTPGLabelTowardsXAxis: return "label_towards_xaxis"; case JKQTPGLabelTowardsYAxis: return "label_towards_xaxis"; case JKQTPGLabelCenteredOnData: return "label_centered"; + case JKQTPGLabelHalfwaysToXAxis: return "label_halfways_to_xaxis"; + case JKQTPGLabelHalfwaysToYAxis: return "label_halfways_to_yaxis"; } return "label_away_from_xaxis"; } @@ -49,8 +51,10 @@ JKQTPGraphLabelPosition String2JKQTPGraphLabelPosition(const QString &pos) if (m=="label_right_hand_side" || m=="right_hand_side" || m=="right_hand" || m=="right" || m=="rhs") return JKQTPGLabelRightHandSide; if (m=="label_away_from_xaxis" || m=="away_from_xaxis") return JKQTPGLabelAwayFromXAxis; if (m=="label_away_from_yaxis" || m=="away_from_yaxis") return JKQTPGLabelAwayFromYAxis; - if (m=="label_towars_xaxis" || m=="towars_xaxis") return JKQTPGLabelTowardsXAxis; - if (m=="label_towars_yaxis" || m=="towars_yaxis") return JKQTPGLabelTowardsYAxis; + if (m=="label_towards_xaxis" || m=="towardds_xaxis") return JKQTPGLabelTowardsXAxis; + if (m=="label_towards_yaxis" || m=="towars_yaxis") return JKQTPGLabelTowardsYAxis; + if (m=="label_halfways_to_xaxis" || m=="halfways_to_xaxis") return JKQTPGLabelHalfwaysToXAxis; + if (m=="label_halfways_to_yaxis" || m=="halfways_to_yaxis") return JKQTPGLabelHalfwaysToYAxis; if (m=="label_centered" || m=="centered" || m=="label_centered_on_data" || m=="centered_on_data") return JKQTPGLabelCenteredOnData; return JKQTPGraphLabelDefault; } @@ -188,6 +192,8 @@ bool JKQTPGraphValueLabelStyleMixin::isLabelPositioningGrowingInX() const case JKQTPGLabelTowardsXAxis: case JKQTPGLabelTowardsYAxis: case JKQTPGLabelCenteredOnData: + case JKQTPGLabelHalfwaysToXAxis: + case JKQTPGLabelHalfwaysToYAxis: return false; } return false; @@ -206,6 +212,8 @@ bool JKQTPGraphValueLabelStyleMixin::isLabelPositioningGrowingInY() const case JKQTPGLabelLeftHandSide: case JKQTPGLabelRightHandSide: case JKQTPGLabelCenteredOnData: + case JKQTPGLabelHalfwaysToXAxis: + case JKQTPGLabelHalfwaysToYAxis: return false; } return false; @@ -231,12 +239,12 @@ JKQTPGraphLabelBoxType JKQTPGraphValueLabelStyleMixin::getLabelBoxType() const return m_labelBoxType; } -void JKQTPGraphValueLabelStyleMixin::drawLabel(JKQTPEnhancedPainter &painter, const QPointF &xDataPixel, const QPointF &xData, const QString &contents, JKQTBasePlotter *parent) const +void JKQTPGraphValueLabelStyleMixin::drawLabel(JKQTPEnhancedPainter &painter, const QPointF &xDataPixel, const QPointF &xData, const QString &contents, JKQTBasePlotter *parent, double baselineX, double baselineY) const { painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); // calculate geometry - const LabelGeometry g=calcLabelGeometry(painter, xDataPixel, xData, contents, parent); + const LabelGeometry g=calcLabelGeometry(painter, xDataPixel, xData, contents, parent, baselineX, baselineY); // draw Box if (m_drawLabelBoxFrame) painter.setPen(getLinePenForRects(painter, parent)); @@ -275,7 +283,7 @@ void JKQTPGraphValueLabelStyleMixin::drawLabel(JKQTPEnhancedPainter &painter, co parent->getMathText()->draw(painter, Qt::AlignVCenter|Qt::AlignHCenter, g.textRect, parent->getCurrentPlotterStyle().debugShowTextBoxes); } -JKQTPGraphValueLabelStyleMixin::LabelGeometry JKQTPGraphValueLabelStyleMixin::calcLabelGeometry(JKQTPEnhancedPainter &painter, const QPointF &xDataPixel, const QPointF &xData, const QString &contents, JKQTBasePlotter *parent) const +JKQTPGraphValueLabelStyleMixin::LabelGeometry JKQTPGraphValueLabelStyleMixin::calcLabelGeometry(JKQTPEnhancedPainter &painter, const QPointF &xDataPixel, const QPointF &xData, const QString &contents, JKQTBasePlotter *parent, double baselineX, double baselineY) const { LabelGeometry res; res.label=contents; @@ -304,6 +312,12 @@ JKQTPGraphValueLabelStyleMixin::LabelGeometry JKQTPGraphValueLabelStyleMixin::ca } else if (m_labelPosition==JKQTPGLabelCenteredOnData) { res.textRect=QRectF(xDataPixel.x()-res.textSize.width/2.0, xDataPixel.y()-res.textSize.overallHeight/2.0, res.textSize.width, res.textSize.overallHeight); res.boxpos=LabelGeometry::BoxCentered; + } else if (m_labelPosition==JKQTPGLabelHalfwaysToXAxis) { + res.textRect=QRectF(xDataPixel.x()-res.textSize.width/2.0, (xDataPixel.y()+parent->getYAxis()->x2p(baselineY))/2.0-res.textSize.overallHeight/2.0, res.textSize.width, res.textSize.overallHeight); + res.boxpos=LabelGeometry::BoxCentered; + } else if (m_labelPosition==JKQTPGLabelHalfwaysToYAxis) { + res.textRect=QRectF((xDataPixel.x()+parent->getXAxis()->x2p(baselineX))/2.0-res.textSize.width/2.0, xDataPixel.y()-res.textSize.overallHeight/2.0, res.textSize.width, res.textSize.overallHeight); + res.boxpos=LabelGeometry::BoxCentered; } res.boxRect=QRectF(res.textRect.x()-res.padX-res.lw/2.0, res.textRect.y()-res.padY-res.lw/2.0, res.textRect.width()+res.padX*2.0+res.lw, res.textRect.height()+res.padY*2.0+res.lw); diff --git a/lib/jkqtplotter/graphs/jkqtpgraphlabelstylemixin.h b/lib/jkqtplotter/graphs/jkqtpgraphlabelstylemixin.h index bd9c286fa1..12f5ea1800 100644 --- a/lib/jkqtplotter/graphs/jkqtpgraphlabelstylemixin.h +++ b/lib/jkqtplotter/graphs/jkqtpgraphlabelstylemixin.h @@ -53,6 +53,8 @@ enum JKQTPGraphLabelPosition { JKQTPGLabelTowardsYAxis, /*!< \brief all labels between the datapoint and the y-axis the datapoint \image html JKQTPGLabelTowardsYAxis.png */ JKQTPGLabelAwayFromYAxis, /*!< \brief all labels pointing away from the y-axis \image html JKQTPGLabelAwayFromYAxis.png */ JKQTPGLabelCenteredOnData, /*!< \brief graph label is drawn centered arond the data point \c (x,y) \image html JKQTPGLabelCenteredOnData.png */ + JKQTPGLabelHalfwaysToXAxis, /*!< \brief all labels half-ways between the datapoint and the x-axis the datapoint \image html JKQTPGLabelHalfwaysToXAxis.png */ + JKQTPGLabelHalfwaysToYAxis, /*!< \brief all labels half-ways between the datapoint and the y-axis the datapoint \image html JKQTPGLabelHalfwaysToYAxis.png */ JKQTPGraphLabelDefault=JKQTPGLabelAwayFromXAxis, @@ -182,9 +184,11 @@ public: * \brief xData x- and y-coordinate of the datapoint (needed for some JKQTPGraphLabelPosition) * \brief contents the text to be rendered * \brief parent the JKQTPBasePlotter in whos context we are drawing (e.g. needed to render \a contents ) + * \brief baselineX baseline (in graph coordinate system, not pixels) of the graph in x-direction (typically 0), needed for JKQTPGLabelHalfwaysToYAxis + * \brief baselineY baseline (in graph coordinate system, not pixels) of the graph in y-direction (typically 0), needed for JKQTPGLabelHalfwaysToXAxis * */ - void drawLabel(JKQTPEnhancedPainter& painter, const QPointF& xDataPixel, const QPointF& xData, const QString& contents, JKQTBasePlotter *parent) const; + void drawLabel(JKQTPEnhancedPainter& painter, const QPointF& xDataPixel, const QPointF& xData, const QString& contents, JKQTBasePlotter *parent, double baselineX, double baselineY) const; @@ -238,9 +242,11 @@ protected: * \brief xData x- and y-coordinate of the datapoint (needed for some JKQTPGraphLabelPosition) * \brief contents the text to be rendered * \brief parent the JKQTPBasePlotter in whos context we are drawing (e.g. needed to render \a contents ) + * \brief baselineX baseline (in graph coordinate system, not pixels) of the graph in x-direction (typically 0), needed for JKQTPGLabelHalfwaysToYAxis + * \brief baselineY baseline (in graph coordinate system, not pixels) of the graph in y-direction (typically 0), needed for JKQTPGLabelHalfwaysToXAxis * */ - LabelGeometry calcLabelGeometry(JKQTPEnhancedPainter& painter, const QPointF& xDataPixel, const QPointF& xData, const QString& contents, JKQTBasePlotter *parent) const; + LabelGeometry calcLabelGeometry(JKQTPEnhancedPainter& painter, const QPointF& xDataPixel, const QPointF& xData, const QString& contents, JKQTBasePlotter *parent, double baselineX, double baselineY) const; private: /** \brief offset of the box rectangle to the actual data point location [pt], this is used for simple boxes and is a rather close distance (e.g. JKQTPGLSimpleBox)