]> git.sesse.net Git - kdenlive/blobdiff - src/projectlist.cpp
re-enable "create iso image" in dvd wizard if rendering fails
[kdenlive] / src / projectlist.cpp
index 10be0cd1b18876cfe88390ac11e063eca09f99be..a064933a8b8b78544ade74cec1a6efeb328429bf 100644 (file)
@@ -101,7 +101,7 @@ ProjectList::ProjectList(QWidget *parent) :
     m_queueTimer.setSingleShot(true);
 
 
-
+    connect(m_listView, SIGNAL(projectModified()), this, SIGNAL(projectModified()));
     connect(m_listView, SIGNAL(itemSelectionChanged()), this, SLOT(slotClipSelected()));
     connect(m_listView, SIGNAL(focusMonitor()), this, SLOT(slotClipSelected()));
     connect(m_listView, SIGNAL(pauseMonitor()), this, SLOT(slotPauseMonitor()));
@@ -204,6 +204,11 @@ void ProjectList::setHeaderInfo(const QByteArray &state)
 
 void ProjectList::slotEditClip()
 {
+    QList<QTreeWidgetItem *> list = m_listView->selectedItems();
+    if (list.count() > 1) {
+        editClipSelection(list);
+        return;
+    }
     ProjectItem *item;
     if (!m_listView->currentItem() || m_listView->currentItem()->type() == PROJECTFOLDERTYPE) return;
     if (m_listView->currentItem()->type() == PROJECTSUBCLIPTYPE) {
@@ -216,6 +221,51 @@ void ProjectList::slotEditClip()
     }
 }
 
+void ProjectList::editClipSelection(QList<QTreeWidgetItem *> list)
+{
+    // Gather all common properties
+    QMap <QString, QString> commonproperties;
+    QList <DocClipBase *> clipList;
+    commonproperties.insert("force_aspect_ratio", "-");
+    commonproperties.insert("force_fps", "-");
+    commonproperties.insert("force_progressive", "-");
+    commonproperties.insert("threads", "-");
+    commonproperties.insert("video_index", "-");
+    commonproperties.insert("audio_index", "-");
+
+    ProjectItem *item;
+    for (int i = 0; i < list.count(); i++) {
+        item = NULL;
+        if (list.at(i)->type() == PROJECTFOLDERTYPE) continue;
+        if (list.at(i)->type() == PROJECTSUBCLIPTYPE) {
+            item = static_cast <ProjectItem*>(list.at(i)->parent());
+        } else item = static_cast <ProjectItem*>(list.at(i));
+        if (!(item->flags() & Qt::ItemIsDragEnabled)) continue;
+        if (item) {
+            // check properties
+            DocClipBase *clip = item->referencedClip();
+            if (clipList.contains(clip)) continue;
+            clipList.append(clip);
+            QMap <QString, QString> clipprops = clip->properties();
+            QMapIterator<QString, QString> p(commonproperties);
+            while (p.hasNext()) {
+                p.next();
+                if (p.value().isEmpty()) continue;
+                if (clipprops.contains(p.key())) {
+                    if (p.value() == "-") commonproperties.insert(p.key(), clipprops.value(p.key()));
+                    else if (p.value() != clipprops.value(p.key())) commonproperties.insert(p.key(), QString());
+                } else commonproperties.insert(p.key(), QString());
+            }
+        }
+    }
+    QMapIterator<QString, QString> p(commonproperties);
+    while (p.hasNext()) {
+        p.next();
+        kDebug() << "Result: " << p.key() << " = " << p.value();
+    }
+    emit showClipProperties(clipList, commonproperties);
+}
+
 void ProjectList::slotOpenClip()
 {
     ProjectItem *item;
@@ -335,6 +385,7 @@ void ProjectList::slotClipSelected()
             ProjectItem *clip;
             if (m_listView->currentItem()->type() == PROJECTSUBCLIPTYPE) {
                 // this is a sub item, use base clip
+                m_deleteAction->setEnabled(true);
                 clip = static_cast <ProjectItem*>(m_listView->currentItem()->parent());
                 if (clip == NULL) kDebug() << "-----------ERROR";
                 SubProjectItem *sub = static_cast <SubProjectItem*>(m_listView->currentItem());
@@ -375,7 +426,7 @@ void ProjectList::slotUpdateClipProperties(const QString &id, QMap <QString, QSt
     ProjectItem *item = getItemById(id);
     if (item) {
         slotUpdateClipProperties(item, properties);
-        if (properties.contains("out")) {
+        if (properties.contains("out") || properties.contains("force_fps")) {
             slotReloadClip(id);
         } else if (properties.contains("colour") || properties.contains("resource") || properties.contains("xmldata") || properties.contains("force_aspect_ratio") || properties.contains("templatetext")) {
             slotRefreshClipThumbnail(item);
@@ -512,7 +563,7 @@ void ProjectList::slotRemoveClip()
             // subitem
             SubProjectItem *sub = static_cast <SubProjectItem *>(selected.at(i));
             ProjectItem *item = static_cast <ProjectItem *>(sub->parent());
-            new AddClipCutCommand(this, item->clipId(), sub->zone().x(), sub->zone().y(), sub->description(), true, delCommand);
+            new AddClipCutCommand(this, item->clipId(), sub->zone().x(), sub->zone().y(), sub->description(), false, true, delCommand);
         } else if (selected.at(i)->type() == PROJECTFOLDERTYPE) {
             // folder
             FolderProjectItem *folder = static_cast <FolderProjectItem *>(selected.at(i));
@@ -736,6 +787,7 @@ void ProjectList::slotUpdateClip(const QString &id)
 void ProjectList::updateAllClips()
 {
     m_listView->setSortingEnabled(false);
+    kDebug() << "// UPDATE ALL CLPY";
 
     QTreeWidgetItemIterator it(m_listView);
     DocClipBase *clip;
@@ -755,28 +807,27 @@ void ProjectList::updateAllClips()
             // folder
             ++it;
             continue;
-        }
-        item = static_cast <ProjectItem *>(*it);
-        clip = item->referencedClip();
-        if (item->referencedClip()->producer() == NULL) {
-            if (clip->isPlaceHolder() == false) {
-                requestClipInfo(clip->toXML(), clip->getId());
-            } else item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
         } else {
-            if (item->data(0, Qt::DecorationRole).isNull()) {
-                requestClipThumbnail(clip->getId());
-            }
-            if (item->data(0, DurationRole).toString().isEmpty()) {
-                item->changeDuration(item->referencedClip()->producer()->get_playtime());
+            item = static_cast <ProjectItem *>(*it);
+            clip = item->referencedClip();
+            if (item->referencedClip()->producer() == NULL) {
+                if (clip->isPlaceHolder() == false) {
+                    requestClipInfo(clip->toXML(), clip->getId());
+                } else item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
+            } else {
+                if (item->data(0, Qt::DecorationRole).isNull()) {
+                    requestClipThumbnail(clip->getId());
+                }
+                if (item->data(0, DurationRole).toString().isEmpty()) {
+                    item->changeDuration(item->referencedClip()->producer()->get_playtime());
+                }
             }
+            item->setData(1, UsageRole, QString::number(item->numReferences()));
         }
-        item->setData(1, UsageRole, QString::number(item->numReferences()));
         //qApp->processEvents();
         ++it;
     }
-    qApp->processEvents();
     if (!m_queueTimer.isActive()) m_queueTimer.start();
-
     if (m_listView->isEnabled()) m_listView->blockSignals(false);
     m_listView->setSortingEnabled(true);
     if (m_infoQueue.isEmpty()) slotProcessNextThumbnail();
@@ -1095,6 +1146,9 @@ 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());
         item->referencedClip()->setProducer(producer, replace);
+        if (!replace && item->data(0, Qt::DecorationRole).isNull()) {
+            requestClipThumbnail(clipId);
+        }
         //emit receivedClipDuration(clipId);
         if (m_listView->isEnabled() && replace) {
             // update clip in clip monitor
@@ -1271,11 +1325,11 @@ void ProjectList::slotAddClipCut(const QString &id, int in, int out)
     ProjectItem *clip = getItemById(id);
     if (clip == NULL) return;
     if (clip->referencedClip()->hasCutZone(QPoint(in, out))) return;
-    AddClipCutCommand *command = new AddClipCutCommand(this, id, in, out, QString(), false);
+    AddClipCutCommand *command = new AddClipCutCommand(this, id, in, out, QString(), true, false);
     m_commandStack->push(command);
 }
 
-void ProjectList::addClipCut(const QString &id, int in, int out, const QString desc)
+void ProjectList::addClipCut(const QString &id, int in, int out, const QString desc, bool newItem)
 {
     ProjectItem *clip = getItemById(id);
     if (clip) {
@@ -1283,6 +1337,10 @@ void ProjectList::addClipCut(const QString &id, int in, int out, const QString d
         base->addCutZone(in, out);
         m_listView->blockSignals(true);
         SubProjectItem *sub = new SubProjectItem(clip, in, out, desc);
+        if (newItem && desc.isEmpty() && !m_listView->isColumnHidden(1)) {
+            if (!clip->isExpanded()) clip->setExpanded(true);
+            m_listView->editItem(sub, 1);
+        }
         QPixmap p = clip->referencedClip()->thumbProducer()->extractImage(in, (int)(sub->sizeHint(0).height()  * m_render->dar()), sub->sizeHint(0).height() - 2);
         sub->setData(0, Qt::DecorationRole, p);
         m_doc->cachePixmap(clip->getClipHash() + '#' + QString::number(in), p);