File indexing completed on 2024-04-28 03:48:19

0001 /*
0002     File                 : MultiRangeTest2.cpp
0003     Project              : LabPlot
0004     Description          : Second tests for multi ranges
0005     --------------------------------------------------------------------
0006     SPDX-FileCopyrightText: 2021 Martin Marmsoler <martin.marmsoler@gmail.com>
0007     SPDX-FileCopyrightText: 2021 Stefan Gerlach <stefan.gerlach@uni.kn>
0008 
0009     SPDX-License-Identifier: GPL-2.0-or-later
0010 */
0011 
0012 #include "MultiRangeTest2.h"
0013 #include "MultiRangeTest_macros.h"
0014 
0015 void MultiRangeTest2::autoScaleYAfterZoomInX() {
0016     /* 1) Zoom in X
0017      * 2) Autoscale X
0018      * 3) Check that y also changed! */
0019     LOAD_PROJECT
0020     auto refValues = horAxisP1->tickLabelValues();
0021     horAxisP1->setSelected(true);
0022     SET_CARTESIAN_MOUSE_MODE(CartesianPlot::MouseMode::ZoomXSelection)
0023 
0024     p1->mousePressZoomSelectionMode(QPointF(0.2, -150), 0);
0025     p1->mouseMoveZoomSelectionMode(QPointF(0.6, 100), 0);
0026     p1->mouseReleaseZoomSelectionMode(0);
0027 
0028     CHECK_RANGE(p1, tanCurve, Dimension::X, 0.2, 0.6); // zoom
0029     CHECK_RANGE(p1, tanCurve, Dimension::Y, -250., 250.);
0030 
0031     p1->navigate(tanCurve->coordinateSystemIndex(), CartesianPlot::NavigationOperation::ScaleAutoX);
0032 
0033     CHECK_RANGE(p1, tanCurve, Dimension::X, 0., 1.);
0034     CHECK_RANGE(p1, horAxisP1, Dimension::X, 0., 1.); // range is changed in retransform scale
0035 
0036     // retransform of horAxisP1 is done, so the tickLabelValues change back
0037     // to be in the range of 0, 1
0038     COMPARE_DOUBLE_VECTORS(horAxisP1->tickLabelValues(), refValues);
0039 }
0040 
0041 void MultiRangeTest2::autoScaleXAfterZoomInY() {
0042     LOAD_PROJECT
0043     auto refValues = vertAxisP1->tickLabelValues();
0044     vertAxisP1->setSelected(true);
0045     SET_CARTESIAN_MOUSE_MODE(CartesianPlot::MouseMode::ZoomYSelection)
0046 
0047     p1->mousePressZoomSelectionMode(QPointF(0.2, -150), 0);
0048     p1->mouseMoveZoomSelectionMode(QPointF(0.6, 100), 0);
0049     p1->mouseReleaseZoomSelectionMode(0);
0050 
0051     CHECK_RANGE(p1, sinCurve, Dimension::X, 0., 1.);
0052     CHECK_RANGE(p1, sinCurve, Dimension::Y, -1., 1.);
0053     CHECK_RANGE(p1, tanCurve, Dimension::X, 0., 1.);
0054     CHECK_RANGE(p1, tanCurve, Dimension::Y, -150., 100.); // zoom
0055     CHECK_RANGE(p1, logCurve, Dimension::X, 0., 100.);
0056     CHECK_RANGE(p1, logCurve, Dimension::Y, -10., 6.);
0057 
0058     p1->navigate(tanCurve->coordinateSystemIndex(), CartesianPlot::NavigationOperation::ScaleAutoY);
0059 
0060     // retransform of vertAxisP1 is done, so the tickLabelValues change back
0061     COMPARE_DOUBLE_VECTORS(vertAxisP1->tickLabelValues(), refValues);
0062 }
0063 
0064 /*!
0065  * \brief MultiRangeTest2::mouseWheelXAxisApplyToAllX
0066  * If applied to all x is activated, using the mousewheel on a
0067  * selected axis should also execute the mousewheel on other plots
0068  */
0069 void MultiRangeTest2::mouseWheelXAxisApplyToAllX() {
0070     LOAD_PROJECT
0071 
0072     QCOMPARE(w->cartesianPlotActionMode(), Worksheet::CartesianPlotActionMode::ApplyActionToAllX);
0073 
0074     CHECK_RANGE(p1, sinCurve, Dimension::X, 0., 1.);
0075     CHECK_RANGE(p1, sinCurve, Dimension::Y, -1., 1.);
0076     CHECK_RANGE(p1, tanCurve, Dimension::X, 0., 1.);
0077     CHECK_RANGE(p1, tanCurve, Dimension::Y, -250., 250.); // zoom
0078     CHECK_RANGE(p1, logCurve, Dimension::X, 0., 100.);
0079     CHECK_RANGE(p1, logCurve, Dimension::Y, -10., 6.);
0080     CHECK_RANGE(p2, horAxisP1, Dimension::X, 0., 1.);
0081     CHECK_RANGE(p2, cosCurve, Dimension::X, 0., 1.);
0082     CHECK_RANGE(p2, cosCurve, Dimension::Y, -1., 1.);
0083 
0084     horAxisP1->setSelected(true); // seems not to work
0085     view->m_selectedElement = horAxisP1;
0086 
0087     int counter = 0;
0088     connect(p1,
0089             &CartesianPlot::wheelEventSignal,
0090             [&counter](const QPointF& relScenePos, int delta, int xIndex, int /*yIndex*/, bool considerDimension, Dimension dim) {
0091                 QCOMPARE(delta, 10);
0092                 QCOMPARE(xIndex, 0); // x Range of horAxisP1
0093                 QCOMPARE(relScenePos.x(), 0.5);
0094                 QCOMPARE(relScenePos.y(), 0.5);
0095                 QCOMPARE(considerDimension, true);
0096                 QCOMPARE(dim, Dimension::X);
0097                 counter++;
0098             });
0099 
0100     QGraphicsSceneWheelEvent event;
0101     event.setDelta(10);
0102     event.setPos(QPointF(p1->dataRect().center().x(), p1->dataRect().center().y()));
0103     p1->d_func()->wheelEvent(&event);
0104 
0105     QCOMPARE(counter, 1);
0106 
0107     // All x ranges are zoomed, for plot 1 and plot 2
0108     CHECK_RANGE(p1, sinCurve, Dimension::X, 0.1, 0.9); // zoom
0109     CHECK_RANGE(p1, sinCurve, Dimension::Y, -1., 1.);
0110     CHECK_RANGE(p1, tanCurve, Dimension::X, 0.1, 0.9); // zoom
0111     CHECK_RANGE(p1, tanCurve, Dimension::Y, -250., 250.);
0112     CHECK_RANGE(p1, logCurve, Dimension::X, 10., 90.); // zoom
0113     CHECK_RANGE(p1, logCurve, Dimension::Y, -10., 6.);
0114     CHECK_RANGE(p2, horAxisP1, Dimension::X, 0.1, 0.9);
0115     CHECK_RANGE(p2, cosCurve, Dimension::X, 0.1, 0.9);
0116     CHECK_RANGE(p2, cosCurve, Dimension::Y, -1., 1.);
0117 }
0118 
0119 /*!
0120  * \brief MultiRangeTest2::mouseWheelXAxisApplyToAllX
0121  * If applied to all x is activated, using the mousewheel on a
0122  * selected axis should also execute the mousewheel on other plots
0123  * This time the second x axis is used. In the second plot no second x axis is used
0124  * so check that application does not crash
0125  */
0126 void MultiRangeTest2::mouseWheelTanCurveApplyToAllX() {
0127     LOAD_PROJECT
0128 
0129     QCOMPARE(w->cartesianPlotActionMode(), Worksheet::CartesianPlotActionMode::ApplyActionToAllX);
0130 
0131     CHECK_RANGE(p1, sinCurve, Dimension::X, 0., 1.);
0132     CHECK_RANGE(p1, sinCurve, Dimension::Y, -1., 1.);
0133     CHECK_RANGE(p1, tanCurve, Dimension::X, 0., 1.);
0134     CHECK_RANGE(p1, tanCurve, Dimension::Y, -250., 250.); // zoom
0135     CHECK_RANGE(p1, logCurve, Dimension::X, 0., 100.);
0136     CHECK_RANGE(p1, logCurve, Dimension::Y, -10., 6.);
0137     CHECK_RANGE(p2, horAxisP1, Dimension::X, 0., 1.);
0138     CHECK_RANGE(p2, cosCurve, Dimension::X, 0., 1.);
0139     CHECK_RANGE(p2, cosCurve, Dimension::Y, -1., 1.);
0140 
0141     tanCurve->setSelected(true); // seems not to work
0142     view->m_selectedElement = tanCurve;
0143 
0144     int counter = 0;
0145     connect(p1,
0146             &CartesianPlot::wheelEventSignal,
0147             [&counter](const QPointF& relScenePos, int delta, int xIndex, int yIndex, bool considerDimension, Dimension dim) {
0148                 Q_UNUSED(yIndex);
0149                 Q_UNUSED(dim);
0150                 QCOMPARE(relScenePos.x(), 0.5);
0151                 QCOMPARE(relScenePos.y(), 0.5);
0152                 QCOMPARE(delta, 10);
0153                 QCOMPARE(xIndex, 0); // tan curve has xIndex 0
0154                 QCOMPARE(considerDimension, false);
0155                 counter++;
0156             });
0157 
0158     QGraphicsSceneWheelEvent event;
0159     event.setDelta(10);
0160     event.setPos(QPointF(p1->dataRect().center().x(), p1->dataRect().center().y()));
0161     p1->d_func()->wheelEvent(&event);
0162 
0163     QCOMPARE(counter, 1);
0164 
0165     // All x ranges are zoomed, for plot 1 and plot 2
0166     CHECK_RANGE(p1, sinCurve, Dimension::X, 0.1, 0.9); // zoom
0167     CHECK_RANGE(p1, sinCurve, Dimension::Y, -1., 1.);
0168     CHECK_RANGE(p1, tanCurve, Dimension::X, 0.1, 0.9); // zoom
0169     // zoomed in, because with scrolling both axes are scrolled
0170     CHECK_RANGE(p1, tanCurve, Dimension::Y, -200., 200.);
0171     CHECK_RANGE(p1, logCurve, Dimension::X, 10., 90.); // zoom
0172     CHECK_RANGE(p1, logCurve, Dimension::Y, -10., 6.);
0173     CHECK_RANGE(p2, horAxisP1, Dimension::X, 0.1, 0.9);
0174     CHECK_RANGE(p2, cosCurve, Dimension::X, 0.1, 0.9);
0175     CHECK_RANGE(p2, cosCurve, Dimension::Y, -1., 1.);
0176 }
0177 
0178 void MultiRangeTest2::mouseWheelXAxisApplyToSelected() {
0179     LOAD_PROJECT
0180 
0181     w->setCartesianPlotActionMode(Worksheet::CartesianPlotActionMode::ApplyActionToSelection);
0182     QCOMPARE(w->cartesianPlotActionMode(), Worksheet::CartesianPlotActionMode::ApplyActionToSelection);
0183 
0184     CHECK_RANGE(p1, sinCurve, Dimension::X, 0., 1.);
0185     CHECK_RANGE(p1, sinCurve, Dimension::Y, -1., 1.);
0186     CHECK_RANGE(p1, tanCurve, Dimension::X, 0., 1.);
0187     CHECK_RANGE(p1, tanCurve, Dimension::Y, -250., 250.); // zoom
0188     CHECK_RANGE(p1, logCurve, Dimension::X, 0., 100.);
0189     CHECK_RANGE(p1, logCurve, Dimension::Y, -10., 6.);
0190     CHECK_RANGE(p2, horAxisP1, Dimension::X, 0., 1.);
0191     CHECK_RANGE(p2, cosCurve, Dimension::X, 0., 1.);
0192     CHECK_RANGE(p2, cosCurve, Dimension::Y, -1., 1.);
0193 
0194     horAxisP1->setSelected(true); // seems not to work
0195     view->m_selectedElement = horAxisP1;
0196 
0197     int counter = 0;
0198     connect(p1,
0199             &CartesianPlot::wheelEventSignal,
0200             [&counter](const QPointF& sceneRelPos, int delta, int xIndex, int /*yIndex*/, bool considerDimension, Dimension dim) {
0201                 Q_UNUSED(sceneRelPos);
0202                 QCOMPARE(delta, 10);
0203                 QCOMPARE(xIndex, 0); // x Range of horAxisP1
0204                 QCOMPARE(considerDimension, true);
0205                 QCOMPARE(dim, Dimension::X);
0206                 counter++;
0207             });
0208 
0209     QGraphicsSceneWheelEvent event;
0210     event.setDelta(10);
0211     event.setPos(QPointF(p1->dataRect().center().x(), p1->dataRect().center().y()));
0212     p1->d_func()->wheelEvent(&event);
0213 
0214     QCOMPARE(counter, 1);
0215 
0216     CHECK_RANGE(p1, sinCurve, Dimension::X, 0.1, 0.9); // zoom
0217     CHECK_RANGE(p1, sinCurve, Dimension::Y, -1., 1.);
0218     CHECK_RANGE(p1, tanCurve, Dimension::X, 0.1, 0.9); // zoom
0219     CHECK_RANGE(p1, tanCurve, Dimension::Y, -250., 250.);
0220     CHECK_RANGE(p1, logCurve, Dimension::X, 0., 100.); // Not zoomed
0221     CHECK_RANGE(p1, logCurve, Dimension::Y, -10., 6.);
0222     CHECK_RANGE(p2, horAxisP1, Dimension::X, 0., 1.); // Not zoomed
0223     CHECK_RANGE(p2, cosCurve, Dimension::X, 0., 1.); // Not zoomed
0224     CHECK_RANGE(p2, cosCurve, Dimension::Y, -1., 1.);
0225 }
0226 
0227 void MultiRangeTest2::axisMouseMoveApplyToAllX() {
0228     LOAD_PROJECT
0229 
0230     w->setCartesianPlotActionMode(Worksheet::CartesianPlotActionMode::ApplyActionToAllX);
0231     QCOMPARE(w->cartesianPlotActionMode(), Worksheet::CartesianPlotActionMode::ApplyActionToAllX);
0232 
0233     CHECK_RANGE(p1, sinCurve, Dimension::X, 0., 1.);
0234     CHECK_RANGE(p1, sinCurve, Dimension::Y, -1., 1.);
0235     CHECK_RANGE(p1, tanCurve, Dimension::X, 0., 1.);
0236     CHECK_RANGE(p1, tanCurve, Dimension::Y, -250., 250.);
0237     CHECK_RANGE(p1, logCurve, Dimension::X, 0., 100.);
0238     CHECK_RANGE(p1, logCurve, Dimension::Y, -10., 6.);
0239     CHECK_RANGE(p2, horAxisP1, Dimension::X, 0., 1.);
0240     CHECK_RANGE(p2, cosCurve, Dimension::X, 0., 1.);
0241     CHECK_RANGE(p2, cosCurve, Dimension::Y, -1., 1.);
0242 
0243     const int delta = -10; // delta > 0 --> right or up
0244     horAxisP1->shiftSignal(delta, Dimension::X, p1->coordinateSystem(horAxisP1->coordinateSystemIndex())->index(Dimension::X));
0245 
0246     CHECK_RANGE(p1, sinCurve, Dimension::X, 0.1, 1.1); // shift
0247     CHECK_RANGE(p1, sinCurve, Dimension::Y, -1., 1.);
0248     CHECK_RANGE(p1, tanCurve, Dimension::X, 0.1, 1.1); // shift
0249     CHECK_RANGE(p1, tanCurve, Dimension::Y, -250., 250.);
0250     CHECK_RANGE(p1, logCurve, Dimension::X, 10., 110.); // shift
0251     CHECK_RANGE(p1, logCurve, Dimension::Y, -10., 6.);
0252     CHECK_RANGE(p2, horAxisP1, Dimension::X, 0.1, 1.1); // shift
0253     CHECK_RANGE(p2, cosCurve, Dimension::X, 0.1, 1.1); // shift
0254     CHECK_RANGE(p2, cosCurve, Dimension::Y, -1., 1.);
0255 }
0256 
0257 void MultiRangeTest2::axisMouseMoveApplyToSelection() {
0258     LOAD_PROJECT
0259 
0260     w->setCartesianPlotActionMode(Worksheet::CartesianPlotActionMode::ApplyActionToSelection);
0261     QCOMPARE(w->cartesianPlotActionMode(), Worksheet::CartesianPlotActionMode::ApplyActionToSelection);
0262 
0263     CHECK_RANGE(p1, sinCurve, Dimension::X, 0., 1.);
0264     CHECK_RANGE(p1, sinCurve, Dimension::Y, -1., 1.);
0265     CHECK_RANGE(p1, tanCurve, Dimension::X, 0., 1.);
0266     CHECK_RANGE(p1, tanCurve, Dimension::Y, -250., 250.);
0267     CHECK_RANGE(p1, logCurve, Dimension::X, 0., 100.);
0268     CHECK_RANGE(p1, logCurve, Dimension::Y, -10., 6.);
0269     CHECK_RANGE(p2, horAxisP1, Dimension::X, 0., 1.);
0270     CHECK_RANGE(p2, cosCurve, Dimension::X, 0., 1.);
0271     CHECK_RANGE(p2, cosCurve, Dimension::Y, -1., 1.);
0272 
0273     const int delta = -10; // delta > 0 --> right or up
0274     horAxisP1->shiftSignal(delta, Dimension::X, p1->coordinateSystem(horAxisP1->coordinateSystemIndex())->index(Dimension::X));
0275 
0276     CHECK_RANGE(p1, sinCurve, Dimension::X, 0.1, 1.1); // shift
0277     CHECK_RANGE(p1, sinCurve, Dimension::Y, -1., 1.);
0278     CHECK_RANGE(p1, tanCurve, Dimension::X, 0.1, 1.1); // shift
0279     CHECK_RANGE(p1, tanCurve, Dimension::Y, -250., 250.);
0280     CHECK_RANGE(p1, logCurve, Dimension::X, 0., 100.);
0281     CHECK_RANGE(p1, logCurve, Dimension::Y, -10., 6.);
0282     CHECK_RANGE(p2, horAxisP1, Dimension::X, 0., 1.);
0283     CHECK_RANGE(p2, cosCurve, Dimension::X, 0., 1.);
0284     CHECK_RANGE(p2, cosCurve, Dimension::Y, -1., 1.);
0285 }
0286 
0287 QTEST_MAIN(MultiRangeTest2)