]> git.sesse.net Git - kdenlive/commitdiff
Slideshow clip: allow image sequence like photo001.png instead of all png images
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Fri, 30 Jul 2010 22:52:18 +0000 (22:52 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Fri, 30 Jul 2010 22:52:18 +0000 (22:52 +0000)
svn path=/trunk/kdenlive/; revision=4665

src/clipproperties.cpp
src/kdenlivesettings.kcfg
src/slideshowclip.cpp
src/slideshowclip.h
src/widgets/clipproperties_ui.ui
src/widgets/slideshowclip_ui.ui

index 81094821627137bb57fa977e05ba7be2f7b4facc..571343061cede51a51a4adbffc3c8f4c64c28d1a 100644 (file)
@@ -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);
@@ -628,16 +639,40 @@ bool ClipProperties::needsTimelineReload() const
     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
@@ -651,7 +686,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 <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);
index 27fe7fd16f0b37565488b0d814133a2da3d4b8ce..1e812dcd6868fb8fb50326c8f640d4ab27ad9fe6 100644 (file)
       <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>
index e4557ab07e2a5dd7abce223f1337d2fedc0380d9..5f44bcaffff4c3fa4fc288d68dab38a5301a5401 100644 (file)
@@ -43,6 +43,7 @@ SlideshowClip::SlideshowClip(Timecode tc, QWidget * parent) :
 
     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)));
@@ -71,6 +72,9 @@ SlideshowClip::SlideshowClip(Timecode tc, QWidget * parent) :
     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;
@@ -148,15 +152,40 @@ void SlideshowClip::slotEnableLumaFile(int state)
 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);
@@ -213,8 +242,26 @@ void SlideshowClip::slotSetPixmap(const KFileItem &fileItem, const QPixmap &pix)
 
 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;
 }
 
 
@@ -289,6 +336,22 @@ void SlideshowClip::slotUpdateDurationFormat(int ix)
     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"
 
 
index 662ed1c89de18bb904f4abdd6a6ea961af6017b2..a40546b365a019a20bb4868766f17d7c2a86f082 100644 (file)
@@ -55,6 +55,8 @@ private slots:
     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;
index eca4bc19db760488b320ae27da3b3e70d8dee6f5..dd2578f81ef6d57f75d5d77cf0f0434b5f338acc 100644 (file)
    <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>
index f09fa9a4daf54cf9de0aceb66d174574a5a03ac5..54ce9833127e0afaf5562bae6e9ccd70ab113424 100644 (file)
@@ -6,14 +6,14 @@
    <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>