|
|
|
@ -311,12 +311,14 @@ void ChartsWidget::removeChart(ChartView *chart) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void ChartsWidget::removeAll() { |
|
|
|
|
for (auto c : charts) { |
|
|
|
|
c->deleteLater(); |
|
|
|
|
if (!charts.isEmpty()) { |
|
|
|
|
for (auto c : charts) { |
|
|
|
|
c->deleteLater(); |
|
|
|
|
} |
|
|
|
|
charts.clear(); |
|
|
|
|
updateToolBar(); |
|
|
|
|
emit seriesChanged(); |
|
|
|
|
} |
|
|
|
|
charts.clear(); |
|
|
|
|
updateToolBar(); |
|
|
|
|
emit seriesChanged(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void ChartsWidget::alignCharts() { |
|
|
|
@ -390,10 +392,8 @@ ChartView::ChartView(QWidget *parent) : tip_label(this), QChartView(nullptr, par |
|
|
|
|
setRubberBand(can->liveStreaming() ? QChartView::NoRubberBand : QChartView::HorizontalRubberBand); |
|
|
|
|
setMouseTracking(true); |
|
|
|
|
|
|
|
|
|
QObject::connect(axis_x, &QValueAxis::rangeChanged, [this]() { resetChartCache(); }); |
|
|
|
|
QObject::connect(axis_y, &QValueAxis::rangeChanged, [this]() { resetChartCache(); }); |
|
|
|
|
QObject::connect(axis_y, &QAbstractAxis::titleTextChanged, [this]() { resetChartCache(); }); |
|
|
|
|
QObject::connect(chart, &QChart::plotAreaChanged, [this]() { resetChartCache(); }); |
|
|
|
|
|
|
|
|
|
QObject::connect(dbc(), &DBCManager::signalRemoved, this, &ChartView::signalRemoved); |
|
|
|
|
QObject::connect(dbc(), &DBCManager::signalUpdated, this, &ChartView::signalUpdated); |
|
|
|
@ -529,6 +529,7 @@ void ChartView::updatePlotArea(int left_pos, bool force) { |
|
|
|
|
int adjust_top = chart()->legend()->geometry().height() + style()->pixelMetric(QStyle::PM_LayoutTopMargin); |
|
|
|
|
chart()->setPlotArea(rect().adjusted(align_to + left, adjust_top + top, -x_label_size.width() / 2 - right, -x_label_size.height() - bottom)); |
|
|
|
|
chart()->layout()->invalidate(); |
|
|
|
|
resetChartCache(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -549,6 +550,11 @@ void ChartView::updatePlot(double cur, double min, double max) { |
|
|
|
|
axis_x->setRange(min, max); |
|
|
|
|
updateAxisY(); |
|
|
|
|
updateSeriesPoints(); |
|
|
|
|
// update tooltip
|
|
|
|
|
if (tooltip_x >= 0) { |
|
|
|
|
showTip(chart()->mapToValue({tooltip_x, 0}).x()); |
|
|
|
|
} |
|
|
|
|
resetChartCache(); |
|
|
|
|
} |
|
|
|
|
viewport()->update(); |
|
|
|
|
} |
|
|
|
@ -799,7 +805,8 @@ void ChartView::mouseMoveEvent(QMouseEvent *ev) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void ChartView::showTip(double sec) { |
|
|
|
|
qreal x = chart()->mapToPosition({sec, 0}).x(); |
|
|
|
|
tooltip_x = chart()->mapToPosition({sec, 0}).x(); |
|
|
|
|
qreal x = tooltip_x; |
|
|
|
|
QStringList text_list(QString::number(chart()->mapToValue({x, 0}).x(), 'f', 3)); |
|
|
|
|
for (auto &s : sigs) { |
|
|
|
|
if (s.series->isVisible()) { |
|
|
|
@ -808,11 +815,12 @@ void ChartView::showTip(double sec) { |
|
|
|
|
auto it = std::lower_bound(s.vals.rbegin(), s.vals.rend(), sec, [](auto &p, double x) { return p.x() > x; }); |
|
|
|
|
if (it != s.vals.rend() && it->x() >= axis_x->min()) { |
|
|
|
|
value = QString::number(it->y()); |
|
|
|
|
s.track_pt = chart()->mapToPosition(*it); |
|
|
|
|
x = std::max(x, s.track_pt.x()); |
|
|
|
|
s.track_pt = *it; |
|
|
|
|
x = std::max(x, chart()->mapToPosition(*it).x()); |
|
|
|
|
} |
|
|
|
|
text_list << QString("<span style=\"color:%1;\">■ </span>%2: <b>%3</b> (%4 - %5)") |
|
|
|
|
.arg(s.series->color().name(), s.sig->name, value, QString::number(s.min), QString::number(s.max)); |
|
|
|
|
QString name = sigs.size() > 1 ? s.sig->name + ": " : ""; |
|
|
|
|
text_list << QString("<span style=\"color:%1;\">■ </span>%2<b>%3</b> (%4 - %5)") |
|
|
|
|
.arg(s.series->color().name(), name, value, QString::number(s.min), QString::number(s.max)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
QPointF tooltip_pt(x, chart()->plotArea().top()); |
|
|
|
@ -823,6 +831,7 @@ void ChartView::showTip(double sec) { |
|
|
|
|
|
|
|
|
|
void ChartView::hideTip() { |
|
|
|
|
clearTrackPoints(); |
|
|
|
|
tooltip_x = -1; |
|
|
|
|
tip_label.hide(); |
|
|
|
|
viewport()->update(); |
|
|
|
|
} |
|
|
|
@ -897,8 +906,9 @@ void ChartView::drawForeground(QPainter *painter, const QRectF &rect) { |
|
|
|
|
for (auto &s : sigs) { |
|
|
|
|
if (!s.track_pt.isNull() && s.series->isVisible()) { |
|
|
|
|
painter->setBrush(s.series->color().darker(125)); |
|
|
|
|
painter->drawEllipse(s.track_pt, 5.5, 5.5); |
|
|
|
|
track_line_x = std::max(track_line_x, s.track_pt.x()); |
|
|
|
|
QPointF pos = chart()->mapToPosition(s.track_pt); |
|
|
|
|
painter->drawEllipse(pos, 5.5, 5.5); |
|
|
|
|
track_line_x = std::max(track_line_x, pos.x()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (track_line_x > 0) { |
|
|
|
|