+/***************************************************************************
+ * Copyright (C) 2007 by Jean-Baptiste Mardelle (jb@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. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
+ ***************************************************************************/
+
#include <QMouseEvent>
#include <QStylePainter>
#include "monitor.h"
Monitor::Monitor(QString name, MonitorManager *manager, QWidget *parent)
- : QWidget(parent), render(NULL), m_monitorManager(manager), m_name(name)
+ : QWidget(parent), render(NULL), m_monitorManager(manager), m_name(name), m_isActive(false)
{
ui.setupUi(this);
m_scale = 1;
layout->addWidget( m_ruler);
ui.ruler_frame->setLayout( layout );
//m_ruler->setPixelPerMark(3);
+ m_playIcon = KIcon("media-playback-start");
+ m_pauseIcon = KIcon("media-playback-pause");
+ ui.button_play->setIcon(m_playIcon);
+ ui.button_rew1->setIcon(KIcon("media-skip-backward"));
+ ui.button_rew->setIcon(KIcon("media-seek-backward"));
+ ui.button_fwd1->setIcon(KIcon("media-skip-forward"));
+ ui.button_fwd->setIcon(KIcon("media-seek-forward"));
connect(m_ruler, SIGNAL(seekRenderer(int)), this, SLOT(slotSeek(int)));
- connect(ui.button_play, SIGNAL(clicked()), this, SLOT(slotOpen()));
connect(ui.button_rew, SIGNAL(clicked()), this, SLOT(slotRewind()));
- connect(ui.button_play_2, SIGNAL(clicked()), this, SLOT(slotPlay()));
+ connect(ui.button_rew1, SIGNAL(clicked()), this, SLOT(slotRewindOneFrame()));
+ connect(ui.button_fwd, SIGNAL(clicked()), this, SLOT(slotForward()));
+ connect(ui.button_fwd1, SIGNAL(clicked()), this, SLOT(slotForwardOneFrame()));
+ connect(ui.button_play, SIGNAL(clicked()), this, SLOT(slotPlay()));
+ //if ( render ) return;
+ render = new Render(m_name, (int) ui.video_frame->winId(), -1, this);
+ connect(render, SIGNAL(playListDuration(int)), this, SLOT(adjustRulerSize(int)));
+ connect(render, SIGNAL(rendererPosition(int)), this, SLOT(seekCursor(int)));
+ connect(render, SIGNAL(rendererStopped(int)), this, SLOT(rendererStopped(int)));
+ if (name != "clip") {
+ connect(render, SIGNAL(rendererPosition(int)), this, SIGNAL(renderPosition(int)));
+ connect(render, SIGNAL(durationChanged(int)), this, SIGNAL(durationChanged(int)));
+ }
+ //render->createVideoXWindow(ui.video_frame->winId(), -1);
+ int width = m_ruler->width();
+ m_ruler->setLength(width);
+ m_ruler->setMaximum(width);
+ m_length = 0;
+
+ kDebug()<<"/////// BUILDING MONITOR, ID: "<<ui.video_frame->winId();
}
// virtual
// virtual
void Monitor::wheelEvent ( QWheelEvent * event )
{
- render->play(0);
- if (event->delta() > 0) m_position++;
- else m_position--;
- render->seekToFrame(m_position);
+ if (event->delta() > 0) slotForwardOneFrame();
+ else slotRewindOneFrame();
+}
+
+void Monitor::activateMonitor()
+{
+ if (!m_isActive) m_monitorManager->activateMonitor(m_name);
}
void Monitor::slotSeek(int pos)
{
+ if (!m_isActive) m_monitorManager->activateMonitor(m_name);
if ( render == NULL ) return;
int realPos = ((double) pos) / m_scale;
render->seekToFrame(realPos);
-
+ m_position = realPos;
+ emit renderPosition(m_position);
+ ui.monitor_time->setText(m_monitorManager->timecode().getTimecodeFromFrames(m_position));
+}
+
+void Monitor::slotRewind()
+{
+ if (!m_isActive) m_monitorManager->activateMonitor(m_name);
+ double speed = render->playSpeed();
+ if ( speed >= 0 ) render->play(-2);
+ else render->play(speed * 2);
+ ui.button_play->setChecked(true);
+ ui.button_play->setIcon(m_pauseIcon);
+}
+
+void Monitor::slotForward()
+{
+ if (!m_isActive) m_monitorManager->activateMonitor(m_name);
+ double speed = render->playSpeed();
+ if ( speed <= 1 ) render->play(2);
+ else render->play(speed * 2);
+ ui.button_play->setChecked(true);
+ ui.button_play->setIcon(m_pauseIcon);
+}
+
+void Monitor::slotRewindOneFrame()
+{
+ if (!m_isActive) m_monitorManager->activateMonitor(m_name);
+ render->play(0);
+ if (m_position < 1) return;
+ m_position--;
+ render->seekToFrame(m_position);
+ ui.monitor_time->setText(m_monitorManager->timecode().getTimecodeFromFrames(m_position));
+}
+
+void Monitor::slotForwardOneFrame()
+{
+ if (!m_isActive) m_monitorManager->activateMonitor(m_name);
+ render->play(0);
+ if (m_position >= m_length) return;
+ m_position++;
+ render->seekToFrame(m_position);
+ ui.monitor_time->setText(m_monitorManager->timecode().getTimecodeFromFrames(m_position));
}
void Monitor::seekCursor(int pos)
{
+ if (!m_isActive) m_monitorManager->activateMonitor(m_name);
int rulerPos = (int) (pos * m_scale);
m_position = pos;
+ ui.monitor_time->setText(m_monitorManager->timecode().getTimecodeFromFrames(pos));
//kDebug()<<"seek: "<<pos<<", scale: "<<m_scale<<
m_ruler->slotNewValue(rulerPos);
}
{
int rulerPos = (int) (pos * m_scale);
m_ruler->slotNewValue(rulerPos);
- ui.button_play_2->setChecked(false);
+ ui.button_play->setChecked(false);
+ ui.button_play->setIcon(m_playIcon);
}
void Monitor::initMonitor()
{
- if ( render ) return;
- render = new Render(m_name, this);
- render->createVideoXWindow(ui.video_frame->winId(), -1);
- connect(render, SIGNAL(playListDuration(int)), this, SLOT(adjustRulerSize(int)));
- connect(render, SIGNAL(rendererPosition(int)), this, SLOT(seekCursor(int)));
- connect(render, SIGNAL(rendererStopped(int)), this, SLOT(rendererStopped(int)));
- int width = m_ruler->width();
- m_ruler->setLength(width);
- m_ruler->setMaximum(width);
- m_length = 0;
+ kDebug()<<"/////// INITING MONITOR, ID: "<<ui.video_frame->winId();
+
}
// virtual
void Monitor::stop()
{
+ m_isActive = false;
if (render) render->stop();
}
void Monitor::start()
{
+ m_isActive = true;
if (render) render->start();
}
if (visible && render) render->askForRefresh();
}
-void Monitor::slotOpen()
-{
- if ( render == NULL ) return;
- render->mltInsertClip(2, GenTime(1, 25), QString("<westley><producer mlt_service=\"colour\" colour=\"red\" in=\"1\" out=\"30\" /></westley>"));
- render->mltInsertClip(2, GenTime(0, 25), QString("<westley><producer mlt_service=\"avformat\" resource=\"/home/one/.vids/clip3e.mpg\" in=\"1\" out=\"300\" /></westley>"));
-}
-
-void Monitor::slotRewind()
-{
- if ( render == NULL ) return;
- m_monitorManager->activateMonitor(m_name);
- render->seek(GenTime(0));
-}
-
void Monitor::slotPlay()
{
if ( render == NULL ) return;
- m_monitorManager->activateMonitor(m_name);
+ if (!m_isActive) m_monitorManager->activateMonitor(m_name);
render->switchPlay();
- ui.button_play_2->setChecked(true);
+ ui.button_play->setChecked(true);
+ ui.button_play->setIcon(m_pauseIcon);
}
void Monitor::slotSetXml(const QDomElement &e)
{
if ( render == NULL ) return;
- m_monitorManager->activateMonitor(m_name);
+ if (!m_isActive) m_monitorManager->activateMonitor(m_name);
QDomDocument doc;
QDomElement westley = doc.createElement("westley");
doc.appendChild(westley);
westley.appendChild(e);
render->setSceneList(doc, 0);
m_ruler->slotNewValue(0);
+ ui.monitor_time->setText("00:00:00:00");
m_position = 0;
}
void Monitor::slotOpenFile(const QString &file)
{
if ( render == NULL ) return;
- m_monitorManager->activateMonitor(m_name);
+ if (!m_isActive) m_monitorManager->activateMonitor(m_name);
QDomDocument doc;
QDomElement westley = doc.createElement("westley");
doc.appendChild(westley);