From b61080cba46daa3b44dcc7992c68f91534b3ab27 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Mon, 26 Oct 2009 13:14:17 +0000 Subject: [PATCH] progress in timeline overwrite mode svn path=/trunk/kdenlive/; revision=4062 --- src/clipitem.cpp | 1 + src/customtrackview.cpp | 173 +++++++++++++++++--------------------- src/customtrackview.h | 4 + src/documentvalidator.cpp | 32 +++++++ src/effectslistview.cpp | 35 +++++--- src/effectslistview.h | 8 +- src/initeffects.cpp | 5 +- src/mainwindow.cpp | 18 ++-- src/projectsettings.cpp | 54 +++++++++--- src/projectsettings.h | 4 +- src/renderer.cpp | 3 +- src/renderer.h | 1 + src/titlewidget.cpp | 1 - 13 files changed, 200 insertions(+), 139 deletions(-) diff --git a/src/clipitem.cpp b/src/clipitem.cpp index f15929af..955878b4 100644 --- a/src/clipitem.cpp +++ b/src/clipitem.cpp @@ -463,6 +463,7 @@ void ClipItem::refreshClip(bool checkDuration) void ClipItem::slotFetchThumbs() { + if (scene() == NULL) return; if (m_clipType == IMAGE) { if (m_startPix.isNull()) { m_startPix = KThumb::getImage(KUrl(m_clip->getProperty("resource")), (int)(KdenliveSettings::trackheight() * KdenliveSettings::project_display_ratio()), KdenliveSettings::trackheight()); diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index f9759412..f76f0815 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -966,6 +966,7 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event) } else if (m_operationMode == MOVE) { setCursor(Qt::ClosedHandCursor); if (m_dragItem) m_dragItem->setZValue(10); + if (m_selectionGroup) m_selectionGroup->setZValue(10); } else if (m_operationMode == TRANSITIONSTART && event->modifiers() != Qt::ControlModifier) { ItemInfo info; info.startPos = m_dragItem->startPos(); @@ -2011,53 +2012,7 @@ void CustomTrackView::dropEvent(QDropEvent * event) if (m_document->renderer()->mltInsertClip(clipInfo, item->xml(), item->baseClip()->producer(item->track()), m_scene->editMode() == OVERWRITEEDIT, m_scene->editMode() == INSERTEDIT) == -1) { emit displayMessage(i18n("Cannot insert clip in timeline"), ErrorMessage); } - if (m_scene->editMode() == OVERWRITEEDIT) { - // if we are in overwrite or push mode, move clips accordingly - QRectF rect(clipInfo.startPos.frames(m_document->fps()), info.track * m_tracksHeight + m_tracksHeight / 2, (clipInfo.endPos - clipInfo.startPos).frames(m_document->fps()) - 1, m_tracksHeight / 2 - 2); - QList selection = m_scene->items(rect); - selection.removeAll(item); - for (int i = 0; i < selection.count(); i++) { - if (selection.at(i)->type() == AVWIDGET) { - ClipItem *clip = static_cast(selection.at(i)); - kDebug() << " - - FOUND COLLIDE CLIP: " << clip->baseClip()->getId(); - if (clip->startPos() < item->startPos()) { - if (clip->endPos() > item->endPos()) { - ItemInfo clipInfo = clip->info(); - ItemInfo dupInfo = clipInfo; - GenTime diff = item->startPos() - clip->startPos(); - dupInfo.startPos = item->startPos(); - dupInfo.cropStart += diff + GenTime(1, m_document->fps()); - dupInfo.cropDuration += GenTime() - diff; - ItemInfo newdupInfo = dupInfo; - GenTime diff2 = item->endPos() - item->startPos(); - newdupInfo.startPos = GenTime(item->endPos().frames(m_document->fps()), m_document->fps()); - newdupInfo.cropStart += diff2; - newdupInfo.cropDuration += GenTime() - diff2; - new RazorClipCommand(this, clipInfo, item->startPos(), false, addCommand); - new ResizeClipCommand(this, dupInfo, newdupInfo, false, false, addCommand); - ClipItem *dup = cutClip(clipInfo, item->startPos(), true, false); - if (dup) dup->resizeStart(item->endPos().frames(m_document->fps())); - - } else { - ItemInfo newclipInfo = clip->info(); - newclipInfo.endPos = item->startPos(); - new ResizeClipCommand(this, clip->info(), newclipInfo, false, false, addCommand); - clip->resizeEnd(item->startPos().frames(m_document->fps())); - } - } else if (clip->endPos() < item->endPos()) { - new AddTimelineClipCommand(this, clip->xml(), clip->clipProducer(), clip->info(), clip->effectList(), false, true, addCommand); - scene()->removeItem(clip); - delete clip; - clip = NULL; - } else { - ItemInfo newclipInfo = clip->info(); - newclipInfo.startPos = item->endPos(); - new ResizeClipCommand(this, clip->info(), newclipInfo, false, false, addCommand); - clip->resizeStart(item->endPos().frames(m_document->fps())); - } - } - } - } + adjustTimelineClips(m_scene->editMode(), item, addCommand); new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->info(), item->effectList(), false, false, addCommand); @@ -2078,6 +2033,57 @@ void CustomTrackView::dropEvent(QDropEvent * event) setFocus(); } +void CustomTrackView::adjustTimelineClips(EDITMODE mode, AbstractClipItem *item, QUndoCommand *command) +{ + if (mode == OVERWRITEEDIT) { + // if we are in overwrite or push mode, move clips accordingly + ItemInfo info = item->info(); + QRectF rect(info.startPos.frames(m_document->fps()), info.track * m_tracksHeight + m_tracksHeight / 2, (info.endPos - info.startPos).frames(m_document->fps()) - 1, m_tracksHeight / 2 - 2); + QList selection = m_scene->items(rect); + selection.removeAll(item); + for (int i = 0; i < selection.count(); i++) { + if (selection.at(i)->type() == AVWIDGET) { + ClipItem *clip = static_cast(selection.at(i)); + if (clip->startPos() < info.startPos) { + if (clip->endPos() > info.endPos) { + ItemInfo clipInfo = clip->info(); + ItemInfo dupInfo = clipInfo; + GenTime diff = info.startPos - clip->startPos(); + dupInfo.startPos = info.startPos; + dupInfo.cropStart += diff + GenTime(1, m_document->fps()); + dupInfo.cropDuration += GenTime() - diff; + ItemInfo newdupInfo = dupInfo; + GenTime diff2 = info.endPos - info.startPos; + newdupInfo.startPos = GenTime(info.endPos.frames(m_document->fps()), m_document->fps()); + newdupInfo.cropStart += diff2; + newdupInfo.cropDuration += GenTime() - diff2; + new RazorClipCommand(this, clipInfo, info.startPos, false, command); + new ResizeClipCommand(this, dupInfo, newdupInfo, false, false, command); + ClipItem *dup = cutClip(clipInfo, info.startPos, true, false); + if (dup) dup->resizeStart(info.endPos.frames(m_document->fps())); + + } else { + ItemInfo newclipInfo = clip->info(); + newclipInfo.endPos = info.startPos; + new ResizeClipCommand(this, clip->info(), newclipInfo, false, false, command); + clip->resizeEnd(info.startPos.frames(m_document->fps())); + } + } else if (clip->endPos() < info.endPos) { + new AddTimelineClipCommand(this, clip->xml(), clip->clipProducer(), clip->info(), clip->effectList(), false, true, command); + scene()->removeItem(clip); + delete clip; + clip = NULL; + } else { + ItemInfo newclipInfo = clip->info(); + newclipInfo.startPos = info.endPos; + new ResizeClipCommand(this, clip->info(), newclipInfo, false, false, command); + clip->resizeStart(info.endPos.frames(m_document->fps())); + } + } + } + } +} + QStringList CustomTrackView::mimeTypes() const { @@ -2669,6 +2675,7 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) if (m_operationMode == MOVE) { setCursor(Qt::OpenHandCursor); if (m_dragItem) m_dragItem->setZValue(2); + if (m_selectionGroup) m_selectionGroup->setZValue(2); if (m_dragItem->parentItem() == 0) { // we are moving one clip, easy if (m_dragItem->type() == AVWIDGET && (m_dragItemInfo.startPos != info.startPos || m_dragItemInfo.track != info.track)) { @@ -2682,52 +2689,8 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) if (success) { QUndoCommand *moveCommand = new QUndoCommand(); moveCommand->setText(i18n("Move clip")); + adjustTimelineClips(m_scene->editMode(), m_dragItem, moveCommand); - if (m_scene->editMode() == OVERWRITEEDIT) { - // if we are in overwrite or push mode, move clips accordingly - QRectF rect(info.startPos.frames(m_document->fps()), info.track * m_tracksHeight + m_tracksHeight / 2, (info.endPos - info.startPos).frames(m_document->fps()) - 1, m_tracksHeight / 2 - 2); - QList selection = m_scene->items(rect); - selection.removeAll(item); - for (int i = 0; i < selection.count(); i++) { - if (selection.at(i)->type() == AVWIDGET) { - ClipItem *clip = static_cast(selection.at(i)); - if (clip->startPos() < item->startPos()) { - if (clip->endPos() > item->endPos()) { - ItemInfo clipInfo = clip->info(); - ItemInfo dupInfo = clipInfo; - GenTime diff = item->startPos() - clip->startPos(); - dupInfo.startPos = item->startPos(); - dupInfo.cropStart += diff + GenTime(1, m_document->fps()); - dupInfo.cropDuration += GenTime() - diff; - ItemInfo newdupInfo = dupInfo; - GenTime diff2 = item->endPos() - item->startPos(); - newdupInfo.startPos = GenTime(item->endPos().frames(m_document->fps()), m_document->fps()); - newdupInfo.cropStart += diff2; - newdupInfo.cropDuration += GenTime() - diff2; - new RazorClipCommand(this, clipInfo, item->startPos(), false, moveCommand); - new ResizeClipCommand(this, dupInfo, newdupInfo, false, false, moveCommand); - ClipItem *dup = cutClip(clipInfo, item->startPos(), true, false); - if (dup) dup->resizeStart(item->endPos().frames(m_document->fps())); - } else { - ItemInfo newclipInfo = clip->info(); - newclipInfo.endPos = item->startPos(); - new ResizeClipCommand(this, clip->info(), newclipInfo, false, false, moveCommand); - clip->resizeEnd(item->startPos().frames(m_document->fps())); - } - } else if (clip->endPos() < item->endPos()) { - new AddTimelineClipCommand(this, clip->xml(), clip->clipProducer(), clip->info(), clip->effectList(), false, true, moveCommand); - scene()->removeItem(clip); - delete clip; - clip = NULL; - } else { - ItemInfo newclipInfo = clip->info(); - newclipInfo.startPos = item->endPos(); - new ResizeClipCommand(this, clip->info(), newclipInfo, false, false, moveCommand); - clip->resizeStart(item->endPos().frames(m_document->fps())); - } - } - } - } int tracknumber = m_document->tracksCount() - item->track() - 1; bool isLocked = m_document->trackInfoAt(tracknumber).isLocked; if (isLocked) item->setItemLocked(true); @@ -2855,6 +2818,8 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) GenTime timeOffset = GenTime(m_dragItem->scenePos().x(), m_document->fps()) - m_dragItemInfo.startPos; const int trackOffset = (int)(m_dragItem->scenePos().y() / m_tracksHeight) - m_dragItemInfo.track; //kDebug() << "// MOVED SEVERAL CLIPS" << timeOffset.frames(25); + QUndoCommand *moveGroup = new QUndoCommand(); + moveGroup->setText(i18n("Move group")); if (timeOffset != GenTime() || trackOffset != 0) { // remove items in MLT playlist @@ -2889,6 +2854,7 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) if (items.at(i)->type() != AVWIDGET && items.at(i)->type() != TRANSITIONWIDGET) continue; AbstractClipItem *item = static_cast (items.at(i)); item->updateItem(); + adjustTimelineClips(m_scene->editMode(), item, moveGroup); ItemInfo info = item->info(); int tracknumber = m_document->tracksCount() - info.track - 1; bool isLocked = m_document->trackInfoAt(tracknumber).isLocked; @@ -2904,7 +2870,7 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) if (clip->isAudioOnly()) prod = clip->baseClip()->audioProducer(info.track); else if (clip->isVideoOnly()) prod = clip->baseClip()->videoProducer(); else prod = clip->baseClip()->producer(info.track); - m_document->renderer()->mltInsertClip(info, clip->xml(), prod); + m_document->renderer()->mltInsertClip(info, clip->xml(), prod, m_scene->editMode() == OVERWRITEEDIT, m_scene->editMode() == INSERTEDIT); for (int i = 0; i < clip->effectsCount(); i++) { m_document->renderer()->mltAddEffect(info.track, info.startPos, clip->getEffectArgs(clip->effectAt(i)), false); } @@ -2919,8 +2885,8 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) } } - MoveGroupCommand *move = new MoveGroupCommand(this, clipsToMove, transitionsToMove, timeOffset, trackOffset, false); - m_commandStack->push(move); + new MoveGroupCommand(this, clipsToMove, transitionsToMove, timeOffset, trackOffset, false, moveGroup); + m_commandStack->push(moveGroup); //QPointF top = group->sceneBoundingRect().topLeft(); //QPointF oldpos = m_selectionGroup->scenePos(); @@ -5393,6 +5359,23 @@ void CustomTrackView::selectTransition(bool add, bool group) if (group) groupSelectedItems(); } +QStringList CustomTrackView::extractTransitionsLumas() +{ + QStringList urls; + QList itemList = items(); + Transition *transitionitem; + QDomElement transitionXml; + for (int i = 0; i < itemList.count(); i++) { + if (itemList.at(i)->type() == TRANSITIONWIDGET) { + transitionitem = static_cast (itemList.at(i)); + transitionXml = transitionitem->toXML(); + QString luma = EffectsList::parameter(transitionXml, "luma"); + if (!luma.isEmpty()) urls << luma; + } + } + return urls; +} + void CustomTrackView::setEditMode(EDITMODE mode) { m_scene->setEditMode(mode); diff --git a/src/customtrackview.h b/src/customtrackview.h index d2fe4608..1bbe77f2 100644 --- a/src/customtrackview.h +++ b/src/customtrackview.h @@ -127,8 +127,10 @@ public: int selectedTrack() const; void selectClip(bool add, bool group = false); void selectTransition(bool add, bool group = false); + QStringList extractTransitionsLumas(); void setEditMode(EDITMODE mode); + public slots: void setCursorPos(int pos, bool seek = true); void moveCursorPos(int delta); @@ -263,6 +265,8 @@ private: bool itemCollision(AbstractClipItem *item, ItemInfo newPos); /** Selects all items in the scene rect, and sets ok to false if a group going over several tracks is found in it */ QList checkForGroups(const QRectF &rect, bool *ok); + /** Adjust clips under another one when working in overwrite mode */ + void adjustTimelineClips(EDITMODE mode, AbstractClipItem *item, QUndoCommand *command); private slots: void slotRefreshGuides(); diff --git a/src/documentvalidator.cpp b/src/documentvalidator.cpp index 6aad1ae4..251021a5 100644 --- a/src/documentvalidator.cpp +++ b/src/documentvalidator.cpp @@ -82,8 +82,40 @@ bool DocumentValidator::validate(const double currentVersion) if (playlists.count() - 1 < tracksMax || tracks.count() - 1 < tracksMax || tracksinfo.count() < tracksMax) { + kDebug() << "//// WARNING, PROJECT IS CORRUPTED, MISSING TRACK"; m_modified = true; int difference; + // use the MLT tracks as reference + if (tracks.count() - 1 < tracksMax) { + // Looks like one MLT track is missing, remove the extra Kdenlive track if there is one. + if (tracksinfo.count() != tracks.count() - 1) { + // The Kdenlive tracks are not ok, clear and rebuild them + QDomNode tinfo = m_doc.elementsByTagName("tracksinfo").at(0); + QDomNode tnode = tinfo.firstChild(); + while (!tnode.isNull()) { + tinfo.removeChild(tnode); + tnode = tinfo.firstChild(); + } + + for (int i = 1; i < tracks.count(); i++) { + QString hide = tracks.at(i).toElement().attribute("hide"); + QDomElement newTrack = m_doc.createElement("trackinfo"); + if (hide == "video") { + // audio track; + newTrack.setAttribute("type", "audio"); + newTrack.setAttribute("blind", 1); + newTrack.setAttribute("mute", 0); + newTrack.setAttribute("lock", 0); + } else { + newTrack.setAttribute("blind", 0); + newTrack.setAttribute("mute", 0); + newTrack.setAttribute("lock", 0); + } + tinfo.appendChild(newTrack); + } + } + } + if (playlists.count() - 1 < tracksMax) { difference = tracksMax - (playlists.count() - 1); for (int i = 0; i < difference; ++i) { diff --git a/src/effectslistview.cpp b/src/effectslistview.cpp index 0c313cf3..9bfedbd2 100644 --- a/src/effectslistview.cpp +++ b/src/effectslistview.cpp @@ -33,23 +33,24 @@ EffectsListView::EffectsListView(QWidget *parent) : QWidget(parent) { - m_ui.setupUi(this); + setupUi(this); QMenu *menu = new QMenu(this); m_effectsList = new EffectsListWidget(menu); - QVBoxLayout *lyr = new QVBoxLayout(m_ui.effectlistframe); + QVBoxLayout *lyr = new QVBoxLayout(effectlistframe); lyr->addWidget(m_effectsList); lyr->setContentsMargins(0, 0, 0, 0); - m_ui.search_effect->setListWidget(m_effectsList); - m_ui.buttonInfo->setIcon(KIcon("help-about")); + search_effect->setListWidget(m_effectsList); + buttonInfo->setIcon(KIcon("help-about")); + setFocusPolicy(Qt::StrongFocus); if (KdenliveSettings::showeffectinfo()) { - m_ui.buttonInfo->setDown(true); - } else m_ui.infopanel->hide(); + buttonInfo->setDown(true); + } else infopanel->hide(); menu->addAction(KIcon("edit-delete"), i18n("Delete effect"), this, SLOT(slotRemoveEffect())); - connect(m_ui.type_combo, SIGNAL(currentIndexChanged(int)), this, SLOT(filterList(int))); - connect(m_ui.buttonInfo, SIGNAL(clicked()), this, SLOT(showInfoPanel())); + connect(type_combo, SIGNAL(currentIndexChanged(int)), this, SLOT(filterList(int))); + connect(buttonInfo, SIGNAL(clicked()), this, SLOT(showInfoPanel())); connect(m_effectsList, SIGNAL(itemSelectionChanged()), this, SLOT(slotUpdateInfo())); connect(m_effectsList, SIGNAL(doubleClicked(QListWidgetItem *, const QPoint &)), this, SLOT(slotEffectSelected())); @@ -57,6 +58,12 @@ EffectsListView::EffectsListView(QWidget *parent) : } +void EffectsListView::focusInEvent(QFocusEvent * event) +{ + kDebug() << "// got foc"; + search_effect->setFocus(); +} + void EffectsListView::filterList(int pos) { QListWidgetItem *item; @@ -78,13 +85,13 @@ void EffectsListView::filterList(int pos) void EffectsListView::showInfoPanel() { - if (m_ui.infopanel->isVisible()) { - m_ui.infopanel->setVisible(false); - m_ui.buttonInfo->setDown(false); + if (infopanel->isVisible()) { + infopanel->setVisible(false); + buttonInfo->setDown(false); KdenliveSettings::setShoweffectinfo(false); } else { - m_ui.infopanel->setVisible(true); - m_ui.buttonInfo->setDown(true); + infopanel->setVisible(true); + buttonInfo->setDown(true); KdenliveSettings::setShoweffectinfo(true); } } @@ -97,7 +104,7 @@ void EffectsListView::slotEffectSelected() void EffectsListView::slotUpdateInfo() { - m_ui.infopanel->setText(m_effectsList->currentInfo()); + infopanel->setText(m_effectsList->currentInfo()); } KListWidget *EffectsListView::listView() diff --git a/src/effectslistview.h b/src/effectslistview.h index e95d2137..cea2bf6b 100644 --- a/src/effectslistview.h +++ b/src/effectslistview.h @@ -25,13 +25,15 @@ #include "ui_effectlist_ui.h" #include "gentime.h" + #include +#include class EffectsList; class EffectsListWidget; class KListWidget; -class EffectsListView : public QWidget +class EffectsListView : public QWidget, public Ui::EffectList_UI { Q_OBJECT @@ -41,8 +43,10 @@ public: void reloadEffectList(); //void slotAddEffect(GenTime pos, int track, QString name); +protected: + virtual void focusInEvent(QFocusEvent * event); + private: - Ui::EffectList_UI m_ui; EffectsListWidget *m_effectsList; private slots: diff --git a/src/initeffects.cpp b/src/initeffects.cpp index 082e8796..a7b4d3f6 100644 --- a/src/initeffects.cpp +++ b/src/initeffects.cpp @@ -651,11 +651,12 @@ void initEffects::fillTransitionsList(Mlt::Repository * repository, EffectsList* filters << "*.pgm" << "*.png"; QStringList customLumas = KGlobal::dirs()->findDirs("appdata", "lumas"); - foreach(const QString &folder, customLumas) { + foreach(QString folder, customLumas) { + if (!folder.endsWith('/')) folder.append('/'); QStringList filesnames = QDir(folder).entryList(filters, QDir::Files); foreach(const QString &fname, filesnames) { imagenamelist.append(fname); - imagefiles.append(folder + '/' + fname); + imagefiles.append(folder + fname); } } diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index c17d6109..4fc03234 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -741,14 +741,14 @@ void MainWindow::setupActions() toolbar->setMovable(false); statusBar()->setStyleSheet(QString("QStatusBar QLabel {font-size:%1pt;} QStatusBar::item { border: 0px; font-size:%1pt;padding:0px; }").arg(statusBar()->font().pointSize())); QString style1 = "QToolBar { border: 0px } QToolButton { border-style: inset; border:1px solid #999999;border-radius: 3px;margin: 0px 3px;padding: 0px;} QToolButton:checked { background-color: rgba(224, 224, 0, 100); border-style: inset; border:1px solid #cc6666;border-radius: 3px;}"; - + // create edit mode buttons KAction *normaledit = new KAction(KIcon("kdenlive-normal-edit"), i18n("Normal mode"), this); normaledit->setShortcut(i18nc("Normal editing", "n")); toolbar->addAction(normaledit); normaledit->setCheckable(true); normaledit->setChecked(true); - + m_overwriteModeTool = new KAction(KIcon("kdenlive-overwrite-edit"), i18n("Overwrite mode"), this); m_overwriteModeTool->setShortcut(i18nc("Overwrite mode shortcut", "o")); toolbar->addAction(m_overwriteModeTool); @@ -762,7 +762,7 @@ void MainWindow::setupActions() m_insertModeTool->setChecked(false); // not implemented yet m_insertModeTool->setEnabled(false); - + QActionGroup *editGroup = new QActionGroup(this); editGroup->addAction(normaledit); editGroup->addAction(m_overwriteModeTool); @@ -770,7 +770,7 @@ void MainWindow::setupActions() editGroup->setExclusive(true); connect(editGroup, SIGNAL(triggered(QAction *)), this, SLOT(slotChangeEdit(QAction *))); //connect(m_overwriteModeTool, SIGNAL(toggled(bool)), this, SLOT(slotSetOverwriteMode(bool))); - + toolbar->addSeparator(); // create tools buttons @@ -808,11 +808,11 @@ void MainWindow::setupActions() actionWidget = toolbar->widgetForAction(m_insertModeTool); actionWidget->setMaximumWidth(max); actionWidget->setMaximumHeight(max - 4); - + actionWidget = toolbar->widgetForAction(m_overwriteModeTool); actionWidget->setMaximumWidth(max); actionWidget->setMaximumHeight(max - 4); - + actionWidget = toolbar->widgetForAction(m_buttonSelectTool); actionWidget->setMaximumWidth(max); actionWidget->setMaximumHeight(max - 4); @@ -896,7 +896,7 @@ void MainWindow::setupActions() statusBar()->addPermanentWidget(m_timecodeFormat); //statusBar()->setMaximumHeight(statusBar()->font().pointSize() * 3); - collection->addAction("normal_mode", normaledit); + collection->addAction("normal_mode", normaledit); collection->addAction("overwrite_mode", m_overwriteModeTool); collection->addAction("insert_mode", m_insertModeTool); collection->addAction("select_tool", m_buttonSelectTool); @@ -1410,7 +1410,7 @@ void MainWindow::newFile(bool showProjectSettings) profileName = KdenliveSettings::default_profile(); projectFolder = KdenliveSettings::defaultprojectfolder(); } else { - ProjectSettings *w = new ProjectSettings(NULL, projectTracks.x(), projectTracks.y(), KdenliveSettings::defaultprojectfolder(), false, true, this); + ProjectSettings *w = new ProjectSettings(NULL, QStringList(), projectTracks.x(), projectTracks.y(), KdenliveSettings::defaultprojectfolder(), false, true, this); if (w->exec() != QDialog::Accepted) return; if (!KdenliveSettings::activatetabs()) closeCurrentDocument(); KdenliveSettings::setVideothumbnails(w->enableVideoThumbs()); @@ -1777,7 +1777,7 @@ void MainWindow::slotDetectAudioDriver() void MainWindow::slotEditProjectSettings() { QPoint p = m_activeDocument->getTracksCount(); - ProjectSettings *w = new ProjectSettings(m_projectList, p.x(), p.y(), m_activeDocument->projectFolder().path(), true, !m_activeDocument->isModified(), this); + ProjectSettings *w = new ProjectSettings(m_projectList, m_activeTimeline->projectView()->extractTransitionsLumas(), p.x(), p.y(), m_activeDocument->projectFolder().path(), true, !m_activeDocument->isModified(), this); if (w->exec() == QDialog::Accepted) { QString profile = w->selectedProfile(); diff --git a/src/projectsettings.cpp b/src/projectsettings.cpp index 4218a00a..5188e8bf 100644 --- a/src/projectsettings.cpp +++ b/src/projectsettings.cpp @@ -33,8 +33,8 @@ #include #include -ProjectSettings::ProjectSettings(ProjectList *projectlist, int videotracks, int audiotracks, const QString projectPath, bool readOnlyTracks, bool savedProject, QWidget * parent) : - QDialog(parent), m_savedProject(savedProject), m_projectList(projectlist) +ProjectSettings::ProjectSettings(ProjectList *projectlist, QStringList lumas, int videotracks, int audiotracks, const QString projectPath, bool readOnlyTracks, bool savedProject, QWidget * parent) : + QDialog(parent), m_savedProject(savedProject), m_projectList(projectlist), m_lumas(lumas) { setupUi(this); @@ -140,20 +140,13 @@ void ProjectSettings::slotUpdateFiles(bool cacheOnly) // TODO: images used in luma transitions, files used for LADSPA effects? QStringList allFiles; + allFiles << m_lumas; for (int i = 0; i < list.count(); i++) { DocClipBase *clip = list.at(i); if (clip->clipType() == SLIDESHOW) { // special case, list all images - QString path = clip->fileURL().directory(); - QString ext = clip->fileURL().path().section('.', -1); - QDir dir(path); - QStringList filters; - filters << "*." + ext; - dir.setNameFilters(filters); - QStringList result = dir.entryList(QDir::Files); - for (int j = 0; j < result.count(); j++) { - allFiles.append(path + result.at(j)); - } + QStringList files = extractSlideshowUrls(clip->fileURL()); + allFiles << files; } else if (!clip->fileURL().isEmpty()) allFiles.append(clip->fileURL().path()); if (clip->clipType() == TEXT) { QStringList images = TitleWidget::extractImageList(clip->getProperty("xmldata")); @@ -251,16 +244,19 @@ QStringList ProjectSettings::extractPlaylistUrls(QString path) } file.close(); QString root = doc.documentElement().attribute("root"); + if (!root.isEmpty() && !root.endsWith('/')) root.append('/'); QDomNodeList files = doc.elementsByTagName("producer"); for (int i = 0; i < files.count(); i++) { QDomElement e = files.at(i).toElement(); QString type = EffectsList::property(e, "mlt_service"); if (type != "colour") { - //TODO: slideshows (.all.*) QString url = EffectsList::property(e, "resource"); if (!url.isEmpty()) { if (!url.startsWith('/')) url.prepend(root); - urls << url; + if (url.section('.', 0, -2).endsWith("/.all")) { + // slideshow clip, extract image urls + urls << extractSlideshowUrls(KUrl(url)); + } else urls << url; if (url.endsWith(".mlt") || url.endsWith(".kdenlive")) { //TODO: Do something to avoid infinite loops if 2 files reference themselves... urls << extractPlaylistUrls(url); @@ -268,6 +264,36 @@ QStringList ProjectSettings::extractPlaylistUrls(QString path) } } } + + // luma files for transitions + files = doc.elementsByTagName("transition"); + for (int i = 0; i < files.count(); i++) { + QDomElement e = files.at(i).toElement(); + QString url = EffectsList::property(e, "luma"); + if (!url.isEmpty()) { + if (!url.startsWith('/')) url.prepend(root); + urls << url; + } + } + + return urls; +} + + +//static +QStringList ProjectSettings::extractSlideshowUrls(KUrl url) +{ + QStringList urls; + QString path = url.directory(KUrl::AppendTrailingSlash); + QString ext = url.path().section('.', -1); + QDir dir(path); + QStringList filters; + filters << "*." + ext; + dir.setNameFilters(filters); + QStringList result = dir.entryList(QDir::Files); + for (int j = 0; j < result.count(); j++) { + urls.append(path + result.at(j)); + } return urls; } diff --git a/src/projectsettings.h b/src/projectsettings.h index 9f8df304..ff29e0bd 100644 --- a/src/projectsettings.h +++ b/src/projectsettings.h @@ -32,13 +32,14 @@ class ProjectSettings : public QDialog, public Ui::ProjectSettings_UI Q_OBJECT public: - ProjectSettings(ProjectList *projectlist, int videotracks, int audiotracks, const QString projectPath, bool readOnlyTracks, bool unsavedProject, QWidget * parent = 0); + ProjectSettings(ProjectList *projectlist, QStringList lumas, int videotracks, int audiotracks, const QString projectPath, bool readOnlyTracks, bool unsavedProject, QWidget * parent = 0); QString selectedProfile() const; KUrl selectedFolder() const; QPoint tracks(); bool enableVideoThumbs() const; bool enableAudioThumbs() const; static QStringList extractPlaylistUrls(QString path); + static QStringList extractSlideshowUrls(KUrl url); public slots: virtual void accept(); @@ -54,6 +55,7 @@ private: QPushButton *m_buttonOk; bool m_savedProject; ProjectList *m_projectList; + QStringList m_lumas; }; diff --git a/src/renderer.cpp b/src/renderer.cpp index 349a6a90..208aff25 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -174,6 +174,7 @@ void Render::buildConsumer(const QString profileName) } setenv("SDL_VIDEO_ALLOW_SCREENSAVER", "1", 1); + //m_mltConsumer->set("fullscreen", 1); #ifdef Q_WS_MAC m_mltConsumer = new Mlt::Consumer(*m_mltProfile , "sdl_audio"); m_mltConsumer->set("preview_off", 1); @@ -909,7 +910,7 @@ int Render::setSceneList(QString playlist, int position) m_isBlocked = true; int error; - //kWarning() << "////// RENDER, SET SCENE LIST: " << playlist; + kDebug() << "////// RENDER, SET SCENE LIST: " << playlist; if (m_mltConsumer == NULL) { kWarning() << "/////// ERROR, TRYING TO USE NULL MLT CONSUMER"; diff --git a/src/renderer.h b/src/renderer.h index e1cd584b..8958def5 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -52,6 +52,7 @@ namespace Mlt class Consumer; class Playlist; class Tractor; +class Transition; class Frame; class Producer; class Filter; diff --git a/src/titlewidget.cpp b/src/titlewidget.cpp index 10edfec7..803c65de 100644 --- a/src/titlewidget.cpp +++ b/src/titlewidget.cpp @@ -43,7 +43,6 @@ int settingUp = false; const int IMAGEITEM = 7; const int RECTITEM = 3; const int TEXTITEM = 8; -static bool insertingValues = false; TitleWidget::TitleWidget(KUrl url, Timecode tc, QString projectTitlePath, Render *render, QWidget *parent) : QDialog(parent), -- 2.39.2