From f98070844c2d468fdbb6beb5b65e4ccbbcd3f10b Mon Sep 17 00:00:00 2001 From: Soeren Apel Date: Mon, 16 Jul 2018 18:27:54 +0200 Subject: [PATCH] Make sure PD row colors remain constant by adding a row index Without this change, PD row colors depend on the visible rows, not a constant ID. This means that rows that collapse change the colors of all rows coming after them. --- pv/data/decode/row.cpp | 8 +++++++- pv/data/decode/row.hpp | 4 +++- pv/data/decodesignal.cpp | 15 +++++++++------ pv/views/trace/decodetrace.cpp | 3 +-- 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/pv/data/decode/row.cpp b/pv/data/decode/row.cpp index 1266b843..5b1b25ee 100644 --- a/pv/data/decode/row.cpp +++ b/pv/data/decode/row.cpp @@ -31,7 +31,8 @@ Row::Row() : { } -Row::Row(const srd_decoder *decoder, const srd_decoder_annotation_row *row) : +Row::Row(int index, const srd_decoder *decoder, const srd_decoder_annotation_row *row) : + index_(index), decoder_(decoder), row_(row) { @@ -60,6 +61,11 @@ const QString Row::title() const return QString(); } +int Row::index() const +{ + return index_; +} + bool Row::operator<(const Row &other) const { return (decoder_ < other.decoder_) || diff --git a/pv/data/decode/row.hpp b/pv/data/decode/row.hpp index 5ddd10d3..2411d4f6 100644 --- a/pv/data/decode/row.hpp +++ b/pv/data/decode/row.hpp @@ -36,17 +36,19 @@ class Row public: Row(); - Row(const srd_decoder *decoder, + Row(int index, const srd_decoder *decoder, const srd_decoder_annotation_row *row = nullptr); const srd_decoder* decoder() const; const srd_decoder_annotation_row* row() const; const QString title() const; + int index() const; bool operator<(const Row &other) const; private: + int index_; const srd_decoder *decoder_; const srd_decoder_annotation_row *row_; }; diff --git a/pv/data/decodesignal.cpp b/pv/data/decodesignal.cpp index 65436002..9da7de67 100644 --- a/pv/data/decodesignal.cpp +++ b/pv/data/decodesignal.cpp @@ -209,6 +209,7 @@ void DecodeSignal::begin_decode() } // Map out all the annotation classes + int row_index = 0; for (const shared_ptr &dec : stack_) { assert(dec); const srd_decoder *const decc = dec->decoder(); @@ -219,7 +220,7 @@ void DecodeSignal::begin_decode() (srd_decoder_annotation_row *)l->data; assert(ann_row); - const Row row(decc, ann_row); + const Row row(row_index++, decc, ann_row); for (const GSList *ll = ann_row->ann_classes; ll; ll = ll->next) @@ -432,16 +433,17 @@ vector DecodeSignal::visible_rows() const const srd_decoder *const decc = dec->decoder(); assert(dec->decoder()); + int row_index = 0; // Add a row for the decoder if it doesn't have a row list if (!decc->annotation_rows) - rows.emplace_back(decc); + rows.emplace_back(row_index++, decc); // Add the decoder rows for (const GSList *l = decc->annotation_rows; l; l = l->next) { const srd_decoder_annotation_row *const ann_row = (srd_decoder_annotation_row *)l->data; assert(ann_row); - rows.emplace_back(decc, ann_row); + rows.emplace_back(row_index++, decc, ann_row); } } @@ -1159,9 +1161,10 @@ void DecodeSignal::create_decode_segment() const srd_decoder *const decc = dec->decoder(); assert(dec->decoder()); + int row_index = 0; // Add a row for the decoder if it doesn't have a row list if (!decc->annotation_rows) - (segments_.back().annotation_rows)[Row(decc)] = + (segments_.back().annotation_rows)[Row(row_index++, decc)] = decode::RowData(); // Add the decoder rows @@ -1170,7 +1173,7 @@ void DecodeSignal::create_decode_segment() (srd_decoder_annotation_row *)l->data; assert(ann_row); - const Row row(decc, ann_row); + const Row row(row_index++, decc, ann_row); // Add a new empty row data object (segments_.back().annotation_rows)[row] = @@ -1211,7 +1214,7 @@ void DecodeSignal::annotation_callback(srd_proto_data *pdata, void *decode_signa row_iter = ds->segments_.at(ds->current_segment_id_).annotation_rows.find((*r).second); else { // Failing that, use the decoder as a key - row_iter = ds->segments_.at(ds->current_segment_id_).annotation_rows.find(Row(decc)); + row_iter = ds->segments_.at(ds->current_segment_id_).annotation_rows.find(Row(0, decc)); } if (row_iter == ds->segments_.at(ds->current_segment_id_).annotation_rows.end()) { diff --git a/pv/views/trace/decodetrace.cpp b/pv/views/trace/decodetrace.cpp index 211d46e4..208185ac 100644 --- a/pv/views/trace/decodetrace.cpp +++ b/pv/views/trace/decodetrace.cpp @@ -196,8 +196,7 @@ void DecodeTrace::paint_mid(QPainter &p, ViewItemPaintParams &pp) current_segment_, sample_range.first, sample_range.second); if (!annotations.empty()) { draw_annotations(annotations, p, annotation_height, pp, y, - get_row_color(visible_rows_.size()), row_title_width); - + get_row_color(row.index()), row_title_width); y += row_height_; visible_rows_.push_back(row); } -- 2.30.2