From 9f76a9103088feb8ae3feef0343ddfdcf0685fe6 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Mon, 13 Apr 2009 18:40:43 +0000 Subject: [PATCH] Check & update clip length in timeline when doing a "clip reload" from project tree + some cleanup: http://www.kdenlive.org/mantis/view.php?id=769 svn path=/trunk/kdenlive/; revision=3293 --- src/clipitem.cpp | 21 ++++++++++++++++++--- src/clipitem.h | 2 +- src/customtrackview.cpp | 5 +++-- src/kdenlivedoc.cpp | 33 ++++----------------------------- src/kdenlivedoc.h | 2 -- src/mainwindow.cpp | 21 ++++++++++----------- src/mainwindow.h | 2 +- src/projectlist.cpp | 6 +++++- src/projectlist.h | 2 +- 9 files changed, 43 insertions(+), 51 deletions(-) diff --git a/src/clipitem.cpp b/src/clipitem.cpp index 19034320..3c0ebdb8 100644 --- a/src/clipitem.cpp +++ b/src/clipitem.cpp @@ -402,9 +402,24 @@ void ClipItem::resetThumbs() } -void ClipItem::refreshClip() -{ - m_maxDuration = m_clip->maxDuration(); +void ClipItem::refreshClip(bool checkDuration) +{ + if (checkDuration && (m_maxDuration != m_clip->maxDuration())) { + m_maxDuration = m_clip->maxDuration(); + if (m_clipType != IMAGE && m_clipType != TEXT && m_clipType != COLOR) { + if (m_cropStart + m_cropDuration > m_maxDuration) { + // Clip duration changed, make sure to stay in correct range + if (m_cropStart > m_maxDuration) { + m_cropStart = GenTime(); + m_cropDuration = qMin(m_cropDuration, m_maxDuration); + updateRectGeometry(); + } else { + m_cropDuration = m_maxDuration; + updateRectGeometry(); + } + } + } + } if (m_clipType == COLOR) { QString colour = m_clip->getProperty("colour"); colour = colour.replace(0, 2, "#"); diff --git a/src/clipitem.h b/src/clipitem.h index 16cf33d1..9436033d 100644 --- a/src/clipitem.h +++ b/src/clipitem.h @@ -81,7 +81,7 @@ public: /** regenerate audio and video thumbnails */ void resetThumbs(); /** update clip properties from base clip */ - void refreshClip(); + void refreshClip(bool checkDuration); /** Returns a list of times for this clip's markers */ QList snapMarkers() const; QList commentedSnapMarkers() const; diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index b188368a..c74204da 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -2894,7 +2894,7 @@ void CustomTrackView::slotUpdateClip(const QString &clipId) if (list.at(i)->type() == AVWIDGET) { clip = static_cast (list.at(i)); if (clip->clipProducer() == clipId) { - clip->refreshClip(); + clip->refreshClip(true); ItemInfo info = clip->info(); info.track = m_document->tracksCount() - clip->track(); m_document->renderer()->mltUpdateClip(info, clip->xml(), clip->baseClip()->producer()); @@ -3985,7 +3985,7 @@ void CustomTrackView::slotUpdateAllThumbs() } } } - item->refreshClip(); + item->refreshClip(false); qApp->processEvents(); } } @@ -4457,4 +4457,5 @@ void CustomTrackView::updateClipTypeActions(ClipItem *clip) } } + #include "customtrackview.moc" diff --git a/src/kdenlivedoc.cpp b/src/kdenlivedoc.cpp index af49bf71..197e2da9 100644 --- a/src/kdenlivedoc.cpp +++ b/src/kdenlivedoc.cpp @@ -250,7 +250,9 @@ KdenliveDoc::~KdenliveDoc() void KdenliveDoc::setSceneList() { m_render->setSceneList(m_document.toString(), m_startPos); - //checkProjectClips(); + // m_document xml is now useless, clear it + m_document.clear(); + checkProjectClips(); } QDomDocument KdenliveDoc::createEmptyDocument(const int videotracks, const int audiotracks) @@ -1195,6 +1197,7 @@ void KdenliveDoc::setRenderer(Render *render) { void KdenliveDoc::checkProjectClips() { + kDebug() << "+++++++++++++ + + + + CHK PCLIPS"; if (m_render == NULL) return; m_clipManager->resetProducersList(m_render->producersList()); return; @@ -1277,34 +1280,6 @@ QString KdenliveDoc::producerName(const QString &id) return result; } -void KdenliveDoc::setProducerDuration(const QString &id, int duration) -{ - QDomNodeList prods = producersList(); - int ct = prods.count(); - for (int i = 0; i < ct ; i++) { - QDomElement e = prods.item(i).toElement(); - if (e.attribute("id") != "black" && e.attribute("id") == id) { - e.setAttribute("duration", QString::number(duration)); - break; - } - } -} - -int KdenliveDoc::getProducerDuration(const QString &id) -{ - int result = 0; - QDomNodeList prods = producersList(); - int ct = prods.count(); - for (int i = 0; i < ct ; i++) { - QDomElement e = prods.item(i).toElement(); - if (e.attribute("id") != "black" && e.attribute("id") == id) { - result = e.attribute("duration").toInt(); - break; - } - } - return result; -} - QDomDocument KdenliveDoc::toXml() { return m_document; diff --git a/src/kdenlivedoc.h b/src/kdenlivedoc.h index 47afa10b..3b2d8ea3 100644 --- a/src/kdenlivedoc.h +++ b/src/kdenlivedoc.h @@ -62,8 +62,6 @@ Q_OBJECT public: //void setRenderer(Render *render); QUndoStack *commandStack(); QString producerName(const QString &id); - void setProducerDuration(const QString &id, int duration); - int getProducerDuration(const QString &id); Render *renderer(); QDomDocument m_guidesXml; QDomElement guidesXml() const; diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 1cf0dd5a..2bebce59 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -389,8 +389,8 @@ bool MainWindow::queryClose() // save document here. If saving fails, return false; return saveFile(); case KMessageBox::No : - // User does not want to save the changes, clear recovery files - m_activeDocument->m_autosave->resize(0); + // User does not want to save the changes, clear recovery files + m_activeDocument->m_autosave->resize(0); return true; default: // cancel return false; @@ -568,8 +568,7 @@ void MainWindow::slotAddEffect(QDomElement effect, GenTime pos, int track) kDebug() << "--- ERROR, TRYING TO APPEND NULL EFFECT"; return; } - TrackView *currentTimeLine = (TrackView *) m_timelineArea->currentWidget(); - currentTimeLine->projectView()->slotAddEffect(effect.cloneNode().toElement(), pos, track); + m_activeTimeline->projectView()->slotAddEffect(effect.cloneNode().toElement(), pos, track); } void MainWindow::slotRaiseMonitor(bool clipMonitor) @@ -578,17 +577,17 @@ void MainWindow::slotRaiseMonitor(bool clipMonitor) else m_projectMonitorDock->raise(); } -void MainWindow::slotSetClipDuration(const QString &id, int duration) +void MainWindow::slotUpdateClip(const QString &id) { if (!m_activeDocument) return; - m_activeDocument->setProducerDuration(id, duration); + m_activeTimeline->projectView()->slotUpdateClip(id); } void MainWindow::slotConnectMonitors() { m_projectList->setRenderer(m_projectMonitor->render); - connect(m_projectList, SIGNAL(receivedClipDuration(const QString &, int)), this, SLOT(slotSetClipDuration(const QString &, int))); + connect(m_projectList, SIGNAL(receivedClipDuration(const QString &)), this, SLOT(slotUpdateClip(const QString &))); connect(m_projectList, SIGNAL(showClipProperties(DocClipBase *)), this, SLOT(slotShowClipProperties(DocClipBase *))); connect(m_projectList, SIGNAL(getFileProperties(const QDomElement &, const QString &, bool)), m_projectMonitor->render, SLOT(getFileProperties(const QDomElement &, const QString &, bool))); connect(m_projectMonitor->render, SIGNAL(replyGetImage(const QString &, const QPixmap &)), m_projectList, SLOT(slotReplyGetImage(const QString &, const QPixmap &))); @@ -1563,10 +1562,10 @@ void MainWindow::slotDoRender(const QString &dest, const QString &render, const if (dest.isEmpty()) return; int in = 0; int out = 0; - TrackView *currentTab = (TrackView *) m_timelineArea->currentWidget(); - if (currentTab && zoneOnly) { - in = currentTab->inPoint(); - out = currentTab->outPoint(); + + if (m_activeTimeline && zoneOnly) { + in = m_activeTimeline->inPoint(); + out = m_activeTimeline->outPoint(); } KTemporaryFile temp; temp.setAutoRemove(false); diff --git a/src/mainwindow.h b/src/mainwindow.h index 699b8cdd..510280c6 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -213,7 +213,7 @@ private slots: void updateConfiguration(); void slotConnectMonitors(); void slotRaiseMonitor(bool clipMonitor); - void slotSetClipDuration(const QString &id, int duration); + void slotUpdateClip(const QString &id); void slotUpdateMousePosition(int pos); void slotAddEffect(QDomElement effect, GenTime pos = GenTime(), int track = -1); void slotEditProfiles(); diff --git a/src/projectlist.cpp b/src/projectlist.cpp index d1be91f7..4f229a7e 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -814,7 +814,11 @@ void ProjectList::slotReplyGetFileProperties(const QString &clipId, Mlt::Produce item->setProperties(properties, metadata); Q_ASSERT_X(item->referencedClip(), "void ProjectList::slotReplyGetFileProperties", QString("Item with groupName %1 does not have a clip associated").arg(item->groupName()).toLatin1()); if (replace) item->referencedClip()->setProducer(producer); - emit receivedClipDuration(clipId, item->clipMaxDuration()); + else { + // Check if duration changed. + emit receivedClipDuration(clipId); + delete producer; + } m_listView->blockSignals(false); } else kDebug() << "//////// COULD NOT FIND CLIP TO UPDATE PRPS..."; if (!m_infoQueue.isEmpty()) QTimer::singleShot(300, this, SLOT(slotProcessNextClipInQueue())); diff --git a/src/projectlist.h b/src/projectlist.h index a23dd872..879ddd11 100644 --- a/src/projectlist.h +++ b/src/projectlist.h @@ -193,7 +193,7 @@ private slots: signals: void clipSelected(DocClipBase *); void getFileProperties(const QDomElement&, const QString &, bool); - void receivedClipDuration(const QString &, int); + void receivedClipDuration(const QString &); void showClipProperties(DocClipBase *); void projectModified(); void loadingIsOver(); -- 2.39.2