X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fview%2Fdecodetrace.cpp;h=22d8f2dce06ceff5b0c46e8a185550ce52fc81ba;hp=e275a112ba82d889c0f5b0a51613e2f6b4c91d5d;hb=dd048a7ec035447c051c7937ce04aca5be065b4e;hpb=06e810f29b6e9e3fe8ba8aba5d3823375da9bbb2 diff --git a/pv/view/decodetrace.cpp b/pv/view/decodetrace.cpp index e275a112..22d8f2dc 100644 --- a/pv/view/decodetrace.cpp +++ b/pv/view/decodetrace.cpp @@ -47,8 +47,13 @@ extern "C" { #include #include -using namespace boost; -using namespace std; +using boost::dynamic_pointer_cast; +using boost::shared_ptr; +using std::list; +using std::max; +using std::map; +using std::min; +using std::vector; namespace pv { namespace view { @@ -78,9 +83,11 @@ const QColor DecodeTrace::Colours[7] = { DecodeTrace::DecodeTrace(pv::SigSession &session, boost::shared_ptr decoder_stack, int index) : - Trace(session, QString(decoder_stack->stack().front()->decoder()->name)), + Trace(session, QString::fromUtf8( + decoder_stack->stack().front()->decoder()->name)), _decoder_stack(decoder_stack), - _delete_mapper(this) + _delete_mapper(this), + _show_hide_mapper(this) { assert(_decoder_stack); @@ -90,6 +97,8 @@ DecodeTrace::DecodeTrace(pv::SigSession &session, this, SLOT(on_new_decode_data())); connect(&_delete_mapper, SIGNAL(mapped(int)), this, SLOT(on_delete_decoder(int))); + connect(&_show_hide_mapper, SIGNAL(mapped(int)), + this, SLOT(on_show_hide_decoder(int))); } bool DecodeTrace::enabled() const @@ -116,7 +125,7 @@ void DecodeTrace::paint_back(QPainter &p, int left, int right) void DecodeTrace::paint_mid(QPainter &p, int left, int right) { - using pv::data::decode::Annotation; + using namespace pv::data::decode; const double scale = _view->scale(); assert(scale > 0); @@ -131,29 +140,50 @@ void DecodeTrace::paint_mid(QPainter &p, int left, int right) _decoder_stack->get_start_time()) / scale; const double samples_per_pixel = samplerate * scale; + const uint64_t start_sample = (uint64_t)max((left + pixels_offset) * + samples_per_pixel, 0.0); + const uint64_t end_sample = (uint64_t)max((right + pixels_offset) * + samples_per_pixel, 0.0); + QFontMetrics m(QApplication::font()); - const int h = (m.boundingRect(QRect(), 0, "Tg").height() * 5) / 4; + const int text_height = m.boundingRect(QRect(), 0, "Tg").height(); + const int annotation_height = (text_height * 5) / 4; + const int row_height = (text_height * 6) / 4; assert(_decoder_stack); const QString err = _decoder_stack->error_message(); if (!err.isEmpty()) { draw_error(p, err, left, right); - draw_unresolved_period(p, h, left, right, samples_per_pixel, - pixels_offset); + draw_unresolved_period(p, annotation_height, left, right, + samples_per_pixel, pixels_offset); return; } + // Iterate through the rows assert(_view); - const int y = get_y(); + int y = get_y(); assert(_decoder_stack); - vector annotations(_decoder_stack->annotations()); - BOOST_FOREACH(const Annotation &a, annotations) - draw_annotation(a, p, get_text_colour(), h, left, right, - samples_per_pixel, pixels_offset, y); - draw_unresolved_period(p, h, left, right, + const vector rows(_decoder_stack->get_visible_rows()); + for (size_t i = 0; i < rows.size(); i++) + { + const Row &row = rows[i]; + vector annotations; + _decoder_stack->get_annotation_subset(annotations, row, + start_sample, end_sample); + if (!annotations.empty()) { + BOOST_FOREACH(const Annotation &a, annotations) + draw_annotation(a, p, get_text_colour(), + annotation_height, left, right, + samples_per_pixel, pixels_offset, y, i); + y += row_height; + } + } + + // Draw the hatching + draw_unresolved_period(p, annotation_height, left, right, samples_per_pixel, pixels_offset); } @@ -171,6 +201,7 @@ void DecodeTrace::populate_popup_form(QWidget *parent, QFormLayout *form) // Add the decoder options _bindings.clear(); _probe_selectors.clear(); + _decoder_forms.clear(); const list< shared_ptr >& stack = _decoder_stack->stack(); @@ -225,14 +256,14 @@ QMenu* DecodeTrace::create_context_menu(QWidget *parent) void DecodeTrace::draw_annotation(const pv::data::decode::Annotation &a, QPainter &p, QColor text_color, int h, int left, int right, double samples_per_pixel, - double pixels_offset, int y) const + double pixels_offset, int y, unsigned int row_index) const { const double start = a.start_sample() / samples_per_pixel - pixels_offset; const double end = a.end_sample() / samples_per_pixel - pixels_offset; - const QColor fill = Colours[(a.format() * (countof(Colours) / 2 + 1)) % - countof(Colours)]; + const QColor fill = Colours[((row_index * 2 + a.format()) * + (countof(Colours) / 4 + 1)) % countof(Colours)]; const QColor outline(fill.darker()); if (start > right + DrawPadding || end < left - DrawPadding) @@ -403,11 +434,17 @@ void DecodeTrace::create_decoder_form(int index, assert(decoder); pv::widgets::DecoderGroupBox *const group = - new pv::widgets::DecoderGroupBox(decoder->name); + new pv::widgets::DecoderGroupBox( + QString::fromUtf8(decoder->name)); + group->set_decoder_visible(dec->shown()); _delete_mapper.setMapping(group, index); connect(group, SIGNAL(delete_decoder()), &_delete_mapper, SLOT(map())); + _show_hide_mapper.setMapping(group, index); + connect(group, SIGNAL(show_hide_decoder()), + &_show_hide_mapper, SLOT(map())); + QFormLayout *const decoder_form = new QFormLayout; group->add_layout(decoder_form); @@ -447,6 +484,7 @@ void DecodeTrace::create_decoder_form(int index, _bindings.push_back(binding); form->addRow(group); + _decoder_forms.push_back(group); } QComboBox* DecodeTrace::create_probe_selector( @@ -564,5 +602,28 @@ void DecodeTrace::on_delete_decoder(int index) _decoder_stack->begin_decode(); } +void DecodeTrace::on_show_hide_decoder(int index) +{ + using pv::data::decode::Decoder; + + const list< shared_ptr > stack(_decoder_stack->stack()); + + // Find the decoder in the stack + list< shared_ptr >::const_iterator iter = stack.begin(); + for(int i = 0; i < index; i++, iter++) + assert(iter != stack.end()); + + shared_ptr dec = *iter; + assert(dec); + + const bool show = !dec->shown(); + dec->show(show); + + assert(index < (int)_decoder_forms.size()); + _decoder_forms[index]->set_decoder_visible(show); + + _view->update_viewport(); +} + } // namespace view } // namespace pv