]> sigrok.org Git - pulseview.git/commitdiff
Added row heading text
authorJoel Holdsworth <redacted>
Thu, 13 Feb 2014 23:47:06 +0000 (23:47 +0000)
committerJoel Holdsworth <redacted>
Sun, 16 Feb 2014 09:29:14 +0000 (09:29 +0000)
pv/data/decode/row.cpp
pv/data/decode/row.h
pv/view/decodetrace.cpp
pv/view/decodetrace.h

index 0eee547c220ae2c80478d492645e8c7f9fd1ebd8..2aabf0f93fc0fc5dfa1237dd48d759126df28d9c 100644 (file)
@@ -20,6 +20,8 @@
 
 #include "row.h"
 
+#include <libsigrokdecode/libsigrokdecode.h>
+
 namespace pv {
 namespace data {
 namespace decode {
@@ -46,6 +48,19 @@ const srd_decoder_annotation_row* Row::row() const
        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) ||
index 4ee05f6ef8ac6f6881853dedc903e0f98e6fc0dd..6c05ac45c1351459132da848a1b14243daf35f64 100644 (file)
@@ -43,6 +43,8 @@ public:
        const srd_decoder* decoder() const;
        const srd_decoder_annotation_row* row() const;
 
+       const QString title() const;
+
        bool operator<(const Row &other) const;
 
 private:
index ddf006ce9139e6c35792ffb128360a0e7ee89705..c47a46ab469abd2f7063c02cd1e1a1417984a246 100644 (file)
@@ -68,6 +68,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;
 
@@ -161,6 +162,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;
@@ -216,6 +219,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());
                }
        }
 
@@ -224,6 +229,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;
index 08558c98091af6668dca55c992df1784ee51c595..642f2a0ed4394cec7d2c90f67548f4d027e0396b 100644 (file)
@@ -74,6 +74,7 @@ private:
        static const QColor ErrorBgColour;
        static const QColor NoDecodeColour;
 
+       static const int ArrowSize;
        static const double EndCapWidth;
        static const int DrawPadding;
 
@@ -107,6 +108,14 @@ public:
         **/
        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);
@@ -171,6 +180,8 @@ private:
        std::list<ProbeSelector> _probe_selectors;
        std::vector<pv::widgets::DecoderGroupBox*> _decoder_forms;
 
+       std::vector<QString> _cur_row_headings;
+
        QSignalMapper _delete_mapper, _show_hide_mapper;
 };