From 7fff167fb95bb6b13b138b8d3f7b68da8a030473 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Wed, 27 Aug 2008 21:38:16 +0000 Subject: [PATCH] * internal rework: switch clip id's from integer to string * improve loading of older kdenlive documents svn path=/branches/KDE4/; revision=2385 --- src/CMakeLists.txt | 2 +- src/addclipcommand.cpp | 3 +- src/addclipcommand.h | 4 +- src/addeffectcommand.cpp | 2 +- src/addfoldercommand.cpp | 4 +- src/addfoldercommand.h | 4 +- src/addmarkercommand.cpp | 3 +- src/addmarkercommand.h | 4 +- src/addtimelineclipcommand.cpp | 4 +- src/addtimelineclipcommand.h | 4 +- src/addtransitioncommand.cpp | 2 +- src/changespeedcommand.cpp | 4 +- src/changespeedcommand.h | 4 +- src/clipitem.cpp | 4 +- src/clipitem.h | 4 +- src/clipmanager.cpp | 30 +++--- src/clipmanager.h | 16 ++-- src/clipproperties.cpp | 11 +-- src/clipproperties.h | 4 +- src/customtrackview.cpp | 24 ++--- src/customtrackview.h | 12 +-- src/docclipbase.cpp | 7 +- src/docclipbase.h | 8 +- src/editeffectcommand.cpp | 2 +- src/editfoldercommand.cpp | 4 +- src/editfoldercommand.h | 4 +- src/editguidecommand.cpp | 1 - src/editkeyframecommand.cpp | 1 - src/edittransitioncommand.cpp | 1 - src/kdenlivedoc.cpp | 166 +++++++++++++++++++++++---------- src/kdenlivedoc.h | 54 +++++------ src/mainwindow.cpp | 38 ++++---- src/mainwindow.h | 2 +- src/monitor.h | 2 +- src/projectitem.cpp | 43 +-------- src/projectitem.h | 8 +- src/projectlist.cpp | 40 ++++---- src/projectlist.h | 26 +++--- src/projectlistview.cpp | 10 +- src/renderer.cpp | 6 +- src/renderer.h | 10 +- src/trackview.cpp | 6 +- src/trackview.h | 2 +- src/video-mlt-playlist.svgz | Bin 0 -> 7725 bytes 44 files changed, 307 insertions(+), 283 deletions(-) create mode 100644 src/video-mlt-playlist.svgz diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0e61d255..c6ca1f16 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -150,6 +150,6 @@ install(TARGETS kdenlive DESTINATION ${BIN_INSTALL_DIR}) install( FILES kdenliveui.rc DESTINATION ${DATA_INSTALL_DIR}/kdenlive ) install (FILES kdenlivesettings.kcfg DESTINATION share/config.kcfg) install (FILES kdenlive.desktop DESTINATION share/applications/kde) -install (FILES application-x-kdenlive.svgz DESTINATION share/icons/oxygen/scalable/mimetypes) +install (FILES application-x-kdenlive.svgz video-mlt-playlist.svgz DESTINATION share/icons/oxygen/scalable/mimetypes) diff --git a/src/addclipcommand.cpp b/src/addclipcommand.cpp index cda6a485..1807e38c 100644 --- a/src/addclipcommand.cpp +++ b/src/addclipcommand.cpp @@ -22,7 +22,7 @@ #include "addclipcommand.h" #include "kdenlivedoc.h" -AddClipCommand::AddClipCommand(KdenliveDoc *doc, const QDomElement &xml, const uint id, bool doIt, QUndoCommand * parent) : QUndoCommand(parent), m_doc(doc), m_xml(xml), m_id(id), m_doIt(doIt) { +AddClipCommand::AddClipCommand(KdenliveDoc *doc, const QDomElement &xml, const QString &id, bool doIt, QUndoCommand * parent) : QUndoCommand(parent), m_doc(doc), m_xml(xml), m_id(id), m_doIt(doIt) { if (doIt) setText(i18n("Add clip")); else setText(i18n("Delete clip")); } @@ -41,4 +41,3 @@ void AddClipCommand::redo() { else m_doc->deleteClip(m_id); } -#include "addclipcommand.moc" diff --git a/src/addclipcommand.h b/src/addclipcommand.h index 3a4b3d52..7f75d8bd 100644 --- a/src/addclipcommand.h +++ b/src/addclipcommand.h @@ -29,7 +29,7 @@ class KdenliveDoc; class AddClipCommand : public QUndoCommand { public: - AddClipCommand(KdenliveDoc *list, const QDomElement &xml, const uint id, bool doIt, QUndoCommand * parent = 0); + AddClipCommand(KdenliveDoc *list, const QDomElement &xml, const QString &id, bool doIt, QUndoCommand * parent = 0); virtual void undo(); virtual void redo(); @@ -37,7 +37,7 @@ public: private: KdenliveDoc *m_doc; QDomElement m_xml; - uint m_id; + QString m_id; bool m_doIt; }; diff --git a/src/addeffectcommand.cpp b/src/addeffectcommand.cpp index e9e48c18..d5564868 100644 --- a/src/addeffectcommand.cpp +++ b/src/addeffectcommand.cpp @@ -45,4 +45,4 @@ void AddEffectCommand::redo() { else m_view->deleteEffect(m_track, m_pos, m_effect); } -#include "addeffectcommand.moc" + diff --git a/src/addfoldercommand.cpp b/src/addfoldercommand.cpp index a64a218b..7b881c5d 100644 --- a/src/addfoldercommand.cpp +++ b/src/addfoldercommand.cpp @@ -22,7 +22,7 @@ #include "addfoldercommand.h" #include "kdenlivedoc.h" -AddFolderCommand::AddFolderCommand(KdenliveDoc *doc, const QString folderName, int clipId, bool doIt) +AddFolderCommand::AddFolderCommand(KdenliveDoc *doc, const QString folderName, const QString &clipId, bool doIt) : m_doc(doc), m_name(folderName), m_id(clipId), m_doIt(doIt) { if (doIt) setText(i18n("Add folder")); else setText(i18n("Delete folder")); @@ -39,4 +39,4 @@ void AddFolderCommand::redo() { else m_doc->deleteFolder(m_name, m_id); } -#include "addfoldercommand.moc" + diff --git a/src/addfoldercommand.h b/src/addfoldercommand.h index a9122b3c..b7d4cc96 100644 --- a/src/addfoldercommand.h +++ b/src/addfoldercommand.h @@ -27,7 +27,7 @@ class KdenliveDoc; class AddFolderCommand : public QUndoCommand { public: - AddFolderCommand(KdenliveDoc *doc, const QString folderName, int clipId, bool doIt); + AddFolderCommand(KdenliveDoc *doc, const QString folderName, const QString &clipId, bool doIt); virtual void undo(); virtual void redo(); @@ -35,7 +35,7 @@ public: private: KdenliveDoc *m_doc; QString m_name; - int m_id; + QString m_id; bool m_doIt; }; diff --git a/src/addmarkercommand.cpp b/src/addmarkercommand.cpp index 5dc764f6..da747f14 100644 --- a/src/addmarkercommand.cpp +++ b/src/addmarkercommand.cpp @@ -19,7 +19,7 @@ #include "addmarkercommand.h" #include "customtrackview.h" -AddMarkerCommand::AddMarkerCommand(CustomTrackView *view, const QString &oldcomment, const QString &comment, const int id, const GenTime &pos, bool doIt, QUndoCommand * parent) : QUndoCommand(parent), m_view(view), m_oldcomment(oldcomment), m_comment(comment), m_id(id), m_pos(pos), m_doIt(doIt) { +AddMarkerCommand::AddMarkerCommand(CustomTrackView *view, const QString &oldcomment, const QString &comment, const QString &id, const GenTime &pos, bool doIt, QUndoCommand * parent) : QUndoCommand(parent), m_view(view), m_oldcomment(oldcomment), m_comment(comment), m_id(id), m_pos(pos), m_doIt(doIt) { if (m_comment.isEmpty()) setText(i18n("Delete marker")); else if (m_oldcomment.isEmpty()) setText(i18n("Add marker")); else setText(i18n("Edit marker")); @@ -38,4 +38,3 @@ void AddMarkerCommand::redo() { m_doIt = true; } -#include "addmarkercommand.moc" diff --git a/src/addmarkercommand.h b/src/addmarkercommand.h index cc16bf61..cb539dac 100644 --- a/src/addmarkercommand.h +++ b/src/addmarkercommand.h @@ -31,7 +31,7 @@ class CustomTrackView; class AddMarkerCommand : public QUndoCommand { public: - AddMarkerCommand(CustomTrackView *view, const QString &oldcomment, const QString &comment, const int id, const GenTime &pos, bool doIt, QUndoCommand * parent = 0); + AddMarkerCommand(CustomTrackView *view, const QString &oldcomment, const QString &comment, const QString &id, const GenTime &pos, bool doIt, QUndoCommand * parent = 0); virtual void undo(); virtual void redo(); @@ -39,7 +39,7 @@ private: CustomTrackView *m_view; QString m_oldcomment; QString m_comment; - int m_id; + QString m_id; GenTime m_pos; bool m_doIt; }; diff --git a/src/addtimelineclipcommand.cpp b/src/addtimelineclipcommand.cpp index f1d9d78f..862b9a23 100644 --- a/src/addtimelineclipcommand.cpp +++ b/src/addtimelineclipcommand.cpp @@ -22,7 +22,7 @@ #include "addtimelineclipcommand.h" #include "customtrackview.h" -AddTimelineClipCommand::AddTimelineClipCommand(CustomTrackView *view, QDomElement xml, int clipId, ItemInfo info, EffectsList effects, bool doIt, bool doRemove, QUndoCommand * parent) : QUndoCommand(parent), m_view(view), m_xml(xml), m_clipId(clipId), m_clipInfo(info), m_effects(effects), m_doIt(doIt), m_remove(doRemove) { +AddTimelineClipCommand::AddTimelineClipCommand(CustomTrackView *view, QDomElement xml, const QString &clipId, ItemInfo info, EffectsList effects, bool doIt, bool doRemove, QUndoCommand * parent) : QUndoCommand(parent), m_view(view), m_xml(xml), m_clipId(clipId), m_clipInfo(info), m_effects(effects), m_doIt(doIt), m_remove(doRemove) { if (!m_remove) setText(i18n("Add timeline clip")); else setText(i18n("Delete timeline clip")); } @@ -42,4 +42,4 @@ void AddTimelineClipCommand::redo() { m_doIt = true; } -#include "addtimelineclipcommand.moc" + diff --git a/src/addtimelineclipcommand.h b/src/addtimelineclipcommand.h index 9d596808..b4c3edb0 100644 --- a/src/addtimelineclipcommand.h +++ b/src/addtimelineclipcommand.h @@ -35,7 +35,7 @@ class CustomTrackView; class AddTimelineClipCommand : public QUndoCommand { public: - AddTimelineClipCommand(CustomTrackView *view, QDomElement xml, int clipId, ItemInfo info, EffectsList effects, bool doIt, bool doRemove, QUndoCommand * parent = 0); + AddTimelineClipCommand(CustomTrackView *view, QDomElement xml, const QString &clipId, ItemInfo info, EffectsList effects, bool doIt, bool doRemove, QUndoCommand * parent = 0); virtual void undo(); virtual void redo(); @@ -43,7 +43,7 @@ private: CustomTrackView *m_view; ItemInfo m_clipInfo; EffectsList m_effects; - int m_clipId; + QString m_clipId; QDomElement m_xml; bool m_doIt; bool m_remove; diff --git a/src/addtransitioncommand.cpp b/src/addtransitioncommand.cpp index 4d3f0750..e41adff1 100644 --- a/src/addtransitioncommand.cpp +++ b/src/addtransitioncommand.cpp @@ -39,4 +39,4 @@ void AddTransitionCommand::redo() { m_doIt = true; } -#include "addtimelineclipcommand.moc" + diff --git a/src/changespeedcommand.cpp b/src/changespeedcommand.cpp index 154b96d1..e7b66af7 100644 --- a/src/changespeedcommand.cpp +++ b/src/changespeedcommand.cpp @@ -22,7 +22,7 @@ #include "changespeedcommand.h" #include "customtrackview.h" -ChangeSpeedCommand::ChangeSpeedCommand(CustomTrackView *view, ItemInfo info, double old_speed, double new_speed, int clipId, bool doIt, QUndoCommand * parent) : QUndoCommand(parent), m_view(view), m_clipInfo(info), m_old_speed(old_speed), m_new_speed(new_speed), m_clipId(clipId), m_doIt(doIt) { +ChangeSpeedCommand::ChangeSpeedCommand(CustomTrackView *view, ItemInfo info, double old_speed, double new_speed, const QString &clipId, bool doIt, QUndoCommand * parent) : QUndoCommand(parent), m_view(view), m_clipInfo(info), m_old_speed(old_speed), m_new_speed(new_speed), m_clipId(clipId), m_doIt(doIt) { setText(i18n("Adjust clip length")); } @@ -39,4 +39,4 @@ void ChangeSpeedCommand::redo() { m_doIt = true; } -#include "changespeedcommand.moc" + diff --git a/src/changespeedcommand.h b/src/changespeedcommand.h index c360716f..a95463cb 100644 --- a/src/changespeedcommand.h +++ b/src/changespeedcommand.h @@ -32,14 +32,14 @@ class CustomTrackView; class ChangeSpeedCommand : public QUndoCommand { public: - ChangeSpeedCommand(CustomTrackView *view, ItemInfo info, double old_speed, double new_speed, int clipId, bool doIt, QUndoCommand * parent = 0); + ChangeSpeedCommand(CustomTrackView *view, ItemInfo info, double old_speed, double new_speed, const QString &clipId, bool doIt, QUndoCommand * parent = 0); virtual void undo(); virtual void redo(); private: CustomTrackView *m_view; ItemInfo m_clipInfo; - int m_clipId; + QString m_clipId; bool m_doIt; double m_old_speed; double m_new_speed; diff --git a/src/clipitem.cpp b/src/clipitem.cpp index fadf4228..b7fbfbdb 100644 --- a/src/clipitem.cpp +++ b/src/clipitem.cpp @@ -67,7 +67,7 @@ ClipItem::ClipItem(DocClipBase *clip, ItemInfo info, double fps) connect(this , SIGNAL(prepareAudioThumb(double, int, int, int)) , this, SLOT(slotPrepareAudioThumb(double, int, int, int))); setBrush(QColor(141, 166, 215)); - if (m_clipType == VIDEO || m_clipType == AV || m_clipType == SLIDESHOW) { + if (m_clipType == VIDEO || m_clipType == AV || m_clipType == SLIDESHOW || m_clipType == PLAYLIST) { m_hasThumbs = true; startThumbTimer = new QTimer(this); startThumbTimer->setSingleShot(true); @@ -388,7 +388,7 @@ QString ClipItem::clipName() const { return m_clipName; } -int ClipItem::clipProducer() const { +const QString &ClipItem::clipProducer() const { return m_producer; } diff --git a/src/clipitem.h b/src/clipitem.h index 3c62293a..256f9429 100644 --- a/src/clipitem.h +++ b/src/clipitem.h @@ -49,7 +49,7 @@ public: void resizeStart(int posx); void resizeEnd(int posx); OPERATIONTYPE operationMode(QPointF pos); - int clipProducer() const; + const QString &clipProducer() const; int clipType() const; DocClipBase *baseClip() const; QString clipName() const; @@ -112,7 +112,7 @@ private: DocClipBase *m_clip; OPERATIONTYPE m_resizeMode; int m_grabPoint; - int m_producer; + QString m_producer; CLIPTYPE m_clipType; QString m_clipName; QString m_effectNames; diff --git a/src/clipmanager.cpp b/src/clipmanager.cpp index 7827c523..87990b61 100644 --- a/src/clipmanager.cpp +++ b/src/clipmanager.cpp @@ -54,11 +54,11 @@ QList ClipManager::documentClipList() { void ClipManager::addClip(DocClipBase *clip) { m_clipList.append(clip); - int id = clip->getId(); - if (id >= m_clipIdCounter) m_clipIdCounter = id + 1; + QString id = clip->getId(); + if (id.toInt() >= m_clipIdCounter) m_clipIdCounter = id.toInt() + 1; } -void ClipManager::slotDeleteClip(uint clipId) { +void ClipManager::slotDeleteClip(const QString &clipId) { for (int i = 0; i < m_clipList.count(); i++) { if (m_clipList.at(i)->getId() == clipId) { AddClipCommand *command = new AddClipCommand(m_doc, m_clipList.at(i)->toXML(), clipId, false); @@ -68,7 +68,7 @@ void ClipManager::slotDeleteClip(uint clipId) { } } -void ClipManager::deleteClip(uint clipId) { +void ClipManager::deleteClip(const QString &clipId) { for (int i = 0; i < m_clipList.count(); i++) { if (m_clipList.at(i)->getId() == clipId) { m_clipList.removeAt(i); @@ -81,7 +81,7 @@ DocClipBase *ClipManager::getClipAt(int pos) { return m_clipList.at(pos); } -DocClipBase *ClipManager::getClipById(int clipId) { +DocClipBase *ClipManager::getClipById(const QString &clipId) { //kDebug() << "++++ CLIP MAN, LOOKING FOR CLIP ID: " << clipId; for (int i = 0; i < m_clipList.count(); i++) { if (m_clipList.at(i)->getId() == clipId) { @@ -92,7 +92,7 @@ DocClipBase *ClipManager::getClipById(int clipId) { return NULL; } -void ClipManager::slotAddClipList(const KUrl::List urls, const QString group, const int groupId) { +void ClipManager::slotAddClipList(const KUrl::List urls, const QString group, const QString &groupId) { QUndoCommand *addClips = new QUndoCommand(); addClips->setText("Add clips"); @@ -113,13 +113,13 @@ void ClipManager::slotAddClipList(const KUrl::List urls, const QString group, co prod.setAttribute("in", "0"); prod.setAttribute("out", m_doc->getFramePos(KdenliveSettings::image_duration()) - 1); } - new AddClipCommand(m_doc, prod, id, true, addClips); + new AddClipCommand(m_doc, prod, QString::number(id), true, addClips); } } m_doc->commandStack()->push(addClips); } -void ClipManager::slotAddClipFile(const KUrl url, const QString group, const int groupId) { +void ClipManager::slotAddClipFile(const KUrl url, const QString group, const QString &groupId) { kDebug() << "///// CLIP MANAGER, ADDING CLIP: " << url; QDomDocument doc; QDomElement prod = doc.createElement("producer"); @@ -136,11 +136,11 @@ void ClipManager::slotAddClipFile(const KUrl url, const QString group, const int prod.setAttribute("in", "0"); prod.setAttribute("out", m_doc->getFramePos(KdenliveSettings::image_duration()) - 1); } - AddClipCommand *command = new AddClipCommand(m_doc, prod, id, true); + AddClipCommand *command = new AddClipCommand(m_doc, prod, QString::number(id), true); m_doc->commandStack()->push(command); } -void ClipManager::slotAddColorClipFile(const QString name, const QString color, QString duration, const QString group, const int groupId) { +void ClipManager::slotAddColorClipFile(const QString name, const QString color, QString duration, const QString group, const QString &groupId) { QDomDocument doc; QDomElement prod = doc.createElement("producer"); prod.setAttribute("mlt_service", "colour"); @@ -155,11 +155,11 @@ void ClipManager::slotAddColorClipFile(const QString name, const QString color, prod.setAttribute("groupname", group); prod.setAttribute("groupid", groupId); } - AddClipCommand *command = new AddClipCommand(m_doc, prod, id, true); + AddClipCommand *command = new AddClipCommand(m_doc, prod, QString::number(id), true); m_doc->commandStack()->push(command); } -void ClipManager::slotAddSlideshowClipFile(const QString name, const QString path, int count, const QString duration, const bool loop, const bool fade, const QString &luma_duration, const QString &luma_file, const int softness, QString group, const int groupId) { +void ClipManager::slotAddSlideshowClipFile(const QString name, const QString path, int count, const QString duration, const bool loop, const bool fade, const QString &luma_duration, const QString &luma_file, const int softness, QString group, const QString &groupId) { QDomDocument doc; QDomElement prod = doc.createElement("producer"); prod.setAttribute("resource", path); @@ -179,13 +179,13 @@ void ClipManager::slotAddSlideshowClipFile(const QString name, const QString pat prod.setAttribute("groupname", group); prod.setAttribute("groupid", groupId); } - AddClipCommand *command = new AddClipCommand(m_doc, prod, id, true); + AddClipCommand *command = new AddClipCommand(m_doc, prod, QString::number(id), true); m_doc->commandStack()->push(command); } -void ClipManager::slotAddTextClipFile(const QString path, const QString xml, const QString group, const int groupId) { +void ClipManager::slotAddTextClipFile(const QString path, const QString xml, const QString group, const QString &groupId) { kDebug() << "///// CLIP MANAGER, ADDING CLIP: " << path; QDomDocument doc; QDomElement prod = doc.createElement("producer"); @@ -202,7 +202,7 @@ void ClipManager::slotAddTextClipFile(const QString path, const QString xml, con prod.setAttribute("transparency", "1"); prod.setAttribute("in", "0"); prod.setAttribute("out", m_doc->getFramePos(KdenliveSettings::image_duration()) - 1); - AddClipCommand *command = new AddClipCommand(m_doc, prod, id, true); + AddClipCommand *command = new AddClipCommand(m_doc, prod, QString::number(id), true); m_doc->commandStack()->push(command); } diff --git a/src/clipmanager.h b/src/clipmanager.h index b6718709..95a8ccea 100644 --- a/src/clipmanager.h +++ b/src/clipmanager.h @@ -47,14 +47,14 @@ Q_OBJECT public: virtual ~ ClipManager(); void addClip(DocClipBase *clip); DocClipBase *getClipAt(int pos); - void deleteClip(uint clipId); - void slotAddClipFile(const KUrl url, const QString group, const int groupId); - void slotAddClipList(const KUrl::List urls, const QString group, const int groupId); - void slotAddTextClipFile(const QString path, const QString xml, const QString group, const int groupId); - void slotAddColorClipFile(const QString name, const QString color, QString duration, const QString group, const int groupId); - void slotAddSlideshowClipFile(const QString name, const QString path, int count, const QString duration, const bool loop, const bool fade, const QString &luma_duration, const QString &luma_file, const int softness, const QString group, const int groupId); - DocClipBase *getClipById(int clipId); - void slotDeleteClip(uint clipId); + void deleteClip(const QString &clipId); + void slotAddClipFile(const KUrl url, const QString group, const QString &groupId); + void slotAddClipList(const KUrl::List urls, const QString group, const QString &groupId); + void slotAddTextClipFile(const QString path, const QString xml, const QString group, const QString &groupId); + void slotAddColorClipFile(const QString name, const QString color, QString duration, const QString group, const QString &groupId); + void slotAddSlideshowClipFile(const QString name, const QString path, int count, const QString duration, const bool loop, const bool fade, const QString &luma_duration, const QString &luma_file, const int softness, const QString group, const QString &groupId); + DocClipBase *getClipById(const QString &clipId); + void slotDeleteClip(const QString & clipId); void setThumbsProgress(const QString &message, int progress); void checkAudioThumbs(); QList documentClipList(); diff --git a/src/clipproperties.cpp b/src/clipproperties.cpp index 550a8ab7..8b6c6a31 100644 --- a/src/clipproperties.cpp +++ b/src/clipproperties.cpp @@ -179,8 +179,7 @@ void ClipProperties::slotAddMarker() { CommentedTime marker(GenTime(), i18n("Marker")); MarkerDialog d(m_clip, marker, m_tc, this); if (d.exec() == QDialog::Accepted) { - int id = m_clip->getId(); - emit addMarker(id, d.newMarker().time(), d.newMarker().comment()); + emit addMarker(m_clip->getId(), d.newMarker().time(), d.newMarker().comment()); } QTimer::singleShot(500, this, SLOT(slotFillMarkersList())); } @@ -191,8 +190,7 @@ void ClipProperties::slotEditMarker() { if (pos < 0 || pos > marks.count() - 1) return; MarkerDialog d(m_clip, marks.at(pos), m_tc, this); if (d.exec() == QDialog::Accepted) { - int id = m_clip->getId(); - emit addMarker(id, d.newMarker().time(), d.newMarker().comment()); + emit addMarker(m_clip->getId(), d.newMarker().time(), d.newMarker().comment()); } QTimer::singleShot(500, this, SLOT(slotFillMarkersList())); } @@ -201,13 +199,12 @@ void ClipProperties::slotDeleteMarker() { QList < CommentedTime > marks = m_clip->commentedSnapMarkers(); int pos = m_view.markers_list->currentIndex().row(); if (pos < 0 || pos > marks.count() - 1) return; - int id = m_clip->getId(); - emit addMarker(id, marks.at(pos).time(), QString()); + emit addMarker(m_clip->getId(), marks.at(pos).time(), QString()); QTimer::singleShot(500, this, SLOT(slotFillMarkersList())); } -int ClipProperties::clipId() const { +const QString &ClipProperties::clipId() const { return m_clip->getId(); } diff --git a/src/clipproperties.h b/src/clipproperties.h index aa5c8e21..e90fd3b7 100644 --- a/src/clipproperties.h +++ b/src/clipproperties.h @@ -34,7 +34,7 @@ class ClipProperties : public QDialog { public: ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidget * parent = 0); QMap properties(); - int clipId() const; + const QString &clipId() const; bool needsTimelineRefresh() const; private slots: @@ -54,7 +54,7 @@ private: bool m_clipNeedsRefresh; signals: - void addMarker(int, GenTime, QString); + void addMarker(const QString &, GenTime, QString); }; diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index 1d14d121..a70c3c8c 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -753,8 +753,8 @@ void CustomTrackView::dragEnterEvent(QDragEnterEvent * event) { //TODO: drop of several clips for (int i = 0; i < ids.size(); ++i) { } - DocClipBase *clip = m_document->getBaseClip(ids.at(0).toInt()); - if (clip == NULL) kDebug() << " WARNING))))))))) CLIP NOT FOUND : " << ids.at(0).toInt(); + DocClipBase *clip = m_document->getBaseClip(ids.at(0)); + if (clip == NULL) kDebug() << " WARNING))))))))) CLIP NOT FOUND : " << ids.at(0); addItem(clip, event->pos()); event->acceptProposedAction(); } else QGraphicsView::dragEnterEvent(event); @@ -1095,7 +1095,7 @@ void CustomTrackView::slotSwitchTrackVideo(int ix) { m_document->renderer()->mltChangeTrackState(tracknumber, m_scene->m_tracksList.at(tracknumber - 1).isMute, m_scene->m_tracksList.at(tracknumber - 1).isBlind); } -void CustomTrackView::deleteClip(int clipId) { +void CustomTrackView::deleteClip(const QString &clipId) { QList itemList = items(); for (int i = 0; i < itemList.count(); i++) { if (itemList.at(i)->type() == AVWIDGET) { @@ -1410,7 +1410,7 @@ void CustomTrackView::changeClipSpeed() { m_commandStack->push(changeSelected); } -void CustomTrackView::doChangeClipSpeed(ItemInfo info, double speed, int id) { +void CustomTrackView::doChangeClipSpeed(ItemInfo info, double speed, const QString &id) { DocClipBase *baseclip = m_document->clipManager()->getClipById(id); ClipItem *item = getClipItemAt((int) info.startPos.frames(m_document->fps()) + 1, info.track); info.track = m_scene->m_tracksList.count() - item->track(); @@ -1440,7 +1440,7 @@ void CustomTrackView::cutSelectedClips() { } } -void CustomTrackView::addClip(QDomElement xml, int clipId, ItemInfo info, EffectsList effects) { +void CustomTrackView::addClip(QDomElement xml, const QString &clipId, ItemInfo info, EffectsList effects) { DocClipBase *baseclip = m_document->clipManager()->getClipById(clipId); ClipItem *item = new ClipItem(baseclip, info, m_document->fps()); item->setEffectList(effects); @@ -1455,7 +1455,7 @@ void CustomTrackView::addClip(QDomElement xml, int clipId, ItemInfo info, Effect m_document->renderer()->doRefresh(); } -void CustomTrackView::slotUpdateClip(int clipId) { +void CustomTrackView::slotUpdateClip(const QString &clipId) { QList list = scene()->items(); ClipItem *clip = NULL; for (int i = 0; i < list.size(); ++i) { @@ -1718,7 +1718,7 @@ void CustomTrackView::slotAddClipMarker() { GenTime pos = GenTime(m_cursorPos, m_document->fps()); if (item->startPos() > pos || item->endPos() < pos) return; ClipItem *clip = (ClipItem *) item; - int id = clip->baseClip()->getId(); + QString id = clip->baseClip()->getId(); GenTime position = pos - item->startPos() + item->cropStart(); CommentedTime marker(position, i18n("Marker")); MarkerDialog d(clip->baseClip(), marker, m_document->timecode(), this); @@ -1727,7 +1727,7 @@ void CustomTrackView::slotAddClipMarker() { } } -void CustomTrackView::slotAddClipMarker(int id, GenTime t, QString c) { +void CustomTrackView::slotAddClipMarker(const QString &id, GenTime t, QString c) { QString oldcomment = m_document->clipManager()->getClipById(id)->markerComment(t); AddMarkerCommand *command = new AddMarkerCommand(this, oldcomment, c, id, t, true); m_commandStack->push(command); @@ -1751,7 +1751,7 @@ void CustomTrackView::slotDeleteClipMarker() { return; } ClipItem *clip = (ClipItem *) item; - int id = clip->baseClip()->getId(); + QString id = clip->baseClip()->getId(); GenTime position = pos - item->startPos() + item->cropStart(); QString comment = clip->baseClip()->markerComment(position); if (comment.isEmpty()) { @@ -1782,7 +1782,7 @@ void CustomTrackView::slotDeleteAllClipMarkers() { emit displayMessage(i18n("Clip has no markers"), ErrorMessage); return; } - int id = clip->baseClip()->getId(); + QString id = clip->baseClip()->getId(); QUndoCommand *deleteMarkers = new QUndoCommand(); deleteMarkers->setText("Delete clip markers"); @@ -1810,7 +1810,7 @@ void CustomTrackView::slotEditClipMarker() { return; } ClipItem *clip = (ClipItem *) item; - int id = clip->baseClip()->getId(); + QString id = clip->baseClip()->getId(); GenTime position = pos - item->startPos() + item->cropStart(); QString oldcomment = clip->baseClip()->markerComment(position); if (oldcomment.isEmpty()) { @@ -1835,7 +1835,7 @@ void CustomTrackView::slotEditClipMarker() { } } -void CustomTrackView::addMarker(const int id, const GenTime &pos, const QString comment) { +void CustomTrackView::addMarker(const QString &id, const GenTime &pos, const QString comment) { DocClipBase *base = m_document->clipManager()->getClipById(id); if (!comment.isEmpty()) base->addSnapMarker(pos, comment); else base->deleteSnapMarker(pos); diff --git a/src/customtrackview.h b/src/customtrackview.h index 6812e904..6ef7a437 100644 --- a/src/customtrackview.h +++ b/src/customtrackview.h @@ -56,15 +56,15 @@ public: /** move transition, startPos = (old start, old end), endPos = (new start, new end) */ void moveTransition(const ItemInfo start, const ItemInfo end); void resizeClip(const ItemInfo start, const ItemInfo end); - void addClip(QDomElement xml, int clipId, ItemInfo info, EffectsList list = EffectsList()); + void addClip(QDomElement xml, const QString &clipId, ItemInfo info, EffectsList list = EffectsList()); void deleteClip(ItemInfo info); void slotAddClipMarker(); void slotEditClipMarker(); void slotDeleteClipMarker(); void slotDeleteAllClipMarkers(); - void addMarker(const int id, const GenTime &pos, const QString comment); + void addMarker(const QString &id, const GenTime &pos, const QString comment); void setScale(double scaleFactor); - void deleteClip(int clipId); + void deleteClip(const QString &clipId); void slotAddEffect(QDomElement effect, GenTime pos, int track); void addEffect(int track, GenTime pos, QDomElement effect); void deleteEffect(int track, GenTime pos, QDomElement effect); @@ -94,7 +94,7 @@ public: void clipStart(); void clipEnd(); void changeClipSpeed(); - void doChangeClipSpeed(ItemInfo info, double speed, int id); + void doChangeClipSpeed(ItemInfo info, double speed, const QString &id); public slots: void setCursorPos(int pos, bool seek = true); @@ -111,8 +111,8 @@ public slots: void slotTransitionUpdated(Transition *, QDomElement); void slotSwitchTrackAudio(int ix); void slotSwitchTrackVideo(int ix); - void slotUpdateClip(int clipId); - void slotAddClipMarker(int id, GenTime t, QString c); + void slotUpdateClip(const QString &clipId); + void slotAddClipMarker(const QString &id, GenTime t, QString c); bool addGuide(const GenTime pos, const QString &comment); void slotAddGuide(); void slotEditGuide(CommentedTime guide); diff --git a/src/docclipbase.cpp b/src/docclipbase.cpp index 1ddf523b..3c6620cc 100644 --- a/src/docclipbase.cpp +++ b/src/docclipbase.cpp @@ -22,12 +22,11 @@ #include "kthumb.h" #include "clipmanager.h" -DocClipBase::DocClipBase(ClipManager *clipManager, QDomElement xml, uint id): +DocClipBase::DocClipBase(ClipManager *clipManager, QDomElement xml, const QString &id): m_id(id), m_description(QString()), m_refcount(0), m_audioThumbCreated(false), m_duration(GenTime()), m_thumbProd(NULL), m_audioTimer(NULL), m_clipProducer(NULL) { int type = xml.attribute("type").toInt(); m_clipType = (CLIPTYPE) type; m_name = xml.attribute("name"); - m_id = id; QDomNamedNodeMap attributes = xml.attributes(); for (unsigned int i = 0; i < attributes.count(); i++) { @@ -102,11 +101,11 @@ const QString & DocClipBase::name() const { return m_name; } -uint DocClipBase::getId() const { +const QString &DocClipBase::getId() const { return m_id; } -void DocClipBase::setId(const uint &newId) { +void DocClipBase::setId(const QString &newId) { m_id = newId; } diff --git a/src/docclipbase.h b/src/docclipbase.h index 2e9817ec..e78f2237 100644 --- a/src/docclipbase.h +++ b/src/docclipbase.h @@ -54,7 +54,7 @@ Q_OBJECT public: * done here. If a new clip type is added then it should be possible to combine it with both audio * and video. */ - DocClipBase(ClipManager *clipManager, QDomElement xml, uint id); + DocClipBase(ClipManager *clipManager, QDomElement xml, const QString &id); // DocClipBase & operator=(const DocClipBase & clip); virtual ~ DocClipBase(); @@ -74,8 +74,8 @@ Q_OBJECT public: void setProperty(QString key, QString value); /** Returns the internal unique id of the clip. */ - uint getId() const; - void setId(const uint &newId); + const QString &getId() const; + void setId(const QString &newId); //KThumb *thumbCreator; bool audioThumbCreated() const; @@ -211,7 +211,7 @@ private: // Private attributes bool m_audioThumbCreated; /** a unique numeric id */ - uint m_id; + QString m_id; void setAudioThumbCreated(bool isDone); /** Holds clip infos like fps, size,... */ QMap m_properties; diff --git a/src/editeffectcommand.cpp b/src/editeffectcommand.cpp index 2c44b0ff..84a5d226 100644 --- a/src/editeffectcommand.cpp +++ b/src/editeffectcommand.cpp @@ -57,4 +57,4 @@ void EditEffectCommand::redo() { m_view->updateEffect(m_track, m_pos, m_effect, m_stackPos); } -#include "editeffectcommand.moc" + diff --git a/src/editfoldercommand.cpp b/src/editfoldercommand.cpp index 227d759d..d54af57e 100644 --- a/src/editfoldercommand.cpp +++ b/src/editfoldercommand.cpp @@ -22,7 +22,7 @@ #include "editfoldercommand.h" #include "kdenlivedoc.h" -EditFolderCommand::EditFolderCommand(KdenliveDoc *doc, const QString newfolderName, const QString oldfolderName, int clipId, bool doIt) +EditFolderCommand::EditFolderCommand(KdenliveDoc *doc, const QString newfolderName, const QString oldfolderName, const QString &clipId, bool doIt) : m_doc(doc), m_name(newfolderName), m_oldname(oldfolderName), m_id(clipId), m_doIt(doIt) { setText(i18n("Rename folder")); } @@ -37,4 +37,4 @@ void EditFolderCommand::redo() { m_doIt = true; } -#include "editfoldercommand.moc" + diff --git a/src/editfoldercommand.h b/src/editfoldercommand.h index 87840ff5..a264df57 100644 --- a/src/editfoldercommand.h +++ b/src/editfoldercommand.h @@ -27,7 +27,7 @@ class KdenliveDoc; class EditFolderCommand : public QUndoCommand { public: - EditFolderCommand(KdenliveDoc *doc, const QString newfolderName, const QString oldfolderName, int clipId, bool doIt); + EditFolderCommand(KdenliveDoc *doc, const QString newfolderName, const QString oldfolderName, const QString &clipId, bool doIt); virtual void undo(); virtual void redo(); @@ -36,7 +36,7 @@ private: KdenliveDoc *m_doc; QString m_name; QString m_oldname; - int m_id; + QString m_id; bool m_doIt; }; diff --git a/src/editguidecommand.cpp b/src/editguidecommand.cpp index 10b2b78e..c60a90e3 100644 --- a/src/editguidecommand.cpp +++ b/src/editguidecommand.cpp @@ -39,4 +39,3 @@ void EditGuideCommand::redo() { m_doIt = true; } -#include "editguidecommand.moc" diff --git a/src/editkeyframecommand.cpp b/src/editkeyframecommand.cpp index f9dde76c..e9624471 100644 --- a/src/editkeyframecommand.cpp +++ b/src/editkeyframecommand.cpp @@ -41,4 +41,3 @@ void EditKeyFrameCommand::redo() { m_doIt = true; } -#include "editkeyframecommand.moc" diff --git a/src/edittransitioncommand.cpp b/src/edittransitioncommand.cpp index 0708d33e..92ec2d6b 100644 --- a/src/edittransitioncommand.cpp +++ b/src/edittransitioncommand.cpp @@ -52,4 +52,3 @@ void EditTransitionCommand::redo() { m_view->updateTransition(m_track, m_pos, m_oldeffect, m_effect); } -#include "editeffectcommand.moc" diff --git a/src/kdenlivedoc.cpp b/src/kdenlivedoc.cpp index ef161d8e..18e2d6b9 100644 --- a/src/kdenlivedoc.cpp +++ b/src/kdenlivedoc.cpp @@ -90,8 +90,8 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup qApp->processEvents(); } QString prodId = e.attribute("id"); - if (!e.isNull() && prodId != "black" && prodId.toInt() > 0) { - addClip(e, e.attribute("id").toInt()); + if (!e.isNull() && prodId != "black" && !prodId.startsWith("slowmotion")/*&& prodId.toInt() > 0*/) { + addClip(e, prodId); } } @@ -102,11 +102,10 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup for (int k = 0; k < maxchild; k++) { e = markerslist.at(k).toElement(); if (e.tagName() == "marker") { - int id = e.attribute("id").toInt(); - m_clipManager->getClipById(id)->addSnapMarker(GenTime(e.attribute("time").toDouble()), e.attribute("comment")); + m_clipManager->getClipById(e.attribute("id"))->addSnapMarker(GenTime(e.attribute("time").toDouble()), e.attribute("comment")); } } - m_document.removeChild(markers); + westley.removeChild(markers); } m_document.removeChild(infoXmlNode); @@ -278,7 +277,8 @@ void KdenliveDoc::convertDocument(double version) { pl.setAttribute("id", playlist_id); } track.setAttribute("producer", playlist_id); - tractor.appendChild(track); + //tractor.appendChild(track); + tractor.insertAfter(track, QDomNode()); } tractor.removeChild(multitrack); @@ -315,28 +315,90 @@ void KdenliveDoc::convertDocument(double version) { } // Fix filters format - QDomNodeList filters = m_document.elementsByTagName("filter"); - max = filters.count(); + QDomNodeList entries = m_document.elementsByTagName("entry"); + max = entries.count(); for (int i = 0; i < max; i++) { - QDomElement filt = filters.at(i).toElement(); - QDomNamedNodeMap attrs = filt.attributes(); - for (int j = 0; j < attrs.count(); j++) { - QDomAttr a = attrs.item(j).toAttr(); - if (!a.isNull()) { - kDebug() << " FILTER; adding :" << a.name() << ":" << a.value(); + QString last_id; + int effectix = 0; + QDomNode m = entries.at(i).firstChild(); + while (!m.isNull()) { + if (m.toElement().tagName() == "filter") { + QDomElement filt = m.toElement(); + QDomNamedNodeMap attrs = filt.attributes(); + QString current_id = filt.attribute("kdenlive_id"); + if (current_id != last_id) { + effectix++; + last_id = current_id; + } QDomElement e = m_document.createElement("property"); - e.setAttribute("name", a.name()); - QDomText value = m_document.createTextNode(a.value()); + e.setAttribute("name", "kdenlive_ix"); + QDomText value = m_document.createTextNode(QString::number(effectix)); e.appendChild(value); filt.appendChild(e); + for (int j = 0; j < attrs.count(); j++) { + QDomAttr a = attrs.item(j).toAttr(); + if (!a.isNull()) { + kDebug() << " FILTER; adding :" << a.name() << ":" << a.value(); + QDomElement e = m_document.createElement("property"); + e.setAttribute("name", a.name()); + QDomText value = m_document.createTextNode(a.value()); + e.appendChild(value); + filt.appendChild(e); + + } + } } + m = m.nextSibling(); } } + /* + QDomNodeList filters = m_document.elementsByTagName("filter"); + max = filters.count(); + QString last_id; + int effectix = 0; + for (int i = 0; i < max; i++) { + QDomElement filt = filters.at(i).toElement(); + QDomNamedNodeMap attrs = filt.attributes(); + QString current_id = filt.attribute("kdenlive_id"); + if (current_id != last_id) { + effectix++; + last_id = current_id; + } + QDomElement e = m_document.createElement("property"); + e.setAttribute("name", "kdenlive_ix"); + QDomText value = m_document.createTextNode(QString::number(1)); + e.appendChild(value); + filt.appendChild(e); + for (int j = 0; j < attrs.count(); j++) { + QDomAttr a = attrs.item(j).toAttr(); + if (!a.isNull()) { + kDebug() << " FILTER; adding :" << a.name() << ":" << a.value(); + QDomElement e = m_document.createElement("property"); + e.setAttribute("name", a.name()); + QDomText value = m_document.createTextNode(a.value()); + e.appendChild(value); + filt.appendChild(e); + } + } + }*/ + + // fix slowmotion + QDomNodeList producers = westley.toElement().elementsByTagName("producer"); + max = producers.count(); + for (int i = 0; i < max; i++) { + QDomElement prod = producers.at(i).toElement(); + if (prod.attribute("mlt_service") == "framebuffer") { + QString slowmotionprod = prod.attribute("resource"); + slowmotionprod.replace(':', '?'); + kDebug() << "// FOUND WRONG SLOWMO, new: " << slowmotionprod; + prod.setAttribute("resource", slowmotionprod); + } + } - // move markers to a global list + // move producers to correct place, markers to a global list, fix clip descriptions QDomElement markers = m_document.createElement("markers"); - QDomNodeList producers = m_document.elementsByTagName("producer"); + producers = m_document.elementsByTagName("producer"); max = producers.count(); for (int i = 0; i < max; i++) { QDomElement prod = producers.at(0).toElement(); @@ -350,6 +412,12 @@ void KdenliveDoc::convertDocument(double version) { markers.insertAfter(mark, QDomNode()); } prod.removeChild(m); + } else if (m.isText()) { + QString comment = m.nodeValue(); + if (!comment.isEmpty()) { + prod.setAttribute("description", comment); + } + prod.removeChild(m); } int duration = prod.attribute("duration").toInt(); if (duration > 0) prod.setAttribute("out", QString::number(duration)); @@ -465,7 +533,7 @@ Render *KdenliveDoc::renderer() { return m_render; } -void KdenliveDoc::updateClip(int id) { +void KdenliveDoc::updateClip(const QString &id) { emit updateClipDisplay(id); } @@ -479,13 +547,13 @@ int KdenliveDoc::getFramePos(QString duration) { return m_timecode.getFrameCount(duration, m_fps); } -QString KdenliveDoc::producerName(int id) { +QString KdenliveDoc::producerName(const QString &id) { QString result = "unnamed"; QDomNodeList prods = producersList(); int ct = prods.count(); for (int i = 0; i < ct ; i++) { QDomElement e = prods.item(i).toElement(); - if (e.attribute("id") != "black" && e.attribute("id").toInt() == id) { + if (e.attribute("id") != "black" && e.attribute("id") == id) { result = e.attribute("name"); if (result.isEmpty()) result = KUrl(e.attribute("resource")).fileName(); break; @@ -494,25 +562,25 @@ QString KdenliveDoc::producerName(int id) { return result; } -void KdenliveDoc::setProducerDuration(int id, int duration) { +void KdenliveDoc::setProducerDuration(const QString &id, int duration) { QDomNodeList prods = producersList(); int ct = prods.count(); for (int i = 0; i < ct ; i++) { QDomElement e = prods.item(i).toElement(); - if (e.attribute("id") != "black" && e.attribute("id").toInt() == id) { + if (e.attribute("id") != "black" && e.attribute("id") == id) { e.setAttribute("duration", QString::number(duration)); break; } } } -int KdenliveDoc::getProducerDuration(int id) { +int KdenliveDoc::getProducerDuration(const QString &id) { int result = 0; QDomNodeList prods = producersList(); int ct = prods.count(); for (int i = 0; i < ct ; i++) { QDomElement e = prods.item(i).toElement(); - if (e.attribute("id") != "black" && e.attribute("id").toInt() == id) { + if (e.attribute("id") != "black" && e.attribute("id") == id) { result = e.attribute("duration").toInt(); break; } @@ -588,31 +656,31 @@ QString KdenliveDoc::description() const { return m_url.fileName() + " / " + m_profile.description; } -void KdenliveDoc::addClip(const QDomElement &elem, const int clipId) { +void KdenliveDoc::addClip(const QDomElement &elem, const QString &clipId) { DocClipBase *clip = new DocClipBase(m_clipManager, elem, clipId); kDebug() << "///////// DOCUM, CREATING NEW CLIP, ID:" << clipId << ", PAR ID:" << elem.attribute("groupid"); m_clipManager->addClip(clip); emit addProjectClip(clip); } -void KdenliveDoc::addFolder(const QString foldername, int clipId, bool edit) { +void KdenliveDoc::addFolder(const QString foldername, const QString &clipId, bool edit) { emit addProjectFolder(foldername, clipId, false, edit); } -void KdenliveDoc::deleteFolder(const QString foldername, int clipId) { +void KdenliveDoc::deleteFolder(const QString foldername, const QString &clipId) { emit addProjectFolder(foldername, clipId, true); } -void KdenliveDoc::deleteProjectClip(QList ids) { +void KdenliveDoc::deleteProjectClip(QList ids) { for (int i = 0; i < ids.size(); ++i) { - emit deletTimelineClip(ids.at(i)); + emit deleteTimelineClip(ids.at(i)); m_clipManager->slotDeleteClip(ids.at(i)); } setModified(true); } -void KdenliveDoc::deleteProjectFolder(QMap map) { - QMapIterator i(map); +void KdenliveDoc::deleteProjectFolder(QMap map) { + QMapIterator i(map); while (i.hasNext()) { i.next(); slotDeleteFolder(i.key(), i.value()); @@ -620,68 +688,68 @@ void KdenliveDoc::deleteProjectFolder(QMap map) { setModified(true); } -void KdenliveDoc::deleteClip(const uint clipId) { +void KdenliveDoc::deleteClip(const QString &clipId) { emit signalDeleteProjectClip(clipId); m_clipManager->deleteClip(clipId); } -void KdenliveDoc::slotAddClipList(const KUrl::List urls, const QString group, const int groupId) { +void KdenliveDoc::slotAddClipList(const KUrl::List urls, const QString group, const QString &groupId) { m_clipManager->slotAddClipList(urls, group, groupId); - emit selectLastAddedClip(m_clipManager->lastClipId()); + emit selectLastAddedClip(QString::number(m_clipManager->lastClipId())); setModified(true); } -void KdenliveDoc::slotAddClipFile(const KUrl url, const QString group, const int groupId) { +void KdenliveDoc::slotAddClipFile(const KUrl url, const QString group, const QString &groupId) { kDebug() << "///////// DOCUM, ADD CLP: " << url; m_clipManager->slotAddClipFile(url, group, groupId); - emit selectLastAddedClip(m_clipManager->lastClipId()); + emit selectLastAddedClip(QString::number(m_clipManager->lastClipId())); setModified(true); } -void KdenliveDoc::slotAddTextClipFile(const QString path, const QString xml, const QString group, const int groupId) { +void KdenliveDoc::slotAddTextClipFile(const QString path, const QString xml, const QString group, const QString &groupId) { kDebug() << "///////// DOCUM, ADD TXT CLP: " << path; m_clipManager->slotAddTextClipFile(path, xml, group, groupId); setModified(true); } void KdenliveDoc::slotAddFolder(const QString folderName) { - AddFolderCommand *command = new AddFolderCommand(this, folderName, m_clipManager->getFreeClipId(), true); + AddFolderCommand *command = new AddFolderCommand(this, folderName, QString::number(m_clipManager->getFreeClipId()), true); commandStack()->push(command); setModified(true); } -void KdenliveDoc::slotDeleteFolder(const QString folderName, const int id) { +void KdenliveDoc::slotDeleteFolder(const QString folderName, const QString &id) { AddFolderCommand *command = new AddFolderCommand(this, folderName, id, false); commandStack()->push(command); setModified(true); } -void KdenliveDoc::slotEditFolder(const QString newfolderName, const QString oldfolderName, int clipId) { +void KdenliveDoc::slotEditFolder(const QString newfolderName, const QString oldfolderName, const QString &clipId) { EditFolderCommand *command = new EditFolderCommand(this, newfolderName, oldfolderName, clipId, false); commandStack()->push(command); setModified(true); } -int KdenliveDoc::getFreeClipId() { - return m_clipManager->getFreeClipId(); +const QString&KdenliveDoc::getFreeClipId() { + return QString::number(m_clipManager->getFreeClipId()); } -DocClipBase *KdenliveDoc::getBaseClip(int clipId) { +DocClipBase *KdenliveDoc::getBaseClip(const QString &clipId) { return m_clipManager->getClipById(clipId); } -void KdenliveDoc::slotAddColorClipFile(const QString name, const QString color, QString duration, const QString group, const int groupId) { +void KdenliveDoc::slotAddColorClipFile(const QString name, const QString color, QString duration, const QString group, const QString &groupId) { m_clipManager->slotAddColorClipFile(name, color, duration, group, groupId); setModified(true); } -void KdenliveDoc::slotAddSlideshowClipFile(const QString name, const QString path, int count, const QString duration, const bool loop, const bool fade, const QString &luma_duration, const QString &luma_file, const int softness, const QString group, const int groupId) { +void KdenliveDoc::slotAddSlideshowClipFile(const QString name, const QString path, int count, const QString duration, const bool loop, const bool fade, const QString &luma_duration, const QString &luma_file, const int softness, const QString group, const QString &groupId) { m_clipManager->slotAddSlideshowClipFile(name, path, count, duration, loop, fade, luma_duration, luma_file, softness, group, groupId); setModified(true); } -void KdenliveDoc::slotCreateTextClip(QString group, int groupId) { +void KdenliveDoc::slotCreateTextClip(QString group, const QString &groupId) { QString titlesFolder = projectFolder().path() + "/titles/"; KStandardDirs::makeDir(titlesFolder); TitleWidget *dia_ui = new TitleWidget(KUrl(), titlesFolder, m_render, kapp->activeWindow()); @@ -696,12 +764,12 @@ void KdenliveDoc::slotCreateTextClip(QString group, int groupId) { QPixmap pix = dia_ui->renderedPixmap(); pix.save(path + ".png"); //dia_ui->saveTitle(path + ".kdenlivetitle"); - slotAddTextClipFile(path, dia_ui->xml().toString(), QString(), -1); + slotAddTextClipFile(path, dia_ui->xml().toString(), QString(), QString()); } delete dia_ui; } -void KdenliveDoc::editTextClip(QString path, int id) { +void KdenliveDoc::editTextClip(QString path, const QString &id) { DocClipBase *clip = m_clipManager->getClipById(id); if (!clip) return; TitleWidget *dia_ui = new TitleWidget(KUrl()/*path + ".kdenlivetitle")*/, path, m_render, kapp->activeWindow()); diff --git a/src/kdenlivedoc.h b/src/kdenlivedoc.h index e8320e19..acf17cd0 100644 --- a/src/kdenlivedoc.h +++ b/src/kdenlivedoc.h @@ -57,30 +57,30 @@ Q_OBJECT public: QDomDocument toXml() const; void setRenderer(Render *render); QUndoStack *commandStack(); - QString producerName(int id); - void setProducerDuration(int id, int duration); - int getProducerDuration(int id); + QString producerName(const QString &id); + void setProducerDuration(const QString &id, int duration); + int getProducerDuration(const QString &id); Render *renderer(); QDomElement m_guidesXml; ClipManager *clipManager(); - void addClip(const QDomElement &elem, const int clipId); - void addFolder(const QString foldername, int clipId, bool edit); - void deleteFolder(const QString foldername, int clipId); - void slotAddClipFile(const KUrl url, const QString group, const int groupId = -1); - void slotAddClipList(const KUrl::List urls, const QString group, const int groupId = -1); - void slotAddTextClipFile(const QString path, const QString xml, const QString group, const int groupId = -1); - void editTextClip(QString path, int id); + void addClip(const QDomElement &elem, const QString &clipId); + void addFolder(const QString foldername, const QString &clipId, bool edit); + void deleteFolder(const QString foldername, const QString &clipId); + void slotAddClipFile(const KUrl url, const QString group, const QString &groupId = QString()); + void slotAddClipList(const KUrl::List urls, const QString group, const QString &groupId = QString()); + void slotAddTextClipFile(const QString path, const QString xml, const QString group, const QString &groupId = QString()); + void editTextClip(QString path, const QString &id); void slotAddFolder(const QString folderName); - void slotDeleteFolder(const QString folderName, const int id); - void slotEditFolder(const QString folderName, const QString oldfolderName, int clipId); - void slotAddColorClipFile(const QString name, const QString color, QString duration, const QString group, const int groupId = -1); - void slotAddSlideshowClipFile(const QString name, const QString path, int count, const QString duration, const bool loop, const bool fade, const QString &luma_duration, const QString &luma_file, const int softness, const QString group, const int groupId = -1); - void deleteClip(const uint clipId); + void slotDeleteFolder(const QString folderName, const QString &id); + void slotEditFolder(const QString folderName, const QString oldfolderName, const QString &clipId); + void slotAddColorClipFile(const QString name, const QString color, QString duration, const QString group, const QString &groupId = QString()); + void slotAddSlideshowClipFile(const QString name, const QString path, int count, const QString duration, const bool loop, const bool fade, const QString &luma_duration, const QString &luma_file, const int softness, const QString group, const QString &groupId = QString()); + void deleteClip(const QString &clipId); int getFramePos(QString duration); - DocClipBase *getBaseClip(int clipId); - void updateClip(int id); - void deleteProjectClip(QList ids); - void deleteProjectFolder(QMap map); + DocClipBase *getBaseClip(const QString &clipId); + void updateClip(const QString &id); + void deleteProjectClip(QList ids); + void deleteProjectFolder(QMap map); /** Inform application of the audio thumbnails generation progress */ void setThumbsProgress(const QString &message, int progress); QString profilePath() const; @@ -92,7 +92,7 @@ Q_OBJECT public: void setProfilePath(QString path); /** Set to true if document needs saving, false otherwise */ void setModified(bool mod); - int getFreeClipId(); + const QString&getFreeClipId(); /** does the document need saving */ bool isModified() const; /** Returns project folder, used to store project files (titles, effects,...) */ @@ -133,22 +133,22 @@ private: void convertDocument(double version); public slots: - void slotCreateTextClip(QString group, int groupId); + void slotCreateTextClip(QString group, const QString &groupId); private slots: void slotAutoSave(); signals: void addProjectClip(DocClipBase *); - void addProjectFolder(const QString, int, bool, bool edit = false); - void signalDeleteProjectClip(int); - void updateClipDisplay(int); - void deletTimelineClip(int); + void addProjectFolder(const QString, const QString &, bool, bool edit = false); + void signalDeleteProjectClip(const QString &); + void updateClipDisplay(const QString&); + void deleteTimelineClip(const QString&); void progressInfo(const QString &, int); /** emited when the document state has been modified (= needs saving or not) */ void docModified(bool); - void refreshClipThumbnail(int); - void selectLastAddedClip(const int); + void refreshClipThumbnail(const QString &); + void selectLastAddedClip(const QString &); }; #endif diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 6ad902e9..1475f1a8 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -397,7 +397,7 @@ void MainWindow::slotRaiseMonitor(bool clipMonitor) { else projectMonitorDock->raise(); } -void MainWindow::slotSetClipDuration(int id, int duration) { +void MainWindow::slotSetClipDuration(const QString &id, int duration) { if (!m_activeDocument) return; m_activeDocument->setProducerDuration(id, duration); } @@ -407,13 +407,13 @@ void MainWindow::slotConnectMonitors() { m_projectList->setRenderer(m_clipMonitor->render); connect(m_projectList, SIGNAL(receivedClipDuration(int, int)), this, SLOT(slotSetClipDuration(int, int))); connect(m_projectList, SIGNAL(showClipProperties(DocClipBase *)), this, SLOT(slotShowClipProperties(DocClipBase *))); - connect(m_projectList, SIGNAL(getFileProperties(const QDomElement &, int)), m_clipMonitor->render, SLOT(getFileProperties(const QDomElement &, int))); - connect(m_clipMonitor->render, SIGNAL(replyGetImage(int, int, const QPixmap &, int, int)), m_projectList, SLOT(slotReplyGetImage(int, int, const QPixmap &, int, int))); - connect(m_clipMonitor->render, SIGNAL(replyGetFileProperties(int, Mlt::Producer*, const QMap < QString, QString > &, const QMap < QString, QString > &)), m_projectList, SLOT(slotReplyGetFileProperties(int, Mlt::Producer*, const QMap < QString, QString > &, const QMap < QString, QString > &))); + connect(m_projectList, SIGNAL(getFileProperties(const QDomElement &, const QString &)), m_clipMonitor->render, SLOT(getFileProperties(const QDomElement &, const QString &))); + connect(m_clipMonitor->render, SIGNAL(replyGetImage(const QString &, int, const QPixmap &, int, int)), m_projectList, SLOT(slotReplyGetImage(const QString &, int, const QPixmap &, int, int))); + connect(m_clipMonitor->render, SIGNAL(replyGetFileProperties(const QString &, Mlt::Producer*, const QMap < QString, QString > &, const QMap < QString, QString > &)), m_projectList, SLOT(slotReplyGetFileProperties(const QString &, Mlt::Producer*, const QMap < QString, QString > &, const QMap < QString, QString > &))); - connect(m_clipMonitor->render, SIGNAL(removeInvalidClip(int)), m_projectList, SLOT(slotRemoveInvalidClip(int))); + connect(m_clipMonitor->render, SIGNAL(removeInvalidClip(const QString &)), m_projectList, SLOT(slotRemoveInvalidClip(const QString &))); - connect(m_clipMonitor, SIGNAL(refreshClipThumbnail(int)), m_projectList, SLOT(slotRefreshClipThumbnail(int))); + connect(m_clipMonitor, SIGNAL(refreshClipThumbnail(const QString &)), m_projectList, SLOT(slotRefreshClipThumbnail(const QString &))); connect(m_clipMonitor, SIGNAL(adjustMonitorSize()), this, SLOT(slotAdjustClipMonitor())); connect(m_projectMonitor, SIGNAL(adjustMonitorSize()), this, SLOT(slotAdjustProjectMonitor())); @@ -1039,12 +1039,12 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) { //cha disconnect(m_projectMonitor, SIGNAL(renderPosition(int)), m_activeTimeline, SLOT(moveCursorPos(int))); disconnect(m_projectMonitor, SIGNAL(durationChanged(int)), m_activeTimeline, SLOT(setDuration(int))); disconnect(m_activeDocument, SIGNAL(addProjectClip(DocClipBase *)), m_projectList, SLOT(slotAddClip(DocClipBase *))); - disconnect(m_activeDocument, SIGNAL(addProjectFolder(const QString, int, bool, bool)), m_projectList, SLOT(slotAddFolder(const QString, int, bool, bool))); - disconnect(m_activeDocument, SIGNAL(signalDeleteProjectClip(int)), m_projectList, SLOT(slotDeleteClip(int))); - disconnect(m_activeDocument, SIGNAL(updateClipDisplay(int)), m_projectList, SLOT(slotUpdateClip(int))); - disconnect(m_activeDocument, SIGNAL(refreshClipThumbnail(int)), m_projectList, SLOT(slotRefreshClipThumbnail(int))); - disconnect(m_activeDocument, SIGNAL(selectLastAddedClip(const int)), m_projectList, SLOT(slotSelectClip(const int))); - disconnect(m_activeDocument, SIGNAL(deletTimelineClip(int)), m_activeTimeline, SLOT(slotDeleteClip(int))); + disconnect(m_activeDocument, SIGNAL(addProjectFolder(const QString, const QString &, bool, bool)), m_projectList, SLOT(slotAddFolder(const QString, const QString &, bool, bool))); + disconnect(m_activeDocument, SIGNAL(signalDeleteProjectClip(const QString &)), m_projectList, SLOT(slotDeleteClip(const QString &))); + disconnect(m_activeDocument, SIGNAL(updateClipDisplay(const QString &)), m_projectList, SLOT(slotUpdateClip(const QString &))); + disconnect(m_activeDocument, SIGNAL(refreshClipThumbnail(const QString &)), m_projectList, SLOT(slotRefreshClipThumbnail(const QString &))); + disconnect(m_activeDocument, SIGNAL(selectLastAddedClip(const QString &)), m_projectList, SLOT(slotSelectClip(const QString &))); + disconnect(m_activeDocument, SIGNAL(deleteTimelineClip(const QString &)), m_activeTimeline, SLOT(slotDeleteClip(const QString &))); disconnect(m_activeTimeline, SIGNAL(clipItemSelected(ClipItem*)), effectStack, SLOT(slotClipItemSelected(ClipItem*))); disconnect(m_activeTimeline, SIGNAL(clipItemSelected(ClipItem*)), this, SLOT(slotActivateEffectStackView())); disconnect(m_activeTimeline, SIGNAL(transitionItemSelected(Transition*)), transitionConfig, SLOT(slotTransitionItemSelected(Transition*))); @@ -1077,13 +1077,13 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) { //cha connect(m_projectMonitor, SIGNAL(renderPosition(int)), trackView, SLOT(moveCursorPos(int))); connect(m_projectMonitor, SIGNAL(durationChanged(int)), trackView, SLOT(setDuration(int))); connect(doc, SIGNAL(addProjectClip(DocClipBase *)), m_projectList, SLOT(slotAddClip(DocClipBase *))); - connect(doc, SIGNAL(addProjectFolder(const QString, int, bool, bool)), m_projectList, SLOT(slotAddFolder(const QString, int, bool, bool))); - connect(doc, SIGNAL(signalDeleteProjectClip(int)), m_projectList, SLOT(slotDeleteClip(int))); - connect(doc, SIGNAL(updateClipDisplay(int)), m_projectList, SLOT(slotUpdateClip(int))); - connect(doc, SIGNAL(refreshClipThumbnail(int)), m_projectList, SLOT(slotRefreshClipThumbnail(int))); - connect(doc, SIGNAL(selectLastAddedClip(const int)), m_projectList, SLOT(slotSelectClip(const int))); + connect(doc, SIGNAL(addProjectFolder(const QString, const QString &, bool, bool)), m_projectList, SLOT(slotAddFolder(const QString, const QString &, bool, bool))); + connect(doc, SIGNAL(signalDeleteProjectClip(const QString &)), m_projectList, SLOT(slotDeleteClip(const QString &))); + connect(doc, SIGNAL(updateClipDisplay(const QString &)), m_projectList, SLOT(slotUpdateClip(const QString &))); + connect(doc, SIGNAL(refreshClipThumbnail(const QString &)), m_projectList, SLOT(slotRefreshClipThumbnail(const QString &))); + connect(doc, SIGNAL(selectLastAddedClip(const QString &)), m_projectList, SLOT(slotSelectClip(const QString &))); - connect(doc, SIGNAL(deletTimelineClip(int)), trackView, SLOT(slotDeleteClip(int))); + connect(doc, SIGNAL(deleteTimelineClip(const QString &)), trackView, SLOT(slotDeleteClip(const QString &))); connect(doc, SIGNAL(docModified(bool)), this, SLOT(slotUpdateDocumentState(bool))); @@ -1318,7 +1318,7 @@ void MainWindow::slotShowClipProperties(DocClipBase *clip) { return; } ClipProperties dia(clip, m_activeDocument->timecode(), m_activeDocument->fps(), this); - connect(&dia, SIGNAL(addMarker(int, GenTime, QString)), m_activeTimeline->projectView(), SLOT(slotAddClipMarker(int, GenTime, QString))); + connect(&dia, SIGNAL(addMarker(const QString &, GenTime, QString)), m_activeTimeline->projectView(), SLOT(slotAddClipMarker(const QString &, GenTime, QString))); if (dia.exec() == QDialog::Accepted) { m_projectList->slotUpdateClipProperties(dia.clipId(), dia.properties()); if (dia.needsTimelineRefresh()) { diff --git a/src/mainwindow.h b/src/mainwindow.h index 07a54664..68994486 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -177,7 +177,7 @@ private slots: void updateConfiguration(); void slotConnectMonitors(); void slotRaiseMonitor(bool clipMonitor); - void slotSetClipDuration(int id, int duration); + void slotSetClipDuration(const QString &id, int duration); void slotUpdateMousePosition(int pos); void slotAddEffect(QDomElement effect, GenTime pos = GenTime(), int track = -1); void slotEditProfiles(); diff --git a/src/monitor.h b/src/monitor.h index ca2b5295..6dba626f 100644 --- a/src/monitor.h +++ b/src/monitor.h @@ -106,7 +106,7 @@ public slots: signals: void renderPosition(int); void durationChanged(int); - void refreshClipThumbnail(int); + void refreshClipThumbnail(const QString &); void adjustMonitorSize(); }; diff --git a/src/projectitem.cpp b/src/projectitem.cpp index 4e83180b..4f3e2a91 100644 --- a/src/projectitem.cpp +++ b/src/projectitem.cpp @@ -38,44 +38,8 @@ const int DurationRole = NameRole + 1; const int UsageRole = NameRole + 2; -ProjectItem::ProjectItem(QTreeWidget * parent, const QStringList & strings, QDomElement xml, int clipId) - : QTreeWidgetItem(parent, strings, QTreeWidgetItem::UserType), m_clipType(UNKNOWN), m_clipId(clipId) { - QDomElement element = xml.cloneNode().toElement(); - setSizeHint(0, QSize(65, 45)); - setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsEditable); - if (!element.isNull()) { - element.setAttribute("id", clipId); - QString cType = element.attribute("type", QString::null); - if (!cType.isEmpty()) { - m_clipType = (CLIPTYPE) cType.toInt(); - slotSetToolTip(); - } - - if (m_clipType == COLOR || m_clipType == IMAGE || m_clipType == SLIDESHOW || m_clipType == TEXT) - element.setAttribute("duration", MAXCLIPDURATION); - else if (element.attribute("duration").isEmpty() && !element.attribute("out").isEmpty()) { - element.setAttribute("duration", element.attribute("out").toInt() - element.attribute("in").toInt()); - } - } -} - -ProjectItem::ProjectItem(QTreeWidgetItem * parent, const QStringList & strings, QDomElement xml, int clipId) - : QTreeWidgetItem(parent, strings, QTreeWidgetItem::UserType), m_clipType(UNKNOWN), m_clipId(clipId) { - QDomElement element = xml.cloneNode().toElement(); - setSizeHint(0, QSize(65, 45)); - setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsEditable); - if (!element.isNull()) { - element.setAttribute("id", clipId); - QString cType = element.attribute("type", QString::null); - if (!cType.isEmpty()) { - m_clipType = (CLIPTYPE) cType.toInt(); - slotSetToolTip(); - } - } -} - // folder -ProjectItem::ProjectItem(QTreeWidget * parent, const QStringList & strings, int clipId) +ProjectItem::ProjectItem(QTreeWidget * parent, const QStringList & strings, const QString &clipId) : QTreeWidgetItem(parent, strings), m_clipType(FOLDER), m_groupName(strings.at(1)), m_clipId(clipId), m_clip(NULL) { setSizeHint(0, QSize(65, 45)); setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsEditable); @@ -93,6 +57,7 @@ ProjectItem::ProjectItem(QTreeWidget * parent, DocClipBase *clip) if (name.isEmpty()) name = KUrl(m_clip->getProperty("resource")).fileName(); m_clipType = (CLIPTYPE) m_clip->getProperty("type").toInt(); setText(1, name); + setText(2, m_clip->description()); //kDebug() << "PROJECT ITE;. ADDING LCIP: " << m_clipId; } @@ -106,6 +71,7 @@ ProjectItem::ProjectItem(QTreeWidgetItem * parent, DocClipBase *clip) if (name.isEmpty()) name = KUrl(m_clip->getProperty("resource")).fileName(); m_clipType = (CLIPTYPE) m_clip->getProperty("type").toInt(); setText(1, name); + setText(2, m_clip->description()); //kDebug() << "PROJECT ITE;. ADDING LCIP: " << m_clipId; } @@ -118,7 +84,7 @@ int ProjectItem::numReferences() const { return m_clip->numReferences(); } -int ProjectItem::clipId() const { +const QString &ProjectItem::clipId() const { return m_clipId; } @@ -258,4 +224,3 @@ void ProjectItem::setProperties(const QMap < QString, QString > &attributes, con } -#include "projectitem.moc" diff --git a/src/projectitem.h b/src/projectitem.h index 048e8a0b..da261c42 100644 --- a/src/projectitem.h +++ b/src/projectitem.h @@ -33,10 +33,8 @@ class DocClipBase; class ProjectItem : public QTreeWidgetItem { public: - ProjectItem(QTreeWidget * parent, const QStringList & strings, QDomElement xml, int clipId); - ProjectItem(QTreeWidgetItem * parent, const QStringList & strings, QDomElement xml, int clipId); /** Create folder item */ - ProjectItem(QTreeWidget * parent, const QStringList & strings, int clipId); + ProjectItem(QTreeWidget * parent, const QStringList & strings, const QString &clipId); ProjectItem(QTreeWidget * parent, DocClipBase *clip); ProjectItem(QTreeWidgetItem * parent, DocClipBase *clip); virtual ~ProjectItem(); @@ -44,7 +42,7 @@ public: int numReferences() const; void setProperties(const QMap < QString, QString > &attributes, const QMap < QString, QString > &metadata); - int clipId() const; + const QString &clipId() const; QStringList names() const; bool isGroup() const; const QString groupName() const; @@ -59,7 +57,7 @@ public: private: QString m_groupName; CLIPTYPE m_clipType; - int m_clipId; + QString m_clipId; void slotSetToolTip(); DocClipBase *m_clip; }; diff --git a/src/projectlist.cpp b/src/projectlist.cpp index 66c054e0..ede62c7b 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -147,7 +147,7 @@ void ProjectList::slotClipSelected() { } } -void ProjectList::slotUpdateClipProperties(int id, QMap properties) { +void ProjectList::slotUpdateClipProperties(const QString &id, QMap properties) { ProjectItem *item = getItemById(id); if (item) { slotUpdateClipProperties(item, properties); @@ -195,8 +195,8 @@ void ProjectList::slotContextMenu(const QPoint &pos, QTreeWidgetItem *item) { void ProjectList::slotRemoveClip() { if (!listView->currentItem()) return; ProjectItem *item = static_cast (listView->currentItem()); - QList ids; - QMap folderids; + QList ids; + QMap folderids; if (item->clipType() == FOLDER) folderids[item->groupName()] = item->clipId(); else ids << item->clipId(); if (item->numReferences() > 0) { @@ -213,13 +213,13 @@ void ProjectList::slotRemoveClip() { if (!folderids.isEmpty()) m_doc->deleteProjectFolder(folderids); } -void ProjectList::selectItemById(const int clipId) { +void ProjectList::selectItemById(const QString &clipId) { ProjectItem *item = getItemById(clipId); if (item) listView->setCurrentItem(item); } -void ProjectList::slotDeleteClip(int clipId) { +void ProjectList::slotDeleteClip(const QString &clipId) { ProjectItem *item = getItemById(clipId); QTreeWidgetItem *p = item->parent(); if (p) { @@ -237,7 +237,7 @@ void ProjectList::slotAddFolder() { m_doc->slotAddFolder(i18n("Folder")); //folderName); } -void ProjectList::slotAddFolder(const QString foldername, int clipId, bool remove, bool edit) { +void ProjectList::slotAddFolder(const QString foldername, const QString &clipId, bool remove, bool edit) { if (remove) { ProjectItem *item; QTreeWidgetItemIterator it(listView); @@ -272,7 +272,7 @@ void ProjectList::slotAddFolder(const QString foldername, int clipId, bool remov } void ProjectList::slotAddClip(DocClipBase *clip) { - const int parent = clip->toXML().attribute("groupid").toInt(); + const QString parent = clip->toXML().attribute("groupid"); ProjectItem *item = NULL; if (parent != 0) { ProjectItem *parentitem = getItemById(parent); @@ -296,7 +296,7 @@ void ProjectList::slotAddClip(DocClipBase *clip) { emit getFileProperties(clip->toXML(), clip->getId()); } -void ProjectList::slotUpdateClip(int id) { +void ProjectList::slotUpdateClip(const QString &id) { ProjectItem *item = getItemById(id); item->setData(1, UsageRole, QString::number(item->numReferences())); } @@ -305,11 +305,11 @@ void ProjectList::slotAddClip(QUrl givenUrl, QString group) { if (!m_commandStack) kDebug() << "!!!!!!!!!!!!!!!!  NO CMD STK"; KUrl::List list; if (givenUrl.isEmpty()) { - list = KFileDialog::getOpenUrls(KUrl("kfiledialog:///clipfolder"), "application/vnd.kde.kdenlive application/vnd.westley.scenelist application/flv application/vnd.rn-realmedia video/x-dv video/dv video/x-msvideo video/mpeg video/x-ms-wmv audio/mpeg audio/x-mp3 audio/x-wav application/ogg video/mp4 video/quicktime image/gif image/jpeg image/png image/x-bmp image/svg+xml image/tiff image/x-xcf-gimp image/x-vnd.adobe.photoshop image/x-pcx image/x-exr", this); + list = KFileDialog::getOpenUrls(KUrl("kfiledialog:///clipfolder"), "application/vnd.kde.kdenlive application/vnd.westley.scenelist application/flv application/vnd.rn-realmedia video/x-dv video/dv video/x-msvideo video/mpeg video/x-ms-wmv audio/mpeg audio/x-mp3 audio/x-wav application/ogg video/mp4 video/quicktime image/gif image/jpeg image/png image/x-bmp image/svg+xml image/tiff image/x-xcf-gimp image/x-vnd.adobe.photoshop image/x-pcx image/x-exr video/mlt-playlist", this); } else list.append(givenUrl); if (list.isEmpty()) return; - int groupId = -1; + QString groupId = QString(); if (group.isEmpty()) { ProjectItem *item = static_cast (listView->currentItem()); if (item && item->clipType() != FOLDER) { @@ -326,14 +326,14 @@ void ProjectList::slotAddClip(QUrl givenUrl, QString group) { m_doc->slotAddClipList(list, group, groupId); } -void ProjectList::slotRemoveInvalidClip(int id) { +void ProjectList::slotRemoveInvalidClip(const QString &id) { ProjectItem *item = getItemById(id); if (item) { QString path = item->referencedClip()->fileURL().path(); if (!path.isEmpty()) KMessageBox::sorry(this, i18n("Clip %1
is invalid, will be removed from project.", path)); } - QList ids; + QList ids; ids << id; m_doc->deleteProjectClip(ids); } @@ -350,7 +350,7 @@ void ProjectList::slotAddColorClip() { color = color.replace(0, 1, "0x") + "ff"; QString group = QString(); - int groupId = -1; + QString groupId = QString(); ProjectItem *item = static_cast (listView->currentItem()); if (item && item->clipType() != FOLDER) { while (item->parent()) { @@ -377,7 +377,7 @@ void ProjectList::slotAddSlideshowClip() { if (dia->exec() == QDialog::Accepted) { QString group = QString(); - int groupId = -1; + QString groupId = QString(); ProjectItem *item = static_cast (listView->currentItem()); if (item && item->clipType() != FOLDER) { while (item->parent()) { @@ -397,7 +397,7 @@ void ProjectList::slotAddSlideshowClip() { void ProjectList::slotAddTitleClip() { QString group = QString(); - int groupId = -1; + QString groupId = QString(); ProjectItem *item = static_cast (listView->currentItem()); if (item && item->clipType() != FOLDER) { while (item->parent()) { @@ -443,7 +443,7 @@ QDomElement ProjectList::producersList() { return prods; } -void ProjectList::slotRefreshClipThumbnail(int clipId) { +void ProjectList::slotRefreshClipThumbnail(const QString &clipId) { ProjectItem *item = getItemById(clipId); if (item) slotRefreshClipThumbnail(item); } @@ -457,7 +457,7 @@ void ProjectList::slotRefreshClipThumbnail(ProjectItem *item) { } } -void ProjectList::slotReplyGetFileProperties(int clipId, Mlt::Producer *producer, const QMap < QString, QString > &properties, const QMap < QString, QString > &metadata) { +void ProjectList::slotReplyGetFileProperties(const QString &clipId, Mlt::Producer *producer, const QMap < QString, QString > &properties, const QMap < QString, QString > &metadata) { ProjectItem *item = getItemById(clipId); if (item) { item->setProperties(properties, metadata); @@ -466,12 +466,12 @@ void ProjectList::slotReplyGetFileProperties(int clipId, Mlt::Producer *producer } else kDebug() << "//////// COULD NOT FIND CLIP TO UPDATE PRPS..."; } -void ProjectList::slotReplyGetImage(int clipId, int pos, const QPixmap &pix, int w, int h) { +void ProjectList::slotReplyGetImage(const QString &clipId, int pos, const QPixmap &pix, int w, int h) { ProjectItem *item = getItemById(clipId); if (item) item->setIcon(0, pix); } -ProjectItem *ProjectList::getItemById(int id) { +ProjectItem *ProjectList::getItemById(const QString &id) { QTreeWidgetItemIterator it(listView); while (*it) { if (((ProjectItem *)(*it))->clipId() == id) @@ -482,7 +482,7 @@ ProjectItem *ProjectList::getItemById(int id) { return NULL; } -void ProjectList::slotSelectClip(const int ix) { +void ProjectList::slotSelectClip(const QString &ix) { ProjectItem *p = getItemById(ix); if (p) { listView->setCurrentItem(p); diff --git a/src/projectlist.h b/src/projectlist.h index 124dd4b9..08b46510 100644 --- a/src/projectlist.h +++ b/src/projectlist.h @@ -107,19 +107,19 @@ public: QDomElement producersList(); void setRenderer(Render *projectRender); - void slotUpdateClipProperties(int id, QMap properties); + void slotUpdateClipProperties(const QString &id, QMap properties); public slots: void setDocument(KdenliveDoc *doc); - void slotReplyGetImage(int clipId, int pos, const QPixmap &pix, int w, int h); - void slotReplyGetFileProperties(int clipId, Mlt::Producer *producer, const QMap < QString, QString > &properties, const QMap < QString, QString > &metadata); + void slotReplyGetImage(const QString &clipId, int pos, const QPixmap &pix, int w, int h); + void slotReplyGetFileProperties(const QString &clipId, Mlt::Producer *producer, const QMap < QString, QString > &properties, const QMap < QString, QString > &metadata); void slotAddClip(DocClipBase *clip); - void slotDeleteClip(int clipId); - void slotUpdateClip(int id); - void slotRefreshClipThumbnail(int clipId); + void slotDeleteClip(const QString &clipId); + void slotUpdateClip(const QString &id); + void slotRefreshClipThumbnail(const QString &clipId); void slotRefreshClipThumbnail(ProjectItem *item); - void slotRemoveInvalidClip(int id); - void slotSelectClip(const int ix); + void slotRemoveInvalidClip(const QString &id); + void slotSelectClip(const QString &ix); private: ProjectListView *listView; @@ -131,8 +131,8 @@ private: QMenu *m_menu; QUndoStack *m_commandStack; int m_clipIdCounter; - void selectItemById(const int clipId); - ProjectItem *getItemById(int id); + void selectItemById(const QString &clipId); + ProjectItem *getItemById(const QString &id); QAction *m_editAction; QAction *m_deleteAction; KdenliveDoc *m_doc; @@ -149,7 +149,7 @@ private slots: void slotAddTitleClip(); void slotContextMenu(const QPoint &pos, QTreeWidgetItem *); void slotAddFolder(); - void slotAddFolder(const QString foldername, int clipId, bool remove, bool edit); + void slotAddFolder(const QString foldername, const QString &clipId, bool remove, bool edit); /** This is triggered when a clip description has been modified */ void slotItemEdited(QTreeWidgetItem *item, int column); void slotUpdateClipProperties(ProjectItem *item, QMap properties); @@ -159,8 +159,8 @@ private slots: signals: void clipSelected(DocClipBase *); - void getFileProperties(const QDomElement&, int); - void receivedClipDuration(int, int); + void getFileProperties(const QDomElement&, const QString &); + void receivedClipDuration(const QString &, int); void showClipProperties(DocClipBase *); }; diff --git a/src/projectlistview.cpp b/src/projectlistview.cpp index 779da5f4..4ef4653c 100644 --- a/src/projectlistview.cpp +++ b/src/projectlistview.cpp @@ -149,17 +149,17 @@ void ProjectListView::dropEvent(QDropEvent *event) { kDebug() << "//////////////// DROPPED RIGHT 1 "; const QList list = selectedItems(); ProjectItem *clone; - int parentId = item->clipId(); + QString parentId = item->clipId(); foreach(QTreeWidgetItem *it, list) { // TODO allow dragging of folders ? - if (!((ProjectItem *) it)->isGroup() && ((ProjectItem *) it)->clipId() < 10000) { + if (!((ProjectItem *) it)->isGroup()/* && ((ProjectItem *) it)->clipId() < 10000*/) { if (it->parent()) clone = (ProjectItem*) it->parent()->takeChild(it->parent()->indexOfChild(it)); else clone = (ProjectItem*) takeTopLevelItem(indexOfTopLevelItem(it)); if (clone) { item->addChild(clone); QMap props; props.insert("groupname", item->groupName()); - props.insert("groupid", QString::number(parentId)); + props.insert("groupid", parentId); clone->setProperties(props); } } @@ -173,7 +173,7 @@ void ProjectListView::dropEvent(QDropEvent *event) { ProjectItem *clone; foreach(QTreeWidgetItem *it, list) { QTreeWidgetItem *parent = it->parent(); - if (parent && ((ProjectItem *) it)->clipId() < 10000) { + if (parent/* && ((ProjectItem *) it)->clipId() < 10000*/) { kDebug() << "++ item parent: " << parent->text(1); clone = (ProjectItem*) parent->takeChild(parent->indexOfChild(it)); if (clone) addTopLevelItem(clone); @@ -215,7 +215,7 @@ void ProjectListView::mouseMoveEvent(QMouseEvent *event) { QStringList ids; foreach(const QTreeWidgetItem *item, list) { // TODO allow dragging of folders - ids.append(QString::number(((ProjectItem *) item)->clipId())); + ids.append(((ProjectItem *) item)->clipId()); } QByteArray data; data.append(ids.join(";").toUtf8()); //doc.toString().toUtf8()); diff --git a/src/renderer.cpp b/src/renderer.cpp index 9312052b..a024bdf5 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -459,7 +459,7 @@ void Render::slotSplitView(bool doit) { } } -void Render::getFileProperties(const QDomElement &xml, int clipId) { +void Render::getFileProperties(const QDomElement &xml, const QString &clipId) { int height = 50; int width = (int)(height * m_mltProfile->dar()); QMap < QString, QString > filePropertyMap; @@ -494,7 +494,9 @@ void Render::getFileProperties(const QDomElement &xml, int clipId) { emit removeInvalidClip(clipId); return; } - producer->set("id", clipId); + char *tmp = decodedString(clipId); + producer->set("id", tmp); + delete[] tmp; int frameNumber = xml.attribute("thumbnail", "0").toInt(); if (frameNumber != 0) producer->seek(frameNumber); mlt_properties properties = MLT_PRODUCER_PROPERTIES(producer->get_producer()); diff --git a/src/renderer.h b/src/renderer.h index 37a1b158..9e6c92d7 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -226,11 +226,11 @@ private slots: // Private slots signals: // Signals /** emitted when the renderer recieves a reply to a getFileProperties request. */ - void replyGetFileProperties(int clipId, Mlt::Producer*, const QMap < QString, QString > &, const QMap < QString, QString > &); + void replyGetFileProperties(const QString &clipId, Mlt::Producer*, const QMap < QString, QString > &, const QMap < QString, QString > &); /** emitted when the renderer recieves a reply to a getImage request. */ - void replyGetImage(int , int, const QPixmap &, int, int); - void replyGetImage(int, const QPixmap &, int, int); + void replyGetImage(const QString & , int, const QPixmap &, int, int); + void replyGetImage(const QString &, const QPixmap &, int, int); /** Emitted when the renderer stops, either playing or rendering. */ void stopped(); @@ -247,7 +247,7 @@ signals: // Signals void durationChanged(int); void rendererPosition(int); void rendererStopped(int); - void removeInvalidClip(int); + void removeInvalidClip(const QString &); public slots: // Public slots /** Start Consumer */ @@ -262,7 +262,7 @@ public slots: // Public slots /** 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, int clipId); + void getFileProperties(const QDomElement &xml, const QString &clipId); void exportFileToFirewire(QString srcFileName, int port, GenTime startTime, GenTime endTime); static char *decodedString(QString str); diff --git a/src/trackview.cpp b/src/trackview.cpp index cb094e08..afe01727 100644 --- a/src/trackview.cpp +++ b/src/trackview.cpp @@ -251,7 +251,7 @@ void TrackView::parseDocument(QDomDocument doc) { //m_scrollBox->setGeometry(0, 0, 300 * zoomFactor(), m_scrollArea->height()); } -void TrackView::slotDeleteClip(int clipId) { +void TrackView::slotDeleteClip(const QString &clipId) { m_trackview->deleteClip(clipId); } @@ -337,12 +337,12 @@ int TrackView::slotAddProjectTrack(int ix, QDomElement xml, bool videotrack) { // Found a clip int in = elem.attribute("in").toInt(); QString idString = elem.attribute("producer"); - int id = idString.toInt(); + QString id = idString; bool hasSpeedAttribute = false; double speed; if (idString.startsWith("slowmotion")) { hasSpeedAttribute = true; - id = idString.section(":", 1, 1).toInt(); + id = idString.section(":", 1, 1); speed = idString.section(":", 2, 2).toDouble(); } DocClipBase *clip = m_doc->clipManager()->getClipById(id); diff --git a/src/trackview.h b/src/trackview.h index 95162db5..1d4b9794 100644 --- a/src/trackview.h +++ b/src/trackview.h @@ -62,7 +62,7 @@ public: public slots: - void slotDeleteClip(int clipId); + void slotDeleteClip(const QString &clipId); void slotChangeZoom(int factor); void setDuration(int dur); diff --git a/src/video-mlt-playlist.svgz b/src/video-mlt-playlist.svgz new file mode 100644 index 0000000000000000000000000000000000000000..5952575137f58528834507c2c8a0cb32999e2d78 GIT binary patch literal 7725 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 literal 0 HcmV?d00001 -- 2.39.2