#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();
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"))
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);
}
adjustSize();
}
-int ClipProperties::clipId() {
+int ClipProperties::clipId() const {
return m_clip->getId();
}
QMap <QString, QString> 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 <QString, QString> 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 <QString, QString> 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 <QString, QString> 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 <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);
+}
+
#include "clipproperties.moc"
public:
ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidget * parent = 0);
QMap <QString, QString> 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;
};
for (int i = 0; i < list.size(); ++i) {
if (list.at(i)->type() == AVWIDGET) {
clip = static_cast <ClipItem *>(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());
+ }
}
}
}
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();
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;
}
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 <QString, QString> DocClipBase::properties() const {
if (thumbProducer.isRunning()) thumbProducer.exit();
}
+void KThumb::updateClipUrl(KUrl url) {
+ m_url = url;
+}
//static
QPixmap KThumb::getImage(KUrl url, int width, int height) {
doc.appendChild(westley);
westley.appendChild(doc.importNode(xml, true));
char *tmp = Render::decodedString(doc.toString());
- kDebug()<<" - - - UPDATING THMB, XML: "<<doc.toString();
+ kDebug() << " - - - UPDATING THMB, XML: " << doc.toString();
Mlt::Producer producer(profile, "westley-xml", tmp);
delete[] tmp;
public slots:
void extractImage(int frame, int frame2);
+ void updateClipUrl(KUrl url);
static QPixmap getImage(KUrl url, int width, int height);
static QPixmap getImage(QDomElement xml, int frame, int width, int height);
/* void getImage(KUrl url, int frame, int width, int height);
void getAudioThumbs(int channel, double frame, double frameLength, int arrayWidth);
static QPixmap getImage(KUrl url, int frame, int width, int height);
static QPixmap getFrame(Mlt::Producer* producer, int frame, int width, int height);
+
protected:
virtual void customEvent(QEvent * event);
ClipProperties dia(clip, m_activeDocument->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());
+ }
}
}
}
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 <QString, QString> props) {
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;
}
void setProperties(QMap <QString, QString> props);
private:
- GenTime m_duration;
QString m_groupName;
- bool m_durationKnown;
CLIPTYPE m_clipType;
int m_clipId;
void slotSetToolTip();
void ProjectList::slotUpdateClipProperties(int id, QMap <QString, QString> 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 <QString, QString> properties) {
void ProjectList::slotAddSlideshowClip() {
if (!m_commandStack) kDebug() << "!!!!!!!!!!!!!!!! NO CMD STK";
- SlideshowClip *dia = new SlideshowClip();
+ SlideshowClip *dia = new SlideshowClip(this);
if (dia->exec() == QDialog::Accepted) {
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);
}
}
extern "C" {
#include <avformat.h>
}
+
#include <QTimer>
#include <QDir>
#include <QApplication>
void Render::mltUpdateClip(int track, GenTime position, QDomElement element) {
// TODO: optimize
- mltCutClip(track, position);
+ mltRemoveClip(track, position);
mltInsertClip(track, position, element);
}
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;
}
<x>0</x>
<y>0</y>
<width>263</width>
- <height>159</height>
+ <height>164</height>
</rect>
</property>
<attribute name="title" >
<item row="3" column="1" >
<widget class="KComboBox" name="luma_file" />
</item>
- <item row="4" column="1" >
+ <item row="5" column="1" >
<spacer name="verticalSpacer_6" >
<property name="orientation" >
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
+ <item row="4" column="0" colspan="2" >
+ <widget class="QLabel" name="slide_info" >
+ <property name="text" >
+ <string>No image found</string>
+ </property>
+ </widget>
+ </item>
</layout>
</widget>
<widget class="QWidget" name="tab_advanced" >