]> sigrok.org Git - pulseview.git/blobdiff - pv/view/decodetrace.cpp
DecodeTrace: Correct row calculation/tooltip position for row 0
[pulseview.git] / pv / view / decodetrace.cpp
index 7ed66b3e12c351d7cae7763cd3f3b4710c913a18..71fbaa85c613d29dab29400edc5fe3d17c76c8c5 100644 (file)
@@ -45,7 +45,7 @@ extern "C" {
 #include <pv/data/decoderstack.hpp>
 #include <pv/data/decode/decoder.hpp>
 #include <pv/data/logic.hpp>
-#include <pv/data/logicsnapshot.hpp>
+#include <pv/data/logicsegment.hpp>
 #include <pv/data/decode/annotation.hpp>
 #include <pv/view/logicsignal.hpp>
 #include <pv/view/view.hpp>
@@ -160,24 +160,21 @@ pair<int, int> DecodeTrace::v_extents() const
 {
        /// @todo Replace this with an implementation that knows the true
        /// height of the trace
-       QFontMetrics m(QApplication::font());
-       const int text_height =  m.boundingRect(QRect(), 0, "Tg").height();
-       const int row_height = (text_height * 6) / 4;
+       const int row_height = (RowItemPaintParams::text_height() * 6) / 4;
        return make_pair(-row_height / 2, row_height * 7 / 2);
 }
 
 void DecodeTrace::paint_back(QPainter &p, const RowItemPaintParams &pp)
 {
        Trace::paint_back(p, pp);
-       paint_axis(p, get_visual_y(), pp.left(), pp.right());
+       paint_axis(p, pp, get_visual_y());
 }
 
 void DecodeTrace::paint_mid(QPainter &p, const RowItemPaintParams &pp)
 {
        using namespace pv::data::decode;
 
-       QFontMetrics m(QApplication::font());
-       text_height_ = m.boundingRect(QRect(), 0, "Tg").height();
+       text_height_ = RowItemPaintParams::text_height();
        row_height_ = (text_height_ * 6) / 4;
        const int annotation_height = (text_height_ * 5) / 4;
 
@@ -215,8 +212,8 @@ void DecodeTrace::paint_mid(QPainter &p, const RowItemPaintParams &pp)
                        sample_range.first, sample_range.second);
                if (!annotations.empty()) {
                        for (const Annotation &a : annotations)
-                               draw_annotation(a, p, get_text_colour(),
-                                       annotation_height, pp, y, base_colour);
+                               draw_annotation(a, p, annotation_height,
+                                       pp, y, base_colour);
                        y += row_height_;
 
                        visible_rows_.push_back(rows[i]);
@@ -336,7 +333,7 @@ QMenu* DecodeTrace::create_context_menu(QWidget *parent)
 }
 
 void DecodeTrace::draw_annotation(const pv::data::decode::Annotation &a,
-       QPainter &p, QColor text_color, int h, const RowItemPaintParams &pp, int y,
+       QPainter &p, int h, const RowItemPaintParams &pp, int y,
        size_t base_colour) const
 {
        double samples_per_pixel, pixels_offset;
@@ -356,15 +353,13 @@ void DecodeTrace::draw_annotation(const pv::data::decode::Annotation &a,
                return;
 
        if (a.start_sample() == a.end_sample())
-               draw_instant(a, p, fill, outline, text_color, h,
-                       start, y);
+               draw_instant(a, p, fill, outline, h, start, y);
        else
-               draw_range(a, p, fill, outline, text_color, h,
-                       start, end, y);
+               draw_range(a, p, fill, outline, h, start, end, y);
 }
 
 void DecodeTrace::draw_instant(const pv::data::decode::Annotation &a, QPainter &p,
-       QColor fill, QColor outline, QColor text_color, int h, double x, int y) const
+       QColor fill, QColor outline, int h, double x, int y) const
 {
        const QString text = a.annotations().empty() ?
                QString() : a.annotations().back();
@@ -376,12 +371,12 @@ void DecodeTrace::draw_instant(const pv::data::decode::Annotation &a, QPainter &
        p.setBrush(fill);
        p.drawRoundedRect(rect, h / 2, h / 2);
 
-       p.setPen(text_color);
+       p.setPen(Qt::black);
        p.drawText(rect, Qt::AlignCenter | Qt::AlignVCenter, text);
 }
 
 void DecodeTrace::draw_range(const pv::data::decode::Annotation &a, QPainter &p,
-       QColor fill, QColor outline, QColor text_color, int h, double start,
+       QColor fill, QColor outline, int h, double start,
        double end, int y) const
 {
        const double top = y + .5 - h / 2;
@@ -419,7 +414,7 @@ void DecodeTrace::draw_range(const pv::data::decode::Annotation &a, QPainter &p,
        if (rect.width() <= 4)
                return;
 
-       p.setPen(text_color);
+       p.setPen(Qt::black);
 
        // Try to find an annotation that will fit
        QString best_annotation;
@@ -456,7 +451,7 @@ void DecodeTrace::draw_error(QPainter &p, const QString &message,
        p.drawRoundedRect(text_rect.adjusted(-r, -r, r, r), r, r,
                Qt::AbsoluteSize);
 
-       p.setPen(get_text_colour());
+       p.setPen(Qt::black);
        p.drawText(text_rect, message);
 }
 
@@ -477,20 +472,20 @@ void DecodeTrace::draw_unresolved_period(QPainter &p, int h, int left,
 
        // We get the logic data of the first channel in the list.
        // This works because we are currently assuming all
-       // LogicSignals have the same data/snapshot
+       // LogicSignals have the same data/segment
        for (const shared_ptr<Decoder> &dec : stack)
                if (dec && !dec->channels().empty() &&
                        ((logic_signal = (*dec->channels().begin()).second)) &&
                        ((data = logic_signal->logic_data())))
                        break;
 
-       if (!data || data->get_snapshots().empty())
+       if (!data || data->logic_segments().empty())
                return;
 
-       const shared_ptr<LogicSnapshot> snapshot =
-               data->get_snapshots().front();
-       assert(snapshot);
-       const int64_t sample_count = (int64_t)snapshot->get_sample_count();
+       const shared_ptr<LogicSegment> segment =
+               data->logic_segments().front();
+       assert(segment);
+       const int64_t sample_count = (int64_t)segment->get_sample_count();
        if (sample_count == 0)
                return;
 
@@ -530,7 +525,7 @@ pair<double, double> DecodeTrace::get_pixels_offset_samples_per_pixel() const
        assert(scale > 0);
 
        const double pixels_offset =
-               (view->offset() - decoder_stack_->get_start_time()) / scale;
+               (view->offset() - decoder_stack_->start_time()) / scale;
 
        double samplerate = decoder_stack_->samplerate();
 
@@ -561,9 +556,15 @@ int DecodeTrace::get_row_at_point(const QPoint &point)
        if (!row_height_)
                return -1;
 
-       const int row = (point.y() - get_visual_y() + row_height_ / 2) /
-               row_height_;
-       if (row < 0 || row >= (int)visible_rows_.size())
+       const int y = (point.y() - get_visual_y() + row_height_ / 2);
+
+       /* Integer divison of (x-1)/x would yield 0, so we check for this. */
+       if (y < 0)
+               return -1;
+
+       const int row = y / row_height_;
+
+       if (row >= (int)visible_rows_.size())
                return -1;
 
        return row;
@@ -592,11 +593,6 @@ const QString DecodeTrace::get_annotation_at_point(const QPoint &point)
                QString() : annotations[0].annotations().front();
 }
 
-void DecodeTrace::hide_hover_annotation()
-{
-       QToolTip::hideText();
-}
-
 void DecodeTrace::hover_point_changed()
 {
        assert(owner_);
@@ -610,7 +606,7 @@ void DecodeTrace::hover_point_changed()
        assert(view);
 
        if (!row_height_ || ann.isEmpty()) {
-               hide_hover_annotation();
+               QToolTip::hideText();
                return;
        }
 
@@ -631,7 +627,7 @@ void DecodeTrace::hover_point_changed()
 
        hp.setY(get_visual_y() - (row_height_ / 2) +
                (hover_row * row_height_) -
-               row_height_ - text_size.height());
+               row_height_ - text_size.height() - padding);
 
        QToolTip::showText(view->viewport()->mapToGlobal(hp), ann);
 }