]> git.sesse.net Git - kdenlive/blobdiff - src/clipproperties.cpp
add explicit keyword when necessary. Add const ref when necessary
[kdenlive] / src / clipproperties.cpp
index 67acc240ddf61b387ce37f36f245afcfa3ddc0cc..2bc19e620b84b7d4a0a448472e8c5eee75d7db6a 100644 (file)
@@ -57,13 +57,14 @@ static const int ADVANCEDTAB = 7;
 
 
 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_clipNeedsReLoad(false)
+    QDialog(parent)
+    , m_clip(clip)
+    , m_tc(tc)
+    , m_fps(fps)
+    , m_count(0)
+    , m_clipNeedsRefresh(false)
+    , m_clipNeedsReLoad(false)
+    , m_proxyContainer(NULL)
 {
     setAttribute(Qt::WA_DeleteOnClose, true);
     setFont(KGlobalSettings::toolBarFont());
@@ -124,14 +125,16 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg
     }
     connect(m_view.clip_force_framerate, SIGNAL(toggled(bool)), this, SLOT(slotModified()));
     connect(m_view.clip_framerate, SIGNAL(valueChanged(double)), this, SLOT(slotModified()));
+    m_view.clip_progressive->addItem(i18n("Interlaced"), 0);
+    m_view.clip_progressive->addItem(i18n("Progressive"), 1);
 
     if (props.contains("force_progressive")) {
         m_view.clip_force_progressive->setChecked(true);
         m_view.clip_progressive->setEnabled(true);
-        m_view.clip_progressive->setValue(props.value("force_progressive").toInt());
+        m_view.clip_progressive->setCurrentIndex(props.value("force_progressive").toInt());
     }
     connect(m_view.clip_force_progressive, SIGNAL(toggled(bool)), this, SLOT(slotModified()));
-    connect(m_view.clip_progressive, SIGNAL(valueChanged(int)), this, SLOT(slotModified()));
+    connect(m_view.clip_progressive, SIGNAL(currentIndexChanged(int)), this, SLOT(slotModified()));
 
     m_view.clip_fieldorder->addItem(i18n("Bottom first"), 0);
     m_view.clip_fieldorder->addItem(i18n("Top first"), 1);
@@ -194,12 +197,42 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg
     connect(m_view.clip_full_luma, SIGNAL(toggled(bool)), this, SLOT(slotModified()));
 
     // Check for Metadata
-    QMap<QString, QString> meta = m_clip->metadata();
-    QMap<QString, QString>::const_iterator i = meta.constBegin();
+    QMap<QString, QStringList> meta = m_clip->metadata();
+    QMap<QString, QStringList>::const_iterator i = meta.constBegin();
     while (i != meta.constEnd()) {
-        QTreeWidgetItem *metaitem = new QTreeWidgetItem(m_view.metadata_list);
+       QStringList values = i.value();
+       QString parentName;
+       QString iconName;
+       if (values.count() > 1 && !values.at(1).isEmpty()) parentName = values.at(1);
+       else {
+           if (KdenliveSettings::ffmpegpath().endsWith("avconv")) {
+               parentName = i18n("Libav");
+               iconName = "meta_libav.png";
+           }
+           else {
+               parentName = i18n("FFmpeg");
+               iconName = "meta_ffmpeg.png";
+           }
+       }
+       QTreeWidgetItem *parent = NULL;
+       QList <QTreeWidgetItem *> matches = m_view.metadata_list->findItems(parentName, Qt::MatchExactly);
+       if (!matches.isEmpty()) parent = matches.at(0);
+       else {
+           if (parentName == "Magic Lantern") iconName = "meta_magiclantern.png";
+           parent = new QTreeWidgetItem(m_view.metadata_list, QStringList() << parentName);
+           if (!iconName.isEmpty()) {
+               KIcon icon(KStandardDirs::locate("appdata", iconName));
+               parent->setIcon(0, icon);
+           }
+       }
+       QTreeWidgetItem *metaitem = NULL;
+        if (parent) {
+           metaitem = new QTreeWidgetItem(parent);
+           parent->setExpanded(true);
+       }
+       else 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());
+        metaitem->setText(1, values.at(0));
         ++i;
     }
 
@@ -346,7 +379,7 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg
         m_view.slide_duration_frames->setHidden(true);
         m_view.luma_duration_frames->setHidden(true);
 
-        parseFolder();
+        parseFolder(false);
 
         m_view.luma_duration->setText(tc.getTimecodeFromFrames(props.value("luma_duration").toInt()));
         QString lumaFile = props.value("luma_file");
@@ -409,32 +442,7 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg
         m_view.clip_aproperties->setItemDelegate(del2);
         m_view.clip_aproperties->setStyleSheet(QString("QTreeWidget { background-color: transparent;}"));
         m_view.clip_vproperties->setStyleSheet(QString("QTreeWidget { background-color: transparent;}"));
-
-        if (props.contains("videocodec"))
-            new QTreeWidgetItem(m_view.clip_vproperties, QStringList() << i18n("Video codec") << props.value("videocodec"));
-
-        if (props.contains("frame_size"))
-            new QTreeWidgetItem(m_view.clip_vproperties, QStringList() << i18n("Frame size") << props.value("frame_size"));
-
-        if (props.contains("fps")) {
-            new QTreeWidgetItem(m_view.clip_vproperties, QStringList() << i18n("Frame rate") << props.value("fps"));
-            if (!m_view.clip_framerate->isEnabled()) m_view.clip_framerate->setValue(props.value("fps").toDouble());
-        }
-
-        if (props.contains("progressive")) {
-            int scanning = props.value("progressive").toInt();
-            QString txt = scanning == 1 ? i18n("Progressive") : i18n("Interlaced");
-            new QTreeWidgetItem(m_view.clip_vproperties, QStringList() << i18n("Scanning") << txt);
-        }
-        
-        if (props.contains("aspect_ratio"))
-            new QTreeWidgetItem(m_view.clip_vproperties, QStringList() << i18n("Pixel aspect ratio") << props.value("aspect_ratio"));
-
-        if (props.contains("pix_fmt"))
-            new QTreeWidgetItem(m_view.clip_vproperties, QStringList() << i18n("Pixel format") << props.value("pix_fmt"));
-
-        if (props.contains("colorspace"))
-            new QTreeWidgetItem(m_view.clip_vproperties, QStringList() << i18n("Colorspace") << ProfilesDialog::getColorspaceDescription(props.value("colorspace").toInt()));
+       loadVideoProperties(props);      
         
        m_view.clip_thumb->setMinimumSize(180 * KdenliveSettings::project_display_ratio(), 180);
         
@@ -492,7 +500,7 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg
             m_view.clip_license->setText(i18n("License: %1", res.property(Nepomuk::Vocabulary::NIE::license()).toString()));
             if (ltype.startsWith("http")) {
                 m_view.clip_license->setUrl(ltype);
-                connect(m_view.clip_license, SIGNAL(leftClickedUrl(const QString &)), this, SLOT(slotOpenUrl(const QString &)));
+                connect(m_view.clip_license, SIGNAL(leftClickedUrl(QString)), this, SLOT(slotOpenUrl(QString)));
             }
         }
         else m_view.clip_license->setHidden(true);
@@ -513,7 +521,7 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg
     connect(m_view.marker_delete, SIGNAL(clicked()), this, SLOT(slotDeleteMarker()));
     connect(m_view.marker_save, SIGNAL(clicked()), this, SLOT(slotSaveMarkers()));
     connect(m_view.marker_load, SIGNAL(clicked()), this, SLOT(slotLoadMarkers()));
-    connect(m_view.markers_list, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(slotEditMarker()));
+    connect(m_view.markers_list, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(slotEditMarker()));
     
     connect(m_view.analysis_delete, SIGNAL(clicked()), this, SLOT(slotDeleteAnalysis()));
     connect(m_view.analysis_save, SIGNAL(clicked()), this, SLOT(slotSaveAnalysis()));
@@ -522,6 +530,10 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg
     connect(this, SIGNAL(accepted()), this, SLOT(slotApplyProperties()));
     connect(m_view.buttonBox->button(QDialogButtonBox::Apply), SIGNAL(clicked()), this, SLOT(slotApplyProperties()));
     m_view.buttonBox->button(QDialogButtonBox::Apply)->setEnabled(false);
+    
+    m_view.metadata_list->resizeColumnToContents(0);
+    m_view.clip_vproperties->resizeColumnToContents(0);
+    m_view.clip_aproperties->resizeColumnToContents(0);
     adjustSize();
 }
 
@@ -561,7 +573,7 @@ ClipProperties::ClipProperties(QList <DocClipBase *>cliplist, Timecode tc, QMap
     if (commonproperties.contains("force_progressive") && !commonproperties.value("force_progressive").isEmpty()) {
         m_view.clip_force_progressive->setChecked(true);
         m_view.clip_progressive->setEnabled(true);
-        m_view.clip_progressive->setValue(commonproperties.value("force_progressive").toInt());
+        m_view.clip_progressive->setCurrentIndex(commonproperties.value("force_progressive").toInt());
     }
 
     if (commonproperties.contains("force_tff") && !commonproperties.value("force_tff").isEmpty()) {
@@ -676,6 +688,39 @@ ClipProperties::~ClipProperties()
     if (del2) delete del2;
 }
 
+
+void ClipProperties::loadVideoProperties(QMap <QString, QString> props)
+{
+    m_view.clip_vproperties->clear();
+    if (props.contains("videocodec"))
+       new QTreeWidgetItem(m_view.clip_vproperties, QStringList() << i18n("Video codec") << props.value("videocodec"));
+    else if (props.contains("videocodecid"))
+       new QTreeWidgetItem(m_view.clip_vproperties, QStringList() << i18n("Video codec") << props.value("videocodecid"));
+
+    if (props.contains("frame_size"))
+       new QTreeWidgetItem(m_view.clip_vproperties, QStringList() << i18n("Frame size") << props.value("frame_size"));
+
+    if (props.contains("fps")) {
+       new QTreeWidgetItem(m_view.clip_vproperties, QStringList() << i18n("Frame rate") << props.value("fps"));
+        if (!m_view.clip_framerate->isEnabled()) m_view.clip_framerate->setValue(props.value("fps").toDouble());
+    }
+
+    if (props.contains("progressive")) {
+       int scanning = props.value("progressive").toInt();
+        QString txt = scanning == 1 ? i18n("Progressive") : i18n("Interlaced");
+        new QTreeWidgetItem(m_view.clip_vproperties, QStringList() << i18n("Scanning") << txt);
+    }
+        
+    if (props.contains("aspect_ratio"))
+       new QTreeWidgetItem(m_view.clip_vproperties, QStringList() << i18n("Pixel aspect ratio") << props.value("aspect_ratio"));
+
+    if (props.contains("pix_fmt"))
+       new QTreeWidgetItem(m_view.clip_vproperties, QStringList() << i18n("Pixel format") << props.value("pix_fmt"));
+
+    if (props.contains("colorspace"))
+       new QTreeWidgetItem(m_view.clip_vproperties, QStringList() << i18n("Colorspace") << ProfilesDialog::getColorspaceDescription(props.value("colorspace").toInt()));
+}
+
 void ClipProperties::slotGotThumbnail(const QString &id, QImage img)
 {
     if (id != m_clip->getId()) return;
@@ -696,10 +741,24 @@ void ClipProperties::slotApplyProperties()
     if (m_clip != NULL) {
         QMap <QString, QString> props = properties();
         emit applyNewClipProperties(m_clip->getId(), m_clip->currentProperties(props), props, needsTimelineRefresh(), needsTimelineReload());
+       QTimer::singleShot(1000, this, SLOT(slotReloadVideoProperties()));
+       if (props.contains("force_aspect_num")) QTimer::singleShot(1000, this, SLOT(slotReloadVideoThumb()));
     }
     m_view.buttonBox->button(QDialogButtonBox::Apply)->setEnabled(false);
 }
 
+void ClipProperties::slotReloadVideoProperties()
+{
+    if (m_clip == NULL) return;
+    loadVideoProperties(m_clip->properties());
+}
+
+void ClipProperties::slotReloadVideoThumb()
+{
+    if (m_clip == NULL) return;
+    emit requestThumb(QString('?' + m_clip->getId()), QList<int>() << m_clip->getClipThumbFrame());
+}
+
 void ClipProperties::disableClipId(const QString &id)
 {
     if (m_clip && m_view.buttonBox->button(QDialogButtonBox::Ok)->isEnabled()) {
@@ -897,9 +956,9 @@ QMap <QString, QString> ClipProperties::properties()
         m_clipNeedsRefresh = true;
     }
 
-    int progressive = m_view.clip_progressive->value();
+    int progressive = m_view.clip_progressive->currentIndex();
     if (m_view.clip_force_progressive->isChecked()) {
-        if (progressive != m_old_props.value("force_progressive").toInt()) {
+        if (!m_old_props.contains("force_progressive") || progressive != m_old_props.value("force_progressive").toInt()) {
             props["force_progressive"] = QString::number(progressive);
         }
     } else if (m_old_props.contains("force_progressive") && !m_old_props.value("force_progressive").isEmpty()) {
@@ -908,7 +967,7 @@ QMap <QString, QString> ClipProperties::properties()
 
     int fieldOrder = m_view.clip_fieldorder->currentIndex();
     if (m_view.clip_force_fieldorder->isChecked()) {
-        if (fieldOrder != m_old_props.value("force_tff").toInt()) {
+        if (!m_old_props.contains("force_tff") || fieldOrder != m_old_props.value("force_tff").toInt()) {
             props["force_tff"] = QString::number(fieldOrder);
         }
     } else if (m_old_props.contains("force_tff") && !m_old_props.value("force_tff").isEmpty()) {
@@ -1081,7 +1140,7 @@ bool ClipProperties::needsTimelineReload() const
 }
 
 
-void ClipProperties::parseFolder()
+void ClipProperties::parseFolder(bool reloadThumb)
 {
     QString path = m_view.clip_path->text();
     bool isMime = !(path.contains('%'));
@@ -1101,17 +1160,31 @@ void ClipProperties::parseFolder()
     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;
+       int offset = 0;
+       QString path = m_view.clip_path->text();
+       if (path.contains('?')) {
+           // New MLT syntax
+           offset = m_view.clip_path->text().section(':', -1).toInt();
+           path = path.section('?', 0, 0);
+       }
+       QString filter = KUrl(path).fileName();
+       QString ext = filter.section('.', -1);
+       filter = filter.section('%', 0, -2);
+       QString regexp = '^' + filter + "\\d+\\." + ext + '$';
+       QRegExp rx(regexp);
+       QStringList entries;
+       int ix;
+       foreach(const QString & path, result) {
+           if (rx.exactMatch(path)) {
+               if (offset > 0) {
+                   // make sure our image is in the range we want (> begin)
+                   ix = path.section(filter, 1).section('.', 0, 0).toInt();
+                   if (ix < offset) continue;
+               }
+               entries << path;
+           }
+       }
+       result = entries;
     }
 
     m_count = result.count();
@@ -1124,16 +1197,16 @@ void ClipProperties::parseFolder()
     }
     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);
-    int width = 180.0 * KdenliveSettings::project_display_ratio();
-    if (width % 2 == 1) width++;
-    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);
+    if (reloadThumb) {
+       int width = 180.0 * KdenliveSettings::project_display_ratio();
+       if (width % 2 == 1) width++;
+       QString filePath = m_view.clip_path->text();
+       if (isMime) filePath.append(extension);
+       QPixmap pix = m_clip->thumbProducer()->getImage(KUrl(filePath), 1, width, 180);
+       m_view.clip_thumb->setPixmap(pix);
+    }
 }
 
 void ClipProperties::slotCheckMaxLength()