Index: src/backend/worksheet/Worksheet.h =================================================================== --- src/backend/worksheet/Worksheet.h +++ 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) Index: src/backend/worksheet/Worksheet.cpp =================================================================== --- src/backend/worksheet/Worksheet.cpp +++ 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); Index: src/backend/worksheet/WorksheetPrivate.h =================================================================== --- src/backend/worksheet/WorksheetPrivate.h +++ 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 Index: src/backend/worksheet/plots/cartesian/CartesianPlot.h =================================================================== --- src/backend/worksheet/plots/cartesian/CartesianPlot.h +++ 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); Index: src/backend/worksheet/plots/cartesian/CartesianPlot.cpp =================================================================== --- src/backend/worksheet/plots/cartesian/CartesianPlot.cpp +++ 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) { @@ -2399,7 +2404,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); @@ -2533,6 +2538,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; Index: src/backend/worksheet/plots/cartesian/CartesianPlotPrivate.h =================================================================== --- src/backend/worksheet/plots/cartesian/CartesianPlotPrivate.h +++ 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; Index: src/commonfrontend/worksheet/WorksheetView.h =================================================================== --- src/commonfrontend/worksheet/WorksheetView.h +++ src/commonfrontend/worksheet/WorksheetView.h @@ -67,10 +67,11 @@ void exportToClipboard(); void setIsClosing(); void setIsBeingPresented(bool presenting); + void setCartesianPlotActionMode(Worksheet::CartesianPlotActionMode mode); + void setPlotLock(bool lock); private: enum MouseMode {SelectionMode, NavigationMode, ZoomSelectionMode}; - enum CartesianPlotActionMode {ApplyActionToSelection, ApplyActionToAll}; void initActions(); void initMenus(); @@ -98,7 +99,7 @@ Worksheet* m_worksheet; MouseMode m_mouseMode{SelectionMode}; - CartesianPlotActionMode m_cartesianPlotActionMode{ApplyActionToSelection}; + Worksheet::CartesianPlotActionMode m_cartesianPlotActionMode{Worksheet::CartesianPlotActionMode::ApplyActionToSelection}; CartesianPlot::MouseMode m_cartesianPlotMouseMode{CartesianPlot::SelectionMode}; bool m_selectionBandIsShown{false}; QPoint m_selectionStart; @@ -185,6 +186,7 @@ //Actions for cartesian plots QAction* cartesianPlotApplyToSelectionAction; QAction* cartesianPlotApplyToAllAction; + QAction* cartesianPlotLockPosZoomAction; QAction* cartesianPlotSelectionModeAction; QAction* cartesianPlotZoomSelectionModeAction; QAction* cartesianPlotZoomXSelectionModeAction; @@ -273,6 +275,7 @@ //SLOTs for cartesian plots void cartesianPlotActionModeChanged(QAction*); + void cartesianPlotLockPosZoomActionChanged(bool checked); void cartesianPlotMouseModeChanged(QAction*); void cartesianPlotNavigationChanged(QAction*); void cartesianPlotAddNew(QAction*); Index: src/commonfrontend/worksheet/WorksheetView.cpp =================================================================== --- src/commonfrontend/worksheet/WorksheetView.cpp +++ src/commonfrontend/worksheet/WorksheetView.cpp @@ -252,11 +252,17 @@ cartesianPlotActionModeActionGroup->setExclusive(true); cartesianPlotApplyToSelectionAction = new QAction(i18n("Selected Plots"), cartesianPlotActionModeActionGroup); cartesianPlotApplyToSelectionAction->setCheckable(true); - cartesianPlotApplyToSelectionAction->setChecked(true); cartesianPlotApplyToAllAction = new QAction(i18n("All Plots"), cartesianPlotActionModeActionGroup); cartesianPlotApplyToAllAction->setCheckable(true); + setCartesianPlotActionMode(m_worksheet->cartesianPlotActionMode()); connect(cartesianPlotActionModeActionGroup, SIGNAL(triggered(QAction*)), SLOT(cartesianPlotActionModeChanged(QAction*))); + cartesianPlotLockPosZoomAction = new QAction(i18n("Lock Plots position")); + cartesianPlotLockPosZoomAction->setCheckable(true); + if (m_worksheet->lockPlot()) + cartesianPlotLockPosZoomAction->setChecked(true); + connect(cartesianPlotLockPosZoomAction, &QAction::triggered, this, &WorksheetView::cartesianPlotLockPosZoomActionChanged); + auto* cartesianPlotMouseModeActionGroup = new QActionGroup(this); cartesianPlotMouseModeActionGroup->setExclusive(true); cartesianPlotSelectionModeAction = new QAction(QIcon::fromTheme("labplot-cursor-arrow"), i18n("Select and Edit"), cartesianPlotMouseModeActionGroup); @@ -479,6 +485,7 @@ m_cartesianPlotMenu->addMenu(m_cartesianPlotZoomMenu); m_cartesianPlotMenu->addSeparator(); m_cartesianPlotMenu->addMenu(m_cartesianPlotActionModeMenu); + m_cartesianPlotMenu->addAction(cartesianPlotLockPosZoomAction); // Data manipulation menu m_dataManipulationMenu = new QMenu(i18n("Data Manipulation")); @@ -636,6 +643,17 @@ m_isClosing = true; } +void WorksheetView::setCartesianPlotActionMode(Worksheet::CartesianPlotActionMode mode) { + if (mode == Worksheet::CartesianPlotActionMode::ApplyActionToAll) + cartesianPlotApplyToAllAction->setChecked(true); + else + cartesianPlotApplyToSelectionAction->setChecked(true); +} + +void WorksheetView::setPlotLock(bool lock) { + cartesianPlotLockPosZoomAction->setChecked(lock); +} + void WorksheetView::drawForeground(QPainter* painter, const QRectF& rect) { if (m_mouseMode == ZoomSelectionMode && m_selectionBandIsShown) { painter->save(); @@ -1478,7 +1496,7 @@ return; bool plot = false; - if (m_cartesianPlotActionMode == ApplyActionToSelection) { + if (m_worksheet->cartesianPlotActionMode() == Worksheet::CartesianPlotActionMode::ApplyActionToSelection) { //check whether we have cartesian plots selected for (auto* item : m_selectedItems) { //TODO: or if a children of a plot is selected @@ -1718,13 +1736,17 @@ //############################################################################## void WorksheetView::cartesianPlotActionModeChanged(QAction* action) { if (action == cartesianPlotApplyToSelectionAction) - m_cartesianPlotActionMode = ApplyActionToSelection; + m_worksheet->setCartesianPlotActionMode(Worksheet::CartesianPlotActionMode::ApplyActionToSelection); else - m_cartesianPlotActionMode = ApplyActionToAll; + m_worksheet->setCartesianPlotActionMode(Worksheet::CartesianPlotActionMode::ApplyActionToAll); handleCartesianPlotActions(); } +void WorksheetView::cartesianPlotLockPosZoomActionChanged(bool checked) { + m_worksheet->setLockPlot(checked); +} + void WorksheetView::cartesianPlotMouseModeChanged(QAction* action) { if (action == cartesianPlotSelectionModeAction) m_cartesianPlotMouseMode = CartesianPlot::SelectionMode; @@ -1741,7 +1763,7 @@ void WorksheetView::cartesianPlotAddNew(QAction* action) { QVector plots = m_worksheet->children(); - if (m_cartesianPlotActionMode == ApplyActionToSelection) { + if (m_worksheet->cartesianPlotActionMode() == Worksheet::ApplyActionToSelection) { int selectedPlots = 0; for (auto* plot : plots) { if (m_selectedItems.indexOf(plot->graphicsItem()) != -1) @@ -1830,7 +1852,7 @@ void WorksheetView::cartesianPlotNavigationChanged(QAction* action) { CartesianPlot::NavigationOperation op = (CartesianPlot::NavigationOperation)action->data().toInt(); - if (m_cartesianPlotActionMode == ApplyActionToSelection) { + if (m_worksheet->cartesianPlotActionMode() == Worksheet::ApplyActionToSelection) { for (auto* plot : m_worksheet->children() ) { if (m_selectedItems.indexOf(plot->graphicsItem()) != -1) plot->navigate(op);