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
46#include "../../exportinmportconfig.h"
47#include "../../types.h"
48#include "../../processing/combiners/selectionpolygon.h"
49#include "baseplotcontext.h"
50
51
52namespace pappso
53{
54
55enum class RangeType
56{
57 outermost = 1,
58 innermost = 2,
59};
60
61class BasePlotWidget;
62
63typedef std::shared_ptr<BasePlotWidget> BasePlotWidgetSPtr;
64typedef std::shared_ptr<const BasePlotWidget> BasePlotWidgetCstSPtr;
65
66class PMSPP_LIB_DECL BasePlotWidget : public QCustomPlot
67{
68 Q_OBJECT
69
70 public:
71 explicit BasePlotWidget(QWidget *parent);
72 explicit BasePlotWidget(QWidget *parent,
73 const QString &x_axis_label,
74 const QString &y_axis_label);
75
76 virtual ~BasePlotWidget();
77
78 virtual bool setupWidget();
79
80 virtual void setPen(const QPen &pen);
81 virtual const QPen &getPen() const;
82
83 virtual void setPlottingColor(QCPAbstractPlottable *plottable_p,
84 const QColor &new_color);
85 virtual void setPlottingColor(int index, const QColor &new_color);
86
87 virtual QColor getPlottingColor(QCPAbstractPlottable *plottable_p) const;
88 virtual QColor getPlottingColor(int index = 0) const;
89
90 virtual void setAxisLabelX(const QString &label);
91 virtual void setAxisLabelY(const QString &label);
92
93 // AXES RANGE HISTORY-related functions
94 virtual void resetAxesRangeHistory();
95 virtual void updateAxesRangeHistory();
96 virtual void restorePreviousAxesRangeHistory();
97 virtual void restoreAxesRangeHistory(std::size_t index);
98 // AXES RANGE HISTORY-related functions
99
100
101 /// KEYBOARD-related EVENTS
102 virtual void keyPressEvent(QKeyEvent *event);
103 virtual void keyReleaseEvent(QKeyEvent *event);
104
105 virtual void spaceKeyReleaseEvent(QKeyEvent *event);
106
107 virtual void directionKeyPressEvent(QKeyEvent *event);
108 virtual void directionKeyReleaseEvent(QKeyEvent *event);
109
110 virtual void mousePseudoButtonKeyPressEvent(QKeyEvent *event);
111 virtual void mousePseudoButtonKeyReleaseEvent(QKeyEvent *event);
112 /// KEYBOARD-related EVENTS
113
114
115 /// MOUSE-related EVENTS
116 virtual void mousePressHandler(QMouseEvent *event);
117 virtual void mouseReleaseHandler(QMouseEvent *event);
118 virtual void mouseReleaseHandlerLeftButton();
119 virtual void mouseReleaseHandlerRightButton();
120
121 virtual void mouseWheelHandler(QWheelEvent *event);
122
123 virtual void mouseMoveHandler(QMouseEvent *event);
124 virtual void mouseMoveHandlerNotDraggingCursor();
125 virtual void mouseMoveHandlerDraggingCursor();
126 virtual void mouseMoveHandlerLeftButtonDraggingCursor();
127 virtual void mouseMoveHandlerRightButtonDraggingCursor();
128
129 virtual void axisDoubleClickHandler(QCPAxis *axis,
130 QCPAxis::SelectablePart part,
131 QMouseEvent *event);
132 bool isClickOntoXAxis(const QPointF &mousePoint);
133 bool isClickOntoYAxis(const QPointF &mousePoint);
134 /// MOUSE-related EVENTS
135
136
137 /// MOUSE MOVEMENTS mouse/keyboard-triggered
138 int dragDirection();
139 virtual void moveMouseCursorGraphCoordToGlobal(QPointF plot_coordinates);
140 virtual void moveMouseCursorPixelCoordToGlobal(QPointF local_coordinates);
141 virtual void horizontalMoveMouseCursorCountPixels(int pixel_count);
142 virtual QPointF horizontalGetGraphCoordNewPointCountPixels(int pixel_count);
143 virtual void verticalMoveMouseCursorCountPixels(int pixel_count);
144 virtual QPointF verticalGetGraphCoordNewPointCountPixels(int pixel_count);
145 /// MOUSE MOVEMENTS mouse/keyboard-triggered
146
147
148 /// RANGE-related functions
149 virtual QCPRange getRangeX(bool &found_range, int index) const;
150 virtual QCPRange getRangeY(bool &found_range, int index) const;
151 QCPRange getRange(Axis axis, RangeType range_type, bool &found_range) const;
152
153 virtual QCPRange getInnermostRangeX(bool &found_range) const;
154 virtual QCPRange getOutermostRangeX(bool &found_range) const;
155
156 virtual QCPRange getInnermostRangeY(bool &found_range) const;
157 virtual QCPRange getOutermostRangeY(bool &found_range) const;
158
160 double &max,
161 QCPAbstractPlottable *plottable_p = nullptr);
162 void yMinMaxOnXAxisCurrentRange(double &min, double &max, int index);
163 /// RANGE-related functions
164
165
166 /// PLOTTING / REPLOTTING functions
167 virtual void axisRescale();
168 virtual void axisReframe();
169 virtual void axisZoom();
170 virtual void axisPan();
171
172 virtual void
173 replotWithAxesRanges(QCPRange xAxisRange, QCPRange yAxisRange, Axis axis);
174
175 virtual void replotWithAxisRangeX(double lower, double upper);
176 virtual void replotWithAxisRangeY(double lower, double upper);
177 /// PLOTTING / REPLOTTING functions
178
179
180 /// PLOT ITEMS : TRACER TEXT ITEMS...
181 virtual void hideAllPlotItems();
182
183 virtual void showTracers();
184 virtual void hideTracers();
185
186 virtual void drawXDeltaFeatures();
187 virtual void drawYDeltaFeatures();
188
189 virtual void calculateDragDeltas();
190
191 virtual bool isVerticalDisplacementAboveThreshold();
192
193 virtual void
194 drawSelectionRectangleAndPrepareZoom(bool as_line_segment = false,
195 bool for_integration = false);
196
197 virtual void updateSelectionRectangle(bool as_line_segment = false,
198 bool for_integration = false);
199
200 virtual void resetSelectionRectangle();
201 virtual void hideSelectionRectangle(bool reset_values = false);
202 virtual bool isSelectionRectangleVisible();
203 virtual PolygonType whatIsVisibleOfTheSelectionRectangle();
204
205 /// PLOT ITEMS : TRACER TEXT ITEMS...
206
207
208 virtual void setFocus();
209
210 virtual void redrawPlotBackground(QWidget *focusedPlotWidget);
211
212 virtual void updateContextXandYAxisRanges();
213
214 virtual const BasePlotContext &getContext() const;
215
216 signals:
217
219
220 void lastCursorHoveredPointSignal(const QPointF &pointf);
221
223
224 void xAxisMeasurementSignal(const BasePlotContext &context, bool with_delta);
225
228
230
232
233 void plottableSelectionChangedSignal(QCPAbstractPlottable *plottable_p,
234 bool selected);
235
237
239 QCPAbstractPlottable *plottable_p,
240 const BasePlotContext &context);
241
242 protected:
243 //! Name of the plot widget.
244 QString m_name = "NOT_SET";
245
246 //! Description of the plot widget.
247 QString m_desc = "NOT_SET";
248
249 //! The name of the data file from which the mass data were read.
250 QString m_fileName;
251
254
256
257 int m_leftMousePseudoButtonKey = Qt::Key_Less;
258 int m_rightMousePseudoButtonKey = Qt::Key_Greater;
259
260 //! Rectangle defining the borders of zoomed-in/out data.
261 // QCPItemRect *mp_zoomRectItem = nullptr;
262
263 // The four lines that are needed to craft the selection rectangle.
264 QCPItemLine *mp_selectionRectangeLine1 = nullptr;
265 QCPItemLine *mp_selectionRectangeLine2 = nullptr;
266 QCPItemLine *mp_selectionRectangeLine3 = nullptr;
267 QCPItemLine *mp_selectionRectangeLine4 = nullptr;
268
269 //! Text describing the x-axis delta value during a drag operation.
270 QCPItemText *mp_xDeltaTextItem = nullptr;
271 QCPItemText *mp_yDeltaTextItem = nullptr;
272
273 //! Tells if the tracers should be visible.
274 bool m_shouldTracersBeVisible = true;
275
276 //! Horizontal position tracer
277 QCPItemLine *mp_hPosTracerItem = nullptr;
278
279 //! Vertical position tracer
280 QCPItemLine *mp_vPosTracerItem = nullptr;
281
282 //! Vertical selection start tracer (typically in green).
283 QCPItemLine *mp_vStartTracerItem = nullptr;
284
285 //! Vertical selection end tracer (typically in red).
286 QCPItemLine *mp_vEndTracerItem = nullptr /*only vertical*/;
287
288 //! Index of the last axis range history item.
289 /*!
290
291 Each time the user modifies the ranges (x/y axis) during panning or
292 zooming of the graph, the new axis ranges are stored in a axis ranges
293 history list. This index allows to point to the last range of that
294 history.
295
296*/
297 std::size_t m_lastAxisRangeHistoryIndex = 0;
298
299 //! List of x axis ranges occurring during the panning zooming actions.
300 std::vector<QCPRange *> m_xAxisRangeHistory;
301
302 //! List of y axis ranges occurring during the panning zooming actions.
303 std::vector<QCPRange *> m_yAxisRangeHistory;
304
305 //! How many mouse move events must be skipped */
306 /*!
307
308 when the data are so massive that the graph panning becomes sluggish. By
309 default, the value is 10 events to be skipped before accounting one. The
310 "fat data" mouse movement handler mechanism is actuated by using a
311 keyboard key combination. There is no automatic shift between normal
312 processing and "fat data" processing.
313
314*/
315 int m_mouseMoveHandlerSkipAmount = 10;
316
317 //! Counter to handle the "fat data" mouse move event handling.
318 /*!
319
320 \sa m_mouseMoveHandlerSkipAmount.
321
322*/
323 int m_mouseMoveHandlerSkipCount = 0;
324
325 // QColor m_unfocusedColor = QColor(Qt::lightGray);
326 // QColor m_unfocusedColor = QColor(230, 230, 230, 255);
327
328 //! Color used for the background of unfocused plot.
329 QColor m_unfocusedColor = QColor("lightgray");
330 //! Color used for the background of unfocused plot.
331 QBrush m_unfocusedBrush = QBrush(m_unfocusedColor);
332
333 //! Color used for the background of focused plot.
334 QColor m_focusedColor = QColor(Qt::transparent);
335 //! Color used for the background of focused plot.
336 QBrush m_focusedBrush = QBrush(m_focusedColor);
337
338 //! Pen used to draw the graph and textual elements in the plot widget.
339 QPen m_pen;
340
341 virtual void createAllAncillaryItems();
342 virtual void update1DSelectionRectangle(bool for_integration = false);
343 virtual void update2DSelectionRectangleSquare(bool for_integration = false);
344 virtual void update2DSelectionRectangleSkewed(bool for_integration = false);
345 virtual QString allLayerNamesToString() const;
346 virtual QString layerableLayerName(QCPLayerable *layerable_p) const;
347 virtual int layerableLayerIndex(QCPLayerable *layerable_p) const;
348};
349
350
351} // namespace pappso
352
353
356
Q_DECLARE_METATYPE(pappso::BasePlotContext)
int basePlotContextPtrMetaTypeId
int basePlotContextMetaTypeId
void lastCursorHoveredPointSignal(const QPointF &pointf)
void plottableDestructionRequestedSignal(BasePlotWidget *base_plot_widget_p, QCPAbstractPlottable *plottable_p, const BasePlotContext &context)
QString m_fileName
The name of the data file from which the mass data were read.
QPen m_pen
Pen used to draw the graph and textual elements in the plot widget.
void mouseWheelEventSignal(const BasePlotContext &context)
void yMinMaxOnXAxisCurrentRange(double &min, double &max, int index)
std::vector< QCPRange * > m_yAxisRangeHistory
List of y axis ranges occurring during the panning zooming actions.
void mouseReleaseEventSignal(const BasePlotContext &context)
void keyReleaseEventSignal(const BasePlotContext &context)
void plottableSelectionChangedSignal(QCPAbstractPlottable *plottable_p, bool selected)
void plotRangesChangedSignal(const BasePlotContext &context)
void integrationRequestedSignal(const BasePlotContext &context)
void xAxisMeasurementSignal(const BasePlotContext &context, bool with_delta)
void keyPressEventSignal(const BasePlotContext &context)
void yMinMaxOnXAxisCurrentRange(double &min, double &max, QCPAbstractPlottable *plottable_p=nullptr)
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
std::shared_ptr< const BasePlotWidget > BasePlotWidgetCstSPtr
std::shared_ptr< BasePlotWidget > BasePlotWidgetSPtr