#include "sigsession.h"
#include "signal.h"
+#include "sigview.h"
#include "extdef.h"
using namespace boost;
using namespace std;
-const double SigViewport::MaxScale = 1e9;
-const double SigViewport::MinScale = 1e-15;
-
const int SigViewport::SignalHeight = 50;
-const int SigViewport::LabelMarginWidth = 70;
-const int SigViewport::RulerHeight = 30;
const int SigViewport::MinorTickSubdivision = 4;
const int SigViewport::ScaleUnits[3] = {1, 2, 5};
{"f", "p", "n", QChar(0x03BC), "m", "", "k", "M", "G"};
const int SigViewport::FirstSIPrefixPower = -15;
-SigViewport::SigViewport(SigSession &session, QWidget *parent) :
- QGLWidget(parent),
- _session(session),
- _scale(1e-6),
- _offset(0)
+SigViewport::SigViewport(SigView &parent) :
+ QGLWidget(&parent),
+ _view(parent)
{
- connect(&_session, SIGNAL(data_updated()),
- this, SLOT(data_updated()));
-
setMouseTracking(true);
setAutoFillBackground(false);
}
-void SigViewport::zoom(double steps)
+int SigViewport::get_total_height() const
{
- zoom(steps, (width() - LabelMarginWidth) / 2);
+ int height = 0;
+ BOOST_FOREACH(const shared_ptr<Signal> s,
+ _view._session.get_signals()) {
+ assert(s);
+ height += SignalHeight;
+ }
+
+ return height;
}
void SigViewport::initializeGL()
int offset;
const vector< shared_ptr<Signal> > &sigs =
- _session.get_signals();
+ _view._session.get_signals();
// Prepare for OpenGL rendering
makeCurrent();
// Plot the signal
glEnable(GL_SCISSOR_TEST);
- glScissor(LabelMarginWidth, 0, width(), height());
- offset = RulerHeight;
+ glScissor(SigView::LabelMarginWidth, 0, width(), height());
+ offset = SigView::RulerHeight - _view.v_offset();
BOOST_FOREACH(const shared_ptr<Signal> s, sigs)
{
assert(s);
- const QRect signal_rect(LabelMarginWidth, offset,
- width() - LabelMarginWidth, SignalHeight);
+ const QRect signal_rect(SigView::LabelMarginWidth, offset,
+ width() - SigView::LabelMarginWidth, SignalHeight);
- s->paint(*this, signal_rect, _scale, _offset);
+ s->paint(*this, signal_rect, _view.scale(), _view.offset());
offset += SignalHeight;
}
painter.setRenderHint(QPainter::Antialiasing);
// Paint the labels
- offset = RulerHeight;
+ offset = SigView::RulerHeight - _view.v_offset();
BOOST_FOREACH(const shared_ptr<Signal> s, sigs)
{
assert(s);
const QRect label_rect(0, offset,
- LabelMarginWidth, SignalHeight);
+ SigView::LabelMarginWidth, SignalHeight);
s->paint_label(painter, label_rect);
offset += SignalHeight;
painter.end();
}
-void SigViewport::data_updated()
-{
- update();
-}
-
void SigViewport::mousePressEvent(QMouseEvent *event)
{
assert(event);
_mouse_down_point = event->pos();
- _mouse_down_offset = _offset;
+ _mouse_down_offset = _view.offset();
}
void SigViewport::mouseMoveEvent(QMouseEvent *event)
if(event->buttons() & Qt::LeftButton)
{
- _offset = _mouse_down_offset + (_mouse_down_point - event->pos()).x() * _scale;
- update();
+ _view.set_scale_offset(_view.scale(),
+ _mouse_down_offset +
+ (_mouse_down_point - event->pos()).x() *
+ _view.scale());
}
}
void SigViewport::wheelEvent(QWheelEvent *event)
{
assert(event);
- zoom(event->delta() / 120, event->x() - LabelMarginWidth);
+ _view.zoom(event->delta() / 120, event->x() -
+ SigView::LabelMarginWidth);
}
void SigViewport::setup_viewport(int width, int height)
{
const double MinSpacing = 80;
- const double min_period = _scale * MinSpacing;
+ const double min_period = _view.scale() * MinSpacing;
const int order = (int)floorf(log10f(min_period));
const double order_decimal = pow(10, order);
p.setPen(Qt::black);
const double minor_tick_period = tick_period / MinorTickSubdivision;
- const double first_major_division = floor(_offset / tick_period);
- const double first_minor_division = ceil(_offset / minor_tick_period);
+ const double first_major_division =
+ floor(_view.offset() / tick_period);
+ const double first_minor_division =
+ ceil(_view.offset() / minor_tick_period);
const double t0 = first_major_division * tick_period;
int division = (int)round(first_minor_division -
while(1)
{
const double t = t0 + division * minor_tick_period;
- const double x = (t - _offset) / _scale + LabelMarginWidth;
+ const double x = (t - _view.offset()) / _view.scale() +
+ SigView::LabelMarginWidth;
if(x >= width())
break;
ts << (t / order_decimal) << SIPrefixes[prefix] << "s";
p.drawText(x, 0, 0, text_height, Qt::AlignCenter | Qt::AlignTop |
Qt::TextDontClip, s);
- p.drawLine(x, text_height, x, RulerHeight);
+ p.drawLine(x, text_height, x, SigView::RulerHeight);
}
else
{
// Draw a minor tick
- p.drawLine(x, (text_height + RulerHeight) / 2, x, RulerHeight);
+ p.drawLine(x,
+ (text_height + SigView::RulerHeight) / 2, x,
+ SigView::RulerHeight);
}
division++;
}
}
-
-void SigViewport::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();
-}