X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fclipmanager.cpp;h=643e9816faf1e865f8d091e1db33dbc59318063d;hb=254095f40e332af8c58baf10dd946090f7c6fee1;hp=38ae8e90ab374e93c148fab423e8715d1cb9222f;hpb=bdfcbfc3ec309800eaa9e106203c9ad840fed35e;p=kdenlive diff --git a/src/clipmanager.cpp b/src/clipmanager.cpp index 38ae8e90..643e9816 100644 --- a/src/clipmanager.cpp +++ b/src/clipmanager.cpp @@ -60,11 +60,11 @@ ClipManager::ClipManager(KdenliveDoc *doc) : m_clipIdCounter = 1; m_folderIdCounter = 1; m_modifiedTimer.setInterval(1500); - connect(&m_fileWatcher, SIGNAL(dirty(const QString &)), this, SLOT(slotClipModified(const QString &))); - connect(&m_fileWatcher, SIGNAL(deleted(const QString &)), this, SLOT(slotClipMissing(const QString &))); + connect(&m_fileWatcher, SIGNAL(dirty(QString)), this, SLOT(slotClipModified(QString))); + connect(&m_fileWatcher, SIGNAL(deleted(QString)), this, SLOT(slotClipMissing(QString))); // Seems like a dirty signal is emitted anyways when a watched file is created, so don't react twice. - //connect(&m_fileWatcher, SIGNAL(created(const QString &)), this, SLOT(slotClipAvailable(const QString &))); + //connect(&m_fileWatcher, SIGNAL(created(QString)), this, SLOT(slotClipAvailable(QString))); connect(&m_modifiedTimer, SIGNAL(timeout()), this, SLOT(slotProcessModifiedClips())); #if KDE_IS_VERSION(4,5,0) @@ -123,7 +123,7 @@ void ClipManager::clearCache() #endif } -void ClipManager::requestThumbs(const QString id, QList frames) +void ClipManager::slotRequestThumbs(const QString &id, const QList & frames) { m_thumbsMutex.lock(); foreach (int frame, frames) { @@ -227,7 +227,7 @@ void ClipManager::checkAudioThumbs() } m_thumbsMutex.lock(); - for (int i = 0; i < m_clipList.count(); i++) { + for (int i = 0; i < m_clipList.count(); ++i) { DocClipBase *clip = m_clipList.at(i); if (clip->hasAudioThumb() && !clip->audioThumbCreated()) m_audioThumbsQueue.append(m_clipList.at(i)->getId()); @@ -264,12 +264,14 @@ void ClipManager::slotGetAudioThumbs() if (hash.isEmpty()) continue; QString audioPath = projectFolder() + "/thumbs/" + hash + ".thumb"; double lengthInFrames = clip->duration().frames(m_doc->fps()); - int frequency = 48000; - int channels = 2; + int frequency = 0; + int channels = 0; QString data = clip->getProperty("frequency"); if (!data.isEmpty()) frequency = data.toInt(); + if (frequency <= 0) frequency = 48000; data = clip->getProperty("channels"); if (!data.isEmpty()) channels = data.toInt(); + if (channels <= 0) channels = 2; int arrayWidth = 20; double frame = 0.0; int maxVolume = 0; @@ -292,7 +294,7 @@ void ClipManager::slotGetAudioThumbs() h3 = 0; for (int c = 0; c < channels; c++) { QByteArray audioArray(arrayWidth, '\x00'); - for (int i = 0; i < arrayWidth; i++) { + for (int i = 0; i < arrayWidth; ++i) { audioArray[i] = channelarray.at(h2 + h3 + i); if (audioArray.at(i) > maxVolume) maxVolume = audioArray.at(i); } @@ -351,7 +353,7 @@ void ClipManager::slotGetAudioThumbs() for (int c = 0; c < channels; c++) { QByteArray audioArray; audioArray.resize(arrayWidth); - for (int i = 0; i < audioArray.size(); i++) { + for (int i = 0; i < audioArray.size(); ++i) { double pcmval = *(pcm + c + i * samples / audioArray.size()); if (pcmval >= 0) { pcmval = sqrt(pcmval) / 2.83 + 64; @@ -418,7 +420,7 @@ void ClipManager::slotDeleteClips(QStringList ids) QUndoCommand *delClips = new QUndoCommand(); delClips->setText(i18np("Delete clip", "Delete clips", ids.size())); - for (int i = 0; i < ids.size(); i++) { + for (int i = 0; i < ids.size(); ++i) { DocClipBase *clip = getClipById(ids.at(i)); if (clip) { new AddClipCommand(m_doc, clip->toXML(), ids.at(i), false, delClips); @@ -429,7 +431,7 @@ void ClipManager::slotDeleteClips(QStringList ids) void ClipManager::deleteClip(const QString &clipId) { - for (int i = 0; i < m_clipList.count(); i++) { + for (int i = 0; i < m_clipList.count(); ++i) { if (m_clipList.at(i)->getId() == clipId) { DocClipBase *clip = m_clipList.takeAt(i); if (clip->clipType() != COLOR && clip->clipType() != SLIDESHOW && !clip->fileURL().isEmpty()) { @@ -453,7 +455,7 @@ DocClipBase *ClipManager::getClipById(QString clipId) { //kDebug() << "++++ CLIP MAN, LOOKING FOR CLIP ID: " << clipId; clipId = clipId.section('_', 0, 0); - for (int i = 0; i < m_clipList.count(); i++) { + for (int i = 0; i < m_clipList.count(); ++i) { if (m_clipList.at(i)->getId() == clipId) { //kDebug() << "++++ CLIP MAN, FOUND FOR CLIP ID: " << clipId; return m_clipList.at(i); @@ -462,12 +464,12 @@ DocClipBase *ClipManager::getClipById(QString clipId) return NULL; } -const QList ClipManager::getClipByResource(QString resource) +const QList ClipManager::getClipByResource(const QString &resource) { QList list; QString clipResource; QString proxyResource; - for (int i = 0; i < m_clipList.count(); i++) { + for (int i = 0; i < m_clipList.count(); ++i) { clipResource = m_clipList.at(i)->getProperty("resource"); proxyResource = m_clipList.at(i)->getProperty("proxy"); if (clipResource.isEmpty()) clipResource = m_clipList.at(i)->getProperty("colour"); @@ -481,14 +483,14 @@ const QList ClipManager::getClipByResource(QString resource) void ClipManager::clearUnusedProducers() { - for (int i = 0; i < m_clipList.count(); i++) { + for (int i = 0; i < m_clipList.count(); ++i) { if (m_clipList.at(i)->numReferences() == 0) m_clipList.at(i)->deleteProducers(); } } void ClipManager::resetProducersList(const QList prods, bool displayRatioChanged, bool fpsChanged) { - for (int i = 0; i < m_clipList.count(); i++) { + for (int i = 0; i < m_clipList.count(); ++i) { if (m_clipList.at(i)->numReferences() > 0 || displayRatioChanged || fpsChanged) { m_clipList.at(i)->deleteProducers(); } @@ -496,7 +498,7 @@ void ClipManager::resetProducersList(const QList prods, bool d QString id; Mlt::Producer *prod; QStringList brokenClips; - for (int i = 0; i < prods.count(); i++) { + for (int i = 0; i < prods.count(); ++i) { prod = prods.at(i); id = prod->get("id"); if (id.contains('_')) id = id.section('_', 0, 0); @@ -525,7 +527,7 @@ void ClipManager::slotAddClip(KIO::Job *job, const KUrl &, const KUrl &dst) slotAddClipList(KUrl::List () << dst, data); } -void ClipManager::slotAddClipList(const KUrl::List urls, QMap data) +void ClipManager::slotAddClipList(const KUrl::List &urls, const QMap &data) { QUndoCommand *addClips = new QUndoCommand(); // Update list of removable volumes @@ -551,7 +553,7 @@ void ClipManager::slotAddClipList(const KUrl::List urls, QMap copyjob->addMetaData("groupId", data.value("groupId")); copyjob->addMetaData("comment", data.value("comment")); copyjob->ui()->setWindow(kapp->activeWindow()); - connect(copyjob, SIGNAL(copyingDone(KIO::Job *, const KUrl &, const KUrl &, time_t, bool, bool)), this, SLOT(slotAddClip(KIO::Job *, const KUrl &, const KUrl &))); + connect(copyjob, SIGNAL(copyingDone(KIO::Job*,KUrl,KUrl,time_t,bool,bool)), this, SLOT(slotAddClip(KIO::Job*,KUrl,KUrl))); continue; } } @@ -581,7 +583,12 @@ void ClipManager::slotAddClipList(const KUrl::List urls, QMap KFileMetaInfo metaInfo(file.path(), QString("image/jpeg"), KFileMetaInfo::TechnicalInfo); const QHash metaInfoItems = metaInfo.items(); foreach(const KFileMetaInfoItem & metaInfoItem, metaInfoItems) { - prod.setAttribute("meta.attr." + metaInfoItem.name().section('#', 1), metaInfoItem.value().toString()); + QDomElement meta = doc.createElement("metaproperty"); + meta.setAttribute("name", "meta.attr." + metaInfoItem.name().section('#', 1)); + QDomText value = doc.createTextNode(metaInfoItem.value().toString()); + meta.setAttribute("tool", "KDE Metadata"); + meta.appendChild(value); + prod.appendChild(meta); } } } else if (type->is("application/x-kdenlivetitle")) { @@ -593,7 +600,7 @@ void ClipManager::slotAddClipList(const KUrl::List urls, QMap prod.setAttribute("type", (int) TEXT); // extract embeded images QDomNodeList items = txtdoc.elementsByTagName("content"); - for (int i = 0; i < items.count() ; i++) { + for (int i = 0; i < items.count() ; ++i) { QDomElement content = items.item(i).toElement(); if (content.hasAttribute("base64")) { QString titlesFolder = m_doc->projectFolder().path(KUrl::AddTrailingSlash) + "titles/"; @@ -604,15 +611,23 @@ void ClipManager::slotAddClipList(const KUrl::List urls, QMap } } } - QString titleData = txtdoc.toString(); - prod.setAttribute("xmldata", titleData); prod.setAttribute("transparency", 1); prod.setAttribute("in", 0); - int out = txtdoc.documentElement().attribute("out").toInt(); - if (out > 0) - prod.setAttribute("out", out); - else - prod.setAttribute("out", m_doc->getFramePos(KdenliveSettings::title_duration()) - 1); + if (!txtdoc.documentElement().hasAttribute("out")) { + prod.setAttribute("out", m_doc->getFramePos(KdenliveSettings::title_duration()) - 1); + txtdoc.documentElement().setAttribute("out", m_doc->getFramePos(KdenliveSettings::title_duration()) - 1); + } + else { + int out = txtdoc.documentElement().attribute("out").toInt(); + if (out >= 0) + prod.setAttribute("out", out); + else { + prod.setAttribute("out", m_doc->getFramePos(KdenliveSettings::title_duration()) - 1); + txtdoc.documentElement().setAttribute("out", m_doc->getFramePos(KdenliveSettings::title_duration()) - 1); + } + } + QString titleData = txtdoc.toString(); + prod.setAttribute("xmldata", titleData); } else txtfile.close(); } @@ -626,7 +641,7 @@ void ClipManager::slotAddClipList(const KUrl::List urls, QMap } } -void ClipManager::slotAddClipFile(const KUrl &url, QMap data) +void ClipManager::slotAddClipFile(const KUrl &url, const QMap &data) { slotAddClipList(KUrl::List(url), data); } @@ -648,7 +663,7 @@ void ClipManager::slotAddXmlClipFile(const QString &name, const QDomElement &xml m_doc->commandStack()->push(command); } -void ClipManager::slotAddColorClipFile(const QString &name, const QString &color, QString duration, const QString &group, const QString &groupId) +void ClipManager::slotAddColorClipFile(const QString &name, const QString &color, const QString &duration, const QString &group, const QString &groupId) { QDomDocument doc; QDomElement prod = doc.createElement("producer"); @@ -730,16 +745,22 @@ void ClipManager::slotAddTextTemplateClip(QString titleName, const KUrl &path, c prod.setAttribute("transparency", "1"); prod.setAttribute("in", "0"); - int out = 0; + int duration = 0; QDomDocument titledoc; QFile txtfile(path.path()); if (txtfile.open(QIODevice::ReadOnly) && titledoc.setContent(&txtfile)) { txtfile.close(); - out = titledoc.documentElement().attribute("out").toInt(); + if (titledoc.documentElement().hasAttribute("duration")) { + duration = titledoc.documentElement().attribute("duration").toInt(); + } + else { + // keep some time for backwards compatibility - 26/12/12 + duration = titledoc.documentElement().attribute("out").toInt(); + } } else txtfile.close(); - if (out == 0) out = m_doc->getFramePos(KdenliveSettings::image_duration()); - prod.setAttribute("out", out); + if (duration == 0) duration = m_doc->getFramePos(KdenliveSettings::title_duration()); + prod.setAttribute("out", duration - 1); AddClipCommand *command = new AddClipCommand(m_doc, doc.documentElement(), QString::number(id), true); m_doc->commandStack()->push(command); @@ -792,7 +813,7 @@ QDomElement ClipManager::groupsXml() const QDomDocument doc; QDomElement groups = doc.createElement("groups"); doc.appendChild(groups); - for (int i = 0; i < m_groupsList.count(); i++) { + for (int i = 0; i < m_groupsList.count(); ++i) { QDomElement group = doc.createElement("group"); groups.appendChild(group); QList children = m_groupsList.at(i)->childItems(); @@ -822,7 +843,7 @@ void ClipManager::slotClipModified(const QString &path) { //kDebug() << "// CLIP: " << path << " WAS MODIFIED"; const QList list = getClipByResource(path); - for (int i = 0; i < list.count(); i++) { + for (int i = 0; i < list.count(); ++i) { DocClipBase *clip = list.at(i); if (clip != NULL) { QString id = clip->getId(); @@ -854,7 +875,7 @@ void ClipManager::slotClipMissing(const QString &path) { // kDebug() << "// CLIP: " << path << " WAS MISSING"; const QList list = getClipByResource(path); - for (int i = 0; i < list.count(); i++) { + for (int i = 0; i < list.count(); ++i) { DocClipBase *clip = list.at(i); if (clip != NULL) emit missingClip(clip->getId()); } @@ -864,7 +885,7 @@ void ClipManager::slotClipAvailable(const QString &path) { // kDebug() << "// CLIP: " << path << " WAS ADDED"; const QList list = getClipByResource(path); - for (int i = 0; i < list.count(); i++) { + for (int i = 0; i < list.count(); ++i) { DocClipBase *clip = list.at(i); if (clip != NULL) emit availableClip(clip->getId()); } @@ -961,7 +982,7 @@ bool ClipManager::isOnRemovableDevice(const KUrl &url) return volumeMatch; } -void ClipManager::projectTreeThumbReady(const QString &id, int frame, QImage img, int type) +void ClipManager::projectTreeThumbReady(const QString &id, int frame, const QImage &img, int type) { switch (type) { case 2: @@ -972,3 +993,5 @@ void ClipManager::projectTreeThumbReady(const QString &id, int frame, QImage img } } + +#include "clipmanager.moc"