]> sigrok.org Git - pulseview.git/commitdiff
Added ruler numbering
authorJoel Holdsworth <redacted>
Sun, 24 Jun 2012 08:00:11 +0000 (09:00 +0100)
committerJoel Holdsworth <redacted>
Mon, 3 Sep 2012 12:59:05 +0000 (13:59 +0100)
sigview.cpp
sigview.h

index 554e534eb03b0d93cf25d2aebefbccdaaaaa2ead..ca5f12f9695dd3e64879124d3371e12954d0c2b2 100644 (file)
@@ -26,6 +26,7 @@
 #include "extdef.h"
 
 #include <QMouseEvent>
+#include <QTextStream>
 
 #include <math.h>
 
@@ -40,6 +41,10 @@ const int SigView::RulerHeight = 30;
 
 const int SigView::ScaleUnits[3] = {1, 2, 5};
 
+const QString SigView::SIPrefixes[9] =
+       {"f", "p", "n", QChar(0x03BC), "m", "", "k", "M", "G"};
+const int SigView::FirstSIPrefixPower = -15;
+
 SigView::SigView(SigSession &session, QWidget *parent) :
        QGLWidget(parent),
         _session(session),
@@ -167,36 +172,41 @@ void SigView::setupViewport(int width, int height)
 
 void SigView::paintRuler(QPainter &p)
 {
-       const double MinSpacing = 20;
+       const double MinSpacing = 80;
 
-       double tick_period = 0.0f;
        const double min_period = _scale * MinSpacing;
 
-       double order = 10e-15;
-       while(tick_period < min_period)
+       const int order = (int)floorf(log10f(min_period));
+       const double order_decimal = pow(10, order);
+
+       int unit = 0;
+       double tick_period = 0.0f;
+
+       do
        {
-               int unit = 0;
-               while(tick_period < min_period &&
-                       unit < countof(ScaleUnits))
-                       tick_period = order * ScaleUnits[unit++];
-               order *= 10;
-       }
+               tick_period = order_decimal * ScaleUnits[unit++];
+       } while(tick_period < min_period && unit < countof(ScaleUnits));
 
-       const double tick_seperation = tick_period / _scale;
+       const int prefix = (order - FirstSIPrefixPower) / 3;
+       assert(prefix >= 0);
+       assert(prefix < countof(SIPrefixes));
 
-       p.setPen(Qt::transparent);
-       p.setBrush(QColor(0xC0, 0xC0, 0xC0));
-       p.drawRect(LabelMarginWidth, 0,
-               width() - LabelMarginWidth, RulerHeight);
+       const int text_height = p.boundingRect(0, 0, INT_MAX, INT_MAX,
+               Qt::AlignLeft | Qt::AlignTop, "8").height();
 
+       // Draw the tick marks
        p.setPen(Qt::black);
 
-       const double offset_ticks = -_offset / tick_period;
-       double x = (offset_ticks - floor(offset_ticks)) *
-               tick_seperation + LabelMarginWidth;
-       while(x < width())
+       double t = ceil(_offset / tick_period) * tick_period;
+       double x = 0.0;
+       while((x = (t - _offset) / _scale + LabelMarginWidth) < width())
        {
-               p.drawLine(x, 0, x, RulerHeight);
-               x += tick_seperation;
+               QString s;
+               QTextStream ts(&s);
+               ts << (t / order_decimal) << SIPrefixes[prefix] << "s";
+               p.drawText(x, 0, 0, text_height, Qt::AlignCenter | Qt::AlignTop |
+                       Qt::TextDontClip, s);
+               p.drawLine(x, text_height, x, RulerHeight);
+               t += tick_period;
        }
 }
index 0d1c06f7ca0f29339c5091507704432adbc183e0..b60ee44b1d4a10aff320e30f0c4ef57673290e6d 100644 (file)
--- a/sigview.h
+++ b/sigview.h
@@ -39,6 +39,9 @@ private:
 
        static const int ScaleUnits[3];
 
+       static const QString SIPrefixes[9];
+       static const int FirstSIPrefixPower;
+
 public:
        explicit SigView(SigSession &session, QWidget *parent = 0);