X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fview%2Fdecodetrace.cpp;h=c3bc1dff0a4981170e86b748fe8f45c1a7206b33;hp=2ec84481b407c847996ca3c69e22075997b883c6;hb=8bd26d8b9c831b509ee3241ea4dac6f50c023622;hpb=287d607f16c890e33355337436f182205baf466c diff --git a/pv/view/decodetrace.cpp b/pv/view/decodetrace.cpp index 2ec84481..c3bc1dff 100644 --- a/pv/view/decodetrace.cpp +++ b/pv/view/decodetrace.cpp @@ -25,6 +25,7 @@ extern "C" { #include #include +#include #include #include @@ -68,6 +69,7 @@ const QColor DecodeTrace::DecodeColours[4] = { const QColor DecodeTrace::ErrorBgColour = QColor(0xEF, 0x29, 0x29); const QColor DecodeTrace::NoDecodeColour = QColor(0x88, 0x8A, 0x85); +const int DecodeTrace::ArrowSize = 4; const double DecodeTrace::EndCapWidth = 5; const int DecodeTrace::DrawPadding = 100; @@ -111,8 +113,9 @@ const QColor DecodeTrace::OutlineColours[16] = { DecodeTrace::DecodeTrace(pv::SigSession &session, boost::shared_ptr decoder_stack, int index) : - Trace(session, QString::fromUtf8( + Trace(QString::fromUtf8( decoder_stack->stack().front()->decoder()->name)), + _session(session), _decoder_stack(decoder_stack), _delete_mapper(this), _show_hide_mapper(this) @@ -160,6 +163,8 @@ void DecodeTrace::paint_mid(QPainter &p, int left, int right) double samplerate = _decoder_stack->samplerate(); + _cur_row_headings.clear(); + // Show sample rate as 1Hz when it is unknown if (samplerate == 0.0) samplerate = 1.0; @@ -182,9 +187,9 @@ void DecodeTrace::paint_mid(QPainter &p, int left, int right) const QString err = _decoder_stack->error_message(); if (!err.isEmpty()) { - draw_error(p, err, left, right); draw_unresolved_period(p, annotation_height, left, right, samples_per_pixel, pixels_offset); + draw_error(p, err, left, right); return; } @@ -215,6 +220,8 @@ void DecodeTrace::paint_mid(QPainter &p, int left, int right) samples_per_pixel, pixels_offset, y, base_colour); y += row_height; + + _cur_row_headings.push_back(row.title()); } } @@ -223,6 +230,52 @@ void DecodeTrace::paint_mid(QPainter &p, int left, int right) samples_per_pixel, pixels_offset); } +void DecodeTrace::paint_fore(QPainter &p, int left, int right) +{ + using namespace pv::data::decode; + + (void)right; + + QFontMetrics m(QApplication::font()); + const int text_height = m.boundingRect(QRect(), 0, "Tg").height(); + const int row_height = (text_height * 6) / 4; + + for (size_t i = 0; i < _cur_row_headings.size(); i++) + { + const int y = i * row_height + get_y(); + + p.setPen(QPen(Qt::NoPen)); + p.setBrush(QApplication::palette().brush(QPalette::WindowText)); + + if (i != 0) + { + const QPointF points[] = { + QPointF(left, y - ArrowSize), + QPointF(left + ArrowSize, y), + QPointF(left, y + ArrowSize) + }; + p.drawPolygon(points, countof(points)); + } + + const QRect r(left + ArrowSize * 2, y - row_height / 2, + right - left, row_height); + const QString h(_cur_row_headings[i]); + const int f = Qt::AlignLeft | Qt::AlignVCenter | + Qt::TextDontClip; + + // Draw the outline + p.setPen(QApplication::palette().color(QPalette::Base)); + for (int dx = -1; dx <= 1; dx++) + for (int dy = -1; dy <= 1; dy++) + if (dx != 0 && dy != 0) + p.drawText(r.translated(dx, dy), f, h); + + // Draw the text + p.setPen(QApplication::palette().color(QPalette::WindowText)); + p.drawText(r, f, h); + } +} + void DecodeTrace::populate_popup_form(QWidget *parent, QFormLayout *form) { using pv::data::decode::Decoder; @@ -258,7 +311,7 @@ void DecodeTrace::populate_popup_form(QWidget *parent, QFormLayout *form) } form->addRow(new QLabel( - tr("* Required Probes"), parent)); + tr("* Required channels"), parent)); } // Add stacking button @@ -368,6 +421,9 @@ void DecodeTrace::draw_range(const pv::data::decode::Annotation &a, QPainter &p, QRectF rect(start + cap_width, y - h / 2, end - start - cap_width * 2, h); + if (rect.width() <= 4) + return; + p.setPen(text_color); // Try to find an annotation that will fit @@ -426,8 +482,8 @@ void DecodeTrace::draw_unresolved_period(QPainter &p, int h, int left, // This works because we are currently assuming all // LogicSignals have the same data/snapshot BOOST_FOREACH (const shared_ptr &dec, stack) - if (dec && !dec->probes().empty() && - ((logic_signal = (*dec->probes().begin()).second)) && + if (dec && !dec->channels().empty() && + ((logic_signal = (*dec->channels().begin()).second)) && ((data = logic_signal->logic_data()))) break; @@ -465,7 +521,7 @@ void DecodeTrace::create_decoder_form(int index, shared_ptr &dec, QWidget *parent, QFormLayout *form) { - const GSList *probe; + const GSList *l; assert(dec); const srd_decoder *const decoder = dec->decoder(); @@ -486,31 +542,33 @@ void DecodeTrace::create_decoder_form(int index, QFormLayout *const decoder_form = new QFormLayout; group->add_layout(decoder_form); - // Add the mandatory probes - for(probe = decoder->probes; probe; probe = probe->next) { - const struct srd_probe *const p = - (struct srd_probe *)probe->data; - QComboBox *const combo = create_probe_selector(parent, dec, p); + // Add the mandatory channels + for(l = decoder->channels; l; l = l->next) { + const struct srd_channel *const pdch = + (struct srd_channel *)l->data; + QComboBox *const combo = create_probe_selector(parent, dec, pdch); connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(on_probe_selected(int))); decoder_form->addRow(tr("%1 (%2) *") - .arg(p->name).arg(p->desc), combo); + .arg(QString::fromUtf8(pdch->name)) + .arg(QString::fromUtf8(pdch->desc)), combo); - const ProbeSelector s = {combo, dec, p}; + const ProbeSelector s = {combo, dec, pdch}; _probe_selectors.push_back(s); } - // Add the optional probes - for(probe = decoder->opt_probes; probe; probe = probe->next) { - const struct srd_probe *const p = - (struct srd_probe *)probe->data; - QComboBox *const combo = create_probe_selector(parent, dec, p); + // Add the optional channels + for(l = decoder->opt_channels; l; l = l->next) { + const struct srd_channel *const pdch = + (struct srd_channel *)l->data; + QComboBox *const combo = create_probe_selector(parent, dec, pdch); connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(on_probe_selected(int))); decoder_form->addRow(tr("%1 (%2)") - .arg(p->name).arg(p->desc), combo); + .arg(QString::fromUtf8(pdch->name)) + .arg(QString::fromUtf8(pdch->desc)), combo); - const ProbeSelector s = {combo, dec, p}; + const ProbeSelector s = {combo, dec, pdch}; _probe_selectors.push_back(s); } @@ -527,22 +585,22 @@ void DecodeTrace::create_decoder_form(int index, QComboBox* DecodeTrace::create_probe_selector( QWidget *parent, const shared_ptr &dec, - const srd_probe *const probe) + const srd_channel *const pdch) { assert(dec); const vector< shared_ptr > sigs = _session.get_signals(); assert(_decoder_stack); - const map >::const_iterator probe_iter = - dec->probes().find(probe); + dec->channels().find(pdch); QComboBox *selector = new QComboBox(parent); selector->addItem("-", qVariantFromValue((void*)NULL)); - if (probe_iter == dec->probes().end()) + if (probe_iter == dec->channels().end()) selector->setCurrentIndex(0); for(size_t i = 0; i < sigs.size(); i++) { @@ -565,7 +623,7 @@ void DecodeTrace::commit_decoder_probes(shared_ptr &dec) { assert(dec); - map > probe_map; + map > probe_map; const vector< shared_ptr > sigs = _session.get_signals(); BOOST_FOREACH(const ProbeSelector &s, _probe_selectors) @@ -579,7 +637,7 @@ void DecodeTrace::commit_decoder_probes(shared_ptr &dec) BOOST_FOREACH(shared_ptr sig, sigs) if(sig.get() == selection) { - probe_map[s._probe] = + probe_map[s._pdch] = dynamic_pointer_cast(sig); break; }