File indexing completed on 2024-05-12 03:48:32

0001 /*
0002     File                 : WorksheetView.h
0003     Project              : LabPlot
0004     Description          : Worksheet view
0005     --------------------------------------------------------------------
0006     SPDX-FileCopyrightText: 2009-2023 Alexander Semke <alexander.semke@web.de>
0007     SPDX-FileCopyrightText: 2018 Stefan Gerlach <stefan.gerlach@uni.kn>
0008     SPDX-License-Identifier: GPL-2.0-or-later
0009 */
0010 
0011 #ifndef WORKSHEETVIEW_H
0012 #define WORKSHEETVIEW_H
0013 
0014 #include "backend/worksheet/Worksheet.h"
0015 #include "backend/worksheet/plots/cartesian/CartesianPlot.h"
0016 #include <QGraphicsView>
0017 
0018 class QPrinter;
0019 class QMenu;
0020 class QToolBar;
0021 class QToolButton;
0022 class QWheelEvent;
0023 class QTimeLine;
0024 
0025 class AbstractAspect;
0026 class WorksheetElement;
0027 
0028 class RetransformTest;
0029 
0030 #ifdef HAVE_TOUCHBAR
0031 class KDMacTouchBar;
0032 #endif
0033 
0034 class WorksheetView : public QGraphicsView {
0035     Q_OBJECT
0036 
0037 public:
0038     explicit WorksheetView(Worksheet* worksheet);
0039 
0040     enum class ExportFormat { PDF, SVG, PNG, JPG, BMP, PPM, XBM, XPM };
0041     enum class GridStyle { NoGrid, Line, Dot };
0042     enum class ExportArea { BoundingBox, Selection, Worksheet };
0043 
0044     struct GridSettings {
0045         GridStyle style;
0046         QColor color;
0047         int horizontalSpacing;
0048         int verticalSpacing;
0049         double opacity;
0050     };
0051 
0052     enum class MouseMode { Selection, Navigation, ZoomSelection };
0053 
0054     void setScene(QGraphicsScene*);
0055     void exportToFile(const QString&, const ExportFormat, const ExportArea, const bool, const int);
0056     void exportToClipboard();
0057     void exportToPixmap(QPixmap& pixmap);
0058     void setIsClosing();
0059     void setIsBeingPresented(bool presenting);
0060     void setCartesianPlotActionMode(Worksheet::CartesianPlotActionMode);
0061     void setCartesianPlotCursorMode(Worksheet::CartesianPlotActionMode);
0062     void setPlotInteractive(bool);
0063     void suppressSelectionChangedEvent(bool);
0064     WorksheetElement* selectedElement() const;
0065     QList<QGraphicsItem*> selectedItems() const;
0066     double zoomFactor() const;
0067     void processResize();
0068 
0069     Worksheet::CartesianPlotActionMode getCartesianPlotActionMode() const;
0070     void registerShortcuts();
0071     void unregisterShortcuts();
0072     void initActions();
0073     void initPlotNavigationActions();
0074 
0075 private:
0076     void initBasicActions();
0077     void initMenus();
0078     void drawForeground(QPainter*, const QRectF&) override;
0079     void drawBackground(QPainter*, const QRectF&) override;
0080     void drawBackgroundItems(QPainter*, const QRectF&);
0081     bool isPlotAtPos(QPoint) const;
0082     CartesianPlot* plotAt(QPoint) const;
0083     void exportPaint(QPainter* painter, const QRectF& targetRect, const QRectF& sourceRect, const bool background, const bool selection = false);
0084     void cartesianPlotAdd(CartesianPlot*, QAction*);
0085     void handleAxisSelected(const Axis*);
0086     void handleCartesianPlotSelected(CartesianPlot*);
0087     void handlePlotSelected();
0088     void handleReferenceLineSelected();
0089     void handleReferenceRangeSelected();
0090     void handleReferences(bool vertical);
0091     bool eventFilter(QObject* watched, QEvent*) override;
0092     void updateLabelsZoom() const;
0093     void updateScrollBarPolicy();
0094     void updateMagnificationWindow(const QPointF& pos);
0095 
0096     // events
0097     void resizeEvent(QResizeEvent*) override;
0098     void contextMenuEvent(QContextMenuEvent*) override;
0099     void wheelEvent(QWheelEvent*) override;
0100     void mousePressEvent(QMouseEvent*) override;
0101     void mouseDoubleClickEvent(QMouseEvent*) override;
0102     void mouseReleaseEvent(QMouseEvent*) override;
0103     void mouseMoveEvent(QMouseEvent*) override;
0104     void keyPressEvent(QKeyEvent*) override;
0105     void keyReleaseEvent(QKeyEvent*) override;
0106     void dragEnterEvent(QDragEnterEvent*) override;
0107     void dragMoveEvent(QDragMoveEvent*) override;
0108     void dropEvent(QDropEvent*) override;
0109 
0110     Worksheet* m_worksheet;
0111     MouseMode m_mouseMode{MouseMode::Selection};
0112     CartesianPlot::MouseMode m_cartesianPlotMouseMode{CartesianPlot::MouseMode::Selection};
0113     bool m_selectionBandIsShown{false};
0114     QPoint m_selectionStart;
0115     QPoint m_selectionEnd;
0116     QPointF m_cursorPos;
0117     bool m_calledFromContextMenu{false};
0118     int magnificationFactor{0};
0119     QGraphicsPixmapItem* m_magnificationWindow{nullptr};
0120     GridSettings m_gridSettings;
0121     QList<QGraphicsItem*> m_selectedItems;
0122     WorksheetElement* m_selectedElement{nullptr}; // used to determine which range should be used for navigation
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_isPrinting{false};
0129     bool m_actionsInitialized{false};
0130     bool m_plotActionsInitialized{false};
0131     bool m_menusInitialized{false};
0132     int m_numScheduledScalings{0};
0133     bool m_suppressMouseModeChange{false};
0134 
0135     // Menus
0136     QMenu* m_addNewMenu{nullptr};
0137     QMenu* m_addNewCartesianPlotMenu{nullptr};
0138     QMenu* m_zoomMenu{nullptr};
0139     QMenu* m_magnificationMenu{nullptr};
0140     QMenu* m_layoutMenu{nullptr};
0141     QMenu* m_gridMenu{nullptr};
0142     QMenu* m_themeMenu{nullptr};
0143     QMenu* m_viewMouseModeMenu{nullptr};
0144     QMenu* m_cartesianPlotMenu{nullptr};
0145     QMenu* m_cartesianPlotMouseModeMenu{nullptr};
0146     QMenu* m_cartesianPlotAddNewMenu{nullptr};
0147     QMenu* m_cartesianPlotZoomMenu{nullptr};
0148     QMenu* m_cartesianPlotActionModeMenu{nullptr};
0149     QMenu* m_cartesianPlotCursorModeMenu{nullptr};
0150 
0151     QToolButton* tbCartesianPlotAddNew{nullptr};
0152     QToolButton* tbNewCartesianPlot{nullptr};
0153     QToolButton* tbZoom{nullptr};
0154     QToolButton* tbMagnification{nullptr};
0155     QAction* currentZoomAction{nullptr};
0156     QAction* currentMagnificationAction{nullptr};
0157 
0158     // Actions
0159     QAction* selectAllAction{nullptr};
0160     QAction* deleteAction{nullptr};
0161     QAction* backspaceAction{nullptr};
0162 
0163     QAction* zoomInViewAction{nullptr};
0164     QAction* zoomOutViewAction{nullptr};
0165     QAction* zoomOriginAction{nullptr};
0166     QAction* zoomFitNoneAction{nullptr};
0167     QAction* zoomFitPageHeightAction{nullptr};
0168     QAction* zoomFitPageWidthAction{nullptr};
0169     QAction* zoomFitSelectionAction{nullptr};
0170     QAction* zoomFitAction{nullptr};
0171 
0172     QAction* navigationModeAction{nullptr};
0173     QAction* zoomSelectionModeAction{nullptr};
0174     QAction* selectionModeAction{nullptr};
0175 
0176     QAction* addCartesianPlot1Action{nullptr};
0177     QAction* addCartesianPlot2Action{nullptr};
0178     QAction* addCartesianPlot3Action{nullptr};
0179     QAction* addCartesianPlot4Action{nullptr};
0180     QAction* addCartesianPlotTemplateAction{nullptr};
0181     QAction* addTextLabelAction{nullptr};
0182     QAction* addImageAction{nullptr};
0183     QAction* addGlobalInfoElementAction{nullptr};
0184 
0185     QAction* verticalLayoutAction{nullptr};
0186     QAction* horizontalLayoutAction{nullptr};
0187     QAction* gridLayoutAction{nullptr};
0188     QAction* breakLayoutAction{nullptr};
0189 
0190     QAction* noGridAction{nullptr};
0191     QAction* denseLineGridAction{nullptr};
0192     QAction* sparseLineGridAction{nullptr};
0193     QAction* denseDotGridAction{nullptr};
0194     QAction* sparseDotGridAction{nullptr};
0195     QAction* customGridAction{nullptr};
0196     QAction* snapToGridAction{nullptr};
0197 
0198     QAction* noMagnificationAction{nullptr};
0199     QAction* twoTimesMagnificationAction{nullptr};
0200     QAction* threeTimesMagnificationAction{nullptr};
0201     QAction* fourTimesMagnificationAction{nullptr};
0202     QAction* fiveTimesMagnificationAction{nullptr};
0203 
0204     QAction* plotsInteractiveAction{nullptr};
0205     QAction* showPresenterMode{nullptr};
0206 
0207     // Actions for cartesian plots
0208     QAction* cartesianPlotAddNewAction{nullptr};
0209     QAction* cartesianPlotApplyToSelectionAction{nullptr};
0210     QAction* cartesianPlotApplyToAllAction{nullptr};
0211     QAction* cartesianPlotApplyToAllXAction{nullptr};
0212     QAction* cartesianPlotApplyToAllYAction{nullptr};
0213     QAction* cartesianPlotApplyToAllCursor{nullptr};
0214     QAction* cartesianPlotApplyToSelectionCursor{nullptr};
0215     QAction* cartesianPlotSelectionModeAction{nullptr};
0216     QAction* cartesianPlotCrosshairModeAction{nullptr};
0217     QAction* cartesianPlotZoomSelectionModeAction{nullptr};
0218     QAction* cartesianPlotZoomXSelectionModeAction{nullptr};
0219     QAction* cartesianPlotZoomYSelectionModeAction{nullptr};
0220     QAction* cartesianPlotCursorModeAction{nullptr};
0221 
0222     QAction* scaleAutoXAction{nullptr};
0223     QAction* scaleAutoYAction{nullptr};
0224     QAction* scaleAutoAction{nullptr};
0225     QAction* zoomInAction{nullptr};
0226     QAction* zoomOutAction{nullptr};
0227     QAction* zoomInXAction{nullptr};
0228     QAction* zoomOutXAction{nullptr};
0229     QAction* zoomInYAction{nullptr};
0230     QAction* zoomOutYAction{nullptr};
0231     QAction* shiftLeftXAction{nullptr};
0232     QAction* shiftRightXAction{nullptr};
0233     QAction* shiftUpYAction{nullptr};
0234     QAction* shiftDownYAction{nullptr};
0235 
0236 public Q_SLOTS:
0237     void createContextMenu(QMenu*);
0238     void fillToolBar(QToolBar*);
0239 #ifdef HAVE_TOUCHBAR
0240     void fillTouchBar(KDMacTouchBar*);
0241 #endif
0242     void fillCartesianPlotToolBar(QToolBar*);
0243     void fillCartesianPlotNavigationToolBar(QToolBar*, bool enableCursor = true) const;
0244     void print(QPrinter*);
0245     void selectItem(QGraphicsItem*);
0246     void presenterMode();
0247     void cartesianPlotMouseModeChangedSlot(CartesianPlot::MouseMode); // from cartesian plot
0248     void childContextMenuRequested(AspectType, QMenu*);
0249     void cartesianPlotMouseModeChanged(QAction*);
0250 
0251 private Q_SLOTS:
0252     void addNew(QAction*);
0253     void aspectAboutToBeRemoved(const AbstractAspect*);
0254     void selectAllElements();
0255     void deleteElement();
0256 
0257     void mouseModeChanged(QAction*);
0258     void useViewSizeChanged(bool);
0259     void changeZoom(QAction*);
0260     void fitChanged(QAction*);
0261     void updateFit();
0262     void magnificationChanged(QAction*);
0263     void changeLayout(QAction*);
0264     void changeGrid(QAction*);
0265     void changeSnapToGrid();
0266     void plotsInteractiveActionChanged(bool checked);
0267 
0268     void deselectItem(QGraphicsItem*);
0269     void selectionChanged();
0270     void updateBackground();
0271     void layoutChanged(Worksheet::Layout);
0272 
0273     void fadeIn(qreal);
0274     void fadeOut(qreal);
0275 
0276     void zoom(int);
0277     void scalingTime();
0278     void animFinished();
0279 
0280     // SLOTs for cartesian plots
0281     void cartesianPlotActionModeChanged(QAction*);
0282     void cartesianPlotCursorModeChanged(QAction*);
0283     void cartesianPlotNavigationChanged(QAction*);
0284     void handleCartesianPlotActions();
0285 
0286 Q_SIGNALS:
0287     void statusInfo(const QString&);
0288     void propertiesExplorerRequested();
0289 
0290     friend class RetransformTest;
0291     friend class MultiRangeTest2;
0292     friend class CartesianPlotTest;
0293 };
0294 
0295 #endif