]> git.sesse.net Git - kdenlive/commitdiff
progress in timeline overwrite mode
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 26 Oct 2009 13:14:17 +0000 (13:14 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 26 Oct 2009 13:14:17 +0000 (13:14 +0000)
svn path=/trunk/kdenlive/; revision=4062

13 files changed:
src/clipitem.cpp
src/customtrackview.cpp
src/customtrackview.h
src/documentvalidator.cpp
src/effectslistview.cpp
src/effectslistview.h
src/initeffects.cpp
src/mainwindow.cpp
src/projectsettings.cpp
src/projectsettings.h
src/renderer.cpp
src/renderer.h
src/titlewidget.cpp

index f15929af47bb710ae5d9c7b724865d3748b9a6f0..955878b4f3e9e76d5722e1039a5cd0b0d9c77125 100644 (file)
@@ -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());
index f9759412831fa5c111fd4511458a6d94cdd8bf33..f76f08150bcae3c677b742eaf027220ff5e1672e 100644 (file)
@@ -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<QGraphicsItem *> 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<ClipItem *>(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<QGraphicsItem *> 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<ClipItem *>(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<QGraphicsItem *> 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<ClipItem *>(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 <AbstractClipItem *>(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<QGraphicsItem *> itemList = items();
+    Transition *transitionitem;
+    QDomElement transitionXml;
+    for (int i = 0; i < itemList.count(); i++) {
+        if (itemList.at(i)->type() == TRANSITIONWIDGET) {
+            transitionitem = static_cast <Transition*>(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);
index d2fe46086babac0d310503da79770dc9e953057a..1bbe77f299086a8c0df4fbd0cfaef93f53476fd2 100644 (file)
@@ -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<QGraphicsItem *> 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();
index 6aad1ae41a0ba8a7385ed8c778b38ccc05b2896c..251021a554c84b51ffea6939ca8580c2d784c867 100644 (file)
@@ -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) {
index 0c313cf3b8a5ea7357b723ad636233d634c36088..9bfedbd291d17674cfd9bbedfdf9a8fbed0a2d6e 100644 (file)
 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()
index e95d2137396dd1a99610cf63441b3b3af7066580..cea2bf6b850f0b9309464e488f9c2241782a3621 100644 (file)
 
 #include "ui_effectlist_ui.h"
 #include "gentime.h"
+
 #include <QDomElement>
+#include <QFocusEvent>
 
 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:
index 082e879618268a668421b38947b14c86999382cf..a7b4d3f623de9f2fb0f5207dce0d5f6b135acd04 100644 (file)
@@ -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);
                 }
             }
 
index c17d6109cfa0aa023e35beb216bc89f9dd37a425..4fc03234f1c14e3db03610ffc1396de821276614 100644 (file)
@@ -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();
index 4218a00a419b6a4b9ddcb140cb1999d6dd058a0c..5188e8bf85ac69fe200e5b1820cfee045ed94b54 100644 (file)
@@ -33,8 +33,8 @@
 #include <QDir>
 #include <kmessagebox.h>
 
-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;
 }
 
index 9f8df30443dac6796e54e6f98f03da376a62570b..ff29e0bdf20380d3932c0ae7b691fc66c19b4b02 100644 (file)
@@ -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;
 };
 
 
index 349a6a9075f131f052044fd7aa15d889b5ce688c..208aff25e476c57fd3c38a6e8a6ad1247a6c65b3 100644 (file)
@@ -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";
index e1cd584b94fb85dc0a2a0a579cf91c3093ba6ca1..8958def58559f5cf9efc3cd18d18f832e72f0e22 100644 (file)
@@ -52,6 +52,7 @@ namespace Mlt
 class Consumer;
 class Playlist;
 class Tractor;
+class Transition;
 class Frame;
 class Producer;
 class Filter;
index 10edfec72e71a3f3c923e4de41c0d44443b786bb..803c65de4de58fbab8b2ea2eae60e1ed36dfebce 100644 (file)
@@ -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),