Skip to content

Commit 86bd299

Browse files
committed
Added cursor on time ruler and ability to play from cursor
1 parent a476af5 commit 86bd299

File tree

7 files changed

+100
-3
lines changed

7 files changed

+100
-3
lines changed

Signal.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ Signal::Signal(QObject *_parent)
3939

4040
int totalSample = 1 * m_sampleRate;
4141
m_samples = new QByteArray(totalSample, NULL);
42+
m_cursorSample = 0;
4243

4344
QAudioFormat format;
4445
// Set up the format, eg.
@@ -131,6 +132,11 @@ qint32 Signal::getSample(int _index)
131132
return 0;
132133
}
133134

135+
void Signal::setCursorTime(qreal _cursorTime)
136+
{
137+
m_cursorSample = qRound(_cursorTime * m_sampleRate);
138+
}
139+
134140
void Signal::generate()
135141
{
136142
int totalSample = qRound(m_duration * m_sampleRate);
@@ -205,6 +211,7 @@ void Signal::pause()
205211
void Signal::toStart()
206212
{
207213
m_buffer->reset();
214+
m_buffer->seek(m_cursorSample * 4);
208215
}
209216

210217
void Signal::toEnd()

Signal.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ class Signal : public QObject
4848
int sampleCount();
4949
qint32 getSample(int _index);
5050
inline int getSampleRate() { return m_sampleRate; }
51+
inline int getCursorSample() { return m_cursorSample; }
52+
inline void setCursorSample(int _cursorSample) { m_cursorSample = _cursorSample; }
5153

5254
signals:
5355
void signalChanged();
@@ -62,6 +64,7 @@ public slots:
6264
void generate();
6365
void exportWAV(QString _fileName);
6466
void loop(bool _enable);
67+
void setCursorTime(qreal _cursorTime);
6568

6669
private slots:
6770
void handleStateChanged(QAudio::State _newState);
@@ -73,6 +76,7 @@ private slots:
7376
QByteArray* m_samples;
7477
LoopableBuffer* m_buffer;
7578
Component* m_component;
79+
int m_cursorSample;
7680
};
7781

7882

UI/MainWindow.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ MainWindow::MainWindow(QWidget* _parent)
6060
ui->waveFormView->setSignal(&m_signal);
6161
connect(ui->waveFormView, &WaveFormView::zoomChanged, this, &MainWindow::onWaveFormViewZoomChanged);
6262
connect(ui->waveFormScrollBar, &QScrollBar::valueChanged, this, &MainWindow::onScrollbarValueChanged);
63+
connect(ui->timeRuler, &TimeRuler::onTimeSelected, ui->waveFormView, &WaveFormView::setCursorTime);
64+
connect(ui->timeRuler, &TimeRuler::onTimeSelected, &m_signal, &Signal::setCursorTime);
6365

6466
m_scene = new NodalScene(ui->nodalView);
6567
m_scene->setBackgroundBrush(Qt::black);

UI/TimeRuler.cpp

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@
2727
TimeRuler::TimeRuler(QWidget *_parent)
2828
: QWidget(_parent)
2929
{
30-
m_startTime = 0.0;
31-
m_endTime = 1.0;
3230
}
3331

3432
void TimeRuler::setTimeWindow(qreal _startTime, qreal _endTime)
@@ -87,4 +85,62 @@ void TimeRuler::paintEvent(QPaintEvent *_event)
8785
}
8886

8987
painter.drawLines(lines);
88+
89+
QBrush brush(Qt::BrushStyle::SolidPattern);
90+
brush.setColor(QColor(255, 255, 0));
91+
painter.setRenderHint(QPainter::Antialiasing);
92+
painter.setPen(Qt::NoPen);
93+
94+
int cursorRadius = 2;
95+
int height = size().height() - 1;
96+
int x = qRound(Utils::MapValue(m_currentTime, m_startTime, m_endTime, 0.0, size().width())) - CURSOR_HALF_WIDTH;
97+
98+
QPainterPath cursor;
99+
cursor.moveTo(x, cursorRadius);
100+
cursor.arcTo(x, 0, 2 * cursorRadius, 2 * cursorRadius, 180, -90);
101+
cursor.arcTo(x + CURSOR_HALF_WIDTH * 2 - 2 * cursorRadius, 0, 2 * cursorRadius, 2 * cursorRadius, 90, -90);
102+
cursor.lineTo(x + 2 * CURSOR_HALF_WIDTH, height - CURSOR_HALF_WIDTH);
103+
cursor.lineTo(x + CURSOR_HALF_WIDTH, height);
104+
cursor.lineTo(x, height - CURSOR_HALF_WIDTH);
105+
cursor.closeSubpath();
106+
107+
painter.fillPath(cursor, brush);
108+
}
109+
110+
void TimeRuler::mousePressEvent(QMouseEvent *_event)
111+
{
112+
if(_event->button() == Qt::MouseButton::LeftButton)
113+
{
114+
m_draggingCursor = true;
115+
int cursorPos = qRound(Utils::MapValue(m_currentTime, m_startTime, m_endTime, 0.0, size().width()));
116+
int mousePos = _event->pos().x();
117+
m_cursorOffset = qAbs(cursorPos - mousePos) < CURSOR_HALF_WIDTH ? cursorPos - mousePos : 0;
118+
updateCursor(mousePos);
119+
}
120+
}
121+
122+
void TimeRuler::mouseMoveEvent(QMouseEvent *_event)
123+
{
124+
if(m_draggingCursor)
125+
{
126+
updateCursor(_event->pos().x());
127+
}
128+
}
129+
130+
void TimeRuler::mouseReleaseEvent(QMouseEvent *_event)
131+
{
132+
Q_UNUSED(_event)
133+
134+
if(_event->button() == Qt::MouseButton::LeftButton)
135+
{
136+
m_draggingCursor = false;
137+
}
138+
}
139+
140+
void TimeRuler::updateCursor(int _mousePosX)
141+
{
142+
qreal value = static_cast<qreal>(_mousePosX + m_cursorOffset);
143+
m_currentTime = Utils::MapValue(value, 0, static_cast<qreal>(size().width()), m_startTime, m_endTime);
144+
update();
145+
emit onTimeSelected(m_currentTime);
90146
}

UI/TimeRuler.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
#ifndef TIMERULER_H
2222
#define TIMERULER_H
2323

24-
#include <QWidget>
24+
#include <QtWidgets>
2525

2626
class TimeRuler : public QWidget
2727
{
@@ -33,16 +33,28 @@ class TimeRuler : public QWidget
3333
void setTimeWindow(qreal _startTime, qreal _endTime);
3434
inline qreal getStartTime() { return m_startTime; }
3535
inline qreal getEndTime() { return m_endTime; }
36+
inline qreal getCurrentTime() { return m_currentTime; }
3637

3738
public slots:
3839
virtual void paintEvent(QPaintEvent* _event) override;
40+
virtual void mousePressEvent(QMouseEvent* _event) override;
41+
virtual void mouseMoveEvent(QMouseEvent* _event) override;
42+
virtual void mouseReleaseEvent(QMouseEvent* _event) override;
3943

4044
signals:
4145
void onTimeSelected(qreal _time);
4246

47+
private:
48+
void updateCursor(int mousePosX);
49+
4350
private:
4451
qreal m_startTime = 0.0;
4552
qreal m_endTime = 0.0;
53+
qreal m_currentTime = 0.0;
54+
bool m_draggingCursor = false;
55+
int m_cursorOffset = 0.0;
56+
57+
static const int CURSOR_HALF_WIDTH = 4;
4658
};
4759

4860
#endif // TIMERULER_H

UI/WaveFormView.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "WaveFormView.h"
2222
#include "WaveFormChunk.h"
2323
#include <QPainter>
24+
#include "Utils.h"
2425

2526
const int WaveFormView::chunkSize = 128;
2627

@@ -30,6 +31,7 @@ WaveFormView::WaveFormView(QWidget *_parent)
3031
m_sampleOffset = 0;
3132
m_nbSampleViewed = 2400;
3233
m_nbTotalSample = 0;
34+
m_cursorSample = 0;
3335

3436
m_samplePerChunk = chunkSize;
3537

@@ -61,6 +63,12 @@ void WaveFormView::setSignal(Signal *_signal)
6163
}
6264
}
6365

66+
void WaveFormView::setCursorTime(qreal cursorTime)
67+
{
68+
m_cursorSample = qRound(m_signal->getSampleRate() * cursorTime);
69+
update();
70+
}
71+
6472
void WaveFormView::resizeEvent(QResizeEvent *_event)
6573
{
6674
Q_UNUSED(_event);
@@ -102,6 +110,12 @@ void WaveFormView::paintEvent(QPaintEvent *_event)
102110
m_chunkList[i]->width(), m_chunkList[i]->height());
103111
}
104112

113+
int x = qRound(Utils::MapValue(m_cursorSample - m_sampleOffset, 0, m_nbSampleViewed, 0, size().width()));
114+
115+
QPen pen(QColor("yellow"));
116+
painter.setPen(pen);
117+
painter.drawLine(x, 0, x, size().width());
118+
105119
}
106120

107121
void WaveFormView::wheelEvent(QWheelEvent *_event)

UI/WaveFormView.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class WaveFormView : public QWidget
3636
virtual ~WaveFormView() override;
3737

3838
void setSignal(Signal* _signal);
39+
void setCursorTime(qreal cursorTime);
3940

4041
inline int getSampleOffset() { return m_sampleOffset; }
4142
inline int getNbSampleViewed() { return m_nbSampleViewed; }
@@ -61,6 +62,7 @@ public slots:
6162
int m_nbSampleViewed;
6263
int m_nbTotalSample;
6364
int m_samplePerChunk;
65+
int m_cursorSample;
6466

6567
qreal m_zoom;
6668
qreal m_zoomMin;

0 commit comments

Comments
 (0)