36 #include "../../pappsoexception.h"
49 QString text(
"Context:");
51 text += QString(
"data kind: %1").arg(static_cast<int>(
dataKind));
53 text += QString(
" isMouseDragging: %1 -- wasMouseDragging: %2")
57 text += QString(
" -- startDragPoint : (%1, %2)")
61 text += QString(
" -- currentDragPoint : (%1, %2)")
65 text += QString(
" -- lastCursorHoveredPoint : (%1, %2)")
69 text += QString(
" -- xRange: (%1, %2)").arg(
xRange.lower).arg(
xRange.upper);
71 text += QString(
" -- yRange: (%1, %2)").arg(
yRange.lower).arg(
yRange.upper);
74 QString(
" -- wasClickOnXAxis: %1").arg(
wasClickOnXAxis ?
"true" :
"false");
76 QString(
" -- wasClickOnYAxis: %1").arg(
wasClickOnYAxis ?
"true" :
"false");
77 text += QString(
" -- isMeasuringDistance: %1")
80 text += QString(
" -- xRegionRangeStart: %1 -- xRegionRangeEnd: %2")
84 text += QString(
" -- yRegionRangeStart: %1 -- yRegionRangeEnd: %2")
88 text += QString(
" -- xDelta: %1 -- yDelta: %2").arg(
xDelta).arg(
yDelta);
104 text += QString(
" -- mouseButtonsAtMouseRelease: %1")
115 if(parent ==
nullptr)
116 qFatal(
"Programming error.");
119 m_pen.setStyle(Qt::SolidLine);
120 m_pen.setBrush(Qt::black);
124 qFatal(
"Programming error.");
131 const QString &x_axis_label,
132 const QString &y_axis_label)
133 : QCustomPlot(parent), m_axisLabelX(x_axis_label), m_axisLabelY(y_axis_label)
137 if(parent ==
nullptr)
138 qFatal(
"Programming error.");
141 m_pen.setStyle(Qt::SolidLine);
142 m_pen.setBrush(Qt::black);
145 xAxis->setLabel(x_axis_label);
146 yAxis->setLabel(y_axis_label);
149 qFatal(
"Programming error.");
182 setFocusPolicy(Qt::StrongFocus);
183 setInteractions(QCP::iRangeZoom | QCP::iSelectPlottables | QCP::iMultiSelect);
197 pen.setColor(QColor(
"black"));
219 pen.setColor(QColor(
"green"));
229 pen.setColor(QColor(
"red"));
262 &QCustomPlot::mousePress,
267 &QCustomPlot::mouseRelease,
272 &QCustomPlot::axisDoubleClick,
296 const QColor &new_color)
298 if(plottable_p ==
nullptr)
299 qFatal(
"Pointer cannot be nullptr.");
304 pen = plottable_p->pen();
305 pen.setColor(new_color);
306 plottable_p->setPen(pen);
315 if(!new_color.isValid())
318 QCPGraph *graph_p = graph(index);
320 if(graph_p ==
nullptr)
321 qFatal(
"Programming error.");
330 if(plottable_p ==
nullptr)
331 qFatal(
"Programming error.");
333 return plottable_p->pen().color();
340 QCPGraph *graph_p = graph(index);
342 if(graph_p ==
nullptr)
343 qFatal(
"Programming error.");
352 xAxis->setLabel(label);
359 yAxis->setLabel(label);
499 if(event->key() == Qt::Key_Left ||
event->key() == Qt::Key_Right ||
500 event->key() == Qt::Key_Up ||
event->key() == Qt::Key_Down)
529 if(event->key() == Qt::Key_Backspace)
536 else if(event->key() == Qt::Key_Space)
540 else if(event->key() == Qt::Key_Delete)
553 int graph_count = plottableCount();
576 QList<QCPGraph *> selected_graph_list;
578 selected_graph_list = selectedGraphs();
580 if(!selected_graph_list.size())
589 for(
int iter = 0; iter < selected_graph_list.size(); ++iter)
596 this, selected_graph_list.at(iter),
m_context);
609 else if(event->key() == Qt::Key_T)
621 else if(event->key() == Qt::Key_Left ||
event->key() == Qt::Key_Right ||
622 event->key() == Qt::Key_Up ||
event->key() == Qt::Key_Down)
665 int pixel_increment = 0;
670 pixel_increment = 50;
676 if(event->key() == Qt::Key_Left)
678 else if(event->key() == Qt::Key_Right)
680 else if(event->key() == Qt::Key_Up)
682 else if(event->key() == Qt::Key_Down)
708 QPointF pixel_coordinates(
712 Qt::MouseButton button = Qt::NoButton;
713 QEvent::Type q_event_type = QEvent::MouseButtonPress;
719 button = Qt::LeftButton;
725 q_event_type = QEvent::MouseButtonPress;
727 q_event_type = QEvent::MouseButtonRelease;
733 button = Qt::RightButton;
739 q_event_type = QEvent::MouseButtonPress;
741 q_event_type = QEvent::MouseButtonRelease;
749 QMouseEvent *mouse_event_p =
750 new QMouseEvent(q_event_type,
752 mapToGlobal(pixel_coordinates.toPoint()),
753 mapToGlobal(pixel_coordinates.toPoint()),
757 Qt::MouseEventSynthesizedByApplication);
759 if(q_event_type == QEvent::MouseButtonPress)
777 QPointF mousePoint =
event->localPos();
868 yAxis->range().upper);
870 yAxis->range().lower);
935 yAxis->range().upper);
937 yAxis->range().lower);
1058 double x_delta_pixel =
1062 if(x_delta_pixel > 3)
1083 QPointF mousePoint =
event->localPos();
1141 yAxis->range().upper);
1143 yAxis->range().lower);
1177 yAxis->range().upper);
1180 yAxis->range().lower);
1344 QCPAxis::SelectablePart part,
1389 QCPLayoutElement *layoutElement = layoutElementAt(mousePoint);
1392 layoutElement == dynamic_cast<QCPLayoutElement *>(axisRect()))
1399 QCPAxis::SelectablePart selectablePart;
1401 selectablePart = xAxis->getPartAt(mousePoint);
1403 if(selectablePart == QCPAxis::spAxisLabel ||
1404 selectablePart == QCPAxis::spAxis ||
1405 selectablePart == QCPAxis::spTickLabels)
1416 QCPLayoutElement *layoutElement = layoutElementAt(mousePoint);
1419 layoutElement == dynamic_cast<QCPLayoutElement *>(axisRect()))
1426 QCPAxis::SelectablePart selectablePart;
1428 selectablePart = yAxis->getPartAt(mousePoint);
1430 if(selectablePart == QCPAxis::spAxisLabel ||
1431 selectablePart == QCPAxis::spAxis ||
1432 selectablePart == QCPAxis::spTickLabels)
1457 double x_delta_pixel =
1461 double y_delta_pixel =
1465 if(x_delta_pixel > y_delta_pixel)
1466 return Qt::Horizontal;
1468 return Qt::Vertical;
1477 QPointF pixels_coordinates(xAxis->coordToPixel(graph_coordinates.x()),
1478 yAxis->coordToPixel(graph_coordinates.y()));
1488 QCursor::setPos(mapToGlobal(pixel_coordinates.toPoint()));
1497 QPointF pixel_coord(xAxis->coordToPixel(graph_coord.x()),
1498 yAxis->coordToPixel(graph_coord.y()));
1511 QPointF pixel_coordinates(
1517 QPointF graph_coordinates(xAxis->pixelToCoord(pixel_coordinates.x()),
1518 yAxis->pixelToCoord(pixel_coordinates.y()));
1520 return graph_coordinates;
1530 QPointF pixel_coord(xAxis->coordToPixel(graph_coord.x()),
1531 yAxis->coordToPixel(graph_coord.y()));
1544 QPointF pixel_coordinates(
1550 QPointF graph_coordinates(xAxis->pixelToCoord(pixel_coordinates.x()),
1551 yAxis->pixelToCoord(pixel_coordinates.y()));
1553 return graph_coordinates;
1564 QCPGraph *graph_p = graph(index);
1566 if(graph_p ==
nullptr)
1567 qFatal(
"Programming error.");
1569 return graph_p->getKeyRange(found_range);
1576 QCPGraph *graph_p = graph(index);
1578 if(graph_p ==
nullptr)
1579 qFatal(
"Programming error.");
1581 return graph_p->getValueRange(found_range);
1588 bool &found_range)
const
1597 found_range =
false;
1599 return QCPRange(0, 1);
1602 if(graphCount() == 1)
1603 return graph()->getKeyRange(found_range);
1605 bool found_at_least_one_range =
false;
1608 QCPRange result_range(QCPRange::minRange + 1, QCPRange::maxRange + 1);
1610 for(
int iter = 0; iter < graphCount(); ++iter)
1612 QCPRange temp_range;
1614 bool found_range_for_iter =
false;
1616 QCPGraph *graph_p = graph(iter);
1621 temp_range = graph_p->getKeyRange(found_range_for_iter);
1623 temp_range = graph_p->getValueRange(found_range_for_iter);
1625 qFatal(
"Cannot reach this point. Programming error.");
1630 if(!found_range_for_iter)
1636 if(!QCPRange::validRange(result_range))
1637 qFatal(
"The obtained range is invalid !");
1640 result_range = temp_range;
1643 found_at_least_one_range =
true;
1650 if(temp_range.lower > result_range.lower)
1651 result_range.lower = temp_range.lower;
1652 if(temp_range.upper < result_range.upper)
1653 result_range.upper = temp_range.upper;
1657 if(temp_range.lower < result_range.lower)
1658 result_range.lower = temp_range.lower;
1659 if(temp_range.upper > result_range.upper)
1660 result_range.upper = temp_range.upper;
1663 qFatal(
"Cannot reach this point. Programming error.");
1671 found_range = found_at_least_one_range;
1673 return result_range;
1715 double xLower = xAxis->range().lower;
1716 double xUpper = xAxis->range().upper;
1719 double yLower = yAxis->range().lower;
1720 double yUpper = yAxis->range().upper;
1747 xAxis->setRange(xLower, xUpper - xDelta);
1761 yAxis->setRange(yLower, yUpper - yDelta);
1812 xAxis->range().lower,
1885 QCPRange yAxisRange,
1890 xAxis->setRange(xAxisRange.lower, xAxisRange.upper);
1895 yAxis->setRange(yAxisRange.lower, yAxisRange.upper);
1912 xAxis->setRange(lower, upper);
1923 yAxis->setRange(lower, upper);
2168 double plotHeight = yAxis->range().upper - yAxis->range().lower;
2173 double heightDiffRatio = (heightDiff / plotHeight) * 100;
2175 if(heightDiffRatio > 10)
2187 QCustomPlot::setFocus();
2199 if(focusedPlotWidget ==
nullptr)
2200 qFatal(
"Fatal error at %s@%d. Program aborted.", __FILE__, __LINE__);
2202 if(dynamic_cast<QWidget *>(
this) != focusedPlotWidget)
2222 m_context.
xRange = QCPRange(xAxis->range().lower, xAxis->range().upper);
2223 m_context.
yRange = QCPRange(yAxis->range().lower, yAxis->range().upper);