+
+void CustomTrackView::loadGroups(const QDomNodeList groups)
+{
+ for (int i = 0; i < groups.count(); i++) {
+ QDomNodeList children = groups.at(i).childNodes();
+ scene()->clearSelection();
+ for (int nodeindex = 0; nodeindex < children.count(); nodeindex++) {
+ QDomNode n = children.item(nodeindex);
+ QDomElement elem = n.toElement();
+ int pos = elem.attribute("position").toInt();
+ int track = elem.attribute("track").toInt();
+ if (elem.tagName() == "clipitem") {
+ ClipItem *clip = getClipItemAt(pos, track); //m_document->tracksCount() - transitiontrack);
+ if (clip) clip->setSelected(true);
+ } else {
+ Transition *clip = getTransitionItemAt(pos, track); //m_document->tracksCount() - transitiontrack);
+ if (clip) clip->setSelected(true);
+ }
+ }
+ groupSelectedItems(false, true);
+ }
+}
+
+void CustomTrackView::splitAudio()
+{
+ resetSelectionGroup();
+ QList<QGraphicsItem *> selection = scene()->selectedItems();
+ if (selection.isEmpty()) {
+ emit displayMessage(i18n("You must select one clip for this action"), ErrorMessage);
+ return;
+ }
+ QUndoCommand *splitCommand = new QUndoCommand();
+ splitCommand->setText(i18n("Split audio"));
+ for (int i = 0; i < selection.count(); i++) {
+ if (selection.at(i)->type() == AVWIDGET) {
+ ClipItem *clip = static_cast <ClipItem *>(selection.at(i));
+ if (clip->clipType() == AV || clip->clipType() == PLAYLIST) {
+ if (clip->parentItem()) {
+ emit displayMessage(i18n("Cannot split audio of grouped clips"), ErrorMessage);
+ } else {
+ new SplitAudioCommand(this, clip->track(), clip->startPos(), splitCommand);
+ }
+ }
+ }
+ }
+ m_commandStack->push(splitCommand);
+}
+
+void CustomTrackView::doSplitAudio(const GenTime &pos, int track, bool split)
+{
+ ClipItem *clip = getClipItemAt(pos, track);
+ if (clip == NULL) {
+ kDebug() << "// Cannot find clip to split!!!";
+ return;
+ }
+ if (split) {
+ int start = pos.frames(m_document->fps());
+ int freetrack = m_document->tracksCount() - track - 1;
+ for (; freetrack > 0; freetrack--) {
+ kDebug() << "// CHK DOC TRK:" << freetrack << ", DUR:" << m_document->renderer()->mltTrackDuration(freetrack);
+ if (m_document->trackInfoAt(freetrack - 1).type == AUDIOTRACK) {
+ kDebug() << "// CHK DOC TRK:" << freetrack << ", DUR:" << m_document->renderer()->mltTrackDuration(freetrack);
+ if (m_document->renderer()->mltTrackDuration(freetrack) < start || m_document->renderer()->mltGetSpaceLength(pos, freetrack, false) >= clip->duration().frames(m_document->fps())) {
+ kDebug() << "FOUND SPACE ON TRK: " << freetrack;
+ break;
+ }
+ }
+ }
+ kDebug() << "GOT TRK: " << track;
+ if (freetrack == 0) {
+ emit displayMessage(i18n("No empty space to put clip audio"), ErrorMessage);
+ } else {
+ ItemInfo info;
+ info.startPos = clip->startPos();
+ info.endPos = clip->endPos();
+ info.cropStart = clip->cropStart();
+ info.track = m_document->tracksCount() - freetrack;
+ addClip(clip->xml(), clip->clipProducer(), info, clip->effectList());
+ scene()->clearSelection();
+ clip->setSelected(true);
+ ClipItem *audioClip = getClipItemAt(start, info.track);
+ if (audioClip) {
+ clip->setVideoOnly(true);
+ m_document->renderer()->mltUpdateClipProducer(m_document->tracksCount() - track, start, clip->baseClip()->videoProducer());
+ m_document->renderer()->mltUpdateClipProducer(m_document->tracksCount() - info.track, start, clip->baseClip()->audioProducer(info.track));
+ audioClip->setSelected(true);
+ audioClip->setAudioOnly(true);
+ groupSelectedItems(false, true);
+ }
+ }
+ } else {
+ // unsplit clip: remove audio part and change video part to normal clip
+ if (clip->parentItem() == NULL || clip->parentItem()->type() != GROUPWIDGET) {
+ kDebug() << "//CANNOT FIND CLP GRP";
+ return;
+ }
+ AbstractGroupItem *grp = static_cast <AbstractGroupItem *>(clip->parentItem());
+ QList<QGraphicsItem *> children = grp->childItems();
+ if (children.count() != 2) {
+ kDebug() << "//SOMETHING IS WRONG WITH CLP GRP";
+ return;
+ }
+ for (int i = 0; i < children.count(); i++) {
+ if (children.at(i) != clip) {
+ ClipItem *clp = static_cast <ClipItem *>(children.at(i));
+ ItemInfo info = clip->info();
+ deleteClip(clp->info());
+ clip->setVideoOnly(false);
+ m_document->renderer()->mltUpdateClipProducer(m_document->tracksCount() - info.track, info.startPos.frames(m_document->fps()), clip->baseClip()->producer(info.track));
+ break;
+ }
+ }
+ clip->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
+ m_document->clipManager()->removeGroup(grp);
+ scene()->destroyItemGroup(grp);
+ }
+}
+
+void CustomTrackView::setVideoOnly()
+{
+ resetSelectionGroup();
+ QList<QGraphicsItem *> selection = scene()->selectedItems();
+ if (selection.isEmpty()) {
+ emit displayMessage(i18n("You must select one clip for this action"), ErrorMessage);
+ return;
+ }
+ QUndoCommand *videoCommand = new QUndoCommand();
+ videoCommand->setText(i18n("Video only"));
+ for (int i = 0; i < selection.count(); i++) {
+ if (selection.at(i)->type() == AVWIDGET) {
+ ClipItem *clip = static_cast <ClipItem *>(selection.at(i));
+ if (clip->clipType() == AV || clip->clipType() == PLAYLIST) {
+ if (clip->parentItem()) {
+ emit displayMessage(i18n("Cannot change grouped clips"), ErrorMessage);
+ } else {
+ new ChangeClipTypeCommand(this, clip->track(), clip->startPos(), true, false, clip->isVideoOnly(), clip->isAudioOnly(), videoCommand);
+ }
+ }
+ }
+ }
+ m_commandStack->push(videoCommand);
+}
+
+void CustomTrackView::setAudioOnly()
+{
+ resetSelectionGroup();
+ QList<QGraphicsItem *> selection = scene()->selectedItems();
+ if (selection.isEmpty()) {
+ emit displayMessage(i18n("You must select one clip for this action"), ErrorMessage);
+ return;
+ }
+ QUndoCommand *videoCommand = new QUndoCommand();
+ videoCommand->setText(i18n("Audio only"));
+ for (int i = 0; i < selection.count(); i++) {
+ if (selection.at(i)->type() == AVWIDGET) {
+ ClipItem *clip = static_cast <ClipItem *>(selection.at(i));
+ if (clip->clipType() == AV || clip->clipType() == PLAYLIST) {
+ if (clip->parentItem()) {
+ emit displayMessage(i18n("Cannot change grouped clips"), ErrorMessage);
+ } else {
+ new ChangeClipTypeCommand(this, clip->track(), clip->startPos(), false, true, clip->isVideoOnly(), clip->isAudioOnly(), videoCommand);
+ }
+ }
+ }
+ }
+ m_commandStack->push(videoCommand);
+}
+
+void CustomTrackView::setAudioAndVideo()
+{
+ resetSelectionGroup();
+ QList<QGraphicsItem *> selection = scene()->selectedItems();
+ if (selection.isEmpty()) {
+ emit displayMessage(i18n("You must select one clip for this action"), ErrorMessage);
+ return;
+ }
+ QUndoCommand *videoCommand = new QUndoCommand();
+ videoCommand->setText(i18n("Audio and Video"));
+ for (int i = 0; i < selection.count(); i++) {
+ if (selection.at(i)->type() == AVWIDGET) {
+ ClipItem *clip = static_cast <ClipItem *>(selection.at(i));
+ if (clip->clipType() == AV || clip->clipType() == PLAYLIST) {
+ if (clip->parentItem()) {
+ emit displayMessage(i18n("Cannot change grouped clips"), ErrorMessage);
+ } else {
+ new ChangeClipTypeCommand(this, clip->track(), clip->startPos(), false, false, clip->isVideoOnly(), clip->isAudioOnly(), videoCommand);
+ }
+ }
+ }
+ }
+ m_commandStack->push(videoCommand);
+}
+
+void CustomTrackView::doChangeClipType(const GenTime &pos, int track, bool videoOnly, bool audioOnly)
+{
+ ClipItem *clip = getClipItemAt(pos, track);
+ if (clip == NULL) {
+ kDebug() << "// Cannot find clip to split!!!";
+ return;
+ }
+ if (videoOnly) {
+ int start = pos.frames(m_document->fps());
+ clip->setVideoOnly(true);
+ clip->setAudioOnly(false);
+ m_document->renderer()->mltUpdateClipProducer(m_document->tracksCount() - track, start, clip->baseClip()->videoProducer());
+ } else if (audioOnly) {
+ int start = pos.frames(m_document->fps());
+ clip->setAudioOnly(true);
+ clip->setVideoOnly(false);
+ m_document->renderer()->mltUpdateClipProducer(m_document->tracksCount() - track, start, clip->baseClip()->audioProducer(track));
+ } else {
+ int start = pos.frames(m_document->fps());
+ clip->setAudioOnly(false);
+ clip->setVideoOnly(false);
+ m_document->renderer()->mltUpdateClipProducer(m_document->tracksCount() - track, start, clip->baseClip()->producer(track));
+ }
+ clip->update();
+ m_document->setModified(true);
+}
+
+void CustomTrackView::updateClipTypeActions(ClipItem *clip)
+{
+ if (clip == NULL || (clip->clipType() != AV && clip->clipType() != PLAYLIST)) {
+ m_clipTypeGroup->setEnabled(false);
+ } else {
+ m_clipTypeGroup->setEnabled(true);
+ QList <QAction *> actions = m_clipTypeGroup->actions();
+ QString lookup;
+ if (clip->isAudioOnly()) lookup = "clip_audio_only";
+ else if (clip->isVideoOnly()) lookup = "clip_video_only";
+ else lookup = "clip_audio_and_video";
+ for (int i = 0; i < actions.count(); i++) {
+ if (actions.at(i)->data().toString() == lookup) {
+ actions.at(i)->setChecked(true);
+ break;
+ }
+ }
+ }
+}
+
+void CustomTrackView::reloadTransitionLumas()
+{
+ QString lumaNames;
+ QString lumaFiles;
+ QDomElement lumaTransition = MainWindow::transitions.getEffectByTag("luma", "luma");
+ QDomNodeList params = lumaTransition.elementsByTagName("parameter");
+ for (int i = 0; i < params.count(); i++) {
+ QDomElement e = params.item(i).toElement();
+ if (e.attribute("tag") == "resource") {
+ lumaNames = e.attribute("paramlistdisplay");
+ lumaFiles = e.attribute("paramlist");
+ break;
+ }
+ }
+
+ QList<QGraphicsItem *> itemList = items();
+ Transition *transitionitem;
+ QDomElement transitionXml;
+ for (int i = 0; i < itemList.count(); i++) {
+ if (itemList.at(i)->type() == TRANSITIONWIDGET) {
+ transitionitem = static_cast <Transition*>(itemList.at(i));
+ transitionXml = transitionitem->toXML();
+ if (transitionXml.attribute("id") == "luma" && transitionXml.attribute("tag") == "luma") {
+ QDomNodeList params = transitionXml.elementsByTagName("parameter");
+ for (int i = 0; i < params.count(); i++) {
+ QDomElement e = params.item(i).toElement();
+ if (e.attribute("tag") == "resource") {
+ e.setAttribute("paramlistdisplay", lumaNames);
+ e.setAttribute("paramlist", lumaFiles);
+ break;
+ }
+ }
+ }
+ if (transitionXml.attribute("id") == "composite" && transitionXml.attribute("tag") == "composite") {
+ QDomNodeList params = transitionXml.elementsByTagName("parameter");
+ for (int i = 0; i < params.count(); i++) {
+ QDomElement e = params.item(i).toElement();
+ if (e.attribute("tag") == "luma") {
+ e.setAttribute("paramlistdisplay", lumaNames);
+ e.setAttribute("paramlist", lumaFiles);
+ break;
+ }
+ }
+ }
+ }
+ }
+ emit transitionItemSelected(NULL);
+}
+