//Author: Timothy Pearson , (C) 2012 //Copyright: See COPYING file that comes with this distribution #include "tracewidget.h" #include #include #include TraceWidget::TraceWidget(TQWidget* parent, const char* name) : TQWidget(parent, name), m_samples(0), m_horizDivs(0), m_vertDivs(0), m_leftEdge(0), m_rightEdge(0), m_topEdge(0), m_bottomEdge(0), m_sampleArray(0), m_graticulePixmap(0) { setBackgroundMode(NoBackground); setPaletteBackgroundColor(TQt::black); setPaletteForegroundColor(TQColor(0,128,0)); } TraceWidget::~TraceWidget() { // } void TraceWidget::setNumberOfSamples(unsigned int samples) { m_samples = samples; if (m_sampleArray) { delete [] m_sampleArray; } m_sampleArray = new double[m_samples]; updateGraticule(); } void TraceWidget::setNumberOfHorizontalDivisions(unsigned int divisions) { m_horizDivs = divisions; updateGraticule(); } void TraceWidget::setNumberOfVerticalDivisions(unsigned int divisions) { m_vertDivs = divisions; updateGraticule(); } void TraceWidget::setDisplayLimits(double x, double y, double w, double h) { m_leftEdge = x; m_rightEdge = w; m_topEdge = y; m_bottomEdge = h; } double* TraceWidget::samples() { return m_sampleArray; } void TraceWidget::updateGraticule() { unsigned int d,s,x,y; if (m_graticulePixmap) { delete m_graticulePixmap; } m_graticulePixmap = new TQPixmap(width(), height()); // Draw the graticule into the pixmap TQPainter p(m_graticulePixmap); p.setPen(TQPen(foregroundColor(), 1, TQt::SolidLine)); p.fillRect(0, 0, m_graticulePixmap->width(), m_graticulePixmap->height(), backgroundColor()); p.setPen(TQPen(foregroundColor(), 1, TQt::DotLine)); if (m_vertDivs > 0) { s = m_graticulePixmap->width() / m_vertDivs; x = 0; for (d=0; dheight()); x += s; } } if (m_horizDivs > 0) { s = m_graticulePixmap->height() / m_horizDivs; y = 0; for (d=0; dwidth(), y); y += s; } } p.setPen(TQPen(foregroundColor(), 1, TQt::SolidLine)); p.drawRect(0, 0, m_graticulePixmap->width(), m_graticulePixmap->height()); // Repaint the widget repaint(); } void TraceWidget::paintEvent(TQPaintEvent*) { TQPainter p(this); p.setPen(foregroundColor().light(150)); if ((m_graticulePixmap) && (m_bottomEdge != m_topEdge)) { // Draw the graticule pixmap to erase the widget p.drawPixmap(0, 0, *m_graticulePixmap); // Draw the points unsigned int n; int x,y,x2,y2; for (n=0; nwidth())); y = abs(((m_sampleArray[n]-m_topEdge)/(m_bottomEdge-m_topEdge))*(m_graticulePixmap->height())); x2 = abs(((n+1*1.0)/(m_samples-1))*(m_graticulePixmap->width())); y2 = abs(((m_sampleArray[n+1]-m_topEdge)/(m_bottomEdge-m_topEdge))*(m_graticulePixmap->height())); p.drawLine(x, y, x2, y2); } } else { p.fillRect(x(), y(), width(), height(), backgroundColor()); } } void TraceWidget::resizeEvent(TQResizeEvent *) { updateGraticule(); }