m_view.clip_thumb->setHidden(true);
m_view.clip_color->setColor(QColor('#' + props.value("colour").right(8).left(6)));
} else if (t == SLIDESHOW) {
- m_view.clip_path->setText(url.directory());
+ bool isMime = true;
+ if (url.fileName().startsWith(".all.")) {
+ // the image sequence is defined by mimetype
+ m_view.clip_path->setText(url.directory());
+ } else {
+ // the image sequence is defined by pattern
+ m_view.slide_type_label->setHidden(true);
+ m_view.image_type->setHidden(true);
+ m_view.clip_path->setText(url.path());
+ isMime = false;
+ }
+
m_view.tabWidget->removeTab(METATAB);
m_view.tabWidget->removeTab(IMAGETAB);
m_view.tabWidget->removeTab(COLORTAB);
return m_clipNeedsReLoad;
}
+
void ClipProperties::parseFolder()
{
+ QString path = m_view.clip_path->text();
+ bool isMime = !(path.contains("%d"));
+ if (!isMime) path = KUrl(path).directory();
+ QDir dir(path);
- QDir dir(m_view.clip_path->text());
QStringList filters;
- filters << "*." + m_view.image_type->itemData(m_view.image_type->currentIndex()).toString();
- QString extension = "/.all." + m_view.image_type->itemData(m_view.image_type->currentIndex()).toString();
+ QString extension;
+
+ if (isMime) {
+ // TODO: improve jpeg image detection with extension like jpeg, requires change in MLT image producers
+ filters << "*." + m_view.image_type->itemData(m_view.image_type->currentIndex()).toString();
+ extension = "/.all." + m_view.image_type->itemData(m_view.image_type->currentIndex()).toString();
+ dir.setNameFilters(filters);
+ }
- dir.setNameFilters(filters);
QStringList result = dir.entryList(QDir::Files);
+
+ if (!isMime) {
+ // find pattern
+ QString filter = KUrl(m_view.clip_path->text()).fileName();
+ QString ext = filter.section('.', -1);
+ filter = filter.section("%d", 0, -2);
+ QString regexp = "^" + filter + "\\d+\." + ext + "$";
+ QRegExp rx(regexp);
+ QStringList entries;
+ foreach(const QString &path, result) {
+ if (rx.exactMatch(path)) entries << path;
+ }
+ result = entries;
+ }
+
m_count = result.count();
if (m_count == 0) {
// no images, do not accept that
xml.setAttribute("resource", m_view.clip_path->text() + extension);
int width = 180.0 * KdenliveSettings::project_display_ratio();
if (width % 2 == 1) width++;
- QPixmap pix = m_clip->thumbProducer()->getImage(KUrl(m_view.clip_path->text() + extension), 1, width, 180);
+ QString filePath = m_view.clip_path->text();
+ if (isMime) filePath.append(extension);
+ QPixmap pix = m_clip->thumbProducer()->getImage(KUrl(filePath), 1, width, 180);
QMap <QString, QString> props = m_clip->properties();
m_view.clip_duration->setText(m_tc.getTimecodeFromFrames(props.value("ttl").toInt() * m_count));
m_view.clip_thumb->setPixmap(pix);
<label>default width for rendering rescale.</label>
<default>240</default>
</entry>
+
+ <entry name="slideshowbymime" type="Bool">
+ <label>True if slideshow default method is mimetype.</label>
+ <default>true</default>
+ </entry>
</group>
</kcfg>
connect(m_view.folder_url, SIGNAL(textChanged(const QString &)), this, SLOT(parseFolder()));
connect(m_view.image_type, SIGNAL(currentIndexChanged(int)), this, SLOT(parseFolder()));
+ connect(m_view.pattern_url, SIGNAL(textChanged(const QString &)), this, SLOT(parseFolder()));
connect(m_view.show_thumbs, SIGNAL(stateChanged(int)), this, SLOT(slotEnableThumbs(int)));
connect(m_view.slide_fade, SIGNAL(stateChanged(int)), this, SLOT(slotEnableLuma(int)));
connect(m_view.clip_duration_format, SIGNAL(activated(int)), this, SLOT(slotUpdateDurationFormat(int)));
m_view.clip_duration_frames->setHidden(true);
m_view.luma_duration_frames->setHidden(true);
+ m_view.method_mime->setChecked(KdenliveSettings::slideshowbymime());
+ connect(m_view.method_mime, SIGNAL(toggled(bool)), this, SLOT(slotMethodChanged(bool)));
+ slotMethodChanged(m_view.method_mime->isChecked());
// Check for Kdenlive installed luma files
QStringList filters;
void SlideshowClip::parseFolder()
{
m_view.icon_list->clear();
- QDir dir(m_view.folder_url->url().path());
+ bool isMime = m_view.method_mime->isChecked();
+ QString path = isMime ? m_view.folder_url->url().path() : m_view.pattern_url->url().directory();
+ QDir dir(path);
+ if (path.isEmpty() || !dir.exists()) return;
+
QStringList filters;
- QString filter = m_view.image_type->itemData(m_view.image_type->currentIndex()).toString();
- filters << "*." + filter;
- // TODO: improve jpeg image detection with extension like jpeg, requires change in MLT image producers
- // << "*.jpeg";
+ QString filter;
+ if (isMime) {
+ // TODO: improve jpeg image detection with extension like jpeg, requires change in MLT image producers
+ filter = m_view.image_type->itemData(m_view.image_type->currentIndex()).toString();
+ filters << "*." + filter;
+ dir.setNameFilters(filters);
+ }
+
+ QStringList result = dir.entryList(QDir::Files);
+
+ if (!isMime) {
+ // find pattern
+ filter = m_view.pattern_url->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);
+ }
+ QString regexp = "^" + filter + "\\d+\." + ext + "$";
+ QRegExp rx(regexp);
+ QStringList entries;
+ foreach(const QString &path, result) {
+ if (rx.exactMatch(path)) entries << path;
+ }
+ result = entries;
+ }
- dir.setNameFilters(filters);
- const QStringList result = dir.entryList(QDir::Files);
m_count = result.count();
if (m_count == 0) m_view.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
else m_view.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true);
QString SlideshowClip::selectedPath() const
{
- QString extension = "/.all." + m_view.image_type->itemData(m_view.image_type->currentIndex()).toString();
- return m_view.folder_url->url().path() + extension;
+ QString extension;
+ QString folder;
+
+ bool isMime = m_view.method_mime->isChecked();
+
+ if (isMime) {
+ folder = m_view.folder_url->url().path(KUrl::AddTrailingSlash);
+ extension = ".all." + m_view.image_type->itemData(m_view.image_type->currentIndex()).toString();
+ } else {
+ folder = m_view.pattern_url->url().directory(KUrl::AppendTrailingSlash);
+ QString filter = m_view.pattern_url->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);
+ }
+ extension = filter + "%d." + ext;
+ }
+ return folder + extension;
}
m_view.luma_duration->setHidden(framesFormat);
}
+void SlideshowClip::slotMethodChanged(bool active)
+{
+ if (active) {
+ // User wants mimetype image sequence
+ m_view.stackedWidget->setCurrentIndex(0);
+ KdenliveSettings::setSlideshowbymime(true);
+ } else {
+ // User wants pattern image sequence
+ m_view.stackedWidget->setCurrentIndex(1);
+ KdenliveSettings::setSlideshowbymime(false);
+ }
+ parseFolder();
+}
+
+
+
#include "slideshowclip.moc"
void slotUpdateDurationFormat(int ix);
void slotGenerateThumbs();
void slotSetPixmap(const KFileItem &fileItem, const QPixmap &pix);
+ /** @brief Display correct widget depenging on user choice (mimetype or pattern method. */
+ void slotMethodChanged(bool active);
private:
Ui::SlideshowClip_UI m_view;
<item row="6" column="0" colspan="4">
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
- <number>0</number>
+ <number>3</number>
</property>
<widget class="QWidget" name="tab_video">
<attribute name="title">
</attribute>
<layout class="QGridLayout" name="gridLayout_6">
<item row="0" column="0">
- <widget class="QLabel" name="label_14">
+ <widget class="QLabel" name="slide_type_label">
<property name="text">
<string>Image type</string>
</property>
<rect>
<x>0</x>
<y>0</y>
- <width>452</width>
- <height>616</height>
+ <width>259</width>
+ <height>412</height>
</rect>
</property>
<property name="windowTitle">
<string>Slideshow Clip</string>
</property>
- <layout class="QGridLayout" name="gridLayout">
+ <layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
</property>
</widget>
</item>
- <item row="0" column="1" colspan="2">
+ <item row="0" column="1" colspan="3">
<widget class="KLineEdit" name="clip_name"/>
</item>
- <item row="1" column="0">
- <widget class="QLabel" name="label">
- <property name="text">
- <string>Folder</string>
+ <item row="1" column="0" colspan="4">
+ <widget class="QGroupBox" name="groupBox">
+ <property name="title">
+ <string>Image selection method</string>
</property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0">
+ <widget class="QRadioButton" name="method_mime">
+ <property name="text">
+ <string>Mimetype</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QRadioButton" name="method_pattern">
+ <property name="text">
+ <string>Filename pattern</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2">
+ <widget class="QStackedWidget" name="stackedWidget">
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="page">
+ <layout class="QGridLayout" name="gridLayout_2">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Folder</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="KUrlRequester" name="folder_url"/>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_4">
+ <property name="text">
+ <string>Image Type</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="KComboBox" name="image_type"/>
+ </item>
+ <item row="2" column="1">
+ <spacer name="verticalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="page_2">
+ <layout class="QGridLayout" name="gridLayout_3">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_5">
+ <property name="text">
+ <string>Image name</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="KUrlRequester" name="pattern_url"/>
+ </item>
+ <item row="1" column="1">
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
</widget>
</item>
- <item row="1" column="1" colspan="2">
- <widget class="KUrlRequester" name="folder_url"/>
- </item>
- <item row="2" column="0">
+ <item row="2" column="0" colspan="2">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Frame Duration</string>
</property>
</widget>
</item>
- <item row="2" column="1">
+ <item row="2" column="2">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="KRestrictedLine" name="clip_duration">
</item>
</layout>
</item>
- <item row="2" column="2">
+ <item row="2" column="3">
<widget class="KComboBox" name="clip_duration_format"/>
</item>
<item row="3" column="0">
- <widget class="QLabel" name="label_4">
- <property name="text">
- <string>Image Type</string>
- </property>
- </widget>
- </item>
- <item row="3" column="1" colspan="2">
- <widget class="KComboBox" name="image_type"/>
- </item>
- <item row="4" column="0">
<widget class="QCheckBox" name="slide_loop">
<property name="text">
<string>Loop</string>
</property>
</widget>
</item>
- <item row="5" column="0">
+ <item row="4" column="0">
<widget class="QCheckBox" name="slide_fade">
<property name="text">
<string>Dissolve</string>
</property>
</widget>
</item>
- <item row="5" column="1" colspan="2">
+ <item row="4" column="2" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="KRestrictedLine" name="luma_duration">
</item>
</layout>
</item>
- <item row="6" column="0">
+ <item row="5" column="0">
<widget class="QCheckBox" name="luma_fade">
<property name="enabled">
<bool>false</bool>
</property>
</widget>
</item>
- <item row="6" column="1" colspan="2">
+ <item row="5" column="2" colspan="2">
<widget class="KComboBox" name="luma_file">
<property name="enabled">
<bool>false</bool>
</property>
</widget>
</item>
- <item row="7" column="0">
+ <item row="6" column="0">
<widget class="QLabel" name="label_softness">
<property name="enabled">
<bool>false</bool>
</property>
</widget>
</item>
- <item row="7" column="1" colspan="2">
+ <item row="6" column="2" colspan="2">
<widget class="QSlider" name="luma_softness">
<property name="enabled">
<bool>false</bool>
</property>
</widget>
</item>
- <item row="8" column="0" colspan="3">
+ <item row="7" column="0" colspan="4">
<widget class="KListWidget" name="icon_list"/>
</item>
- <item row="9" column="0" colspan="3">
+ <item row="8" column="0" colspan="4">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QCheckBox" name="show_thumbs">
</item>
</layout>
</item>
- <item row="10" column="1" colspan="2">
+ <item row="9" column="2" colspan="2">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>