libpappsomspp
Library for mass spectrometry
Loading...
Searching...
No Matches
baseplotwidget.h
Go to the documentation of this file.
1/* This code comes right from the msXpertSuite software project.
2 *
3 * msXpertSuite - mass spectrometry software suite
4 * -----------------------------------------------
5 * Copyright(C) 2009,...,2018 Filippo Rusconi
6 *
7 * http://www.msxpertsuite.org
8 *
9 * This program is free software: you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation, either version 3 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program. If not, see <http://www.gnu.org/licenses/>.
21 *
22 * END software license
23 */
24
25
26#pragma once
27
28/////////////////////// StdLib includes
29#include <memory>
30
31
32/////////////////////// Qt includes
33#include <QObject>
34#include <QString>
35#include <QWidget>
36#include <QBrush>
37#include <QColor>
38#include <QVector>
39
40
41/////////////////////// QCustomPlot
42#include <qcustomplot.h>
43
44
45/////////////////////// Local includes
47#include "../../core/types.h"
49#include "baseplotcontext.h"
50
51
52namespace pappso
53{
54
71
72enum class RangeType
73{
76};
77
78class BasePlotWidget;
79
80typedef std::shared_ptr<BasePlotWidget> BasePlotWidgetSPtr;
81typedef std::shared_ptr<const BasePlotWidget> BasePlotWidgetCstSPtr;
82
83class PMSPP_LIB_DECL BasePlotWidget : public QCustomPlot
84{
85 Q_OBJECT
86
87 public:
88 explicit BasePlotWidget(QWidget *parent);
89 explicit BasePlotWidget(QWidget *parent,
90 const QString &x_axis_label,
91 const QString &y_axis_label);
92
93 virtual ~BasePlotWidget();
94
95 virtual bool setupWidget();
96
97 virtual void setPen(const QPen &pen);
98 virtual const QPen &getPen() const;
99
100 virtual void setPlottingColor(QCPAbstractPlottable *plottable_p,
101 const QColor &new_color);
102 virtual void setPlottingColor(int index, const QColor &new_color);
103
104 virtual QColor getPlottingColor(QCPAbstractPlottable *plottable_p) const;
105 virtual QColor getPlottingColor(int index = 0) const;
106
107 virtual void setAxisLabelX(const QString &label);
108 virtual void setAxisLabelY(const QString &label);
109
110 // AXES RANGE HISTORY-related functions
111 virtual void resetAxesRangeHistory();
112 virtual void updateAxesRangeHistory();
113 virtual void restorePreviousAxesRangeHistory();
114 virtual void restoreAxesRangeHistory(std::size_t index);
115 // AXES RANGE HISTORY-related functions
116
117
118 /// KEYBOARD-related EVENTS
119 virtual void keyPressEvent(QKeyEvent *event);
120 virtual void keyReleaseEvent(QKeyEvent *event);
121
122 virtual void spaceKeyReleaseEvent(QKeyEvent *event);
123
124 virtual void directionKeyPressEvent(QKeyEvent *event);
125 virtual void directionKeyReleaseEvent(QKeyEvent *event);
126
127 virtual void mousePseudoButtonKeyPressEvent(QKeyEvent *event);
128 virtual void mousePseudoButtonKeyReleaseEvent(QKeyEvent *event);
129 /// KEYBOARD-related EVENTS
130
131
132 /// MOUSE-related EVENTS
133 virtual void mousePressHandler(QMouseEvent *event);
134 virtual void mouseReleaseHandler(QMouseEvent *event);
135 virtual void mouseReleaseHandlerLeftButton(QMouseEvent *event);
136 virtual void mouseReleaseHandlerRightButton(QMouseEvent *event);
137
138 virtual void mouseWheelHandler(QWheelEvent *event);
139
140 virtual void mouseMoveHandler(QMouseEvent *event);
141 virtual void mouseMoveHandlerNotDraggingCursor(QMouseEvent *event);
142 virtual void mouseMoveHandlerDraggingCursor(QMouseEvent *event);
143 virtual void mouseMoveHandlerLeftButtonDraggingCursor(QMouseEvent *event);
144 virtual void mouseMoveHandlerRightButtonDraggingCursor(QMouseEvent *event);
145
146 virtual void axisDoubleClickHandler(QCPAxis *axis,
147 QCPAxis::SelectablePart part,
148 QMouseEvent *event);
149 bool isClickOntoXAxis(const QPointF &mousePoint);
150 bool isClickOntoYAxis(const QPointF &mousePoint);
151 /// MOUSE-related EVENTS
152
153
154 /// MOUSE MOVEMENTS mouse/keyboard-triggered
155 int dragDirection();
156 virtual void moveMouseCursorGraphCoordToGlobal(QPointF plot_coordinates);
157 virtual void moveMouseCursorPixelCoordToGlobal(QPointF local_coordinates);
158 virtual void horizontalMoveMouseCursorCountPixels(int pixel_count);
159 virtual QPointF horizontalGetGraphCoordNewPointCountPixels(int pixel_count);
160 virtual void verticalMoveMouseCursorCountPixels(int pixel_count);
161 virtual QPointF verticalGetGraphCoordNewPointCountPixels(int pixel_count);
162 /// MOUSE MOVEMENTS mouse/keyboard-triggered
163
164
165 /// RANGE-related functions
166 virtual QCPRange getRangeX(bool &found_range, int index) const;
167 virtual QCPRange getRangeY(bool &found_range, int index) const;
168 QCPRange getRange(Enums::Axis axis, RangeType range_type, bool &found_range) const;
169
170 virtual QCPRange getInnermostRangeX(bool &found_range) const;
171 virtual QCPRange getOutermostRangeX(bool &found_range) const;
172
173 virtual QCPRange getInnermostRangeY(bool &found_range) const;
174 virtual QCPRange getOutermostRangeY(bool &found_range) const;
175
177 double &max,
178 QCPAbstractPlottable *plottable_p = nullptr);
179 void yMinMaxOnXAxisCurrentRange(double &min, double &max, int index);
180 /// RANGE-related functions
181
182
183 /// PLOTTING / REPLOTTING functions
184 virtual void axisRescale();
185 virtual void axisReframe();
186 virtual void axisZoom();
187 virtual void axisPan();
188
189 virtual void
190 replotWithAxesRanges(QCPRange xAxisRange, QCPRange yAxisRange, Enums::Axis axis);
191
192 virtual void replotWithAxisRangeX(double lower, double upper);
193 virtual void replotWithAxisRangeY(double lower, double upper);
194 /// PLOTTING / REPLOTTING functions
195
196
197 /// PLOT ITEMS : TRACER TEXT ITEMS...
198 virtual void hideAllPlotItems();
199
200 virtual void showTracers();
201 virtual void hideTracers();
202
203 virtual void drawXScopeSpanFeatures();
204 virtual void drawYScopeSpanFeatures();
205
206 virtual void calculateDragDeltas();
207
209
210 virtual void
211 drawSelectionRectangleAndPrepareZoom(bool as_line_segment = false,
212 bool for_integration = false);
213
214 virtual void updateIntegrationScopeDrawing(bool as_line_segment = false,
215 bool for_integration = false);
216
217 virtual void resetSelectionRectangle();
218 virtual void hideSelectionRectangle(bool reset_values = false);
219 virtual bool isSelectionRectangleVisible();
221
222 /// PLOT ITEMS : TRACER TEXT ITEMS...
223
224
225 virtual void setFocus();
226
227 virtual void redrawPlotBackground(QWidget *focusedPlotWidget);
228
229 virtual void updateContextXandYAxisRanges();
230
231 virtual const BasePlotContext &getContext() const;
232
233 ////////////////////////// SIGNALS /////////////////////////////////
234 ////////////////////////// SIGNALS /////////////////////////////////
235 ////////////////////////// SIGNALS /////////////////////////////////
236 signals:
237
239
240 void lastCursorHoveredPointSignal(const QPointF &pointf);
241
242 void plotRangesChangedSignal(QMouseEvent *event, const pappso::BasePlotContext &context);
243 void plotRangesChangedWheelEventSignal(QWheelEvent *event,
244 const pappso::BasePlotContext &context);
245
246 void xAxisMeasurementSignal(const pappso::BasePlotContext &context, bool with_delta);
247
250
251 void mousePressEventSignal(QMouseEvent *event, const pappso::BasePlotContext &context);
252 void mouseReleaseEventSignal(QMouseEvent *event, const pappso::BasePlotContext &context);
253
254 void mouseWheelEventSignal(QWheelEvent *event, const pappso::BasePlotContext &context);
255
256 void plottableSelectionChangedSignal(QCPAbstractPlottable *plottable_p,
257 bool selected);
258
260
262 QCPAbstractPlottable *plottable_p,
263 const pappso::BasePlotContext &context);
264
268
269 protected:
270 //! Name of the plot widget.
271 QString m_name = "NOT_SET";
272
273 //! Description of the plot widget.
274 QString m_desc = "NOT_SET";
275
276 //! The name of the data file from which the mass data were read.
277 QString m_fileName;
278
281
283
284 int m_leftMousePseudoButtonKey = Qt::Key_Less;
285 int m_rightMousePseudoButtonKey = Qt::Key_Greater;
286
287 //! Rectangle defining the borders of zoomed-in/out data.
288 // QCPItemRect *mp_zoomRectItem = nullptr;
289
290 // The four lines that are needed to craft the selection rectangle.
291 QCPItemLine *mp_selectionRectangeLine1 = nullptr;
292 QCPItemLine *mp_selectionRectangeLine2 = nullptr;
293 QCPItemLine *mp_selectionRectangeLine3 = nullptr;
294 QCPItemLine *mp_selectionRectangeLine4 = nullptr;
295
296 //! Text describing the x-axis delta value during a drag operation.
297 QCPItemText *mp_xDeltaTextItem = nullptr;
298 QCPItemText *mp_yDeltaTextItem = nullptr;
299
300 //! Tells if the tracers should be visible.
302
303 //! Horizontal position tracer
304 QCPItemLine *mp_hPosTracerItem = nullptr;
305
306 //! Vertical position tracer
307 QCPItemLine *mp_vPosTracerItem = nullptr;
308
309 //! Vertical selection start tracer (typically in green).
310 QCPItemLine *mp_vStartTracerItem = nullptr;
311
312 //! Vertical selection end tracer (typically in red).
313 QCPItemLine *mp_vEndTracerItem = nullptr /*only vertical*/;
314
315 //! Index of the last axis range history item.
316 /*!
317
318 Each time the user modifies the ranges (x/y axis) during panning or
319 zooming of the graph, the new axis ranges are stored in a axis ranges
320 history list. This index allows to point to the last range of that
321 history.
322
323*/
325
326 //! List of x axis ranges occurring during the panning zooming actions.
327 std::vector<QCPRange *> m_xAxisRangeHistory;
328
329 //! List of y axis ranges occurring during the panning zooming actions.
330 std::vector<QCPRange *> m_yAxisRangeHistory;
331
332 //! How many mouse move events must be skipped */
333 /*!
334
335 when the data are so massive that the graph panning becomes sluggish. By
336 default, the value is 10 events to be skipped before accounting one. The
337 "fat data" mouse movement handler mechanism is actuated by using a
338 keyboard key combination. There is no automatic shift between normal
339 processing and "fat data" processing.
340
341*/
343
344 //! Counter to handle the "fat data" mouse move event handling.
345 /*!
346
347 \sa m_mouseMoveHandlerSkipAmount.
348
349*/
351
352 // QColor m_unfocusedColor = QColor(Qt::lightGray);
353 // QColor m_unfocusedColor = QColor(230, 230, 230, 255);
354
355 //! Color used for the background of unfocused plot.
356 QColor m_unfocusedColor = QColor("lightgray");
357 //! Color used for the background of unfocused plot.
359
360 //! Color used for the background of focused plot.
361 QColor m_focusedColor = QColor(Qt::transparent);
362 //! Color used for the background of focused plot.
364
365 //! Pen used to draw the graph and textual elements in the plot widget.
366 QPen m_pen;
367
368 virtual void createAllAncillaryItems();
369 virtual void updateIntegrationScope(bool for_integration = false);
370 virtual void updateIntegrationScopeRect(bool for_integration = false);
371 virtual void updateIntegrationScopeHorizontalRhomb(bool for_integration = false);
372 virtual void updateIntegrationScopeVerticalRhomb(bool for_integration = false);
373 virtual void updateIntegrationScopeRhomb(bool for_integration = false);
374 virtual QString allLayerNamesToString() const;
375 virtual QString layerableLayerName(QCPLayerable *layerable_p) const;
376 virtual int layerableLayerIndex(QCPLayerable *layerable_p) const;
377};
378
379
380} // namespace pappso
381
382
385
int basePlotContextPtrMetaTypeId
int basePlotContextMetaTypeId
Q_DECLARE_METATYPE(pappso::BasePlotContext)
virtual void updateIntegrationScopeRect(bool for_integration=false)
int m_mouseMoveHandlerSkipAmount
How many mouse move events must be skipped *‍/.
std::size_t m_lastAxisRangeHistoryIndex
Index of the last axis range history item.
virtual void replotWithAxesRanges(QCPRange xAxisRange, QCPRange yAxisRange, Enums::Axis axis)
virtual void updateAxesRangeHistory()
Create new axis range history items and append them to the history.
virtual void mouseWheelHandler(QWheelEvent *event)
void plottableDestructionRequestedSignal(BasePlotWidget *base_plot_widget_p, QCPAbstractPlottable *plottable_p, const pappso::BasePlotContext &context)
bool m_shouldTracersBeVisible
Tells if the tracers should be visible.
virtual void hideSelectionRectangle(bool reset_values=false)
virtual void updateIntegrationScopeDrawing(bool as_line_segment=false, bool for_integration=false)
virtual void directionKeyReleaseEvent(QKeyEvent *event)
QString m_name
Name of the plot widget.
QCPItemText * mp_yDeltaTextItem
void mousePressEventSignal(QMouseEvent *event, const pappso::BasePlotContext &context)
QCPItemLine * mp_selectionRectangeLine1
Rectangle defining the borders of zoomed-in/out data.
virtual QCPRange getOutermostRangeX(bool &found_range) const
void lastCursorHoveredPointSignal(const QPointF &pointf)
virtual const BasePlotContext & getContext() const
virtual void drawSelectionRectangleAndPrepareZoom(bool as_line_segment=false, bool for_integration=false)
virtual QCPRange getRangeY(bool &found_range, int index) const
virtual void keyPressEvent(QKeyEvent *event)
KEYBOARD-related EVENTS.
void xAxisMeasurementSignal(const pappso::BasePlotContext &context, bool with_delta)
virtual void updateIntegrationScope(bool for_integration=false)
QString m_fileName
The name of the data file from which the mass data were read.
virtual void mouseMoveHandlerLeftButtonDraggingCursor(QMouseEvent *event)
QCPItemLine * mp_selectionRectangeLine2
void plotRangesChangedSignal(QMouseEvent *event, const pappso::BasePlotContext &context)
QCPItemText * mp_xDeltaTextItem
Text describing the x-axis delta value during a drag operation.
virtual void setAxisLabelX(const QString &label)
int m_mouseMoveHandlerSkipCount
Counter to handle the "fat data" mouse move event handling.
virtual QCPRange getOutermostRangeY(bool &found_range) const
virtual void mouseMoveHandlerRightButtonDraggingCursor(QMouseEvent *event)
int dragDirection()
MOUSE-related EVENTS.
bool isClickOntoYAxis(const QPointF &mousePoint)
virtual void moveMouseCursorPixelCoordToGlobal(QPointF local_coordinates)
QCPItemLine * mp_hPosTracerItem
Horizontal position tracer.
QCPItemLine * mp_vPosTracerItem
Vertical position tracer.
virtual void setPen(const QPen &pen)
virtual void mouseMoveHandlerDraggingCursor(QMouseEvent *event)
virtual QCPRange getInnermostRangeX(bool &found_range) const
virtual void redrawPlotBackground(QWidget *focusedPlotWidget)
Redraw the background of the focusedPlotWidget plot widget.
virtual void mouseReleaseHandlerLeftButton(QMouseEvent *event)
virtual void mouseMoveHandlerNotDraggingCursor(QMouseEvent *event)
bool isClickOntoXAxis(const QPointF &mousePoint)
virtual void setAxisLabelY(const QString &label)
virtual void restoreAxesRangeHistory(std::size_t index)
Get the axis histories at index index and update the plot ranges.
virtual void drawXScopeSpanFeatures()
virtual void spaceKeyReleaseEvent(QKeyEvent *event)
void keyPressEventSignal(const pappso::BasePlotContext &context)
virtual void replotWithAxisRangeX(double lower, double upper)
QColor m_unfocusedColor
Color used for the background of unfocused plot.
virtual void createAllAncillaryItems()
virtual QColor getPlottingColor(QCPAbstractPlottable *plottable_p) const
QBrush m_focusedBrush
Color used for the background of focused plot.
QPen m_pen
Pen used to draw the graph and textual elements in the plot widget.
virtual bool isSelectionRectangleVisible()
virtual bool isVerticalDisplacementAboveThreshold()
virtual void mousePressHandler(QMouseEvent *event)
KEYBOARD-related EVENTS.
virtual void verticalMoveMouseCursorCountPixels(int pixel_count)
virtual void updateIntegrationScopeRhomb(bool for_integration=false)
void mouseWheelEventSignal(QWheelEvent *event, const pappso::BasePlotContext &context)
virtual void resetAxesRangeHistory()
virtual SelectionDrawingLines whatIsVisibleOfTheSelectionRectangle()
virtual void showTracers()
Show the traces (vertical and horizontal).
virtual QPointF horizontalGetGraphCoordNewPointCountPixels(int pixel_count)
QCPItemLine * mp_selectionRectangeLine4
QColor m_focusedColor
Color used for the background of focused plot.
void yMinMaxOnXAxisCurrentRange(double &min, double &max, int index)
virtual void horizontalMoveMouseCursorCountPixels(int pixel_count)
BasePlotWidget(QWidget *parent)
std::vector< QCPRange * > m_yAxisRangeHistory
List of y axis ranges occurring during the panning zooming actions.
virtual QCPRange getInnermostRangeY(bool &found_range) const
virtual void setFocus()
PLOT ITEMS : TRACER TEXT ITEMS...
virtual void drawYScopeSpanFeatures()
virtual const QPen & getPen() const
virtual void updateContextXandYAxisRanges()
void keyReleaseEventSignal(const pappso::BasePlotContext &context)
virtual void updateIntegrationScopeHorizontalRhomb(bool for_integration=false)
void plottableSelectionChangedSignal(QCPAbstractPlottable *plottable_p, bool selected)
virtual void mousePseudoButtonKeyPressEvent(QKeyEvent *event)
virtual void setPlottingColor(QCPAbstractPlottable *plottable_p, const QColor &new_color)
virtual void calculateDragDeltas()
QCPRange getRange(Enums::Axis axis, RangeType range_type, bool &found_range) const
virtual QPointF verticalGetGraphCoordNewPointCountPixels(int pixel_count)
QCPItemLine * mp_vStartTracerItem
Vertical selection start tracer (typically in green).
virtual void mouseReleaseHandler(QMouseEvent *event)
QBrush m_unfocusedBrush
Color used for the background of unfocused plot.
virtual void axisRescale()
RANGE-related functions.
virtual void moveMouseCursorGraphCoordToGlobal(QPointF plot_coordinates)
virtual QString allLayerNamesToString() const
QCPItemLine * mp_selectionRectangeLine3
void mouseReleaseEventSignal(QMouseEvent *event, const pappso::BasePlotContext &context)
virtual void axisDoubleClickHandler(QCPAxis *axis, QCPAxis::SelectablePart part, QMouseEvent *event)
QString m_desc
Description of the plot widget.
QCPItemLine * mp_vEndTracerItem
Vertical selection end tracer (typically in red).
void plotRangesChangedWheelEventSignal(QWheelEvent *event, const pappso::BasePlotContext &context)
virtual void mouseMoveHandler(QMouseEvent *event)
KEYBOARD-related EVENTS.
virtual void directionKeyPressEvent(QKeyEvent *event)
virtual QString layerableLayerName(QCPLayerable *layerable_p) const
virtual void keyReleaseEvent(QKeyEvent *event)
Handle specific key codes and trigger respective actions.
virtual void resetSelectionRectangle()
virtual void restorePreviousAxesRangeHistory()
Go up one history element in the axis history.
virtual int layerableLayerIndex(QCPLayerable *layerable_p) const
void integrationRequestedSignal(const BasePlotContext &context)
virtual void replotWithAxisRangeY(double lower, double upper)
virtual void hideTracers()
Hide the traces (vertical and horizontal).
virtual void mouseReleaseHandlerRightButton(QMouseEvent *event)
void yMinMaxOnXAxisCurrentRange(double &min, double &max, QCPAbstractPlottable *plottable_p=nullptr)
virtual void updateIntegrationScopeVerticalRhomb(bool for_integration=false)
virtual void mousePseudoButtonKeyReleaseEvent(QKeyEvent *event)
virtual void hideAllPlotItems()
PLOTTING / REPLOTTING functions.
virtual QCPRange getRangeX(bool &found_range, int index) const
MOUSE MOVEMENTS mouse/keyboard-triggered.
std::vector< QCPRange * > m_xAxisRangeHistory
List of x axis ranges occurring during the panning zooming actions.
BasePlotContext m_context
#define PMSPP_LIB_DECL
tries to keep as much as possible monoisotopes, removing any possible C13 peaks and changes multichar...
Definition aa.cpp:39
SelectionDrawingLines
std::shared_ptr< const BasePlotWidget > BasePlotWidgetCstSPtr
std::shared_ptr< BasePlotWidget > BasePlotWidgetSPtr