]> git.sesse.net Git - kdenlive/blobdiff - src/waveform.cpp
Waveform monitor added.
[kdenlive] / src / waveform.cpp
index 0b6affb01aa2d631be9c0f0766bd2cabf265edc0..4b6c259f006b5cdcbf5431864891586f7ed55732 100644 (file)
+/***************************************************************************
+ *   Copyright (C) 2010 by Simon Andreas Eugster (simon.eu@gmail.com)      *
+ *   This file is part of kdenlive. See www.kdenlive.org.                  *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ ***************************************************************************/
+
+#include <QPainter>
+#include <QPoint>
+#include <QDebug>
+
 #include "waveform.h"
 
-Waveform::Waveform(QWidget *parent) :
-    QWidget(parent)
+
+Waveform::Waveform(Monitor *projMonitor, Monitor *clipMonitor, QWidget *parent) :
+    QWidget(parent),
+    m_projMonitor(projMonitor),
+    m_clipMonitor(clipMonitor),
+    m_activeRender(clipMonitor->render),
+    initialDimensionUpdateDone(false)
 {
     setupUi(this);
+    m_waveformGenerator = new WaveformGenerator();
+
+    connect(m_waveformGenerator, SIGNAL(signalCalculationFinished(QImage,uint)), this, SLOT(slotWaveformCalculated(QImage,uint)));
 }
 
 Waveform::~Waveform()
 {
+    delete m_waveformGenerator;
+}
+
+
+
+void Waveform::updateDimensions()
+{
+    // Distance from top/left/right
+    int offset = 6;
+
+    QPoint topleft(offset, line->y()+offset);
+
+    m_scopeRect = QRect(topleft, this->size() - QSize(offset+topleft.x(), offset+topleft.y()));
+}
+
+
+///// Events /////
+
+void Waveform::paintEvent(QPaintEvent *)
+{
+    if (!initialDimensionUpdateDone) {
+        // This is a workaround.
+        // When updating the dimensions in the constructor, the size
+        // of the control items at the top are simply ignored! So do
+        // it here instead.
+        updateDimensions();
+        initialDimensionUpdateDone = true;
+    }
+
+    QPainter davinci(this);
+    QPoint vinciPoint;
+
+    davinci.setRenderHint(QPainter::Antialiasing, true);
+    davinci.fillRect(0, 0, this->size().width(), this->size().height(), QColor(25,25,23));
+
+    davinci.drawImage(m_scopeRect.topLeft(), m_waveform);
+
+}
+
+void Waveform::resizeEvent(QResizeEvent *event)
+{
+    updateDimensions();
+    m_waveformGenerator->calculateWaveform(m_scopeRect.size(), m_activeRender->extractFrame(m_activeRender->seekFramePosition()), true);
+    QWidget::resizeEvent(event);
+}
+
+void Waveform::mouseReleaseEvent(QMouseEvent *)
+{
+    qDebug() << "Calculating scope now. Size: " << m_scopeRect.size().width() << "x" << m_scopeRect.size().height();
+    m_waveformGenerator->calculateWaveform(m_scopeRect.size(), m_activeRender->extractFrame(m_activeRender->seekFramePosition()), true);
+}
+
+
+///// Slots /////
+
+void Waveform::slotWaveformCalculated(QImage waveform, const uint &msec)
+{
+    qDebug() << "Waveform received. Time taken for rendering: " << msec << " ms. Painting it.";
+    m_waveform = waveform;
+    this->update();
+}
+
+void Waveform::slotActiveMonitorChanged(bool isClipMonitor)
+{
+    if (isClipMonitor) {
+        m_activeRender = m_clipMonitor->render;
+        disconnect(this, SLOT(slotRenderZoneUpdated()));
+        connect(m_activeRender, SIGNAL(rendererPosition(int)), this, SLOT(slotRenderZoneUpdated()));
+    } else {
+        m_activeRender = m_projMonitor->render;
+        disconnect(this, SLOT(slotRenderZoneUpdated()));
+        connect(m_activeRender, SIGNAL(rendererPosition(int)), this, SLOT(slotRenderZoneUpdated()));
+    }
+}
+
+void Waveform::slotRenderZoneUpdated()
+{
+    qDebug() << "Monitor incoming.";//New frames total: " << newFrames;
+    // Monitor has shown a new frame
+//    newFrames.fetchAndAddRelaxed(1);
+//    if (cbAutoRefresh->isChecked()) {
+//        prodCalcThread();
+//    }
 }