From: Joel Holdsworth Date: Thu, 5 Sep 2013 12:28:58 +0000 (+0100) Subject: Improved annotation painting X-Git-Tag: pulseview-0.2.0~295 X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=commitdiff_plain;h=1ae79b11b6b409aae986e379f9280115395c8cf5 Improved annotation painting --- diff --git a/pv/view/decode/annotation.cpp b/pv/view/decode/annotation.cpp index 741569b2..0cf5bad0 100644 --- a/pv/view/decode/annotation.cpp +++ b/pv/view/decode/annotation.cpp @@ -22,6 +22,10 @@ extern "C" { #include } +#include + +#include + #include #include "annotation.h" @@ -33,6 +37,8 @@ namespace pv { namespace view { namespace decode { +const double Annotation::EndCapWidth = 5; + Annotation::Annotation(const srd_proto_data *const pdata) : _start_sample(pdata->start_sample), _end_sample(pdata->end_sample) @@ -44,30 +50,45 @@ Annotation::Annotation(const srd_proto_data *const pdata) : } } -void Annotation::paint(QPainter &p, int left, int right, +void Annotation::paint(QPainter &p, QColor fill, QColor outline, + QColor text_color, int text_height, int left, int right, double samples_per_pixel, double pixels_offset, int y) { - const int AnnotationHeight = 40; + const int h = (text_height * 3) / 2; const double start = _start_sample / samples_per_pixel - pixels_offset; const double end = _end_sample / samples_per_pixel - pixels_offset; - if (start > right) - return; - if (end < left) + if (start > right || end < left) return; - QRectF rect(start, y - AnnotationHeight/2, - end - start, AnnotationHeight); + const double cap_width = min((end - start) / 2, EndCapWidth); + + QPointF pts[] = { + QPointF(start, y + .5f), + QPointF(start + cap_width, y + .5f - h / 2), + QPointF(end - cap_width, y + .5f - h / 2), + QPointF(end, y + .5f), + QPointF(end - cap_width, y + .5f + h / 2), + QPointF(start + cap_width, y + .5f + h / 2) + }; - p.setPen(Qt::black); - p.fillRect(rect, QBrush(Qt::red)); - p.drawRect(rect); + p.setPen(outline); + p.setBrush(fill); + p.drawConvexPolygon(pts, countof(pts)); - if(!_annotations.empty()) - p.drawText(rect, Qt::AlignCenter, _annotations.front()); + if (!_annotations.empty()) + { + QRectF rect(start + cap_width, y - h / 2, + end - start - cap_width * 2, h); + p.setPen(text_color); + p.drawText(rect, Qt::AlignCenter, + p.fontMetrics().elidedText( + _annotations.front(), Qt::ElideRight, + rect.width())); + } } } // namespace decode diff --git a/pv/view/decode/annotation.h b/pv/view/decode/annotation.h index 7ba7d367..baa96657 100644 --- a/pv/view/decode/annotation.h +++ b/pv/view/decode/annotation.h @@ -33,11 +33,15 @@ namespace decode { class Annotation { +private: + static const double EndCapWidth; + public: Annotation(const srd_proto_data *const pdata); - void paint(QPainter &p, int left, int right, double samples_per_pixel, - double pixels_offset, int y); + void paint(QPainter &p, QColor fill, QColor outline, + QColor text_colour, int text_height, int left, int right, + double samples_per_pixel, double pixels_offset, int y); private: uint64_t _start_sample; diff --git a/pv/view/decodesignal.cpp b/pv/view/decodesignal.cpp index bc37b201..f6611a0f 100644 --- a/pv/view/decodesignal.cpp +++ b/pv/view/decodesignal.cpp @@ -89,7 +89,9 @@ void DecodeSignal::paint_mid(QPainter &p, int left, int right) vector< shared_ptr > annotations(_decoder->annotations()); BOOST_FOREACH(shared_ptr a, annotations) { assert(a); - a->paint(p, left, right, samples_per_pixel, pixels_offset, y); + a->paint(p, _colour, _colour.darker(), get_text_colour(), + _text_size.height(), left, right, samples_per_pixel, + pixels_offset, y); } }