using namespace boost;
using namespace std;
+const double SigView::MaxScale = 1e9;
+const double SigView::MinScale = 1e-15;
+
const int SigView::SignalHeight = 50;
const int SigView::LabelMarginWidth = 70;
const int SigView::RulerHeight = 30;
setAutoFillBackground(false);
}
+void SigView::zoom(double steps)
+{
+ zoom(steps, (width() - LabelMarginWidth) / 2);
+}
+
void SigView::initializeGL()
{
}
glClear(GL_COLOR_BUFFER_BIT);
// Plot the signal
+ glEnable(GL_SCISSOR_TEST);
+ glScissor(LabelMarginWidth, 0, width(), height());
offset = RulerHeight;
BOOST_FOREACH(const shared_ptr<Signal> s, sigs)
{
offset += SignalHeight;
}
+ glDisable(GL_SCISSOR_TEST);
+
// Prepare for QPainter rendering
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
void SigView::wheelEvent(QWheelEvent *event)
{
assert(event);
-
- const double x = event->x() - LabelMarginWidth;
- const double cursor_offset = _offset + _scale * x;
- _scale *= powf(3.0/2.0, -event->delta() / 120);
- _offset = cursor_offset - _scale * x;
- update();
+ zoom(event->delta() / 120, event->x() - LabelMarginWidth);
}
void SigView::setup_viewport(int width, int height)
division++;
}
}
+
+void SigView::zoom(double steps, int offset)
+{
+ const double cursor_offset = _offset + _scale * offset;
+ _scale *= pow(3.0/2.0, -steps);
+ _scale = max(min(_scale, MaxScale), MinScale);
+ _offset = cursor_offset - _scale * offset;
+ update();
+}