X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fclipproperties.cpp;h=6b8f6d3eda5d559c6d05ca60d53bbb30173e90ad;hb=06256534f3436078703ec354abfe8a76021b7824;hp=a79524337d9d9178b6d4a3bb97645c25c4cd2a09;hpb=c24047e6998a99571bcbef77c71525ab1474fcad;p=kdenlive diff --git a/src/clipproperties.cpp b/src/clipproperties.cpp index a7952433..6b8f6d3e 100644 --- a/src/clipproperties.cpp +++ b/src/clipproperties.cpp @@ -38,18 +38,14 @@ static const int MARKERTAB = 5; static const int METATAB = 6; static const int ADVANCEDTAB = 7; -static const int TYPE_JPEG = 0; -static const int TYPE_PNG = 1; -static const int TYPE_BMP = 2; -static const int TYPE_GIF = 3; - ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidget * parent) : QDialog(parent), m_clip(clip), m_tc(tc), m_fps(fps), m_count(0), - m_clipNeedsRefresh(false) + m_clipNeedsRefresh(false), + m_clipNeedsReLoad(false) { setFont(KGlobalSettings::toolBarFont()); m_view.setupUi(this); @@ -130,6 +126,9 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg m_view.image_size->setText(props.value("frame_size")); if (props.contains("transparency")) m_view.image_transparency->setChecked(props.value("transparency").toInt()); + int width = 180.0 * KdenliveSettings::project_display_ratio(); + if (width % 2 == 1) width++; + m_view.clip_thumb->setPixmap(QPixmap(url.path()).scaled(QSize(width, 180), Qt::KeepAspectRatio)); } else if (t == COLOR) { m_view.clip_path->setEnabled(false); m_view.tabWidget->removeTab(METATAB); @@ -146,17 +145,36 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg m_view.tabWidget->removeTab(COLORTAB); m_view.tabWidget->removeTab(AUDIOTAB); m_view.tabWidget->removeTab(VIDEOTAB); - QStringList types; - types << "JPG" << "PNG" << "BMP" << "GIF"; - m_view.image_type->addItems(types); + + //WARNING: Keep in sync with slideshowclip.cpp + m_view.image_type->addItem("JPG (*.jpg)", "jpg"); + m_view.image_type->addItem("JPEG (*.jpeg)", "jpeg"); + m_view.image_type->addItem("PNG (*.png)", "png"); + m_view.image_type->addItem("BMP (*.bmp)", "bmp"); + m_view.image_type->addItem("GIF (*.gif)", "gif"); + 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.slide_loop->setChecked(props.value("loop").toInt()); m_view.slide_fade->setChecked(props.value("fade").toInt()); m_view.luma_softness->setValue(props.value("softness").toInt()); QString path = props.value("resource"); - if (path.endsWith("png")) m_view.image_type->setCurrentIndex(TYPE_PNG); - else if (path.endsWith("bmp")) m_view.image_type->setCurrentIndex(TYPE_BMP); - else if (path.endsWith("gif")) m_view.image_type->setCurrentIndex(TYPE_GIF); + QString ext = path.section('.', -1); + for (int i = 0; i < m_view.image_type->count(); i++) { + if (m_view.image_type->itemData(i).toString() == ext) { + m_view.image_type->setCurrentIndex(i); + break; + } + } m_view.slide_duration->setText(tc.getTimecodeFromFrames(props.value("ttl").toInt())); + + m_view.slide_duration_format->addItem(i18n("hh:mm:ss::ff")); + m_view.slide_duration_format->addItem(i18n("Frames")); + connect(m_view.slide_duration_format, SIGNAL(activated(int)), this, SLOT(slotUpdateDurationFormat(int))); + m_view.slide_duration_frames->setHidden(true); + m_view.luma_duration_frames->setHidden(true); + parseFolder(); m_view.luma_duration->setText(tc.getTimecodeFromFrames(props.value("luma_duration").toInt())); @@ -170,7 +188,8 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg foreach(const QString &folder, customLumas) { QStringList filesnames = QDir(folder).entryList(filters, QDir::Files); foreach(const QString &fname, filesnames) { - m_view.luma_file->addItem(KIcon(folder + '/' + fname), fname, folder + '/' + fname); + QString filePath = KUrl(folder).path(KUrl::AddTrailingSlash) + fname; + m_view.luma_file->addItem(KIcon(filePath), fname, filePath); } } @@ -181,16 +200,16 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg QDir lumafolder(folder); QStringList filesnames = lumafolder.entryList(filters, QDir::Files); foreach(const QString &fname, filesnames) { - m_view.luma_file->addItem(KIcon(folder + '/' + fname), fname, folder + '/' + fname); + QString filePath = KUrl(folder).path(KUrl::AddTrailingSlash) + fname; + m_view.luma_file->addItem(KIcon(filePath), fname, filePath); } - slotEnableLuma(m_view.slide_fade->checkState()); - slotEnableLumaFile(m_view.slide_luma->checkState()); - if (!lumaFile.isEmpty()) { m_view.slide_luma->setChecked(true); m_view.luma_file->setCurrentIndex(m_view.luma_file->findData(lumaFile)); } else m_view.luma_file->setEnabled(false); + slotEnableLuma(m_view.slide_fade->checkState()); + slotEnableLumaFile(m_view.slide_luma->checkState()); connect(m_view.slide_fade, SIGNAL(stateChanged(int)), this, SLOT(slotEnableLuma(int))); connect(m_view.slide_luma, SIGNAL(stateChanged(int)), this, SLOT(slotEnableLumaFile(int))); @@ -207,8 +226,9 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg m_view.clip_fps->setText(props.value("fps")); if (props.contains("aspect_ratio")) m_view.clip_ratio->setText(props.value("aspect_ratio")); - - QPixmap pix = m_clip->thumbProducer()->getImage(url, m_clip->getClipThumbFrame(), 240, 180); + int width = 180.0 * KdenliveSettings::project_display_ratio(); + if (width % 2 == 1) width++; + QPixmap pix = m_clip->thumbProducer()->getImage(url, m_clip->getClipThumbFrame(), width, 180); m_view.clip_thumb->setPixmap(pix); if (t == IMAGE || t == VIDEO) m_view.tabWidget->removeTab(AUDIOTAB); } else { @@ -221,7 +241,7 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg KFileItem f(KFileItem::Unknown, KFileItem::Unknown, url, true); m_view.clip_filesize->setText(KIO::convertSize(f.size())); - m_view.clip_duration->setText(tc.getTimecode(m_clip->duration(), m_fps)); + m_view.clip_duration->setText(tc.getTimecode(m_clip->duration())); if (t != IMAGE && t != COLOR && t != TEXT) m_view.clip_duration->setReadOnly(true); else connect(m_view.clip_duration, SIGNAL(editingFinished()), this, SLOT(slotCheckMaxLength())); @@ -239,7 +259,7 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg connect(m_view.marker_delete, SIGNAL(clicked()), this, SLOT(slotDeleteMarker())); connect(m_view.markers_list, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(slotEditMarker())); - adjustSize(); + //adjustSize(); } void ClipProperties::slotEnableLuma(int state) @@ -247,6 +267,7 @@ void ClipProperties::slotEnableLuma(int state) bool enable = false; if (state == Qt::Checked) enable = true; m_view.luma_duration->setEnabled(enable); + m_view.luma_duration_frames->setEnabled(enable); m_view.slide_luma->setEnabled(enable); if (enable) { m_view.luma_file->setEnabled(m_view.slide_luma->isChecked()); @@ -269,7 +290,7 @@ void ClipProperties::slotFillMarkersList() m_view.markers_list->clear(); QList < CommentedTime > marks = m_clip->commentedSnapMarkers(); for (int count = 0; count < marks.count(); ++count) { - QString time = m_tc.getTimecode(marks[count].time(), m_tc.fps()); + QString time = m_tc.getTimecode(marks[count].time()); QStringList itemtext; itemtext << time << marks[count].comment(); (void) new QTreeWidgetItem(m_view.markers_list, itemtext); @@ -367,16 +388,16 @@ QMap ClipProperties::properties() m_clipNeedsRefresh = true; props["colour"] = "0x" + new_color.right(6) + "ff"; } - int duration = m_tc.getFrameCount(m_view.clip_duration->text(), m_fps); + int duration = m_tc.getFrameCount(m_view.clip_duration->text()); if (duration != m_clip->duration().frames(m_fps)) { props["out"] = QString::number(duration); } } else if (t == IMAGE) { if ((int) m_view.image_transparency->isChecked() != old_props.value("transparency").toInt()) { props["transparency"] = QString::number((int)m_view.image_transparency->isChecked()); - m_clipNeedsRefresh = true; + //m_clipNeedsRefresh = true; } - int duration = m_tc.getFrameCount(m_view.clip_duration->text(), m_fps); + int duration = m_tc.getFrameCount(m_view.clip_duration->text()); if (duration != m_clip->duration().frames(m_fps)) { props["out"] = QString::number(duration); } @@ -388,28 +409,18 @@ QMap ClipProperties::properties() value = QString::number((int) m_view.luma_softness->value()); if (old_props.value("softness") != value) props["softness"] = value; - QString extension; - switch (m_view.image_type->currentIndex()) { - case TYPE_PNG: - extension = "/.all.png"; - break; - case TYPE_BMP: - extension = "/.all.bmp"; - break; - case TYPE_GIF: - extension = "/.all.gif"; - break; - default: - extension = "/.all.jpg"; - break; - } + 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 != old_props.value("resource")) { - m_clipNeedsRefresh = true; + m_clipNeedsReLoad = true; props["resource"] = new_path; kDebug() << "//// SLIDE EDIT, NEW:" << new_path << ", OLD; " << old_props.value("resource"); } - int duration = m_tc.getFrameCount(m_view.slide_duration->text(), m_fps); + int duration; + if (m_view.slide_duration_format->currentIndex() == 1) { + // we are in frames mode + duration = m_view.slide_duration_frames->value(); + } else duration = m_tc.getFrameCount(m_view.slide_duration->text()); if (duration != old_props.value("ttl").toInt()) { m_clipNeedsRefresh = true; props["ttl"] = QString::number(duration); @@ -420,7 +431,11 @@ QMap ClipProperties::properties() props["out"] = QString::number(duration * m_count); } if (m_view.slide_fade->isChecked()) { - int luma_duration = m_tc.getFrameCount(m_view.luma_duration->text(), m_fps); + int luma_duration; + if (m_view.slide_duration_format->currentIndex() == 1) { + // we are in frames mode + luma_duration = m_view.luma_duration_frames->value(); + } else luma_duration = m_tc.getFrameCount(m_view.luma_duration->text()); if (luma_duration != old_props.value("luma_duration").toInt()) { m_clipNeedsRefresh = true; props["luma_duration"] = QString::number(luma_duration); @@ -447,40 +462,35 @@ bool ClipProperties::needsTimelineRefresh() const return m_clipNeedsRefresh; } +bool ClipProperties::needsTimelineReload() const +{ + return m_clipNeedsReLoad; +} + void ClipProperties::parseFolder() { QDir dir(m_view.clip_path->text()); QStringList filters; - QString extension; - switch (m_view.image_type->currentIndex()) { - case TYPE_PNG: - filters << "*.png"; - extension = "/.all.png"; - break; - case TYPE_BMP: - filters << "*.bmp"; - extension = "/.all.bmp"; - break; - case TYPE_GIF: - filters << "*.gif"; - extension = "/.all.gif"; - break; - default: - filters << "*.jpg"; - // TODO: improve jpeg image detection with extension like jpeg, requires change in MLT image producers - // << "*.jpeg"; - extension = "/.all.jpg"; - break; - } + 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(); dir.setNameFilters(filters); QStringList result = dir.entryList(QDir::Files); m_count = result.count(); - m_view.slide_info->setText(i18n("%1 images found", m_count)); + if (m_count == 0) { + // no images, do not accept that + m_view.slide_info->setText(i18n("No image found")); + m_view.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); + return; + } + m_view.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true); + m_view.slide_info->setText(i18np("1 image found", "%1 images found", m_count)); QDomElement xml = m_clip->toXML(); xml.setAttribute("resource", m_view.clip_path->text() + extension); - QPixmap pix = m_clip->thumbProducer()->getImage(KUrl(m_view.clip_path->text() + extension), 1, 240, 180); + 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); 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); @@ -488,9 +498,32 @@ void ClipProperties::parseFolder() void ClipProperties::slotCheckMaxLength() { - int duration = m_tc.getFrameCount(m_view.clip_duration->text(), m_fps); + if (m_clip->maxDuration() == GenTime()) return; + int duration = m_tc.getFrameCount(m_view.clip_duration->text()); if (duration > m_clip->maxDuration().frames(m_fps)) { - m_view.clip_duration->setText(m_tc.getTimecode(m_clip->maxDuration(), m_fps)); + m_view.clip_duration->setText(m_tc.getTimecode(m_clip->maxDuration())); + } +} + +void ClipProperties::slotUpdateDurationFormat(int ix) +{ + bool framesFormat = ix == 1; + if (framesFormat) { + // switching to frames count, update widget + m_view.slide_duration_frames->setValue(m_tc.getFrameCount(m_view.slide_duration->text())); + m_view.luma_duration_frames->setValue(m_tc.getFrameCount(m_view.luma_duration->text())); + m_view.slide_duration->setHidden(true); + m_view.luma_duration->setHidden(true); + m_view.slide_duration_frames->setHidden(false); + m_view.luma_duration_frames->setHidden(false); + } else { + // switching to timecode format + m_view.slide_duration->setText(m_tc.getTimecodeFromFrames(m_view.slide_duration_frames->value())); + m_view.luma_duration->setText(m_tc.getTimecodeFromFrames(m_view.luma_duration_frames->value())); + m_view.slide_duration_frames->setHidden(true); + m_view.luma_duration_frames->setHidden(true); + m_view.slide_duration->setHidden(false); + m_view.luma_duration->setHidden(false); } }