diff --git a/src/backend/worksheet/Worksheet.h b/src/backend/worksheet/Worksheet.h --- a/src/backend/worksheet/Worksheet.h +++ b/src/backend/worksheet/Worksheet.h @@ -48,6 +48,7 @@ enum Unit {Millimeter, Centimeter, Inch, Point}; enum Layout {NoLayout, VerticalLayout, HorizontalLayout, GridLayout}; + enum CartesianPlotActionMode {ApplyActionToSelection, ApplyActionToAll}; static float convertToSceneUnits(const float value, const Worksheet::Unit unit); static float convertFromSceneUnits(const float value, const Worksheet::Unit unit); @@ -76,6 +77,11 @@ void deleteAspectFromGraphicsItem(const QGraphicsItem*); void setIsClosing(); + CartesianPlotActionMode cartesianPlotActionMode(); + bool lockPlot(); + void setCartesianPlotActionMode(CartesianPlotActionMode mode); + void setLockPlot(bool lock); + BASIC_D_ACCESSOR_DECL(float, backgroundOpacity, BackgroundOpacity) BASIC_D_ACCESSOR_DECL(PlotArea::BackgroundType, backgroundType, BackgroundType) BASIC_D_ACCESSOR_DECL(PlotArea::BackgroundColorStyle, backgroundColorStyle, BackgroundColorStyle) diff --git a/src/backend/worksheet/Worksheet.cpp b/src/backend/worksheet/Worksheet.cpp --- a/src/backend/worksheet/Worksheet.cpp +++ b/src/backend/worksheet/Worksheet.cpp @@ -251,6 +251,12 @@ const_cast(addedElement)->loadThemeConfig(config); } + const CartesianPlot* plot = dynamic_cast(aspect); + if (plot) { + auto* p = const_cast(plot); + p->setLockPlot(d->lockPlot); + } + //recalculated the layout if (!isLoading()) { if (d->layout != Worksheet::NoLayout) @@ -396,6 +402,25 @@ d->updateLayout(); } +Worksheet::CartesianPlotActionMode Worksheet::cartesianPlotActionMode() { + return d->cartesianPlotActionMode; +} + +bool Worksheet::lockPlot() { + return d->lockPlot; +} + +void Worksheet::setCartesianPlotActionMode(Worksheet::CartesianPlotActionMode mode) { + d->cartesianPlotActionMode = mode; +} + +void Worksheet::setLockPlot(bool lock) { + d->lockPlot = lock; + + for (auto* plot: children()) + plot->setLockPlot(lock); +} + /* =============================== getter methods for general options ==================================== */ BASIC_D_READER_IMPL(Worksheet, bool, scaleContent, scaleContent) BASIC_D_READER_IMPL(Worksheet, bool, useViewSize, useViewSize) @@ -794,6 +819,12 @@ writer->writeAttribute( "opacity", QString::number(d->backgroundOpacity) ); writer->writeEndElement(); + // cartesian properties + writer->writeStartElement( "cartesianProperties" ); + writer->writeAttribute( "lockPlot", QString::number(d->lockPlot) ); + writer->writeAttribute( "cartesianPlotActionMode", QString::number(d->cartesianPlotActionMode)); + writer->writeEndElement(); + //serialize all children for (auto* child : children(IncludeHidden)) child->save(writer); @@ -916,6 +947,20 @@ d->backgroundFileName = str; READ_DOUBLE_VALUE("opacity", backgroundOpacity); + } else if(!preview && reader->name() == "cartesianProperties") { + attribs = reader->attributes(); + + str = attribs.value("lockPlot").toString(); + if (str.isEmpty()) + reader->raiseWarning(attributeWarning.subs("lockPlot").toString()); + else + setLockPlot(str.toInt()); + + str = attribs.value("cartesianPlotActionMode").toString(); + if (str.isEmpty()) + reader->raiseWarning(attributeWarning.subs("cartesianPlotActionMode").toString()); + else + setCartesianPlotActionMode(static_cast(str.toInt())); } else if (reader->name() == "cartesianPlot") { CartesianPlot* plot = new CartesianPlot(""); plot->setIsLoading(true); diff --git a/src/backend/worksheet/WorksheetPrivate.h b/src/backend/worksheet/WorksheetPrivate.h --- a/src/backend/worksheet/WorksheetPrivate.h +++ b/src/backend/worksheet/WorksheetPrivate.h @@ -29,6 +29,8 @@ #ifndef WORKSHEETPRIVATE_H #define WORKSHEETPRIVATE_H +#include + #include class QBrush; @@ -73,6 +75,8 @@ int layoutColumnCount{2}; int layoutRowCount{2}; QString theme; + bool lockPlot{false}; + Worksheet::CartesianPlotActionMode cartesianPlotActionMode{Worksheet::CartesianPlotActionMode::ApplyActionToSelection}; }; #endif diff --git a/src/backend/worksheet/plots/cartesian/CartesianPlot.h b/src/backend/worksheet/plots/cartesian/CartesianPlot.h --- a/src/backend/worksheet/plots/cartesian/CartesianPlot.h +++ b/src/backend/worksheet/plots/cartesian/CartesianPlot.h @@ -101,6 +101,7 @@ void setRect(const QRectF&) override; QRectF dataRect() const; void setMouseMode(const MouseMode); + void setLockPlot(const bool lock); MouseMode mouseMode() const; void navigate(NavigationOperation); void setSuppressDataChangedSignal(bool); diff --git a/src/backend/worksheet/plots/cartesian/CartesianPlot.cpp b/src/backend/worksheet/plots/cartesian/CartesianPlot.cpp --- a/src/backend/worksheet/plots/cartesian/CartesianPlot.cpp +++ b/src/backend/worksheet/plots/cartesian/CartesianPlot.cpp @@ -1604,6 +1604,11 @@ } } +void CartesianPlot::setLockPlot(const bool lock) { + Q_D(CartesianPlot); + d->plotLocked = lock; +} + void CartesianPlot::scaleAutoX() { Q_D(CartesianPlot); if (d->curvesXMinMaxIsDirty) { @@ -2400,7 +2405,7 @@ m_selectionEnd = m_selectionStart; m_selectionBandIsShown = true; } else { - if (dataRect.contains(event->pos())) { + if (!plotLocked && dataRect.contains(event->pos()) ){ panningStarted = true; m_panningStart = event->pos(); setCursor(Qt::ClosedHandCursor); @@ -2534,6 +2539,9 @@ } void CartesianPlotPrivate::wheelEvent(QGraphicsSceneWheelEvent* event) { + + if (plotLocked) + return; //determine first, which axes are selected and zoom only in the corresponding direction. //zoom the entire plot if no axes selected. bool zoomX = false; diff --git a/src/backend/worksheet/plots/cartesian/CartesianPlotPrivate.h b/src/backend/worksheet/plots/cartesian/CartesianPlotPrivate.h --- a/src/backend/worksheet/plots/cartesian/CartesianPlotPrivate.h +++ b/src/backend/worksheet/plots/cartesian/CartesianPlotPrivate.h @@ -74,6 +74,7 @@ CartesianCoordinateSystem* cSystem{nullptr}; bool suppressRetransform{false}; bool panningStarted{false}; + bool plotLocked{false}; private: QVariant itemChange(GraphicsItemChange change, const QVariant &value) override;