1 /***************************************************************************
2 * Copyright (C) 2007 by Jean-Baptiste Mardelle (jb@kdenlive.org) *
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. *
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. *
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 ***************************************************************************/
21 #include <QMouseEvent>
22 #include <QStylePainter>
30 Monitor::Monitor(QString name, MonitorManager *manager, QWidget *parent)
31 : QWidget(parent), render(NULL), m_monitorManager(manager), m_name(name), m_isActive(false)
35 m_ruler = new SmallRuler();
36 QVBoxLayout *layout = new QVBoxLayout;
37 layout->addWidget( m_ruler);
38 ui.ruler_frame->setLayout( layout );
39 //m_ruler->setPixelPerMark(3);
40 m_playIcon = KIcon("media-playback-start");
41 m_pauseIcon = KIcon("media-playback-pause");
42 ui.button_play->setIcon(m_playIcon);
43 ui.button_rew1->setIcon(KIcon("media-skip-backward"));
44 ui.button_rew->setIcon(KIcon("media-seek-backward"));
45 ui.button_fwd1->setIcon(KIcon("media-skip-forward"));
46 ui.button_fwd->setIcon(KIcon("media-seek-forward"));
47 connect(m_ruler, SIGNAL(seekRenderer(int)), this, SLOT(slotSeek(int)));
48 connect(ui.button_rew, SIGNAL(clicked()), this, SLOT(slotRewind()));
49 connect(ui.button_rew1, SIGNAL(clicked()), this, SLOT(slotRewindOneFrame()));
50 connect(ui.button_fwd, SIGNAL(clicked()), this, SLOT(slotForward()));
51 connect(ui.button_fwd1, SIGNAL(clicked()), this, SLOT(slotForwardOneFrame()));
52 connect(ui.button_play, SIGNAL(clicked()), this, SLOT(slotPlay()));
53 //if ( render ) return;
54 render = new Render(m_name, (int) ui.video_frame->winId(), -1, this);
55 connect(render, SIGNAL(playListDuration(int)), this, SLOT(adjustRulerSize(int)));
56 connect(render, SIGNAL(rendererPosition(int)), this, SLOT(seekCursor(int)));
57 connect(render, SIGNAL(rendererStopped(int)), this, SLOT(rendererStopped(int)));
58 if (name != "clip") connect(render, SIGNAL(rendererPosition(int)), this, SIGNAL(renderPosition(int)));
59 //render->createVideoXWindow(ui.video_frame->winId(), -1);
60 int width = m_ruler->width();
61 m_ruler->setLength(width);
62 m_ruler->setMaximum(width);
65 kDebug()<<"/////// BUILDING MONITOR, ID: "<<ui.video_frame->winId();
69 void Monitor::mousePressEvent ( QMouseEvent * event )
75 void Monitor::wheelEvent ( QWheelEvent * event )
77 if (event->delta() > 0) slotForwardOneFrame();
78 else slotRewindOneFrame();
81 void Monitor::activateMonitor()
83 if (!m_isActive) m_monitorManager->activateMonitor(m_name);
86 void Monitor::slotSeek(int pos)
88 if (!m_isActive) m_monitorManager->activateMonitor(m_name);
89 if ( render == NULL ) return;
90 int realPos = ((double) pos) / m_scale;
91 render->seekToFrame(realPos);
93 emit renderPosition(m_position);
94 ui.monitor_time->setText(m_monitorManager->timecode().getTimecodeFromFrames(m_position));
97 void Monitor::slotRewind()
99 if (!m_isActive) m_monitorManager->activateMonitor(m_name);
100 double speed = render->playSpeed();
101 if ( speed >= 0 ) render->play(-2);
102 else render->play(speed * 2);
103 ui.button_play->setChecked(true);
104 ui.button_play->setIcon(m_pauseIcon);
107 void Monitor::slotForward()
109 if (!m_isActive) m_monitorManager->activateMonitor(m_name);
110 double speed = render->playSpeed();
111 if ( speed <= 1 ) render->play(2);
112 else render->play(speed * 2);
113 ui.button_play->setChecked(true);
114 ui.button_play->setIcon(m_pauseIcon);
117 void Monitor::slotRewindOneFrame()
119 if (!m_isActive) m_monitorManager->activateMonitor(m_name);
121 if (m_position < 1) return;
123 render->seekToFrame(m_position);
124 ui.monitor_time->setText(m_monitorManager->timecode().getTimecodeFromFrames(m_position));
127 void Monitor::slotForwardOneFrame()
129 if (!m_isActive) m_monitorManager->activateMonitor(m_name);
131 if (m_position >= m_length) return;
133 render->seekToFrame(m_position);
134 ui.monitor_time->setText(m_monitorManager->timecode().getTimecodeFromFrames(m_position));
137 void Monitor::seekCursor(int pos)
139 if (!m_isActive) m_monitorManager->activateMonitor(m_name);
140 int rulerPos = (int) (pos * m_scale);
142 ui.monitor_time->setText(m_monitorManager->timecode().getTimecodeFromFrames(pos));
143 //kDebug()<<"seek: "<<pos<<", scale: "<<m_scale<<
144 m_ruler->slotNewValue(rulerPos);
147 void Monitor::rendererStopped(int pos)
149 int rulerPos = (int) (pos * m_scale);
150 m_ruler->slotNewValue(rulerPos);
151 ui.button_play->setChecked(false);
152 ui.button_play->setIcon(m_playIcon);
155 void Monitor::initMonitor()
157 kDebug()<<"/////// INITING MONITOR, ID: "<<ui.video_frame->winId();
162 void Monitor::resizeEvent ( QResizeEvent * event )
165 if (render) render->askForRefresh();
168 void Monitor::adjustRulerSize(int length)
170 int width = m_ruler->width();
171 m_ruler->setLength(width);
172 if (length > 0) m_length = length;
173 m_scale = (double) width / m_length;
174 if (m_scale == 0) m_scale = 1;
175 kDebug()<<"RULER WIDT: "<<width<<", RENDER LENGT: "<<m_length<<", SCALE: "<<m_scale;
176 m_ruler->setPixelPerMark(m_scale);
177 m_ruler->setMaximum(width);
178 //m_ruler->setLength(length);
184 if (render) render->stop();
187 void Monitor::start()
190 if (render) render->start();
193 void Monitor::refreshMonitor(bool visible)
195 if (visible && render) render->askForRefresh();
198 void Monitor::slotPlay()
200 if ( render == NULL ) return;
201 if (!m_isActive) m_monitorManager->activateMonitor(m_name);
202 render->switchPlay();
203 ui.button_play->setChecked(true);
204 ui.button_play->setIcon(m_pauseIcon);
207 void Monitor::slotSetXml(const QDomElement &e)
209 if ( render == NULL ) return;
210 if (!m_isActive) m_monitorManager->activateMonitor(m_name);
212 QDomElement westley = doc.createElement("westley");
213 doc.appendChild(westley);
214 westley.appendChild(e);
215 render->setSceneList(doc, 0);
216 m_ruler->slotNewValue(0);
217 ui.monitor_time->setText("00:00:00:00");
222 void Monitor::slotOpenFile(const QString &file)
224 if ( render == NULL ) return;
225 if (!m_isActive) m_monitorManager->activateMonitor(m_name);
227 QDomElement westley = doc.createElement("westley");
228 doc.appendChild(westley);
229 QDomElement prod = doc.createElement("producer");
230 westley.appendChild(prod);
231 prod.setAttribute("mlt_service", "avformat");
232 prod.setAttribute("resource", file);
233 render->setSceneList(doc, 0);
238 #include "monitor.moc"