#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>
using std::unordered_set;
using std::vector;
+using pv::data::decode::Annotation;
+using pv::data::decode::Row;
+
namespace pv {
namespace views {
namespace trace {
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)),
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());
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) {
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,
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++) {
{
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);
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(
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;
decoder_stack->begin_decode();
}
-void DecodeTrace::on_new_decode_data()
+void DecodeTrace::on_new_annotations()
{
if (owner_)
owner_->row_item_appearance_changed(false, true);
void DecodeTrace::on_delete()
{
- session_.remove_decode_signal(base_);
+ session_.remove_decode_signal(decode_signal_);
}
void DecodeTrace::on_channel_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);