From 04e0f555ce2f36bfa0e0a174a69f49ca85e5c492 Mon Sep 17 00:00:00 2001
From: Elliu <goyard.louis@gmail.com>
Date: Sat, 19 Jun 2021 23:58:25 +0200
Subject: [PATCH] Beginning to look into adding and drag&dropping timing bars

---
 CMakeLists.txt      |  4 ++++
 audioVisualizer.cpp | 24 ++++++++++++++++++++++++
 audioVisualizer.h   | 26 ++++++++++++++++++++++++++
 mainwindow.cpp      | 15 ++++++++++++++-
 mainwindow.h        |  2 ++
 timer.cpp           | 39 +++++++++++++++++++++++++++++++++++++++
 timer.h             | 43 +++++++++++++++++++++++++++++++++++++++++++
 timingBar.cpp       | 10 ++++++++++
 timingBar.h         | 23 +++++++++++++++++++++++
 9 files changed, 185 insertions(+), 1 deletion(-)
 create mode 100644 audioVisualizer.cpp
 create mode 100644 audioVisualizer.h
 create mode 100644 timer.cpp
 create mode 100644 timer.h
 create mode 100644 timingBar.cpp
 create mode 100644 timingBar.h

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3f1f09b4..ddb0ecc1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -39,6 +39,10 @@ set(PROJECT_SOURCES
         main.cpp
         mainwindow.cpp
         mainwindow.h
+        audioVisualizer.h
+        audioVisualizer.cpp
+        timer.h
+        timer.cpp
 )
 
 if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
diff --git a/audioVisualizer.cpp b/audioVisualizer.cpp
new file mode 100644
index 00000000..13651406
--- /dev/null
+++ b/audioVisualizer.cpp
@@ -0,0 +1,24 @@
+#include "audioVisualizer.h"
+
+AudioVisualizer::AudioVisualizer(QWidget *parent)
+    : QWidget(parent)
+{
+}
+
+AudioVisualizer::~AudioVisualizer()
+{
+}
+
+void AudioVisualizer::printSpectrum(QString filename)
+{
+    QImage image(filename);
+    QPixmap pixmap = QPixmap::fromImage(image);
+    //timer->setPixmap(pixmap);
+    Timer *timer = new Timer(pixmap);
+
+    QVBoxLayout* layout = new QVBoxLayout;
+    layout->addWidget(timer);
+
+    setLayout(layout);
+}
+
diff --git a/audioVisualizer.h b/audioVisualizer.h
new file mode 100644
index 00000000..b38148f9
--- /dev/null
+++ b/audioVisualizer.h
@@ -0,0 +1,26 @@
+#ifndef AUDIOVISUALIZER_H
+#define AUDIOVISUALIZER_H
+
+#include <QWidget>
+#include <QLabel>
+#include <QScrollArea>
+#include <QVBoxLayout>
+#include <QScrollBar>
+#include <QMessageBox>
+#include <QGraphicsPixmapItem>
+#include "timer.h"
+
+class AudioVisualizer : public QWidget
+{
+    Q_OBJECT
+
+public:
+    AudioVisualizer(QWidget *parent = nullptr);
+    ~AudioVisualizer();
+
+
+public slots:
+    void printSpectrum(QString filename);
+};
+
+#endif
diff --git a/mainwindow.cpp b/mainwindow.cpp
index 067fadfe..b5732f22 100644
--- a/mainwindow.cpp
+++ b/mainwindow.cpp
@@ -3,6 +3,7 @@
 #include <string.h>
 #include <stdio.h>
 #include <CImg.h>
+#include <QStandardPaths>
 
 extern "C" {
 #include <libavutil/opt.h>
@@ -197,8 +198,20 @@ void MainWindow::openAudioFile(){
     }
 
     cimg_library::CImg<int16_t> img(pixs, width, height / 2);
-    img.mirror("y").save_png("out.png");
+    QString savedFile = (QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + QString("/spectrum.png"));
+    img.mirror("y").save_png(savedFile.toStdString().c_str());
 
     av_rdft_end(ctx);
     av_free(data);
+
+    AudioVisualizer* audioVisualizer = new AudioVisualizer;
+    audioVisualizer->printSpectrum(savedFile);
+
+    QVBoxLayout* layout = new QVBoxLayout;
+    layout->addWidget(audioVisualizer);
+
+    QWidget* window = new QWidget;
+    window->setLayout(layout);
+
+    setCentralWidget(window);
 }
diff --git a/mainwindow.h b/mainwindow.h
index 5b4b3de8..8898ef1e 100644
--- a/mainwindow.h
+++ b/mainwindow.h
@@ -6,6 +6,8 @@
 #include <QStatusBar>
 #include <QFileDialog>
 #include <QMessageBox>
+#include <QVBoxLayout>
+#include "audioVisualizer.h"
 
 class MainWindow : public QMainWindow
 {
diff --git a/timer.cpp b/timer.cpp
new file mode 100644
index 00000000..b08d92a9
--- /dev/null
+++ b/timer.cpp
@@ -0,0 +1,39 @@
+#include "timer.h"
+
+Timer::Timer(QPixmap pixmap, QWidget *parent)
+    : QGraphicsView(parent),
+    img(pixmap)
+{
+    bg = scene->addPixmap(img)/*->setAcceptedMouseButtons(Qt::NoButton)*/;
+    //scene->setBackgroundBrush(img);
+    setFixedHeight(pixmap.height());
+    setMaximumHeight(img.height() + horizontalScrollBar()->height() - TO_ADD_TO_IMAGE_HEIGHT);
+    setScene(scene);
+}
+
+Timer::~Timer()
+{
+}
+
+
+void Timer::mousePressEvent(QMouseEvent* event){
+    QPoint pos = event->pos();
+    pos.rx() += horizontalScrollBar()->value();
+    QGraphicsItem* got;
+    if ((got = scene->itemAt(pos, QTransform())) != nullptr && got != bg){
+        got->hide();
+        return;
+    }
+    int x = event->pos().x() + horizontalScrollBar()->value();
+    scene->addLine(QLine(x, 0, x, img.height() - TO_ADD_TO_IMAGE_HEIGHT), startColour)->setFlags(QGraphicsItem::ItemIsMovable/* | QGraphicsItem::ItemSendsGeometryChanges*/);
+}
+
+/*
+void Timer::paintEvent(QPaintEvent *event){
+    fprintf(stderr, "IN PAINT EVENT\n");
+    painter.setPen(Qt::NoPen);
+    QVectorIterator<QLine> it(lines);
+    while (it.hasNext())
+        painter.drawLine(it.next());
+}
+        */
diff --git a/timer.h b/timer.h
new file mode 100644
index 00000000..a8141b14
--- /dev/null
+++ b/timer.h
@@ -0,0 +1,43 @@
+#ifndef __TIMER_H
+#define __TIMER_H
+
+#include <QWidget>
+#include <QLabel>
+#include <QScrollArea>
+#include <QVBoxLayout>
+#include <QScrollBar>
+#include <QMessageBox>
+#include <QMouseEvent>
+#include <QPainter>
+#include <QColor>
+#include <QGraphicsView>
+#include <QVector>
+#include <QGraphicsLineItem>
+
+#define TO_ADD_TO_IMAGE_HEIGHT 2
+
+class Timer : public QGraphicsView
+{
+    Q_OBJECT
+
+public:
+    Timer(QPixmap pixmap, QWidget *parent = nullptr);
+    ~Timer();
+
+    QPainter painter;
+    QGraphicsScene* scene = new QGraphicsScene;
+    QColor startColour = QColor(127, 0, 127);
+    QColor endColour = QColor(0, 127, 0);
+    QPixmap img;
+    QGraphicsPixmapItem* bg;
+
+    QVector<QLine> lines;
+
+protected:
+    void mousePressEvent(QMouseEvent* event);
+    //void paintEvent(QPaintEvent *);
+
+public slots:
+};
+
+#endif
diff --git a/timingBar.cpp b/timingBar.cpp
new file mode 100644
index 00000000..9f74220a
--- /dev/null
+++ b/timingBar.cpp
@@ -0,0 +1,10 @@
+#include "timingBar.h"
+
+TimingBar::TimingBar(QWidget *parent)
+    : QLabel(parent)
+{
+}
+
+TimingBar::~TimingBar()
+{
+}
diff --git a/timingBar.h b/timingBar.h
new file mode 100644
index 00000000..b5c9ebf7
--- /dev/null
+++ b/timingBar.h
@@ -0,0 +1,23 @@
+#ifndef TIMING_BAR_H
+#define TIMING_BAR_H
+
+#include <QWidget>
+#include <QLabel>
+#include <QScrollArea>
+#include <QVBoxLayout>
+#include <QScrollBar>
+#include <QMessageBox>
+#include <QMouseEvent>
+
+class TimingBar : public QLabel
+{
+    Q_OBJECT
+
+public:
+    TimingBar(QWidget *parent = nullptr);
+    ~TimingBar();
+
+public slots:
+};
+
+#endif
-- 
GitLab