QStringList cuts = xml.attribute("cutzones").split(";", QString::SkipEmptyParts);
for (int i = 0; i < cuts.count(); i++) {
QString z = cuts.at(i);
- addCutZone(z.section('-', 0, 0).toInt(), z.section('-', 1, 1).toInt());
+ addCutZone(z.section('-', 0, 0).toInt(), z.section('-', 1, 1).toInt(), z.section('-', 2, 2));
}
}
if (!m_cutZones.isEmpty()) {
QStringList cuts;
for (int i = 0; i < m_cutZones.size(); i++) {
- cuts << QString::number(m_cutZones.at(i).x()) + "-" + QString::number(m_cutZones.at(i).y());
+ cuts << QString::number(m_cutZones.at(i).zone.x()) + "-" + QString::number(m_cutZones.at(i).zone.y()) + "-" + m_cutZones.at(i).description;
}
clip.setAttribute("cutzones", cuts.join(";"));
}
return m_placeHolder;
}
-void DocClipBase::addCutZone(int in, int out)
+void DocClipBase::addCutZone(int in, int out, QString desc)
{
- if (!m_cutZones.contains(QPoint(in, out))) {
- m_cutZones.append(QPoint(in, out));
- }
+ CutZoneInfo info;
+ info.zone = QPoint(in, out);
+ info.description = desc;
+ for (int i = 0; i < m_cutZones.count(); i++)
+ if (m_cutZones.at(i).zone == info.zone) {
+ return;
+ }
+ m_cutZones.append(info);
}
bool DocClipBase::hasCutZone(QPoint p) const
{
- return m_cutZones.contains(p);
+ for (int i = 0; i < m_cutZones.count(); i++)
+ if (m_cutZones.at(i).zone == p) return true;
+ return false;
}
void DocClipBase::removeCutZone(int in, int out)
{
- m_cutZones.removeAll(QPoint(in, out));
+ QPoint p(in, out);
+ for (int i = 0; i < m_cutZones.count(); i++) {
+ if (m_cutZones.at(i).zone == p) m_cutZones.removeAt(i);
+ i--;
+ }
}
-void DocClipBase::updateCutZone(int oldin, int oldout, int in, int out)
+void DocClipBase::updateCutZone(int oldin, int oldout, int in, int out, QString desc)
{
QPoint old(oldin, oldout);
for (int i = 0; i < m_cutZones.size(); ++i) {
- if (m_cutZones.at(i) == old) {
- m_cutZones.replace(i, QPoint(in, out));
+ if (m_cutZones.at(i).zone == old) {
+ CutZoneInfo info;
+ info.zone = QPoint(in, out);
+ info.description = desc;
+ m_cutZones.replace(i, info);
break;
}
}
}
-QList <QPoint> DocClipBase::cutZones() const
+QList <CutZoneInfo> DocClipBase::cutZones() const
{
return m_cutZones;
}
class Producer;
};
+struct CutZoneInfo {
+ QPoint zone;
+ QString description;
+};
+
class DocClipBase: public QObject
{
bool isPlaceHolder() const;
static QString getHash(const QString &path);
- void addCutZone(int in, int out);
+ void addCutZone(int in, int out, QString desc = QString());
bool hasCutZone(QPoint p) const;
void removeCutZone(int in, int out);
- QList <QPoint> cutZones() const;
- void updateCutZone(int oldin, int oldout, int in, int out);
+ QList <CutZoneInfo> cutZones() const;
+ void updateCutZone(int oldin, int oldout, int in, int out, QString desc = QString());
private: // Private attributes
/** Wheter the clip is a placeholder (clip missing but user wants to see it) */
bool m_placeHolder;
- QList <QPoint> m_cutZones;
+ QList <CutZoneInfo> m_cutZones;
void setAudioThumbCreated(bool isDone);
/** Holds clip infos like fps, size,... */
{
setSizeHint(0, QSize(65, QFontInfo(font(1)).pixelSize() * 2));
setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsEditable);
- setIcon(0, KIcon("folder").pixmap(sizeHint(0)));
+ setData(0, Qt::DecorationRole, KIcon("folder").pixmap(sizeHint(0)));
+ //setIcon(0, KIcon("folder").pixmap(sizeHint(0)));
setToolTip(0, "<b>" + i18n("Folder"));
//setFlags(Qt::NoItemFlags);
//kDebug() << "Constructed with clipId: " << m_clipId;
m_projectList->setRenderer(m_projectMonitor->render);
//connect(m_projectList, SIGNAL(receivedClipDuration(const QString &)), this, SLOT(slotUpdateClip(const QString &)));
connect(m_projectList, SIGNAL(showClipProperties(DocClipBase *)), this, SLOT(slotShowClipProperties(DocClipBase *)));
- connect(m_projectList, SIGNAL(getFileProperties(const QDomElement, const QString &, bool)), m_projectMonitor->render, SLOT(getFileProperties(const QDomElement, const QString &, bool)));
+ connect(m_projectList, SIGNAL(getFileProperties(const QDomElement, const QString &, int, bool)), m_projectMonitor->render, SLOT(getFileProperties(const QDomElement, const QString &, int, bool)));
connect(m_projectMonitor->render, SIGNAL(replyGetImage(const QString &, const QPixmap &)), m_projectList, SLOT(slotReplyGetImage(const QString &, const QPixmap &)));
connect(m_projectMonitor->render, SIGNAL(replyGetFileProperties(const QString &, Mlt::Producer*, const QMap < QString, QString > &, const QMap < QString, QString > &, bool)), m_projectList, SLOT(slotReplyGetFileProperties(const QString &, Mlt::Producer*, const QMap < QString, QString > &, const QMap < QString, QString > &, bool)));
}
//requestClipInfo(item->toXml(), item->clipId(), true);
// Clear the file_hash value, which will cause a complete reload of the clip
- emit getFileProperties(item->toXml(), item->clipId(), true);
+ emit getFileProperties(item->toXml(), item->clipId(), m_listView->iconSize().height(), true);
}
}
}
{
if (item->type() == PROJECTSUBCLIPTYPE) {
// this is a sub-item
+ if (column == 1) {
+ // user edited description
+ SubProjectItem *sub = static_cast <SubProjectItem*>(item);
+ //slotUpdateCutClipProperties(sub->clipId(), sub->zone(), sub->text(1), sub->text(1));
+ }
return;
}
if (item->type() == PROJECTFOLDERTYPE) {
if (getProperties == false && !clip->getClipHash().isEmpty()) {
QString cachedPixmap = m_doc->projectFolder().path(KUrl::AddTrailingSlash) + "thumbs/" + clip->getClipHash() + ".png";
if (QFile::exists(cachedPixmap)) {
- item->setIcon(0, QPixmap(cachedPixmap));
+ item->setData(0, Qt::DecorationRole, QPixmap(cachedPixmap));
}
}
#ifdef NEPOMUK
}
#endif
// Add cut zones
- QList <QPoint> cuts = clip->cutZones();
+ QList <CutZoneInfo> cuts = clip->cutZones();
if (!cuts.isEmpty()) {
for (int i = 0; i < cuts.count(); i++) {
- SubProjectItem *sub = new SubProjectItem(item, cuts.at(i).x(), cuts.at(i).y());
+ SubProjectItem *sub = new SubProjectItem(item, cuts.at(i).zone.x(), cuts.at(i).zone.y(), cuts.at(i).description);
if (!clip->getClipHash().isEmpty()) {
- QString cachedPixmap = m_doc->projectFolder().path(KUrl::AddTrailingSlash) + "thumbs/" + clip->getClipHash() + '#' + QString::number(cuts.at(i).x()) + ".png";
+ QString cachedPixmap = m_doc->projectFolder().path(KUrl::AddTrailingSlash) + "thumbs/" + clip->getClipHash() + '#' + QString::number(cuts.at(i).zone.x()) + ".png";
if (QFile::exists(cachedPixmap)) {
- sub->setIcon(0, QPixmap(cachedPixmap));
+ sub->setData(0, Qt::DecorationRole, QPixmap(cachedPixmap));
}
}
}
const QDomElement dom = j.value();
const QString id = j.key();
m_infoQueue.remove(j.key());
- emit getFileProperties(dom, id, false);
+ emit getFileProperties(dom, id, m_listView->iconSize().height(), false);
}
}
if ((*it)->type() == PROJECTSUBCLIPTYPE) {
// subitem
SubProjectItem *sub = static_cast <SubProjectItem *>(*it);
- if (sub->icon(0).isNull()) {
+ if (sub->data(0, Qt::DecorationRole).isNull()) {
item = static_cast <ProjectItem *>((*it)->parent());
requestClipThumbnail(item->clipId() + '#' + QString::number(sub->zone().x()));
}
requestClipInfo(clip->toXML(), clip->getId());
} else item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
} else {
- if (item->icon(0).isNull()) {
+ if (item->data(0, Qt::DecorationRole).isNull()) {
requestClipThumbnail(clip->getId());
}
if (item->data(0, DurationRole).toString().isEmpty()) {
return;
}
QPixmap pix;
- int height = it->sizeHint(0).height();
+ int height = m_listView->iconSize().height();
int width = (int)(height * m_render->dar());
if (clip->clipType() == AUDIO) pix = KIcon("audio-x-generic").pixmap(QSize(width, height));
else if (clip->clipType() == IMAGE) pix = QPixmap::fromImage(KThumb::getFrame(item->referencedClip()->producer(), 0, width, height));
if (!pix.isNull()) {
m_listView->blockSignals(true);
- it->setIcon(0, pix);
+ it->setData(0, Qt::DecorationRole, pix);
if (m_listView->isEnabled()) m_listView->blockSignals(false);
if (!isSubItem) m_doc->cachePixmap(item->getClipHash(), pix);
else m_doc->cachePixmap(item->getClipHash() + '#' + QString::number(frame), pix);
delete producer;
}*/
if (m_listView->isEnabled()) m_listView->blockSignals(false);
- if (item->icon(0).isNull()) {
+ /*if (item->icon(0).isNull()) {
requestClipThumbnail(clipId);
- }
+ }*/
} else kDebug() << "//////// COULD NOT FIND CLIP TO UPDATE PRPS...";
int max = m_doc->clipManager()->clipsCount();
emit displayMessage(i18n("Loading clips"), (int)(100 *(max - m_infoQueue.count()) / max));
ProjectItem *item = getItemById(clipId);
if (item && !pix.isNull()) {
m_listView->blockSignals(true);
- item->setIcon(0, pix);
+ item->setData(0, Qt::DecorationRole, pix);
m_doc->cachePixmap(item->getClipHash(), pix);
if (m_listView->isEnabled()) m_listView->blockSignals(false);
}
SubProjectItem *sub = new SubProjectItem(clip, in, out);
QPixmap p = clip->referencedClip()->thumbProducer()->extractImage(in, (int)(sub->sizeHint(0).height() * m_render->dar()), sub->sizeHint(0).height() - 2);
- sub->setIcon(0, p);
+ sub->setData(0, Qt::DecorationRole, p);
m_doc->cachePixmap(clip->getClipHash() + '#' + QString::number(in), p);
m_listView->blockSignals(false);
}
signals:
void clipSelected(DocClipBase *, QPoint zone = QPoint());
- void getFileProperties(const QDomElement, const QString &, bool);
+ void getFileProperties(const QDomElement, const QString &, int pixHeight, bool);
void receivedClipDuration(const QString &);
void showClipProperties(DocClipBase *);
void projectModified();
}
if (it->type() == PROJECTSUBCLIPTYPE) {
// subitem
+ if ((columnAt(event->pos().x()) == 1)) {
+ QTreeWidget::mouseDoubleClickEvent(event);
+ return;
+ }
item = static_cast <ProjectItem *>(it->parent());
} else item = static_cast <ProjectItem *>(it);
data.append(list.join(";").toUtf8());
mimeData->setData("kdenlive/clip", data);
drag->setMimeData(mimeData);
- drag->setPixmap(clickItem->icon(0).pixmap(iconSize()));
+ drag->setPixmap(clickItem->data(0, Qt::DecorationRole).value<QPixmap>());
drag->setHotSpot(QPoint(0, 50));
drag->exec();
}
//mimeData->setText(ids.join(";")); //doc.toString());
//mimeData->setImageData(image);
drag->setMimeData(mimeData);
- drag->setPixmap(it->icon(0).pixmap(iconSize()));
+ drag->setPixmap(it->data(0, Qt::DecorationRole).value<QPixmap>());
drag->setHotSpot(QPoint(0, 50));
drag->exec();
}
//delete m_osdInfo;
}
+void Render::slotSwitchFullscreen()
+{
+ if (m_mltConsumer) m_mltConsumer->set("full_screen", 1);
+}
+
void Render::buildConsumer(const QString profileName)
{
char *tmp;
}
}
-void Render::getFileProperties(const QDomElement xml, const QString &clipId, bool replaceProducer)
+void Render::getFileProperties(const QDomElement xml, const QString &clipId, int imageHeight, bool replaceProducer)
{
KUrl url = KUrl(xml.attribute("resource", QString()));
Mlt::Producer *producer = NULL;
return;
}
- int height = 50;
- int width = (int)(height * m_mltProfile->dar());
+ int width = (int)(imageHeight * m_mltProfile->dar());
QMap < QString, QString > filePropertyMap;
QMap < QString, QString > metadataPropertyMap;
mlt_image_format format = mlt_image_rgb24a;
int frame_width = width;
- int frame_height = height;
- QPixmap pix(width, height);
+ int frame_height = imageHeight;
+ QPixmap pix(width, imageHeight);
uint8_t *data = frame->get_image(format, frame_width, frame_height, 0);
QImage image((uchar *)data, frame_width, frame_height, QImage::Format_ARGB32);
emit replyGetImage(clipId, pix);
} else if (frame->get_int("test_audio") == 0) {
- QPixmap pixmap = KIcon("audio-x-generic").pixmap(QSize(width, height));
+ QPixmap pixmap = KIcon("audio-x-generic").pixmap(QSize(width, imageHeight));
emit replyGetImage(clipId, pixmap);
filePropertyMap["type"] = "audio";
}
while (trackNb > 1) {
Mlt::Producer trackProducer(tractor->track(trackNb - 1));
trackDuration = trackProducer.get_playtime() - 1;
- //kDebug() << " / / /DURATON FOR TRACK " << trackNb - 1 << " = " << trackDuration;
+ // kDebug() << " / / /DURATON FOR TRACK " << trackNb - 1 << " = " << trackDuration;
if (trackDuration > duration) duration = trackDuration;
trackNb--;
}
/** Wraps the VEML command of the same name. Requests the file properties
for the specified url from the renderer. Upon return, the result will be emitted
via replyGetFileProperties(). */
- void getFileProperties(const QDomElement xml, const QString &clipId, bool replaceProducer = true);
+ void getFileProperties(const QDomElement xml, const QString &clipId, int imageHeight, bool replaceProducer = true);
void exportFileToFirewire(QString srcFileName, int port, GenTime startTime, GenTime endTime);
static char *decodedString(QString str);
void mltSavePlaylist();
void slotSplitView(bool doit);
+ void slotSwitchFullscreen();
};
#endif
const int DurationRole = Qt::UserRole + 1;
-SubProjectItem::SubProjectItem(QTreeWidgetItem * parent, int in, int out) :
+SubProjectItem::SubProjectItem(QTreeWidgetItem * parent, int in, int out, QString description) :
QTreeWidgetItem(parent, PROJECTSUBCLIPTYPE), m_in(in), m_out(out)
{
setSizeHint(0, QSize(65, 30));
setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsEditable);
QString name = Timecode::getStringTimecode(in, KdenliveSettings::project_fps());
setText(0, name);
+ setText(1, description);
GenTime duration = GenTime(out - in, KdenliveSettings::project_fps());
if (duration != GenTime()) setData(0, DurationRole, Timecode::getEasyTimecode(duration, KdenliveSettings::project_fps()));
//setFlags(Qt::NoItemFlags);
class SubProjectItem : public QTreeWidgetItem
{
public:
- SubProjectItem(QTreeWidgetItem * parent, int in, int out);
+ SubProjectItem(QTreeWidgetItem * parent, int in, int out, QString description = QString());
virtual ~SubProjectItem();
QDomElement toXml() const;
int numReferences() const;