#include "decodetrace.hpp"
-#include <pv/sigsession.hpp>
+#include <pv/session.hpp>
#include <pv/data/decoderstack.hpp>
#include <pv/data/decode/decoder.hpp>
#include <pv/data/logic.hpp>
QColor(0x6B, 0x23, 0x37)
};
-DecodeTrace::DecodeTrace(pv::SigSession &session,
+DecodeTrace::DecodeTrace(pv::Session &session,
std::shared_ptr<pv::data::DecoderStack> decoder_stack, int index) :
Trace(QString::fromUtf8(
decoder_stack->stack().front()->decoder()->name)),
{
/// @todo Replace this with an implementation that knows the true
/// height of the trace
- QFontMetrics m(QApplication::font());
- const int text_height = m.boundingRect(QRect(), 0, "Tg").height();
- const int row_height = (text_height * 6) / 4;
+ const int row_height = (RowItemPaintParams::text_height() * 6) / 4;
return make_pair(-row_height / 2, row_height * 7 / 2);
}
-void DecodeTrace::paint_back(QPainter &p, int left, int right)
+void DecodeTrace::paint_back(QPainter &p, const RowItemPaintParams &pp)
{
- Trace::paint_back(p, left, right);
- paint_axis(p, get_visual_y(), left, right);
+ Trace::paint_back(p, pp);
+ paint_axis(p, pp, get_visual_y());
}
-void DecodeTrace::paint_mid(QPainter &p, int left, int right)
+void DecodeTrace::paint_mid(QPainter &p, const RowItemPaintParams &pp)
{
using namespace pv::data::decode;
- QFontMetrics m(QApplication::font());
- text_height_ = m.boundingRect(QRect(), 0, "Tg").height();
+ text_height_ = RowItemPaintParams::text_height();
row_height_ = (text_height_ * 6) / 4;
const int annotation_height = (text_height_ * 5) / 4;
const QString err = decoder_stack_->error_message();
if (!err.isEmpty())
{
- draw_unresolved_period(p, annotation_height, left, right);
- draw_error(p, err, left, right);
+ draw_unresolved_period(
+ p, annotation_height, pp.left(), pp.right());
+ draw_error(p, err, pp);
return;
}
// Iterate through the rows
int y = get_visual_y();
- pair<uint64_t, uint64_t> sample_range = get_sample_range(left, right);
+ pair<uint64_t, uint64_t> sample_range = get_sample_range(
+ pp.left(), pp.right());
assert(decoder_stack_);
const vector<Row> rows(decoder_stack_->get_visible_rows());
if (!annotations.empty()) {
for (const Annotation &a : annotations)
draw_annotation(a, p, get_text_colour(),
- annotation_height, left, right, y,
- base_colour);
+ annotation_height, pp, y, base_colour);
y += row_height_;
visible_rows_.push_back(rows[i]);
}
// Draw the hatching
- draw_unresolved_period(p, annotation_height, left, right);
+ draw_unresolved_period(p, annotation_height, pp.left(), pp.right());
}
-void DecodeTrace::paint_fore(QPainter &p, int left, int right)
+void DecodeTrace::paint_fore(QPainter &p, const RowItemPaintParams &pp)
{
using namespace pv::data::decode;
- (void)right;
-
assert(row_height_);
for (size_t i = 0; i < visible_rows_.size(); i++)
if (i != 0)
{
const QPointF points[] = {
- QPointF(left, y - ArrowSize),
- QPointF(left + ArrowSize, y),
- QPointF(left, y + ArrowSize)
+ QPointF(pp.left(), y - ArrowSize),
+ QPointF(pp.left() + ArrowSize, y),
+ QPointF(pp.left(), y + ArrowSize)
};
p.drawPolygon(points, countof(points));
}
- const QRect r(left + ArrowSize * 2, y - row_height_ / 2,
- right - left, row_height_);
+ const QRect r(pp.left() + ArrowSize * 2, y - row_height_ / 2,
+ pp.right() - pp.left(), row_height_);
const QString h(visible_rows_[i].title());
const int f = Qt::AlignLeft | Qt::AlignVCenter |
Qt::TextDontClip;
}
void DecodeTrace::draw_annotation(const pv::data::decode::Annotation &a,
- QPainter &p, QColor text_color, int h, int left, int right, int y,
+ QPainter &p, QColor text_color, int h, const RowItemPaintParams &pp, int y,
size_t base_colour) const
{
double samples_per_pixel, pixels_offset;
const QColor &fill = Colours[colour];
const QColor &outline = OutlineColours[colour];
- if (start > right + DrawPadding || end < left - DrawPadding)
+ if (start > pp.right() + DrawPadding || end < pp.left() - DrawPadding)
return;
if (a.start_sample() == a.end_sample())
}
void DecodeTrace::draw_error(QPainter &p, const QString &message,
- int left, int right)
+ const RowItemPaintParams &pp)
{
const int y = get_visual_y();
p.setBrush(ErrorBgColour);
const QRectF bounding_rect =
- QRectF(left, INT_MIN / 2 + y, right - left, INT_MAX);
+ QRectF(pp.width(), INT_MIN / 2 + y, pp.width(), INT_MAX);
const QRectF text_rect = p.boundingRect(bounding_rect,
Qt::AlignCenter, message);
const float r = text_rect.height() / 4;
((data = logic_signal->logic_data())))
break;
- if (!data || data->get_snapshots().empty())
+ if (!data || data->logic_snapshots().empty())
return;
const shared_ptr<LogicSnapshot> snapshot =
- data->get_snapshots().front();
+ data->logic_snapshots().front();
assert(snapshot);
const int64_t sample_count = (int64_t)snapshot->get_sample_count();
if (sample_count == 0)
QString ann = get_annotation_at_point(hp);
assert(view);
- assert(row_height_);
- if (ann.isEmpty()) {
+ if (!row_height_ || ann.isEmpty()) {
hide_hover_annotation();
return;
}