From e9c41f8ce607164040ce86abd35a0a8751193f1f Mon Sep 17 00:00:00 2001 From: Joel Holdsworth Date: Sun, 24 Jun 2012 07:20:34 +0100 Subject: [PATCH] Initial ruler painting --- sigview.cpp | 52 +++++++++++++++++++++++++++++++++++++++++++++++++--- sigview.h | 6 ++++++ 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/sigview.cpp b/sigview.cpp index cf0983d..554e534 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 e2d9543..0d1c06f 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(); -- 2.30.2