From a7ebedd5e4c6d7661e19cd3a723f2fdaafdca173 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Thu, 27 Mar 2008 21:35:59 +0000 Subject: [PATCH] First big cleanup of transition / clipitem. Transitions are a bit broken for now, should be fixed soon svn path=/branches/KDE4/; revision=2128 --- src/abstractclipitem.cpp | 11 +- src/abstractclipitem.h | 2 +- src/addtimelineclipcommand.cpp | 12 +- src/addtimelineclipcommand.h | 8 +- src/addtransitioncommand.cpp | 10 +- src/addtransitioncommand.h | 9 +- src/clipitem.cpp | 20 ++- src/clipitem.h | 3 +- src/customtrackview.cpp | 229 ++++++++++++++++----------------- src/customtrackview.h | 19 +-- src/definitions.h | 8 ++ src/moveclipcommand.cpp | 4 +- src/moveclipcommand.h | 7 +- src/movetransitioncommand.cpp | 7 +- src/movetransitioncommand.h | 10 +- src/resizeclipcommand.cpp | 9 +- src/resizeclipcommand.h | 9 +- src/trackview.cpp | 11 +- src/transition.cpp | 196 ++++++---------------------- src/transition.h | 43 ++----- src/transitionsettings.cpp | 27 ++-- 21 files changed, 269 insertions(+), 385 deletions(-) diff --git a/src/abstractclipitem.cpp b/src/abstractclipitem.cpp index eac2062d..eee21fba 100644 --- a/src/abstractclipitem.cpp +++ b/src/abstractclipitem.cpp @@ -4,8 +4,11 @@ #include #include -AbstractClipItem::AbstractClipItem(const QRectF& rect): QGraphicsRectItem(rect), m_startFade(0), m_endFade(0) { +AbstractClipItem::AbstractClipItem(const ItemInfo info, const QRectF& rect): QGraphicsRectItem(rect), m_startFade(0), m_endFade(0) { setFlags(QGraphicsItem::ItemClipsToShape | QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); + setTrack(info.track); + m_startPos = info.startPos; + m_maxDuration = info.endPos - info.startPos; } void AbstractClipItem::moveTo(int x, double scale, int offset, int newTrack) { double origX = rect().x(); @@ -64,14 +67,14 @@ void AbstractClipItem::resizeStart(int posx, double scale) { if (durationDiff == GenTime()) return; //kDebug() << "-- RESCALE: CROP=" << m_cropStart << ", DIFF = " << durationDiff; - if (m_cropStart + durationDiff < GenTime() && type() == AVWIDGET) { + if (type() == AVWIDGET && m_cropStart + durationDiff < GenTime()) { durationDiff = GenTime() - m_cropStart; } else if (durationDiff >= m_cropDuration) { durationDiff = m_cropDuration - GenTime(3, m_fps); } m_startPos += durationDiff; - m_cropStart += durationDiff; + if (type() == AVWIDGET) m_cropStart += durationDiff; m_cropDuration = m_cropDuration - durationDiff; setRect(m_startPos.frames(m_fps) * scale, rect().y(), m_cropDuration.frames(m_fps) * scale, rect().height()); QList collisionList = collidingItems(Qt::IntersectsItemBoundingRect); @@ -81,7 +84,7 @@ void AbstractClipItem::resizeStart(int posx, double scale) { GenTime diff = ((AbstractClipItem *)item)->endPos() + GenTime(1, m_fps) - m_startPos; setRect((m_startPos + diff).frames(m_fps) * scale, rect().y(), (m_cropDuration - diff).frames(m_fps) * scale, rect().height()); m_startPos += diff; - m_cropStart += diff; + if (type() == AVWIDGET) m_cropStart += diff; m_cropDuration = m_cropDuration - diff; break; } diff --git a/src/abstractclipitem.h b/src/abstractclipitem.h index 621cedb0..677a0491 100644 --- a/src/abstractclipitem.h +++ b/src/abstractclipitem.h @@ -8,7 +8,7 @@ class AbstractClipItem : public QObject , public QGraphicsRectItem { Q_OBJECT public: - AbstractClipItem(const QRectF& rect); + AbstractClipItem(const ItemInfo info, const QRectF& rect); virtual OPERATIONTYPE operationMode(QPointF pos, double scale) = 0; virtual GenTime startPos() const ; virtual void setTrack(int track); diff --git a/src/addtimelineclipcommand.cpp b/src/addtimelineclipcommand.cpp index 1ef0e60a..15ac2bdd 100644 --- a/src/addtimelineclipcommand.cpp +++ b/src/addtimelineclipcommand.cpp @@ -22,8 +22,8 @@ #include "addtimelineclipcommand.h" #include "customtrackview.h" -AddTimelineClipCommand::AddTimelineClipCommand(CustomTrackView *view, QDomElement xml, int clipId, int track, GenTime startpos, QRectF rect, GenTime duration, bool doIt, bool doRemove) - : m_view(view), m_xml(xml), m_clipId(clipId), m_clipTrack(track), m_clipPos(startpos), m_clipRect(rect), m_clipDuration(duration), m_doIt(doIt), m_remove(doRemove) { +AddTimelineClipCommand::AddTimelineClipCommand(CustomTrackView *view, QDomElement xml, int clipId, ItemInfo info, bool doIt, bool doRemove) + : m_view(view), m_xml(xml), m_clipId(clipId), m_clipInfo(info), m_doIt(doIt), m_remove(doRemove) { if (!m_remove) setText(i18n("Add timeline clip")); else setText(i18n("Delete timeline clip")); } @@ -31,14 +31,14 @@ AddTimelineClipCommand::AddTimelineClipCommand(CustomTrackView *view, QDomElemen // virtual void AddTimelineClipCommand::undo() { - if (!m_remove) m_view->deleteClip(m_clipTrack, m_clipPos, m_clipRect); - else m_view->addClip(m_xml, m_clipId, m_clipTrack, m_clipPos, m_clipRect, m_clipDuration); + if (!m_remove) m_view->deleteClip(m_clipInfo); + else m_view->addClip(m_xml, m_clipId, m_clipInfo); } // virtual void AddTimelineClipCommand::redo() { if (m_doIt) { - if (!m_remove) m_view->addClip(m_xml, m_clipId, m_clipTrack, m_clipPos, m_clipRect, m_clipDuration); - else m_view->deleteClip(m_clipTrack, m_clipPos, m_clipRect); + if (!m_remove) m_view->addClip(m_xml, m_clipId, m_clipInfo); + else m_view->deleteClip(m_clipInfo); } m_doIt = true; } diff --git a/src/addtimelineclipcommand.h b/src/addtimelineclipcommand.h index 8c060c1c..487e18ea 100644 --- a/src/addtimelineclipcommand.h +++ b/src/addtimelineclipcommand.h @@ -28,23 +28,21 @@ #include #include "gentime.h" +#include "definitions.h" class CustomTrackView; class AddTimelineClipCommand : public QUndoCommand { public: - AddTimelineClipCommand(CustomTrackView *view, QDomElement xml, int clipId, int track, GenTime startpos, QRectF rect, GenTime duration, bool doIt, bool doRemove); + AddTimelineClipCommand(CustomTrackView *view, QDomElement xml, int clipId, ItemInfo info, bool doIt, bool doRemove); virtual void undo(); virtual void redo(); private: CustomTrackView *m_view; - GenTime m_clipDuration; + ItemInfo m_clipInfo; int m_clipId; QDomElement m_xml; - int m_clipTrack; - GenTime m_clipPos; - QRectF m_clipRect; bool m_doIt; bool m_remove; }; diff --git a/src/addtransitioncommand.cpp b/src/addtransitioncommand.cpp index 54250d28..81406679 100644 --- a/src/addtransitioncommand.cpp +++ b/src/addtransitioncommand.cpp @@ -19,7 +19,7 @@ #include "addtransitioncommand.h" #include "customtrackview.h" -AddTransitionCommand::AddTransitionCommand(CustomTrackView *view, int track, QDomElement xml, GenTime pos, bool doIt) : m_view(view), m_track(track), m_xml(xml), m_pos(pos), m_doIt(doIt) { +AddTransitionCommand::AddTransitionCommand(CustomTrackView *view, ItemInfo info, int transitiontrack, QMap desc, QDomElement params, bool doIt) : m_view(view), m_info(info), m_track(transitiontrack), m_desc(desc), m_params(params), m_doIt(doIt) { if (m_doIt) setText(i18n("Add transition to clip")); else setText(i18n("Delete transition from clip")); } @@ -27,13 +27,13 @@ AddTransitionCommand::AddTransitionCommand(CustomTrackView *view, int track, QDo // virtual void AddTransitionCommand::undo() { - if (m_doIt) m_view->deleteTransition(m_track, m_pos, m_xml); - else m_view->addTransition(m_track , m_pos, m_xml); + if (m_doIt) m_view->deleteTransition(m_info, m_track, m_desc, m_params); + else m_view->addTransition(m_info, m_track, m_desc, m_params); } // virtual void AddTransitionCommand::redo() { - if (m_doIt) m_view->addTransition(m_track , m_pos, m_xml); - else m_view->deleteTransition(m_track, m_pos, m_xml); + if (m_doIt) m_view->addTransition(m_info, m_track, m_desc, m_params); + else m_view->deleteTransition(m_info, m_track, m_desc, m_params); m_doIt = true; } diff --git a/src/addtransitioncommand.h b/src/addtransitioncommand.h index dfa07f70..61d1940f 100644 --- a/src/addtransitioncommand.h +++ b/src/addtransitioncommand.h @@ -25,20 +25,21 @@ #include #include "gentime.h" - +#include "definitions.h" class CustomTrackView; class AddTransitionCommand : public QUndoCommand { public: - AddTransitionCommand(CustomTrackView *view, int track, QDomElement xml , GenTime pos, bool doIt); + AddTransitionCommand(CustomTrackView *view, ItemInfo info, int transitiontrack, QMap desc, QDomElement params, bool doIt); virtual void undo(); virtual void redo(); private: CustomTrackView *m_view; - GenTime m_pos; - QDomElement m_xml; + ItemInfo m_info; + QMap m_desc; + QDomElement m_params; int m_track; bool m_doIt; }; diff --git a/src/clipitem.cpp b/src/clipitem.cpp index 3297c473..81ccec54 100644 --- a/src/clipitem.cpp +++ b/src/clipitem.cpp @@ -39,21 +39,19 @@ #include "kdenlivesettings.h" #include "kthumb.h" -ClipItem::ClipItem(DocClipBase *clip, int track, GenTime startpos, const QRectF & rect, GenTime duration, double fps) - : AbstractClipItem(rect), m_clip(clip), m_resizeMode(NONE), m_grabPoint(0), m_maxTrack(0), m_hasThumbs(false), startThumbTimer(NULL), endThumbTimer(NULL), m_effectsCounter(1), audioThumbWasDrawn(false), m_opacity(1.0), m_timeLine(0), m_thumbsRequested(0), m_hover(false) { - //setToolTip(name); - // kDebug() << "******* CREATING NEW TML CLIP, DUR: " << duration; +ClipItem::ClipItem(DocClipBase *clip, ItemInfo info, double scale, double fps) + : AbstractClipItem(info, QRectF()), m_clip(clip), m_resizeMode(NONE), m_grabPoint(0), m_maxTrack(0), m_hasThumbs(false), startThumbTimer(NULL), endThumbTimer(NULL), m_effectsCounter(1), audioThumbWasDrawn(false), m_opacity(1.0), m_timeLine(0), m_thumbsRequested(0), m_hover(false) { + QRectF rect((double) info.startPos.frames(fps) * scale, (double)(info.track * KdenliveSettings::trackheight() + 1), (double)(info.endPos - info.startPos).frames(fps) * scale, (double)(KdenliveSettings::trackheight() - 1)); + setRect(rect); + kDebug() << "///// NEW CLIP RECT: " << rect; m_fps = fps; - m_startPos = startpos; - m_track = track; m_xml = clip->toXML(); m_clipName = clip->name(); m_producer = clip->getId(); m_clipType = clip->clipType(); m_cropStart = GenTime(); - m_maxDuration = duration; - if (duration != GenTime()) m_cropDuration = duration; - else m_cropDuration = m_maxDuration; + + m_cropDuration = m_maxDuration; setAcceptDrops(true); audioThumbReady = clip->audioThumbCreated(); /* @@ -611,7 +609,7 @@ void ClipItem::dropEvent(QGraphicsSceneDragDropEvent * event) { doc.setContent(effects, true); QDomElement e = doc.documentElement(); CustomTrackView *view = (CustomTrackView *) scene()->views()[0]; - if (view) view->slotAddEffect(e, m_startPos, m_track); + if (view) view->slotAddEffect(e, m_startPos, track()); } //virtual @@ -627,7 +625,7 @@ void ClipItem::addTransition(Transition* t) { CustomTrackView *view = (CustomTrackView *) scene()->views()[0]; QDomDocument doc; QDomElement e = doc.documentElement(); - if (view) view->slotAddTransition(this, t->toXML() , t->startPos(), track()); + //if (view) view->slotAddTransition(this, t->toXML() , t->startPos(), track()); } // virtual /* diff --git a/src/clipitem.h b/src/clipitem.h index efbbd144..f9de3c1a 100644 --- a/src/clipitem.h +++ b/src/clipitem.h @@ -38,7 +38,7 @@ class ClipItem : public AbstractClipItem { Q_OBJECT public: - ClipItem(DocClipBase *clip, int track, GenTime startpos, const QRectF & rect, GenTime duration, double fps); + ClipItem(DocClipBase *clip, ItemInfo info, double scale, double fps); virtual ~ ClipItem(); virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, @@ -98,7 +98,6 @@ private: int m_maxTrack; - QPixmap m_startPix; QPixmap m_endPix; bool m_hasThumbs; diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index 63d2af28..b4c70421 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -55,7 +55,7 @@ // const int duration = animate ? 1500 : 1; CustomTrackView::CustomTrackView(KdenliveDoc *doc, QGraphicsScene * projectscene, QWidget *parent) - : QGraphicsView(projectscene, parent), m_cursorPos(0), m_dropItem(NULL), m_cursorLine(NULL), m_operationMode(NONE), m_startPos(QPointF()), m_dragItem(NULL), m_visualTip(NULL), m_moveOpMode(NONE), m_animation(NULL), m_projectDuration(0), m_scale(1.0), m_clickPoint(QPoint()), m_document(doc), m_autoScroll(KdenliveSettings::autoscroll()), m_tracksHeight(KdenliveSettings::trackheight()) { + : QGraphicsView(projectscene, parent), m_cursorPos(0), m_dropItem(NULL), m_cursorLine(NULL), m_operationMode(NONE), m_dragItem(NULL), m_visualTip(NULL), m_moveOpMode(NONE), m_animation(NULL), m_projectDuration(0), m_scale(1.0), m_clickPoint(QPoint()), m_document(doc), m_autoScroll(KdenliveSettings::autoscroll()), m_tracksHeight(KdenliveSettings::trackheight()) { if (doc) m_commandStack = doc->commandStack(); else m_commandStack == NULL; setMouseTracking(true); @@ -379,48 +379,50 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event) { } else { bool collision = false; QList collisionList = items(event->pos()); - AbstractClipItem *clipItem = NULL, *transitionItem = NULL; for (int i = 0; i < collisionList.size(); ++i) { QGraphicsItem *item = collisionList.at(i); if (item->type() == AVWIDGET || item->type() == TRANSITIONWIDGET) { // select item if (!item->isSelected()) { - + QList itemList = items(); + for (int i = 0; i < itemList.count(); i++) + itemList.at(i)->setSelected(false); item->setSelected(true); update(); } m_dragItem = (AbstractClipItem *) item; - if (item->type() == AVWIDGET) { - clipItem = m_dragItem; - } else if (item->type() == TRANSITIONWIDGET) { - transitionItem = m_dragItem; - } + m_clickPoint = QPoint((int)(mapToScene(event->pos()).x() - m_dragItem->startPos().frames(m_document->fps()) * m_scale), (int)(event->pos().y() - m_dragItem->rect().top())); + m_dragItemInfo.startPos = m_dragItem->startPos(); + m_dragItemInfo.endPos = m_dragItem->endPos(); + m_dragItemInfo.track = m_dragItem->track(); + m_operationMode = m_dragItem->operationMode(item->mapFromScene(mapToScene(event->pos())), m_scale); if (m_operationMode == MOVE) setCursor(Qt::ClosedHandCursor); - if (m_operationMode == MOVE || m_operationMode == RESIZESTART) - m_startPos = QPointF(m_dragItem->startPos().frames(m_document->fps()), m_dragItem->track()); - else if (m_operationMode == RESIZEEND) - m_startPos = QPointF(m_dragItem->endPos().frames(m_document->fps()), m_dragItem->track()); - else if (m_operationMode == TRANSITIONSTART) { - Transition *tr = new Transition( - QRect((int)(m_dragItem->startPos().frames(m_document->fps()) *m_scale) , (int)(m_dragItem->rect().y() + m_dragItem->rect().height() / 2), - (int)(GenTime(2.5).frames(m_document->fps()) *m_scale) , (int)(m_dragItem->rect().height()) - ), - (ClipItem*)m_dragItem, "luma" , m_dragItem->startPos(), m_dragItem->startPos() + GenTime(2.5), m_document->fps()); - tr->setTrack(m_dragItem->track()); - scene()->addItem(tr); - //m_dragItem->addTransition(tra); + if (m_operationMode == TRANSITIONSTART) { + ItemInfo info; + info.startPos = m_dragItem->startPos(); + info.endPos = info.startPos + GenTime(2.5); + info.track = m_dragItem->track(); + int transitiontrack = getPreviousVideoTrack(info.track); + slotAddTransition((ClipItem *) m_dragItem, info, transitiontrack, QMap()); + } + if (m_operationMode == TRANSITIONEND) { + ItemInfo info; + info.endPos = m_dragItem->endPos(); + info.startPos = info.endPos - GenTime(2.5); + info.track = m_dragItem->track(); + int transitiontrack = info.track - 1; + slotAddTransition((ClipItem *) m_dragItem, info, transitiontrack, QMap()); } updateSnapPoints(m_dragItem); - kDebug() << "//////// ITEM CLICKED: " << m_startPos; collision = true; break; } } - emit clipItemSelected((ClipItem*) clipItem); - emit transitionItemSelected((Transition*) transitionItem); + if (m_dragItem->type() == AVWIDGET) emit clipItemSelected((ClipItem*) m_dragItem); + else emit transitionItemSelected((Transition*) m_dragItem); if (!collision) { kDebug() << "//////// NO ITEM FOUND ON CLICK"; m_dragItem = NULL; @@ -548,37 +550,33 @@ void CustomTrackView::slotUpdateClipEffect(ClipItem *clip, QDomElement oldeffect m_commandStack->push(command); } -void CustomTrackView::slotAddTransition(ClipItem* clip , QDomElement transition, GenTime startTime , int startTrack) { - AddTransitionCommand* command = new AddTransitionCommand(this, startTrack, transition, startTime, true); +void CustomTrackView::slotAddTransition(ClipItem* clip, ItemInfo transitionInfo, int endTrack, QMap desc, QDomElement transition) { + AddTransitionCommand* command = new AddTransitionCommand(this, transitionInfo, endTrack, desc, transition, true); m_commandStack->push(command); m_document->setModified(true); } -void CustomTrackView::addTransition(int startTrack, GenTime startPos , QDomElement e) { - - kDebug() << "---- ADDING transition " << e.attribute("tag") << ", on tracks " << m_tracksList.count() - e.attribute("transition_track").toInt() << " / " << getPreviousVideoTrack(e.attribute("transition_track").toInt()); - m_document->renderer()->mltAddTransition(e.attribute("tag"), getPreviousVideoTrack(e.attribute("transition_track").toInt()), m_tracksList.count() - e.attribute("transition_track").toInt() , - GenTime(e.attribute("start").toInt(), m_document->renderer()->fps()), - GenTime(e.attribute("end").toInt(), m_document->renderer()->fps()), - e); +void CustomTrackView::addTransition(ItemInfo transitionInfo, int endTrack, QMap desc, QDomElement params) { + Transition *tr = new Transition(transitionInfo, endTrack, m_scale, m_document->fps(), desc, params); + scene()->addItem(tr); + //kDebug() << "---- ADDING transition " << e.attribute("tag") << ", on tracks " << m_tracksList.count() - e.attribute("transition_track").toInt() << " / " << getPreviousVideoTrack(e.attribute("transition_track").toInt()); + m_document->renderer()->mltAddTransition(tr->transitionTag(), endTrack, m_tracksList.count() - transitionInfo.track, transitionInfo.startPos, transitionInfo.endPos, params); m_document->setModified(true); } -void CustomTrackView::deleteTransition(int, GenTime, QDomElement e) { +void CustomTrackView::deleteTransition(ItemInfo transitionInfo, int endTrack, QMap desc, QDomElement params) { + Transition *item = getTransitionItemAt((int)transitionInfo.startPos.frames(m_document->fps()) + 1, transitionInfo.track); QMap < QString, QString> map; - QDomNamedNodeMap attribs = e.attributes(); - m_document->renderer()->mltDeleteTransition(e.attribute("tag"), getPreviousVideoTrack(e.attribute("transition_track").toInt()), m_tracksList.count() - e.attribute("transition_track").toInt() , - GenTime(e.attribute("start").toInt(), m_document->renderer()->fps()), - GenTime(e.attribute("end").toInt(), m_document->renderer()->fps()), - e); + m_document->renderer()->mltDeleteTransition(item->transitionTag(), endTrack, m_tracksList.count() - transitionInfo.track, transitionInfo.startPos, transitionInfo.endPos, params); + delete item; m_document->setModified(true); } void CustomTrackView::slotTransitionUpdated(QDomElement old, QDomElement newEffect) { - EditTransitionCommand *command = new EditTransitionCommand(this, newEffect.attribute("a_track").toInt(), GenTime(newEffect.attribute("start").toInt(), m_document->renderer()->fps()) , old, newEffect , true); + /*EditTransitionCommand *command = new EditTransitionCommand(this, newEffect.attribute("a_track").toInt(), GenTime(newEffect.attribute("start").toInt(), m_document->renderer()->fps()) , old, newEffect , true); m_commandStack->push(command); - m_document->setModified(true); + m_document->setModified(true);*/ } void CustomTrackView::updateTransition(int track, GenTime pos, QDomElement oldTransition, QDomElement transition) { @@ -592,18 +590,19 @@ void CustomTrackView::updateTransition(int track, GenTime pos, QDomElement oldTr } void CustomTrackView::addItem(DocClipBase *clip, QPoint pos) { - int in = 0; - GenTime out = clip->duration(); - //kdDebug()<<"- - - -CREATING CLIP, duration = "<fileURL(); - int trackTop = (int)(mapToScene(pos).y() / m_tracksHeight) * m_tracksHeight + 1; - m_dropItem = new ClipItem(clip, (int)(mapToScene(pos).y() / m_tracksHeight), GenTime(), QRectF(mapToScene(pos).x() * m_scale, trackTop, out.frames(m_document->fps()) * m_scale, m_tracksHeight - 1), out, m_document->fps()); + ItemInfo info; + info.startPos = GenTime((int)(mapToScene(pos).x() / m_scale), m_document->fps()); + info.endPos = info.startPos + clip->duration(); + info.track = (int)(pos.y() / m_tracksHeight); + //kDebug()<<"------------ ADDING CLIP ITEM----: "<fps()); scene()->addItem(m_dropItem); } void CustomTrackView::dragMoveEvent(QDragMoveEvent * event) { event->setDropAction(Qt::IgnoreAction); - //kDebug()<<"+++++++++++++ DRAG MOVE, : "<pos()).x()<<", SCAL: "<pos()).x() << ", SCAL: " << m_scale; if (m_dropItem) { int track = (int)(event->pos().y() / m_tracksHeight); //) * (m_scale * 50) + m_scale; m_dropItem->moveTo((int)(mapToScene(event->pos()).x() / m_scale), m_scale, (int)((track - m_dropItem->track()) * m_tracksHeight), track); @@ -625,7 +624,11 @@ void CustomTrackView::dragLeaveEvent(QDragLeaveEvent * event) { void CustomTrackView::dropEvent(QDropEvent * event) { if (m_dropItem) { - AddTimelineClipCommand *command = new AddTimelineClipCommand(this, m_dropItem->xml(), m_dropItem->clipProducer(), m_dropItem->track(), m_dropItem->startPos(), m_dropItem->rect(), m_dropItem->duration(), false, false); + ItemInfo info; + info.startPos = m_dropItem->startPos(); + info.endPos = m_dropItem->endPos(); + info.track = m_dropItem->track(); + AddTimelineClipCommand *command = new AddTimelineClipCommand(this, m_dropItem->xml(), m_dropItem->clipProducer(), info, false, false); m_commandStack->push(command); m_dropItem->baseClip()->addReference(); m_document->updateClip(m_dropItem->baseClip()->getId()); @@ -694,7 +697,11 @@ void CustomTrackView::deleteClip(int clipId) { if (itemList.at(i)->type() == AVWIDGET) { ClipItem *item = (ClipItem *)itemList.at(i); if (item->clipProducer() == clipId) { - AddTimelineClipCommand *command = new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->track(), item->startPos(), item->rect(), item->duration(), true, true); + ItemInfo info; + info.startPos = item->startPos(); + info.endPos = item->endPos(); + info.track = item->track(); + AddTimelineClipCommand *command = new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), info, true, true); m_commandStack->push(command); //delete item; } @@ -730,62 +737,53 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) { QGraphicsView::mouseReleaseEvent(event); setDragMode(QGraphicsView::NoDrag); if (m_dragItem == NULL) return; + ItemInfo info; + info.startPos = m_dragItem->startPos(); + info.endPos = m_dragItem->endPos(); + info.track = m_dragItem->track(); + if (m_operationMode == MOVE) setCursor(Qt::OpenHandCursor); if (m_operationMode == MOVE) {// && m_startPos.x() != m_dragItem->startPos().frames(m_document->fps())) { // move clip if (m_dragItem->type() == AVWIDGET) { - MoveClipCommand *command = new MoveClipCommand(this, m_startPos, QPointF(m_dragItem->startPos().frames(m_document->fps()), m_dragItem->track()), false); + MoveClipCommand *command = new MoveClipCommand(this, m_dragItemInfo, info, false); m_commandStack->push(command); - m_document->renderer()->mltMoveClip((int)(m_tracksList.count() - m_startPos.y()), (int)(m_tracksList.count() - m_dragItem->track()), (int) m_startPos.x(), (int)(m_dragItem->startPos().frames(m_document->fps()))); + m_document->renderer()->mltMoveClip((int)(m_tracksList.count() - m_dragItemInfo.track), (int)(m_tracksList.count() - m_dragItem->track()), (int) m_dragItemInfo.startPos.frames(m_document->fps()), (int)(m_dragItem->startPos().frames(m_document->fps()))); } if (m_dragItem->type() == TRANSITIONWIDGET) { - Transition* transition = (Transition*)m_dragItem; - GenTime oldin = transition->transitionStartTime(); - GenTime oldout = transition->transitionEndTime(); - GenTime newin = m_dragItem->startPos(); - GenTime newout = newin + (oldout - oldin); - transition->moveTransition(newin - oldin); - MoveTransitionCommand *command = new MoveTransitionCommand(this, QPointF(oldin.frames(m_document->fps()), oldout.frames(m_document->fps())), QPointF(newin.frames(m_document->fps()), newout.frames(m_document->fps())), (int) m_startPos.y(), (int)(m_dragItem->track()), false); + MoveTransitionCommand *command = new MoveTransitionCommand(this, m_dragItemInfo, info, false); m_commandStack->push(command); //kDebug()<<"/// MOVING TRS FROM: "<<(int)(m_tracksList.count() - m_startPos.y())<<", OFFSET: "<<(int) (m_dragItem->track() - m_startPos.y()); - m_document->renderer()->mltMoveTransition(transition->transitionName(), (int)(m_tracksList.count() - m_startPos.y()), (int)(m_startPos.y() - m_dragItem->track()), oldin, oldout, newin, newout); + Transition *transition = (Transition *) m_dragItem; + m_document->renderer()->mltMoveTransition(transition->transitionName(), (int)(m_tracksList.count() - m_dragItemInfo.track), (int)(m_dragItemInfo.track - m_dragItem->track()), m_dragItemInfo.startPos, m_dragItemInfo.endPos, info.startPos, info.endPos); } } else if (m_operationMode == RESIZESTART) { // resize start if (m_dragItem->type() == AVWIDGET) { - m_document->renderer()->mltResizeClipStart(m_tracksList.count() - m_dragItem->track(), m_dragItem->endPos(), m_dragItem->startPos(), GenTime((int)m_startPos.x(), m_document->fps()), m_dragItem->cropStart(), m_dragItem->cropStart() + m_dragItem->endPos() - m_dragItem->startPos()); - ResizeClipCommand *command = new ResizeClipCommand(this, m_startPos, QPointF(m_dragItem->startPos().frames(m_document->fps()), m_dragItem->track()), true, false); + m_document->renderer()->mltResizeClipStart(m_tracksList.count() - m_dragItem->track(), m_dragItem->endPos(), m_dragItem->startPos(), m_dragItemInfo.startPos, m_dragItem->cropStart(), m_dragItem->cropStart() + m_dragItem->endPos() - m_dragItem->startPos()); + ResizeClipCommand *command = new ResizeClipCommand(this, m_dragItemInfo, info, false); m_commandStack->push(command); } else if (m_dragItem->type() == TRANSITIONWIDGET) { - Transition* transition = (Transition*)m_dragItem; - GenTime oldin = transition->transitionStartTime(); - GenTime oldout = transition->transitionEndTime(); - GenTime newin = m_dragItem->startPos(); - GenTime newout = m_dragItem->endPos(); - transition->resizeTransitionStart(newin); - MoveTransitionCommand *command = new MoveTransitionCommand(this, QPointF(oldin.frames(m_document->fps()), oldout.frames(m_document->fps())), QPointF(newin.frames(m_document->fps()), newout.frames(m_document->fps())), (int) m_startPos.y(), (int)(m_dragItem->track()), false); + MoveTransitionCommand *command = new MoveTransitionCommand(this, m_dragItemInfo, info, false); m_commandStack->push(command); - m_document->renderer()->mltMoveTransition(transition->transitionName(), (int)(m_tracksList.count() - m_startPos.y()), 0, oldin, oldout, newin, newout); + Transition *transition = (Transition *) m_dragItem; + m_document->renderer()->mltMoveTransition(transition->transitionName(), (int)(m_tracksList.count() - m_dragItemInfo.track), 0, m_dragItemInfo.startPos, m_dragItemInfo.endPos, info.startPos, info.endPos); } m_document->renderer()->doRefresh(); } else if (m_operationMode == RESIZEEND) { // resize end if (m_dragItem->type() == AVWIDGET) { - ResizeClipCommand *command = new ResizeClipCommand(this, m_startPos, QPointF(m_dragItem->endPos().frames(m_document->fps()), m_dragItem->track()), false, false); + ResizeClipCommand *command = new ResizeClipCommand(this, m_dragItemInfo, info, false); m_document->renderer()->mltResizeClipEnd(m_tracksList.count() - m_dragItem->track(), m_dragItem->startPos(), m_dragItem->cropStart(), m_dragItem->cropStart() + m_dragItem->endPos() - m_dragItem->startPos()); m_commandStack->push(command); } else if (m_dragItem->type() == TRANSITIONWIDGET) { - Transition* transition = (Transition*)m_dragItem; - GenTime oldin = transition->transitionStartTime(); - GenTime oldout = transition->transitionEndTime(); - GenTime newin = m_dragItem->startPos(); - GenTime newout = m_dragItem->endPos(); - transition->resizeTransitionEnd(newout); - MoveTransitionCommand *command = new MoveTransitionCommand(this, QPointF(oldin.frames(m_document->fps()), oldout.frames(m_document->fps())), QPointF(newin.frames(m_document->fps()), newout.frames(m_document->fps())), (int) m_startPos.y(), (int)(m_dragItem->track()), false); + + MoveTransitionCommand *command = new MoveTransitionCommand(this, m_dragItemInfo, info, false); m_commandStack->push(command); - m_document->renderer()->mltMoveTransition(transition->transitionName(), (int)(m_tracksList.count() - m_startPos.y()), 0, oldin, oldout, newin, newout); + Transition *transition = (Transition *) m_dragItem; + m_document->renderer()->mltMoveTransition(transition->transitionName(), (int)(m_tracksList.count() - m_dragItemInfo.track), 0, m_dragItemInfo.startPos, m_dragItemInfo.endPos, info.startPos, info.endPos); } m_document->renderer()->doRefresh(); } @@ -794,16 +792,16 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) { m_dragItem = NULL; } -void CustomTrackView::deleteClip(int track, GenTime startpos, const QRectF &rect) { - ClipItem *item = getClipItemAt(startpos, track); +void CustomTrackView::deleteClip(ItemInfo info) { + ClipItem *item = getClipItemAt((int) info.startPos.frames(m_document->fps()), info.track); if (!item) { - kDebug() << "----------------  ERROR, CANNOT find clip to move at: " << rect.x(); + kDebug() << "----------------  ERROR, CANNOT find clip to move at...";// << rect.x(); return; } item->baseClip()->removeReference(); m_document->updateClip(item->baseClip()->getId()); delete item; - m_document->renderer()->mltRemoveClip(m_tracksList.count() - track, startpos); + m_document->renderer()->mltRemoveClip(m_tracksList.count() - info.track, info.startPos); m_document->renderer()->doRefresh(); } @@ -812,20 +810,23 @@ void CustomTrackView::deleteSelectedClips() { for (int i = 0; i < itemList.count(); i++) { if (itemList.at(i)->type() == AVWIDGET && itemList.at(i)->isSelected()) { ClipItem *item = (ClipItem *) itemList.at(i); - AddTimelineClipCommand *command = new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->track(), item->startPos(), item->rect(), item->duration(), true, true); + ItemInfo info; + info.startPos = item->startPos(); + info.endPos = item->endPos(); + info.track = item->track(); + AddTimelineClipCommand *command = new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), info, true, true); m_commandStack->push(command); } } } -void CustomTrackView::addClip(QDomElement xml, int clipId, int track, GenTime startpos, const QRectF &rect, GenTime duration) { - QRect r((int)(startpos.frames(m_document->fps()) * m_scale), m_tracksHeight * track, (int)(duration.frames(m_document->fps()) * m_scale), m_tracksHeight - 1); +void CustomTrackView::addClip(QDomElement xml, int clipId, ItemInfo info) { DocClipBase *baseclip = m_document->clipManager()->getClipById(clipId); - ClipItem *item = new ClipItem(baseclip, track, startpos, r, duration, m_document->fps()); + ClipItem *item = new ClipItem(baseclip, info, m_scale, m_document->fps()); scene()->addItem(item); baseclip->addReference(); m_document->updateClip(baseclip->getId()); - m_document->renderer()->mltInsertClip(m_tracksList.count() - track, startpos, xml); + m_document->renderer()->mltInsertClip(m_tracksList.count() - info.track, info.startPos, xml); m_document->renderer()->doRefresh(); } @@ -863,59 +864,57 @@ Transition *CustomTrackView::getTransitionItemAt(GenTime pos, int track) { return getTransitionItemAt(framepos, track); } -void CustomTrackView::moveClip(const QPointF &startPos, const QPointF &endPos) { - ClipItem *item = getClipItemAt((int)startPos.x() + 1, (int)startPos.y()); +void CustomTrackView::moveClip(const ItemInfo start, const ItemInfo end) { + ClipItem *item = getClipItemAt((int) start.startPos.frames(m_document->fps()) + 1, start.track); if (!item) { - kDebug() << "----------------  ERROR, CANNOT find clip to move at: " << startPos.x() * m_scale * FRAME_SIZE + 1 << ", " << startPos.y() * m_tracksHeight + m_tracksHeight / 2; + kDebug() << "----------------  ERROR, CANNOT find clip to move at.. ";// << startPos.x() * m_scale * FRAME_SIZE + 1 << ", " << startPos.y() * m_tracksHeight + m_tracksHeight / 2; return; } - kDebug() << "----------------  Move CLIP FROM: " << startPos.x() << ", END:" << endPos.x() << ",TRACKS: " << startPos.y() << " TO " << endPos.y(); - item->moveTo((int)endPos.x(), m_scale, (int)((endPos.y() - startPos.y()) * m_tracksHeight), (int)endPos.y()); - m_document->renderer()->mltMoveClip((int)(m_tracksList.count() - startPos.y()), (int)(m_tracksList.count() - endPos.y()), (int) startPos.x(), (int)endPos.x()); + //kDebug() << "----------------  Move CLIP FROM: " << startPos.x() << ", END:" << endPos.x() << ",TRACKS: " << startPos.y() << " TO " << endPos.y(); + item->moveTo((int) end.startPos.frames(m_document->fps()), m_scale, (int)((end.track - start.track) * m_tracksHeight), end.track); + m_document->renderer()->mltMoveClip((int)(m_tracksList.count() - start.track), (int)(m_tracksList.count() - end.track), (int) start.startPos.frames(m_document->fps()), (int)end.startPos.frames(m_document->fps())); } -void CustomTrackView::moveTransition(const QPointF &startPos, const QPointF &endPos, int oldtrack, int newtrack) { - Transition *item = getTransitionItemAt((int)startPos.x() + 1, oldtrack); +void CustomTrackView::moveTransition(const ItemInfo start, const ItemInfo end) { + Transition *item = getTransitionItemAt((int)start.startPos.frames(m_document->fps()) + 1, start.track); if (!item) { - kDebug() << "----------------  ERROR, CANNOT find transition to move at: " << startPos.x() * m_scale * FRAME_SIZE + 1 << ", " << startPos.y() * m_tracksHeight + m_tracksHeight / 2; + kDebug() << "----------------  ERROR, CANNOT find transition to move... ";// << startPos.x() * m_scale * FRAME_SIZE + 1 << ", " << startPos.y() * m_tracksHeight + m_tracksHeight / 2; return; } //kDebug() << "----------------  Move TRANSITION FROM: " << startPos.x() << ", END:" << endPos.x() << ",TRACKS: " << oldtrack << " TO " << newtrack; //kDebug()<<"/// RESIZE TRANS START: ("<< startPos.x()<<"x"<< startPos.y()<<") / ("<moveTo((int)endPos.x(), m_scale, (newtrack - oldtrack) * m_tracksHeight, newtrack); - item->moveTransition(GenTime((int)(endPos.x() - startPos.x()), m_document->fps())); - } else if (endPos.y() == startPos.y()) { + item->moveTo((int) end.startPos.frames(m_document->fps()), m_scale, (end.track - start.track) * m_tracksHeight, end.track); + } else if (end.endPos == start.endPos) { // Transition start resize - item->resizeStart((int)endPos.x(), m_scale); - item->resizeTransitionStart(GenTime((int) endPos.x(), m_document->fps())); + item->resizeStart((int) end.startPos.frames(m_document->fps()), m_scale); } else { // Transition end resize; - item->resizeEnd((int)endPos.y(), m_scale); - item->resizeTransitionEnd(GenTime((int) endPos.y(), m_document->fps())); + item->resizeEnd((int) end.endPos.frames(m_document->fps()), m_scale); } //item->moveTransition(GenTime((int) (endPos.x() - startPos.x()), m_document->fps())); - m_document->renderer()->mltMoveTransition(item->transitionName(), m_tracksList.count() - oldtrack, oldtrack - newtrack, GenTime((int) startPos.x(), m_document->fps()), GenTime((int) startPos.y(), m_document->fps()), GenTime((int) endPos.x(), m_document->fps()), GenTime((int) endPos.y(), m_document->fps())); + m_document->renderer()->mltMoveTransition(item->transitionName(), m_tracksList.count() - start.track, start.track - end.track, start.startPos, start.endPos, end.startPos, end.endPos); } -void CustomTrackView::resizeClip(const QPointF &startPos, const QPointF &endPos, bool resizeClipStart) { +void CustomTrackView::resizeClip(const ItemInfo start, const ItemInfo end) { int offset; + bool resizeClipStart = true; + if (start.startPos == end.startPos) resizeClipStart = false; if (resizeClipStart) offset = 1; else offset = -1; - ClipItem *item = getClipItemAt((int)(startPos.x() + offset), (int) startPos.y()); + ClipItem *item = getClipItemAt((int)(start.startPos.frames(m_document->fps()) + offset), start.track); if (!item) { - kDebug() << "----------------  ERROR, CANNOT find clip to resize at: " << startPos; + kDebug() << "----------------  ERROR, CANNOT find clip to resize at... "; // << startPos; return; } - qreal diff = endPos.x() - startPos.x(); if (resizeClipStart) { - m_document->renderer()->mltResizeClipStart(m_tracksList.count() - item->track(), item->endPos(), GenTime((int)endPos.x(), m_document->fps()), item->startPos(), item->cropStart() + GenTime((int)diff, m_document->fps()), item->cropStart() + GenTime((int)diff, m_document->fps()) + item->endPos() - GenTime((int)endPos.x(), m_document->fps())); - item->resizeStart((int)endPos.x(), m_scale); + m_document->renderer()->mltResizeClipStart(m_tracksList.count() - item->track(), item->endPos(), end.startPos, item->startPos(), item->cropStart() + end.startPos - start.startPos, item->cropStart() + end.startPos - start.startPos + item->endPos() - end.startPos); + item->resizeStart((int) end.startPos.frames(m_document->fps()), m_scale); } else { - m_document->renderer()->mltResizeClipEnd(m_tracksList.count() - item->track(), item->startPos(), item->cropStart(), item->cropStart() + GenTime((int)endPos.x(), m_document->fps()) - item->startPos()); - item->resizeEnd((int)endPos.x(), m_scale); + m_document->renderer()->mltResizeClipEnd(m_tracksList.count() - item->track(), item->startPos(), item->cropStart(), item->cropStart() + end.startPos - item->startPos()); + item->resizeEnd((int) end.startPos.frames(m_document->fps()), m_scale); } m_document->renderer()->doRefresh(); } @@ -949,8 +948,8 @@ void CustomTrackView::updateSnapPoints(AbstractClipItem *selected) { } } else if (itemList.at(i)->type() == TRANSITIONWIDGET) { Transition *transition = static_cast (itemList.at(i)); - GenTime start = transition->transitionStartTime(); - GenTime end = transition->transitionEndTime(); + GenTime start = transition->startPos(); + GenTime end = transition->endPos(); m_snapPoints.append(start); m_snapPoints.append(end); if (offset != GenTime()) { diff --git a/src/customtrackview.h b/src/customtrackview.h index 60f4ff25..bf7db324 100644 --- a/src/customtrackview.h +++ b/src/customtrackview.h @@ -46,20 +46,20 @@ public: void removeTrack(); int cursorPos(); void checkAutoScroll(); - void moveClip(const QPointF &startPos, const QPointF &endPos); + void moveClip(const ItemInfo start, const ItemInfo end); /** move transition, startPos = (old start, old end), endPos = (new start, new end) */ - void moveTransition(const QPointF &startPos, const QPointF &endPos, int oldtrack, int newtrack); - void resizeClip(const QPointF &startPos, const QPointF &endPos, bool resizeClipStart); - void addClip(QDomElement xml, int clipId, int track, GenTime startpos, const QRectF &rect, GenTime duration); - void deleteClip(int track, GenTime startpos, const QRectF &rect); + void moveTransition(const ItemInfo start, const ItemInfo end); + void resizeClip(const ItemInfo start, const ItemInfo end); + void addClip(QDomElement xml, int clipId, ItemInfo info); + void deleteClip(ItemInfo info); void setScale(double scaleFactor); void deleteClip(int clipId); void slotAddEffect(QDomElement effect, GenTime pos, int track); void addEffect(int track, GenTime pos, QDomElement effect); void deleteEffect(int track, GenTime pos, QDomElement effect); void updateEffect(int track, GenTime pos, QDomElement effect); - void addTransition(int track, GenTime pos, QDomElement transition); - void deleteTransition(int track, GenTime pos, QDomElement transition); + void addTransition(ItemInfo transitionInfo, int endTrack, QMap desc, QDomElement params); + void deleteTransition(ItemInfo transitionInfo, int endTrack, QMap desc, QDomElement params); void updateTransition(int track, GenTime pos, QDomElement oldTransition, QDomElement transition); void moveTransition(GenTime oldpos, GenTime newpos); void activateMonitor(); @@ -77,7 +77,8 @@ public slots: void slotUpdateClipEffect(ClipItem *clip, QDomElement oldeffect, QDomElement effect); void slotRefreshEffects(ClipItem *clip); void setDuration(int duration); - void slotAddTransition(ClipItem* clip , QDomElement transition, GenTime startTime , int startTrack); + void slotAddTransition(ClipItem* clip, ItemInfo transitionInfo, int endTrack, + QMap desc, QDomElement transition = QDomElement()); void slotTransitionUpdated(QDomElement, QDomElement); void slotSwitchTrackAudio(int ix); void slotSwitchTrackVideo(int ix); @@ -102,7 +103,7 @@ private: KdenliveDoc *m_document; void addItem(DocClipBase *clip, QPoint pos); QGraphicsLineItem *m_cursorLine; - QPointF m_startPos; + ItemInfo m_dragItemInfo; OPERATIONTYPE m_operationMode; OPERATIONTYPE m_moveOpMode; AbstractClipItem *m_dragItem; diff --git a/src/definitions.h b/src/definitions.h index 85ccbb4d..10ca5b79 100644 --- a/src/definitions.h +++ b/src/definitions.h @@ -21,6 +21,8 @@ #ifndef DEFINITIONS_H #define DEFINITIONS_H +#include "gentime.h" + #define FRAME_SIZE 90 #define MAXCLIPDURATION 15000 @@ -45,6 +47,12 @@ struct TrackInfo { bool isBlind; }; +struct ItemInfo { + GenTime startPos; + GenTime endPos; + int track; +}; + struct MltVideoProfile { QString path; QString description; diff --git a/src/moveclipcommand.cpp b/src/moveclipcommand.cpp index 60856127..955b1147 100644 --- a/src/moveclipcommand.cpp +++ b/src/moveclipcommand.cpp @@ -21,8 +21,8 @@ #include "moveclipcommand.h" #include "customtrackview.h" -MoveClipCommand::MoveClipCommand(CustomTrackView *view, const QPointF startPos, const QPointF endPos, bool doIt) - : m_view(view), m_startPos(startPos), m_endPos(endPos), m_doIt(doIt) { +MoveClipCommand::MoveClipCommand(CustomTrackView *view, const ItemInfo start, const ItemInfo end, bool doIt) + : m_view(view), m_startPos(start), m_endPos(end), m_doIt(doIt) { setText(i18n("Move clip")); } diff --git a/src/moveclipcommand.h b/src/moveclipcommand.h index 06980281..54a4a721 100644 --- a/src/moveclipcommand.h +++ b/src/moveclipcommand.h @@ -26,19 +26,20 @@ #include #include +#include "definitions.h" class CustomTrackView; class MoveClipCommand : public QUndoCommand { public: - MoveClipCommand(CustomTrackView *view, const QPointF startPos, const QPointF endPos, bool doIt); + MoveClipCommand(CustomTrackView *view, const ItemInfo start, const ItemInfo end, bool doIt); virtual void undo(); virtual void redo(); private: CustomTrackView *m_view; - QPointF m_startPos; - QPointF m_endPos; + ItemInfo m_startPos; + ItemInfo m_endPos; bool m_doIt; }; diff --git a/src/movetransitioncommand.cpp b/src/movetransitioncommand.cpp index d9968390..b2b354c8 100644 --- a/src/movetransitioncommand.cpp +++ b/src/movetransitioncommand.cpp @@ -18,8 +18,7 @@ #include "movetransitioncommand.h" #include "customtrackview.h" -MoveTransitionCommand::MoveTransitionCommand(CustomTrackView *view, const QPointF startPos, const QPointF endPos, int startTrack, int endTrack, bool doIt) - : m_view(view), m_startPos(startPos), m_endPos(endPos), m_startTrack(startTrack), m_endTrack(endTrack), m_doIt(doIt) { +MoveTransitionCommand::MoveTransitionCommand(CustomTrackView *view, const ItemInfo start, const ItemInfo end, bool doIt) : m_view(view), m_startPos(start), m_endPos(end), m_doIt(doIt) { setText(i18n("Move transition")); } @@ -28,12 +27,12 @@ MoveTransitionCommand::MoveTransitionCommand(CustomTrackView *view, const QPoint void MoveTransitionCommand::undo() { // kDebug()<<"---- undoing action"; m_doIt = true; - m_view->moveTransition(m_endPos, m_startPos, m_endTrack, m_startTrack); + m_view->moveTransition(m_endPos, m_startPos); } // virtual void MoveTransitionCommand::redo() { kDebug() << "---- redoing action"; - if (m_doIt) m_view->moveTransition(m_startPos, m_endPos, m_startTrack, m_endTrack); + if (m_doIt) m_view->moveTransition(m_startPos, m_endPos); m_doIt = true; } diff --git a/src/movetransitioncommand.h b/src/movetransitioncommand.h index a3fad950..ae0adf31 100644 --- a/src/movetransitioncommand.h +++ b/src/movetransitioncommand.h @@ -24,21 +24,21 @@ #include +#include "definitions.h" + class CustomTrackView; class MoveTransitionCommand : public QUndoCommand { public: - MoveTransitionCommand(CustomTrackView *view, const QPointF startPos, const QPointF endPos, int startTrack, int endTrack, bool doIt); + MoveTransitionCommand(CustomTrackView *view, const ItemInfo start, const ItemInfo end, bool doIt); virtual void undo(); virtual void redo(); private: CustomTrackView *m_view; - QPointF m_startPos; - QPointF m_endPos; + ItemInfo m_startPos; + ItemInfo m_endPos; bool m_doIt; - int m_startTrack; - int m_endTrack; }; #endif diff --git a/src/resizeclipcommand.cpp b/src/resizeclipcommand.cpp index 33463054..721544dc 100644 --- a/src/resizeclipcommand.cpp +++ b/src/resizeclipcommand.cpp @@ -21,8 +21,9 @@ #include "resizeclipcommand.h" #include "customtrackview.h" -ResizeClipCommand::ResizeClipCommand(CustomTrackView *view, const QPointF startPos, const QPointF endPos, bool resizeClipStart, bool doIt) - : m_view(view), m_startPos(startPos), m_endPos(endPos), m_resizeClipStart(resizeClipStart), m_doIt(doIt) { + +ResizeClipCommand::ResizeClipCommand(CustomTrackView *view, const ItemInfo start, const ItemInfo end, bool doIt) + : m_view(view), m_startPos(start), m_endPos(end), m_doIt(doIt) { setText(i18n("Resize clip")); } @@ -31,12 +32,12 @@ ResizeClipCommand::ResizeClipCommand(CustomTrackView *view, const QPointF startP void ResizeClipCommand::undo() { // kDebug()<<"---- undoing action"; m_doIt = true; - if (m_doIt) m_view->resizeClip(m_endPos, m_startPos, m_resizeClipStart); + if (m_doIt) m_view->resizeClip(m_endPos, m_startPos); } // virtual void ResizeClipCommand::redo() { kDebug() << "---- redoing action"; - if (m_doIt) m_view->resizeClip(m_startPos, m_endPos, m_resizeClipStart); + if (m_doIt) m_view->resizeClip(m_startPos, m_endPos); m_doIt = true; } diff --git a/src/resizeclipcommand.h b/src/resizeclipcommand.h index 55171135..1b527b46 100644 --- a/src/resizeclipcommand.h +++ b/src/resizeclipcommand.h @@ -27,19 +27,20 @@ #include +#include "definitions.h" + class CustomTrackView; class ResizeClipCommand : public QUndoCommand { public: - ResizeClipCommand(CustomTrackView *view, const QPointF startPos, const QPointF endPos, bool resizeClipStart, bool doIt); + ResizeClipCommand(CustomTrackView *view, const ItemInfo start, const ItemInfo end, bool doIt); virtual void undo(); virtual void redo(); private: CustomTrackView *m_view; - QPointF m_startPos; - QPointF m_endPos; - bool m_resizeClipStart; + ItemInfo m_startPos; + ItemInfo m_endPos; bool m_doIt; }; diff --git a/src/trackview.cpp b/src/trackview.cpp index 4d016311..940353e6 100644 --- a/src/trackview.cpp +++ b/src/trackview.cpp @@ -235,9 +235,14 @@ int TrackView::slotAddVideoTrack(int ix, QDomElement xml) { int in = elem.attribute("in", 0).toInt(); int id = elem.attribute("producer", 0).toInt(); DocClipBase *clip = m_doc->clipManager()->getClipById(id); - int out = elem.attribute("out", 0).toInt() - in; - //kDebug()<<"++++++++++++++\n\n / / /ADDING CLIP: "<fps()), QRectF(position * m_scale, trackTop + 1, out * m_scale, KdenliveSettings::trackheight() - 1), GenTime(out, m_doc->fps()), m_doc->fps()); + int out = elem.attribute("out", 0).toInt(); + + ItemInfo info; + info.startPos = GenTime(position, m_doc->fps()); + info.endPos = GenTime(out, m_doc->fps()); + info.track = ix; + + ClipItem *item = new ClipItem(clip, info, m_scale, m_doc->fps()); m_scene->addItem(item); position += out; diff --git a/src/transition.cpp b/src/transition.cpp index f7712fe2..0df18903 100644 --- a/src/transition.cpp +++ b/src/transition.cpp @@ -32,161 +32,74 @@ #include "kdenlivesettings.h" -Transition::Transition(const QRectF& rect , ClipItem * clipa, const QString & type, const GenTime &startTime, const GenTime &endTime, double fps, bool inverted) : AbstractClipItem(rect) { - m_invertTransition = inverted; +Transition::Transition(const ItemInfo info, int transitiontrack, double scale, double fps, QMap desc, QDomElement params) : AbstractClipItem(info, QRectF(info.startPos.frames(fps) *scale , info.track * KdenliveSettings::trackheight() + KdenliveSettings::trackheight() / 2, (info.endPos - info.startPos).frames(fps) * scale , KdenliveSettings::trackheight() - 1)) { m_singleClip = true; - m_transitionTrack = clipa->track(); + m_transitionTrack = transitiontrack; m_secondClip = NULL; - m_transitionName = type; + m_cropStart = GenTime(); m_fps = fps; - m_cropDuration = endTime - startTime; - m_startPos = startTime; - m_maxDuration = GenTime(1000000); - // Default duration = 2.5 seconds - GenTime defaultTransitionDuration = GenTime(2.5); - - m_referenceClip = clipa; - - if (startTime < m_referenceClip->startPos()) m_transitionStart = GenTime(0.0); - else if (startTime > m_referenceClip->endPos()) m_transitionStart = m_referenceClip->duration() - defaultTransitionDuration; - else m_transitionStart = startTime - m_referenceClip->startPos(); + m_cropDuration = m_maxDuration; + //m_referenceClip = clipa; + if (desc.isEmpty()) { + m_description.insert("tag", "luma"); + m_description.insert("name", "Luma"); + m_description.insert("description", "Luma Transitions"); + QDomDocument doc; + m_parameters = doc.createElement("ktransition"); + } else { + m_description = desc; + m_parameters = params; + } - if (m_transitionStart + m_cropDuration > m_referenceClip->duration()) - m_transitionDuration = m_referenceClip->duration() - m_transitionStart; - else m_transitionDuration = m_cropDuration; m_secondClip = 0; setFlags(QGraphicsItem::ItemClipsToShape | QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); setZValue(2); - QDomDocument doc; - doc.setContent(QString("\n\ - Luma\n\ - Luma Transitions\n\ - \n\ - \n\ - Reverse\n\ - \n\ - ")); - m_transitionParameters = doc.documentElement(); - - m_referenceClip->addTransition(this); -} - -// create a transition from XML -Transition::Transition(const QRectF& rect , ClipItem * clip, QDomElement transitionElement, double fps, GenTime offset) : AbstractClipItem(rect) { - if (offset == GenTime()) offset = clip->startPos(); - m_referenceClip = clip; - m_singleClip = true; - m_secondClip = NULL; - m_transitionStart = GenTime(transitionElement.attribute("start", QString::null).toInt(), m_referenceClip->fps()); - m_transitionDuration = GenTime(transitionElement.attribute("end", QString::null).toInt(), m_referenceClip->fps()) - m_transitionStart; - m_transitionTrack = transitionElement.attribute("transition_track", "0").toInt(); - m_transitionStart = m_transitionStart - offset; - - m_invertTransition = transitionElement.attribute("inverted", "0").toInt(); - m_transitionName = transitionElement.attribute("type" , "luma"); - - // load transition parameters - typedef QMap ParamMap; - ParamMap params; - for (QDomNode n = transitionElement.firstChild(); !n.isNull(); n = n.nextSibling()) { - QDomElement paramElement = n.toElement(); - params[paramElement.tagName()] = paramElement.attribute("value", QString::null); - } - if (m_invertTransition) params["reverse"] = "1"; - //if (!params.isEmpty()) setTransitionParameters(params); - - // Check if transition is valid (not outside of clip) - if (m_transitionStart > clip->duration()) - m_transitionDuration = GenTime(); - + //m_referenceClip->addTransition(this); } Transition::~Transition() { } QString Transition::transitionName() const { - return m_transitionName; + return m_description.value("name"); } -void Transition::setTransitionParameters(const QDomElement & elem) { - m_transitionParameters = elem; - m_transitionName = elem.attribute("tag"); +QString Transition::transitionTag() const { + return m_description.value("tag"); } -bool Transition::invertTransition() const { - if (!m_singleClip) { - if (m_referenceClip->startPos() < m_secondClip->startPos()) return true; - else return false; - } - return m_invertTransition; +void Transition::setTransitionParameters(const QDomElement params) { + m_parameters = params; +} + + +bool Transition::invertedTransition() const { + return false; //m_parameters.attribute("reverse").toInt(); } QPixmap Transition::transitionPixmap() const { KIcon icon; - if (m_transitionName == "luma") { - if (invertTransition()) icon = KIcon("kdenlive_trans_up"); + if (transitionTag() == "luma") { + if (invertedTransition()) icon = KIcon("kdenlive_trans_up"); else icon = KIcon("kdenlive_trans_down"); - } else if (m_transitionName == "composite") { + } else if (transitionTag() == "composite") { icon = KIcon("kdenlive_trans_wiper"); - } else if (m_transitionName == "lumafile") { + } else if (transitionTag() == "lumafile") { icon = KIcon("kdenlive_trans_luma"); } else icon = KIcon("kdenlive_trans_pip"); return icon.pixmap(QSize(15, 15)); } -int Transition::transitionTrack() const { - return m_transitionTrack; -} - -void Transition::setTransitionTrack(int track) { - m_transitionTrack = track; -} void Transition::setTransitionDirection(bool inv) { - m_invertTransition = inv; -} - -int Transition::transitionStartTrack() const { - return m_referenceClip->track(); + //m_parameters.setAttribute("reverse", inv); } int Transition::transitionEndTrack() const { - if (!m_singleClip) return m_secondClip->track(); - return m_referenceClip->track() + 1; - //TODO: calculate next video track -} - -GenTime Transition::transitionDuration() const { - return transitionEndTime() - transitionStartTime(); -} - -GenTime Transition::transitionStartTime() const { - if (!m_singleClip) { - GenTime startb = m_secondClip->startPos(); - GenTime starta = m_referenceClip->startPos(); - if (startb > m_referenceClip->endPos()) return m_referenceClip->endPos() - GenTime(0.12); - if (startb > starta) - return startb; - return starta; - } else return m_referenceClip->startPos() + m_transitionStart; + return m_transitionTrack; } - -GenTime Transition::transitionEndTime() const { - if (!m_singleClip) { - GenTime endb = m_secondClip->endPos(); - GenTime enda = m_referenceClip->endPos(); - if (m_secondClip->startPos() > enda) return enda; - if (endb < m_referenceClip->startPos()) return m_referenceClip->startPos() + GenTime(0.12); - else if (endb > enda) return enda; - else return endb; - } else { - if (m_transitionStart + m_transitionDuration > m_referenceClip->duration()) - return m_referenceClip->endPos(); - return m_referenceClip->startPos() + m_transitionStart + m_transitionDuration; - } -} void Transition::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { @@ -227,36 +140,12 @@ void Transition::paint(QPainter *painter, int Transition::type() const { return TRANSITIONWIDGET; } + OPERATIONTYPE Transition::operationMode(QPointF pos, double scale) { if (abs((int)(pos.x() - rect().x())) < 6) return RESIZESTART; else if (abs((int)(pos.x() - (rect().x() + rect().width()))) < 6) return RESIZEEND; return MOVE; } -void Transition::resizeTransitionStart(GenTime time) { - if (!m_singleClip) return; //cannot resize automatic transitions - if (time < m_referenceClip->startPos()) time = m_referenceClip->startPos(); - // Transitions shouldn't be shorter than 3 frames, about 0.12 seconds - if (transitionEndTime().ms() - time.ms() < 120.0) time = transitionEndTime() - GenTime(0.12); - m_transitionDuration = m_transitionDuration - (time - m_referenceClip->startPos() - m_transitionStart); - m_transitionStart = time - m_referenceClip->startPos(); -} - -void Transition::resizeTransitionEnd(GenTime time) { - if (!m_singleClip) return; //cannot resize automatic transitions - if (time > m_referenceClip->endPos()) time = m_referenceClip->endPos(); - // Transitions shouldn't be shorter than 3 frames, about 0.12 seconds - if (time.ms() - transitionStartTime().ms() < 120.0) time = transitionStartTime() + GenTime(0.12); - m_transitionDuration = time - (m_referenceClip->startPos() + m_transitionStart); -} - -void Transition::moveTransition(GenTime time) { - if (!m_singleClip) return; //cannot move automatic transitions - if (m_transitionStart + time < GenTime(0.0)) m_transitionStart = GenTime(0.0); - else if (m_transitionStart + time > m_referenceClip->duration() - m_transitionDuration) - m_transitionStart = m_referenceClip->duration() - m_transitionDuration; - else m_transitionStart = m_transitionStart + time; - if (m_transitionStart < GenTime(0.0)) m_transitionStart = GenTime(0.0); -} bool Transition::hasClip(const ClipItem * clip) const { if (clip == m_secondClip) return true; @@ -268,30 +157,27 @@ bool Transition::belongsToClip(const ClipItem * clip) const { return false; } +/* Transition *Transition::clone() { return new Transition::Transition(rect(), m_referenceClip, this->toXML() , m_fps); - /*if (m_singleClip || m_secondClip == 0) - return new Transition::Transition(m_referenceClip); - else - //return new Transition::Transition(m_referenceClip, m_secondClip); - return new Transition::Transition(m_referenceClip, this->toXML()); - */ -} +}*/ +/* Transition *Transition::reparent(ClipItem * clip) { return new Transition::Transition(rect(), clip, this->toXML(), m_fps, m_referenceClip->startPos()); -} +}*/ bool Transition::isValid() const { - return (m_transitionDuration != GenTime()); + return true; //(m_transitionDuration != GenTime()); } const ClipItem *Transition::referencedClip() const { return m_referenceClip; } +/* QDomElement Transition::toXML() { - m_transitionParameters.setAttribute("type", m_transitionName); + m_transitionParameters.setAttribute("type", transitionTag); //m_transitionParameters.setAttribute("inverted", invertTransition()); m_transitionParameters.setAttribute("transition_track", m_transitionTrack); m_transitionParameters.setAttribute("start", transitionStartTime().frames(m_referenceClip->fps())); @@ -303,5 +189,5 @@ QDomElement Transition::toXML() { } return m_transitionParameters; -} +}*/ diff --git a/src/transition.h b/src/transition.h index 8cb37193..b52817d0 100644 --- a/src/transition.h +++ b/src/transition.h @@ -21,7 +21,7 @@ #include #include #include -#include +#include #include #include "gentime.h" @@ -38,59 +38,40 @@ class Transition : public AbstractClipItem { Q_OBJECT public: - Transition(const QRectF&, ClipItem * clipa, const QString& type, const GenTime &startTime, const GenTime &endTime, double fps, bool inverted = false); - Transition(const QRectF&, ClipItem * clip, QDomElement transitionElement, double fps, GenTime offset = GenTime()); + Transition(const ItemInfo info, int transitiontrack, double scale, double fps, QMap desc, QDomElement params = QDomElement()); virtual ~Transition(); virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); virtual int type() const; /** Returns an XML representation of this transition. */ - QDomElement toXML(); + //QDomElement toXML(); - GenTime transitionStartTime() const; - GenTime transitionEndTime() const; /** Return the track number of transition in the playlist*/ - int transitionStartTrack() const; int transitionEndTrack() const; Transition *clone(); bool hasClip(const ClipItem * clip) const; bool belongsToClip(const ClipItem * clip) const; - void resizeTransitionEnd(GenTime time); - void resizeTransitionStart(GenTime time); - void moveTransition(GenTime time); - bool invertTransition() const; + bool invertedTransition() const; QString transitionName() const; + QString transitionTag() const; OPERATIONTYPE operationMode(QPointF pos, double scale); - void setTransitionType(QString newType); //const QMap < QString, QString > transitionParameters() const; - void setTransitionParameters(const QDomElement&); + void setTransitionParameters(const QDomElement params); void setTransitionDirection(bool inv); - int transitionTrack() const; void setTransitionTrack(int track); QPixmap transitionPixmap() const; - Transition *reparent(ClipItem * clip); + //Transition *reparent(ClipItem * clip); bool isValid() const; - GenTime transitionDuration() const; + const ClipItem *referencedClip() const; private: - - GenTime m_transitionStart; - GenTime m_transitionDuration; - QDomElement m_transitionParameters; - - /** The name of the transition to be displayed to user */ - QString m_transitionName; - - /** Should the transition be reversed */ - bool m_invertTransition; - bool m_singleClip; - - /** The track to which the transition is attached*/ - int m_track; - + /** contains the transition description (name, tag, description) */ + QMap m_description; + /** contains the transition parameters */ + QDomElement m_parameters; /** The clip to which the transition is attached */ ClipItem *m_referenceClip; diff --git a/src/transitionsettings.cpp b/src/transitionsettings.cpp index 5d6af62f..b6d66898 100644 --- a/src/transitionsettings.cpp +++ b/src/transitionsettings.cpp @@ -15,9 +15,11 @@ * * ***************************************************************************/ + +#include + #include "transitionsettings.h" #include "transition.h" -#include #include "effectslist.h" #include "effectstackedit.h" @@ -35,17 +37,18 @@ TransitionSettings::TransitionSettings(EffectsList *transitions, QWidget* parent void TransitionSettings::slotTransitionChanged() { - QDomElement e = m_usedTransition->toXML(); - - //set old values from e in to desc (like reverse and so ) - QDomElement desc = m_transitions->getEffectByName(ui.listWidget->currentItem()->text()); - if (m_usedTransition) { - m_usedTransition->setTransitionParameters(desc); - m_usedTransition->update(); - } - emit transitionUpdated(e, m_usedTransition->toXML()); - emit transferParamDesc(desc, 0, 0); - + /* + QDomElement e = m_usedTransition->toXML(); + + //set old values from e in to desc (like reverse and so ) + QDomElement desc = m_transitions->getEffectByName(ui.listWidget->currentItem()->text()); + if (m_usedTransition) { + m_usedTransition->setTransitionParameters(desc); + m_usedTransition->update(); + } + emit transitionUpdated(e, m_usedTransition->toXML()); + emit transferParamDesc(desc, 0, 0); + */ } void TransitionSettings::slotTransitionItemSelected(Transition* t) { -- 2.39.2