m_tipPen.setColor(border);
m_tipPen.setWidth(3);
setContentsMargins(0, 0, 0, 0);
- if (projectscene) {
- m_cursorLine = projectscene->addLine(0, 0, 0, m_tracksHeight);
- m_cursorLine->setZValue(1000);
- }
+ const int maxWidth = m_tracksHeight * m_document->tracksCount();
+ setSceneRect(0, 0, sceneRect().width(), maxWidth);
+ verticalScrollBar()->setMaximum(maxWidth);
+ m_cursorLine = projectscene->addLine(0, 0, 0, maxWidth);
+ m_cursorLine->setZValue(1000);
KIcon razorIcon("edit-cut");
m_razorCursor = QCursor(razorIcon.pixmap(22, 22));
void CustomTrackView::slotSwitchTrackAudio(int ix) {
+ for (int i = 0; i < m_document->tracksCount(); i++)
+ kDebug() << "TRK " << i << " STATE: " << m_document->trackInfoAt(i).isMute << m_document->trackInfoAt(i).isBlind;
+
int tracknumber = m_document->tracksCount() - ix;
- kDebug() << "///// MUTING TRK: " << ix << "; PL NUM: " << tracknumber;
+
+ m_document->switchTrackAudio(tracknumber - 1, !m_document->trackInfoAt(tracknumber - 1).isMute);
+ kDebug() << "NEXT TRK STATE: " << m_document->trackInfoAt(tracknumber - 1).isMute << m_document->trackInfoAt(tracknumber - 1).isBlind;
m_document->renderer()->mltChangeTrackState(tracknumber, m_document->trackInfoAt(tracknumber - 1).isMute, m_document->trackInfoAt(tracknumber - 1).isBlind);
+ m_document->setModified(true);
}
void CustomTrackView::slotSwitchTrackVideo(int ix) {
int tracknumber = m_document->tracksCount() - ix;
+ m_document->switchTrackVideo(tracknumber - 1, !m_document->trackInfoAt(tracknumber - 1).isBlind);
m_document->renderer()->mltChangeTrackState(tracknumber, m_document->trackInfoAt(tracknumber - 1).isMute, m_document->trackInfoAt(tracknumber - 1).isBlind);
+ m_document->setModified(true);
}
void CustomTrackView::slotRemoveSpace() {
m_zoom = infoXml.attribute("zoom", "7").toInt();
setProfilePath(profilePath);
double version = infoXml.attribute("version").toDouble();
- if (version < 0.8) convertDocument(version);
- else {
- //delete all mlt producers and instead, use Kdenlive saved producers
- /*QDomNodeList prods = m_document.elementsByTagName("producer");
- int maxprod = prods.count();
- int pos = 0;
- for (int i = 0; i < maxprod; i++) {
- QDomNode m = prods.at(pos);
- QString prodId = m.toElement().attribute("id");
- if (prodId == "black" || prodId.startsWith("slowmotion"))
- pos++;
- else westley.removeChild(m);
- }*/
- /*prods = m_document.elementsByTagName("kdenlive_producer");
- maxprod = prods.count();
- for (int i = 0; i < maxprod; i++) {
- prods.at(0).toElement().setTagName("producer");
- westley.insertBefore(prods.at(0), QDomNode());
- }*/
+
+ // Upgrade old Kdenlive documents to current version
+ convertDocument(version);
+
+ // Build tracks
+ QString tracks = infoXml.attribute("tracks");
+ TrackInfo videoTrack;
+ videoTrack.type = VIDEOTRACK;
+ videoTrack.isMute = false;
+ videoTrack.isBlind = false;
+
+ TrackInfo audioTrack;
+ audioTrack.type = AUDIOTRACK;
+ audioTrack.isMute = false;
+ audioTrack.isBlind = true;
+ for (int i = 0; i < tracks.size(); i++) {
+ if (tracks.data()[i] == 'v') m_tracksList.append(videoTrack);
+ else m_tracksList.append(audioTrack);
}
+
+
QDomElement e;
QDomNodeList producers = m_document.elementsByTagName("producer");
QDomNodeList infoproducers = m_document.elementsByTagName("kdenlive_producer");
QDomElement westley = doc.createElement("westley");
doc.appendChild(westley);
+
+ TrackInfo videoTrack;
+ videoTrack.type = VIDEOTRACK;
+ videoTrack.isMute = false;
+ videoTrack.isBlind = false;
+
+ TrackInfo audioTrack;
+ audioTrack.type = AUDIOTRACK;
+ audioTrack.isMute = false;
+ audioTrack.isBlind = true;
+
QDomElement tractor = doc.createElement("tractor");
tractor.setAttribute("id", "maintractor");
QDomElement multitrack = doc.createElement("multitrack");
track.setAttribute("producer", "playlist" + QString::number(i));
track.setAttribute("hide", "video");
tractor.appendChild(track);
+ m_tracksList.append(audioTrack);
}
// create video tracks
QDomElement track = doc.createElement("track");
track.setAttribute("producer", "playlist" + QString::number(i));
tractor.appendChild(track);
+ m_tracksList.append(videoTrack);
}
for (uint i = 2; i < total ; i++) {
void KdenliveDoc::convertDocument(double version) {
kDebug() << "Opening a document with version " << version;
+ if (version == 0.8) {
+ // Add the tracks information
+ QString tracksOrder;
+ QDomNodeList tracks = m_document.elementsByTagName("track");
+ int max = tracks.count();
+ for (int i = 0; i < max; i++) {
+ QDomElement t = tracks.at(i).toElement();
+ if (t.attribute("hide") == "video") tracksOrder.append('a');
+ else tracksOrder.append('v');
+ }
+ QDomNode kdenlivedoc = m_document.elementsByTagName("kdenlivedoc").at(0);
+ QDomElement infoXml = kdenlivedoc.toElement();
+ QString currentTrackOrder = infoXml.attribute("tracks");
+ if (currentTrackOrder.isEmpty()) infoXml.setAttribute("tracks", tracksOrder);
+
+ return;
+ }
+
// Opening a old Kdenlive document
if (version == 0.7) {
kDebug() << "Unable to open document with version " << version;
//qApp->processEvents();
if (m_render) {
m_render->setSceneList(m_document.toString(), m_startPos);
+ kDebug() << "// SETTING SCENE LIST:\n\n" << m_document.toString();
checkProjectClips();
}
emit progressInfo(QString(), -1);
return m_tracksList.at(ix);
}
+void KdenliveDoc::switchTrackAudio(int ix, bool hide) {
+ m_tracksList[ix].isMute = hide; // !m_tracksList.at(ix).isMute;
+}
+
+void KdenliveDoc::switchTrackVideo(int ix, bool hide) {
+ m_tracksList[ix].isBlind = hide; // !m_tracksList.at(ix).isBlind;
+}
+
void KdenliveDoc::insertTrack(int ix, TrackInfo type) {
if (ix == -1) m_tracksList << type;
else m_tracksList.insert(ix, type);
const QList <TrackInfo> tracksList() const;
QPoint getTracksCount() const;
QString getTracksInfo() const;
+ void switchTrackVideo(int ix, bool hide);
+ void switchTrackAudio(int ix, bool hide);
private:
KUrl m_url;
Mlt::Service service(m_mltProducer->parent().get_service());
Mlt::Tractor tractor(service);
Mlt::Producer trackProducer(tractor.track(track));
+
if (mute) {
if (blind) trackProducer.set("hide", 3);
else trackProducer.set("hide", 2);
}
QList <Mlt::Producer *> Render::producersList() {
- QList <Mlt::Producer *> prods;
+ QList <Mlt::Producer *> prods = QList <Mlt::Producer *> ();
QStringList ids;
Mlt::Service service(m_mltProducer->parent().get_service());
Mlt::Tractor tractor(service);
- Mlt::Field *field = tractor.field();
int trackNb = tractor.count();
for (int t = 1; t < trackNb; t++) {
if (service.type() != tractor_type) kWarning() << "// TRACTOR PROBLEM";
Mlt::Tractor tractor(service);
+
Mlt::Playlist *playlist = new Mlt::Playlist();
int ct = tractor.count();
- kDebug() << "// TRACK INSERT: " << ix << ", MAX: " << ct;
+ // kDebug() << "// TRACK INSERT: " << ix << ", MAX: " << ct;
int pos = ix;
if (pos < ct) {
Mlt::Producer *prodToMove = new Mlt::Producer(tractor.track(pos));
tractor.set_track(*prodToMove, pos);
prodToMove = prodToMove2;
}
- } else tractor.set_track(*playlist, ix);
+ } else {
+ tractor.set_track(*playlist, ix);
+ Mlt::Producer newProd(tractor.track(ix));
+ if (!videoTrack) newProd.set("hide", 1);
+ }
// Move transitions
mlt_service serv = m_mltProducer->parent().get_service();
int cursorPos = 0;
m_documentErrors = QString();
// kDebug() << "//// DOCUMENT: " << doc.toString();
- QDomNode props = doc.elementsByTagName("properties").item(0);
+ /*QDomNode props = doc.elementsByTagName("properties").item(0);
if (!props.isNull()) {
cursorPos = props.toElement().attribute("timeline_position").toInt();
- }
+ }*/
// parse project tracks
QDomNodeList tracks = doc.elementsByTagName("track");
int trackduration = 0;
QDomElement e;
QDomElement p;
- bool videotrack;
int pos = m_projectTracks - 1;
p = playlists.item(j).toElement();
if (p.attribute("id") == playlist_name) break;
}
- videotrack = (e.attribute("hide") != "video");
- trackduration = slotAddProjectTrack(pos, p, videotrack);
+ if (e.attribute("hide") == "video") {
+ m_doc->switchTrackVideo(i - 1, true);
+ } else if (e.attribute("hide") == "audio") {
+ m_doc->switchTrackAudio(i - 1, true);
+ } else if (e.attribute("hide") == "both") {
+ m_doc->switchTrackVideo(i - 1, true);
+ m_doc->switchTrackAudio(i - 1, true);
+ }
+ trackduration = slotAddProjectTrack(pos, p);
pos--;
//kDebug() << " PRO DUR: " << trackduration << ", TRACK DUR: " << duration;
if (trackduration > duration) duration = trackduration;
view->headers_container->adjustSize();
}
-int TrackView::slotAddProjectTrack(int ix, QDomElement xml, bool videotrack) {
- TrackInfo info;
-
- if (videotrack) {
- info.type = VIDEOTRACK;
- info.isMute = false;
- info.isBlind = false;
- } else {
- info.type = AUDIOTRACK;
- info.isMute = false;
- info.isBlind = false;
- }
-
- m_trackview->addTrack(info);
+int TrackView::slotAddProjectTrack(int ix, QDomElement xml) {
int trackTop = KdenliveSettings::trackheight() * ix;
// parse track
int position = 0;
QVBoxLayout *m_tracksAreaLayout;
QString m_documentErrors;
void parseDocument(QDomDocument doc);
- int slotAddProjectTrack(int ix, QDomElement xml, bool videotrack);
+ int slotAddProjectTrack(int ix, QDomElement xml);
private slots:
void setCursorPos(int pos);