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();
136 virtual void mouseReleaseHandlerRightButton();
137
138 virtual void mouseWheelHandler(QWheelEvent *event);
139
140 virtual void mouseMoveHandler(QMouseEvent *event);
142 virtual void mouseMoveHandlerDraggingCursor();
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
236
237 void lastCursorHoveredPointSignal(const QPointF &pointf);
238
240
241 void xAxisMeasurementSignal(const BasePlotContext &context, bool with_delta);
242
245
248
250
251 void plottableSelectionChangedSignal(QCPAbstractPlottable *plottable_p,
252 bool selected);
253
255
257 QCPAbstractPlottable *plottable_p,
258 const BasePlotContext &context);
259
263
264 protected:
265 //! Name of the plot widget.
266 QString m_name = "NOT_SET";
267
268 //! Description of the plot widget.
269 QString m_desc = "NOT_SET";
270
271 //! The name of the data file from which the mass data were read.
272 QString m_fileName;
273
276
278
279 int m_leftMousePseudoButtonKey = Qt::Key_Less;
280 int m_rightMousePseudoButtonKey = Qt::Key_Greater;
281
282 //! Rectangle defining the borders of zoomed-in/out data.
283 // QCPItemRect *mp_zoomRectItem = nullptr;
284
285 // The four lines that are needed to craft the selection rectangle.
286 QCPItemLine *mp_selectionRectangeLine1 = nullptr;
287 QCPItemLine *mp_selectionRectangeLine2 = nullptr;
288 QCPItemLine *mp_selectionRectangeLine3 = nullptr;
289 QCPItemLine *mp_selectionRectangeLine4 = nullptr;
290
291 //! Text describing the x-axis delta value during a drag operation.
292 QCPItemText *mp_xDeltaTextItem = nullptr;
293 QCPItemText *mp_yDeltaTextItem = nullptr;
294
295 //! Tells if the tracers should be visible.
297
298 //! Horizontal position tracer
299 QCPItemLine *mp_hPosTracerItem = nullptr;
300
301 //! Vertical position tracer
302 QCPItemLine *mp_vPosTracerItem = nullptr;
303
304 //! Vertical selection start tracer (typically in green).
305 QCPItemLine *mp_vStartTracerItem = nullptr;
306
307 //! Vertical selection end tracer (typically in red).
308 QCPItemLine *mp_vEndTracerItem = nullptr /*only vertical*/;
309
310 //! Index of the last axis range history item.
311 /*!
312
313 Each time the user modifies the ranges (x/y axis) during panning or
314 zooming of the graph, the new axis ranges are stored in a axis ranges
315 history list. This index allows to point to the last range of that
316 history.
317
318*/
320
321 //! List of x axis ranges occurring during the panning zooming actions.
322 std::vector<QCPRange *> m_xAxisRangeHistory;
323
324 //! List of y axis ranges occurring during the panning zooming actions.
325 std::vector<QCPRange *> m_yAxisRangeHistory;
326
327 //! How many mouse move events must be skipped */
328 /*!
329
330 when the data are so massive that the graph panning becomes sluggish. By
331 default, the value is 10 events to be skipped before accounting one. The
332 "fat data" mouse movement handler mechanism is actuated by using a
333 keyboard key combination. There is no automatic shift between normal
334 processing and "fat data" processing.
335
336*/
338
339 //! Counter to handle the "fat data" mouse move event handling.
340 /*!
341
342 \sa m_mouseMoveHandlerSkipAmount.
343
344*/
346
347 // QColor m_unfocusedColor = QColor(Qt::lightGray);
348 // QColor m_unfocusedColor = QColor(230, 230, 230, 255);
349
350 //! Color used for the background of unfocused plot.
351 QColor m_unfocusedColor = QColor("lightgray");
352 //! Color used for the background of unfocused plot.
354
355 //! Color used for the background of focused plot.
356 QColor m_focusedColor = QColor(Qt::transparent);
357 //! Color used for the background of focused plot.
359
360 //! Pen used to draw the graph and textual elements in the plot widget.
361 QPen m_pen;
362
363 virtual void createAllAncillaryItems();
364 virtual void updateIntegrationScope(bool for_integration = false);
365 virtual void updateIntegrationScopeRect(bool for_integration = false);
366 virtual void updateIntegrationScopeHorizontalRhomb(bool for_integration = false);
367 virtual void updateIntegrationScopeVerticalRhomb(bool for_integration = false);
368 virtual void updateIntegrationScopeRhomb(bool for_integration = false);
369 virtual QString allLayerNamesToString() const;
370 virtual QString layerableLayerName(QCPLayerable *layerable_p) const;
371 virtual int layerableLayerIndex(QCPLayerable *layerable_p) const;
372};
373
374
375} // namespace pappso
376
377
380
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)
bool m_shouldTracersBeVisible
Tells if the tracers should be visible.
virtual void hideSelectionRectangle(bool reset_values=false)
virtual void mouseMoveHandlerDraggingCursor()
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
QCPItemLine * mp_selectionRectangeLine1
Rectangle defining the borders of zoomed-in/out data.
virtual QCPRange getOutermostRangeX(bool &found_range) const
void lastCursorHoveredPointSignal(const QPointF &pointf)
void plottableDestructionRequestedSignal(BasePlotWidget *base_plot_widget_p, QCPAbstractPlottable *plottable_p, const BasePlotContext &context)
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.
virtual void updateIntegrationScope(bool for_integration=false)
QString m_fileName
The name of the data file from which the mass data were read.
QCPItemLine * mp_selectionRectangeLine2
QCPItemText * mp_xDeltaTextItem
Text describing the x-axis delta value during a drag operation.
void mousePressEventSignal(const BasePlotContext &context)
virtual void setAxisLabelX(const QString &label)
virtual void mouseMoveHandlerLeftButtonDraggingCursor()
int m_mouseMoveHandlerSkipCount
Counter to handle the "fat data" mouse move event handling.
virtual QCPRange getOutermostRangeY(bool &found_range) const
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 mouseReleaseHandlerRightButton()
virtual QCPRange getInnermostRangeX(bool &found_range) const
virtual void mouseMoveHandlerNotDraggingCursor()
virtual void redrawPlotBackground(QWidget *focusedPlotWidget)
Redraw the background of the focusedPlotWidget plot widget.
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)
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
virtual void mouseReleaseHandlerLeftButton()
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(const 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
void mouseReleaseEventSignal(const BasePlotContext &context)
virtual void setFocus()
PLOT ITEMS : TRACER TEXT ITEMS...
virtual void drawYScopeSpanFeatures()
void keyReleaseEventSignal(const BasePlotContext &context)
virtual const QPen & getPen() const
virtual void updateContextXandYAxisRanges()
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)
void plotRangesChangedSignal(const BasePlotContext &context)
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
virtual void axisDoubleClickHandler(QCPAxis *axis, QCPAxis::SelectablePart part, QMouseEvent *event)
virtual void mouseMoveHandlerRightButtonDraggingCursor()
QString m_desc
Description of the plot widget.
QCPItemLine * mp_vEndTracerItem
Vertical selection end tracer (typically in red).
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)
void xAxisMeasurementSignal(const BasePlotContext &context, bool with_delta)
virtual void replotWithAxisRangeY(double lower, double upper)
virtual void hideTracers()
Hide the traces (vertical and horizontal).
void keyPressEventSignal(const BasePlotContext &context)
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