]> sigrok.org Git - pulseview.git/blobdiff - pv/views/trace/decodetrace.cpp
fix catching polymorphic types by value
[pulseview.git] / pv / views / trace / decodetrace.cpp
index b4857336f9e6e1e350bc73e91ef6409bcc3f7e2e..bf31a72ac05adaee19ee78e6d54b1c9f3bc09191 100644 (file)
@@ -146,6 +146,8 @@ DecodeTrace::DecodeTrace(pv::Session &session,
 
        connect(decode_signal_.get(), SIGNAL(new_annotations()),
                this, SLOT(on_new_annotations()));
+       connect(decode_signal_.get(), SIGNAL(decode_reset()),
+               this, SLOT(on_decode_reset()));
        connect(decode_signal_.get(), SIGNAL(decode_finished()),
                this, SLOT(on_decode_finished()));
        connect(decode_signal_.get(), SIGNAL(channels_updated()),
@@ -218,7 +220,7 @@ void DecodeTrace::paint_mid(QPainter &p, ViewItemPaintParams &pp)
                int row_title_width;
                try {
                        row_title_width = row_title_widths_.at(row);
-               } catch (out_of_range) {
+               } catch (out_of_range&) {
                        const int w = p.boundingRect(QRectF(), 0, row.title()).width() +
                                RowTitleMargin;
                        row_title_widths_[row] = w;
@@ -234,7 +236,7 @@ void DecodeTrace::paint_mid(QPainter &p, ViewItemPaintParams &pp)
 
                vector<Annotation> annotations;
                decode_signal_->get_annotation_subset(annotations, row,
-                       sample_range.first, sample_range.second);
+                       current_segment_, sample_range.first, sample_range.second);
                if (!annotations.empty()) {
                        draw_annotations(annotations, p, annotation_height, pp, y,
                                base_colour, row_title_width);
@@ -605,11 +607,11 @@ void DecodeTrace::draw_unresolved_period(QPainter &p, int h, int left, int right
 
        double samples_per_pixel, pixels_offset;
 
-       const int64_t sample_count = decode_signal_->get_working_sample_count();
+       const int64_t sample_count = decode_signal_->get_working_sample_count(current_segment_);
        if (sample_count == 0)
                return;
 
-       const int64_t samples_decoded = decode_signal_->get_decoded_sample_count();
+       const int64_t samples_decoded = decode_signal_->get_decoded_sample_count(current_segment_);
        if (sample_count == samples_decoded)
                return;
 
@@ -704,21 +706,19 @@ const QString DecodeTrace::get_annotation_at_point(const QPoint &point)
        vector<pv::data::decode::Annotation> annotations;
 
        decode_signal_->get_annotation_subset(annotations, visible_rows_[row],
-               sample_range.first, sample_range.second);
+               current_segment_, sample_range.first, sample_range.second);
 
        return (annotations.empty()) ?
                QString() : annotations[0].annotations().front();
 }
 
-void DecodeTrace::hover_point_changed()
+void DecodeTrace::hover_point_changed(const QPoint &hp)
 {
        assert(owner_);
 
        const View *const view = owner_->view();
        assert(view);
 
-       QPoint hp = view->hover_point();
-
        if (hp.x() == 0) {
                QToolTip::hideText();
                return;
@@ -746,13 +746,14 @@ void DecodeTrace::hover_point_changed()
        // If it did, the tool tip would constantly hide and re-appear.
        // We also push it up by one row so that it appears above the
        // decode trace, not below.
-       hp.setX(hp.x() - (text_size.width() / 2) - padding);
+       QPoint p = hp;
+       p.setX(hp.x() - (text_size.width() / 2) - padding);
 
-       hp.setY(get_visual_y() - (row_height_ / 2) +
+       p.setY(get_visual_y() - (row_height_ / 2) +
                (hover_row * row_height_) -
                row_height_ - text_size.height() - padding);
 
-       QToolTip::showText(view->viewport()->mapToGlobal(hp), ann);
+       QToolTip::showText(view->viewport()->mapToGlobal(p), ann);
 }
 
 void DecodeTrace::create_decoder_form(int index,
@@ -890,6 +891,15 @@ void DecodeTrace::on_delayed_trace_update()
                owner_->row_item_appearance_changed(false, true);
 }
 
+void DecodeTrace::on_decode_reset()
+{
+       visible_rows_.clear();
+       max_visible_rows_ = 0;
+
+       if (owner_)
+               owner_->row_item_appearance_changed(false, true);
+}
+
 void DecodeTrace::on_decode_finished()
 {
        if (owner_)