X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=signal.cpp;h=436d6ba17d2787f75bfef32e44b494fd8480795d;hp=d35be6bfed5dfecae1382525f2885732ec9ff206;hb=77e8ac522c85ca2a54e9d400fe3ea1d304f4347a;hpb=2858b391af20bd46c9a7da17195ec8d58bcd12c3 diff --git a/signal.cpp b/signal.cpp index d35be6bf..436d6ba1 100644 --- a/signal.cpp +++ b/signal.cpp @@ -20,7 +20,9 @@ #include "signal.h" -#include +#include "extdef.h" + +const QSizeF Signal::LabelPadding(4, 0); Signal::Signal(QString name) : _name(name) @@ -31,3 +33,57 @@ QString Signal::get_name() const { return _name; } + +void Signal::paint_label(QPainter &p, const QRect &rect) +{ + p.setBrush(get_colour()); + + const QString text(_name); + const QColor colour = get_colour(); + + const QSizeF text_size = p.boundingRect( + QRectF(0, 0, rect.width(), 0), 0, text).size(); + + const float nominal_offset = get_nominal_offset(rect); + const QSizeF label_size( + text_size.width() + LabelPadding.width() * 2, + text_size.height() + LabelPadding.height() * 2); + const float label_arrow_length = label_size.height() / 2; + const QRectF label_rect( + rect.right() - label_arrow_length - label_size.width(), + nominal_offset - label_size.height() / 2, + label_size.width(), label_size.height()); + + // Paint the label + const QPointF points[] = { + label_rect.topLeft(), + label_rect.topRight(), + QPointF(rect.right(), nominal_offset), + label_rect.bottomRight(), + label_rect.bottomLeft() + }; + + const QPointF highlight_points[] = { + QPointF(label_rect.left() + 1, label_rect.top() + 1), + QPointF(label_rect.right(), label_rect.top() + 1), + QPointF(rect.right() - 1, nominal_offset), + QPointF(label_rect.right(), label_rect.bottom() - 1), + QPointF(label_rect.left() + 1, label_rect.bottom() - 1) + }; + + p.setPen(Qt::transparent); + p.setBrush(colour); + p.drawPolygon(points, countof(points)); + + p.setPen(colour.lighter()); + p.setBrush(Qt::transparent); + p.drawPolygon(highlight_points, countof(highlight_points)); + + p.setPen(colour.darker()); + p.setBrush(Qt::transparent); + p.drawPolygon(points, countof(points)); + + // Paint the text + p.setPen((colour.lightness() > 64) ? Qt::black : Qt::white); + p.drawText(label_rect, Qt::AlignCenter | Qt::AlignVCenter, text); +}