]> git.sesse.net Git - kdenlive/blobdiff - src/slideshowclip.cpp
Add animation feature to Slideshow Clip.
[kdenlive] / src / slideshowclip.cpp
index 5f44bcaffff4c3fa4fc288d68dab38a5301a5401..3938b029fe8147ed0fc13ffb1f7aa6144b96356a 100644 (file)
@@ -58,10 +58,17 @@ SlideshowClip::SlideshowClip(Timecode tc, QWidget * parent) :
     m_view.image_type->addItem("TGA (*.tga)", "tga");
     m_view.image_type->addItem("TIFF (*.tiff)", "tiff");
     m_view.image_type->addItem("Open EXR (*.exr)", "exr");
+    m_view.animation->addItem(i18n("None"), QString());
+    m_view.animation->addItem(i18n("Pan"), "Pan");
+    m_view.animation->addItem(i18n("Pan, low-pass"), "Pan, low-pass");
+    m_view.animation->addItem(i18n("Pan and zoom"), "Pan and zoom");
+    m_view.animation->addItem(i18n("Pan and zoom, low-pass"), "Pan and zoom, low-pass");
+    m_view.animation->addItem(i18n("Zoom"), "Zoom");
+    m_view.animation->addItem(i18n("Zoom, low-pass"), "Zoom, low-pass");
 
     m_view.clip_duration->setInputMask("");
     m_view.clip_duration->setValidator(m_timecode.validator());
-    m_view.clip_duration->setText(m_timecode.reformatSeparators(KdenliveSettings::image_duration()));
+    m_view.clip_duration->setText(m_timecode.reformatSeparators(KdenliveSettings::sequence_duration()));
     m_view.luma_duration->setInputMask("");
     m_view.luma_duration->setValidator(m_timecode.validator());
     m_view.luma_duration->setText(m_timecode.getTimecodeFromFrames(int(ceil(m_timecode.fps()))));
@@ -149,6 +156,33 @@ void SlideshowClip::slotEnableLumaFile(int state)
     m_view.label_softness->setEnabled(enable);
 }
 
+// static
+int SlideshowClip::sequenceCount(KUrl file)
+{
+    // find pattern
+    QString filter = file.fileName();
+    QString ext = filter.section('.', -1);
+    filter = filter.section('.', 0, -2);
+    bool hasDigit = false;
+    while (filter.at(filter.size() - 1).isDigit()) {
+        hasDigit = true;
+        filter.remove(filter.size() - 1, 1);
+    }
+    if (!hasDigit) return 0;
+
+    QString regexp = "^" + filter + "\\d+\\." + ext + "$";
+    QRegExp rx(regexp);
+
+    QDir dir(file.directory());
+    QStringList result = dir.entryList(QDir::Files);
+
+    int count = 0;
+    foreach(const QString &path, result) {
+        if (rx.exactMatch(path)) count ++;
+    }
+    return count;
+}
+
 void SlideshowClip::parseFolder()
 {
     m_view.icon_list->clear();
@@ -177,7 +211,7 @@ void SlideshowClip::parseFolder()
         while (filter.at(filter.size() - 1).isDigit()) {
             filter.remove(filter.size() - 1, 1);
         }
-        QString regexp = "^" + filter + "\\d+\." + ext + "$";
+        QString regexp = "^" + filter + "\\d+\\." + ext + "$";
         QRegExp rx(regexp);
         QStringList entries;
         foreach(const QString &path, result) {
@@ -240,26 +274,58 @@ void SlideshowClip::slotSetPixmap(const KFileItem &fileItem, const QPixmap &pix)
 }
 
 
-QString SlideshowClip::selectedPath() const
+QString SlideshowClip::selectedPath()
 {
-    QString extension;
-    QString folder;
+    return selectedPath(m_view.folder_url->url(), m_view.method_mime->isChecked(), ".all." + m_view.image_type->itemData(m_view.image_type->currentIndex()).toString(), &m_count);
 
-    bool isMime = m_view.method_mime->isChecked();
+
+}
+// static
+QString SlideshowClip::selectedPath(KUrl url, bool isMime, QString extension, int *count)
+{
+    QString folder;
 
     if (isMime) {
-        folder = m_view.folder_url->url().path(KUrl::AddTrailingSlash);
-        extension = ".all." + m_view.image_type->itemData(m_view.image_type->currentIndex()).toString();
+        folder = url.path(KUrl::AddTrailingSlash);
     } else {
-        folder = m_view.pattern_url->url().directory(KUrl::AppendTrailingSlash);
-        QString filter = m_view.pattern_url->url().fileName();
-        QString ext = filter.section('.', -1);
+        folder = url.directory(KUrl::AppendTrailingSlash);
+        QString filter = url.fileName();
+        QString ext = '.' + filter.section('.', -1);
         filter = filter.section('.', 0, -2);
 
         while (filter.at(filter.size() - 1).isDigit()) {
-            filter.remove(filter.size() - 1, 1);
+            filter.chop(1);
         }
-        extension = filter + "%d." + ext;
+        // Check that the first image exists and which format it has (image1.jpg or image001.jpg, ...)
+
+        // Find first image in sequence
+        QString regexp = "^" + filter + "\\d+" + ext + "$";
+        QRegExp rx(regexp);
+        QStringList entries;
+
+        QDir dir(folder);
+        QStringList result = dir.entryList(QDir::Files);
+        int precision = 1;
+        QString pathValue;
+        QMap <int, QString> sortedList;
+        foreach(const QString &path, result) {
+            if (rx.exactMatch(path)) {
+                pathValue = path.section('.', 0, -2);
+                pathValue.remove(0, filter.size());
+                sortedList.insert(pathValue.toInt(), path);
+            }
+        }
+        *count = sortedList.size();
+        if (*count == 0) kDebug() << "No IMAGE FOUND!!!!!!!";
+        else  {
+            QMapIterator<int, QString> i(sortedList);
+            i.next();
+            QString result = i.value();
+            result.remove(0, filter.size());
+            result = result.section('.', 0, -2);
+            precision = result.size();
+        }
+        extension = filter + "%." + QString::number(precision) + "d" + ext;
     }
     return  folder + extension;
 }
@@ -294,6 +360,11 @@ bool SlideshowClip::loop() const
     return m_view.slide_loop->isChecked();
 }
 
+bool SlideshowClip::crop() const
+{
+    return m_view.slide_crop->isChecked();
+}
+
 bool SlideshowClip::fade() const
 {
     return m_view.slide_fade->isChecked();
@@ -314,6 +385,12 @@ QString SlideshowClip::lumaFile() const
     return m_view.luma_file->itemData(m_view.luma_file->currentIndex()).toString();
 }
 
+QString SlideshowClip::animation() const
+{
+    if (m_view.animation->itemData(m_view.animation->currentIndex()).isNull()) return QString();
+    return m_view.animation->itemData(m_view.animation->currentIndex()).toString();
+}
+
 void SlideshowClip::slotUpdateDurationFormat(int ix)
 {
     bool framesFormat = ix == 1;
@@ -350,7 +427,24 @@ void SlideshowClip::slotMethodChanged(bool active)
     parseFolder();
 }
 
-
+// static
+QString SlideshowClip::animationToGeometry(const QString &animation, int &ttl)
+{
+    QString geometry;
+    if (animation.startsWith("Pan and zoom")) {
+        geometry = QString().sprintf("0=0,0:100%%x100%%;%d=-14%%,-14%%:120%%x120%%;%d=-5%%,-5%%:110%%x110%%;%d=0,0:110%%x110%%;%d=0,-5%%:110%%x110%%;%d=-5%%,0:110%%x110%%",
+                                     ttl-1, ttl, ttl*2 - 1, ttl*2, ttl*3 - 1 );
+        ttl *= 3;
+    } else if (animation.startsWith("Pan")) {
+        geometry = QString().sprintf("0=-5%%,-5%%:110%%x110%%;%d=0,0:110%%x110%%;%d=0,0:110%%x110%%;%d=0,-5%%:110%%x110%%;%d=0,-5%%:110%%x110%%;%d=-5%%,-5%%:110%%x110%%;%d=0,-5%%:110%%x110%%;%d=-5%%,0:110%%x110%%",
+                                     ttl-1, ttl, ttl*2 - 1, ttl*2, ttl*3 - 1, ttl*3, ttl*4 - 1 );
+        ttl *= 4;
+    } else if (animation.startsWith("Zoom")) {
+        geometry = QString().sprintf("0=0,0:100%%x100%%;%d=-14%%,-14%%:120%%x120%%",
+                                     ttl-1, ttl );
+    }
+    return geometry;
+}
 
 #include "slideshowclip.moc"