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();
}
<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>
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);
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()))));
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();
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;
}
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);
<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">
<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>