From 78b3285c6552d0f49e3219f1f7ee5b29ea1dd343 Mon Sep 17 00:00:00 2001 From: Andrei Popa Date: Thu, 19 Oct 2023 11:46:00 +0300 Subject: [PATCH] gui: buffer previewer: optimized resize event - the previewer curve is only generated if the widget was vertically resized Signed-off-by: Andrei Popa --- gui/include/gui/buffer_previewer.hpp | 12 ++++----- gui/src/buffer_previewer.cpp | 40 ++++++++++++++++------------ 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/gui/include/gui/buffer_previewer.hpp b/gui/include/gui/buffer_previewer.hpp index 8cfc645b3..9318e9b3a 100644 --- a/gui/include/gui/buffer_previewer.hpp +++ b/gui/include/gui/buffer_previewer.hpp @@ -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; @@ -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; @@ -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; @@ -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 @@ -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; diff --git a/gui/src/buffer_previewer.cpp b/gui/src/buffer_previewer.cpp index d71d48282..dd6211548 100644 --- a/gui/src/buffer_previewer.cpp +++ b/gui/src/buffer_previewer.cpp @@ -24,6 +24,8 @@ #include #include #include +#include +#include using namespace scopy; @@ -45,8 +47,6 @@ 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) @@ -54,7 +54,9 @@ BufferPreviewer::BufferPreviewer(int pixelsPerPeriod, double wavePhase, QWidget , 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; } @@ -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) @@ -120,7 +123,7 @@ void BufferPreviewer::setVerticalSpacing(int spacing) if(m_verticalSpacing != spacing) { m_verticalSpacing = spacing; - buildFullWaveform(m_fullWavePoints, m_fullWaveNumPoints); + buildFullWaveform(); update(); } } @@ -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); @@ -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) { @@ -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(); } @@ -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); } } @@ -325,9 +329,11 @@ 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) { @@ -335,7 +341,7 @@ void DigitalBufferPreviewer::buildFullWaveform(QPointF *wavePoints, int numPts) } else { y = verticalSpacing() / 2; } - wavePoints[i] = QPointF(i, y); + m_wavePoints[i] = QPointF(i, y); } }