+void CustomTrackView::slotRefreshThumbs(const QString &id, bool resetThumbs)
+{
+ QList<QGraphicsItem *> list = scene()->items();
+ ClipItem *clip = NULL;
+ for (int i = 0; i < list.size(); ++i) {
+ if (list.at(i)->type() == AVWIDGET) {
+ clip = static_cast <ClipItem *>(list.at(i));
+ if (clip->clipProducer() == id) {
+ clip->refreshClip(true, resetThumbs);
+ }
+ }
+ }
+}
+
+void CustomTrackView::adjustEffects(ClipItem* item, ItemInfo oldInfo, QUndoCommand* command)
+{
+ QMap<int, QDomElement> effects = item->adjustEffectsToDuration(m_document->width(), m_document->height(), oldInfo);
+
+ if (!effects.isEmpty()) {
+ QMap<int, QDomElement>::const_iterator i = effects.constBegin();
+ while (i != effects.constEnd()) {
+ new EditEffectCommand(this, m_document->tracksCount() - item->track(), item->startPos(), i.value(), item->effect(i.key()), i.value().attribute("kdenlive_ix").toInt(), true, true, command);
+ ++i;
+ }
+ }
+}
+
+
+void CustomTrackView::slotGotFilterJobResults(const QString &/*id*/, int startPos, int track, stringMap filterParams, stringMap extra)
+{
+ ClipItem *clip = getClipItemAt(GenTime(startPos, m_document->fps()), track);
+ if (clip == NULL) {
+ emit displayMessage(i18n("Cannot find clip for effect update %1.", extra.value("finalfilter")), ErrorMessage);
+ return;
+ }
+ QDomElement newEffect;
+ QDomElement effect = clip->getEffectAtIndex(clip->selectedEffectIndex());
+ if (effect.attribute("id") == extra.value("finalfilter")) {
+ newEffect = effect.cloneNode().toElement();
+ QMap<QString, QString>::const_iterator i = filterParams.constBegin();
+ while (i != filterParams.constEnd()) {
+ EffectsList::setParameter(newEffect, i.key(), i.value());
+ kDebug()<<"// RESULT FILTER: "<<i.key()<<"="<< i.value();
+ ++i;
+ }
+ EditEffectCommand *command = new EditEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), effect, newEffect, clip->selectedEffectIndex(), true, true);
+ m_commandStack->push(command);
+ emit clipItemSelected(clip);
+ }
+}
+
+
+void CustomTrackView::slotImportClipKeyframes(GRAPHICSRECTITEM type)
+{
+ ClipItem *item = NULL;
+ if (type == TRANSITIONWIDGET) {
+ // We want to import keyframes to a transition
+ if (!m_selectionGroup) {
+ emit displayMessage(i18n("You need to select one clip and one transition"), ErrorMessage);
+ return;
+ }
+ // Make sure there is no collision
+ QList<QGraphicsItem *> children = m_selectionGroup->childItems();
+ for (int i = 0; i < children.count(); ++i) {
+ if (children.at(i)->type() == AVWIDGET) {
+ item = (ClipItem*) children.at(i);
+ break;
+ }
+ }
+ }
+ else {
+ // Import keyframes from current clip to its effect
+ if (m_dragItem) item = static_cast<ClipItem*> (m_dragItem);
+ }
+
+ if (!item) {
+ emit displayMessage(i18n("No clip found"), ErrorMessage);
+ return;
+ }
+ QMap <QString, QString> data = item->baseClip()->analysisData();
+ if (data.isEmpty()) {
+ emit displayMessage(i18n("No keyframe data found in clip"), ErrorMessage);
+ return;
+ }
+ QPointer<QDialog> d = new QDialog(this);
+ Ui::ImportKeyframesDialog_UI ui;
+ ui.setupUi(d);
+
+ // Set up data
+ int ix = 0;
+ QMap<QString, QString>::const_iterator i = data.constBegin();
+ while (i != data.constEnd()) {
+ ui.data_list->insertItem(ix, i.key());
+ ui.data_list->setItemData(ix, i.value(), Qt::UserRole);
+ ++i;
+ ix++;
+ }
+
+ if (d->exec() != QDialog::Accepted) {
+ delete d;
+ return;
+ }
+ QString keyframeData = ui.data_list->itemData(ui.data_list->currentIndex()).toString();
+
+ int offset = item->cropStart().frames(m_document->fps());
+ Mlt::Geometry geometry(keyframeData.toUtf8().data(), item->baseClip()->maxDuration().frames(m_document->fps()), m_document->mltProfile().width, m_document->mltProfile().height);
+ Mlt::Geometry newGeometry(QString().toUtf8().data(), item->baseClip()->maxDuration().frames(m_document->fps()), m_document->mltProfile().width, m_document->mltProfile().height);
+ Mlt::GeometryItem gitem;
+ geometry.fetch(&gitem, offset);
+ gitem.frame(0);
+ newGeometry.insert(gitem);
+ int pos = offset + 1;
+ while (!geometry.next_key(&gitem, pos)) {
+ pos = gitem.frame();
+ gitem.frame(pos - offset);
+ pos++;
+ newGeometry.insert(gitem);
+ }
+ QStringList keyframeList = QString(newGeometry.serialise()).split(';', QString::SkipEmptyParts);
+
+ QString result;
+ if (ui.import_position->isChecked()) {
+ if (ui.import_size->isChecked()) {
+ foreach(QString key, keyframeList) {
+ if (key.count(':') > 1) result.append(key.section(':', 0, 1));
+ else result.append(key);
+ result.append(';');
+ }
+ }
+ else {
+ foreach(QString key, keyframeList) {
+ result.append(key.section(':', 0, 0));
+ result.append(';');
+ }
+ }
+ }
+ else if (ui.import_size->isChecked()) {
+ foreach(QString key, keyframeList) {
+ result.append(key.section(':', 1, 1));
+ result.append(';');
+ }
+ }
+ emit importKeyframes(type, result, ui.limit_keyframes->isChecked() ? ui.max_keyframes->value() : -1);
+ delete d;
+}
+