36 #include "../../pappsoexception.h"
37 #include "../../exception/exceptionnotpossible.h"
41 qRegisterMetaType<pappso::BasePlotContext>(
"pappso::BasePlotContext");
43 qRegisterMetaType<pappso::BasePlotContext *>(
"pappso::BasePlotContext *");
52 QString text(
"Context:");
54 text += QString(
"data kind: %1").arg(
static_cast<int>(
dataKind));
56 text += QString(
" isMouseDragging: %1 -- wasMouseDragging: %2")
60 text += QString(
" -- startDragPoint : (%1, %2)")
64 text += QString(
" -- currentDragPoint : (%1, %2)")
68 text += QString(
" -- lastCursorHoveredPoint : (%1, %2)")
72 text += QString(
" -- xRange: (%1, %2)").arg(
xRange.lower).arg(
xRange.upper);
74 text += QString(
" -- yRange: (%1, %2)").arg(
yRange.lower).arg(
yRange.upper);
77 QString(
" -- wasClickOnXAxis: %1").arg(
wasClickOnXAxis ?
"true" :
"false");
79 QString(
" -- wasClickOnYAxis: %1").arg(
wasClickOnYAxis ?
"true" :
"false");
80 text += QString(
" -- isMeasuringDistance: %1")
83 text += QString(
" -- xRegionRangeStart: %1 -- xRegionRangeEnd: %2")
87 text += QString(
" -- yRegionRangeStart: %1 -- yRegionRangeEnd: %2")
91 text += QString(
" -- xDelta: %1 -- yDelta: %2").arg(
xDelta).arg(
yDelta);
107 text += QString(
" -- mouseButtonsAtMouseRelease: %1")
118 if(parent ==
nullptr)
119 qFatal(
"Programming error.");
122 m_pen.setStyle(Qt::SolidLine);
123 m_pen.setBrush(Qt::black);
127 qFatal(
"Programming error.");
134 const QString &x_axis_label,
135 const QString &y_axis_label)
136 : QCustomPlot(parent), m_axisLabelX(x_axis_label), m_axisLabelY(y_axis_label)
140 if(parent ==
nullptr)
141 qFatal(
"Programming error.");
144 m_pen.setStyle(Qt::SolidLine);
145 m_pen.setBrush(Qt::black);
148 xAxis->setLabel(x_axis_label);
149 yAxis->setLabel(y_axis_label);
152 qFatal(
"Programming error.");
185 setFocusPolicy(Qt::StrongFocus);
186 setInteractions(QCP::iRangeZoom | QCP::iSelectPlottables | QCP::iMultiSelect);
200 pen.setColor(QColor(
"black"));
222 pen.setColor(QColor(
"green"));
232 pen.setColor(QColor(
"red"));
268 &QCustomPlot::mouseRelease,
273 &QCustomPlot::axisDoubleClick,
297 const QColor &new_color)
299 if(plottable_p ==
nullptr)
300 qFatal(
"Pointer cannot be nullptr.");
305 pen = plottable_p->pen();
306 pen.setColor(new_color);
307 plottable_p->setPen(pen);
316 if(!new_color.isValid())
319 QCPGraph *graph_p = graph(index);
321 if(graph_p ==
nullptr)
322 qFatal(
"Programming error.");
331 if(plottable_p ==
nullptr)
332 qFatal(
"Programming error.");
334 return plottable_p->pen().color();
341 QCPGraph *graph_p = graph(index);
343 if(graph_p ==
nullptr)
344 qFatal(
"Programming error.");
353 xAxis->setLabel(label);
360 yAxis->setLabel(label);
500 if(event->key() == Qt::Key_Left || event->key() == Qt::Key_Right ||
501 event->key() == Qt::Key_Up || event->key() == Qt::Key_Down)
530 if(event->key() == Qt::Key_Backspace)
537 else if(event->key() == Qt::Key_Space)
541 else if(event->key() == Qt::Key_Delete)
554 int graph_count = plottableCount();
577 QList<QCPGraph *> selected_graph_list;
579 selected_graph_list = selectedGraphs();
581 if(!selected_graph_list.size())
590 for(
int iter = 0; iter < selected_graph_list.size(); ++iter)
597 this, selected_graph_list.at(iter),
m_context);
610 else if(event->key() == Qt::Key_T)
622 else if(event->key() == Qt::Key_Left || event->key() == Qt::Key_Right ||
623 event->key() == Qt::Key_Up || event->key() == Qt::Key_Down)
666 int pixel_increment = 0;
671 pixel_increment = 50;
677 if(event->key() == Qt::Key_Left)
679 else if(event->key() == Qt::Key_Right)
681 else if(event->key() == Qt::Key_Up)
683 else if(event->key() == Qt::Key_Down)
700 [maybe_unused]] QKeyEvent *event)
710 QPointF pixel_coordinates(
714 Qt::MouseButton button = Qt::NoButton;
715 QEvent::Type q_event_type = QEvent::MouseButtonPress;
721 button = Qt::LeftButton;
727 q_event_type = QEvent::MouseButtonPress;
729 q_event_type = QEvent::MouseButtonRelease;
735 button = Qt::RightButton;
741 q_event_type = QEvent::MouseButtonPress;
743 q_event_type = QEvent::MouseButtonRelease;
751 QMouseEvent *mouse_event_p =
752 new QMouseEvent(q_event_type,
754 mapToGlobal(pixel_coordinates.toPoint()),
755 mapToGlobal(pixel_coordinates.toPoint()),
759 Qt::MouseEventSynthesizedByApplication);
761 if(q_event_type == QEvent::MouseButtonPress)
779 QPointF mousePoint =
event->localPos();
870 yAxis->range().upper);
872 yAxis->range().lower);
937 yAxis->range().upper);
939 yAxis->range().lower);
1060 double x_delta_pixel =
1064 if(x_delta_pixel > 3)
1085 QPointF mousePoint =
event->localPos();
1143 yAxis->range().upper);
1145 yAxis->range().lower);
1179 yAxis->range().upper);
1182 yAxis->range().lower);
1347 [[maybe_unused]] QCPAxis::SelectablePart part,
1392 QCPLayoutElement *layoutElement = layoutElementAt(mousePoint);
1395 layoutElement ==
dynamic_cast<QCPLayoutElement *
>(axisRect()))
1402 QCPAxis::SelectablePart selectablePart;
1404 selectablePart = xAxis->getPartAt(mousePoint);
1406 if(selectablePart == QCPAxis::spAxisLabel ||
1407 selectablePart == QCPAxis::spAxis ||
1408 selectablePart == QCPAxis::spTickLabels)
1419 QCPLayoutElement *layoutElement = layoutElementAt(mousePoint);
1422 layoutElement ==
dynamic_cast<QCPLayoutElement *
>(axisRect()))
1429 QCPAxis::SelectablePart selectablePart;
1431 selectablePart = yAxis->getPartAt(mousePoint);
1433 if(selectablePart == QCPAxis::spAxisLabel ||
1434 selectablePart == QCPAxis::spAxis ||
1435 selectablePart == QCPAxis::spTickLabels)
1460 double x_delta_pixel =
1464 double y_delta_pixel =
1468 if(x_delta_pixel > y_delta_pixel)
1469 return Qt::Horizontal;
1471 return Qt::Vertical;
1480 QPointF pixels_coordinates(xAxis->coordToPixel(graph_coordinates.x()),
1481 yAxis->coordToPixel(graph_coordinates.y()));
1491 QCursor::setPos(mapToGlobal(pixel_coordinates.toPoint()));
1500 QPointF pixel_coord(xAxis->coordToPixel(graph_coord.x()),
1501 yAxis->coordToPixel(graph_coord.y()));
1514 QPointF pixel_coordinates(
1520 QPointF graph_coordinates(xAxis->pixelToCoord(pixel_coordinates.x()),
1521 yAxis->pixelToCoord(pixel_coordinates.y()));
1523 return graph_coordinates;
1533 QPointF pixel_coord(xAxis->coordToPixel(graph_coord.x()),
1534 yAxis->coordToPixel(graph_coord.y()));
1547 QPointF pixel_coordinates(
1553 QPointF graph_coordinates(xAxis->pixelToCoord(pixel_coordinates.x()),
1554 yAxis->pixelToCoord(pixel_coordinates.y()));
1556 return graph_coordinates;
1567 QCPGraph *graph_p = graph(index);
1569 if(graph_p ==
nullptr)
1570 qFatal(
"Programming error.");
1572 return graph_p->getKeyRange(found_range);
1579 QCPGraph *graph_p = graph(index);
1581 if(graph_p ==
nullptr)
1582 qFatal(
"Programming error.");
1584 return graph_p->getValueRange(found_range);
1591 bool &found_range)
const
1600 found_range =
false;
1602 return QCPRange(0, 1);
1605 if(graphCount() == 1)
1606 return graph()->getKeyRange(found_range);
1608 bool found_at_least_one_range =
false;
1611 QCPRange result_range(QCPRange::minRange + 1, QCPRange::maxRange + 1);
1613 for(
int iter = 0; iter < graphCount(); ++iter)
1615 QCPRange temp_range;
1617 bool found_range_for_iter =
false;
1619 QCPGraph *graph_p = graph(iter);
1623 if(axis == PlotAxis::x_axis)
1624 temp_range = graph_p->getKeyRange(found_range_for_iter);
1625 else if(axis == PlotAxis::y_axis)
1626 temp_range = graph_p->getValueRange(found_range_for_iter);
1628 qFatal(
"Cannot reach this point. Programming error.");
1633 if(!found_range_for_iter)
1639 if(!QCPRange::validRange(result_range))
1640 qFatal(
"The obtained range is invalid !");
1643 result_range = temp_range;
1646 found_at_least_one_range =
true;
1653 if(temp_range.lower > result_range.lower)
1654 result_range.lower = temp_range.lower;
1655 if(temp_range.upper < result_range.upper)
1656 result_range.upper = temp_range.upper;
1658 else if(range_type == RangeType::outermost)
1660 if(temp_range.lower < result_range.lower)
1661 result_range.lower = temp_range.lower;
1662 if(temp_range.upper > result_range.upper)
1663 result_range.upper = temp_range.upper;
1666 qFatal(
"Cannot reach this point. Programming error.");
1674 found_range = found_at_least_one_range;
1676 return result_range;
1691 return getRange(PlotAxis::x_axis, RangeType::outermost, found_range);
1706 return getRange(PlotAxis::y_axis, RangeType::outermost, found_range);
1718 double xLower = xAxis->range().lower;
1719 double xUpper = xAxis->range().upper;
1722 double yLower = yAxis->range().lower;
1723 double yUpper = yAxis->range().upper;
1750 xAxis->setRange(xLower, xUpper - xDelta);
1764 yAxis->setRange(yLower, yUpper - yDelta);
1815 xAxis->range().lower,
1888 QCPRange yAxisRange,
1891 if(
static_cast<int>(axis) &
static_cast<int>(PlotAxis::x_axis))
1893 xAxis->setRange(xAxisRange.lower, xAxisRange.upper);
1896 if(
static_cast<int>(axis) &
static_cast<int>(PlotAxis::y_axis))
1898 yAxis->setRange(yAxisRange.lower, yAxisRange.upper);
1915 xAxis->setRange(lower, upper);
1926 yAxis->setRange(lower, upper);
2171 double plotHeight = yAxis->range().upper - yAxis->range().lower;
2176 double heightDiffRatio = (heightDiff / plotHeight) * 100;
2178 if(heightDiffRatio > 10)
2190 QCustomPlot::setFocus();
2202 if(focusedPlotWidget ==
nullptr)
2204 "baseplotwidget.cpp @ redrawPlotBackground(QWidget *focusedPlotWidget -- "
2205 "ERROR focusedPlotWidget cannot be nullptr.");
2207 if(
dynamic_cast<QWidget *
>(
this) != focusedPlotWidget)
2227 m_context.
xRange = QCPRange(xAxis->range().lower, xAxis->range().upper);
2228 m_context.
yRange = QCPRange(yAxis->range().lower, yAxis->range().upper);