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