]> git.sesse.net Git - kdenlive/blobdiff - src/projectlist.cpp
* Fix crash on renderer stopping
[kdenlive] / src / projectlist.cpp
index ea95c5aea73b571512ccba80501a99378e0b3aa3..cc8e8f2dd05c4786b6a71ee5aca685f4bd0217da 100644 (file)
@@ -30,7 +30,6 @@
 #include <KLocale>
 #include <KFileDialog>
 #include <KInputDialog>
-#include <kio/netaccess.h>
 #include <KMessageBox>
 
 #include <nepomuk/global.h>
@@ -71,16 +70,16 @@ ProjectList::ProjectList(QWidget *parent)
     addButton->setPopupMode(QToolButton::MenuButtonPopup);
     m_toolbar->addWidget(addButton);
 
-    QAction *addClipButton = addMenu->addAction(KIcon("document-new"), i18n("Add Clip"));
+    QAction *addClipButton = addMenu->addAction(KIcon("kdenlive-add-clip"), i18n("Add Clip"));
     connect(addClipButton, SIGNAL(triggered()), this, SLOT(slotAddClip()));
 
-    QAction *addColorClip = addMenu->addAction(KIcon("document-new"), i18n("Add Color Clip"));
+    QAction *addColorClip = addMenu->addAction(KIcon("kdenlive-add-color-clip"), i18n("Add Color Clip"));
     connect(addColorClip, SIGNAL(triggered()), this, SLOT(slotAddColorClip()));
 
-    QAction *addSlideClip = addMenu->addAction(KIcon("document-new"), i18n("Add Slideshow Clip"));
+    QAction *addSlideClip = addMenu->addAction(KIcon("kdenlive-add-slide-clip"), i18n("Add Slideshow Clip"));
     connect(addSlideClip, SIGNAL(triggered()), this, SLOT(slotAddSlideshowClip()));
 
-    QAction *addTitleClip = addMenu->addAction(KIcon("document-new"), i18n("Add Title Clip"));
+    QAction *addTitleClip = addMenu->addAction(KIcon("kdenlive-add-text-clip"), i18n("Add Title Clip"));
     connect(addTitleClip, SIGNAL(triggered()), this, SLOT(slotAddTitleClip()));
 
     m_deleteAction = m_toolbar->addAction(KIcon("edit-delete"), i18n("Delete Clip"));
@@ -104,6 +103,7 @@ ProjectList::ProjectList(QWidget *parent)
     m_menu = new QMenu();
     m_menu->addAction(addClipButton);
     m_menu->addAction(addColorClip);
+    m_menu->addAction(addSlideClip);
     m_menu->addAction(addTitleClip);
     m_menu->addAction(m_editAction);
     m_menu->addAction(m_deleteAction);
@@ -129,7 +129,7 @@ ProjectList::~ProjectList() {
 
 void ProjectList::slotEditClip() {
     ProjectItem *item = static_cast <ProjectItem*>(listView->currentItem());
-    if (item && !item->isGroup()) emit clipSelected(item->toXml());
+    if (item && !item->isGroup()) emit clipSelected(item->referencedClip());
     emit showClipProperties(item->referencedClip());
 }
 
@@ -142,17 +142,12 @@ void ProjectList::setRenderer(Render *projectRender) {
 void ProjectList::slotClipSelected() {
     ProjectItem *item = static_cast <ProjectItem*>(listView->currentItem());
     if (item && !item->isGroup()) {
-        if (item == m_selectedItem) {
-            // if user clicked on the active clip item, just focus monitor, don't update it.
-            emit clipSelected(QDomElement());
-            return;
-        }
         m_selectedItem = item;
-        emit clipSelected(item->toXml());
+        emit clipSelected(item->referencedClip());
     }
 }
 
-void ProjectList::slotUpdateClipProperties(int id, QMap <QString, QString> properties) {
+void ProjectList::slotUpdateClipProperties(const QString &id, QMap <QString, QString> properties) {
     ProjectItem *item = getItemById(id);
     if (item) {
         slotUpdateClipProperties(item, properties);
@@ -172,6 +167,7 @@ void ProjectList::slotUpdateClipProperties(ProjectItem *clip, QMap <QString, QSt
             Nepomuk::Resource f(clip->clipUrl().path());
             if (f.isValid()) f.setDescription(properties.value("description"));
         }
+        emit projectModified();
     }
 }
 
@@ -200,8 +196,8 @@ void ProjectList::slotContextMenu(const QPoint &pos, QTreeWidgetItem *item) {
 void ProjectList::slotRemoveClip() {
     if (!listView->currentItem()) return;
     ProjectItem *item = static_cast <ProjectItem *>(listView->currentItem());
-    QList <int> ids;
-    QMap <QString, int> folderids;
+    QList <QString> ids;
+    QMap <QString, QString> folderids;
     if (item->clipType() == FOLDER) folderids[item->groupName()] = item->clipId();
     else ids << item->clipId();
     if (item->numReferences() > 0) {
@@ -218,13 +214,13 @@ void ProjectList::slotRemoveClip() {
     if (!folderids.isEmpty()) m_doc->deleteProjectFolder(folderids);
 }
 
-void ProjectList::selectItemById(const int clipId) {
+void ProjectList::selectItemById(const QString &clipId) {
     ProjectItem *item = getItemById(clipId);
     if (item) listView->setCurrentItem(item);
 }
 
 
-void ProjectList::slotDeleteClip(int clipId) {
+void ProjectList::slotDeleteClip(const QString &clipId) {
     ProjectItem *item = getItemById(clipId);
     QTreeWidgetItem *p = item->parent();
     if (p) {
@@ -242,7 +238,7 @@ void ProjectList::slotAddFolder() {
     m_doc->slotAddFolder(i18n("Folder")); //folderName);
 }
 
-void ProjectList::slotAddFolder(const QString foldername, int clipId, bool remove, bool edit) {
+void ProjectList::slotAddFolder(const QString foldername, const QString &clipId, bool remove, bool edit) {
     if (remove) {
         ProjectItem *item;
         QTreeWidgetItemIterator it(listView);
@@ -277,7 +273,7 @@ void ProjectList::slotAddFolder(const QString foldername, int clipId, bool remov
 }
 
 void ProjectList::slotAddClip(DocClipBase *clip) {
-    const int parent = clip->toXML().attribute("groupid").toInt();
+    const QString parent = clip->toXML().attribute("groupid");
     ProjectItem *item = NULL;
     if (parent != 0) {
         ProjectItem *parentitem = getItemById(parent);
@@ -301,7 +297,7 @@ void ProjectList::slotAddClip(DocClipBase *clip) {
     emit getFileProperties(clip->toXML(), clip->getId());
 }
 
-void ProjectList::slotUpdateClip(int id) {
+void ProjectList::slotUpdateClip(const QString &id) {
     ProjectItem *item = getItemById(id);
     item->setData(1, UsageRole, QString::number(item->numReferences()));
 }
@@ -309,12 +305,12 @@ void ProjectList::slotUpdateClip(int id) {
 void ProjectList::slotAddClip(QUrl givenUrl, QString group) {
     if (!m_commandStack) kDebug() << "!!!!!!!!!!!!!!!!  NO CMD STK";
     KUrl::List list;
-    if (givenUrl.isEmpty())
-        list = KFileDialog::getOpenUrls(KUrl(), "application/vnd.kde.kdenlive application/vnd.westley.scenelist application/flv application/vnd.rn-realmedia video/x-dv video/x-msvideo video/mpeg video/x-ms-wmv audio/mpeg audio/x-mp3 audio/x-wav application/ogg *.m2t *.dv video/mp4 video/quicktime image/gif image/jpeg image/png image/x-bmp image/svg+xml image/tiff image/x-xcf-gimp image/x-vnd.adobe.photoshop image/x-pcx image/x-exr");
-    else list.append(givenUrl);
+    if (givenUrl.isEmpty()) {
+        list = KFileDialog::getOpenUrls(KUrl("kfiledialog:///clipfolder"), "application/vnd.kde.kdenlive application/vnd.westley.scenelist application/flv application/vnd.rn-realmedia video/x-dv video/dv video/x-msvideo video/mpeg video/x-ms-wmv audio/mpeg audio/x-mp3 audio/x-wav application/ogg video/mp4 video/quicktime image/gif image/jpeg image/png image/x-bmp image/svg+xml image/tiff image/x-xcf-gimp image/x-vnd.adobe.photoshop image/x-pcx image/x-exr video/mlt-playlist", this);
+    else list.append(givenUrl);
     if (list.isEmpty()) return;
-    KUrl::List::Iterator it;
-    int groupId = -1;
+
+    QString groupId = QString();
     if (group.isEmpty()) {
         ProjectItem *item = static_cast <ProjectItem*>(listView->currentItem());
         if (item && item->clipType() != FOLDER) {
@@ -328,9 +324,19 @@ void ProjectList::slotAddClip(QUrl givenUrl, QString group) {
             groupId = item->clipId();
         }
     }
-    for (it = list.begin(); it != list.end(); it++) {
-        m_doc->slotAddClipFile(*it, group, groupId);
+    m_doc->slotAddClipList(list, group, groupId);
+}
+
+void ProjectList::slotRemoveInvalidClip(const QString &id) {
+    ProjectItem *item = getItemById(id);
+    if (item) {
+        QString path = item->referencedClip()->fileURL().path();
+        if (!path.isEmpty()) KMessageBox::sorry(this, i18n("<qt>Clip <b>%1</b><br>is invalid, will be removed from project.", path));
+
     }
+    QList <QString> ids;
+    ids << id;
+    m_doc->deleteProjectClip(ids);
 }
 
 void ProjectList::slotAddColorClip() {
@@ -345,7 +351,7 @@ void ProjectList::slotAddColorClip() {
         color = color.replace(0, 1, "0x") + "ff";
 
         QString group = QString();
-        int groupId = -1;
+        QString groupId = QString();
         ProjectItem *item = static_cast <ProjectItem*>(listView->currentItem());
         if (item && item->clipType() != FOLDER) {
             while (item->parent()) {
@@ -372,7 +378,7 @@ void ProjectList::slotAddSlideshowClip() {
     if (dia->exec() == QDialog::Accepted) {
 
         QString group = QString();
-        int groupId = -1;
+        QString groupId = QString();
         ProjectItem *item = static_cast <ProjectItem*>(listView->currentItem());
         if (item && item->clipType() != FOLDER) {
             while (item->parent()) {
@@ -385,13 +391,14 @@ void ProjectList::slotAddSlideshowClip() {
             groupId = item->clipId();
         }
 
-        m_doc->slotAddSlideshowClipFile(dia->clipName(), dia->selectedPath(), dia->imageCount(), dia->clipDuration(), dia->loop(), group, groupId);
+        m_doc->slotAddSlideshowClipFile(dia->clipName(), dia->selectedPath(), dia->imageCount(), dia->clipDuration(), dia->loop(), dia->fade(), dia->lumaDuration(), dia->lumaFile(), dia->softness(), group, groupId);
     }
     delete dia;
 }
+
 void ProjectList::slotAddTitleClip() {
     QString group = QString();
-    int groupId = -1;
+    QString groupId = QString();
     ProjectItem *item = static_cast <ProjectItem*>(listView->currentItem());
     if (item && item->clipType() != FOLDER) {
         while (item->parent()) {
@@ -437,36 +444,35 @@ QDomElement ProjectList::producersList() {
     return prods;
 }
 
-void ProjectList::slotRefreshClipThumbnail(int clipId) {
+void ProjectList::slotRefreshClipThumbnail(const QString &clipId) {
     ProjectItem *item = getItemById(clipId);
     if (item) slotRefreshClipThumbnail(item);
 }
 
 void ProjectList::slotRefreshClipThumbnail(ProjectItem *item) {
     if (item) {
-               int height = 50;
-               int width = (int)(height  * m_render->dar());
-        QPixmap pix = KThumb::getImage(item->toXml(), item->referencedClip()->getProjectThumbFrame(), width, height);
-        //QPixmap pix = KThumb::getFrame(item->toXml()), 0, width, height);
+        int height = 50;
+        int width = (int)(height  * m_render->dar());
+        QPixmap pix = item->referencedClip()->thumbProducer()->extractImage(item->referencedClip()->getClipThumbFrame(), width, height);
         item->setIcon(0, pix);
     }
 }
 
-void ProjectList::slotReplyGetFileProperties(int clipId, const QMap < QString, QString > &properties, const QMap < QString, QString > &metadata) {
+void ProjectList::slotReplyGetFileProperties(const QString &clipId, Mlt::Producer *producer, const QMap < QString, QString > &properties, const QMap < QString, QString > &metadata) {
     ProjectItem *item = getItemById(clipId);
     if (item) {
         item->setProperties(properties, metadata);
-        listView->setCurrentItem(item);
+        item->referencedClip()->setProducer(producer);
         emit receivedClipDuration(clipId, item->clipMaxDuration());
-    }
+    } else kDebug() << "////////  COULD NOT FIND CLIP TO UPDATE PRPS...";
 }
 
-void ProjectList::slotReplyGetImage(int clipId, int pos, const QPixmap &pix, int w, int h) {
+void ProjectList::slotReplyGetImage(const QString &clipId, int pos, const QPixmap &pix, int w, int h) {
     ProjectItem *item = getItemById(clipId);
     if (item) item->setIcon(0, pix);
 }
 
-ProjectItem *ProjectList::getItemById(int id) {
+ProjectItem *ProjectList::getItemById(const QString &id) {
     QTreeWidgetItemIterator it(listView);
     while (*it) {
         if (((ProjectItem *)(*it))->clipId() == id)
@@ -477,4 +483,12 @@ ProjectItem *ProjectList::getItemById(int id) {
     return NULL;
 }
 
+void ProjectList::slotSelectClip(const QString &ix) {
+    ProjectItem *p = getItemById(ix);
+    if (p) {
+        listView->setCurrentItem(p);
+        listView->scrollToItem(p);
+    }
+}
+
 #include "projectlist.moc"