return annotations_.back().end_sample();
}
+uint64_t RowData::get_annotation_count() const
+{
+ return annotations_.size();
+}
+
void RowData::get_annotation_subset(
vector<pv::data::decode::Annotation> &dest,
uint64_t start_sample, uint64_t end_sample) const
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
return result;
}
-vector<Row> DecodeSignal::get_rows(bool visible_only) const
+vector<Row> DecodeSignal::get_rows() const
{
lock_guard<mutex> lock(output_mutex_);
for (const shared_ptr<decode::Decoder>& dec : stack_) {
assert(dec);
- if (visible_only && !dec->shown())
- continue;
-
const srd_decoder *const decc = dec->decoder();
assert(dec->decoder());
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<const decode::Row, decode::RowData> *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<pv::data::decode::Annotation> &dest,
const decode::Row &row, uint32_t segment_id, uint64_t start_sample,
{
// Note: We put all vectors and lists on the heap, not the stack
- const vector<Row> rows = get_rows(true);
+ const vector<Row> rows = get_rows();
// Use forward_lists for faster merging
forward_list<Annotation> *all_ann_list = new forward_list<Annotation>();
int64_t get_decoded_sample_count(uint32_t segment_id,
bool include_processing) const;
- vector<decode::Row> get_rows(bool visible_only) const;
+ vector<decode::Row> 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.
sample_range.second = min((int64_t)sample_range.second,
decode_signal_->get_decoded_sample_count(current_segment_, false));
- const vector<Row> rows = decode_signal_->get_rows(!always_show_all_rows_);
+ const vector<Row> rows = decode_signal_->get_rows();
visible_rows_.clear();
for (const Row& row : rows) {
vector<Annotation> 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_;