libpappsomspp
Library for mass spectrometry
Loading...
Searching...
No Matches
pappso::BaseTracePlotWidget Class Reference

#include <basetraceplotwidget.h>

Inheritance diagram for pappso::BaseTracePlotWidget:
pappso::BasePlotWidget pappso::DriftSpecTracePlotWidget pappso::MassSpecTracePlotWidget pappso::TicXicChromTracePlotWidget

Public Member Functions

 BaseTracePlotWidget (QWidget *parent=0)
 BaseTracePlotWidget (QWidget *parent, const QString &x_axis_label, const QString &y_axis_label)
virtual ~BaseTracePlotWidget ()
 Destruct this BaseTracePlotWidget instance.
virtual void setGraphData (int graph_index, const std::vector< double > &keys, const std::vector< double > &values)
virtual void setGraphData (QCPGraph *graph_p, const std::vector< double > &keys, const std::vector< double > &values)
virtual void clearGraphData (int graph_index)
virtual void axisDoubleClickHandler (QCPAxis *axis, QCPAxis::SelectablePart part, QMouseEvent *event) override
virtual void axisRescale () override
 RANGE-related functions.
virtual void axisReframe () override
virtual void axisZoom () override
virtual void axisPan () override
virtual QCPGraph * addTrace (const pappso::Trace &trace, const QColor &color)
virtual bool findIntegrationLowerRangeForKey (int index, double key, QCPRange &range)
 Find a minimal integration range starting at an existing data point.
std::vector< double > getValuesX (int index) const
std::vector< double > getValuesY (int index) const
QCPRange getValueRangeOnKeyRange (QCPAbstractPlottable *plottable_p, bool &ok)
QCPRange getValueRangeOnKeyRange (int index, bool &ok)
double getYatX (double x, QCPGraph *graph_p)
double getYatX (double x, int index=0)
pappso::Trace toTrace (int index) const
pappso::Trace toTrace (const QCPGraph *graph_p) const
pappso::Trace toTrace (const QCPRange &x_axis_range, int index) const
pappso::Trace toTrace (const QCPRange &x_axis_range, const QCPGraph *graph_p) const
Public Member Functions inherited from pappso::BasePlotWidget
 BasePlotWidget (QWidget *parent)
 BasePlotWidget (QWidget *parent, const QString &x_axis_label, const QString &y_axis_label)
virtual ~BasePlotWidget ()
 Destruct this BasePlotWidget instance.
virtual bool setupWidget ()
virtual void setPen (const QPen &pen)
virtual const QPen & getPen () const
virtual void setPlottingColor (QCPAbstractPlottable *plottable_p, const QColor &new_color)
virtual void setPlottingColor (int index, const QColor &new_color)
virtual QColor getPlottingColor (QCPAbstractPlottable *plottable_p) const
virtual QColor getPlottingColor (int index=0) const
virtual void setAxisLabelX (const QString &label)
virtual void setAxisLabelY (const QString &label)
virtual void resetAxesRangeHistory ()
virtual void updateAxesRangeHistory ()
 Create new axis range history items and append them to the history.
virtual void restorePreviousAxesRangeHistory ()
 Go up one history element in the axis history.
virtual void restoreAxesRangeHistory (std::size_t index)
 Get the axis histories at index index and update the plot ranges.
virtual void keyPressEvent (QKeyEvent *event)
 KEYBOARD-related EVENTS.
virtual void keyReleaseEvent (QKeyEvent *event)
 Handle specific key codes and trigger respective actions.
virtual void spaceKeyReleaseEvent (QKeyEvent *event)
virtual void directionKeyPressEvent (QKeyEvent *event)
virtual void directionKeyReleaseEvent (QKeyEvent *event)
virtual void mousePseudoButtonKeyPressEvent (QKeyEvent *event)
virtual void mousePseudoButtonKeyReleaseEvent (QKeyEvent *event)
virtual void mousePressHandler (QMouseEvent *event)
 KEYBOARD-related EVENTS.
virtual void mouseReleaseHandler (QMouseEvent *event)
virtual void mouseReleaseHandlerLeftButton ()
virtual void mouseReleaseHandlerRightButton ()
virtual void mouseWheelHandler (QWheelEvent *event)
virtual void mouseMoveHandler (QMouseEvent *event)
 KEYBOARD-related EVENTS.
virtual void mouseMoveHandlerNotDraggingCursor ()
virtual void mouseMoveHandlerDraggingCursor ()
virtual void mouseMoveHandlerLeftButtonDraggingCursor ()
virtual void mouseMoveHandlerRightButtonDraggingCursor ()
bool isClickOntoXAxis (const QPointF &mousePoint)
bool isClickOntoYAxis (const QPointF &mousePoint)
int dragDirection ()
 MOUSE-related EVENTS.
virtual void moveMouseCursorGraphCoordToGlobal (QPointF plot_coordinates)
virtual void moveMouseCursorPixelCoordToGlobal (QPointF local_coordinates)
virtual void horizontalMoveMouseCursorCountPixels (int pixel_count)
virtual QPointF horizontalGetGraphCoordNewPointCountPixels (int pixel_count)
virtual void verticalMoveMouseCursorCountPixels (int pixel_count)
virtual QPointF verticalGetGraphCoordNewPointCountPixels (int pixel_count)
virtual QCPRange getRangeX (bool &found_range, int index) const
 MOUSE MOVEMENTS mouse/keyboard-triggered.
virtual QCPRange getRangeY (bool &found_range, int index) const
QCPRange getRange (Enums::Axis axis, RangeType range_type, bool &found_range) const
virtual QCPRange getInnermostRangeX (bool &found_range) const
virtual QCPRange getOutermostRangeX (bool &found_range) const
virtual QCPRange getInnermostRangeY (bool &found_range) const
virtual QCPRange getOutermostRangeY (bool &found_range) const
void yMinMaxOnXAxisCurrentRange (double &min, double &max, QCPAbstractPlottable *plottable_p=nullptr)
void yMinMaxOnXAxisCurrentRange (double &min, double &max, int index)
virtual void replotWithAxesRanges (QCPRange xAxisRange, QCPRange yAxisRange, Enums::Axis axis)
virtual void replotWithAxisRangeX (double lower, double upper)
virtual void replotWithAxisRangeY (double lower, double upper)
virtual void hideAllPlotItems ()
 PLOTTING / REPLOTTING functions.
virtual void showTracers ()
 Show the traces (vertical and horizontal).
virtual void hideTracers ()
 Hide the traces (vertical and horizontal).
virtual void drawXScopeSpanFeatures ()
virtual void drawYScopeSpanFeatures ()
virtual void calculateDragDeltas ()
virtual bool isVerticalDisplacementAboveThreshold ()
virtual void drawSelectionRectangleAndPrepareZoom (bool as_line_segment=false, bool for_integration=false)
virtual void updateIntegrationScopeDrawing (bool as_line_segment=false, bool for_integration=false)
virtual void resetSelectionRectangle ()
virtual void hideSelectionRectangle (bool reset_values=false)
virtual bool isSelectionRectangleVisible ()
virtual SelectionDrawingLines whatIsVisibleOfTheSelectionRectangle ()
virtual void setFocus ()
 PLOT ITEMS : TRACER TEXT ITEMS...
virtual void redrawPlotBackground (QWidget *focusedPlotWidget)
 Redraw the background of the focusedPlotWidget plot widget.
virtual void updateContextXandYAxisRanges ()
virtual const BasePlotContextgetContext () const

Additional Inherited Members

Signals inherited from pappso::BasePlotWidget
void setFocusSignal ()
void lastCursorHoveredPointSignal (const QPointF &pointf)
void plotRangesChangedSignal (const BasePlotContext &context)
void xAxisMeasurementSignal (const BasePlotContext &context, bool with_delta)
void keyPressEventSignal (const BasePlotContext &context)
void keyReleaseEventSignal (const BasePlotContext &context)
void mousePressEventSignal (const BasePlotContext &context)
void mouseReleaseEventSignal (const BasePlotContext &context)
void mouseWheelEventSignal (const BasePlotContext &context)
void plottableSelectionChangedSignal (QCPAbstractPlottable *plottable_p, bool selected)
void integrationRequestedSignal (const BasePlotContext &context)
void plottableDestructionRequestedSignal (BasePlotWidget *base_plot_widget_p, QCPAbstractPlottable *plottable_p, const BasePlotContext &context)
Protected Member Functions inherited from pappso::BasePlotWidget
virtual void createAllAncillaryItems ()
virtual void updateIntegrationScope (bool for_integration=false)
virtual void updateIntegrationScopeRect (bool for_integration=false)
virtual void updateIntegrationScopeHorizontalRhomb (bool for_integration=false)
virtual void updateIntegrationScopeVerticalRhomb (bool for_integration=false)
virtual void updateIntegrationScopeRhomb (bool for_integration=false)
virtual QString allLayerNamesToString () const
virtual QString layerableLayerName (QCPLayerable *layerable_p) const
virtual int layerableLayerIndex (QCPLayerable *layerable_p) const
Protected Attributes inherited from pappso::BasePlotWidget
QString m_name = "NOT_SET"
 Name of the plot widget.
QString m_desc = "NOT_SET"
 Description of the plot widget.
QString m_fileName
 The name of the data file from which the mass data were read.
QString m_axisLabelX
QString m_axisLabelY
BasePlotContext m_context
int m_leftMousePseudoButtonKey = Qt::Key_Less
int m_rightMousePseudoButtonKey = Qt::Key_Greater
QCPItemLine * mp_selectionRectangeLine1 = nullptr
 Rectangle defining the borders of zoomed-in/out data.
QCPItemLine * mp_selectionRectangeLine2 = nullptr
QCPItemLine * mp_selectionRectangeLine3 = nullptr
QCPItemLine * mp_selectionRectangeLine4 = nullptr
QCPItemText * mp_xDeltaTextItem = nullptr
 Text describing the x-axis delta value during a drag operation.
QCPItemText * mp_yDeltaTextItem = nullptr
bool m_shouldTracersBeVisible = true
 Tells if the tracers should be visible.
QCPItemLine * mp_hPosTracerItem = nullptr
 Horizontal position tracer.
QCPItemLine * mp_vPosTracerItem = nullptr
 Vertical position tracer.
QCPItemLine * mp_vStartTracerItem = nullptr
 Vertical selection start tracer (typically in green).
QCPItemLine * mp_vEndTracerItem = nullptr
 Vertical selection end tracer (typically in red).
std::size_t m_lastAxisRangeHistoryIndex = 0
 Index of the last axis range history item.
std::vector< QCPRange * > m_xAxisRangeHistory
 List of x axis ranges occurring during the panning zooming actions.
std::vector< QCPRange * > m_yAxisRangeHistory
 List of y axis ranges occurring during the panning zooming actions.
int m_mouseMoveHandlerSkipAmount = 10
 How many mouse move events must be skipped *‍/.
int m_mouseMoveHandlerSkipCount = 0
 Counter to handle the "fat data" mouse move event handling.
QColor m_unfocusedColor = QColor("lightgray")
 Color used for the background of unfocused plot.
QBrush m_unfocusedBrush = QBrush(m_unfocusedColor)
 Color used for the background of unfocused plot.
QColor m_focusedColor = QColor(Qt::transparent)
 Color used for the background of focused plot.
QBrush m_focusedBrush = QBrush(m_focusedColor)
 Color used for the background of focused plot.
QPen m_pen
 Pen used to draw the graph and textual elements in the plot widget.

Detailed Description

Definition at line 59 of file basetraceplotwidget.h.

Constructor & Destructor Documentation

◆ BaseTracePlotWidget() [1/2]

pappso::BaseTracePlotWidget::BaseTracePlotWidget ( QWidget * parent = 0)
explicit

Definition at line 44 of file basetraceplotwidget.cpp.

44 : BasePlotWidget(parent)
45{
46 // We can afford to call createAllAncillaryItems() in this derived class
47 // because all the items will have been created *before* the addition of plots
48 // and then the rendering order will hide them to the viewer, since the
49 // rendering order is according to the order in which the items have been
50 // created.
51 //
52 // The fact that the ancillary items are created before trace plots is not a
53 // problem because the trace plots are sparse and do not effectively hide the
54 // data.
55 //
56 // But, in the color map plot widgets, we cannot afford to create the
57 // ancillary items *before* the plot itself because then, the rendering of the
58 // plot (created after) would screen off the ancillary items (created before).
59 //
60 // So, the createAllAncillaryItems() function needs to be called in the
61 // derived classes at the most appropriate moment in the setting up of the
62 // widget.
64}
virtual void createAllAncillaryItems()
BasePlotWidget(QWidget *parent)

References pappso::BasePlotWidget::BasePlotWidget(), and pappso::BasePlotWidget::createAllAncillaryItems().

Referenced by pappso::DriftSpecTracePlotWidget::DriftSpecTracePlotWidget(), pappso::MassSpecTracePlotWidget::MassSpecTracePlotWidget(), pappso::MassSpecTracePlotWidget::MassSpecTracePlotWidget(), and pappso::TicXicChromTracePlotWidget::TicXicChromTracePlotWidget().

◆ BaseTracePlotWidget() [2/2]

pappso::BaseTracePlotWidget::BaseTracePlotWidget ( QWidget * parent,
const QString & x_axis_label,
const QString & y_axis_label )
explicit

Definition at line 67 of file basetraceplotwidget.cpp.

70 : BasePlotWidget(parent, x_axis_label, y_axis_label)
71{
72 // We can afford to call createAllAncillaryItems() in this derived class
73 // because all the items will have been created *before* the addition of plots
74 // and then the rendering order will hide them to the viewer, since the
75 // rendering order is according to the order in which the items have been
76 // created.
77 //
78 // The fact that the ancillary items are created before trace plots is not a
79 // problem because the trace plots are sparse and do not effectively hide the
80 // data.
81 //
82 // But, in the color map plot widgets, we cannot afford to create the
83 // ancillary items *before* the plot itself because then, the rendering of the
84 // plot (created after) would screen off the ancillary items (created before).
85 //
86 // So, the createAllAncillaryItems() function needs to be called in the
87 // derived classes at the most appropriate moment in the setting up of the
88 // widget.
90}

References pappso::BasePlotWidget::BasePlotWidget(), and pappso::BasePlotWidget::createAllAncillaryItems().

◆ ~BaseTracePlotWidget()

pappso::BaseTracePlotWidget::~BaseTracePlotWidget ( )
virtual

Destruct this BaseTracePlotWidget instance.

The destruction involves clearing the history, deleting all the axis range history items for x and y axes.

Definition at line 100 of file basetraceplotwidget.cpp.

101{
102}

Member Function Documentation

◆ addTrace()

QCPGraph * pappso::BaseTracePlotWidget::addTrace ( const pappso::Trace & trace,
const QColor & color )
virtual

Definition at line 183 of file basetraceplotwidget.cpp.

184{
185 // qDebug();
186
187 if(!color.isValid())
188 throw PappsoException(QString("The color to be used for the plot graph is invalid."));
189
190 // This seems to be unpleasant.
191 // setFocus();
192
193 QCPGraph *graph_p = addGraph();
194
195 graph_p->setLayer("plotsLayer");
196
197 // Now depracated as of 20200924
198 // graph_p->setData(QVector<double>::fromStdVector(trace.xValues()),
199 // QVector<double>::fromStdVector(trace.yValues()));
200
201 QVector<double> key_qvector;
202 QVector<double> value_qvector;
203
204#if 0
205 // Now replace the graph's data. Note that the data are
206 // inherently sorted (true below).
207
208 // The begin() -- end() ranges constructor did not work as of
209 // Qt 5.14.2 this day: 20200721
210
211 key_qvector =
212 QVector(trace.xValues().begin(),
213 .trace.xValues()end());
214 value_qvector =
215 QVector(trace.yValues().begin(),
216 trace.yValues().end());
217#endif
218
219 for(auto &value : trace.xValues())
220 {
221 key_qvector.push_back(value);
222 }
223
224 for(auto &value : trace.yValues())
225 {
226 value_qvector.push_back(value);
227 }
228
229#if 0
230
231 qDebug() << "The size of the x values for trace is:" << key_qvector.size()
232 << "and for y values is:" << value_qvector.size();
233
234 QString text;
235
236 for(qsizetype iter = 0; iter < key_qvector.size(); ++iter)
237 text += QString("(%1,%2)\n")
238 .arg(key_qvector.at(iter), 0, 'f', 6)
239 .arg(value_qvector.at(iter), 0, 'f', 6);
240
241 qDebug().noquote() << text;
242
243#endif
244
245
246 graph_p->setData(key_qvector, value_qvector, true);
247
248 QPen pen = graph()->pen();
249 pen.setColor(color);
250 graph()->setPen(pen);
251
252 // Connect the signal of selection change so that we can re-emit it for the
253 // widget that is using *this widget.
254
255 connect(
256 graph_p,
257 static_cast<void (QCPAbstractPlottable::*)(bool)>(&QCPAbstractPlottable::selectionChanged),
258 [this, graph_p]() { emit plottableSelectionChangedSignal(graph_p, graph_p->selected()); });
259
260 // Rescaling the axes is actually unpleasant if there are more than one
261 // graph in the plot widget and that we are adding one. So only, rescale if
262 // the number of graphs is == 1, that is we are adding the first one.
263
264 if(graphCount() == 1)
265 {
266 rescaleAxes();
268 }
269
270 replot();
271
272 return graph_p;
273}
virtual void resetAxesRangeHistory()
void plottableSelectionChangedSignal(QCPAbstractPlottable *plottable_p, bool selected)
std::vector< pappso_double > xValues() const
Definition trace.cpp:663
std::vector< pappso_double > yValues() const
Definition trace.cpp:677

References pappso::BasePlotWidget::plottableSelectionChangedSignal(), pappso::BasePlotWidget::resetAxesRangeHistory(), pappso::Trace::xValues(), and pappso::Trace::yValues().

◆ axisDoubleClickHandler()

void pappso::BaseTracePlotWidget::axisDoubleClickHandler ( QCPAxis * axis,
QCPAxis::SelectablePart part,
QMouseEvent * event )
overridevirtual

Reimplemented from pappso::BasePlotWidget.

Definition at line 516 of file basetraceplotwidget.cpp.

519{
520 // qDebug();
521
522 m_context.m_keyboardModifiers = QGuiApplication::queryKeyboardModifiers();
523
524 if(m_context.m_keyboardModifiers & Qt::ControlModifier)
525 {
526 // qDebug();
527
528 // If the Ctrl modifiers is active, then both axes are to be reset. Also
529 // the histories are reset also.
530
531 rescaleAxes();
533 }
534 else
535 {
536 // qDebug();
537
538 // Only the axis passed as parameter is to be rescaled.
539 // Reset the range of that axis to the max view possible, but for the y
540 // axis check if the Shift keyboard key is pressed. If so the full scale
541 // should be calculated only on the data in the current x range.
542
543 if(axis->orientation() == Qt::Vertical)
544 {
545 if(m_context.m_keyboardModifiers & Qt::ShiftModifier)
546 {
547
548 // In this case, we want to make a rescale of the Y axis such
549 // that it displays full scale the data in the current X axis
550 // range only.
551
552 bool ok = false;
553
554 QCPRange value_range = getValueRangeOnKeyRange(nullptr, ok);
555
556 yAxis->setRange(value_range);
557 }
558 else
559 axis->rescale();
560 }
561 else
562 axis->rescale();
563
565
566 event->accept();
567 }
568
569 // The double-click event does not cancel the mouse press event. That is, if
570 // left-double-clicking, at the end of the operation the button still
571 // "pressed". We need to remove manually the button from the pressed buttons
572 // context member.
573
574 m_context.m_pressedMouseButtons ^= event->button();
575
577
579
580 replot();
581}
virtual void updateAxesRangeHistory()
Create new axis range history items and append them to the history.
virtual void updateContextXandYAxisRanges()
void plotRangesChangedSignal(const BasePlotContext &context)
BasePlotContext m_context
QCPRange getValueRangeOnKeyRange(QCPAbstractPlottable *plottable_p, bool &ok)

References getValueRangeOnKeyRange(), pappso::BasePlotWidget::m_context, pappso::BasePlotWidget::plotRangesChangedSignal(), pappso::BasePlotWidget::resetAxesRangeHistory(), pappso::BasePlotWidget::updateAxesRangeHistory(), and pappso::BasePlotWidget::updateContextXandYAxisRanges().

◆ axisPan()

void pappso::BaseTracePlotWidget::axisPan ( )
overridevirtual

Reimplemented from pappso::BasePlotWidget.

Definition at line 782 of file basetraceplotwidget.cpp.

783{
784 // qDebug();
785
786 // Sanity check
787 if(!m_context.m_wasClickOnXAxis && !m_context.m_wasClickOnYAxis)
788 qFatal(
789 "This function can only be called if the mouse click was on one of the "
790 "axes");
791
792 if(m_context.m_wasClickOnXAxis)
793 {
794 xAxis->setRange(m_context.m_xRange.lower - m_context.m_xDelta,
795 m_context.m_xRange.upper - m_context.m_xDelta);
796
797 // If the shift modifier key is pressed, then the user want the y axis
798 // to be full scale.
799 if(m_context.m_keyboardModifiers & Qt::ShiftModifier)
800 {
801
802 bool ok = false;
803
804 QCPRange value_range = getValueRangeOnKeyRange(nullptr, ok);
805
806 yAxis->setRange(value_range);
807 }
808 // else nothing to do we do not change the y axis scale.
809 }
810
811 if(m_context.m_wasClickOnYAxis)
812 {
813 yAxis->setRange(m_context.m_yRange.lower - m_context.m_yDelta,
814 m_context.m_yRange.upper - m_context.m_yDelta);
815 }
816
818
819 // qDebug() << "The updated context:" << m_context.toString();
820
821 // We cannot store the new ranges in the history, because the pan operation
822 // involved a huge quantity of micro-movements elicited upon each mouse move
823 // cursor event so we would have a huge history.
824 // updateAxesRangeHistory();
825
826 // Now that the contex has the right range values, we can emit the
827 // signal that will be used by this plot widget users, typically to
828 // abide by the x/y range lock required by the user.
829
831
832 replot();
833}

References getValueRangeOnKeyRange(), pappso::BasePlotWidget::m_context, pappso::BasePlotWidget::plotRangesChangedSignal(), and pappso::BasePlotWidget::updateContextXandYAxisRanges().

◆ axisReframe()

void pappso::BaseTracePlotWidget::axisReframe ( )
overridevirtual

Reimplemented from pappso::BasePlotWidget.

Definition at line 703 of file basetraceplotwidget.cpp.

704{
705 // qDebug();
706
707 // double sorted_start_drag_point_x =
708 // std::min(m_context.m_startDragPoint.x(), m_context.m_currentDragPoint.x());
709
710 // xAxis->setRange(sorted_start_drag_point_x,
711 // sorted_start_drag_point_x + fabs(m_context.m_xDelta));
712
713 xAxis->setRange(QCPRange(m_context.m_xRegionRangeStart, m_context.m_xRegionRangeEnd));
714
715 // Note that the y axis should be rescaled from current lower value to new
716 // upper value matching the y-axis position of the cursor when the mouse
717 // button was released.
718
719 yAxis->setRange(xAxis->range().lower,
720 std::max<double>(m_context.m_yRegionRangeStart, m_context.m_yRegionRangeEnd));
721
722 // qDebug() << "xaxis:" << xAxis->range().lower << "-" <<
723 // xAxis->range().upper
724 //<< "yaxis:" << yAxis->range().lower << "-" << yAxis->range().upper;
725
726 // If the shift modifier key is pressed, then the user want the y axis
727 // to be full scale.
728 if(m_context.m_keyboardModifiers & Qt::ShiftModifier)
729 {
730
731 bool ok = false;
732
733 QCPRange value_range = getValueRangeOnKeyRange(nullptr, ok);
734
735 yAxis->setRange(value_range);
736 }
737 // else do nothing, let the y axis range as is.
738
740
743
744 replot();
745}

References getValueRangeOnKeyRange(), pappso::BasePlotWidget::m_context, pappso::BasePlotWidget::plotRangesChangedSignal(), pappso::BasePlotWidget::updateAxesRangeHistory(), and pappso::BasePlotWidget::updateContextXandYAxisRanges().

◆ axisRescale()

void pappso::BaseTracePlotWidget::axisRescale ( )
overridevirtual

RANGE-related functions.

PLOTTING / REPLOTTING functions

Reimplemented from pappso::BasePlotWidget.

Definition at line 585 of file basetraceplotwidget.cpp.

586{
587 double xLower = xAxis->range().lower;
588 double xUpper = xAxis->range().upper;
589
590 // Get the current y lower/upper range.
591 double yLower = yAxis->range().lower;
592 double yUpper = yAxis->range().upper;
593
594 // This function is called only when the user has clicked on the x/y axis or
595 // when the user has dragged the left mouse button with the Ctrl key
596 // modifier. The m_context.m_wasClickOnXAxis is then simulated in the mouse
597 // move handler. So we need to test which axis was clicked-on.
598
599 if(m_context.m_wasClickOnXAxis)
600 {
601
602 // We are changing the range of the X axis.
603
604 // What is the x delta ?
605 double xDelta = m_context.m_currentDragPoint.x() - m_context.m_startDragPoint.x();
606
607 // If xDelta is < 0, the we were dragging from right to left, we are
608 // compressing the view on the x axis, by adding new data to the right
609 // hand size of the graph. So we add xDelta to the upper bound of the
610 // range. Otherwise we are uncompressing the view on the x axis and
611 // remove the xDelta from the upper bound of the range. This is why we
612 // have the
613 // '-'
614 // and not '+' below;
615
616 // qDebug() << "Setting xaxis:" << xLower << "--" << xUpper - xDelta;
617
618 xAxis->setRange(xLower, xUpper - xDelta);
619
620
621 // Old version
622 // if(xDelta < 0)
623 //{
624 //// The dragging operation was from right to left, we are enlarging
625 //// the range (thus, we are unzooming the view, since the widget
626 //// always has the same size).
627
628 // xAxis->setRange(xLower, xUpper + fabs(xDelta));
629 //}
630 // else
631 //{
632 //// The dragging operation was from left to right, we are reducing
633 //// the range (thus, we are zooming the view, since the widget
634 //// always has the same size).
635
636 // xAxis->setRange(xLower, xUpper - fabs(xDelta));
637 //}
638
639 // We may either leave the scale of the Y axis as is (default) or
640 // the user may want an automatic scale of the Y axis such that the
641 // data displayed in the new X axis range are full scale on the Y
642 // axis. For this, the Shift modifier key should be pressed.
643
644 if(m_context.m_keyboardModifiers & Qt::ShiftModifier)
645 {
646
647 // In this case, we want to make a rescale of the Y axis such that
648 // it displays full scale the data in the current X axis range only.
649
650 bool ok = false;
651
652 QCPRange value_range = getValueRangeOnKeyRange(nullptr, ok);
653
654 yAxis->setRange(value_range);
655 }
656 // else, do leave the Y axis range unchanged.
657 }
658 // End of
659 // if(m_context.m_wasClickOnXAxis)
660 else // that is, if(m_context.m_wasClickOnYAxis)
661 {
662 // We are changing the range of the Y axis.
663
664 // What is the y delta ?
665 double yDelta = m_context.m_currentDragPoint.y() - m_context.m_startDragPoint.y();
666
667 // See above for an explanation of the computation.
668
669 yAxis->setRange(yLower, yUpper - yDelta);
670
671 // Old version
672 // if(yDelta < 0)
673 //{
674 //// The dragging operation was from top to bottom, we are enlarging
675 //// the range (thus, we are unzooming the view, since the widget
676 //// always has the same size).
677
678 // yAxis->setRange(yLower, yUpper + fabs(yDelta));
679 //}
680 // else
681 //{
682 //// The dragging operation was from bottom to top, we are reducing
683 //// the range (thus, we are zooming the view, since the widget
684 //// always has the same size).
685
686 // yAxis->setRange(yLower, yUpper - fabs(yDelta));
687 //}
688 }
689 // End of
690 // else // that is, if(m_context.m_wasClickOnYAxis)
691
692 // Update the context with the current axes ranges
693
695
697
698 replot();
699}

References getValueRangeOnKeyRange(), pappso::BasePlotWidget::m_context, pappso::BasePlotWidget::plotRangesChangedSignal(), and pappso::BasePlotWidget::updateContextXandYAxisRanges().

◆ axisZoom()

void pappso::BaseTracePlotWidget::axisZoom ( )
overridevirtual

Reimplemented from pappso::BasePlotWidget.

Definition at line 749 of file basetraceplotwidget.cpp.

750{
751
752 // Use the m_context.m_xRegionRangeStart/End values, but we need to sort the
753 // values before using them, because now we want to really have the lower x
754 // value. Simply craft a QCPRange that will swap the values if lower is not
755 // < than upper QCustomPlot calls this normalization).
756
757 xAxis->setRange(QCPRange(m_context.m_xRegionRangeStart, m_context.m_xRegionRangeEnd));
758
759 // If the shift modifier key is pressed, then the user want the y axis
760 // to be full scale.
761 if(m_context.m_keyboardModifiers & Qt::ShiftModifier)
762 {
763
764 bool ok = false;
765
766 QCPRange value_range = getValueRangeOnKeyRange(nullptr, ok);
767
768 yAxis->setRange(value_range);
769 }
770 else
771 yAxis->setRange(QCPRange(m_context.m_yRegionRangeStart, m_context.m_yRegionRangeEnd));
772
774
777
778 replot();
779}

References getValueRangeOnKeyRange(), pappso::BasePlotWidget::m_context, pappso::BasePlotWidget::plotRangesChangedSignal(), pappso::BasePlotWidget::updateAxesRangeHistory(), and pappso::BasePlotWidget::updateContextXandYAxisRanges().

◆ clearGraphData()

void pappso::BaseTracePlotWidget::clearGraphData ( int graph_index)
virtual

Definition at line 167 of file basetraceplotwidget.cpp.

168{
169 QCPGraph *graph_p = graph(graph_index);
170
171 if(graph_p == nullptr)
172 qFatal("Programming error.");
173
174 graph_p->data().clear();
175
176 rescaleAxes();
178 replot();
179}

References pappso::BasePlotWidget::resetAxesRangeHistory().

◆ findIntegrationLowerRangeForKey()

bool pappso::BaseTracePlotWidget::findIntegrationLowerRangeForKey ( int index,
double key,
QCPRange & range )
virtual

Find a minimal integration range starting at an existing data point.

If the user clicks onto a plot at a location that is not a true data point, get a data range that begins at the preceding data point and that ends at the clicked location point.

Definition at line 285 of file basetraceplotwidget.cpp.

286{
287
288 // Given a key double value, we want to know what is the range that will
289 // frame correctly the key double value if that key value is not exactly
290 // the one of a point of the trace.
291
292 // First of all get the keys of the graph.
293
294 QCPGraph *theGraph = graph(index);
295
296 if(theGraph == nullptr)
297 throw ExceptionNotPossible(
298 "basetraceplotwidget.cpp @ indIntegrationLowerRangeForKey() -- ERROR "
299 "theGraph cannot be nullptr.");
300
301 // QCPGraphDataContainer is a typedef QCPDataContainer<QCPGraphData> and
302 // QCPDataContainer< DataType > is a Class Template. So in this context,
303 // DataType is QCPGraphData.
304 // QCPGraphData is the data point, that is the (key,value) pair.
305 QSharedPointer<QCPGraphDataContainer> graph_data_container_p = theGraph->data();
306
307 QCPDataRange dataRange = graph_data_container_p->dataRange();
308
309 if(!dataRange.isValid())
310 return false;
311
312 if(!dataRange.size())
313 return false;
314
315 if(dataRange.size() > 1)
316 {
317 double firstKey = graph_data_container_p->at(dataRange.begin())->key;
318 double lastKey = graph_data_container_p->at(dataRange.end())->key;
319
320 // There is one check to be done: the user might erroneously set the mouse
321 // cursor beyond the last point of the graph. If that is the case, then
322 // upper key needs to be that very point. All we need to do is return the
323 // lower key, that is the pre-last key of the keys list. No need to
324 // iterate in the keys list.
325
326 if(key > lastKey)
327 {
328 // No need to search for the key in the keys, just get the lower key
329 // immediately, that is, the key that is one slot left the last key.
330 range.lower = graph_data_container_p->at(dataRange.end() - 2)->key;
331 range.upper = graph_data_container_p->at(dataRange.end() - 1)->key;
332
333 return true;
334 }
335
336 // Likewise, if the cursor is set left of the first plot point, then that
337 // will be the lower range point. All we need is to provide the upper
338 // range point as the second point of the plot.
339
340 if(key < firstKey)
341 {
342 range.lower = firstKey;
343 range.upper = graph_data_container_p->at(dataRange.begin() + 1)->key;
344
345 return true;
346 }
347
348 // Finally the generic case where the user point to any point *in* the
349 // graph.
350
351 range.lower = graph_data_container_p->findBegin(key, /*expandedRange*/ true)->key;
352 range.upper = std::prev(graph_data_container_p->findEnd(key, /*expandedRange*/ true))->key;
353
354 return true;
355 }
356
357 return false;
358}

◆ getValueRangeOnKeyRange() [1/2]

QCPRange pappso::BaseTracePlotWidget::getValueRangeOnKeyRange ( int index,
bool & ok )

Definition at line 463 of file basetraceplotwidget.cpp.

464{
465
466 // The X axis range is set. But we want to find for that X axis range the
467 // min and max Y values. This function is useful when the user asks that
468 // while changing the X axis range, the trace be always in full scale on the
469 // Y axis.
470
471 QCPAbstractPlottable *plottable_p = plottable(index);
472
473 if(plottable_p == nullptr)
474 qFatal("Programming error.");
475
476 return getValueRangeOnKeyRange(plottable_p, ok);
477}

References getValueRangeOnKeyRange().

◆ getValueRangeOnKeyRange() [2/2]

QCPRange pappso::BaseTracePlotWidget::getValueRangeOnKeyRange ( QCPAbstractPlottable * plottable_p,
bool & ok )

Definition at line 408 of file basetraceplotwidget.cpp.

409{
410
411 // The X axis range is set. But we want to find for that X axis range the
412 // min and max Y values. This function is useful when the user asks that
413 // while changing the X axis range, the trace be always in full scale on the
414 // Y axis.
415
416 QCPRange key_range(xAxis->range().lower, xAxis->range().upper);
417
418 if(plottable_p != nullptr)
419 {
420
421 return plottable_p->getValueRange(ok, QCP::SignDomain::sdBoth, key_range);
422 }
423 else
424 {
425
426 // How many graphs are currently plotted in this plot widget ?
427 int graph_count = graphCount();
428
429 // Iterate in each graph and get the y max value. Then compare with the
430 // largest one and update if necessary. Store the pointer to the graph
431 // that has a larger y value. At the end of the iteration, it will be
432 // the winner.
433
434 double temp_min_value = std::numeric_limits<double>::max();
435 double temp_max_value = std::numeric_limits<double>::min();
436
437 bool found_range = false;
438
439 for(int iter = 0; iter < graph_count; ++iter)
440 {
441 QCPGraph *plottable_p = graph(iter);
442
443 QCPRange value_range = plottable_p->getValueRange(ok, QCP::SignDomain::sdBoth, key_range);
444
445 if(ok)
446 found_range = true;
447
448 if(value_range.lower < temp_min_value)
449 temp_min_value = value_range.lower;
450 if(value_range.upper > temp_max_value)
451 temp_max_value = value_range.upper;
452 }
453
454 // At this point return the range.
455
456 ok = found_range;
457 return QCPRange(temp_min_value, temp_max_value);
458 }
459}

Referenced by axisDoubleClickHandler(), axisPan(), axisReframe(), axisRescale(), axisZoom(), and getValueRangeOnKeyRange().

◆ getValuesX()

std::vector< double > pappso::BaseTracePlotWidget::getValuesX ( int index) const

Definition at line 362 of file basetraceplotwidget.cpp.

363{
364 std::vector<double> keys;
365
366 QCPGraph *graph_p = graph(graph_index);
367
368 if(graph_p == nullptr)
369 qFatal("Programming error.");
370
371 QSharedPointer<QCPGraphDataContainer> graph_data_container_p = graph_p->data();
372
373 // Iterate in the keys
374 auto beginIt = graph_data_container_p->begin();
375 auto endIt = graph_data_container_p->end();
376
377 for(auto iter = beginIt; iter != endIt; ++iter)
378 keys.push_back(iter->key);
379
380 return keys;
381}

◆ getValuesY()

std::vector< double > pappso::BaseTracePlotWidget::getValuesY ( int index) const

Definition at line 385 of file basetraceplotwidget.cpp.

386{
387 std::vector<double> values;
388
389 QCPGraph *graph_p = graph(graph_index);
390
391 if(graph_p == nullptr)
392 qFatal("Programming error.");
393
394 QSharedPointer<QCPGraphDataContainer> graph_data_container_p = graph_p->data();
395
396 // Iterate in the values
397 auto beginIt = graph_data_container_p->begin();
398 auto endIt = graph_data_container_p->end();
399
400 for(auto iter = beginIt; iter != endIt; ++iter)
401 values.push_back(iter->key);
402
403 return values;
404}

◆ getYatX() [1/2]

double pappso::BaseTracePlotWidget::getYatX ( double x,
int index = 0 )

Definition at line 504 of file basetraceplotwidget.cpp.

505{
506 QCPGraph *graph_p = graph(index);
507
508 if(graph_p == nullptr)
509 qFatal("Programming error.");
510
511 return getYatX(x, graph_p);
512}
double getYatX(double x, QCPGraph *graph_p)

References getYatX(), and pappso::x.

◆ getYatX() [2/2]

double pappso::BaseTracePlotWidget::getYatX ( double x,
QCPGraph * graph_p )

Definition at line 481 of file basetraceplotwidget.cpp.

482{
483 if(graph_p == nullptr)
484 qFatal("Programming error.");
485
486 QCPItemTracer *tracer_p = new QCPItemTracer(this);
487 tracer_p->setGraph(graph_p);
488 tracer_p->setInterpolating(true);
489 tracer_p->setGraphKey(x);
490 tracer_p->updatePosition();
491
492 double value = tracer_p->position->value();
493
494 tracer_p->setGraph(nullptr);
495
496 // Essential to do this because otherwise crash when closing the app.
497 removeItem(tracer_p);
498
499 return value;
500}

References pappso::x.

Referenced by getYatX().

◆ setGraphData() [1/2]

void pappso::BaseTracePlotWidget::setGraphData ( int graph_index,
const std::vector< double > & keys,
const std::vector< double > & values )
virtual

Definition at line 106 of file basetraceplotwidget.cpp.

109{
110 QCPGraph *graph_p = graph(graph_index);
111
112 if(graph_p == nullptr)
113 qFatal("Programming error.");
114
115 return setGraphData(graph_p, keys, values);
116}
virtual void setGraphData(int graph_index, const std::vector< double > &keys, const std::vector< double > &values)

References setGraphData().

Referenced by setGraphData().

◆ setGraphData() [2/2]

void pappso::BaseTracePlotWidget::setGraphData ( QCPGraph * graph_p,
const std::vector< double > & keys,
const std::vector< double > & values )
virtual

Definition at line 120 of file basetraceplotwidget.cpp.

123{
124 if(graph_p == nullptr)
125 qFatal("Pointer cannot be nullptr.");
126
127 // Version that is now deprecated (20200924)
128 // graph_p->setData(QVector<double>::fromStdVector(keys),
129 // QVector<double>::fromStdVector(values));
130
131 QVector<double> key_qvector;
132 QVector<double> value_qvector;
133
134
135#if 0
136 // Now replace the graph's data. Note that the data are
137 // inherently sorted (true below).
138
139 // The begin() -- end() ranges constructor did not work as of
140 // Qt 5.14.2 this day: 20200721
141
142 key_qvector =
143 QVector(keys.begin(),
144 keys.end());
145 value_qvector =
146 QVector(values.begin(),
147 values.end());
148#endif
149
150 for(auto &value : keys)
151 key_qvector.push_back(value);
152
153 for(auto &value : values)
154 value_qvector.push_back(value);
155
156 graph_p->setData(key_qvector, value_qvector, true);
157
158 graph_p->setPen(m_pen);
159
160 rescaleAxes();
162 replot();
163}
QPen m_pen
Pen used to draw the graph and textual elements in the plot widget.

References pappso::BasePlotWidget::m_pen, and pappso::BasePlotWidget::resetAxesRangeHistory().

◆ toTrace() [1/4]

pappso::Trace pappso::BaseTracePlotWidget::toTrace ( const QCPGraph * graph_p) const

Definition at line 846 of file basetraceplotwidget.cpp.

847{
848 if(graph_p == nullptr)
849 qFatal("Programming error. Pointer cannot be nullptr.");
850
851 pappso::Trace trace;
852
853 QSharedPointer<QCPGraphDataContainer> graph_data_container_p = graph_p->data();
854
855 // Iterate in the keys
856 auto beginIt = graph_data_container_p->begin();
857 auto endIt = graph_data_container_p->end();
858
859 for(auto iter = beginIt; iter != endIt; ++iter)
860 trace.push_back(pappso::DataPoint(iter->key, iter->value));
861
862 return trace;
863}

◆ toTrace() [2/4]

pappso::Trace pappso::BaseTracePlotWidget::toTrace ( const QCPRange & x_axis_range,
const QCPGraph * graph_p ) const

Definition at line 879 of file basetraceplotwidget.cpp.

880{
881
882 // Make a Trace with the data in the range.
883 Trace data_trace;
884
885 QSharedPointer<QCPGraphDataContainer> graph_data_container_sp;
886
887 graph_data_container_sp = graph_p->data();
888
889 // Grab the iterator to the start to the x axis range
890 auto beginIt = graph_data_container_sp->findBegin(x_axis_range.lower,
891 /*expandedRange*/ true);
892 // Grab the iterator to the end of the axis range
893 auto endIt = graph_data_container_sp->findEnd(x_axis_range.upper,
894 /*expandedRange*/ true);
895
896 for(auto iter = beginIt; iter != endIt; ++iter)
897 data_trace.push_back(DataPoint(iter->key, iter->value));
898
899 return data_trace;
900}

◆ toTrace() [3/4]

pappso::Trace pappso::BaseTracePlotWidget::toTrace ( const QCPRange & x_axis_range,
int index ) const

Definition at line 867 of file basetraceplotwidget.cpp.

868{
869 QCPGraph *graph_p = graph(index);
870
871 if(graph_p == nullptr)
872 qFatal("Programming error.");
873
874 return toTrace(x_axis_range, graph_p);
875}
pappso::Trace toTrace(int index) const

References toTrace().

◆ toTrace() [4/4]

pappso::Trace pappso::BaseTracePlotWidget::toTrace ( int index) const

Definition at line 837 of file basetraceplotwidget.cpp.

838{
839 QCPGraph *graph_p = graph(index);
840
841 return toTrace(graph_p);
842}

References toTrace().

Referenced by toTrace(), and toTrace().


The documentation for this class was generated from the following files: