]> git.sesse.net Git - kdenlive/blobdiff - src/projectlist.cpp
Title clips now really usable (only transparency & duration change still missing)
[kdenlive] / src / projectlist.cpp
index c648dda8ffbb6206ed149048113723e481ac15f1..33678dc94db2a50f3eeffd942d6b7b21483bd665 100644 (file)
@@ -23,6 +23,7 @@
 #include <QPixmap>
 #include <QIcon>
 #include <QDialog>
+#include <QtGui>
 
 #include <KDebug>
 #include <KAction>
 #include "ui_colorclip_ui.h"
 
 #include "definitions.h"
-#include "titlewidget.h"
 #include "clipmanager.h"
 #include "docclipbase.h"
 #include "kdenlivedoc.h"
 #include "renderer.h"
+#include "kthumb.h"
 #include "projectlistview.h"
-#include <QtGui>
 
 ProjectList::ProjectList(QWidget *parent)
         : QWidget(parent), m_render(NULL), m_fps(-1), m_commandStack(NULL) {
@@ -95,11 +95,6 @@ ProjectList::ProjectList(QWidget *parent)
     //m_toolbar->setEnabled(false);
 
     searchView->setTreeWidget(listView);
-    listView->setColumnCount(3);
-    QStringList headers;
-    headers << i18n("Thumbnail") << i18n("Filename") << i18n("Description");
-    listView->setHeaderLabels(headers);
-    listView->sortByColumn(1, Qt::AscendingOrder);
 
     m_menu = new QMenu();
     m_menu->addAction(addClipButton);
@@ -114,12 +109,11 @@ ProjectList::ProjectList(QWidget *parent)
     connect(listView, SIGNAL(requestMenu(const QPoint &, QTreeWidgetItem *)), this, SLOT(slotContextMenu(const QPoint &, QTreeWidgetItem *)));
     connect(listView, SIGNAL(addClip()), this, SLOT(slotAddClip()));
     connect(listView, SIGNAL(addClip(QUrl, const QString &)), this, SLOT(slotAddClip(QUrl, const QString &)));
-    connect(listView, SIGNAL(itemChanged(QTreeWidgetItem *, int)), this, SLOT(slotUpdateItemDescription(QTreeWidgetItem *, int)));
+    connect(listView, SIGNAL(itemChanged(QTreeWidgetItem *, int)), this, SLOT(slotItemEdited(QTreeWidgetItem *, int)));
+    connect(listView, SIGNAL(showProperties(DocClipBase *)), this, SIGNAL(showClipProperties(DocClipBase *)));
 
     m_listViewDelegate = new ItemDelegate(listView);
     listView->setItemDelegate(m_listViewDelegate);
-    listView->setIconSize(QSize(60, 40));
-    listView->setSortingEnabled(true);
 }
 
 ProjectList::~ProjectList() {
@@ -127,6 +121,8 @@ ProjectList::~ProjectList() {
     delete m_toolbar;
 }
 
+
+
 void ProjectList::setRenderer(Render *projectRender) {
     m_render = projectRender;
 }
@@ -136,44 +132,39 @@ void ProjectList::slotClipSelected() {
     if (item && !item->isGroup()) emit clipSelected(item->toXml());
 }
 
-void ProjectList::slotUpdateItemDescription(QTreeWidgetItem *item, int column) {
-    ProjectItem *clip = static_cast <ProjectItem*>(item);
-    CLIPTYPE type = clip->clipType();
-    if (column == 2) {
+void ProjectList::slotUpdateClipProperties(int id, QMap <QString, QString> properties) {
+    ProjectItem *item = getItemById(id);
+    if (item) slotUpdateClipProperties(item, properties);
+}
+
+void ProjectList::slotUpdateClipProperties(ProjectItem *clip, QMap <QString, QString> properties) {
+    if (!clip) return;
+    clip->setProperties(properties);
+    if (properties.contains("description")) {
+        CLIPTYPE type = clip->clipType();
+        clip->setText(2, properties.value("description"));
         if (type == AUDIO || type == VIDEO || type == AV || type == IMAGE || type == PLAYLIST) {
             // Use Nepomuk system to store clip description
             Nepomuk::Resource f(clip->clipUrl().path());
-            f.setDescription(item->text(2));
-            kDebug() << "NEPOMUK, SETTING CLIP: " << clip->clipUrl().path() << ", TO TEXT: " << item->text(2);
+            if (f.isValid()) f.setDescription(properties.value("description"));
         }
-    } else if (column == 1 && type == FOLDER) {
-        m_doc->slotEditFolder(item->text(1), clip->groupName(), clip->clipId());
     }
 }
 
-void ProjectList::slotEditClip() {
-    kDebug() << "////////////////////////////////////////   DBL CLK";
-}
-
-
-void ProjectList::slotEditClip(QTreeWidgetItem *item, int column) {
-    kDebug() << "////////////////////////////////////////   DBL CLK";
+void ProjectList::slotItemEdited(QTreeWidgetItem *item, int column) {
+    ProjectItem *clip = static_cast <ProjectItem*>(item);
+    if (column == 2) {
+        QMap <QString, QString> props;
+        props["description"] = item->text(2);
+        slotUpdateClipProperties(clip, props);
+    } else if (column == 1 && clip->clipType() == FOLDER) {
+        m_doc->slotEditFolder(item->text(1), clip->groupName(), clip->clipId());
+    }
 }
 
 void ProjectList::slotContextMenu(const QPoint &pos, QTreeWidgetItem *item) {
     bool enable = false;
     if (item) {
-        QFrame *w = new QFrame;
-        w->setFrameShape(QFrame::StyledPanel);
-        w->setLineWidth(2);
-        w->setAutoFillBackground(true);
-        QHBoxLayout *layout = new QHBoxLayout;
-        layout->addWidget(new QLabel(i18n("Color:")));
-        layout->addWidget(new KColorButton());
-        layout->addWidget(new QLabel(i18n("Duration:")));
-        layout->addWidget(new KRestrictedLine());
-        w->setLayout(layout);
-        m_listViewDelegate->extendItem(w, listView->currentIndex());
         enable = true;
     }
     m_editAction->setEnabled(enable);
@@ -243,7 +234,9 @@ void ProjectList::addClip(const QStringList &name, const QDomElement &elem, cons
     if (!url.isEmpty()) {
         // if file has Nepomuk comment, use it
         Nepomuk::Resource f(url.path());
-        QString annotation = f.description();
+        QString annotation;
+        if (f.isValid()) annotation = f.description();
+
         if (!annotation.isEmpty()) item->setText(2, annotation);
         QString resource = url.path();
         if (resource.endsWith("westley") || resource.endsWith("kdenlive")) {
@@ -280,9 +273,12 @@ void ProjectList::addClip(const QStringList &name, const QDomElement &elem, cons
 }
 
 void ProjectList::slotDeleteClip(int clipId) {
-    kDebug() << "///////  DELETE CLIP: " << clipId;
     ProjectItem *item = getItemById(clipId);
-    if (item) delete item;
+    QTreeWidgetItem *p = item->parent();
+    if (p) {
+        kDebug() << "///////  DELETEED CLIP HAS A PARENT... " << p->indexOfChild(item);
+        QTreeWidgetItem *clone = p->takeChild(p->indexOfChild(item));
+    } else if (item) delete item;
 }
 
 void ProjectList::slotAddFolder() {
@@ -328,11 +324,26 @@ void ProjectList::slotAddFolder(const QString foldername, int clipId, bool remov
 
 void ProjectList::slotAddClip(DocClipBase *clip) {
     const int parent = clip->toXML().attribute("groupid").toInt();
+    ProjectItem *item = NULL;
     if (parent != 0) {
         ProjectItem *parentitem = getItemById(parent);
-        if (parentitem)(void) new ProjectItem(parentitem, clip);
-        else (void) new ProjectItem(listView, clip);
-    } else (void) new ProjectItem(listView, clip);
+        if (parentitem) item = new ProjectItem(parentitem, clip);
+    }
+    if (item == NULL) item = new ProjectItem(listView, clip);
+
+    KUrl url = clip->fileURL();
+    if (!url.isEmpty()) {
+        // if file has Nepomuk comment, use it
+        Nepomuk::Resource f(url.path());
+        QString annotation;
+        if (f.isValid()) {
+            annotation = f.description();
+            /*
+            Nepomuk::Tag tag("test");
+            f.addTag(tag);*/
+        } else kDebug() << "---  CANNOT CONTACT NEPOMUK";
+        if (!annotation.isEmpty()) item->setText(2, annotation);
+    }
     emit getFileProperties(clip->toXML(), clip->getId());
 }
 
@@ -370,7 +381,7 @@ void ProjectList::slotAddClip(QUrl givenUrl, QString group) {
 
 void ProjectList::slotAddColorClip() {
     if (!m_commandStack) kDebug() << "!!!!!!!!!!!!!!!!  NO CMD STK";
-    QDialog *dia = new QDialog;
+    QDialog *dia = new QDialog(this);
     Ui::ColorClip_UI *dia_ui = new Ui::ColorClip_UI();
     dia_ui->setupUi(dia);
     dia_ui->clip_name->setText(i18n("Color Clip"));
@@ -400,21 +411,21 @@ void ProjectList::slotAddColorClip() {
 }
 
 void ProjectList::slotAddTitleClip() {
-
-    if (!m_commandStack) kDebug() << "!!!!!!!!!!!!!!!!  NO CMD STK";
-    //QDialog *dia = new QDialog;
-
-    TitleWidget *dia_ui = new TitleWidget();
-    //dia_ui->setupUi(dia);
-    //dia_ui->clip_name->setText(i18n("Title Clip"));
-    //dia_ui->clip_duration->setText(KdenliveSettings::color_duration());
-    if (dia_ui->exec() == QDialog::Accepted) {
-        //QString color = dia_ui->clip_color->color().name();
-        //color = color.replace(0, 1, "0x") + "ff";
-        //m_doc->slotAddColorClipFile(dia_ui->clip_name->text(), color, dia_ui->clip_duration->text(), QString::null);
+    QString group = QString();
+    int groupId = -1;
+    ProjectItem *item = static_cast <ProjectItem*>(listView->currentItem());
+    if (item && item->clipType() != FOLDER) {
+        while (item->parent()) {
+            item = static_cast <ProjectItem*>(item->parent());
+            if (item->clipType() == FOLDER) break;
+        }
     }
-    delete dia_ui;
-    //delete dia;
+    if (item && item->clipType() == FOLDER) {
+        group = item->groupName();
+        groupId = item->clipId();
+    }
+
+    m_doc->slotCreateTextClip(group, groupId);
 }
 void ProjectList::setDocument(KdenliveDoc *doc) {
     listView->clear();
@@ -455,6 +466,15 @@ QDomElement ProjectList::producersList() {
     return prods;
 }
 
+void ProjectList::slotRefreshClipThumbnail(int clipId) {
+    ProjectItem *item = getItemById(clipId);
+    if (item) {
+        int height = 40;
+        int width = (int)(height  * (double) m_render->renderWidth() / m_render->renderHeight());
+        QPixmap pix = KThumb::getImage(item->clipUrl(), item->referencedClip()->getProjectThumbFrame(), width, height);
+        item->setIcon(0, pix);
+    }
+}
 
 void ProjectList::slotReplyGetFileProperties(int clipId, const QMap < QString, QString > &properties, const QMap < QString, QString > &metadata) {
     ProjectItem *item = getItemById(clipId);
@@ -465,8 +485,6 @@ void ProjectList::slotReplyGetFileProperties(int clipId, const QMap < QString, Q
     }
 }
 
-
-
 void ProjectList::slotReplyGetImage(int clipId, int pos, const QPixmap &pix, int w, int h) {
     ProjectItem *item = getItemById(clipId);
     if (item) item->setIcon(0, pix);