#include "row.h"
+#include <libsigrokdecode/libsigrokdecode.h>
+
namespace pv {
namespace data {
namespace decode {
return _row;
}
+const QString Row::title() const
+{
+ if (_decoder && _decoder->name && _row && _row->desc)
+ return QString("%1: %2")
+ .arg(QString::fromUtf8(_decoder->name))
+ .arg(QString::fromUtf8(_row->desc));
+ if (_decoder && _decoder->name)
+ return QString::fromUtf8(_decoder->name);
+ if (_row && _row->desc)
+ return QString::fromUtf8(_row->desc);
+ return QString();
+}
+
bool Row::operator<(const Row &other) const
{
return (_decoder < other._decoder) ||
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;
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;
samples_per_pixel, pixels_offset, y,
base_colour);
y += row_height;
+
+ _cur_row_headings.push_back(row.title());
}
}
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;
static const QColor ErrorBgColour;
static const QColor NoDecodeColour;
+ static const int ArrowSize;
static const double EndCapWidth;
static const int DrawPadding;
**/
void paint_mid(QPainter &p, int left, int right);
+ /**
+ * Paints the foreground layer of the trace with a QPainter
+ * @param p the QPainter to paint into.
+ * @param left the x-coordinate of the left edge of the signal
+ * @param right the x-coordinate of the right edge of the signal
+ **/
+ void paint_fore(QPainter &p, int left, int right);
+
void populate_popup_form(QWidget *parent, QFormLayout *form);
QMenu* create_context_menu(QWidget *parent);
std::list<ProbeSelector> _probe_selectors;
std::vector<pv::widgets::DecoderGroupBox*> _decoder_forms;
+ std::vector<QString> _cur_row_headings;
+
QSignalMapper _delete_mapper, _show_hide_mapper;
};