#include "insertspacecommand.h"
#include "spacerdialog.h"
#include "addtrackcommand.h"
-#include "changetrackcommand.h"
#include "movegroupcommand.h"
#include "ui_addtrack_ui.h"
#include "initeffects.h"
#include "splitaudiocommand.h"
#include "changecliptypecommand.h"
#include "trackdialog.h"
+#include "tracksconfigdialog.h"
+#include "configtrackscommand.h"
#include <KDebug>
#include <KLocale>
while (!m_dragGuide && ct < collisionList.count()) {
if (collisionList.at(ct)->type() == AVWIDGET || collisionList.at(ct)->type() == TRANSITIONWIDGET) {
collisionClip = static_cast <AbstractClipItem *>(collisionList.at(ct));
- if (collisionClip == m_dragItem) {
+ if (collisionClip->isItemLocked())
+ break;
+ if (collisionClip == m_dragItem)
collisionClip = NULL;
- } else m_dragItem = collisionClip;
+ else
+ m_dragItem = collisionClip;
found = true;
m_dragItemInfo = m_dragItem->info();
if (m_dragItem->parentItem() && m_dragItem->parentItem()->type() == GROUPWIDGET && m_dragItem->parentItem() != m_selectionGroup) {
} else emit displayMessage(i18n("Item is locked"), ErrorMessage);
}
-void CustomTrackView::editKeyFrame(const GenTime pos, const int track, const int index, const QString keyframes)
+void CustomTrackView::editKeyFrame(const GenTime /*pos*/, const int /*track*/, const int /*index*/, const QString /*keyframes*/)
{
- ClipItem *clip = getClipItemAt((int)pos.frames(m_document->fps()), track);
+ /*ClipItem *clip = getClipItemAt((int)pos.frames(m_document->fps()), track);
if (clip) {
clip->setKeyframes(index, keyframes);
updateEffect(m_document->tracksCount() - clip->track(), clip->startPos(), clip->effectAt(index), index, false);
- } else emit displayMessage(i18n("Cannot find clip with keyframe"), ErrorMessage);
+ } else emit displayMessage(i18n("Cannot find clip with keyframe"), ErrorMessage);*/
}
AddTimelineClipCommand *command = new AddTimelineClipCommand(this, clip->toXML(), clip->getId(), pasteInfo, EffectsList(), m_scene->editMode() == OVERWRITEEDIT, m_scene->editMode() == INSERTEDIT, true, false);
m_commandStack->push(command);
+
+ selectClip(true, false);
+ // Automatic audio split
+ if (KdenliveSettings::splitaudio())
+ splitAudio();
}
bool CustomTrackView::insertDropClips(const QMimeData *data, const QPoint pos)
m_commandStack->push(command);
}
+void CustomTrackView::slotUpdateClipRegion(ClipItem *clip, int ix, QString region)
+{
+ QDomElement effect = clip->getEffectAt(ix);
+ QDomElement oldeffect = effect.cloneNode().toElement();
+ effect.setAttribute("region", region);
+ EditEffectCommand *command = new EditEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), oldeffect, effect, ix, true);
+ m_commandStack->push(command);
+}
+
ClipItem *CustomTrackView::cutClip(ItemInfo info, GenTime cutTime, bool cut, bool execute)
{
if (cut) {
brokenClips.clear();
if (addCommand->childCount() > 0) m_commandStack->push(addCommand);
else delete addCommand;
+
+ // Automatic audio split
+ if (KdenliveSettings::splitaudio())
+ splitAudio();
setDocumentModified();
/*
//QTimer::singleShot(500, this, SIGNAL(trackHeightChanged()));
}
-void CustomTrackView::changeTrack(int ix, TrackInfo type)
+void CustomTrackView::configTracks(QList < TrackInfo > trackInfos)
{
- int tracknumber = m_document->tracksCount() - ix;
- m_document->setTrackType(tracknumber - 1, type);
- m_document->renderer()->mltChangeTrackState(tracknumber, m_document->trackInfoAt(tracknumber - 1).isMute, m_document->trackInfoAt(tracknumber - 1).isBlind);
+ for (int i = 0; i < trackInfos.count(); ++i) {
+ m_document->setTrackType(i, trackInfos.at(i));
+ m_document->renderer()->mltChangeTrackState(i + 1, m_document->trackInfoAt(i).isMute, m_document->trackInfoAt(i).isBlind);
+ }
+
QTimer::singleShot(300, this, SIGNAL(trackHeightChanged()));
viewport()->update();
}
-
void CustomTrackView::slotSwitchTrackAudio(int ix)
{
/*for (int i = 0; i < m_document->tracksCount(); i++)
int tracknumber = m_document->tracksCount() - ix - 1;
m_document->switchTrackLock(tracknumber, lock);
emit doTrackLock(ix, lock);
+ AbstractClipItem *clip = NULL;
QList<QGraphicsItem *> selection = m_scene->items(0, ix * m_tracksHeight + m_tracksHeight / 2, sceneRect().width(), m_tracksHeight / 2 - 2);
for (int i = 0; i < selection.count(); i++) {
if (selection.at(i)->type() == AVWIDGET) emit clipItemSelected(NULL);
else emit transitionItemSelected(NULL);
}
- static_cast <AbstractClipItem *>(selection.at(i))->setItemLocked(lock);
+ clip = static_cast <AbstractClipItem *>(selection.at(i));
+ clip->setItemLocked(lock);
+ if (clip == m_dragItem)
+ m_dragItem = NULL;
}
kDebug() << "NEXT TRK STATE: " << m_document->trackInfoAt(tracknumber).isLocked;
viewport()->update();
track = (int)(mapToScene(m_menuPosition).y() / m_tracksHeight);
}
+ if (m_document->isTrackLocked(m_document->tracksCount() - track - 1)) {
+ emit displayMessage(i18n("Cannot remove space in a locked track"), ErrorMessage);
+ return;
+ }
+
ClipItem *item = getClipItemAt(pos, track);
if (item) {
emit displayMessage(i18n("You must be in an empty space to remove space (time: %1, track: %2)", m_document->timecode().getTimecodeFromFrames(mapToScene(m_menuPosition).x()), track), ErrorMessage);
pos = GenTime((int)(mapToScene(m_menuPosition).x()), m_document->fps());
track = (int)(mapToScene(m_menuPosition).y() / m_tracksHeight) + 1;
}
- SpacerDialog d(GenTime(65, m_document->fps()), m_document->timecode(), track, m_document->tracksCount() + 1, this);
+ SpacerDialog d(GenTime(65, m_document->fps()), m_document->timecode(), track, m_document->tracksList(), this);
if (d.exec() != QDialog::Accepted) return;
GenTime spaceDuration = d.selectedDuration();
track = d.selectedTrack();
- ClipItem *item = getClipItemAt(pos, track);
- if (item) pos = item->startPos();
+ QList<QGraphicsItem *> items;
+ if (track > 0) {
+ if (m_document->isTrackLocked(m_document->tracksCount() - track - 1)) {
+ emit displayMessage(i18n("Cannot insert space in a locked track"), ErrorMessage);
+ return;
+ }
- // Make sure there is no group in the way
- QRectF rect(pos.frames(m_document->fps()), track * m_tracksHeight + m_tracksHeight / 2, sceneRect().width() - pos.frames(m_document->fps()), m_tracksHeight / 2 - 2);
- bool isOk;
- QList<QGraphicsItem *> items = checkForGroups(rect, &isOk);
- if (!isOk) {
- // groups found on track, do not allow the move
- emit displayMessage(i18n("Cannot insert space in a track with a group"), ErrorMessage);
- return;
+ ClipItem *item = getClipItemAt(pos, track);
+ if (item) pos = item->startPos();
+
+ // Make sure there is no group in the way
+ QRectF rect(pos.frames(m_document->fps()), track * m_tracksHeight + m_tracksHeight / 2, sceneRect().width() - pos.frames(m_document->fps()), m_tracksHeight / 2 - 2);
+ bool isOk;
+ items = checkForGroups(rect, &isOk);
+ if (!isOk) {
+ // groups found on track, do not allow the move
+ emit displayMessage(i18n("Cannot insert space in a track with a group"), ErrorMessage);
+ return;
+ }
+ } else {
+ QRectF rect(pos.frames(m_document->fps()), 0, sceneRect().width() - pos.frames(m_document->fps()), m_document->tracksCount() * m_tracksHeight);
+ items = scene()->items(rect);
}
QList<ItemInfo> clipsToMove;
if (items.at(i)->type() == AVWIDGET || items.at(i)->type() == TRANSITIONWIDGET) {
AbstractClipItem *item = static_cast <AbstractClipItem *>(items.at(i));
ItemInfo info = item->info();
- if (item->type() == AVWIDGET) {
+ if (item->type() == AVWIDGET)
clipsToMove.append(info);
- } else if (item->type() == TRANSITIONWIDGET) {
+ else if (item->type() == TRANSITIONWIDGET)
transitionsToMove.append(info);
- }
}
}
- InsertSpaceCommand *command = new InsertSpaceCommand(this, clipsToMove, transitionsToMove, track, spaceDuration, true);
- m_commandStack->push(command);
+ if (!clipsToMove.isEmpty() || !transitionsToMove.isEmpty()) {
+ InsertSpaceCommand *command = new InsertSpaceCommand(this, clipsToMove, transitionsToMove, track, spaceDuration, true);
+ m_commandStack->push(command);
+ }
}
void CustomTrackView::insertSpace(QList<ItemInfo> clipsToMove, QList<ItemInfo> transToMove, int track, const GenTime duration, const GenTime offset)
}
}
resetSelectionGroup(false);
- if (track != -1) track = m_document->tracksCount() - track;
+ if (track != -1)
+ track = m_document->tracksCount() - track;
m_document->renderer()->mltInsertSpace(trackClipStartList, trackTransitionStartList, track, duration, offset);
}
void CustomTrackView::setCursorPos(int pos, bool seek)
{
+ kDebug() << "SEEk TO: " << pos << ", SEEK: " << seek;
if (pos == m_cursorPos) return;
emit cursorMoved((int)(m_cursorPos), (int)(pos));
m_cursorPos = pos;
if (itemList.at(i)->type() == GROUPWIDGET) {
groupCount++;
QList<QGraphicsItem *> children = itemList.at(i)->childItems();
- itemList += children;
QList <ItemInfo> clipInfos;
QList <ItemInfo> transitionInfos;
GenTime currentPos = GenTime(m_cursorPos, m_document->fps());
AbstractClipItem *clip = static_cast <AbstractClipItem *>(children.at(j));
if (!clip->isItemLocked()) transitionInfos.append(clip->info());
}
+ if (itemList.contains(children.at(j))) {
+ children.removeAt(j);
+ j--;
+ }
}
- if (clipInfos.count() > 0) {
+ itemList += children;
+ if (clipInfos.count() > 0)
new GroupClipsCommand(this, clipInfos, transitionInfos, false, deleteSelected);
- }
- }
+
+ } else if (itemList.at(i)->parentItem() && itemList.at(i)->parentItem()->type() == GROUPWIDGET)
+ itemList.insert(i + 1, itemList.at(i)->parentItem());
}
for (int i = 0; i < itemList.count(); i++) {
}
}
}
+
+ effectPos = item->hasEffect("affine", "pan_zoom");
+ if (effectPos != -1) {
+ QDomElement oldeffect = item->effectAt(effectPos);
+ int start = item->cropStart().frames(m_document->fps());
+ int max = start + item->cropDuration().frames(m_document->fps());
+ oldeffect.setAttribute("in", start);
+ oldeffect.setAttribute("out", max);
+ if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), item->getEffectArgs(oldeffect)))
+ emit displayMessage(i18n("Problem editing effect"), ErrorMessage);
+ // if effect is displayed, update the effect edit widget with new clip duration
+ if (item->isSelected() && effectPos == item->selectedEffectIndex()) emit clipItemSelected(item, effectPos);
+ }
}
double CustomTrackView::getSnapPointForPos(double pos)
void CustomTrackView::slotDeleteTrack(int ix)
{
+ if (m_document->tracksCount() < 2) return;
TrackDialog d(m_document, parentWidget());
d.label->setText(i18n("Delete track"));
d.before_select->setHidden(true);
}
}
-void CustomTrackView::slotChangeTrack(int ix)
+void CustomTrackView::slotConfigTracks(int ix)
{
- TrackDialog d(m_document, parentWidget());
- d.label->setText(i18n("Change track"));
- d.before_select->setHidden(true);
- d.track_nb->setMaximum(m_document->tracksCount() - 1);
- d.track_nb->setValue(ix);
- d.slotUpdateName(ix);
- d.setWindowTitle(i18n("Change Track Type"));
-
- TrackInfo oldInfo = m_document->trackInfoAt(m_document->tracksCount() - ix - 1);
- if (oldInfo.type == VIDEOTRACK)
- d.video_track->setChecked(true);
- else
- d.audio_track->setChecked(true);
-
+ TracksConfigDialog d(m_document, ix, parentWidget());
if (d.exec() == QDialog::Accepted) {
- TrackInfo info;
- info.isLocked = false;
- info.isMute = false;
- info.trackName = oldInfo.trackName;
- ix = d.track_nb->value();
-
- if (d.video_track->isChecked()) {
- info.type = VIDEOTRACK;
- info.isBlind = false;
- } else {
- info.type = AUDIOTRACK;
- info.isBlind = true;
+ ConfigTracksCommand *configTracks = new ConfigTracksCommand(this, m_document->tracksList(), d.tracksList());
+ m_commandStack->push(configTracks);
+ QList <int> toDelete = d.deletedTracks();
+ for (int i = 0; i < toDelete.count(); ++i) {
+ TrackInfo info = m_document->trackInfoAt(m_document->tracksCount() - toDelete.at(i) + i - 1);
+ deleteTimelineTrack(toDelete.at(i) - i, info);
}
- changeTimelineTrack(ix, info);
setDocumentModified();
}
}
-
void CustomTrackView::deleteTimelineTrack(int ix, TrackInfo trackinfo)
{
+ if (m_document->tracksCount() < 2) return;
double startY = ix * m_tracksHeight + 1 + m_tracksHeight / 2;
QRectF r(0, startY, sceneRect().width(), m_tracksHeight / 2 - 1);
QList<QGraphicsItem *> selection = m_scene->items(r);
m_commandStack->push(deleteTrack);
}
-void CustomTrackView::changeTimelineTrack(int ix, TrackInfo trackinfo)
-{
- TrackInfo oldinfo = m_document->trackInfoAt(m_document->tracksCount() - ix - 1);
- ChangeTrackCommand *changeTrack = new ChangeTrackCommand(this, ix, oldinfo, trackinfo);
- m_commandStack->push(changeTrack);
-}
-
void CustomTrackView::autoTransition()
{
QList<QGraphicsItem *> itemList = scene()->selectedItems();
}
}
-
void CustomTrackView::loadGroups(const QDomNodeList groups)
{
for (int i = 0; i < groups.count(); i++) {
resetSelectionGroup();
QList<QGraphicsItem *> selection = scene()->selectedItems();
if (selection.isEmpty()) {
- emit displayMessage(i18n("You must select one clip for this action"), ErrorMessage);
+ emit displayMessage(i18n("You must select at least one clip for this action"), ErrorMessage);
return;
}
QUndoCommand *splitCommand = new QUndoCommand();
}
}
}
- m_commandStack->push(splitCommand);
+ if (splitCommand->childCount() > 0)
+ m_commandStack->push(splitCommand);
}
void CustomTrackView::doSplitAudio(const GenTime &pos, int track, bool split)
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) {
+ if (m_document->trackInfoAt(freetrack - 1).type == AUDIOTRACK && !m_document->trackInfoAt(freetrack - 1).isLocked) {
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->cropDuration().frames(m_document->fps())) {
kDebug() << "FOUND SPACE ON TRK: " << freetrack;
viewport()->update();
}
-void CustomTrackView::selectClip(bool add, bool group)
+void CustomTrackView::selectClip(bool add, bool group, int track, int pos)
{
- QRectF rect(m_cursorPos, m_selectedTrack * m_tracksHeight + m_tracksHeight / 2, 1, 1);
+ QRectF rect;
+ if (track != -1 && pos != -1)
+ rect = QRectF(pos, track * m_tracksHeight + m_tracksHeight / 2, 1, 1);
+ else
+ rect = QRectF(m_cursorPos, m_selectedTrack * m_tracksHeight + m_tracksHeight / 2, 1, 1);
QList<QGraphicsItem *> selection = m_scene->items(rect);
resetSelectionGroup(group);
if (!group) m_scene->clearSelection();
adjustTimelineClips(OVERWRITEEDIT, NULL, info, addCommand);
new AddTimelineClipCommand(this, clip->toXML(), clip->getId(), info, EffectsList(), true, false, true, false, addCommand);
m_commandStack->push(addCommand);
+
+ selectClip(true, false, m_selectedTrack, in);
+ // Automatic audio split
+ if (KdenliveSettings::splitaudio())
+ splitAudio();
}
void CustomTrackView::clearSelection()
emit clipItemSelected(NULL);
}
+void CustomTrackView::updatePalette()
+{
+ if (m_cursorLine) {
+ QPen pen1 = QPen();
+ pen1.setWidth(1);
+ pen1.setColor(palette().text().color());
+ m_cursorLine->setPen(pen1);
+ }
+}