From: Joel Holdsworth Date: Sun, 24 Jun 2012 06:20:34 +0000 (+0100) Subject: Initial ruler painting X-Git-Tag: pulseview-0.1.0~336 X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=commitdiff_plain;h=e9c41f8ce607164040ce86abd35a0a8751193f1f Initial ruler painting --- diff --git a/sigview.cpp b/sigview.cpp index cf0983d9..554e534e 100644 --- a/sigview.cpp +++ b/sigview.cpp @@ -23,8 +23,12 @@ #include "sigsession.h" #include "signal.h" +#include "extdef.h" + #include +#include + #include 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 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 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; + } +} diff --git a/sigview.h b/sigview.h index e2d9543a..0d1c06f7 100644 --- a/sigview.h +++ b/sigview.h @@ -24,6 +24,7 @@ #include #include +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();