From a87b910ae8567b991c221cad12fd9a60dbdf03ae Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Thu, 11 Dec 2008 12:46:34 +0000 Subject: [PATCH] Almost solved all group move issues, still one lost synchro bug under investigation svn path=/branches/KDE4/; revision=2774 --- src/CMakeLists.txt | 1 + src/customtrackview.cpp | 109 ++++++++++++++++++++++++++++++++------- src/customtrackview.h | 3 +- src/docclipbase.cpp | 4 +- src/movegroupcommand.cpp | 43 +++++++++++++++ src/movegroupcommand.h | 50 ++++++++++++++++++ 6 files changed, 189 insertions(+), 21 deletions(-) create mode 100644 src/movegroupcommand.cpp create mode 100644 src/movegroupcommand.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index dfc8bf2f..34c80f92 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -138,6 +138,7 @@ set(kdenlive_SRCS spacerdialog.cpp addtrackcommand.cpp changetrackcommand.cpp + movegroupcommand.cpp ) if(NO_JOGSHUTTLE) diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index a24be286..475cf94b 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -65,6 +65,7 @@ #include "spacerdialog.h" #include "addtrackcommand.h" #include "changetrackcommand.h" +#include "movegroupcommand.h" #include "ui_addtrack_ui.h" //TODO: @@ -571,8 +572,8 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event) { if (event->button() == Qt::RightButton) { if (m_dragItem) { if (!m_dragItem->isSelected()) { + resetSelectionGroup(false); m_scene->clearSelection(); - resetSelectionGroup(); m_dragItem->setSelected(true); } } @@ -721,13 +722,13 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event) { //QGraphicsView::mousePressEvent(event); } -void CustomTrackView::resetSelectionGroup() { +void CustomTrackView::resetSelectionGroup(bool selectItems) { if (m_selectionGroup) { // delete selection group QList children = m_selectionGroup->childItems(); for (int i = 0; i < children.count(); i++) { children.at(i)->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); - children.at(i)->setSelected(true); + children.at(i)->setSelected(selectItems); } scene()->destroyItemGroup(m_selectionGroup); m_selectionGroup = NULL; @@ -735,6 +736,7 @@ void CustomTrackView::resetSelectionGroup() { } void CustomTrackView::groupSelectedItems() { + if (m_selectionGroup) kDebug() << "///// ERROR, TRYING TO OVERRIDE EXISTING GROUP"; QList selection = m_scene->selectedItems(); if (selection.count() > 1) { m_selectionGroup = new AbstractGroupItem(m_document->fps()); @@ -755,7 +757,7 @@ void CustomTrackView::groupSelectedItems() { m_selectionGroupInfo.startPos = GenTime(m_selectionGroup->scenePos().x(), m_document->fps()); m_selectionGroupInfo.track = m_selectionGroup->track(); } - } + } else resetSelectionGroup(); } void CustomTrackView::mouseDoubleClickEvent(QMouseEvent *event) { @@ -881,7 +883,7 @@ void CustomTrackView::dragEnterEvent(QDragEnterEvent * event) { } else if (event->mimeData()->hasFormat("kdenlive/producerslist")) { QStringList ids = QString(event->mimeData()->data("kdenlive/producerslist")).split(";"); m_scene->clearSelection(); - resetSelectionGroup(); + resetSelectionGroup(false); m_selectionGroup = new AbstractGroupItem(m_document->fps()); QPoint pos = QPoint(); @@ -1269,8 +1271,8 @@ void CustomTrackView::dragLeaveEvent(QDragLeaveEvent * event) { void CustomTrackView::dropEvent(QDropEvent * event) { if (m_selectionGroup) { QList items = m_selectionGroup->childItems(); - m_scene->clearSelection(); resetSelectionGroup(); + m_scene->clearSelection(); for (int i = 0; i < items.count(); i++) { ClipItem *item = static_cast (items.at(i)); AddTimelineClipCommand *command = new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->info(), item->effectList(), false, false); @@ -1677,12 +1679,14 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) { QList items = m_selectionGroup->childItems(); + QList clipsToMove = QList (); + QList transitionsToMove = QList (); + GenTime timeOffset = GenTime(m_selectionGroup->scenePos().x(), m_document->fps()) - m_selectionGroupInfo.startPos; const int trackOffset = m_selectionGroup->track() - m_selectionGroupInfo.track; - // kDebug() << "&DROPPED GRPOUP:" << timeOffset.frames(25) << "TRK OFF: " << trackOffset; if (timeOffset != GenTime() || trackOffset != 0) { QUndoCommand *moveClips = new QUndoCommand(); - moveClips->setText("Move clips"); + moveClips->setText(i18n("Move group")); // remove items in MLT playlist for (int i = 0; i < items.count(); i++) { AbstractClipItem *item = static_cast (items.at(i)); @@ -1692,13 +1696,11 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) { // error, clip cannot be removed from playlist emit displayMessage(i18n("Error removing clip at %1 on track %2", m_document->timecode().getTimecodeFromFrames(info.startPos.frames(m_document->fps())), info.track), ErrorMessage); } else { - // clip removed from playlist, create command - ClipItem *clip = static_cast (item); - new AddTimelineClipCommand(this, clip->xml(), clip->clipProducer(), info, clip->effectList(), false, true, moveClips); + clipsToMove.append(info); } } else { + transitionsToMove.append(info); Transition *tr = static_cast (item); - new AddTransitionCommand(this, info, tr->transitionEndTrack(), tr->toXML(), true, false, moveClips); m_document->renderer()->mltDeleteTransition(tr->transitionTag(), tr->transitionEndTrack(), m_document->tracksCount() - info.track, info.startPos, info.endPos, tr->toXML()); } } @@ -1708,12 +1710,8 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) { AbstractClipItem *item = static_cast (items.at(i)); item->updateItem(); ItemInfo info = item->info(); - /*info.startPos = info.startPos + timeOffset; - info.endPos = info.endPos + timeOffset; - info.track = info.track + trackOffset;*/ if (item->type() == AVWIDGET) { ClipItem *clip = static_cast (item); - new AddTimelineClipCommand(this, clip->xml(), clip->clipProducer(), info, clip->effectList(), false, false, moveClips); info.track = m_document->tracksCount() - info.track; m_document->renderer()->mltInsertClip(info, clip->xml(), clip->baseClip()->producer(info.track)); } else { @@ -1723,12 +1721,15 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) { newTrack += trackOffset; if (newTrack < 0 || newTrack > m_document->tracksCount()) newTrack = getPreviousVideoTrack(info.track); } - new AddTransitionCommand(this, info, newTrack, tr->toXML(), false, false, moveClips); - + tr->updateTransitionEndTrack(newTrack); m_document->renderer()->mltAddTransition(tr->transitionTag(), newTrack, m_document->tracksCount() - info.track, info.startPos, info.endPos, tr->toXML()); } } + + new MoveGroupCommand(this, clipsToMove, transitionsToMove, timeOffset, trackOffset, false, moveClips); m_commandStack->push(moveClips); + m_selectionGroupInfo.startPos = GenTime(m_selectionGroup->scenePos().x(), m_document->fps()); + m_selectionGroupInfo.track = m_selectionGroup->track(); } } @@ -2039,6 +2040,78 @@ void CustomTrackView::moveClip(const ItemInfo start, const ItemInfo end) { } } +void CustomTrackView::moveGroup(QList startClip, QList startTransition, const GenTime offset, const int trackOffset, bool reverseMove) { + // Group Items + kDebug() << "// GROUP MOVE; OFFSET: " << offset.frames(25) << ", TK OFF: " << trackOffset; + resetSelectionGroup(); + m_scene->clearSelection(); + for (int i = 0; i < startClip.count(); i++) { + if (reverseMove) { + startClip[i].startPos = startClip.at(i).startPos - offset; + startClip[i].track = startClip.at(i).track - trackOffset; + } + ClipItem *clip = getClipItemAt(startClip.at(i).startPos, startClip.at(i).track); + if (clip) { + clip->setSelected(true); + m_document->renderer()->mltRemoveClip(m_document->tracksCount() - startClip.at(i).track, startClip.at(i).startPos); + } + } + for (int i = 0; i < startTransition.count(); i++) { + if (reverseMove) { + startTransition[i].startPos = startTransition.at(i).startPos - offset; + startTransition[i].track = startTransition.at(i).track - trackOffset; + } + Transition *tr = getTransitionItemAt(startTransition.at(i).startPos, startTransition.at(i).track); + if (tr) { + tr->setSelected(true); + m_document->renderer()->mltDeleteTransition(tr->transitionTag(), tr->transitionEndTrack(), m_document->tracksCount() - startTransition.at(i).track, startTransition.at(i).startPos, startTransition.at(i).endPos, tr->toXML()); + } + } + groupSelectedItems(); + if (m_selectionGroup) { + QPointF pos = m_selectionGroup->pos(); + qreal posx = pos.x() + offset.frames(m_document->fps()); + qreal posy = pos.y() + trackOffset * (qreal) m_tracksHeight; + m_selectionGroup->setPos(posx, posy); + m_selectionGroupInfo.startPos = GenTime(m_selectionGroup->scenePos().x(), m_document->fps()); + m_selectionGroupInfo.track = m_selectionGroup->track(); + kDebug() << "// Current GRUOP POS: " << pos.y() << ", TK OFF: " << trackOffset << ", TK HG: " << m_tracksHeight << ", POS: " << posx << "x" << posy; + + /*QPointF top = m_selectionGroup->boundingRect().topLeft(); + const int width = m_selectionGroup->boundingRect().width(); + const int height = m_selectionGroup->boundingRect().height(); + m_selectionGroup->setPos(top); + m_selectionGroup->translate(-top.x(), -top.y() + 1); + m_selectionGroupInfo.startPos = GenTime(m_selectionGroup->scenePos().x(), m_document->fps()); + m_selectionGroupInfo.track = m_selectionGroup->track();*/ + + QList children = m_selectionGroup->childItems(); + for (int i = 0; i < children.count(); i++) { + // re-add items in correct place + AbstractClipItem *item = static_cast (children.at(i)); + item->updateItem(); + ItemInfo info = item->info(); + if (item->type() == AVWIDGET) { + ClipItem *clip = static_cast (item); + info.track = m_document->tracksCount() - info.track; + m_document->renderer()->mltInsertClip(info, clip->xml(), clip->baseClip()->producer(info.track)); + } else { + Transition *tr = static_cast (item); + int newTrack = tr->transitionEndTrack(); + kDebug() << "/// TRANSITION CURR TRK: " << newTrack; + if (!tr->forcedTrack()) { + newTrack += trackOffset; + if (newTrack < 0 || newTrack > m_document->tracksCount()) newTrack = getPreviousVideoTrack(info.track); + } + tr->updateTransitionEndTrack(newTrack); + kDebug() << "/// TRANSITION UPDATED TRK: " << newTrack; + m_document->renderer()->mltAddTransition(tr->transitionTag(), newTrack, m_document->tracksCount() - info.track, info.startPos, info.endPos, tr->toXML()); + } + } + } + +} + void CustomTrackView::moveTransition(const ItemInfo start, const ItemInfo end) { Transition *item = getTransitionItemAt((int)start.startPos.frames(m_document->fps()), start.track); if (!item) { diff --git a/src/customtrackview.h b/src/customtrackview.h index 9c6a91ec..02c93a7f 100644 --- a/src/customtrackview.h +++ b/src/customtrackview.h @@ -54,6 +54,7 @@ public: int cursorPos(); void checkAutoScroll(); void moveClip(const ItemInfo start, const ItemInfo end); + void moveGroup(QList startClip, QList startTransition, const GenTime offset, const int trackOffset, bool reverseMove = false); /** 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); @@ -212,7 +213,7 @@ private: ClipItem *getClipUnderCursor() const; ClipItem *getMainActiveClip() const; bool insertPossible(AbstractGroupItem *group, const QPoint &pos) const; - void resetSelectionGroup(); + void resetSelectionGroup(bool selectItems = true); void groupSelectedItems(); private slots: diff --git a/src/docclipbase.cpp b/src/docclipbase.cpp index dc1bba96..7950189e 100644 --- a/src/docclipbase.cpp +++ b/src/docclipbase.cpp @@ -390,9 +390,9 @@ void DocClipBase::setProducer(Mlt::Producer *producer) { } Mlt::Producer *DocClipBase::producer(int track) { - for (int i = 0; i < m_baseTrackProducers.count(); i++) { + /*for (int i = 0; i < m_baseTrackProducers.count(); i++) { if (m_baseTrackProducers.at(i)) kDebug() << "// PROD: " << i << ", ID: " << m_baseTrackProducers.at(i)->get("id"); - } + }*/ if (track == -1 || (m_clipType != AUDIO && m_clipType != AV)) { if (m_baseTrackProducers.count() == 0) return NULL; int i; diff --git a/src/movegroupcommand.cpp b/src/movegroupcommand.cpp new file mode 100644 index 00000000..38b2ba8f --- /dev/null +++ b/src/movegroupcommand.cpp @@ -0,0 +1,43 @@ +/*************************************************************************** + * Copyright (C) 2007 by Jean-Baptiste Mardelle (jb@kdenlive.org) * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + +#include + +#include "movegroupcommand.h" +#include "customtrackview.h" + +MoveGroupCommand::MoveGroupCommand(CustomTrackView *view, const QList startClip, const QList startTransition, const GenTime offset, const int trackOffset, bool doIt, QUndoCommand * parent) : QUndoCommand(parent), m_view(view), m_startClip(startClip), m_startTransition(startTransition), m_offset(offset), m_trackOffset(trackOffset), m_doIt(doIt) { + setText(i18n("Move clip")); +} + + +// virtual +void MoveGroupCommand::undo() { +// kDebug()<<"---- undoing action"; + m_doIt = true; + m_view->moveGroup(m_startClip, m_startTransition, GenTime() - m_offset, - m_trackOffset, true); +} +// virtual +void MoveGroupCommand::redo() { + kDebug() << "---- redoing action"; + if (m_doIt) + m_view->moveGroup(m_startClip, m_startTransition, m_offset, m_trackOffset); + m_doIt = true; +} + diff --git a/src/movegroupcommand.h b/src/movegroupcommand.h new file mode 100644 index 00000000..d5cae663 --- /dev/null +++ b/src/movegroupcommand.h @@ -0,0 +1,50 @@ +/*************************************************************************** + * Copyright (C) 2007 by Jean-Baptiste Mardelle (jb@kdenlive.org) * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + + +#ifndef MOVEGROUPCOMMAND_H +#define MOVEGROUPCOMMAND_H + +#include +#include +#include + +#include +#include "definitions.h" + +class GenTime; +class CustomTrackView; + +class MoveGroupCommand : public QUndoCommand { +public: + MoveGroupCommand(CustomTrackView *view, const QList startClip, const QList startTransition, const GenTime offset, const int trackOffset, bool doIt, QUndoCommand * parent = 0); + virtual void undo(); + virtual void redo(); + +private: + CustomTrackView *m_view; + const QList m_startClip; + const QList m_startTransition; + const GenTime m_offset; + const int m_trackOffset; + bool m_doIt; +}; + +#endif + -- 2.39.5