X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fviews%2Ftrace%2Fdecodetrace.cpp;h=dfc1fe5d321a93d3430cf62529892ea11c36900e;hp=6ccd3fb87dc085f9c50b9baa109645ac68c9b213;hb=ecd07c20d34ce940163ac2e7fb26cb7ceac565bb;hpb=1573bf16ba50d1c023ad3a9ce596f0ab6eaeacff diff --git a/pv/views/trace/decodetrace.cpp b/pv/views/trace/decodetrace.cpp index 6ccd3fb8..dfc1fe5d 100644 --- a/pv/views/trace/decodetrace.cpp +++ b/pv/views/trace/decodetrace.cpp @@ -43,13 +43,14 @@ extern "C" { #include "viewport.hpp" #include +#include +#include +#include #include #include #include #include #include -#include -#include #include #include @@ -68,6 +69,9 @@ using std::tie; using std::unordered_set; using std::vector; +using pv::data::decode::Annotation; +using pv::data::decode::Row; + namespace pv { namespace views { namespace trace { @@ -134,17 +138,16 @@ DecodeTrace::DecodeTrace(pv::Session &session, delete_mapper_(this), show_hide_mapper_(this) { - shared_ptr decoder_stack = base_->decoder_stack(); + decode_signal_ = dynamic_pointer_cast(base_); // Determine shortest string we want to see displayed in full QFontMetrics m(QApplication::font()); min_useful_label_width_ = m.width("XX"); // e.g. two hex characters - base_->set_name(QString::fromUtf8(decoder_stack->stack().front()->decoder()->name)); base_->set_colour(DecodeColours[index % countof(DecodeColours)]); - connect(decoder_stack.get(), SIGNAL(new_decode_data()), - this, SLOT(on_new_decode_data())); + connect(decode_signal_.get(), SIGNAL(new_annotations()), + this, SLOT(on_new_annotations())); connect(&delete_mapper_, SIGNAL(mapped(int)), this, SLOT(on_delete_decoder(int))); connect(&show_hide_mapper_, SIGNAL(mapped(int)), @@ -179,16 +182,11 @@ void DecodeTrace::paint_back(QPainter &p, ViewItemPaintParams &pp) void DecodeTrace::paint_mid(QPainter &p, ViewItemPaintParams &pp) { - using namespace pv::data::decode; - - shared_ptr decoder_stack = base_->decoder_stack(); - const int text_height = ViewItemPaintParams::text_height(); row_height_ = (text_height * 6) / 4; const int annotation_height = (text_height * 5) / 4; - assert(decoder_stack); - const QString err = decoder_stack->error_message(); + const QString err = decode_signal_->error_message(); if (!err.isEmpty()) { draw_unresolved_period( p, annotation_height, pp.left(), pp.right()); @@ -204,7 +202,7 @@ void DecodeTrace::paint_mid(QPainter &p, ViewItemPaintParams &pp) pair sample_range = get_sample_range( pp.left(), pp.right()); - const vector rows(decoder_stack->get_visible_rows()); + const vector rows = decode_signal_->visible_rows(); visible_rows_.clear(); for (const Row& row : rows) { @@ -227,7 +225,7 @@ void DecodeTrace::paint_mid(QPainter &p, ViewItemPaintParams &pp) base_colour >>= 16; vector annotations; - decoder_stack->get_annotation_subset(annotations, row, + decode_signal_->get_annotation_subset(annotations, row, sample_range.first, sample_range.second); if (!annotations.empty()) { draw_annotations(annotations, p, annotation_height, pp, y, @@ -251,8 +249,6 @@ void DecodeTrace::paint_mid(QPainter &p, ViewItemPaintParams &pp) void DecodeTrace::paint_fore(QPainter &p, ViewItemPaintParams &pp) { - using namespace pv::data::decode; - assert(row_height_); for (size_t i = 0; i < visible_rows_.size(); i++) { @@ -293,11 +289,7 @@ void DecodeTrace::populate_popup_form(QWidget *parent, QFormLayout *form) { using pv::data::decode::Decoder; - shared_ptr decoder_stack = base_->decoder_stack(); - assert(form); - assert(parent); - assert(decoder_stack); // Add the standard options Trace::populate_popup_form(parent, form); @@ -307,7 +299,8 @@ void DecodeTrace::populate_popup_form(QWidget *parent, QFormLayout *form) channel_selectors_.clear(); decoder_forms_.clear(); - const list< shared_ptr >& stack = decoder_stack->stack(); + const list< shared_ptr >& stack = + decode_signal_->decoder_stack_list(); if (stack.empty()) { QLabel *const l = new QLabel( @@ -583,7 +576,7 @@ void DecodeTrace::draw_error(QPainter &p, const QString &message, p.setBrush(ErrorBgColour); const QRectF bounding_rect = - QRectF(pp.width(), INT_MIN / 2 + y, pp.width(), INT_MAX); + QRectF(pp.left(), INT_MIN / 2 + y, pp.right(), INT_MAX); const QRectF text_rect = p.boundingRect(bounding_rect, Qt::AlignCenter, message); const float r = text_rect.height() / 4; @@ -985,7 +978,7 @@ void DecodeTrace::commit_channels() decoder_stack->begin_decode(); } -void DecodeTrace::on_new_decode_data() +void DecodeTrace::on_new_annotations() { if (owner_) owner_->row_item_appearance_changed(false, true); @@ -998,7 +991,7 @@ void DecodeTrace::delete_pressed() void DecodeTrace::on_delete() { - session_.remove_decode_signal(base_); + session_.remove_decode_signal(decode_signal_); } void DecodeTrace::on_channel_selected(int) @@ -1013,49 +1006,25 @@ void DecodeTrace::on_initial_pin_selected(int) void DecodeTrace::on_stack_decoder(srd_decoder *decoder) { - shared_ptr decoder_stack = base_->decoder_stack(); - - assert(decoder); - assert(decoder_stack); - decoder_stack->push(make_shared(decoder)); - decoder_stack->begin_decode(); + decode_signal_->stack_decoder(decoder); create_popup_form(); } void DecodeTrace::on_delete_decoder(int index) { - shared_ptr decoder_stack = base_->decoder_stack(); - - decoder_stack->remove(index); + decode_signal_->remove_decoder(index); // Update the popup create_popup_form(); - - decoder_stack->begin_decode(); } void DecodeTrace::on_show_hide_decoder(int index) { - using pv::data::decode::Decoder; - - shared_ptr decoder_stack = base_->decoder_stack(); - - const list< shared_ptr > stack(decoder_stack->stack()); - - // Find the decoder in the stack - auto iter = stack.cbegin(); - 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); + const bool state = decode_signal_->toggle_decoder_visibility(index); assert(index < (int)decoder_forms_.size()); - decoder_forms_[index]->set_decoder_visible(show); + decoder_forms_[index]->set_decoder_visible(state); if (owner_) owner_->row_item_appearance_changed(false, true);