X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmonitor.cpp;h=0048c04ac346a0e06e07507cc90d731240d2df02;hb=12ec352602795fa2970c71fccab4bad309d817ea;hp=3454e442fb7ccedf93f434541f35584d65d96c92;hpb=743967ef882a09c0e23068be3216a9a7d1fd82dd;p=kdenlive diff --git a/src/monitor.cpp b/src/monitor.cpp index 3454e442..0048c04a 100644 --- a/src/monitor.cpp +++ b/src/monitor.cpp @@ -33,16 +33,17 @@ #include "renderer.h" #include "monitormanager.h" #include "smallruler.h" +#include "docclipbase.h" Monitor::Monitor(QString name, MonitorManager *manager, QWidget *parent) - : QWidget(parent), render(NULL), m_monitorManager(manager), m_name(name), m_isActive(false) { + : QWidget(parent), render(NULL), m_monitorManager(manager), m_name(name), m_isActive(false), m_currentClip(NULL) { ui.setupUi(this); m_scale = 1; m_ruler = new SmallRuler(); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(m_ruler); ui.ruler_frame->setLayout(layout); - + setMinimumHeight(200); QToolBar *toolbar = new QToolBar(name, this); QVBoxLayout *layout2 = new QVBoxLayout; @@ -88,28 +89,34 @@ Monitor::Monitor(QString name, MonitorManager *manager, QWidget *parent) QVBoxLayout *rendererBox = new QVBoxLayout(ui.video_frame); m_monitorRefresh = new MonitorRefresh(ui.video_frame); rendererBox->addWidget(m_monitorRefresh); - //m_monitorRefresh->setAttribute(Qt::WA_PaintOnScreen); render = new Render(m_name, (int) m_monitorRefresh->winId(), -1, this); m_monitorRefresh->setRenderer(render); + m_contextMenu = new QMenu(this); + m_contextMenu->addMenu(playMenu); + QAction *extractFrame = m_contextMenu->addAction(KIcon("document-new"), i18n("Extract frame")); + connect(extractFrame, SIGNAL(triggered()), this, SLOT(slotExtractCurrentFrame())); + connect(m_ruler, SIGNAL(seekRenderer(int)), this, SLOT(slotSeek(int))); + connect(render, SIGNAL(durationChanged(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))); + QAction *splitView = m_contextMenu->addAction(KIcon("document-new"), i18n("Split view")); + splitView->setCheckable(true); + connect(splitView, SIGNAL(toggled(bool)), render, SLOT(slotSplitView(bool))); + } else { + QAction *setThumbFrame = m_contextMenu->addAction(KIcon("document-new"), i18n("Set current image as thumbnail")); + connect(setThumbFrame, SIGNAL(triggered()), this, SLOT(slotSetThumbFrame())); } //render->createVideoXWindow(ui.video_frame->winId(), -1); int width = m_ruler->width(); m_ruler->setLength(width); m_ruler->setMaximum(width); m_length = 0; - - m_contextMenu = new QMenu(this); - m_contextMenu->addMenu(playMenu); - QAction *extractFrame = m_contextMenu->addAction(KIcon("document-new"), i18n("Extract frame")); - connect(extractFrame, SIGNAL(triggered()), this, SLOT(slotExtractCurrentFrame())); - + m_monitorRefresh->show(); kDebug() << "/////// BUILDING MONITOR, ID: " << ui.video_frame->winId(); } @@ -135,6 +142,14 @@ void Monitor::wheelEvent(QWheelEvent * event) { } } +void Monitor::slotSetThumbFrame() { + if (m_currentClip == NULL) { + return; + } + m_currentClip->setClipThumbFrame((uint) m_position); + emit refreshClipThumbnail(m_currentClip->getId()); +} + void Monitor::slotExtractCurrentFrame() { QPixmap frame = render->extractFrame(m_position); QString outputFile = KFileDialog::getSaveFileName(KUrl(), "image/png"); @@ -154,6 +169,24 @@ void Monitor::slotSeek(int pos) { m_timePos->setText(m_monitorManager->timecode().getTimecodeFromFrames(m_position)); } +void Monitor::slotStart() { + if (!m_isActive) m_monitorManager->activateMonitor(m_name); + render->play(0); + m_position = 0; + render->seekToFrame(m_position); + emit renderPosition(m_position); + m_timePos->setText(m_monitorManager->timecode().getTimecodeFromFrames(m_position)); +} + +void Monitor::slotEnd() { + if (!m_isActive) m_monitorManager->activateMonitor(m_name); + render->play(0); + m_position = render->getLength(); + render->seekToFrame(m_position); + emit renderPosition(m_position); + m_timePos->setText(m_monitorManager->timecode().getTimecodeFromFrames(m_position)); +} + void Monitor::slotRewind(double speed) { if (!m_isActive) m_monitorManager->activateMonitor(m_name); if (speed == 0) { @@ -198,16 +231,16 @@ void Monitor::slotForwardOneFrame() { void Monitor::seekCursor(int pos) { if (!m_isActive) m_monitorManager->activateMonitor(m_name); - int rulerPos = (int)(pos * m_scale); + //int rulerPos = (int)(pos * m_scale); m_position = pos; m_timePos->setText(m_monitorManager->timecode().getTimecodeFromFrames(pos)); //kDebug() << "seek: " << pos << ", scale: " << m_scale; - m_ruler->slotNewValue(rulerPos); + m_ruler->slotNewValue(pos); //rulerPos); } void Monitor::rendererStopped(int pos) { - int rulerPos = (int)(pos * m_scale); - m_ruler->slotNewValue(rulerPos); + //int rulerPos = (int)(pos * m_scale); + m_ruler->slotNewValue(pos); m_position = pos; m_timePos->setText(m_monitorManager->timecode().getTimecodeFromFrames(pos)); m_playAction->setChecked(false); @@ -219,12 +252,12 @@ void Monitor::initMonitor() { } // virtual -void Monitor::resizeEvent(QResizeEvent * event) { +/*void Monitor::resizeEvent(QResizeEvent * event) { QWidget::resizeEvent(event); adjustRulerSize(-1); if (render && m_isActive) render->doRefresh(); // -} +}*/ void Monitor::adjustRulerSize(int length) { int width = m_ruler->width(); @@ -241,17 +274,19 @@ void Monitor::adjustRulerSize(int length) { void Monitor::stop() { m_isActive = false; if (render) render->stop(); + //kDebug()<<"/// MONITOR RENDER STOP"; } void Monitor::start() { m_isActive = true; if (render) render->start(); + //kDebug()<<"/// MONITOR RENDER START"; } void Monitor::refreshMonitor(bool visible) { if (visible && render) { if (!m_isActive) m_monitorManager->activateMonitor(m_name); - render->askForRefresh(); + render->doRefresh(); //askForRefresh(); } } @@ -263,17 +298,18 @@ void Monitor::slotPlay() { m_playAction->setIcon(m_pauseIcon); } -void Monitor::slotSetXml(const QDomElement &e) { +void Monitor::slotSetXml(DocClipBase *clip, const int position) { if (render == NULL) return; 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); - m_timePos->setText("00:00:00:00"); - m_position = 0; + if (!clip) return; + if (clip != m_currentClip || m_currentClip->producer() == NULL) { + m_currentClip = clip; + render->setProducer(clip->producer(), position); + //m_ruler->slotNewValue(0); + //adjustRulerSize(clip->producer()->get_playtime()); + //m_timePos->setText("00:00:00:00"); + m_position = position; + } else if (position != -1) render->seek(GenTime(position, render->fps())); } void Monitor::slotOpenFile(const QString &file) { @@ -294,13 +330,14 @@ void Monitor::resetProfile(QString prof) { render->resetProfile(prof); } -void Monitor::saveSceneList(QString path, QDomElement e) { +void Monitor::saveSceneList(QString path, QDomElement info) { if (render == NULL) return; - render->saveSceneList(path, e); + render->saveSceneList(path, info); } MonitorRefresh::MonitorRefresh(QWidget* parent): QWidget(parent), m_renderer(NULL) { - + setAttribute(Qt::WA_PaintOnScreen); + setAttribute(Qt::WA_OpaquePaintEvent); //Qt::WA_NoSystemBackground); } void MonitorRefresh::setRenderer(Render* render) { @@ -308,7 +345,7 @@ void MonitorRefresh::setRenderer(Render* render) { } void MonitorRefresh::paintEvent(QPaintEvent * event) { - if (m_renderer != NULL) m_renderer->doRefresh(); + if (m_renderer) m_renderer->doRefresh(); } #include "monitor.moc"