]> git.sesse.net Git - kdenlive/blob - src/monitormanager.cpp
* Cleanup transode stabilize GUI: http://kdenlive.org/mantis/view.php?id=2930
[kdenlive] / src / monitormanager.cpp
1 /***************************************************************************
2  *   Copyright (C) 2007 by Jean-Baptiste Mardelle (jb@kdenlive.org)        *
3  *                                                                         *
4  *   This program is free software; you can redistribute it and/or modify  *
5  *   it under the terms of the GNU General Public License as published by  *
6  *   the Free Software Foundation; either version 2 of the License, or     *
7  *   (at your option) any later version.                                   *
8  *                                                                         *
9  *   This program is distributed in the hope that it will be useful,       *
10  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
11  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
12  *   GNU General Public License for more details.                          *
13  *                                                                         *
14  *   You should have received a copy of the GNU General Public License     *
15  *   along with this program; if not, write to the                         *
16  *   Free Software Foundation, Inc.,                                       *
17  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA          *
18  ***************************************************************************/
19
20
21 #include "monitormanager.h"
22 #include "renderer.h"
23 #include "kdenlivesettings.h"
24 #include "kdenlivedoc.h"
25
26 #include <mlt++/Mlt.h>
27
28 #include <QObject>
29 #include <QTimer>
30 #include <KDebug>
31
32
33 MonitorManager::MonitorManager(QWidget *parent) :
34         QObject(parent),
35         m_document(NULL),
36         m_clipMonitor(NULL),
37         m_projectMonitor(NULL),
38         m_activeMonitor(NULL)
39 {
40 }
41
42 Timecode MonitorManager::timecode()
43 {
44     return m_timecode;
45 }
46
47 void MonitorManager::setDocument(KdenliveDoc *doc)
48 {
49     m_document = doc;
50 }
51
52 void MonitorManager::initMonitors(Monitor *clipMonitor, Monitor *projectMonitor, RecMonitor *recMonitor)
53 {
54     m_clipMonitor = clipMonitor;
55     m_projectMonitor = projectMonitor;
56
57     m_monitorsList.append(clipMonitor);
58     m_monitorsList.append(projectMonitor);
59     if (recMonitor)
60         m_monitorsList.append(recMonitor);
61 }
62
63 void MonitorManager::appendMonitor(AbstractMonitor *monitor)
64 {
65     if (!m_monitorsList.contains(monitor)) m_monitorsList.append(monitor);
66 }
67
68 void MonitorManager::removeMonitor(AbstractMonitor *monitor)
69 {
70     m_monitorsList.removeAll(monitor);
71 }
72
73 AbstractMonitor* MonitorManager::monitor(Kdenlive::MONITORID monitorName)
74 {
75     AbstractMonitor *monitor = NULL;
76     for (int i = 0; i < m_monitorsList.size(); i++) {
77         if (m_monitorsList[i]->id() == monitorName) {
78             monitor = m_monitorsList[i];
79         }
80     }
81     return monitor;
82 }
83
84 bool MonitorManager::activateMonitor(Kdenlive::MONITORID name, bool forceRefresh)
85 {
86     if (m_clipMonitor == NULL || m_projectMonitor == NULL)
87         return false;
88     if (m_activeMonitor && m_activeMonitor->id() == name) {
89         if (forceRefresh) m_activeMonitor->start();
90         return false;
91     }
92     m_activeMonitor = NULL;
93     for (int i = 0; i < m_monitorsList.count(); i++) {
94         if (m_monitorsList.at(i)->id() == name) {
95             m_activeMonitor = m_monitorsList.at(i);
96         }
97         else m_monitorsList.at(i)->stop();
98     }
99     if (m_activeMonitor) {
100         m_activeMonitor->blockSignals(true);
101         m_activeMonitor->parentWidget()->raise();
102         m_activeMonitor->start();
103         m_activeMonitor->blockSignals(false);
104     }
105     emit checkColorScopes();
106     return (m_activeMonitor != NULL);
107 }
108
109 bool MonitorManager::isActive(Kdenlive::MONITORID id) const
110 {
111     return m_activeMonitor ? m_activeMonitor->id() == id: false;
112 }
113
114 void MonitorManager::slotSwitchMonitors(bool activateClip)
115 {
116     if (activateClip)
117         activateMonitor(Kdenlive::clipMonitor);
118     else
119         activateMonitor(Kdenlive::projectMonitor);
120 }
121
122 void MonitorManager::stopActiveMonitor()
123 {
124     if (m_activeMonitor == m_clipMonitor) m_clipMonitor->pause();
125     else if (m_activeMonitor == m_projectMonitor) m_projectMonitor->pause();
126 }
127
128 void MonitorManager::slotPlay()
129 {
130     if (m_activeMonitor) m_activeMonitor->slotPlay();
131 }
132
133 void MonitorManager::slotPause()
134 {
135     stopActiveMonitor();
136 }
137
138 void MonitorManager::slotPlayZone()
139 {
140     if (m_activeMonitor == m_clipMonitor) m_clipMonitor->slotPlayZone();
141     else if (m_activeMonitor == m_projectMonitor) m_projectMonitor->slotPlayZone();
142 }
143
144 void MonitorManager::slotLoopZone()
145 {
146     if (m_activeMonitor == m_clipMonitor) m_clipMonitor->slotLoopZone();
147     else m_projectMonitor->slotLoopZone();
148 }
149
150 void MonitorManager::slotRewind(double speed)
151 {
152     if (m_activeMonitor == m_clipMonitor) m_clipMonitor->slotRewind(speed);
153     else if (m_activeMonitor == m_projectMonitor) m_projectMonitor->slotRewind(speed);
154 }
155
156 void MonitorManager::slotForward(double speed)
157 {
158     if (m_activeMonitor == m_clipMonitor) m_clipMonitor->slotForward(speed);
159     else if (m_activeMonitor == m_projectMonitor) m_projectMonitor->slotForward(speed);
160 }
161
162 void MonitorManager::slotRewindOneFrame()
163 {
164     if (m_activeMonitor == m_clipMonitor) m_clipMonitor->slotRewindOneFrame();
165     else if (m_activeMonitor == m_projectMonitor) m_projectMonitor->slotRewindOneFrame();
166 }
167
168 void MonitorManager::slotForwardOneFrame()
169 {
170     if (m_activeMonitor == m_clipMonitor) m_clipMonitor->slotForwardOneFrame();
171     else if (m_activeMonitor == m_projectMonitor) m_projectMonitor->slotForwardOneFrame();
172 }
173
174 void MonitorManager::slotRewindOneSecond()
175 {
176     if (m_activeMonitor == m_clipMonitor) m_clipMonitor->slotRewindOneFrame(m_timecode.fps());
177     else if (m_activeMonitor == m_projectMonitor) m_projectMonitor->slotRewindOneFrame(m_timecode.fps());
178 }
179
180 void MonitorManager::slotForwardOneSecond()
181 {
182     if (m_activeMonitor == m_clipMonitor) m_clipMonitor->slotForwardOneFrame(m_timecode.fps());
183     else if (m_activeMonitor == m_projectMonitor) m_projectMonitor->slotForwardOneFrame(m_timecode.fps());
184 }
185
186 void MonitorManager::slotStart()
187 {
188     if (m_activeMonitor == m_clipMonitor) m_clipMonitor->slotStart();
189     else if (m_activeMonitor == m_projectMonitor) m_projectMonitor->slotStart();
190 }
191
192 void MonitorManager::slotEnd()
193 {
194     if (m_activeMonitor == m_clipMonitor) m_clipMonitor->slotEnd();
195     else if (m_activeMonitor == m_projectMonitor) m_projectMonitor->slotEnd();
196 }
197
198 void MonitorManager::resetProfiles(Timecode tc)
199 {
200     m_timecode = tc;
201     slotResetProfiles();
202     //QTimer::singleShot(300, this, SLOT(slotResetProfiles()));
203 }
204
205 void MonitorManager::slotResetProfiles()
206 {
207     if (m_projectMonitor == NULL || m_clipMonitor == NULL) {
208         return;
209     }
210     blockSignals(true);
211     Kdenlive::MONITORID active = m_activeMonitor ? m_activeMonitor->id() : Kdenlive::noMonitor;
212     m_clipMonitor->resetProfile(KdenliveSettings::current_profile());
213     m_projectMonitor->resetProfile(KdenliveSettings::current_profile());
214     if (active != Kdenlive::noMonitor) activateMonitor(active);
215     blockSignals(false);
216     if (m_activeMonitor) m_activeMonitor->parentWidget()->raise();
217     emit checkColorScopes();
218 }
219
220 void MonitorManager::slotRefreshCurrentMonitor(const QString &id)
221 {
222     // Clip producer was modified, check if clip is currently displayed in clip monitor
223     m_clipMonitor->reloadProducer(id);
224     if (m_activeMonitor == m_clipMonitor) m_clipMonitor->refreshMonitor();
225     else m_projectMonitor->refreshMonitor();
226 }
227
228 void MonitorManager::slotUpdateAudioMonitoring()
229 {
230     // if(...) added since they are 0x0 when the config wizard is running! --Granjow
231     /*if (m_clipMonitor) {
232         m_clipMonitor->render->analyseAudio = KdenliveSettings::monitor_audio();
233     }
234     if (m_projectMonitor) {
235         m_projectMonitor->render->analyseAudio = KdenliveSettings::monitor_audio();
236     }*/
237     for (int i = 0; i < m_monitorsList.count(); i++) {
238         if (m_monitorsList.at(i)->abstractRender()) m_monitorsList.at(i)->abstractRender()->analyseAudio = KdenliveSettings::monitor_audio();
239     }
240 }
241
242 void MonitorManager::clearScopeSource()
243 {
244     emit clearScopes();
245 }
246
247 void MonitorManager::updateScopeSource()
248 {
249     emit checkColorScopes();
250 }
251
252 AbstractRender *MonitorManager::activeRenderer()
253 {
254     if (m_activeMonitor) {
255         return m_activeMonitor->abstractRender();
256     }
257     return NULL;
258 }
259
260 void MonitorManager::slotSwitchFullscreen()
261 {
262     if (m_activeMonitor) m_activeMonitor->slotSwitchFullScreen();
263 }
264
265 QString MonitorManager::getProjectFolder() const
266 {
267     if (m_document == NULL) {
268         kDebug()<<" + + +NULL DOC!!";
269         return QString();
270     }
271     return m_document->projectFolder().path(KUrl::AddTrailingSlash);
272 }
273
274
275 #include "monitormanager.moc"