+
+QStringList CustomTrackView::getLadspaParams(QDomElement effect) const
+{
+ QStringList result;
+ QDomNodeList params = effect.elementsByTagName("parameter");
+ for (int i = 0; i < params.count(); i++) {
+ QDomElement e = params.item(i).toElement();
+ if (!e.isNull() && e.attribute("type") == "constant") {
+ if (e.hasAttribute("factor")) {
+ double factor = e.attribute("factor").toDouble();
+ double value = e.attribute("value").toDouble();
+ value = value / factor;
+ result.append(QString::number(value));
+ } else result.append(e.attribute("value"));
+ }
+ }
+ return result;
+}
+
+void CustomTrackView::clipNameChanged(const QString id, const QString name)
+{
+ QList<QGraphicsItem *> list = scene()->items();
+ ClipItem *clip = NULL;
+ for (int i = 0; i < list.size(); ++i) {
+ if (list.at(i)->type() == AVWIDGET) {
+ clip = static_cast <ClipItem *>(list.at(i));
+ if (clip->clipProducer() == id) {
+ clip->setClipName(name);
+ }
+ }
+ }
+ viewport()->update();
+}
+
+void CustomTrackView::getClipAvailableSpace(AbstractClipItem *item, GenTime &minimum, GenTime &maximum)
+{
+ minimum = GenTime();
+ maximum = GenTime();
+ QList<QGraphicsItem *> selection;
+ selection = m_scene->items(0, item->track() * m_tracksHeight + m_tracksHeight / 2, sceneRect().width(), 2);
+ selection.removeAll(item);
+ for (int i = 0; i < selection.count(); i++) {
+ AbstractClipItem *clip = static_cast <AbstractClipItem *>(selection.at(i));
+ if (clip && clip->type() == AVWIDGET) {
+ if (clip->endPos() <= item->startPos() && clip->endPos() > minimum) minimum = clip->endPos();
+ if (clip->startPos() > item->startPos() && (clip->startPos() < maximum || maximum == GenTime())) maximum = clip->startPos();
+ }
+ }
+}
+
+void CustomTrackView::getTransitionAvailableSpace(AbstractClipItem *item, GenTime &minimum, GenTime &maximum)
+{
+ minimum = GenTime();
+ maximum = GenTime();
+ QList<QGraphicsItem *> selection;
+ selection = m_scene->items(0, (item->track() + 1) * m_tracksHeight, sceneRect().width(), 2);
+ selection.removeAll(item);
+ for (int i = 0; i < selection.count(); i++) {
+ AbstractClipItem *clip = static_cast <AbstractClipItem *>(selection.at(i));
+ if (clip && clip->type() == TRANSITIONWIDGET) {
+ if (clip->endPos() <= item->startPos() && clip->endPos() > minimum) minimum = clip->endPos();
+ if (clip->startPos() > item->startPos() && (clip->startPos() < maximum || maximum == GenTime())) maximum = clip->startPos();
+ }
+ }
+}
+
+
+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(), true, 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;
+ }
+ }
+ 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(), true, 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(), true, 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(), true, 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();
+}
+
+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;
+ }
+ }
+ }
+}
+