From cbc676239e7e73c1193146a4cf98fac35903f070 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Mon, 5 May 2008 13:52:25 +0000 Subject: [PATCH] several updates for slideshow clips svn path=/branches/KDE4/; revision=2170 --- src/clipproperties.cpp | 145 +++++++++++++++++++++++-------- src/clipproperties.h | 8 +- src/customtrackview.cpp | 8 +- src/docclipbase.cpp | 10 ++- src/kthumb.cpp | 5 +- src/kthumb.h | 2 + src/mainwindow.cpp | 9 +- src/projectitem.cpp | 18 ++-- src/projectitem.h | 2 - src/projectlist.cpp | 11 +-- src/renderer.cpp | 3 +- src/slideshowclip.cpp | 64 +++++++------- src/widgets/clipproperties_ui.ui | 11 ++- 13 files changed, 195 insertions(+), 101 deletions(-) diff --git a/src/clipproperties.cpp b/src/clipproperties.cpp index 6268a478..eec5ede7 100644 --- a/src/clipproperties.cpp +++ b/src/clipproperties.cpp @@ -38,7 +38,7 @@ #define TYPE_BMP 2 #define TYPE_GIF 3 -ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidget * parent): QDialog(parent), m_tc(tc), m_clip(clip), m_fps(fps) { +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) { setFont(KGlobalSettings::toolBarFont()); m_view.setupUi(this); KUrl url = m_clip->fileURL(); @@ -55,30 +55,31 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg CLIPTYPE t = m_clip->clipType(); if (t == COLOR) { - m_view.clip_path->setEnabled(false); - m_view.tabWidget->removeTab(SLIDETAB); - m_view.tabWidget->removeTab(AUDIOTAB); - m_view.tabWidget->removeTab(VIDEOTAB); + m_view.clip_path->setEnabled(false); + 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))); - } - else if (t == SLIDESHOW) { - 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); - m_view.slide_loop->setChecked(props.value("loop").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); - m_view.slide_duration->setText(tc.getTimecodeFromFrames(props.value("ttl").toInt())); - } - else if (t != AUDIO) { - m_view.tabWidget->removeTab(SLIDETAB); - m_view.tabWidget->removeTab(COLORTAB); + 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(COLORTAB); + m_view.tabWidget->removeTab(AUDIOTAB); + m_view.tabWidget->removeTab(VIDEOTAB); + QStringList types; + types << "JPG" << "PNG" << "BMP" << "GIF"; + m_view.image_type->addItems(types); + m_view.slide_loop->setChecked(props.value("loop").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); + m_view.slide_duration->setText(tc.getTimecodeFromFrames(props.value("ttl").toInt())); + parseFolder(); + connect(m_view.image_type, SIGNAL(currentIndexChanged(int)), this, SLOT(parseFolder())); + } else if (t != AUDIO) { + m_view.tabWidget->removeTab(SLIDETAB); + m_view.tabWidget->removeTab(COLORTAB); if (props.contains("frame_size")) m_view.clip_size->setText(props.value("frame_size")); if (props.contains("videocodec")) @@ -92,8 +93,8 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg m_view.clip_thumb->setPixmap(pix); if (t == IMAGE || t == VIDEO) m_view.tabWidget->removeTab(AUDIOTAB); } else { - m_view.tabWidget->removeTab(SLIDETAB); - m_view.tabWidget->removeTab(COLORTAB); + m_view.tabWidget->removeTab(SLIDETAB); + m_view.tabWidget->removeTab(COLORTAB); m_view.tabWidget->removeTab(VIDEOTAB); m_view.clip_thumb->setHidden(true); } @@ -105,7 +106,7 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg adjustSize(); } -int ClipProperties::clipId() { +int ClipProperties::clipId() const { return m_clip->getId(); } @@ -114,18 +115,92 @@ QMap ClipProperties::properties() { QMap props; props["description"] = m_view.clip_description->text(); CLIPTYPE t = m_clip->clipType(); - if (t == SLIDESHOW) { - props["loop"] = QString::number((int) m_view.slide_loop->isChecked()); - } - else if (t == COLOR) { - QMap old_props = m_clip->properties(); - QString new_color = m_view.clip_color->color().name(); - if (new_color != QString("#" + old_props.value("colour").right(8).left(6))) - props["colour"] = "0x" + new_color.right(6) + "ff"; + if (t == COLOR) { + QMap old_props = m_clip->properties(); + QString new_color = m_view.clip_color->color().name(); + if (new_color != QString("#" + old_props.value("colour").right(8).left(6))) { + m_clipNeedsRefresh = true; + props["colour"] = "0x" + new_color.right(6) + "ff"; + } + } else if (t == SLIDESHOW) { + props["loop"] = QString::number((int) m_view.slide_loop->isChecked()); + QMap old_props = m_clip->properties(); + 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 new_path = m_view.clip_path->text() + extension; + if (new_path != old_props.value("resource")) { + m_clipNeedsRefresh = 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); + if (duration != old_props.value("ttl").toInt()) { + m_clipNeedsRefresh = true; + props["ttl"] = QString::number(duration); + props["out"] = QString::number(duration * m_count); + } + if (duration * m_count != old_props.value("out").toInt()) { + m_clipNeedsRefresh = true; + props["out"] = QString::number(duration * m_count); + } + } return props; } +bool ClipProperties::needsTimelineRefresh() const { + return m_clipNeedsRefresh; +} + +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" << "*.jpeg"; + extension = "/.all.jpg"; + break; + } + + dir.setNameFilters(filters); + QStringList result = dir.entryList(QDir::Files); + m_count = result.count(); + m_view.slide_info->setText(i18n("%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(xml, 1, 240, 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); +} + #include "clipproperties.moc" diff --git a/src/clipproperties.h b/src/clipproperties.h index c49f8b1f..843d71cf 100644 --- a/src/clipproperties.h +++ b/src/clipproperties.h @@ -34,16 +34,20 @@ class ClipProperties : public QDialog { public: ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidget * parent = 0); QMap properties(); - int clipId(); + int clipId() const; + bool needsTimelineRefresh() const; private slots: - + void parseFolder(); private: Ui::ClipProperties_UI m_view; DocClipBase *m_clip; Timecode m_tc; double m_fps; + /** used to count images in slideshow clip */ + int m_count; + bool m_clipNeedsRefresh; }; diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index e6018196..c02ed596 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -909,10 +909,10 @@ void CustomTrackView::slotUpdateClip(int clipId) { for (int i = 0; i < list.size(); ++i) { if (list.at(i)->type() == AVWIDGET) { clip = static_cast (list.at(i)); - if (clip->clipProducer() == clipId) { - clip->refreshClip(); - m_document->renderer()->mltUpdateClip(m_tracksList.count() - clip->track(), clip->startPos(), clip->xml()); - } + if (clip->clipProducer() == clipId) { + clip->refreshClip(); + m_document->renderer()->mltUpdateClip(m_tracksList.count() - clip->track(), clip->startPos(), clip->xml()); + } } } } diff --git a/src/docclipbase.cpp b/src/docclipbase.cpp index 1142ba1a..10bf7592 100644 --- a/src/docclipbase.cpp +++ b/src/docclipbase.cpp @@ -37,7 +37,7 @@ DocClipBase::DocClipBase(ClipManager *clipManager, QDomElement xml, uint id): KUrl url = KUrl(xml.attribute("resource")); int out = xml.attribute("out").toInt(); if (out != 0) { - setDuration(GenTime(out, 25)); + setDuration(GenTime(out, KdenliveSettings::project_fps())); //m_properties.insert("out", QString::number(out)); } if (m_name.isEmpty()) m_name = url.fileName(); @@ -158,8 +158,8 @@ const GenTime &DocClipBase::duration() const { const GenTime &DocClipBase::maxDuration() const { if (m_clipType == COLOR || m_clipType == IMAGE || m_clipType == TEXT || (m_clipType == SLIDESHOW && m_properties.value("loop") == "1")) { - GenTime dur(10000, KdenliveSettings::project_fps()); - return dur; + GenTime dur(10000, KdenliveSettings::project_fps()); + return dur; } return m_duration; } @@ -372,11 +372,15 @@ void DocClipBase::setProperties(QMap properties) { while (i.hasNext()) { i.next(); m_properties.insert(i.key(), i.value()); + if (i.key() == "resource") m_thumbProd->updateClipUrl(KUrl(i.value())); + else if (i.key() == "out") setDuration(GenTime(i.value().toInt(), KdenliveSettings::project_fps())); } } void DocClipBase::setProperty(QString key, QString value) { m_properties.insert(key, value); + if (key == "resource") m_thumbProd->updateClipUrl(KUrl(value)); + else if (key == "out") setDuration(GenTime(value.toInt(), KdenliveSettings::project_fps())); } QMap DocClipBase::properties() const { diff --git a/src/kthumb.cpp b/src/kthumb.cpp index 9d47cf48..5a91927c 100644 --- a/src/kthumb.cpp +++ b/src/kthumb.cpp @@ -148,6 +148,9 @@ KThumb::~KThumb() { if (thumbProducer.isRunning()) thumbProducer.exit(); } +void KThumb::updateClipUrl(KUrl url) { + m_url = url; +} //static QPixmap KThumb::getImage(KUrl url, int width, int height) { @@ -230,7 +233,7 @@ QPixmap KThumb::getImage(QDomElement xml, int frame, int width, int height) { doc.appendChild(westley); westley.appendChild(doc.importNode(xml, true)); char *tmp = Render::decodedString(doc.toString()); - kDebug()<<" - - - UPDATING THMB, XML: "<timecode(), m_activeDocument->fps(), this); if (dia.exec() == QDialog::Accepted) { m_projectList->slotUpdateClipProperties(dia.clipId(), dia.properties()); - // update clip in timeline - TrackView *currentTab = (TrackView *) m_timelineArea->currentWidget(); - currentTab->projectView()->slotUpdateClip(dia.clipId()); - + if (dia.needsTimelineRefresh()) { + // update clip occurences in timeline + TrackView *currentTab = (TrackView *) m_timelineArea->currentWidget(); + currentTab->projectView()->slotUpdateClip(dia.clipId()); + } } } diff --git a/src/projectitem.cpp b/src/projectitem.cpp index e32b3e6b..da80d71c 100644 --- a/src/projectitem.cpp +++ b/src/projectitem.cpp @@ -160,11 +160,7 @@ const KUrl ProjectItem::clipUrl() const { } void ProjectItem::changeDuration(int frames) { - m_clip->setProperty("duration", QString::number(frames)); - m_duration = GenTime(frames, 25); - setData(1, DurationRole, Timecode::getEasyTimecode(m_duration, 25)); - m_durationKnown = true; - m_clip->setDuration(m_duration); + setData(1, DurationRole, Timecode::getEasyTimecode(GenTime(frames, KdenliveSettings::project_fps()), KdenliveSettings::project_fps())); } void ProjectItem::setProperties(QMap props) { @@ -214,18 +210,16 @@ void ProjectItem::slotSetToolTip() { setToolTip(1, tip); } + void ProjectItem::setProperties(const QMap < QString, QString > &attributes, const QMap < QString, QString > &metadata) { if (attributes.contains("duration")) { if (m_clipType == AUDIO || m_clipType == VIDEO || m_clipType == AV) m_clip->setProperty("duration", attributes["duration"]); - m_duration = GenTime(attributes["duration"].toInt(), 25); - setData(1, DurationRole, Timecode::getEasyTimecode(m_duration, 25)); - m_durationKnown = true; - m_clip->setDuration(m_duration); - kDebug() << "//// LOADED CLIP, DURATION SET TO: " << m_duration.frames(25); + GenTime duration = GenTime(attributes["duration"].toInt(), KdenliveSettings::project_fps()); + setData(1, DurationRole, Timecode::getEasyTimecode(duration, KdenliveSettings::project_fps())); + m_clip->setDuration(duration); + kDebug() << "//// LOADED CLIP, DURATION SET TO: " << duration.frames(KdenliveSettings::project_fps()); } else { // No duration known, use an arbitrary one until it is. - m_duration = GenTime(0.0); - m_durationKnown = false; } diff --git a/src/projectitem.h b/src/projectitem.h index 2b52c89d..048e8a0b 100644 --- a/src/projectitem.h +++ b/src/projectitem.h @@ -57,9 +57,7 @@ public: void setProperties(QMap props); private: - GenTime m_duration; QString m_groupName; - bool m_durationKnown; CLIPTYPE m_clipType; int m_clipId; void slotSetToolTip(); diff --git a/src/projectlist.cpp b/src/projectlist.cpp index 2da1928d..e58af2d1 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -140,9 +140,10 @@ void ProjectList::slotClipSelected() { void ProjectList::slotUpdateClipProperties(int id, QMap properties) { ProjectItem *item = getItemById(id); if (item) { - slotUpdateClipProperties(item, properties); - if (properties.contains("colour")) slotRefreshClipThumbnail(item); - } + slotUpdateClipProperties(item, properties); + if (properties.contains("colour") || properties.contains("resource")) slotRefreshClipThumbnail(item); + if (properties.contains("out")) item->changeDuration(properties.value("out").toInt()); + } } void ProjectList::slotUpdateClipProperties(ProjectItem *clip, QMap properties) { @@ -421,7 +422,7 @@ void ProjectList::slotAddColorClip() { void ProjectList::slotAddSlideshowClip() { if (!m_commandStack) kDebug() << "!!!!!!!!!!!!!!!!  NO CMD STK"; - SlideshowClip *dia = new SlideshowClip(); + SlideshowClip *dia = new SlideshowClip(this); if (dia->exec() == QDialog::Accepted) { @@ -510,7 +511,7 @@ void ProjectList::slotRefreshClipThumbnail(ProjectItem *item) { int height = 40; int width = (int)(height * (double) m_render->renderWidth() / m_render->renderHeight()); QPixmap pix = KThumb::getImage(item->toXml(), item->referencedClip()->getProjectThumbFrame(), width, height); - //QPixmap pix = KThumb::getFrame(item->toXml()), 0, width, height); + //QPixmap pix = KThumb::getFrame(item->toXml()), 0, width, height); item->setIcon(0, pix); } } diff --git a/src/renderer.cpp b/src/renderer.cpp index 5f161c2a..f2fcb0ef 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -27,6 +27,7 @@ extern "C" { #include } + #include #include #include @@ -1067,7 +1068,7 @@ void Render::mltCutClip(int track, GenTime position) { void Render::mltUpdateClip(int track, GenTime position, QDomElement element) { // TODO: optimize - mltCutClip(track, position); + mltRemoveClip(track, position); mltInsertClip(track, position, element); } diff --git a/src/slideshowclip.cpp b/src/slideshowclip.cpp index 80ecf220..ea7c62f0 100644 --- a/src/slideshowclip.cpp +++ b/src/slideshowclip.cpp @@ -33,66 +33,70 @@ SlideshowClip::SlideshowClip(QWidget * parent): QDialog(parent), m_count(0) { setFont(KGlobalSettings::toolBarFont()); - //wsetCaption(i18n("Add Slideshow Clip")); + setWindowTitle(i18n("Add Slideshow Clip")); m_view.setupUi(this); m_view.clip_name->setText(i18n("Slideshow Clip")); m_view.folder_url->setMode(KFile::Directory); m_view.icon_list->setIconSize(QSize(50, 50)); 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.image_type, SIGNAL(currentIndexChanged(int)), this, SLOT(parseFolder())); m_view.image_type->addItem("JPG"); m_view.image_type->addItem("PNG"); m_view.image_type->addItem("BMP"); m_view.image_type->addItem("GIF"); m_view.clip_duration->setText("00:00:03:00"); + m_view.folder_url->setUrl(QDir::homePath()); adjustSize(); } void SlideshowClip::parseFolder() { m_view.icon_list->clear(); QDir dir(m_view.folder_url->url().path()); + QStringList filters; switch (m_view.image_type->currentIndex()) { - case TYPE_PNG: - filters << "*.png"; - break; - case TYPE_BMP: - filters << "*.bmp"; - break; - case TYPE_GIF: - filters << "*.gif"; - break; - default: - filters << "*.jpg" << "*.jpeg"; - break; + case TYPE_PNG: + filters << "*.png"; + break; + case TYPE_BMP: + filters << "*.bmp"; + break; + case TYPE_GIF: + filters << "*.gif"; + break; + default: + filters << "*.jpg" << "*.jpeg"; + break; } dir.setNameFilters(filters); 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); m_view.label_info->setText(i18n("%1 images found", m_count)); - foreach (QString path, result) { - QIcon icon(dir.filePath(path)); - QListWidgetItem *item = new QListWidgetItem(icon, KUrl(path).fileName()); - m_view.icon_list->addItem(item); + foreach(QString path, result) { + QIcon icon(dir.filePath(path)); + QListWidgetItem *item = new QListWidgetItem(icon, KUrl(path).fileName()); + m_view.icon_list->addItem(item); } } QString SlideshowClip::selectedPath() const { 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; + 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; } return m_view.folder_url->url().path() + extension; } diff --git a/src/widgets/clipproperties_ui.ui b/src/widgets/clipproperties_ui.ui index e69b4e06..487b6a53 100644 --- a/src/widgets/clipproperties_ui.ui +++ b/src/widgets/clipproperties_ui.ui @@ -285,7 +285,7 @@ 0 0 263 - 159 + 164 @@ -333,7 +333,7 @@ - + Qt::Vertical @@ -353,6 +353,13 @@ + + + + No image found + + + -- 2.39.2