X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fprojectlist.cpp;h=4c10ee58e4a9a17888728ec4fa136026cb599078;hb=e106556d92e9ad59e6b7886b07a717650c8e51ee;hp=9a2d514b552bd10c60203df22d3855d598518349;hpb=bc7ddabf7f161edf3136c8cc2204f000d85d06a4;p=kdenlive diff --git a/src/projectlist.cpp b/src/projectlist.cpp index 9a2d514b..4c10ee58 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -19,7 +19,6 @@ #include "projectlist.h" #include "projectitem.h" -#include "subprojectitem.h" #include "addfoldercommand.h" #include "kdenlivesettings.h" #include "slideshowclip.h" @@ -33,6 +32,7 @@ #include "kthumb.h" #include "projectlistview.h" #include "editclipcommand.h" +#include "editclipcutcommand.h" #include "editfoldercommand.h" #include "addclipcutcommand.h" @@ -310,7 +310,7 @@ void ProjectList::slotReloadClip(const QString &id) } //requestClipInfo(item->toXml(), item->clipId(), true); // Clear the file_hash value, which will cause a complete reload of the clip - emit getFileProperties(item->toXml(), item->clipId(), true); + emit getFileProperties(item->toXml(), item->clipId(), m_listView->iconSize().height(), true); } } } @@ -335,6 +335,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 (m_listView->currentItem()->parent()); if (clip == NULL) kDebug() << "-----------ERROR"; SubProjectItem *sub = static_cast (m_listView->currentItem()); @@ -414,6 +415,14 @@ void ProjectList::slotItemEdited(QTreeWidgetItem *item, int column) { if (item->type() == PROJECTSUBCLIPTYPE) { // this is a sub-item + if (column == 1) { + // user edited description + SubProjectItem *sub = static_cast (item); + ProjectItem *item = static_cast (sub->parent()); + EditClipCutCommand *command = new EditClipCutCommand(this, item->clipId(), sub->zone(), sub->zone(), sub->description(), sub->text(1), true); + m_commandStack->push(command); + //slotUpdateCutClipProperties(sub->clipId(), sub->zone(), sub->text(1), sub->text(1)); + } return; } if (item->type() == PROJECTFOLDERTYPE) { @@ -504,11 +513,8 @@ void ProjectList::slotRemoveClip() // subitem SubProjectItem *sub = static_cast (selected.at(i)); ProjectItem *item = static_cast (sub->parent()); - new AddClipCutCommand(this, item->clipId(), sub->zone().x(), sub->zone().y(), true, delCommand); - continue; - } - - if (selected.at(i)->type() == PROJECTFOLDERTYPE) { + 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 (selected.at(i)); folderids[folder->groupName()] = folder->clipId(); @@ -519,15 +525,15 @@ void ProjectList::slotRemoveClip() ProjectItem *child = static_cast (folder->child(i)); ids << child->clipId(); } - continue; - } - - ProjectItem *item = static_cast (selected.at(i)); - ids << item->clipId(); - if (item->numReferences() > 0) { - if (KMessageBox::questionYesNo(this, i18np("Delete clip %2?
This will also remove the clip in timeline", "Delete clip %2?
This will also remove its %1 clips in timeline", item->numReferences(), item->names().at(1)), i18n("Delete Clip")) != KMessageBox::Yes) return; + } else { + ProjectItem *item = static_cast (selected.at(i)); + ids << item->clipId(); + if (item->numReferences() > 0) { + if (KMessageBox::questionYesNo(this, i18np("Delete clip %2?
This will also remove the clip in timeline", "Delete clip %2?
This will also remove its %1 clips in timeline", item->numReferences(), item->names().at(1)), i18n("Delete Clip")) != KMessageBox::Yes) return; + } } } + if (delCommand->childCount() == 0) delete delCommand; else m_commandStack->push(delCommand); if (!ids.isEmpty()) m_doc->deleteProjectClip(ids); @@ -658,7 +664,7 @@ void ProjectList::slotAddClip(DocClipBase *clip, bool getProperties) if (getProperties == false && !clip->getClipHash().isEmpty()) { QString cachedPixmap = m_doc->projectFolder().path(KUrl::AddTrailingSlash) + "thumbs/" + clip->getClipHash() + ".png"; if (QFile::exists(cachedPixmap)) { - item->setIcon(0, QPixmap(cachedPixmap)); + item->setData(0, Qt::DecorationRole, QPixmap(cachedPixmap)); } } #ifdef NEPOMUK @@ -671,14 +677,14 @@ void ProjectList::slotAddClip(DocClipBase *clip, bool getProperties) } #endif // Add cut zones - QList cuts = clip->cutZones(); + QList cuts = clip->cutZones(); if (!cuts.isEmpty()) { for (int i = 0; i < cuts.count(); i++) { - SubProjectItem *sub = new SubProjectItem(item, cuts.at(i).x(), cuts.at(i).y()); + SubProjectItem *sub = new SubProjectItem(item, cuts.at(i).zone.x(), cuts.at(i).zone.y(), cuts.at(i).description); if (!clip->getClipHash().isEmpty()) { - QString cachedPixmap = m_doc->projectFolder().path(KUrl::AddTrailingSlash) + "thumbs/" + clip->getClipHash() + '#' + QString::number(cuts.at(i).x()) + ".png"; + QString cachedPixmap = m_doc->projectFolder().path(KUrl::AddTrailingSlash) + "thumbs/" + clip->getClipHash() + '#' + QString::number(cuts.at(i).zone.x()) + ".png"; if (QFile::exists(cachedPixmap)) { - sub->setIcon(0, QPixmap(cachedPixmap)); + sub->setData(0, Qt::DecorationRole, QPixmap(cachedPixmap)); } } } @@ -716,7 +722,7 @@ void ProjectList::slotProcessNextClipInQueue() const QDomElement dom = j.value(); const QString id = j.key(); m_infoQueue.remove(j.key()); - emit getFileProperties(dom, id, false); + emit getFileProperties(dom, id, m_listView->iconSize().height(), false); } } @@ -731,6 +737,7 @@ void ProjectList::slotUpdateClip(const QString &id) void ProjectList::updateAllClips() { m_listView->setSortingEnabled(false); + kDebug() << "// UPDATE ALL CLPY"; QTreeWidgetItemIterator it(m_listView); DocClipBase *clip; @@ -740,7 +747,7 @@ void ProjectList::updateAllClips() if ((*it)->type() == PROJECTSUBCLIPTYPE) { // subitem SubProjectItem *sub = static_cast (*it); - if (sub->icon(0).isNull()) { + if (sub->data(0, Qt::DecorationRole).isNull()) { item = static_cast ((*it)->parent()); requestClipThumbnail(item->clipId() + '#' + QString::number(sub->zone().x())); } @@ -750,28 +757,27 @@ void ProjectList::updateAllClips() // folder ++it; continue; - } - item = static_cast (*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->icon(0).isNull()) { - requestClipThumbnail(clip->getId()); - } - if (item->data(0, DurationRole).toString().isEmpty()) { - item->changeDuration(item->referencedClip()->producer()->get_playtime()); + item = static_cast (*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(); @@ -802,6 +808,16 @@ void ProjectList::slotAddClip(const QList givenList, const QString &group for (int i = 0; i < givenList.count(); i++) list << givenList.at(i); } + + foreach(const KUrl &file, list) { + // Check there is no folder here + KMimeType::Ptr type = KMimeType::findByUrl(file); + if (type->is("inode/directory")) { + // user dropped a folder + list.removeAll(file); + } + } + if (list.isEmpty()) return; if (givenList.isEmpty()) { @@ -1054,7 +1070,7 @@ void ProjectList::slotRefreshClipThumbnail(QTreeWidgetItem *it, bool update) return; } QPixmap pix; - int height = it->sizeHint(0).height(); + int height = m_listView->iconSize().height(); int width = (int)(height * m_render->dar()); if (clip->clipType() == AUDIO) pix = KIcon("audio-x-generic").pixmap(QSize(width, height)); else if (clip->clipType() == IMAGE) pix = QPixmap::fromImage(KThumb::getFrame(item->referencedClip()->producer(), 0, width, height)); @@ -1062,7 +1078,7 @@ void ProjectList::slotRefreshClipThumbnail(QTreeWidgetItem *it, bool update) if (!pix.isNull()) { m_listView->blockSignals(true); - it->setIcon(0, pix); + it->setData(0, Qt::DecorationRole, pix); if (m_listView->isEnabled()) m_listView->blockSignals(false); if (!isSubItem) m_doc->cachePixmap(item->getClipHash(), pix); else m_doc->cachePixmap(item->getClipHash() + '#' + QString::number(frame), pix); @@ -1080,6 +1096,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 @@ -1092,9 +1111,9 @@ void ProjectList::slotReplyGetFileProperties(const QString &clipId, Mlt::Produce delete producer; }*/ if (m_listView->isEnabled()) m_listView->blockSignals(false); - if (item->icon(0).isNull()) { + /*if (item->icon(0).isNull()) { requestClipThumbnail(clipId); - } + }*/ } else kDebug() << "//////// COULD NOT FIND CLIP TO UPDATE PRPS..."; int max = m_doc->clipManager()->clipsCount(); emit displayMessage(i18n("Loading clips"), (int)(100 *(max - m_infoQueue.count()) / max)); @@ -1111,7 +1130,7 @@ void ProjectList::slotReplyGetImage(const QString &clipId, const QPixmap &pix) ProjectItem *item = getItemById(clipId); if (item && !pix.isNull()) { m_listView->blockSignals(true); - item->setIcon(0, pix); + item->setData(0, Qt::DecorationRole, pix); m_doc->cachePixmap(item->getClipHash(), pix); if (m_listView->isEnabled()) m_listView->blockSignals(false); } @@ -1256,24 +1275,28 @@ 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, 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) +void ProjectList::addClipCut(const QString &id, int in, int out, const QString desc, bool newItem) { ProjectItem *clip = getItemById(id); if (clip) { DocClipBase *base = clip->referencedClip(); base->addCutZone(in, out); m_listView->blockSignals(true); - SubProjectItem *sub = new SubProjectItem(clip, in, out); - + 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->setIcon(0, p); + sub->setData(0, Qt::DecorationRole, p); m_doc->cachePixmap(clip->getClipHash() + '#' + QString::number(in), p); m_listView->blockSignals(false); } + emit projectModified(); } void ProjectList::removeClipCut(const QString &id, int in, int out) @@ -1282,18 +1305,53 @@ void ProjectList::removeClipCut(const QString &id, int in, int out) if (clip) { DocClipBase *base = clip->referencedClip(); base->removeCutZone(in, out); + SubProjectItem *sub = getSubItem(clip, QPoint(in, out)); + if (sub) { + m_listView->blockSignals(true); + delete sub; + m_listView->blockSignals(false); + } + } + emit projectModified(); +} + +SubProjectItem *ProjectList::getSubItem(ProjectItem *clip, QPoint zone) +{ + SubProjectItem *sub = NULL; + if (clip) { for (int i = 0; i < clip->childCount(); i++) { QTreeWidgetItem *it = clip->child(i); - if (it->type() != PROJECTSUBCLIPTYPE) continue; - SubProjectItem *sub = static_cast (it); - if (sub->zone() == QPoint(in, out)) { - m_listView->blockSignals(true); - delete it; - m_listView->blockSignals(false); - break; + if (it->type() == PROJECTSUBCLIPTYPE) { + sub = static_cast (it); + if (sub->zone() == zone) break; + else sub = NULL; } } } + return sub; +} + +void ProjectList::slotUpdateClipCut(QPoint p) +{ + if (!m_listView->currentItem() || m_listView->currentItem()->type() != PROJECTSUBCLIPTYPE) return; + SubProjectItem *sub = static_cast (m_listView->currentItem()); + ProjectItem *item = static_cast (sub->parent()); + EditClipCutCommand *command = new EditClipCutCommand(this, item->clipId(), sub->zone(), p, sub->text(1), sub->text(1), true); + m_commandStack->push(command); +} + +void ProjectList::doUpdateClipCut(const QString &id, const QPoint oldzone, const QPoint zone, const QString &comment) +{ + ProjectItem *clip = getItemById(id); + SubProjectItem *sub = getSubItem(clip, oldzone); + if (sub == NULL || clip == NULL) return; + DocClipBase *base = clip->referencedClip(); + base->updateCutZone(oldzone.x(), oldzone.y(), zone.x(), zone.y(), comment); + m_listView->blockSignals(true); + sub->setZone(zone); + sub->setDescription(comment); + m_listView->blockSignals(false); + emit projectModified(); } #include "projectlist.moc"