]> git.sesse.net Git - kdenlive/commitdiff
Prepare importing of keyframes from clip analysis
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Sun, 21 Oct 2012 11:37:35 +0000 (13:37 +0200)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Sun, 21 Oct 2012 11:37:35 +0000 (13:37 +0200)
20 files changed:
src/CMakeLists.txt
src/customtrackview.cpp
src/customtrackview.h
src/docclipbase.cpp
src/effectstack/collapsibleeffect.cpp
src/effectstack/collapsibleeffect.h
src/effectstack/effectstackview2.cpp
src/effectstack/effectstackview2.h
src/effectstack/parametercontainer.cpp
src/effectstack/parametercontainer.h
src/effectstackedit.cpp
src/effectstackedit.h
src/geometrywidget.cpp
src/geometrywidget.h
src/mainwindow.cpp
src/mainwindow.h
src/projectlist.cpp
src/transitionsettings.cpp
src/transitionsettings.h
src/widgets/importkeyframesdialog_ui.ui [new file with mode: 0644]

index 74c44596c678963f9c33951e8cd6a00ddc14cb11..0aef0bbb95b85cc12cc881df613220f2aae84afe 100644 (file)
@@ -263,6 +263,7 @@ kde4_add_ui_files(kdenlive_UIS
   widgets/fontval_ui.ui
   widgets/cutjobdialog_ui.ui
   widgets/scenecutdialog_ui.ui
+  widgets/importkeyframesdialog_ui.ui
 )
 
 if(OPENGL_FOUND)
index 45834e5da57414971620ad65373f2949670a002d..029f004ccecfaf98b0f017b3deb1bc81ae080a85 100644 (file)
@@ -52,6 +52,7 @@
 #include "commands/changeeffectstatecommand.h"
 #include "commands/movegroupcommand.h"
 #include "ui_addtrack_ui.h"
+#include "ui_importkeyframesdialog_ui.h"
 #include "initeffects.h"
 #include "commands/locktrackcommand.h"
 #include "commands/groupclipscommand.h"
@@ -7514,3 +7515,69 @@ void CustomTrackView::slotGotFilterJobResults(const QString &/*id*/, int startPo
 }
 
 
+void CustomTrackView::slotImportClipKeyframes(GRAPHICSRECTITEM type)
+{
+    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();
+    ClipItem *item;
+    for (int i = 0; i < children.count(); i++) {
+       if (children.at(i)->type() == AVWIDGET) {
+            item = (ClipItem*) children.at(i);
+            break;
+        }
+    }
+    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();
+    QStringList keyframeList = keyframeData.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);
+    delete d;
+}
+
index 0c950b54098811adf48efc3d4b9be0bc2ce0519f..240d5f19e1bb6a0a367dc5eb9f20558a86d1e3d0 100644 (file)
@@ -300,6 +300,7 @@ public slots:
     void updateSnapPoints(AbstractClipItem *selected, QList <GenTime> offsetList = QList <GenTime> (), bool skipSelectedItems = false);
     
     void slotAddEffect(ClipItem *clip, QDomElement effect);
+    void slotImportClipKeyframes(GRAPHICSRECTITEM type);
 
 protected:
     virtual void drawBackground(QPainter * painter, const QRectF & rect);
@@ -525,6 +526,8 @@ signals:
     void updateTrackEffectState(int);
     /** @brief Cursor position changed, repaint ruler.*/
     void updateRuler();
+    /** @brief Send data from a clip to be imported as keyframes for effect / transition.*/
+    void importKeyframes(GRAPHICSRECTITEM type, const QString&);
 };
 
 #endif
index 693e4ecca2f2829fc62d73add95782907d46fb70..d278eeca429e9307f13c6da6feafbe9cd5ff052c 100644 (file)
@@ -73,6 +73,12 @@ DocClipBase::DocClipBase(ClipManager *clipManager, QDomElement xml, const QStrin
         }
     }
 
+    if (xml.hasAttribute("analysisdata")) {
+       QStringList adata = xml.attribute("analysisdata").split('#', QString::SkipEmptyParts);
+       for (int i = 0; i < adata.count(); i++)
+           m_analysisdata.insert(adata.at(i).section('?', 0, 0), adata.at(i).section('?', 1, 1));
+    }
+
     KUrl url = KUrl(xml.attribute("resource"));
     if (!m_properties.contains("file_hash") && !url.isEmpty()) getFileHash(url.path());
 
@@ -255,6 +261,16 @@ QDomElement DocClipBase::toXML(bool hideTemporaryProperties) const
         }
         clip.setAttribute("cutzones", cuts.join(";"));
     }
+    QString adata;
+    if (!m_analysisdata.isEmpty()) {
+       QMapIterator<QString, QString> i(m_analysisdata);
+       while (i.hasNext()) {
+           i.next();
+           //WARNING: a ? and # separator is not a good idea
+           adata.append(i.key() + "?" + i.value() + "#");
+       }
+    }
+    clip.setAttribute("analysisdata", adata);
     //kDebug() << "/// CLIP XML: " << doc.toString();
     return doc.documentElement();
 }
index 5d953f19d1ad16cfc29a75a684653ee1cae07d81..7ca823759dc6fe5c5f2b5054e1582617a8399c49 100644 (file)
@@ -460,6 +460,7 @@ void CollapsibleEffect::setupWidget(ItemInfo info, EffectMetaInfo *metaInfo)
     connect (this, SIGNAL(syncEffectsPos(int)), m_paramWidget, SIGNAL(syncEffectsPos(int)));
     connect (m_paramWidget, SIGNAL(checkMonitorPosition(int)), this, SIGNAL(checkMonitorPosition(int)));
     connect (m_paramWidget, SIGNAL(seekTimeline(int)), this, SIGNAL(seekTimeline(int)));
+    connect(m_paramWidget, SIGNAL(importClipKeyframes()), this, SIGNAL(importClipKeyframes()));
     
     
 }
index 45398f272221d3e618bbab6d11cdd7e626cd21bb..54daa70b7724faff8389f0bf2e00545dea940b10 100644 (file)
@@ -137,6 +137,7 @@ signals:
     void unGroup(CollapsibleEffect *);
     void createRegion(int, KUrl);
     void deleteGroup(QDomDocument);
+    void importClipKeyframes();
 };
 
 
index f33ecc6c0099f07ad8df8b76dc7458c127b29454..7366b7531465b584527fc6e0651e9f95b5f2886b 100644 (file)
@@ -284,6 +284,7 @@ void EffectStackView2::connectEffect(CollapsibleEffect *currentEffect)
     connect(currentEffect, SIGNAL(addEffect(QDomElement)), this , SLOT(slotAddEffect(QDomElement)));
     connect(currentEffect, SIGNAL(createRegion(int,KUrl)), this, SLOT(slotCreateRegion(int,KUrl)));
     connect(currentEffect, SIGNAL(deleteGroup(QDomDocument)), this , SLOT(slotDeleteGroup(QDomDocument)));
+    connect(currentEffect, SIGNAL(importClipKeyframes()), this, SIGNAL(importClipKeyframes()));
 }
 
 void EffectStackView2::slotCheckWheelEventFilter()
index 4ce9580f8a9137bba7e35f94f5f2b888df9595ad..6c878505ef45a611d89cb540b9fdf6782182a490 100644 (file)
@@ -225,6 +225,7 @@ signals:
     void showComments(bool show);
     void startFilterJob(ItemInfo info, const QString &clipId, const QString &filterName, const QString &filterParams, const QString&finalFilterName, const QString &consumer, const QString &consumerParams, const QStringList &extraParams);
     void addEffect(ClipItem*,QDomElement);
+    void importClipKeyframes(GRAPHICSRECTITEM = AVWIDGET);
 };
 
 #endif
index 9aaf36c12d0c928eca41de8514de561a507b82f6..9dd041f00ae9a61a88e8fb741aa2bb61761686ce 100644 (file)
@@ -226,6 +226,7 @@ ParameterContainer::ParameterContainer(QDomElement effect, ItemInfo info, Effect
                 m_vbox->addWidget(m_geometryWidget);
                 m_valueItems[paramName+"geometry"] = m_geometryWidget;
                 connect(m_geometryWidget, SIGNAL(seekToPos(int)), this, SIGNAL(seekTimeline(int)));
+               connect(m_geometryWidget, SIGNAL(importClipKeyframes()), this, SIGNAL(importClipKeyframes()));
                 connect(this, SIGNAL(syncEffectsPos(int)), m_geometryWidget, SLOT(slotSyncPosition(int)));
             } else {
                 Geometryval *geo = new Geometryval(m_metaInfo->profile, m_metaInfo->timecode, m_metaInfo->frameSize, 0);
@@ -844,3 +845,14 @@ bool ParameterContainer::needsMonitorEffectScene() const
 {
     return m_needsMonitorEffectScene;
 }
+
+void ParameterContainer::setKeyframes(const QString &data)
+{
+    if (!m_geometryWidget) {
+       kDebug()<<" / / NO GEOMETRY WIDGET FOUND FOR IMPORTING DATA";
+       return;
+    }
+    m_geometryWidget->importKeyframes(data);
+    
+}
+
index ae286af8ceac48eca096ac494b19cd4923b5e107..178180dcd5c9d97a5aa1d5c220b09c6860cd1e6c 100644 (file)
@@ -66,6 +66,8 @@ public:
     void updateParameter(const QString &key, const QString &value);
     /** @brief Returns true of this effect requires an on monitor adjustable effect scene. */
     bool needsMonitorEffectScene() const;
+    /** @brief Set keyframes for this param. */
+    void setKeyframes(const QString &data);
 
 private slots:
     void slotCollectAllParameters();
@@ -103,7 +105,8 @@ signals:
     void showComments(bool);    
     /** @brief Start an MLT filter job on this clip. */
     void startFilterJob(QString filterName, QString filterParams, QString finalFilterName, QString consumer, QString consumerParams, QStringList extra);
-    
+    /** @brief Request import of keyframes from clip data. */
+    void importClipKeyframes();
 };
 
 #endif
index 2dec16e18028a5080cfede0827cb402891f06b9b..cc4212fdf511ab497549646ed1456ce28ede7506 100644 (file)
@@ -152,11 +152,12 @@ void EffectStackEdit::transferParamDesc(const QDomElement &d, ItemInfo info, boo
     m_paramWidget = new ParameterContainer(d, info, &m_metaInfo, m_baseWidget);
     connect (m_paramWidget, SIGNAL(parameterChanged(const QDomElement, const QDomElement, int)), this, SIGNAL(parameterChanged(const QDomElement, const QDomElement, int)));
     
-    connect(m_paramWidget, SIGNAL(startFilterJob(QString,QString,QString,QString,QString,QString,QStringList)), this, SIGNAL(startFilterJob(QString,QString,QString,QString,QString,QString,QStringList)));
+    connect(m_paramWidget, SIGNAL(startFilterJob(QString,QString,QString,QString,QString,QStringList)), this, SIGNAL(startFilterJob(QString,QString,QString,QString,QString,QStringList)));
     
     connect (this, SIGNAL(syncEffectsPos(int)), m_paramWidget, SIGNAL(syncEffectsPos(int)));
     connect (m_paramWidget, SIGNAL(checkMonitorPosition(int)), this, SIGNAL(checkMonitorPosition(int)));
     connect (m_paramWidget, SIGNAL(seekTimeline(int)), this, SIGNAL(seekTimeline(int)));
+    connect (m_paramWidget, SIGNAL(importClipKeyframes()), this, SIGNAL(importClipKeyframes()));
     
     Q_FOREACH( QSpinBox * sp, m_baseWidget->findChildren<QSpinBox*>() ) {
         sp->installEventFilter( this );
@@ -183,4 +184,9 @@ bool EffectStackEdit::needsMonitorEffectScene() const
     return m_paramWidget->needsMonitorEffectScene();
 }
 
+void EffectStackEdit::setKeyframes(const QString &data)
+{
+    if (!m_paramWidget) return;
+    m_paramWidget->setKeyframes(data);
+}
 
index a4e74ff20c5ae8ef4cd712d0fbe56cad52925d91..3ef8aaa9b1bb3000e50cc9d786a3fc961b5b7bf7 100644 (file)
@@ -56,6 +56,8 @@ public:
     virtual bool eventFilter( QObject * o, QEvent * e );
     /** @brief Returns true if this transition requires an on monitor scene. */
     bool needsMonitorEffectScene() const;
+    /** @brief Set keyframes for this transition. */
+    void setKeyframes(const QString &data);
 
 private:
     Monitor *m_monitor;
@@ -79,7 +81,8 @@ signals:
     void showComments(bool show);
     void effectStateChanged(bool enabled);
     /** @brief Start an MLT filter job on this clip. */
-    void startFilterJob(const QString &filterName, const QString &filterParams, const QString &finalFilterName, const QString &consumer, const QString &consumerParams, const QString &properties, const QStringList&extraParams);
+    void startFilterJob(const QString &filterName, const QString &filterParams, const QString &finalFilterName, const QString &consumer, const QString &consumerParams, const QStringList&extraParams);
+    void importClipKeyframes(GRAPHICSRECTITEM = AVWIDGET);
 };
 
 #endif
index 0dbd932c947a9e9fd6a3ac6d3ed460ef6b2f952a..55a234046c1cfd309378345da8d743bd9380e21a 100644 (file)
@@ -123,7 +123,10 @@ GeometryWidget::GeometryWidget(Monitor* monitor, Timecode timecode, int clipPos,
     connect(fitToHeight, SIGNAL(triggered()), this, SLOT(slotFitToHeight()));
     menu->addAction(fitToHeight);
     menu->addSeparator();
-
+    QAction *importKeyframes = new QAction(i18n("Import keyframes from clip"), this);
+    connect(importKeyframes, SIGNAL(triggered()), this, SIGNAL(importClipKeyframes()));
+    menu->addAction(importKeyframes);
+    menu->addSeparator();
     QAction *alignleft = new QAction(KIcon("kdenlive-align-left"), i18n("Align left"), this);
     connect(alignleft, SIGNAL(triggered()), this, SLOT(slotMoveLeft()));
     menu->addAction(alignleft);
@@ -731,4 +734,41 @@ void GeometryWidget::slotFitToHeight()
     updateMonitorGeometry();
 }
 
+void GeometryWidget::importKeyframes(const QString &data)
+{
+    QStringList list = data.split(';', QString::SkipEmptyParts);
+    QPoint screenSize = m_frameSize;
+    if (screenSize == QPoint() || screenSize.x() == 0 || screenSize.y() == 0) {
+        screenSize = QPoint(m_monitor->render->frameRenderWidth(), m_monitor->render->renderHeight());
+    }
+    for (int i = 0; i < list.count(); i++) {
+       Mlt::GeometryItem item;
+       QString geom = list.at(i);
+       if (geom.contains('=')) {
+           item.frame(geom.section('=', 0, 0).toInt());
+       }
+       geom = geom.section('=', 1);
+       if (geom.contains('/')) {
+           item.x(geom.section('/', 0, 0).toDouble());
+           item.y(geom.section('/', 1, 1).section(':', 0, 0).toDouble());
+       }
+       else {
+           item.x(0);
+           item.y(0);
+       }
+       if (geom.contains('x')) {
+           item.w(geom.section('x', 0, 0).section(':', 1, 1).toDouble());
+           item.h(geom.section('x', 1, 1).section(':', 0, 0).toDouble());
+       }
+       else {
+           item.w(screenSize.x());
+           item.h(screenSize.y());
+       }
+       //TODO: opacity
+       item.mix(100);
+       m_geometry->insert(item);
+    }
+    emit parameterChanged();
+}
+
 #include "geometrywidget.moc"
index 64cb02aaab0e799344a8d47df0534b866dba62ae..df26b9c47259c4c653bb631a30de67a69735e1d0 100644 (file)
@@ -56,8 +56,8 @@ public:
     void updateTimecodeFormat();
     /** @brief Sets the size of the original clip. */
     void setFrameSize(QPoint size);
-
     void addParameter(const QDomElement elem);
+    void importKeyframes(const QString &data);
 
 public slots:
     /** @brief Sets up the rect and the geometry object.
@@ -172,6 +172,7 @@ private slots:
 signals:
     void parameterChanged();
     void seekToPos(int);
+    void importClipKeyframes();
 };
 
 #endif
index 8f2e08292f6d587fc62d1a4f529c38afd3a89c7b..31d181f574f657b5509222c9b5bfdc26345af20f 100644 (file)
@@ -2538,6 +2538,8 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc)   //cha
             disconnect(m_effectStack, SIGNAL(displayMessage(const QString&, int)), this, SLOT(slotGotProgressInfo(const QString&, int)));
             disconnect(m_transitionConfig, SIGNAL(transitionUpdated(Transition *, QDomElement)), m_activeTimeline->projectView() , SLOT(slotTransitionUpdated(Transition *, QDomElement)));
             disconnect(m_transitionConfig, SIGNAL(seekTimeline(int)), m_activeTimeline->projectView() , SLOT(setCursorPos(int)));
+           disconnect(m_transitionConfig, SIGNAL(importClipKeyframes(GRAPHICSRECTITEM)), m_activeTimeline->projectView() , SLOT(slotImportClipKeyframes(GRAPHICSRECTITEM)));
+
             disconnect(m_activeTimeline->projectView(), SIGNAL(activateDocumentMonitor()), m_projectMonitor, SLOT(slotActivateMonitor()));
             disconnect(m_activeTimeline, SIGNAL(zoneMoved(int, int)), this, SLOT(slotZoneMoved(int, int)));
             disconnect(m_projectList, SIGNAL(loadingIsOver()), m_activeTimeline->projectView(), SLOT(slotUpdateAllThumbs()));
@@ -2564,6 +2566,9 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc)   //cha
     connect(trackView, SIGNAL(updateTracksInfo()), this, SLOT(slotUpdateTrackInfo()));
     connect(trackView, SIGNAL(mousePosition(int)), this, SLOT(slotUpdateMousePosition(int)));
     connect(trackView->projectView(), SIGNAL(forceClipProcessing(const QString &)), m_projectList, SLOT(slotForceProcessing(const QString &)));
+
+    connect(trackView->projectView(), SIGNAL(importKeyframes(GRAPHICSRECTITEM, const QString&)), this, SLOT(slotProcessImportKeyframes(GRAPHICSRECTITEM, const QString&)));
+    
     connect(m_projectMonitor, SIGNAL(renderPosition(int)), trackView, SLOT(moveCursorPos(int)));
     connect(m_projectMonitor, SIGNAL(zoneUpdated(QPoint)), trackView, SLOT(slotSetZone(QPoint)));
     connect(m_projectMonitor, SIGNAL(zoneUpdated(QPoint)), doc, SLOT(setModified()));
@@ -2611,13 +2616,16 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc)   //cha
     connect(m_effectStack, SIGNAL(addEffect(ClipItem*, QDomElement)), trackView->projectView(), SLOT(slotAddEffect(ClipItem*, QDomElement)));
     connect(m_effectStack, SIGNAL(changeEffectState(ClipItem*, int, QList <int>, bool)), trackView->projectView(), SLOT(slotChangeEffectState(ClipItem*, int, QList <int>, bool)));
     connect(m_effectStack, SIGNAL(changeEffectPosition(ClipItem*, int, QList <int>, int)), trackView->projectView(), SLOT(slotChangeEffectPosition(ClipItem*, int, QList <int>, int)));
+    
     connect(m_effectStack, SIGNAL(refreshEffectStack(ClipItem*)), trackView->projectView(), SLOT(slotRefreshEffects(ClipItem*)));
-    connect(m_effectStack, SIGNAL(seekTimeline(int)), trackView->projectView() , SLOT(seekCursorPos(int)));
+    connect(m_effectStack, SIGNAL(seekTimeline(int)), trackView->projectView(), SLOT(seekCursorPos(int)));
+    connect(m_effectStack, SIGNAL(importClipKeyframes(GRAPHICSRECTITEM)), trackView->projectView(), SLOT(slotImportClipKeyframes(GRAPHICSRECTITEM)));
     connect(m_effectStack, SIGNAL(reloadEffects()), this, SLOT(slotReloadEffects()));
     connect(m_effectStack, SIGNAL(displayMessage(const QString&, int)), this, SLOT(slotGotProgressInfo(const QString&, int)));
     
     // Transition config signals
     connect(m_transitionConfig, SIGNAL(transitionUpdated(Transition *, QDomElement)), trackView->projectView() , SLOT(slotTransitionUpdated(Transition *, QDomElement)));
+    connect(m_transitionConfig, SIGNAL(importClipKeyframes(GRAPHICSRECTITEM)), trackView->projectView() , SLOT(slotImportClipKeyframes(GRAPHICSRECTITEM)));
     connect(m_transitionConfig, SIGNAL(seekTimeline(int)), trackView->projectView() , SLOT(seekCursorPos(int)));
 
     connect(trackView->projectView(), SIGNAL(activateDocumentMonitor()), m_projectMonitor, SLOT(slotActivateMonitor()));
@@ -4557,6 +4565,20 @@ void MainWindow::slotSaveTimelineClip()
     }
 }
 
+void MainWindow::slotProcessImportKeyframes(GRAPHICSRECTITEM type, const QString& data)
+{
+    if (type == AVWIDGET) {
+       // This data should be sent to the effect stack
+    }
+    else if (type == TRANSITIONWIDGET) {
+       // This data should be sent to the transition stack
+       m_transitionConfig->setKeyframes(data);
+    }
+    else {
+       // Error
+    }
+}
+
 
 #include "mainwindow.moc"
 
index c7c6c83b29bcfd5f46ff44a8081618228b971e90..4833d77b85657129fd46b99aeec88e3fe5591cf7 100644 (file)
@@ -566,6 +566,8 @@ private slots:
     void slotChangePalette();
     /** @brief Save current timeline clip as mlt playlist. */
     void slotSaveTimelineClip();
+    /** @brief Process keyframe data sent from a clip to effect / transition stack. */
+    void slotProcessImportKeyframes(GRAPHICSRECTITEM type, const QString& data);
 
 signals:
     Q_SCRIPTABLE void abortRenderJob(const QString &url);
index 319a15243e418b792aa46b009d5490f4fa20e382..8bc65c36cf3ba7fa5fe6afe088c5c3048cca445b 100644 (file)
@@ -3489,7 +3489,7 @@ void ProjectList::startClipFilterJob(const QString &filterName, const QString &c
            // We want to cut scenes
            extraParams << "cutscenes";
        }
-       
+       delete d;
        processClipJob(ids, QString(), false, jobParams, i18n("Auto split"), extraParams);
     }
     else {
@@ -3612,14 +3612,15 @@ void ProjectList::slotGotFilterJobResults(QString id, int , int , QString filter
        }
     }
     if (returnKey.isEmpty()) {
-       emit displayMessage(i18n("No data returned from clip analysis"), 2);
+       emit displayMessage(i18n("No data returned from clip analysis"), ErrorMessage);
        return;
     }
     QStringList returnData = results.value(returnKey).split(';', QString::SkipEmptyParts);
     if (returnData.isEmpty()) {
-       emit displayMessage(i18n("No data returned from clip analysis"), 2);
+       emit displayMessage(i18n("No data returned from clip analysis"), ErrorMessage);
        return;
     }
+    emit displayMessage(i18n("Processing data analysis"), InformationMessage);
     bool dataProcessed = false;
     if (extra.contains("cutscenes")) {
        // Check if we want to cut scenes from returned data
index 6a6fe3b72ccd824e06b46d8b70a13c5f03a982c9..2f3b9edad99ab5d0937b92c486d1b8364186b421 100644 (file)
@@ -41,6 +41,8 @@ TransitionSettings::TransitionSettings(Monitor *monitor, QWidget* parent) :
     vbox1->addWidget(m_effectEdit);
     frame->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum));
     connect(m_effectEdit, SIGNAL(seekTimeline(int)), this, SLOT(slotSeekTimeline(int)));
+    connect(m_effectEdit, SIGNAL(importClipKeyframes()), this, SIGNAL(importClipKeyframes()));
+    
     setEnabled(false);
 
     QList<QStringList> transitionsList;
@@ -241,5 +243,9 @@ void TransitionSettings::slotCheckMonitorPosition(int renderPos)
     }
 }
 
+void TransitionSettings::setKeyframes(const QString data)
+{
+    m_effectEdit->setKeyframes(data);
+}
 
 #include "transitionsettings.moc"
index 0fc869fa29d80c8d88842c887a6f37c9c879a768..46e6eef077a2ca8a4510498ade8c0bdbced2e61c 100644 (file)
@@ -37,6 +37,7 @@ public:
     void raiseWindow(QWidget*);
     void updateProjectFormat(MltVideoProfile profile, Timecode t, const QList <TrackInfo> info);
     void updateTimecodeFormat();
+    void setKeyframes(const QString data);
 
 private:
     EffectStackEdit *m_effectEdit;
@@ -63,6 +64,7 @@ private slots:
 signals:
     void transitionUpdated(Transition *, QDomElement);
     void seekTimeline(int);
+    void importClipKeyframes(GRAPHICSRECTITEM = TRANSITIONWIDGET);
 };
 
 #endif
diff --git a/src/widgets/importkeyframesdialog_ui.ui b/src/widgets/importkeyframesdialog_ui.ui
new file mode 100644 (file)
index 0000000..dd057f8
--- /dev/null
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ImportKeyframesDialog_UI</class>
+ <widget class="QDialog" name="ImportKeyframesDialog_UI">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>255</width>
+    <height>115</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Scene Cut</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout">
+   <item row="0" column="0">
+    <widget class="QLabel" name="label">
+     <property name="text">
+      <string>Data to import</string>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="1">
+    <widget class="QComboBox" name="data_list">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="0" colspan="2">
+    <widget class="QCheckBox" name="import_position">
+     <property name="text">
+      <string>Position</string>
+     </property>
+     <property name="checked">
+      <bool>true</bool>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="0" colspan="2">
+    <widget class="QCheckBox" name="import_size">
+     <property name="text">
+      <string>Size</string>
+     </property>
+    </widget>
+   </item>
+   <item row="3" column="0" colspan="2">
+    <spacer name="verticalSpacer">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>218</width>
+       <height>2</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item row="4" column="1">
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>ImportKeyframesDialog_UI</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>ImportKeyframesDialog_UI</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>