X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=sigview.cpp;h=cf0983d90ba2b0cefbb798f1edcc9dda697f4f39;hp=53fbdeaac148859251c7792ab726c40d6d174c4c;hb=3e46726aaf1cfe749c8f3fced7b455cf01a03c86;hpb=3b18c57d8f224791481e0b768065bd4d11a3d79e diff --git a/sigview.cpp b/sigview.cpp index 53fbdeaa..cf0983d9 100644 --- a/sigview.cpp +++ b/sigview.cpp @@ -23,58 +23,90 @@ #include "sigsession.h" #include "signal.h" +#include + #include using namespace boost; using namespace std; const int SigView::SignalHeight = 50; +const int SigView::LabelMarginWidth = 70; SigView::SigView(SigSession &session, QWidget *parent) : QGLWidget(parent), _session(session), - _scale(1000000000ULL), + _scale(1e-6), _offset(0) { connect(&_session, SIGNAL(dataUpdated()), this, SLOT(dataUpdated())); setMouseTracking(true); + setAutoFillBackground(false); } void SigView::initializeGL() { - glDisable(GL_TEXTURE_2D); - glDisable(GL_DEPTH_TEST); - glDisable(GL_COLOR_MATERIAL); - glEnable(GL_BLEND); - glEnable(GL_POLYGON_SMOOTH); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glClearColor(1.0, 1.0, 1.0, 0); } void SigView::resizeGL(int width, int height) { - glViewport(0, 0, (GLint)width, (GLint)height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(0, width, height, 0, -1, 1); - glMatrixMode(GL_MODELVIEW); + setupViewport(width, height); } -void SigView::paintGL() +void SigView::paintEvent(QPaintEvent *event) { - glClear(GL_COLOR_BUFFER_BIT); + int offset; - QRect rect(0, 0, width(), SignalHeight); const vector< shared_ptr > &sigs = _session.get_signals(); + + // Prepare for OpenGL rendering + makeCurrent(); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + + setupViewport(width(), height()); + + qglClearColor(Qt::white); + glClear(GL_COLOR_BUFFER_BIT); + + // Plot the signal + offset = 0; BOOST_FOREACH(const shared_ptr s, sigs) { assert(s); - s->paint(*this, rect, _scale, _offset); - rect.translate(0, SignalHeight); + + const QRect signal_rect(LabelMarginWidth, offset, + width() - LabelMarginWidth, SignalHeight); + + s->paint(*this, signal_rect, _scale, _offset); + + offset += SignalHeight; + } + + // Prepare for QPainter rendering + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + + QPainter painter(this); + painter.setRenderHint(QPainter::Antialiasing); + + // Paint the label + offset = 0; + BOOST_FOREACH(const shared_ptr s, sigs) + { + assert(s); + + const QRect label_rect(0, offset, + LabelMarginWidth, SignalHeight); + s->paint_label(painter, label_rect); + + offset += SignalHeight; } + + painter.end(); } void SigView::dataUpdated() @@ -82,3 +114,43 @@ void SigView::dataUpdated() update(); } +void SigView::mouseMoveEvent(QMouseEvent *event) +{ + assert(event); +} + +void SigView::mousePressEvent(QMouseEvent *event) +{ + assert(event); +} + +void SigView::mouseReleaseEvent(QMouseEvent *event) +{ + assert(event); + + const double cursor_offset = _offset + _scale * (double)event->x(); + + switch(event->button()) + { + case Qt::LeftButton: + _scale *= 2.0 / 3.0; + break; + + case Qt::RightButton: + _scale *= 3.0 / 2.0; + break; + } + + _offset = cursor_offset - _scale * (double)event->x(); + + update(); +} + +void SigView::setupViewport(int width, int height) +{ + glViewport(0, 0, (GLint)width, (GLint)height); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0, width, height, 0, -1, 1); + glMatrixMode(GL_MODELVIEW); +}