]> git.sesse.net Git - kdenlive/commitdiff
Allow to add image sequence through the usual "add clip" dialog
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Sun, 15 Aug 2010 18:37:41 +0000 (18:37 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Sun, 15 Aug 2010 18:37:41 +0000 (18:37 +0000)
svn path=/trunk/kdenlive/; revision=4723

src/clipmanager.cpp
src/kdenlivesettings.kcfg
src/projectlist.cpp
src/slideshowclip.cpp
src/slideshowclip.h
src/widgets/configmisc_ui.ui

index 9e7d0fdf2b22d5a0fc511844c17004848b7d4c6f..2e9367b9eb84c2842bbac02a76daab5c0baad67e 100644 (file)
@@ -316,7 +316,7 @@ void ClipManager::slotAddClipList(const KUrl::List urls, const QString group, co
                     if (out > 0)
                         prod.setAttribute("out", out);
                     else
-                        prod.setAttribute("out", m_doc->getFramePos(KdenliveSettings::image_duration()) - 1);
+                        prod.setAttribute("out", m_doc->getFramePos(KdenliveSettings::title_duration()) - 1);
                 } else
                     txtfile.close();
             }
index 0b0713fc1494761915f7cf0cf464310fb2ac8102..c81bd7a34f389ef8bf7ed6198c2c670d48b03763 100644 (file)
       <label>Default image clip duration.</label>
       <default>00:00:05:00</default>
     </entry>
-    
+
+    <entry name="sequence_duration" type="String">
+      <label>Default image sequence frame duration.</label>
+      <default>00:00:00:01</default>
+    </entry>
+
+    <entry name="autoimagesequence" type="Bool">
+      <label>Automatically import image sequences.</label>
+      <default>true</default>
+    </entry>
+
     <entry name="title_duration" type="String">
       <label>Default title clip duration.</label>
       <default>00:00:05:00</default>
index dc5d239892099218a45185f11b9c282eca46a695..b3ede704f21c2561b601e4e5b5afb33bae799841 100644 (file)
@@ -1077,8 +1077,41 @@ void ProjectList::slotAddClip(const QList <QUrl> givenList, const QString &group
     if (givenList.isEmpty()) {
         QString allExtensions = getExtensions();
         const QString dialogFilter = allExtensions + ' ' + QLatin1Char('|') + i18n("All Supported Files") + "\n* " + QLatin1Char('|') + i18n("All Files");
-        list = KFileDialog::getOpenUrls(KUrl("kfiledialog:///clipfolder"), dialogFilter, this);
-
+        QCheckBox *b = new QCheckBox(i18n("Import image sequence"));
+        b->setChecked(KdenliveSettings::autoimagesequence());
+        KFileDialog *d = new KFileDialog(KUrl("kfiledialog:///clipfolder"), dialogFilter, this, b);
+        d->setOperationMode(KFileDialog::Opening);
+        d->setMode(KFile::Files);
+        d->exec();
+        list = d->selectedUrls();
+        if (b->isChecked() && list.count() == 1) {
+            // Check for image sequence
+            KUrl url = list.at(0);
+            QString fileName = url.fileName().section('.', 0, -2);
+            if (fileName.at(fileName.size() - 1).isDigit()) {
+                KFileItem item(KFileItem::Unknown, KFileItem::Unknown, url);
+                if (item.mimetype().startsWith("image")) {
+                    int count = SlideshowClip::sequenceCount(url);
+                    // import as sequence if we found at least 5 images in the sequence
+                    if (count > 4) {
+                        delete d;
+                        QStringList groupInfo = getGroup();
+
+                        // get image sequence base name
+                        while (fileName.at(fileName.size() - 1).isDigit()) {
+                            fileName.chop(1);
+                        }
+                        QString folder = url.directory(KUrl::AppendTrailingSlash);
+                        QString ext = url.path().section('.', -1);
+                        folder.append(fileName + "%d." + ext);
+
+                        m_doc->slotCreateSlideshowClipFile(fileName, folder, count, m_timecode.reformatSeparators(KdenliveSettings::sequence_duration()), false, false, m_timecode.getTimecodeFromFrames(int(ceil(m_timecode.fps()))), QString(), 0, groupInfo.at(0), groupInfo.at(1));
+                        return;
+                    }
+                }
+            }
+        }
+        delete d;
     } else {
         for (int i = 0; i < givenList.count(); i++)
             list << givenList.at(i);
index 614fbe2c02ceb704773ba14fc162f6a53d2d979a..46923c529fcff00f98b103cc0a7b48bd48a67ece 100644 (file)
@@ -61,7 +61,7 @@ SlideshowClip::SlideshowClip(Timecode tc, QWidget * parent) :
 
     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 +149,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();
@@ -257,7 +284,7 @@ QString SlideshowClip::selectedPath() const
         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;
     }
index 2bd70acb8f830f437e61a9da8c230e89f79af2e9..9120de9a3ecfc8a7c4d83ac0bbb70334b449994e 100644 (file)
@@ -47,6 +47,9 @@ public:
     QString lumaFile() const;
     int softness() const;
 
+    /** @brief Check if there are several files with filename pattern, like: image_001.jpg, image_002.jpg,... */
+    static int sequenceCount(KUrl file);
+
 private slots:
     void parseFolder();
     void slotEnableLuma(int state);
index 0d15588476567e4a6a360016e1770ffbff67d7c4..d1dc0f9b6acea3436a62bf987554ada322ba117b 100644 (file)
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>348</width>
-    <height>242</height>
+    <width>329</width>
+    <height>245</height>
    </rect>
   </property>
   <layout class="QGridLayout" name="gridLayout_4">
@@ -37,7 +37,7 @@
      <property name="title">
       <string>Default Durations</string>
      </property>
-     <layout class="QGridLayout" name="gridLayout_3">
+     <layout class="QGridLayout" name="gridLayout">
       <item row="0" column="0">
        <widget class="QLabel" name="label">
         <property name="text">
         </property>
        </widget>
       </item>
+      <item row="1" column="2">
+       <widget class="QLabel" name="label_3">
+        <property name="text">
+         <string>Image sequence</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="3">
+       <widget class="KRestrictedLine" name="kcfg_sequence_duration">
+        <property name="inputMask">
+         <string>99:99:99:99; </string>
+        </property>
+        <property name="text">
+         <string>:::</string>
+        </property>
+       </widget>
+      </item>
      </layout>
     </widget>
    </item>
-   <item row="6" column="0" colspan="3">
+   <item row="7" column="0" colspan="3">
     <spacer>
      <property name="orientation">
       <enum>Qt::Vertical</enum>
      </property>
     </widget>
    </item>
+   <item row="6" column="0">
+    <widget class="QCheckBox" name="kcfg_autoimagesequence">
+     <property name="text">
+      <string>Automatically import image sequences</string>
+     </property>
+    </widget>
+   </item>
   </layout>
  </widget>
  <customwidgets>