]> sigrok.org Git - pulseview.git/commitdiff
Initial ruler painting
authorJoel Holdsworth <redacted>
Sun, 24 Jun 2012 06:20:34 +0000 (07:20 +0100)
committerJoel Holdsworth <redacted>
Mon, 3 Sep 2012 12:59:05 +0000 (13:59 +0100)
sigview.cpp
sigview.h

index cf0983d90ba2b0cefbb798f1edcc9dda697f4f39..554e534eb03b0d93cf25d2aebefbccdaaaaa2ead 100644 (file)
 #include "sigsession.h"
 #include "signal.h"
 
+#include "extdef.h"
+
 #include <QMouseEvent>
 
+#include <math.h>
+
 #include <boost/foreach.hpp>
 
 using namespace boost;
@@ -32,6 +36,9 @@ using namespace std;
 
 const int SigView::SignalHeight = 50;
 const int SigView::LabelMarginWidth = 70;
+const int SigView::RulerHeight = 30;
+
+const int SigView::ScaleUnits[3] = {1, 2, 5};
 
 SigView::SigView(SigSession &session, QWidget *parent) :
        QGLWidget(parent),
@@ -73,7 +80,7 @@ void SigView::paintEvent(QPaintEvent *event)
        glClear(GL_COLOR_BUFFER_BIT);
 
        // Plot the signal
-       offset = 0;
+       offset = RulerHeight;
        BOOST_FOREACH(const shared_ptr<Signal> s, sigs)
        {
                assert(s);
@@ -93,8 +100,8 @@ void SigView::paintEvent(QPaintEvent *event)
        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing);
 
-       // Paint the label
-       offset = 0;
+       // Paint the labels
+       offset = RulerHeight;
        BOOST_FOREACH(const shared_ptr<Signal> s, sigs)
        {
                assert(s);
@@ -106,6 +113,9 @@ void SigView::paintEvent(QPaintEvent *event)
                offset += SignalHeight;
        }
 
+       // Paint the ruler
+       paintRuler(painter);
+
        painter.end();
 }
 
@@ -154,3 +164,39 @@ void SigView::setupViewport(int width, int height)
        glOrtho(0, width, height, 0, -1, 1);
        glMatrixMode(GL_MODELVIEW);
 }
+
+void SigView::paintRuler(QPainter &p)
+{
+       const double MinSpacing = 20;
+
+       double tick_period = 0.0f;
+       const double min_period = _scale * MinSpacing;
+
+       double order = 10e-15;
+       while(tick_period < min_period)
+       {
+               int unit = 0;
+               while(tick_period < min_period &&
+                       unit < countof(ScaleUnits))
+                       tick_period = order * ScaleUnits[unit++];
+               order *= 10;
+       }
+
+       const double tick_seperation = tick_period / _scale;
+
+       p.setPen(Qt::transparent);
+       p.setBrush(QColor(0xC0, 0xC0, 0xC0));
+       p.drawRect(LabelMarginWidth, 0,
+               width() - LabelMarginWidth, RulerHeight);
+
+       p.setPen(Qt::black);
+
+       const double offset_ticks = -_offset / tick_period;
+       double x = (offset_ticks - floor(offset_ticks)) *
+               tick_seperation + LabelMarginWidth;
+       while(x < width())
+       {
+               p.drawLine(x, 0, x, RulerHeight);
+               x += tick_seperation;
+       }
+}
index e2d9543a452d5a7d5cfce2b62ebc542275b41f14..0d1c06f7ca0f29339c5091507704432adbc183e0 100644 (file)
--- a/sigview.h
+++ b/sigview.h
@@ -24,6 +24,7 @@
 #include <QtOpenGL/QGLWidget>
 #include <QTimer>
 
+class QPainter;
 class QPaintEvent;
 class SigSession;
 
@@ -34,6 +35,9 @@ class SigView : public QGLWidget
 private:
        static const int SignalHeight;
        static const int LabelMarginWidth;
+       static const int RulerHeight;
+
+       static const int ScaleUnits[3];
 
 public:
        explicit SigView(SigSession &session, QWidget *parent = 0);
@@ -54,6 +58,8 @@ private:
 private:
        void setupViewport(int width, int height);
 
+       void paintRuler(QPainter &p);
+
 private slots:
        void dataUpdated();