X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fclipproperties.cpp;h=8f1224fe5402be8889936c97408f29f7841a451f;hb=f6bed85744a94587c61cd67d88c02efb57ddc687;hp=6d02576fa969d5270a14adec6f7baca37197e61f;hpb=ff13434daedec0fba905d3eb462a907872bbd563;p=kdenlive diff --git a/src/clipproperties.cpp b/src/clipproperties.cpp index 6d02576f..8f1224fe 100644 --- a/src/clipproperties.cpp +++ b/src/clipproperties.cpp @@ -17,16 +17,17 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ -#include + +#include "clipproperties.h" +#include "kdenlivesettings.h" +#include "kthumb.h" +#include "markerdialog.h" #include #include #include -#include "kdenlivesettings.h" -#include "clipproperties.h" -#include "kthumb.h" -#include "markerdialog.h" +#include static const int VIDEOTAB = 0; static const int AUDIOTAB = 1; @@ -34,14 +35,22 @@ static const int COLORTAB = 2; static const int SLIDETAB = 3; static const int IMAGETAB = 4; static const int MARKERTAB = 5; -static const int ADVANCEDTAB = 6; +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_tc(tc), m_clip(clip), m_fps(fps), m_clipNeedsRefresh(false), m_count(0) { +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) +{ setFont(KGlobalSettings::toolBarFont()); m_view.setupUi(this); KUrl url = m_clip->fileURL(); @@ -81,6 +90,16 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg m_view.clip_vindex->setMaximum(props.value("video_max").toInt()); } + // Check for Metadata + QMap meta = m_clip->metadata(); + QMap::const_iterator i = meta.constBegin(); + while (i != meta.constEnd()) { + QTreeWidgetItem *metaitem = new QTreeWidgetItem(m_view.metadata_list); + metaitem->setText(0, i.key()); //i18n(i.key().section('.', 2, 3).toUtf8().data())); + metaitem->setText(1, i.value()); + ++i; + } + connect(m_view.clip_force_ar, SIGNAL(toggled(bool)), m_view.clip_ar, SLOT(setEnabled(bool))); connect(m_view.clip_force_threads, SIGNAL(toggled(bool)), m_view.clip_threads, SLOT(setEnabled(bool))); connect(m_view.clip_force_vindex, SIGNAL(toggled(bool)), m_view.clip_vindex, SLOT(setEnabled(bool))); @@ -113,14 +132,16 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg m_view.image_transparency->setChecked(props.value("transparency").toInt()); } else if (t == COLOR) { m_view.clip_path->setEnabled(false); + m_view.tabWidget->removeTab(METATAB); m_view.tabWidget->removeTab(IMAGETAB); m_view.tabWidget->removeTab(SLIDETAB); m_view.tabWidget->removeTab(AUDIOTAB); m_view.tabWidget->removeTab(VIDEOTAB); m_view.clip_thumb->setHidden(true); - m_view.clip_color->setColor(QColor("#" + props.value("colour").right(8).left(6))); + m_view.clip_color->setColor(QColor('#' + props.value("colour").right(8).left(6))); } else if (t == SLIDESHOW) { m_view.clip_path->setText(url.directory()); + m_view.tabWidget->removeTab(METATAB); m_view.tabWidget->removeTab(IMAGETAB); m_view.tabWidget->removeTab(COLORTAB); m_view.tabWidget->removeTab(AUDIOTAB); @@ -136,6 +157,13 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg else if (path.endsWith("bmp")) m_view.image_type->setCurrentIndex(TYPE_BMP); else if (path.endsWith("gif")) m_view.image_type->setCurrentIndex(TYPE_GIF); 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())); @@ -163,8 +191,8 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg m_view.luma_file->addItem(KIcon(folder + '/' + fname), fname, folder + '/' + fname); } - slotEnableLuma(m_view.slide_fade->isChecked()); - slotEnableLumaFile(m_view.slide_luma->isChecked()); + slotEnableLuma(m_view.slide_fade->checkState()); + slotEnableLumaFile(m_view.slide_luma->checkState()); if (!lumaFile.isEmpty()) { m_view.slide_luma->setChecked(true); @@ -186,8 +214,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 { @@ -218,13 +247,15 @@ 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) { +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()); @@ -233,7 +264,8 @@ void ClipProperties::slotEnableLuma(int state) { m_view.luma_softness->setEnabled(m_view.label_softness->isEnabled()); } -void ClipProperties::slotEnableLumaFile(int state) { +void ClipProperties::slotEnableLumaFile(int state) +{ bool enable = false; if (state == Qt::Checked) enable = true; m_view.luma_file->setEnabled(enable); @@ -241,10 +273,11 @@ void ClipProperties::slotEnableLumaFile(int state) { m_view.label_softness->setEnabled(enable); } -void ClipProperties::slotFillMarkersList() { +void ClipProperties::slotFillMarkersList() +{ m_view.markers_list->clear(); QList < CommentedTime > marks = m_clip->commentedSnapMarkers(); - for (uint count = 0; count < marks.count(); ++count) { + for (int count = 0; count < marks.count(); ++count) { QString time = m_tc.getTimecode(marks[count].time(), m_tc.fps()); QStringList itemtext; itemtext << time << marks[count].comment(); @@ -252,7 +285,8 @@ void ClipProperties::slotFillMarkersList() { } } -void ClipProperties::slotAddMarker() { +void ClipProperties::slotAddMarker() +{ CommentedTime marker(GenTime(), i18n("Marker")); MarkerDialog d(m_clip, marker, m_tc, i18n("Add Marker"), this); if (d.exec() == QDialog::Accepted) { @@ -261,7 +295,8 @@ void ClipProperties::slotAddMarker() { QTimer::singleShot(500, this, SLOT(slotFillMarkersList())); } -void ClipProperties::slotEditMarker() { +void ClipProperties::slotEditMarker() +{ QList < CommentedTime > marks = m_clip->commentedSnapMarkers(); int pos = m_view.markers_list->currentIndex().row(); if (pos < 0 || pos > marks.count() - 1) return; @@ -272,7 +307,8 @@ void ClipProperties::slotEditMarker() { QTimer::singleShot(500, this, SLOT(slotFillMarkersList())); } -void ClipProperties::slotDeleteMarker() { +void ClipProperties::slotDeleteMarker() +{ QList < CommentedTime > marks = m_clip->commentedSnapMarkers(); int pos = m_view.markers_list->currentIndex().row(); if (pos < 0 || pos > marks.count() - 1) return; @@ -281,12 +317,14 @@ void ClipProperties::slotDeleteMarker() { QTimer::singleShot(500, this, SLOT(slotFillMarkersList())); } -const QString &ClipProperties::clipId() const { +const QString &ClipProperties::clipId() const +{ return m_clip->getId(); } -QMap ClipProperties::properties() { +QMap ClipProperties::properties() +{ QMap props; CLIPTYPE t = m_clip->clipType(); QMap old_props = m_clip->properties(); @@ -301,7 +339,7 @@ QMap ClipProperties::properties() { m_clipNeedsRefresh = true; } } else if (old_props.contains("force_aspect_ratio")) { - props["force_aspect_ratio"] = QString(); + props["force_aspect_ratio"].clear(); m_clipNeedsRefresh = true; } @@ -311,7 +349,7 @@ QMap ClipProperties::properties() { props["threads"] = QString::number(threads); } } else if (old_props.contains("threads")) { - props["threads"] = QString(); + props["threads"].clear(); } int vindex = m_view.clip_vindex->value(); @@ -320,7 +358,7 @@ QMap ClipProperties::properties() { props["video_index"] = QString::number(vindex); } } else if (old_props.contains("video_index")) { - props["video_index"] = QString(); + props["video_index"].clear(); } int aindex = m_view.clip_aindex->value(); @@ -329,12 +367,12 @@ QMap ClipProperties::properties() { props["audio_index"] = QString::number(aindex); } } else if (old_props.contains("audio_index")) { - props["audio_index"] = QString(); + props["audio_index"].clear(); } if (t == COLOR) { QString new_color = m_view.clip_color->color().name(); - if (new_color != QString("#" + old_props.value("colour").right(8).left(6))) { + if (new_color != QString('#' + old_props.value("colour").right(8).left(6))) { m_clipNeedsRefresh = true; props["colour"] = "0x" + new_color.right(6) + "ff"; } @@ -380,7 +418,11 @@ QMap ClipProperties::properties() { 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(), m_fps); if (duration != old_props.value("ttl").toInt()) { m_clipNeedsRefresh = true; props["ttl"] = QString::number(duration); @@ -391,7 +433,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(), m_fps); if (luma_duration != old_props.value("luma_duration").toInt()) { m_clipNeedsRefresh = true; props["luma_duration"] = QString::number(luma_duration); @@ -404,8 +450,8 @@ QMap ClipProperties::properties() { props["luma_file"] = lumaFile; } } else { - if (old_props.value("luma_file") != QString()) { - props["luma_file"] = QString(); + if (!old_props.value("luma_file").isEmpty()) { + props["luma_file"].clear(); } } @@ -413,11 +459,13 @@ QMap ClipProperties::properties() { return props; } -bool ClipProperties::needsTimelineRefresh() const { +bool ClipProperties::needsTimelineRefresh() const +{ return m_clipNeedsRefresh; } -void ClipProperties::parseFolder() { +void ClipProperties::parseFolder() +{ QDir dir(m_view.clip_path->text()); QStringList filters; @@ -455,13 +503,37 @@ void ClipProperties::parseFolder() { m_view.clip_thumb->setPixmap(pix); } -void ClipProperties::slotCheckMaxLength() { +void ClipProperties::slotCheckMaxLength() +{ + if (m_clip->maxDuration() == GenTime()) return; int duration = m_tc.getFrameCount(m_view.clip_duration->text(), m_fps); if (duration > m_clip->maxDuration().frames(m_fps)) { m_view.clip_duration->setText(m_tc.getTimecode(m_clip->maxDuration(), m_fps)); } } +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_tc.fps())); + m_view.luma_duration_frames->setValue(m_tc.getFrameCount(m_view.luma_duration->text(), m_tc.fps())); + 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); + } +} + #include "clipproperties.moc"