X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fclipproperties.cpp;h=4c8332235e7f97bb3ed0dfd967aaac9b2c86b3d2;hb=e3b4bf11679a3a195be8896f465b1616581f1fb3;hp=81094821627137bb57fa977e05ba7be2f7b4facc;hpb=5143c0fd6b774ee8a036427bb1630126270a6364;p=kdenlive diff --git a/src/clipproperties.cpp b/src/clipproperties.cpp index 81094821..4c833223 100644 --- a/src/clipproperties.cpp +++ b/src/clipproperties.cpp @@ -156,7 +156,18 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg 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); @@ -172,10 +183,22 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg 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.slide_loop->setChecked(props.value("loop").toInt()); + m_view.slide_crop->setChecked(props.value("crop").toInt()); m_view.slide_fade->setChecked(props.value("fade").toInt()); m_view.luma_softness->setValue(props.value("softness").toInt()); + if (!props.value("animation").isEmpty()) + m_view.animation->setCurrentItem(props.value("animation")); + else + m_view.animation->setCurrentIndex(0); QString path = props.value("resource"); QString ext = path.section('.', -1); for (int i = 0; i < m_view.image_type->count(); i++) { @@ -564,18 +587,23 @@ QMap ClipProperties::properties() } else if (t == SLIDESHOW) { QString value = QString::number((int) m_view.slide_loop->isChecked()); if (m_old_props.value("loop") != value) props["loop"] = value; + value = QString::number((int) m_view.slide_crop->isChecked()); + if (m_old_props.value("crop") != value) props["crop"] = value; value = QString::number((int) m_view.slide_fade->isChecked()); if (m_old_props.value("fade") != value) props["fade"] = value; value = QString::number((int) m_view.luma_softness->value()); if (m_old_props.value("softness") != value) props["softness"] = value; - - QString extension = "/.all." + m_view.image_type->itemData(m_view.image_type->currentIndex()).toString(); - QString new_path = m_view.clip_path->text() + extension; - if (new_path != m_old_props.value("resource")) { - m_clipNeedsReLoad = true; - props["resource"] = new_path; - kDebug() << "//// SLIDE EDIT, NEW:" << new_path << ", OLD; " << m_old_props.value("resource"); - } + + bool isMime = !(m_view.clip_path->text().contains('%')); + if (isMime) { + QString extension = "/.all." + m_view.image_type->itemData(m_view.image_type->currentIndex()).toString(); + QString new_path = m_view.clip_path->text() + extension; + if (new_path != m_old_props.value("resource")) { + m_clipNeedsReLoad = true; + props["resource"] = new_path; + kDebug() << "//// SLIDE EDIT, NEW:" << new_path << ", OLD; " << m_old_props.value("resource"); + } + } int duration; if (m_view.slide_duration_format->currentIndex() == 1) { // we are in frames mode @@ -614,6 +642,15 @@ QMap ClipProperties::properties() } } + QString animation = m_view.animation->itemData(m_view.animation->currentIndex()).toString(); + if (animation != m_old_props.value("animation")) { + if (animation.isEmpty()) { + props["animation"].clear(); + } else { + props["animation"] = animation; + } + m_clipNeedsRefresh = true; + } } return props; } @@ -628,16 +665,40 @@ bool ClipProperties::needsTimelineReload() const return m_clipNeedsReLoad; } + void ClipProperties::parseFolder() { + QString path = m_view.clip_path->text(); + bool isMime = !(path.contains('%')); + 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('%', 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 @@ -651,7 +712,9 @@ void ClipProperties::parseFolder() 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 props = m_clip->properties(); m_view.clip_duration->setText(m_tc.getTimecodeFromFrames(props.value("ttl").toInt() * m_count)); m_view.clip_thumb->setPixmap(pix);