X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=pv%2Fview%2Fdecodetrace.cpp;h=bad849c04665b2c53680836f610fdd329bc8ccd8;hb=613d097c5af2d12ffd68e2dfab309b518edca1a6;hp=7e2051a4022202ff77ea496e5259c147f07475e9;hpb=7491a29f33471b38e161b3254f4d8e708b05f929;p=pulseview.git diff --git a/pv/view/decodetrace.cpp b/pv/view/decodetrace.cpp index 7e2051a4..bad849c0 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,9 +147,12 @@ 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(); + 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)); @@ -198,8 +207,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 +217,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 +233,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 +247,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 +257,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( @@ -346,6 +365,18 @@ void DecodeTrace::on_stack_decoder(srd_decoder *decoder) _decoder_stack->push(shared_ptr( new data::decode::Decoder(decoder))); _decoder_stack->begin_decode(); + + 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