]> sigrok.org Git - pulseview.git/blobdiff - pv/views/trace/decodetrace.cpp
Shift more methods to DecodeSignal
[pulseview.git] / pv / views / trace / decodetrace.cpp
index 6ccd3fb87dc085f9c50b9baa109645ac68c9b213..dfc1fe5d321a93d3430cf62529892ea11c36900e 100644 (file)
@@ -43,13 +43,14 @@ extern "C" {
 #include "viewport.hpp"
 
 #include <pv/globalsettings.hpp>
+#include <pv/session.hpp>
+#include <pv/strnatcmp.hpp>
+#include <pv/data/decodesignal.hpp>
 #include <pv/data/decode/annotation.hpp>
 #include <pv/data/decode/decoder.hpp>
 #include <pv/data/decoderstack.hpp>
 #include <pv/data/logic.hpp>
 #include <pv/data/logicsegment.hpp>
-#include <pv/session.hpp>
-#include <pv/strnatcmp.hpp>
 #include <pv/widgets/decodergroupbox.hpp>
 #include <pv/widgets/decodermenu.hpp>
 
@@ -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<pv::data::DecoderStack> decoder_stack = base_->decoder_stack();
+       decode_signal_ = dynamic_pointer_cast<data::DecodeSignal>(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<pv::data::DecoderStack> 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<uint64_t, uint64_t> sample_range = get_sample_range(
                pp.left(), pp.right());
 
-       const vector<Row> rows(decoder_stack->get_visible_rows());
+       const vector<Row> 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<Annotation> 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<pv::data::DecoderStack> 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<Decoder> >& stack = decoder_stack->stack();
+       const list< shared_ptr<Decoder> >& 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<pv::data::DecoderStack> decoder_stack = base_->decoder_stack();
-
-       assert(decoder);
-       assert(decoder_stack);
-       decoder_stack->push(make_shared<data::decode::Decoder>(decoder));
-       decoder_stack->begin_decode();
+       decode_signal_->stack_decoder(decoder);
 
        create_popup_form();
 }
 
 void DecodeTrace::on_delete_decoder(int index)
 {
-       shared_ptr<pv::data::DecoderStack> 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<pv::data::DecoderStack> decoder_stack = base_->decoder_stack();
-
-       const list< shared_ptr<Decoder> > 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<Decoder> 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);