File indexing completed on 2024-05-12 15:27:44

0001 /***************************************************************************
0002     File                 : WorksheetView.h
0003     Project              : LabPlot
0004     Description          : Worksheet view
0005     --------------------------------------------------------------------
0006     Copyright            : (C) 2009-2019 by Alexander Semke (alexander.semke@web.de)
0007     Copyright            : (C) 2018 by Stefan Gerlach (stefan.gerlach@uni.kn)
0008 
0009  ***************************************************************************/
0010 
0011 /***************************************************************************
0012  *                                                                         *
0013  *  This program is free software; you can redistribute it and/or modify   *
0014  *  it under the terms of the GNU General Public License as published by   *
0015  *  the Free Software Foundation; either version 2 of the License, or      *
0016  *  (at your option) any later version.                                    *
0017  *                                                                         *
0018  *  This program is distributed in the hope that it will be useful,        *
0019  *  but WITHOUT ANY WARRANTY; without even the implied warranty of         *
0020  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
0021  *  GNU General Public License for more details.                           *
0022  *                                                                         *
0023  *   You should have received a copy of the GNU General Public License     *
0024  *   along with this program; if not, write to the Free Software           *
0025  *   Foundation, Inc., 51 Franklin Street, Fifth Floor,                    *
0026  *   Boston, MA  02110-1301  USA                                           *
0027  *                                                                         *
0028  ***************************************************************************/
0029 
0030 #ifndef WORKSHEETVIEW_H
0031 #define WORKSHEETVIEW_H
0032 
0033 #include <QGraphicsView>
0034 #include "backend/worksheet/Worksheet.h"
0035 #include "backend/worksheet/plots/cartesian/CartesianPlot.h"
0036 
0037 class QPrinter;
0038 class QMenu;
0039 class QToolBar;
0040 class QToolButton;
0041 class QWheelEvent;
0042 class QTimeLine;
0043 
0044 class AbstractAspect;
0045 class WorksheetElement;
0046 
0047 #ifdef Q_OS_MAC
0048     class KDMacTouchBar;
0049 #endif
0050 
0051 class WorksheetView : public QGraphicsView {
0052     Q_OBJECT
0053 
0054 public:
0055     explicit WorksheetView(Worksheet* worksheet);
0056 
0057     enum class ExportFormat {PDF, SVG, PNG, JPG, BMP, PPM, XBM, XPM};
0058     enum class GridStyle {NoGrid, Line, Dot};
0059     enum class ExportArea {BoundingBox, Selection, Worksheet};
0060 
0061     struct GridSettings {
0062         GridStyle style;
0063         QColor color;
0064         int horizontalSpacing;
0065         int verticalSpacing;
0066         double opacity;
0067     };
0068 
0069     enum class MouseMode {Selection, Navigation, ZoomSelection};
0070 
0071     void setScene(QGraphicsScene*);
0072     void exportToFile(const QString&, const ExportFormat, const ExportArea, const bool, const int);
0073     void exportToClipboard(const ExportFormat, const ExportArea, const bool, const int);
0074     void exportToClipboard();
0075     void setIsClosing();
0076     void setIsBeingPresented(bool presenting);
0077     void setCartesianPlotActionMode(Worksheet::CartesianPlotActionMode mode);
0078     void setCartesianPlotCursorMode(Worksheet::CartesianPlotActionMode mode);
0079     void setPlotLock(bool lock);
0080     void suppressSelectionChangedEvent(bool);
0081 
0082     Worksheet::CartesianPlotActionMode getCartesianPlotActionMode();
0083     void registerShortcuts();
0084     void unregisterShortcuts();
0085 
0086 private:
0087     void initBasicActions();
0088     void initActions();
0089     void initMenus();
0090     void processResize();
0091     void drawForeground(QPainter*, const QRectF&) override;
0092     void drawBackground(QPainter*, const QRectF&) override;
0093     void drawBackgroundItems(QPainter*, const QRectF&);
0094     bool isPlotAtPos(QPoint) const;
0095     CartesianPlot* plotAt(QPoint) const;
0096     void exportPaint(QPainter* painter, const QRectF& targetRect, const QRectF& sourceRect, const bool);
0097     void cartesianPlotAdd(CartesianPlot*, QAction*);
0098 
0099     //events
0100     void resizeEvent(QResizeEvent*) override;
0101     void contextMenuEvent(QContextMenuEvent*) override;
0102     void wheelEvent(QWheelEvent*) override;
0103     void mousePressEvent(QMouseEvent*) override;
0104     void mouseDoubleClickEvent(QMouseEvent*) override;
0105     void mouseReleaseEvent(QMouseEvent*) override;
0106     void mouseMoveEvent(QMouseEvent*) override;
0107     void keyPressEvent(QKeyEvent*) override;
0108     void keyReleaseEvent(QKeyEvent*) override;
0109     void dragEnterEvent(QDragEnterEvent*) override;
0110     void dragMoveEvent(QDragMoveEvent*) override;
0111     void dropEvent(QDropEvent*) override;
0112 
0113     Worksheet* m_worksheet;
0114     MouseMode m_mouseMode{MouseMode::Selection};
0115     CartesianPlot::MouseMode m_cartesianPlotMouseMode{CartesianPlot::MouseMode::Selection};
0116     bool m_selectionBandIsShown{false};
0117     QPoint m_selectionStart;
0118     QPoint m_selectionEnd;
0119     int magnificationFactor{0};
0120     QGraphicsPixmapItem* m_magnificationWindow{nullptr};
0121     GridSettings m_gridSettings;
0122     QList<QGraphicsItem*> m_selectedItems;
0123     bool m_suppressSelectionChangedEvent{false};
0124     WorksheetElement* lastAddedWorksheetElement{nullptr};
0125     QTimeLine* m_fadeInTimeLine{nullptr};
0126     QTimeLine* m_fadeOutTimeLine{nullptr};
0127     bool m_isClosing{false};
0128     bool m_actionsInitialized{false};
0129     bool m_menusInitialized{false};
0130     int m_numScheduledScalings{0};
0131     bool m_suppressMouseModeChange{false};
0132 
0133     //Menus
0134     QMenu* m_addNewMenu{nullptr};
0135     QMenu* m_addNewCartesianPlotMenu{nullptr};
0136     QMenu* m_zoomMenu{nullptr};
0137     QMenu* m_magnificationMenu{nullptr};
0138     QMenu* m_layoutMenu{nullptr};
0139     QMenu* m_gridMenu{nullptr};
0140     QMenu* m_themeMenu{nullptr};
0141     QMenu* m_viewMouseModeMenu{nullptr};
0142     QMenu* m_cartesianPlotMenu{nullptr};
0143     QMenu* m_cartesianPlotMouseModeMenu{nullptr};
0144     QMenu* m_cartesianPlotAddNewMenu{nullptr};
0145     QMenu* m_cartesianPlotAddNewAnalysisMenu{nullptr};
0146     QMenu* m_cartesianPlotZoomMenu{nullptr};
0147     QMenu* m_cartesianPlotActionModeMenu{nullptr};
0148     QMenu* m_cartesianPlotCursorModeMenu{nullptr};
0149     QMenu* m_dataManipulationMenu{nullptr};
0150 
0151     QToolButton* tbNewCartesianPlot{nullptr};
0152     QToolButton* tbZoom{nullptr};
0153     QToolButton* tbMagnification{nullptr};
0154     QAction* currentZoomAction{nullptr};
0155     QAction* currentMagnificationAction{nullptr};
0156 
0157     //Actions
0158     QAction* selectAllAction{nullptr};
0159     QAction* deleteAction{nullptr};
0160     QAction* backspaceAction{nullptr};
0161 
0162     QAction* zoomInViewAction{nullptr};
0163     QAction* zoomOutViewAction{nullptr};
0164     QAction* zoomOriginAction{nullptr};
0165     QAction* zoomFitPageHeightAction{nullptr};
0166     QAction* zoomFitPageWidthAction{nullptr};
0167     QAction* zoomFitSelectionAction{nullptr};
0168 
0169     QAction* navigationModeAction{nullptr};
0170     QAction* zoomSelectionModeAction{nullptr};
0171     QAction* selectionModeAction{nullptr};
0172 
0173     QAction* addCartesianPlot1Action{nullptr};
0174     QAction* addCartesianPlot2Action{nullptr};
0175     QAction* addCartesianPlot3Action{nullptr};
0176     QAction* addCartesianPlot4Action{nullptr};
0177     QAction* addTextLabelAction{nullptr};
0178     QAction* addImageAction{nullptr};
0179     QAction* addHistogram{nullptr};
0180 
0181     QAction* verticalLayoutAction{nullptr};
0182     QAction* horizontalLayoutAction{nullptr};
0183     QAction* gridLayoutAction{nullptr};
0184     QAction* breakLayoutAction{nullptr};
0185 
0186     QAction* noGridAction{nullptr};
0187     QAction* denseLineGridAction{nullptr};
0188     QAction* sparseLineGridAction{nullptr};
0189     QAction* denseDotGridAction{nullptr};
0190     QAction* sparseDotGridAction{nullptr};
0191     QAction* customGridAction{nullptr};
0192     QAction* snapToGridAction{nullptr};
0193 
0194     QAction* noMagnificationAction{nullptr};
0195     QAction* twoTimesMagnificationAction{nullptr};
0196     QAction* threeTimesMagnificationAction{nullptr};
0197     QAction* fourTimesMagnificationAction{nullptr};
0198     QAction* fiveTimesMagnificationAction{nullptr};
0199 
0200     QAction* plotsLockedAction{nullptr};
0201     QAction* showPresenterMode{nullptr};
0202 
0203     //Actions for cartesian plots
0204     QAction* cartesianPlotApplyToSelectionAction{nullptr};
0205     QAction* cartesianPlotApplyToAllAction{nullptr};
0206     QAction* cartesianPlotApplyToAllCursor{nullptr};
0207     QAction* cartesianPlotApplyToSelectionCursor{nullptr};
0208     QAction* cartesianPlotSelectionModeAction{nullptr};
0209     QAction* cartesianPlotZoomSelectionModeAction{nullptr};
0210     QAction* cartesianPlotZoomXSelectionModeAction{nullptr};
0211     QAction* cartesianPlotZoomYSelectionModeAction{nullptr};
0212     QAction* cartesianPlotCursorModeAction{nullptr};
0213 
0214     QAction* addCurveAction{nullptr};
0215     QAction* addHistogramAction{nullptr};
0216     QAction* addEquationCurveAction{nullptr};
0217     QAction* addDataOperationCurveAction{nullptr};
0218     QAction* addDataReductionCurveAction{nullptr};
0219     QAction* addDifferentiationCurveAction{nullptr};
0220     QAction* addIntegrationCurveAction{nullptr};
0221     QAction* addInterpolationCurveAction{nullptr};
0222     QAction* addSmoothCurveAction{nullptr};
0223     QAction* addFitCurveAction{nullptr};
0224     QAction* addFourierFilterCurveAction{nullptr};
0225     QAction* addFourierTransformCurveAction{nullptr};
0226     QAction* addConvolutionCurveAction{nullptr};
0227     QAction* addCorrelationCurveAction{nullptr};
0228 
0229     QAction* addHorizontalAxisAction{nullptr};
0230     QAction* addVerticalAxisAction{nullptr};
0231     QAction* addLegendAction{nullptr};
0232     QAction* addPlotTextLabelAction{nullptr};
0233     QAction* addPlotImageAction{nullptr};
0234     QAction* addCustomPointAction{nullptr};
0235 
0236     QAction* scaleAutoXAction{nullptr};
0237     QAction* scaleAutoYAction{nullptr};
0238     QAction* scaleAutoAction{nullptr};
0239     QAction* zoomInAction{nullptr};
0240     QAction* zoomOutAction{nullptr};
0241     QAction* zoomInXAction{nullptr};
0242     QAction* zoomOutXAction{nullptr};
0243     QAction* zoomInYAction{nullptr};
0244     QAction* zoomOutYAction{nullptr};
0245     QAction* shiftLeftXAction{nullptr};
0246     QAction* shiftRightXAction{nullptr};
0247     QAction* shiftUpYAction{nullptr};
0248     QAction* shiftDownYAction{nullptr};
0249 
0250     // Analysis menu
0251     QAction* addDataOperationAction{nullptr};
0252     QAction* addDataReductionAction{nullptr};
0253     QAction* addDifferentiationAction{nullptr};
0254     QAction* addIntegrationAction{nullptr};
0255     QAction* addInterpolationAction{nullptr};
0256     QAction* addSmoothAction{nullptr};
0257     QAction* addFitAction{nullptr};
0258     QAction* addFourierFilterAction{nullptr};
0259     QAction* addFourierTransformAction{nullptr};
0260     QAction* addConvolutionAction{nullptr};
0261     QAction* addCorrelationAction{nullptr};
0262 
0263 public slots:
0264     void createContextMenu(QMenu*);
0265     void createAnalysisMenu(QMenu*);
0266     void fillToolBar(QToolBar*);
0267 #ifdef Q_OS_MAC
0268     void fillTouchBar(KDMacTouchBar*);
0269 #endif
0270     void fillCartesianPlotToolBar(QToolBar*);
0271     void print(QPrinter*);
0272     void selectItem(QGraphicsItem*);
0273     void presenterMode();
0274     void cartesianPlotMouseModeChangedSlot(CartesianPlot::MouseMode mouseMode); // from cartesian Plot
0275 
0276 private slots:
0277     void addNew(QAction*);
0278     void aspectAboutToBeRemoved(const AbstractAspect*);
0279     void selectAllElements();
0280     void deleteElement();
0281 
0282     void mouseModeChanged(QAction*);
0283     void useViewSizeRequested();
0284     void changeZoom(QAction*);
0285     void magnificationChanged(QAction*);
0286     void changeLayout(QAction*);
0287     void changeGrid(QAction*);
0288     void changeSnapToGrid();
0289     void plotsLockedActionChanged(bool checked);
0290 
0291     void deselectItem(QGraphicsItem*);
0292     void selectionChanged();
0293     void updateBackground();
0294     void layoutChanged(Worksheet::Layout);
0295 
0296     void fadeIn(qreal);
0297     void fadeOut(qreal);
0298 
0299     void zoom(int);
0300     void scalingTime();
0301     void animFinished();
0302 
0303     //SLOTs for cartesian plots
0304     void cartesianPlotActionModeChanged(QAction*);
0305     void cartesianPlotCursorModeChanged(QAction*);
0306     void cartesianPlotMouseModeChanged(QAction*);
0307     void cartesianPlotNavigationChanged(QAction*);
0308     void cartesianPlotAddNew(QAction*);
0309     void handleCartesianPlotActions();
0310 
0311 signals:
0312     void statusInfo(const QString&);
0313     void propertiesExplorerRequested();
0314 };
0315 
0316 #endif