From 46a19b26706c5d44a13f9fb569d3691d2277500b Mon Sep 17 00:00:00 2001 From: Andrei Popa Date: Wed, 14 Feb 2024 10:30:21 +0200 Subject: [PATCH] logic analyzer: reworked decoder tool tips to show on hover Signed-off-by: Andrei Popa --- src/logicanalyzer/logic_analyzer.cpp | 50 +++++++++++++++++----------- src/logicanalyzer/logic_analyzer.h | 3 +- 2 files changed, 33 insertions(+), 20 deletions(-) diff --git a/src/logicanalyzer/logic_analyzer.cpp b/src/logicanalyzer/logic_analyzer.cpp index 71d866915a..e6882e68f6 100644 --- a/src/logicanalyzer/logic_analyzer.cpp +++ b/src/logicanalyzer/logic_analyzer.cpp @@ -2012,29 +2012,41 @@ void LogicAnalyzer::initBufferScrolling() // When the plot is clicked emit the clicked signal on the curve m_plot.setMouseTracking(true); - connect(&m_plot, &CapturePlot::mouseButtonPress, [=](const QMouseEvent *event) { - if (event == nullptr) return; - - if (event->button() == Qt::LeftButton) { - const auto curve = m_plot.curveAt(event->pos()); - - if(curve) { - const QPointF curvePos = curve->screenPosToCurvePoint(event->pos()); - const QString annInfo = dynamic_cast(curve) - ->annotationAt(curvePos) - .ann->annotations()[0]; - scopy::HoverWidget *toolTip = createHoverToolTip(annInfo, event->pos()); - - QTimer::singleShot(2000, toolTip, &scopy::HoverWidget::deleteLater); - connect(&m_plot, &CapturePlot::mouseButtonRelease, toolTip, &scopy::HoverWidget::show); - connect(&m_plot, &CapturePlot::mouseButtonPress, toolTip, &scopy::HoverWidget::deleteLater); - connect(m_plot.getZoomer(), &OscPlotZoomer::zoomFinished, toolTip, - &scopy::HoverWidget::deleteLater); - Q_EMIT curve->clicked(curvePos); + QTimer *timer = new QTimer(); + timer->setInterval(500); + lastToolTipAnn = NULL; + + connect(timer, &QTimer::timeout, this, [=]() { + QPoint pos = m_plot.mapFromGlobal(QCursor::pos()); + GenericLogicPlotCurve *curve = m_plot.curveAt(pos); + + if(curve) { + const QPointF curvePos = curve->screenPosToCurvePoint(pos); + const QString *annInfo = + &dynamic_cast(curve)->annotationAt(curvePos).ann->annotations()[0]; + + if(lastToolTipAnn != annInfo) { + scopy::HoverWidget *toolTip = createHoverToolTip(*annInfo, pos); + QTimer::singleShot(500, [toolTip, annInfo, this]() { + if(toolTip && lastToolTipAnn == annInfo) + toolTip->show(); + }); + Q_EMIT deleteToolTips(); + + lastToolTipAnn = annInfo; + connect(this, &LogicAnalyzer::deleteToolTips, toolTip, + &scopy::HoverWidget::deleteLater); } + } else { + if(lastToolTipAnn != NULL) { + Q_EMIT deleteToolTips(); + } + lastToolTipAnn = NULL; } }); + + timer->start(); } diff --git a/src/logicanalyzer/logic_analyzer.h b/src/logicanalyzer/logic_analyzer.h index 85de239093..790ed53e51 100644 --- a/src/logicanalyzer/logic_analyzer.h +++ b/src/logicanalyzer/logic_analyzer.h @@ -122,6 +122,7 @@ class LogicAnalyzer : public LogicTool { int getGroupOffset(); Q_SIGNALS: void showTool(); + void deleteToolTips(); private Q_SLOTS: @@ -259,7 +260,7 @@ private Q_SLOTS: DropdownSwitchList* filterMessages; int filterCount = 0; - + const QString *lastToolTipAnn; }; } // namespace logic } // namespace adiscope