From: Soeren Apel Date: Fri, 20 Dec 2019 20:05:54 +0000 (+0100) Subject: Fix #977 properly by checking whether a row actually has annotations X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=f994f496908ed183c951ada303c4ba8d18b80b64;p=pulseview.git Fix #977 properly by checking whether a row actually has annotations --- diff --git a/pv/data/decode/rowdata.cpp b/pv/data/decode/rowdata.cpp index 2a26169e..d3d14f9b 100644 --- a/pv/data/decode/rowdata.cpp +++ b/pv/data/decode/rowdata.cpp @@ -32,6 +32,11 @@ uint64_t RowData::get_max_sample() const return annotations_.back().end_sample(); } +uint64_t RowData::get_annotation_count() const +{ + return annotations_.size(); +} + void RowData::get_annotation_subset( vector &dest, uint64_t start_sample, uint64_t end_sample) const diff --git a/pv/data/decode/rowdata.hpp b/pv/data/decode/rowdata.hpp index 0589ec89..3c967ff7 100644 --- a/pv/data/decode/rowdata.hpp +++ b/pv/data/decode/rowdata.hpp @@ -42,6 +42,8 @@ public: public: uint64_t get_max_sample() const; + uint64_t get_annotation_count() const; + /** * Extracts annotations between the given sample range into a vector. * Note: The annotations are unsorted and only annotations that fully diff --git a/pv/data/decodesignal.cpp b/pv/data/decodesignal.cpp index a6d4a9d6..3071a5c1 100644 --- a/pv/data/decodesignal.cpp +++ b/pv/data/decodesignal.cpp @@ -454,7 +454,7 @@ int64_t DecodeSignal::get_decoded_sample_count(uint32_t segment_id, return result; } -vector DecodeSignal::get_rows(bool visible_only) const +vector DecodeSignal::get_rows() const { lock_guard lock(output_mutex_); @@ -462,9 +462,6 @@ vector DecodeSignal::get_rows(bool visible_only) const for (const shared_ptr& dec : stack_) { assert(dec); - if (visible_only && !dec->shown()) - continue; - const srd_decoder *const decc = dec->decoder(); assert(dec->decoder()); @@ -485,6 +482,23 @@ vector DecodeSignal::get_rows(bool visible_only) const return rows; } +uint64_t DecodeSignal::get_annotation_count(const decode::Row &row, + uint32_t segment_id) const +{ + if (segment_id >= segments_.size()) + return 0; + + const DecodeSegment *segment = &(segments_.at(segment_id)); + const map *rows = + &(segment->annotation_rows); + + const auto iter = rows->find(row); + if (iter != rows->end()) + return (*iter).second.get_annotation_count(); + + return 0; +} + void DecodeSignal::get_annotation_subset( vector &dest, const decode::Row &row, uint32_t segment_id, uint64_t start_sample, @@ -510,7 +524,7 @@ void DecodeSignal::get_annotation_subset( { // Note: We put all vectors and lists on the heap, not the stack - const vector rows = get_rows(true); + const vector rows = get_rows(); // Use forward_lists for faster merging forward_list *all_ann_list = new forward_list(); diff --git a/pv/data/decodesignal.hpp b/pv/data/decodesignal.hpp index 74ffbd1f..9a112e9b 100644 --- a/pv/data/decodesignal.hpp +++ b/pv/data/decodesignal.hpp @@ -139,7 +139,9 @@ public: int64_t get_decoded_sample_count(uint32_t segment_id, bool include_processing) const; - vector get_rows(bool visible_only) const; + vector get_rows() const; + + uint64_t get_annotation_count(const decode::Row &row, uint32_t segment_id) const; /** * Extracts annotations from a single row into a vector. diff --git a/pv/views/trace/decodetrace.cpp b/pv/views/trace/decodetrace.cpp index e14b4ecb..50156ddf 100644 --- a/pv/views/trace/decodetrace.cpp +++ b/pv/views/trace/decodetrace.cpp @@ -192,7 +192,7 @@ void DecodeTrace::paint_mid(QPainter &p, ViewItemPaintParams &pp) sample_range.second = min((int64_t)sample_range.second, decode_signal_->get_decoded_sample_count(current_segment_, false)); - const vector rows = decode_signal_->get_rows(!always_show_all_rows_); + const vector rows = decode_signal_->get_rows(); visible_rows_.clear(); for (const Row& row : rows) { @@ -212,7 +212,13 @@ void DecodeTrace::paint_mid(QPainter &p, ViewItemPaintParams &pp) vector annotations; decode_signal_->get_annotation_subset(annotations, row, current_segment_, sample_range.first, sample_range.second); - if (always_show_all_rows_ || !annotations.empty()) { + + // Show row if there are visible annotations or when user wants to see + // all rows that have annotations somewhere and this one is one of them + bool row_visible = !annotations.empty() || + (always_show_all_rows_ && (decode_signal_->get_annotation_count(row, current_segment_) > 0)); + + if (row_visible) { draw_annotations(annotations, p, annotation_height, pp, y, get_row_color(row.index()), row_title_width); y += row_height_;