]> git.sesse.net Git - kdenlive/blob - src/waveform.cpp
Waveform monitor added.
[kdenlive] / src / waveform.cpp
1 /***************************************************************************
2  *   Copyright (C) 2010 by Simon Andreas Eugster (simon.eu@gmail.com)      *
3  *   This file is part of kdenlive. See www.kdenlive.org.                  *
4  *                                                                         *
5  *   This program is free software; you can redistribute it and/or modify  *
6  *   it under the terms of the GNU General Public License as published by  *
7  *   the Free Software Foundation; either version 2 of the License, or     *
8  *   (at your option) any later version.                                   *
9  ***************************************************************************/
10
11 #include <QPainter>
12 #include <QPoint>
13 #include <QDebug>
14
15 #include "waveform.h"
16
17
18 Waveform::Waveform(Monitor *projMonitor, Monitor *clipMonitor, QWidget *parent) :
19     QWidget(parent),
20     m_projMonitor(projMonitor),
21     m_clipMonitor(clipMonitor),
22     m_activeRender(clipMonitor->render),
23     initialDimensionUpdateDone(false)
24 {
25     setupUi(this);
26     m_waveformGenerator = new WaveformGenerator();
27
28     connect(m_waveformGenerator, SIGNAL(signalCalculationFinished(QImage,uint)), this, SLOT(slotWaveformCalculated(QImage,uint)));
29 }
30
31 Waveform::~Waveform()
32 {
33     delete m_waveformGenerator;
34 }
35
36
37
38 void Waveform::updateDimensions()
39 {
40     // Distance from top/left/right
41     int offset = 6;
42
43     QPoint topleft(offset, line->y()+offset);
44
45     m_scopeRect = QRect(topleft, this->size() - QSize(offset+topleft.x(), offset+topleft.y()));
46 }
47
48
49 ///// Events /////
50
51 void Waveform::paintEvent(QPaintEvent *)
52 {
53     if (!initialDimensionUpdateDone) {
54         // This is a workaround.
55         // When updating the dimensions in the constructor, the size
56         // of the control items at the top are simply ignored! So do
57         // it here instead.
58         updateDimensions();
59         initialDimensionUpdateDone = true;
60     }
61
62     QPainter davinci(this);
63     QPoint vinciPoint;
64
65     davinci.setRenderHint(QPainter::Antialiasing, true);
66     davinci.fillRect(0, 0, this->size().width(), this->size().height(), QColor(25,25,23));
67
68     davinci.drawImage(m_scopeRect.topLeft(), m_waveform);
69
70 }
71
72 void Waveform::resizeEvent(QResizeEvent *event)
73 {
74     updateDimensions();
75     m_waveformGenerator->calculateWaveform(m_scopeRect.size(), m_activeRender->extractFrame(m_activeRender->seekFramePosition()), true);
76     QWidget::resizeEvent(event);
77 }
78
79 void Waveform::mouseReleaseEvent(QMouseEvent *)
80 {
81     qDebug() << "Calculating scope now. Size: " << m_scopeRect.size().width() << "x" << m_scopeRect.size().height();
82     m_waveformGenerator->calculateWaveform(m_scopeRect.size(), m_activeRender->extractFrame(m_activeRender->seekFramePosition()), true);
83 }
84
85
86 ///// Slots /////
87
88 void Waveform::slotWaveformCalculated(QImage waveform, const uint &msec)
89 {
90     qDebug() << "Waveform received. Time taken for rendering: " << msec << " ms. Painting it.";
91     m_waveform = waveform;
92     this->update();
93 }
94
95 void Waveform::slotActiveMonitorChanged(bool isClipMonitor)
96 {
97     if (isClipMonitor) {
98         m_activeRender = m_clipMonitor->render;
99         disconnect(this, SLOT(slotRenderZoneUpdated()));
100         connect(m_activeRender, SIGNAL(rendererPosition(int)), this, SLOT(slotRenderZoneUpdated()));
101     } else {
102         m_activeRender = m_projMonitor->render;
103         disconnect(this, SLOT(slotRenderZoneUpdated()));
104         connect(m_activeRender, SIGNAL(rendererPosition(int)), this, SLOT(slotRenderZoneUpdated()));
105     }
106 }
107
108 void Waveform::slotRenderZoneUpdated()
109 {
110     qDebug() << "Monitor incoming.";//New frames total: " << newFrames;
111     // Monitor has shown a new frame
112 //    newFrames.fetchAndAddRelaxed(1);
113 //    if (cbAutoRefresh->isChecked()) {
114 //        prodCalcThread();
115 //    }
116 }