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