Skip to content

Commit

Permalink
gui: buffer previewer: optimized resize event
Browse files Browse the repository at this point in the history
- the previewer curve is only generated if the widget was vertically resized

Signed-off-by: Andrei Popa <[email protected]>
  • Loading branch information
andrei47w committed Oct 19, 2023
1 parent 7806a77 commit 78b3285
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 23 deletions.
12 changes: 6 additions & 6 deletions gui/include/gui/buffer_previewer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,8 @@ class SCOPY_GUI_EXPORT BufferPreviewer : public QFrame
protected:
void paintEvent(QPaintEvent *) override;
void resizeEvent(QResizeEvent *) override;
virtual void buildFullWaveform(QPointF *wavePoints, int numPts) = 0;
virtual void buildFullWaveform() = 0;
int getWavePointsCount();

void mouseDoubleClickEvent(QMouseEvent *event) override;
void mousePressEvent(QMouseEvent *event) override;
Expand All @@ -77,6 +78,8 @@ class SCOPY_GUI_EXPORT BufferPreviewer : public QFrame
void enterEvent(QEvent *event) override;
void leaveEvent(QEvent *event) override;

QPointF *m_wavePoints;

private:
double m_waveformPos;
double m_waveformWidth;
Expand All @@ -88,9 +91,6 @@ class SCOPY_GUI_EXPORT BufferPreviewer : public QFrame
int m_pixelsPerPeriod;
double m_startingPhase;

int m_fullWaveNumPoints;
QPointF *m_fullWavePoints;

QPoint m_offset;
int m_pixelLeft;
int m_pixelRight;
Expand All @@ -110,7 +110,7 @@ class SCOPY_GUI_EXPORT AnalogBufferPreviewer : public BufferPreviewer
explicit AnalogBufferPreviewer(int pixelsPerPeriod, double wavePhase, QWidget *parent = 0);

protected:
virtual void buildFullWaveform(QPointF *wavePoints, int numPts);
virtual void buildFullWaveform();
};

class SCOPY_GUI_EXPORT DigitalBufferPreviewer : public BufferPreviewer
Expand All @@ -122,7 +122,7 @@ class SCOPY_GUI_EXPORT DigitalBufferPreviewer : public BufferPreviewer
double noOfSteps();

protected:
virtual void buildFullWaveform(QPointF *wavePoints, int numPts);
virtual void buildFullWaveform();

private:
double m_noOfSteps;
Expand Down
40 changes: 23 additions & 17 deletions gui/src/buffer_previewer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
#include <QPointF>
#include <QResizeEvent>
#include <QtMath>
#include <QApplication>
#include <QDesktopWidget>

using namespace scopy;

Expand All @@ -45,16 +47,16 @@ BufferPreviewer::BufferPreviewer(int pixelsPerPeriod, double wavePhase, QWidget
, m_verticalSpacing(0)
, m_pixelsPerPeriod(pixelsPerPeriod)
, m_startingPhase(wavePhase)
, m_fullWaveNumPoints(1)
, m_fullWavePoints(new QPointF[m_fullWaveNumPoints])
, m_rightBtnClick(false)
, m_gatingEnabled(false)
, m_leftGateWidth(0)
, m_rightGateWidth(0)
, m_cursorVisible(true)
{}

BufferPreviewer::~BufferPreviewer() { delete[] m_fullWavePoints; }
BufferPreviewer::~BufferPreviewer() { delete[] m_wavePoints; }

int BufferPreviewer::getWavePointsCount() { return QApplication::desktop()->geometry().width(); }

double BufferPreviewer::waveformPos() const { return m_waveformPos; }

Expand Down Expand Up @@ -101,6 +103,7 @@ void BufferPreviewer::setHighlightWidth(double width)
}

double BufferPreviewer::cursorPos() const { return m_cursorPos; }

void BufferPreviewer::setCursorPos(double pos)
{
if(pos < 0.0 || pos > 1.0 || pos == m_cursorPos)
Expand All @@ -120,7 +123,7 @@ void BufferPreviewer::setVerticalSpacing(int spacing)
if(m_verticalSpacing != spacing) {
m_verticalSpacing = spacing;

buildFullWaveform(m_fullWavePoints, m_fullWaveNumPoints);
buildFullWaveform();
update();
}
}
Expand Down Expand Up @@ -192,7 +195,7 @@ void BufferPreviewer::paintEvent(QPaintEvent *)
// Draw the visible part of the entire wave
p.setRenderHint(QPainter::Antialiasing, true);
p.setPen(linePen);
p.drawPolyline(m_fullWavePoints + wave_start, wave_width);
p.drawPolyline(m_wavePoints + wave_start, wave_width);

// Draw the highlight rectangle
p.setRenderHint(QPainter::Antialiasing, false);
Expand All @@ -204,7 +207,7 @@ void BufferPreviewer::paintEvent(QPaintEvent *)
p.setRenderHint(QPainter::Antialiasing, true);
linePen.setColor(palette().color(QPalette::HighlightedText));
p.setPen(linePen);
p.drawPolyline(m_fullWavePoints + hlightedWaveStartPos, hlightedWaveWidth);
p.drawPolyline(m_wavePoints + hlightedWaveStartPos, hlightedWaveWidth);

// Draw two vertical lines at the start and end of the highlight;
if(hlight_start + hlight_width > wave_start && wave_start + wave_width > hlight_start) {
Expand Down Expand Up @@ -240,12 +243,11 @@ void BufferPreviewer::paintEvent(QPaintEvent *)
}
}

void BufferPreviewer::resizeEvent(QResizeEvent *)
void BufferPreviewer::resizeEvent(QResizeEvent *event)
{
delete[] m_fullWavePoints;
m_fullWaveNumPoints = contentsRect().width();
m_fullWavePoints = new QPointF[m_fullWaveNumPoints];
buildFullWaveform(m_fullWavePoints, m_fullWaveNumPoints);
if(event->oldSize().height() != event->size().height()) {
buildFullWaveform();
}
}

void BufferPreviewer::mouseDoubleClickEvent(QMouseEvent *event) { Q_EMIT bufferResetPosition(); }
Expand Down Expand Up @@ -296,14 +298,16 @@ AnalogBufferPreviewer::AnalogBufferPreviewer(int pixelsPerPeriod, double wavePha
: BufferPreviewer(pixelsPerPeriod, wavePhase, parent)
{}

void AnalogBufferPreviewer::buildFullWaveform(QPointF *wavePoints, int numPts)
void AnalogBufferPreviewer::buildFullWaveform()
{
int count = getWavePointsCount();
m_wavePoints = new QPointF[count];
int middle = contentsRect().height() / 2;
int amplitude = middle - verticalSpacing() / 2;

for(int i = 0; i < numPts; i++) {
for(int i = 0; i < count; i++) {
qreal y = middle + amplitude * qSin(2 * M_PI * i / pixelsPerPeriod() + wavePhase());
wavePoints[i] = QPointF(i, y);
m_wavePoints[i] = QPointF(i, y);
}
}

Expand All @@ -325,17 +329,19 @@ void DigitalBufferPreviewer::setNoOfSteps(double val) { m_noOfSteps = val; }

double DigitalBufferPreviewer::noOfSteps() { return m_noOfSteps; }

void DigitalBufferPreviewer::buildFullWaveform(QPointF *wavePoints, int numPts)
void DigitalBufferPreviewer::buildFullWaveform()
{
for(int i = 0; i < numPts; i++) {
int count = getWavePointsCount();
m_wavePoints = new QPointF[count];
for(int i = 0; i < count; i++) {
qreal y;
int pos = i % pixelsPerPeriod();
if(pos < pixelsPerPeriod() / 2) {
y = contentsRect().height() - verticalSpacing() / 2;
} else {
y = verticalSpacing() / 2;
}
wavePoints[i] = QPointF(i, y);
m_wavePoints[i] = QPointF(i, y);
}
}

Expand Down

0 comments on commit 78b3285

Please sign in to comment.