X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=pv%2Fview%2Fdecodetrace.cpp;h=b67c0f7abeb256d0ae472f456d878b9cca5c468c;hb=5069084a51b248fceaa123f451bad3d8fb01d2fb;hp=d3d10b6981953eaf02651a572c30d4f53e89cec9;hpb=37fd11b167b2c258610b629bc4e17fc158b13a48;p=pulseview.git diff --git a/pv/view/decodetrace.cpp b/pv/view/decodetrace.cpp index d3d10b69..b67c0f7a 100644 --- a/pv/view/decodetrace.cpp +++ b/pv/view/decodetrace.cpp @@ -41,6 +41,7 @@ extern "C" { #include #include #include +#include #include using namespace boost; @@ -61,7 +62,8 @@ const QColor DecodeTrace::ErrorBgColour = QColor(0xEF, 0x29, 0x29); DecodeTrace::DecodeTrace(pv::SigSession &session, boost::shared_ptr decoder_stack, int index) : Trace(session, QString(decoder_stack->stack().front()->decoder()->name)), - _decoder_stack(decoder_stack) + _decoder_stack(decoder_stack), + _delete_mapper(this) { assert(_decoder_stack); @@ -69,6 +71,8 @@ DecodeTrace::DecodeTrace(pv::SigSession &session, connect(_decoder_stack.get(), SIGNAL(new_decode_data()), this, SLOT(on_new_decode_data())); + connect(&_delete_mapper, SIGNAL(mapped(int)), + this, SLOT(on_delete_decoder(int))); } bool DecodeTrace::enabled() const @@ -130,6 +134,8 @@ void DecodeTrace::paint_mid(QPainter &p, int left, int right) void DecodeTrace::populate_popup_form(QWidget *parent, QFormLayout *form) { + using pv::data::decode::Decoder; + assert(form); assert(parent); assert(_decoder_stack); @@ -141,12 +147,27 @@ void DecodeTrace::populate_popup_form(QWidget *parent, QFormLayout *form) _bindings.clear(); _probe_selectors.clear(); - BOOST_FOREACH(shared_ptr dec, - _decoder_stack->stack()) - create_decoder_form(dec, parent, form); + const list< shared_ptr >& stack = _decoder_stack->stack(); - form->addRow(new QLabel( - tr("* Required Probes"), parent)); + if (stack.empty()) + { + QLabel *const l = new QLabel( + tr("

No decoders in the stack

")); + l->setAlignment(Qt::AlignCenter); + form->addRow(l); + } + else + { + list< shared_ptr >::const_iterator iter = + stack.begin(); + for (int i = 0; i < (int)stack.size(); i++, iter++) { + shared_ptr dec(*iter); + create_decoder_form(i, dec, parent, form); + } + + form->addRow(new QLabel( + tr("* Required Probes"), parent)); + } // Add stacking button pv::widgets::DecoderMenu *const decoder_menu = @@ -198,8 +219,9 @@ void DecodeTrace::draw_error(QPainter &p, const QString &message, p.drawText(text_rect, message); } -void DecodeTrace::create_decoder_form(shared_ptr &dec, - QWidget *parent, QFormLayout *form) +void DecodeTrace::create_decoder_form(int index, + shared_ptr &dec, QWidget *parent, + QFormLayout *form) { const GSList *probe; @@ -207,7 +229,14 @@ void DecodeTrace::create_decoder_form(shared_ptr &dec, const srd_decoder *const decoder = dec->decoder(); assert(decoder); - form->addRow(new QLabel(tr("

%1

").arg(decoder->name), parent)); + pv::widgets::DecoderGroupBox *const group = + new pv::widgets::DecoderGroupBox(decoder->name); + + _delete_mapper.setMapping(group, index); + connect(group, SIGNAL(delete_decoder()), &_delete_mapper, SLOT(map())); + + QFormLayout *const decoder_form = new QFormLayout; + group->add_layout(decoder_form); // Add the mandatory probes for(probe = decoder->probes; probe; probe = probe->next) { @@ -216,7 +245,7 @@ void DecodeTrace::create_decoder_form(shared_ptr &dec, QComboBox *const combo = create_probe_selector(parent, dec, p); connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(on_probe_selected(int))); - form->addRow(tr("%1 (%2) *") + decoder_form->addRow(tr("%1 (%2) *") .arg(p->name).arg(p->desc), combo); const ProbeSelector s = {combo, dec, p}; @@ -230,7 +259,7 @@ void DecodeTrace::create_decoder_form(shared_ptr &dec, QComboBox *const combo = create_probe_selector(parent, dec, p); connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(on_probe_selected(int))); - form->addRow(tr("%1 (%2)") + decoder_form->addRow(tr("%1 (%2)") .arg(p->name).arg(p->desc), combo); const ProbeSelector s = {combo, dec, p}; @@ -240,9 +269,11 @@ void DecodeTrace::create_decoder_form(shared_ptr &dec, // Add the options shared_ptr binding( new prop::binding::DecoderOptions(_decoder_stack, dec)); - binding->add_properties_to_form(form, true); + binding->add_properties_to_form(decoder_form, true); _bindings.push_back(binding); + + form->addRow(group); } QComboBox* DecodeTrace::create_probe_selector( @@ -350,5 +381,15 @@ void DecodeTrace::on_stack_decoder(srd_decoder *decoder) create_popup_form(); } +void DecodeTrace::on_delete_decoder(int index) +{ + _decoder_stack->remove(index); + + // Update the popup + create_popup_form(); + + _decoder_stack->begin_decode(); +} + } // namespace view } // namespace pv